From 96843f3bd4e70a953066f19fc9d49c7915e19457 Mon Sep 17 00:00:00 2001 From: Taqi Jaffri Date: Tue, 1 Aug 2023 12:54:26 -0700 Subject: [PATCH 001/143] Fixed source key name for docugami loader --- .../document_loaders/docugami.ipynb | 159 +++++++++--------- .../langchain/document_loaders/docugami.py | 6 +- 2 files changed, 86 insertions(+), 79 deletions(-) diff --git a/docs/extras/integrations/document_loaders/docugami.ipynb b/docs/extras/integrations/document_loaders/docugami.ipynb index b1386f115..fb12a02b3 100644 --- a/docs/extras/integrations/document_loaders/docugami.ipynb +++ b/docs/extras/integrations/document_loaders/docugami.ipynb @@ -15,14 +15,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: lxml in /root/Source/github/docugami.langchain/libs/langchain/.venv/lib/python3.9/site-packages (4.9.3)\n" + ] + } + ], "source": [ "# You need the lxml package to use the DocugamiLoader\n", - "!pip install lxml" + "!poetry run pip install lxml" ] }, { @@ -50,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -69,34 +77,34 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[Document(page_content='MUTUAL NON-DISCLOSURE AGREEMENT This Mutual Non-Disclosure Agreement (this “ Agreement ”) is entered into and made effective as of April 4 , 2018 between Docugami Inc. , a Delaware corporation , whose address is 150 Lake Street South , Suite 221 , Kirkland , Washington 98033 , and Caleb Divine , an individual, whose address is 1201 Rt 300 , Newburgh NY 12550 .', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:ThisMutualNon-disclosureAgreement', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'ThisMutualNon-disclosureAgreement'}),\n", - " Document(page_content='The above named parties desire to engage in discussions regarding a potential agreement or other transaction between the parties (the “Purpose”). In connection with such discussions, it may be necessary for the parties to disclose to each other certain confidential information or materials to enable them to evaluate whether to enter into such agreement or transaction.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Discussions', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'Discussions'}),\n", - " Document(page_content='In consideration of the foregoing, the parties agree as follows:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Consideration', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'Consideration'}),\n", - " Document(page_content='1. Confidential Information . For purposes of this Agreement , “ Confidential Information ” means any information or materials disclosed by one party to the other party that: (i) if disclosed in writing or in the form of tangible materials, is marked “confidential” or “proprietary” at the time of such disclosure; (ii) if disclosed orally or by visual presentation, is identified as “confidential” or “proprietary” at the time of such disclosure, and is summarized in a writing sent by the disclosing party to the receiving party within thirty ( 30 ) days after any such disclosure; or (iii) due to its nature or the circumstances of its disclosure, a person exercising reasonable business judgment would understand to be confidential or proprietary.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Purposes/docset:ConfidentialInformation-section/docset:ConfidentialInformation[2]', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'ConfidentialInformation'}),\n", - " Document(page_content=\"2. Obligations and Restrictions . Each party agrees: (i) to maintain the other party's Confidential Information in strict confidence; (ii) not to disclose such Confidential Information to any third party; and (iii) not to use such Confidential Information for any purpose except for the Purpose. Each party may disclose the other party’s Confidential Information to its employees and consultants who have a bona fide need to know such Confidential Information for the Purpose, but solely to the extent necessary to pursue the Purpose and for no other purpose; provided, that each such employee and consultant first executes a written agreement (or is otherwise already bound by a written agreement) that contains use and nondisclosure restrictions at least as protective of the other party’s Confidential Information as those set forth in this Agreement .\", metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Obligations/docset:ObligationsAndRestrictions-section/docset:ObligationsAndRestrictions', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'ObligationsAndRestrictions'}),\n", - " Document(page_content='3. Exceptions. The obligations and restrictions in Section 2 will not apply to any information or materials that:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Exceptions/docset:Exceptions-section/docset:Exceptions[2]', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Exceptions'}),\n", - " Document(page_content='(i) were, at the date of disclosure, or have subsequently become, generally known or available to the public through no act or failure to act by the receiving party;', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheDate/docset:TheDate/docset:TheDate', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheDate'}),\n", - " Document(page_content='(ii) were rightfully known by the receiving party prior to receiving such information or materials from the disclosing party;', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheDate/docset:SuchInformation/docset:TheReceivingParty', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheReceivingParty'}),\n", - " Document(page_content='(iii) are rightfully acquired by the receiving party from a third party who has the right to disclose such information or materials without breach of any confidentiality obligation to the disclosing party;', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheDate/docset:TheReceivingParty/docset:TheReceivingParty', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheReceivingParty'}),\n", - " Document(page_content='4. Compelled Disclosure . Nothing in this Agreement will be deemed to restrict a party from disclosing the other party’s Confidential Information to the extent required by any order, subpoena, law, statute or regulation; provided, that the party required to make such a disclosure uses reasonable efforts to give the other party reasonable advance notice of such required disclosure in order to enable the other party to prevent or limit such disclosure.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Disclosure/docset:CompelledDisclosure-section/docset:CompelledDisclosure', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'CompelledDisclosure'}),\n", - " Document(page_content='5. Return of Confidential Information . Upon the completion or abandonment of the Purpose, and in any event upon the disclosing party’s request, the receiving party will promptly return to the disclosing party all tangible items and embodiments containing or consisting of the disclosing party’s Confidential Information and all copies thereof (including electronic copies), and any notes, analyses, compilations, studies, interpretations, memoranda or other documents (regardless of the form thereof) prepared by or on behalf of the receiving party that contain or are based upon the disclosing party’s Confidential Information .', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheCompletion/docset:ReturnofConfidentialInformation-section/docset:ReturnofConfidentialInformation', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'ReturnofConfidentialInformation'}),\n", - " Document(page_content='6. No Obligations . Each party retains the right to determine whether to disclose any Confidential Information to the other party.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:NoObligations/docset:NoObligations-section/docset:NoObligations[2]', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'NoObligations'}),\n", - " Document(page_content='7. No Warranty. ALL CONFIDENTIAL INFORMATION IS PROVIDED BY THE DISCLOSING PARTY “AS IS ”.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:NoWarranty/docset:NoWarranty-section/docset:NoWarranty[2]', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'NoWarranty'}),\n", - " Document(page_content='8. Term. This Agreement will remain in effect for a period of seven ( 7 ) years from the date of last disclosure of Confidential Information by either party, at which time it will terminate.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:ThisAgreement/docset:Term-section/docset:Term', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Term'}),\n", - " Document(page_content='9. Equitable Relief . Each party acknowledges that the unauthorized use or disclosure of the disclosing party’s Confidential Information may cause the disclosing party to incur irreparable harm and significant damages, the degree of which may be difficult to ascertain. Accordingly, each party agrees that the disclosing party will have the right to seek immediate equitable relief to enjoin any unauthorized use or disclosure of its Confidential Information , in addition to any other rights and remedies that it may have at law or otherwise.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:EquitableRelief/docset:EquitableRelief-section/docset:EquitableRelief[2]', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'EquitableRelief'}),\n", - " Document(page_content='10. Non-compete. To the maximum extent permitted by applicable law, during the Term of this Agreement and for a period of one ( 1 ) year thereafter, Caleb Divine may not market software products or do business that directly or indirectly competes with Docugami software products .', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheMaximumExtent/docset:Non-compete-section/docset:Non-compete', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Non-compete'}),\n", - " Document(page_content='11. Miscellaneous. This Agreement will be governed and construed in accordance with the laws of the State of Washington , excluding its body of law controlling conflict of laws. This Agreement is the complete and exclusive understanding and agreement between the parties regarding the subject matter of this Agreement and supersedes all prior agreements, understandings and communications, oral or written, between the parties regarding the subject matter of this Agreement . If any provision of this Agreement is held invalid or unenforceable by a court of competent jurisdiction, that provision of this Agreement will be enforced to the maximum extent permissible and the other provisions of this Agreement will remain in full force and effect. Neither party may assign this Agreement , in whole or in part, by operation of law or otherwise, without the other party’s prior written consent, and any attempted assignment without such consent will be void. This Agreement may be executed in counterparts, each of which will be deemed an original, but all of which together will constitute one and the same instrument.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Accordance/docset:Miscellaneous-section/docset:Miscellaneous', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Miscellaneous'}),\n", - " Document(page_content='[SIGNATURE PAGE FOLLOWS] IN WITNESS WHEREOF, the parties hereto have executed this Mutual Non-Disclosure Agreement by their duly authorized officers or representatives as of the date first set forth above.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:Witness/docset:TheParties/docset:TheParties', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheParties'}),\n", - " Document(page_content='DOCUGAMI INC . : \\n\\n Caleb Divine : \\n\\n Signature: Signature: Name: \\n\\n Jean Paoli Name: Title: \\n\\n CEO Title:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:Witness/docset:TheParties/docset:DocugamiInc/docset:DocugamiInc/xhtml:table', 'id': '43rj0ds7s0ur', 'name': 'NDA simple layout.docx', 'structure': '', 'tag': 'table'})]" + "[Document(page_content='MUTUAL NON-DISCLOSURE AGREEMENT This Mutual Non-Disclosure Agreement (this “ Agreement ”) is entered into and made effective as of April 4 , 2018 between Docugami Inc. , a Delaware corporation , whose address is 150 Lake Street South , Suite 221 , Kirkland , Washington 98033 , and Caleb Divine , an individual, whose address is 1201 Rt 300 , Newburgh NY 12550 .', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:ThisMutualNon-disclosureAgreement', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'ThisMutualNon-disclosureAgreement'}),\n", + " Document(page_content='The above named parties desire to engage in discussions regarding a potential agreement or other transaction between the parties (the “Purpose”). In connection with such discussions, it may be necessary for the parties to disclose to each other certain confidential information or materials to enable them to evaluate whether to enter into such agreement or transaction.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Discussions', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'Discussions'}),\n", + " Document(page_content='In consideration of the foregoing, the parties agree as follows:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Consideration', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'Consideration'}),\n", + " Document(page_content='1. Confidential Information . For purposes of this Agreement , “ Confidential Information ” means any information or materials disclosed by one party to the other party that: (i) if disclosed in writing or in the form of tangible materials, is marked “confidential” or “proprietary” at the time of such disclosure; (ii) if disclosed orally or by visual presentation, is identified as “confidential” or “proprietary” at the time of such disclosure, and is summarized in a writing sent by the disclosing party to the receiving party within thirty ( 30 ) days after any such disclosure; or (iii) due to its nature or the circumstances of its disclosure, a person exercising reasonable business judgment would understand to be confidential or proprietary.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Purposes/docset:ConfidentialInformation-section/docset:ConfidentialInformation[2]', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'ConfidentialInformation'}),\n", + " Document(page_content=\"2. Obligations and Restrictions . Each party agrees: (i) to maintain the other party's Confidential Information in strict confidence; (ii) not to disclose such Confidential Information to any third party; and (iii) not to use such Confidential Information for any purpose except for the Purpose. Each party may disclose the other party’s Confidential Information to its employees and consultants who have a bona fide need to know such Confidential Information for the Purpose, but solely to the extent necessary to pursue the Purpose and for no other purpose; provided, that each such employee and consultant first executes a written agreement (or is otherwise already bound by a written agreement) that contains use and nondisclosure restrictions at least as protective of the other party’s Confidential Information as those set forth in this Agreement .\", metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Obligations/docset:ObligationsAndRestrictions-section/docset:ObligationsAndRestrictions', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'ObligationsAndRestrictions'}),\n", + " Document(page_content='3. Exceptions. The obligations and restrictions in Section 2 will not apply to any information or materials that:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Exceptions/docset:Exceptions-section/docset:Exceptions[2]', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Exceptions'}),\n", + " Document(page_content='(i) were, at the date of disclosure, or have subsequently become, generally known or available to the public through no act or failure to act by the receiving party;', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheDate/docset:TheDate/docset:TheDate', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheDate'}),\n", + " Document(page_content='(ii) were rightfully known by the receiving party prior to receiving such information or materials from the disclosing party;', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheDate/docset:SuchInformation/docset:TheReceivingParty', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheReceivingParty'}),\n", + " Document(page_content='(iii) are rightfully acquired by the receiving party from a third party who has the right to disclose such information or materials without breach of any confidentiality obligation to the disclosing party;', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheDate/docset:TheReceivingParty/docset:TheReceivingParty', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheReceivingParty'}),\n", + " Document(page_content='4. Compelled Disclosure . Nothing in this Agreement will be deemed to restrict a party from disclosing the other party’s Confidential Information to the extent required by any order, subpoena, law, statute or regulation; provided, that the party required to make such a disclosure uses reasonable efforts to give the other party reasonable advance notice of such required disclosure in order to enable the other party to prevent or limit such disclosure.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Disclosure/docset:CompelledDisclosure-section/docset:CompelledDisclosure', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'CompelledDisclosure'}),\n", + " Document(page_content='5. Return of Confidential Information . Upon the completion or abandonment of the Purpose, and in any event upon the disclosing party’s request, the receiving party will promptly return to the disclosing party all tangible items and embodiments containing or consisting of the disclosing party’s Confidential Information and all copies thereof (including electronic copies), and any notes, analyses, compilations, studies, interpretations, memoranda or other documents (regardless of the form thereof) prepared by or on behalf of the receiving party that contain or are based upon the disclosing party’s Confidential Information .', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheCompletion/docset:ReturnofConfidentialInformation-section/docset:ReturnofConfidentialInformation', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'ReturnofConfidentialInformation'}),\n", + " Document(page_content='6. No Obligations . Each party retains the right to determine whether to disclose any Confidential Information to the other party.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:NoObligations/docset:NoObligations-section/docset:NoObligations[2]', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'NoObligations'}),\n", + " Document(page_content='7. No Warranty. ALL CONFIDENTIAL INFORMATION IS PROVIDED BY THE DISCLOSING PARTY “AS IS ”.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:NoWarranty/docset:NoWarranty-section/docset:NoWarranty[2]', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'NoWarranty'}),\n", + " Document(page_content='8. Term. This Agreement will remain in effect for a period of seven ( 7 ) years from the date of last disclosure of Confidential Information by either party, at which time it will terminate.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:ThisAgreement/docset:Term-section/docset:Term', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Term'}),\n", + " Document(page_content='9. Equitable Relief . Each party acknowledges that the unauthorized use or disclosure of the disclosing party’s Confidential Information may cause the disclosing party to incur irreparable harm and significant damages, the degree of which may be difficult to ascertain. Accordingly, each party agrees that the disclosing party will have the right to seek immediate equitable relief to enjoin any unauthorized use or disclosure of its Confidential Information , in addition to any other rights and remedies that it may have at law or otherwise.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:EquitableRelief/docset:EquitableRelief-section/docset:EquitableRelief[2]', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'EquitableRelief'}),\n", + " Document(page_content='10. Non-compete. To the maximum extent permitted by applicable law, during the Term of this Agreement and for a period of one ( 1 ) year thereafter, Caleb Divine may not market software products or do business that directly or indirectly competes with Docugami software products .', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:TheMaximumExtent/docset:Non-compete-section/docset:Non-compete', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Non-compete'}),\n", + " Document(page_content='11. Miscellaneous. This Agreement will be governed and construed in accordance with the laws of the State of Washington , excluding its body of law controlling conflict of laws. This Agreement is the complete and exclusive understanding and agreement between the parties regarding the subject matter of this Agreement and supersedes all prior agreements, understandings and communications, oral or written, between the parties regarding the subject matter of this Agreement . If any provision of this Agreement is held invalid or unenforceable by a court of competent jurisdiction, that provision of this Agreement will be enforced to the maximum extent permissible and the other provisions of this Agreement will remain in full force and effect. Neither party may assign this Agreement , in whole or in part, by operation of law or otherwise, without the other party’s prior written consent, and any attempted assignment without such consent will be void. This Agreement may be executed in counterparts, each of which will be deemed an original, but all of which together will constitute one and the same instrument.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:MutualNon-disclosure/docset:MUTUALNON-DISCLOSUREAGREEMENT-section/docset:MUTUALNON-DISCLOSUREAGREEMENT/docset:Consideration/docset:Purposes/docset:Accordance/docset:Miscellaneous-section/docset:Miscellaneous', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'div', 'tag': 'Miscellaneous'}),\n", + " Document(page_content='[SIGNATURE PAGE FOLLOWS] IN WITNESS WHEREOF, the parties hereto have executed this Mutual Non-Disclosure Agreement by their duly authorized officers or representatives as of the date first set forth above.', metadata={'xpath': '/docset:MutualNon-disclosure/docset:Witness/docset:TheParties/docset:TheParties', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': 'p', 'tag': 'TheParties'}),\n", + " Document(page_content='DOCUGAMI INC . : \\n\\n Caleb Divine : \\n\\n Signature: Signature: Name: \\n\\n Jean Paoli Name: Title: \\n\\n CEO Title:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:Witness/docset:TheParties/docset:DocugamiInc/docset:DocugamiInc/xhtml:table', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': '', 'tag': 'table'})]" ] }, - "execution_count": 3, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -116,7 +124,7 @@ "source": [ "The `metadata` for each `Document` (really, a chunk of an actual PDF, DOC or DOCX) contains some useful additional information:\n", "\n", - "1. **id and name:** ID and Name of the file (PDF, DOC or DOCX) the chunk is sourced from within Docugami.\n", + "1. **id and source:** ID and Name of the file (PDF, DOC or DOCX) the chunk is sourced from within Docugami.\n", "2. **xpath:** XPath inside the XML representation of the document, for the chunk. Useful for source citations directly to the actual chunk inside the document XML.\n", "3. **structure:** Structural attributes of the chunk, e.g. h1, h2, div, table, td, etc. Useful to filter out certain kinds of chunks if needed by the caller.\n", "4. **tag:** Semantic tag for the chunk, using various generative and extractive techniques. More details here: https://github.com/docugami/DFM-benchmarks" @@ -133,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -142,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -168,17 +176,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using embedded DuckDB without persistence: data will be transient\n" - ] - } - ], + "outputs": [], "source": [ "embedding = OpenAIEmbeddings()\n", "vectordb = Chroma.from_documents(documents=documents, embedding=embedding)\n", @@ -190,21 +190,21 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'query': 'What can tenants do with signage on their properties?',\n", - " 'result': ' Tenants may place signs (digital or otherwise) or other form of identification on the premises after receiving written permission from the landlord which shall not be unreasonably withheld. The tenant is responsible for any damage caused to the premises and must conform to any applicable laws, ordinances, etc. governing the same. The tenant must also remove and clean any window or glass identification promptly upon vacating the premises.',\n", - " 'source_documents': [Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage', 'id': 'v1bvgaozfkak', 'name': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC'}),\n", - " Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk', 'id': 'g2fvhekmltza', 'name': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC'}),\n", - " Document(page_content='Landlord , its agents, servants, employees, licensees, invitees, and contractors during the last year of the term of this Lease at any and all times during regular business hours, after 24 hour notice to tenant, to pass and repass on and through the Premises, or such portion thereof as may be necessary, in order that they or any of them may gain access to the Premises for the purpose of showing the Premises to potential new tenants or real estate brokers. In addition, Landlord shall be entitled to place a \"FOR RENT \" or \"FOR LEASE\" sign (not exceeding 8.5 ” x 11 ”) in the front window of the Premises during the last six months of the term of this Lease .', metadata={'xpath': '/docset:Rider/docset:RIDERTOLEASE-section/docset:RIDERTOLEASE/docset:FixedRent/docset:TermYearPeriod/docset:Lease/docset:_42FLandlordSAccess-section/docset:_42FLandlordSAccess/docset:LandlordsRights/docset:Landlord', 'id': 'omvs4mysdk6b', 'name': 'TruTone Lane 1.docx', 'structure': 'p', 'tag': 'Landlord', 'Landlord': 'BIRCH STREET , LLC', 'Tenant': 'Trutone Lane LLC'}),\n", - " Document(page_content=\"24. SIGNS . No signage shall be placed by Tenant on any portion of the Project . However, Tenant shall be permitted to place a sign bearing its name in a location approved by Landlord near the entrance to the Premises (at Tenant's cost ) and will be furnished a single listing of its name in the Building's directory (at Landlord 's cost ), all in accordance with the criteria adopted from time to time by Landlord for the Project . Any changes or additional listings in the directory shall be furnished (subject to availability of space) for the then Building Standard charge .\", metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:TheTerms/docset:Indemnification/docset:INDEMNIFICATION-section/docset:INDEMNIFICATION/docset:Waiver/docset:Waiver/docset:Signs/docset:SIGNS-section/docset:SIGNS', 'id': 'qkn9cyqsiuch', 'name': 'Shorebucks LLC_AZ.pdf', 'structure': 'div', 'tag': 'SIGNS', 'Landlord': 'Menlo Group', 'Tenant': 'Shorebucks LLC'})]}" + " 'result': ' Tenants can place or attach signs (digital or otherwise) or other forms of identification to their premises, as long as they receive written permission from the landlord and the signs or other forms of identification conform to all applicable laws and ordinances.',\n", + " 'source_documents': [Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'}),\n", + " Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'}),\n", + " Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk'}),\n", + " Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk'})]}" ] }, - "execution_count": 7, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -227,23 +227,30 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 19, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "query='rentable area' filter=Comparison(comparator=, attribute='Landlord', value='DHA Group') limit=None\n" + ] + }, { "data": { "text/plain": [ - "' 9,753 square feet'" + "' 13,500 square feet.'" ] }, - "execution_count": 8, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chain_response = qa_chain(\"What is rentable area for the property owned by DHA Group?\")\n", - "chain_response[\"result\"] # the correct answer should be 13,500" + "chain_response[\"result\"]" ] }, { @@ -255,19 +262,19 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup', 'id': 'md8rieecquyv', 'name': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC'}),\n", - " Document(page_content='WITNESSES: LANDLORD: DHA Group , a Delaware limited liability company', metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Guaranty-section/docset:Guaranty[2]/docset:SIGNATURESONNEXTPAGE-section/docset:INWITNESSWHEREOF-section/docset:INWITNESSWHEREOF/docset:Behalf/docset:Witnesses/xhtml:table/xhtml:tbody/xhtml:tr[3]/xhtml:td[2]/docset:DhaGroup', 'id': 'md8rieecquyv', 'name': 'Shorebucks LLC_NJ.pdf', 'structure': 'p', 'tag': 'DhaGroup', 'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC'}),\n", - " Document(page_content=\"1.16 Landlord 's Notice Address . DHA Group , Suite 1010 , 111 Bauer Dr , Oakland , New Jersey , 07436 , with a copy to the Building Management Office at the Project , Attention: On - Site Property Manager .\", metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:PercentageRent/docset:NoticeAddress[2]/docset:LandlordsNoticeAddress-section/docset:LandlordsNoticeAddress[2]', 'id': 'md8rieecquyv', 'name': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'LandlordsNoticeAddress', 'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 9,753 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:PerryBlair/docset:PerryBlair/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises', 'id': 'dsyfhh4vpeyf', 'name': 'Shorebucks LLC_CO.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'Landlord': 'Perry & Blair LLC', 'Tenant': 'Shorebucks LLC'})]" + "[Document(page_content='1.6 Rentable Area of the Premises. 9,753 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'Perry & Blair LLC', 'Tenant': 'Shorebucks LLC', 'id': 'dsyfhh4vpeyf', 'source': 'Shorebucks LLC_CO.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:PerryBlair/docset:PerryBlair/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.6 Rentable Area of the Premises. 9,753 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'Perry & Blair LLC', 'Tenant': 'Shorebucks LLC', 'id': 'dsyfhh4vpeyf', 'source': 'Shorebucks LLC_CO.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:PerryBlair/docset:PerryBlair/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'})]" ] }, - "execution_count": 9, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -287,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -295,14 +302,14 @@ "text/plain": [ "{'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOfficeLeaseAgreement',\n", " 'id': 'v1bvgaozfkak',\n", - " 'name': 'TruTone Lane 2.docx',\n", + " 'source': 'TruTone Lane 2.docx',\n", " 'structure': 'p',\n", " 'tag': 'ThisOfficeLeaseAgreement',\n", " 'Landlord': 'BUBBA CENTER PARTNERSHIP',\n", " 'Tenant': 'Truetone Lane LLC'}" ] }, - "execution_count": 10, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -322,17 +329,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 17, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using embedded DuckDB without persistence: data will be transient\n" - ] - } - ], + "outputs": [], "source": [ "from langchain.chains.query_constructor.schema import AttributeInfo\n", "from langchain.retrievers.self_query.base import SelfQueryRetriever\n", @@ -369,14 +368,22 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/root/Source/github/docugami.langchain/libs/langchain/langchain/chains/llm.py:275: UserWarning: The predict_and_parse method is deprecated, instead pass an output parser directly to LLMChain.\n", + " warnings.warn(\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "query='rentable area' filter=Comparison(comparator=, attribute='Landlord', value='DHA Group')\n" + "query='rentable area' filter=Comparison(comparator=, attribute='Landlord', value='DHA Group') limit=None\n" ] }, { @@ -384,13 +391,13 @@ "text/plain": [ "{'query': 'What is rentable area for the property owned by DHA Group?',\n", " 'result': ' 13,500 square feet.',\n", - " 'source_documents': [Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup', 'id': 'md8rieecquyv', 'name': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC'}),\n", - " Document(page_content='WITNESSES: LANDLORD: DHA Group , a Delaware limited liability company', metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Guaranty-section/docset:Guaranty[2]/docset:SIGNATURESONNEXTPAGE-section/docset:INWITNESSWHEREOF-section/docset:INWITNESSWHEREOF/docset:Behalf/docset:Witnesses/xhtml:table/xhtml:tbody/xhtml:tr[3]/xhtml:td[2]/docset:DhaGroup', 'id': 'md8rieecquyv', 'name': 'Shorebucks LLC_NJ.pdf', 'structure': 'p', 'tag': 'DhaGroup', 'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC'}),\n", - " Document(page_content=\"1.16 Landlord 's Notice Address . DHA Group , Suite 1010 , 111 Bauer Dr , Oakland , New Jersey , 07436 , with a copy to the Building Management Office at the Project , Attention: On - Site Property Manager .\", metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:PercentageRent/docset:NoticeAddress[2]/docset:LandlordsNoticeAddress-section/docset:LandlordsNoticeAddress[2]', 'id': 'md8rieecquyv', 'name': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'LandlordsNoticeAddress', 'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises', 'id': 'md8rieecquyv', 'name': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC'})]}" + " 'source_documents': [Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.11 Percentage Rent . (a) 55 % of Gross Revenue to Landlord until Landlord receives Percentage Rent in an amount equal to the Annual Market Rent Hurdle (as escalated); and', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'p', 'tag': 'GrossRevenue', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent-section/docset:PercentageRent[2]/docset:PercentageRent/docset:GrossRevenue[1]/docset:GrossRevenue'})]}" ] }, - "execution_count": 12, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -423,7 +430,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/libs/langchain/langchain/document_loaders/docugami.py b/libs/langchain/langchain/document_loaders/docugami.py index b60326f24..ede8908d6 100644 --- a/libs/langchain/langchain/document_loaders/docugami.py +++ b/libs/langchain/langchain/document_loaders/docugami.py @@ -18,7 +18,7 @@ TABLE_NAME = "{http://www.w3.org/1999/xhtml}table" XPATH_KEY = "xpath" DOCUMENT_ID_KEY = "id" -DOCUMENT_NAME_KEY = "name" +DOCUMENT_SOURCE_KEY = "source" STRUCTURE_KEY = "structure" TAG_KEY = "tag" PROJECTS_KEY = "projects" @@ -146,7 +146,7 @@ class DocugamiLoader(BaseLoader, BaseModel): metadata = { XPATH_KEY: _xpath_for_chunk(node), DOCUMENT_ID_KEY: document["id"], - DOCUMENT_NAME_KEY: document["name"], + DOCUMENT_SOURCE_KEY: document["name"], STRUCTURE_KEY: node.attrib.get("structure", ""), TAG_KEY: re.sub(r"\{.*\}", "", node.tag), } @@ -349,7 +349,7 @@ class DocugamiLoader(BaseLoader, BaseModel): chunks += self._parse_dgml( { DOCUMENT_ID_KEY: path.name, - DOCUMENT_NAME_KEY: path.name, + DOCUMENT_SOURCE_KEY: path.name, }, file.read(), ) From 4806504ebc73c6f311606cdca353708b02e64aea Mon Sep 17 00:00:00 2001 From: Taqi Jaffri Date: Tue, 1 Aug 2023 15:43:26 -0700 Subject: [PATCH 002/143] Fixed one last key name --- .../document_loaders/docugami.ipynb | 73 ++++++++----------- .../langchain/document_loaders/docugami.py | 4 +- 2 files changed, 31 insertions(+), 46 deletions(-) diff --git a/docs/extras/integrations/document_loaders/docugami.ipynb b/docs/extras/integrations/document_loaders/docugami.ipynb index fb12a02b3..346df6096 100644 --- a/docs/extras/integrations/document_loaders/docugami.ipynb +++ b/docs/extras/integrations/document_loaders/docugami.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 20, "metadata": { "tags": [] }, @@ -58,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -104,7 +104,7 @@ " Document(page_content='DOCUGAMI INC . : \\n\\n Caleb Divine : \\n\\n Signature: Signature: Name: \\n\\n Jean Paoli Name: Title: \\n\\n CEO Title:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:Witness/docset:TheParties/docset:DocugamiInc/docset:DocugamiInc/xhtml:table', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': '', 'tag': 'table'})]" ] }, - "execution_count": 9, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -176,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -190,21 +190,21 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'query': 'What can tenants do with signage on their properties?',\n", - " 'result': ' Tenants can place or attach signs (digital or otherwise) or other forms of identification to their premises, as long as they receive written permission from the landlord and the signs or other forms of identification conform to all applicable laws and ordinances.',\n", - " 'source_documents': [Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'}),\n", - " Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'}),\n", + " 'result': ' Tenants can place or attach signs (digital or otherwise) to their properties, after receiving written permission from their landlord. Any signs must conform to all applicable laws, ordinances, etc. governing the same.',\n", + " 'source_documents': [Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk'}),\n", " Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk'}),\n", - " Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk'})]}" + " Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'}),\n", + " Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'})]}" ] }, - "execution_count": 13, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -227,23 +227,16 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 27, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "query='rentable area' filter=Comparison(comparator=, attribute='Landlord', value='DHA Group') limit=None\n" - ] - }, { "data": { "text/plain": [ - "' 13,500 square feet.'" + "\" I don't know.\"" ] }, - "execution_count": 19, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -262,19 +255,19 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[Document(page_content='1.6 Rentable Area of the Premises. 9,753 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'Perry & Blair LLC', 'Tenant': 'Shorebucks LLC', 'id': 'dsyfhh4vpeyf', 'source': 'Shorebucks LLC_CO.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:PerryBlair/docset:PerryBlair/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 9,753 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'Perry & Blair LLC', 'Tenant': 'Shorebucks LLC', 'id': 'dsyfhh4vpeyf', 'source': 'Shorebucks LLC_CO.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:PerryBlair/docset:PerryBlair/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'})]" + "[Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'}),\n", + " Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'}),\n", + " Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'}),\n", + " Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'})]" ] }, - "execution_count": 15, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -294,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -309,7 +302,7 @@ " 'Tenant': 'Truetone Lane LLC'}" ] }, - "execution_count": 16, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -329,7 +322,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -368,17 +361,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 31, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/root/Source/github/docugami.langchain/libs/langchain/langchain/chains/llm.py:275: UserWarning: The predict_and_parse method is deprecated, instead pass an output parser directly to LLMChain.\n", - " warnings.warn(\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -390,14 +375,14 @@ "data": { "text/plain": [ "{'query': 'What is rentable area for the property owned by DHA Group?',\n", - " 'result': ' 13,500 square feet.',\n", + " 'result': ' The rentable area for the property owned by DHA Group is 13,500 square feet.',\n", " 'source_documents': [Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", - " Document(page_content='1.11 Percentage Rent . (a) 55 % of Gross Revenue to Landlord until Landlord receives Percentage Rent in an amount equal to the Annual Market Rent Hurdle (as escalated); and', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'p', 'tag': 'GrossRevenue', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent-section/docset:PercentageRent[2]/docset:PercentageRent/docset:GrossRevenue[1]/docset:GrossRevenue'})]}" + " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'})]}" ] }, - "execution_count": 18, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } diff --git a/libs/langchain/langchain/document_loaders/docugami.py b/libs/langchain/langchain/document_loaders/docugami.py index ede8908d6..dabe51038 100644 --- a/libs/langchain/langchain/document_loaders/docugami.py +++ b/libs/langchain/langchain/document_loaders/docugami.py @@ -145,8 +145,8 @@ class DocugamiLoader(BaseLoader, BaseModel): """Create a Document from a node and text.""" metadata = { XPATH_KEY: _xpath_for_chunk(node), - DOCUMENT_ID_KEY: document["id"], - DOCUMENT_SOURCE_KEY: document["name"], + DOCUMENT_ID_KEY: document[DOCUMENT_ID_KEY], + DOCUMENT_SOURCE_KEY: document[DOCUMENT_SOURCE_KEY], STRUCTURE_KEY: node.attrib.get("structure", ""), TAG_KEY: re.sub(r"\{.*\}", "", node.tag), } From 5919c0f4a22f37d1d08429c8c2367dcc8cd95bb0 Mon Sep 17 00:00:00 2001 From: Taqi Jaffri Date: Tue, 8 Aug 2023 21:38:55 -0700 Subject: [PATCH 003/143] notebook cleanup --- .../document_loaders/docugami.ipynb | 88 +++++++++++-------- .../langchain/document_loaders/docugami.py | 5 +- 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/docs/extras/integrations/document_loaders/docugami.ipynb b/docs/extras/integrations/document_loaders/docugami.ipynb index 346df6096..d3f94a8d1 100644 --- a/docs/extras/integrations/document_loaders/docugami.ipynb +++ b/docs/extras/integrations/document_loaders/docugami.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 1, "metadata": { "tags": [] }, @@ -58,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -104,7 +104,7 @@ " Document(page_content='DOCUGAMI INC . : \\n\\n Caleb Divine : \\n\\n Signature: Signature: Name: \\n\\n Jean Paoli Name: Title: \\n\\n CEO Title:', metadata={'xpath': '/docset:MutualNon-disclosure/docset:Witness/docset:TheParties/docset:DocugamiInc/docset:DocugamiInc/xhtml:table', 'id': '43rj0ds7s0ur', 'source': 'NDA simple layout.docx', 'structure': '', 'tag': 'table'})]" ] }, - "execution_count": 22, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -176,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -190,21 +190,21 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'query': 'What can tenants do with signage on their properties?',\n", - " 'result': ' Tenants can place or attach signs (digital or otherwise) to their properties, after receiving written permission from their landlord. Any signs must conform to all applicable laws, ordinances, etc. governing the same.',\n", - " 'source_documents': [Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk'}),\n", - " Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOFFICELEASEAGREEMENTThis/docset:ArticleIBasic/docset:ArticleIiiUseAndCareOf/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:NoOtherPurposes/docset:TenantsResponsibility/dg:chunk'}),\n", - " Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'}),\n", - " Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'})]}" + " 'result': \" Tenants can place or attach signs (digital or otherwise) to their premises with written permission from the landlord. The signs must conform to all applicable laws, ordinances, etc. governing the same. Tenants can also have their name listed in the building's directory at the landlord's cost.\",\n", + " 'source_documents': [Document(page_content='ARTICLE VI SIGNAGE 6.01 Signage . Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises.', metadata={'Landlord': 'BUBBA CENTER PARTNERSHIP', 'Lease Date': 'April 24 \\n\\n ,', 'Lease Parties': 'This OFFICE LEASE AGREEMENT (this \"Lease\") is made and entered into by and between BUBBA CENTER PARTNERSHIP (\" Landlord \"), and Truetone Lane LLC , a Delaware limited liability company (\" Tenant \").', 'Tenant': 'Truetone Lane LLC', 'id': 'v1bvgaozfkak', 'source': 'TruTone Lane 2.docx', 'structure': 'div', 'tag': '_601Signage', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ARTICLEVISIGNAGE-section/docset:_601Signage-section/docset:_601Signage'}),\n", + " Document(page_content='Signage. Tenant may place or attach to the Premises signs (digital or otherwise) or other such identification as needed after receiving written permission from the Landlord , which permission shall not be unreasonably withheld. Any damage caused to the Premises by the Tenant ’s erecting or removing such signs shall be repaired promptly by the Tenant at the Tenant ’s expense . Any signs or other form of identification allowed must conform to all applicable laws, ordinances, etc. governing the same. Tenant also agrees to have any window or glass identification completely removed and cleaned at its expense promptly upon vacating the Premises. \\n\\n ARTICLE VII UTILITIES 7.01', metadata={'Landlord': 'GLORY ROAD LLC', 'Lease Date': 'April 30 , 2020', 'Lease Parties': 'This OFFICE LEASE AGREEMENT (this \"Lease\") is made and entered into by and between GLORY ROAD LLC (\" Landlord \"), and Truetone Lane LLC , a Delaware limited liability company (\" Tenant \").', 'Tenant': 'Truetone Lane LLC', 'id': 'g2fvhekmltza', 'source': 'TruTone Lane 6.pdf', 'structure': 'lim', 'tag': 'chunk', 'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:Article/docset:ArticleIiiUse/docset:ARTICLEIIIUSEANDCAREOFPREMISES-section/docset:ARTICLEIIIUSEANDCAREOFPREMISES/docset:AnyTime/docset:Addition/dg:chunk'}),\n", + " Document(page_content='Landlord , its agents, servants, employees, licensees, invitees, and contractors during the last year of the term of this Lease at any and all times during regular business hours, after 24 hour notice to tenant, to pass and repass on and through the Premises, or such portion thereof as may be necessary, in order that they or any of them may gain access to the Premises for the purpose of showing the Premises to potential new tenants or real estate brokers. In addition, Landlord shall be entitled to place a \"FOR RENT \" or \"FOR LEASE\" sign (not exceeding 8.5 ” x 11 ”) in the front window of the Premises during the last six months of the term of this Lease .', metadata={'Landlord': 'BIRCH STREET , LLC', 'Lease Date': 'October 15 , 2021', 'Lease Parties': 'The provisions of this rider are hereby incorporated into and made a part of the Lease dated as of October 15 , 2021 between BIRCH STREET , LLC , having an address at c/o Birch Palace , 6 Grace Avenue Suite 200 , Great Neck , New York 11021 (\" Landlord \"), and Trutone Lane LLC , having an address at 4 Pearl Street , New York , New York 10012 (\" Tenant \") of Premises known as the ground floor space and lower level space, as per floor plan annexed hereto and made a part hereof as Exhibit A (“Premises”) at 4 Pearl Street , New York , New York 10012 in the City of New York , Borough of Manhattan , to which this rider is annexed. If there is any conflict between the provisions of this rider and the remainder of this Lease , the provisions of this rider shall govern.', 'Tenant': 'Trutone Lane LLC', 'id': 'omvs4mysdk6b', 'source': 'TruTone Lane 1.docx', 'structure': 'p', 'tag': 'Landlord', 'xpath': '/docset:Rider/docset:RIDERTOLEASE-section/docset:RIDERTOLEASE/docset:FixedRent/docset:TermYearPeriod/docset:Lease/docset:_42FLandlordSAccess-section/docset:_42FLandlordSAccess/docset:LandlordsRights/docset:Landlord'}),\n", + " Document(page_content=\"24. SIGNS . No signage shall be placed by Tenant on any portion of the Project . However, Tenant shall be permitted to place a sign bearing its name in a location approved by Landlord near the entrance to the Premises (at Tenant's cost ) and will be furnished a single listing of its name in the Building's directory (at Landlord 's cost ), all in accordance with the criteria adopted from time to time by Landlord for the Project . Any changes or additional listings in the directory shall be furnished (subject to availability of space) for the then Building Standard charge .\", metadata={'Landlord': 'Perry & Blair LLC', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'dsyfhh4vpeyf', 'source': 'Shorebucks LLC_CO.pdf', 'structure': 'div', 'tag': 'SIGNS', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:ThisLease-section/docset:ThisLease/docset:Guaranty-section/docset:Guaranty[2]/docset:TheTransfer/docset:TheTerms/docset:Indemnification/docset:INDEMNIFICATION-section/docset:INDEMNIFICATION/docset:Waiver/docset:Waiver/docset:Signs/docset:SIGNS-section/docset:SIGNS'})]}" ] }, - "execution_count": 26, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -227,47 +227,47 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "\" I don't know.\"" + "' 9,753 square feet.'" ] }, - "execution_count": 27, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chain_response = qa_chain(\"What is rentable area for the property owned by DHA Group?\")\n", - "chain_response[\"result\"]" + "chain_response[\"result\"] # correct answer should be 13,500 sq ft" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "At first glance the answer may seem reasonable, but if you review the source chunks carefully for this answer, you will see that the chunking of the document did not end up putting the Landlord name and the rentable area in the same context, since they are far apart in the document. The retriever therefore ends up finding unrelated chunks from other documents not even related to the **Menlo Group** landlord. That landlord happens to be mentioned on the first page of the file **Shorebucks LLC_NJ.pdf** file, and while one of the source chunks used by the chain is indeed from that doc that contains the correct answer (**13,500**), other source chunks from different docs are included, and the answer is therefore incorrect." + "At first glance the answer may seem reasonable, but if you review the source chunks carefully for this answer, you will see that the chunking of the document did not end up putting the Landlord name and the rentable area in the same context, since they are far apart in the document. The retriever therefore ends up finding unrelated chunks from other documents not even related to the **DHA Group** landlord. That landlord happens to be mentioned on the first page of the file **Shorebucks LLC_NJ.pdf** file, and while one of the source chunks used by the chain is indeed from that doc that contains the correct answer (**13,500**), other source chunks from different docs are included, and the answer is therefore incorrect." ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'}),\n", - " Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'}),\n", - " Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'}),\n", - " Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'})]" + "[Document(page_content='1.1 Landlord . DHA Group , a Delaware limited liability company authorized to transact business in New Jersey .', metadata={'Landlord': 'DHA Group', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:DhaGroup/docset:Landlord-section/docset:DhaGroup'}),\n", + " Document(page_content='WITNESSES: LANDLORD: DHA Group , a Delaware limited liability company', metadata={'Landlord': 'DHA Group', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'p', 'tag': 'DhaGroup', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Guaranty-section/docset:Guaranty[2]/docset:SIGNATURESONNEXTPAGE-section/docset:INWITNESSWHEREOF-section/docset:INWITNESSWHEREOF/docset:Behalf/docset:Witnesses/xhtml:table/xhtml:tbody/xhtml:tr[3]/xhtml:td[2]/docset:DhaGroup'}),\n", + " Document(page_content=\"1.16 Landlord 's Notice Address . DHA Group , Suite 1010 , 111 Bauer Dr , Oakland , New Jersey , 07436 , with a copy to the Building Management Office at the Project , Attention: On - Site Property Manager .\", metadata={'Landlord': 'DHA Group', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'LandlordsNoticeAddress', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:PercentageRent/docset:NoticeAddress[2]/docset:LandlordsNoticeAddress-section/docset:LandlordsNoticeAddress[2]'}),\n", + " Document(page_content='1.6 Rentable Area of the Premises. 9,753 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'Perry & Blair LLC', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'dsyfhh4vpeyf', 'source': 'Shorebucks LLC_CO.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:PerryBlair/docset:PerryBlair/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'})]" ] }, - "execution_count": 28, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -287,22 +287,24 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:ThisOfficeLeaseAgreement',\n", + "{'xpath': '/docset:OFFICELEASEAGREEMENT-section/docset:OFFICELEASEAGREEMENT/docset:LeaseParties',\n", " 'id': 'v1bvgaozfkak',\n", " 'source': 'TruTone Lane 2.docx',\n", " 'structure': 'p',\n", - " 'tag': 'ThisOfficeLeaseAgreement',\n", + " 'tag': 'LeaseParties',\n", + " 'Lease Date': 'April 24 \\n\\n ,',\n", " 'Landlord': 'BUBBA CENTER PARTNERSHIP',\n", - " 'Tenant': 'Truetone Lane LLC'}" + " 'Tenant': 'Truetone Lane LLC',\n", + " 'Lease Parties': 'This OFFICE LEASE AGREEMENT (this \"Lease\") is made and entered into by and between BUBBA CENTER PARTNERSHIP (\" Landlord \"), and Truetone Lane LLC , a Delaware limited liability company (\" Tenant \").'}" ] }, - "execution_count": 29, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -322,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -361,9 +363,17 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 12, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/root/Source/github/docugami.langchain/libs/langchain/langchain/chains/llm.py:275: UserWarning: The predict_and_parse method is deprecated, instead pass an output parser directly to LLMChain.\n", + " warnings.warn(\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -376,19 +386,21 @@ "text/plain": [ "{'query': 'What is rentable area for the property owned by DHA Group?',\n", " 'result': ' The rentable area for the property owned by DHA Group is 13,500 square feet.',\n", - " 'source_documents': [Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", - " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'})]}" + " 'source_documents': [Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.6 Rentable Area of the Premises. 13,500 square feet . This square footage figure includes an add-on factor for Common Areas in the Building and has been agreed upon by the parties as final and correct and is not subject to challenge or dispute by either party.', metadata={'Landlord': 'DHA Group', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'div', 'tag': 'RentableAreaofthePremises', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:TheTerms/dg:chunk/docset:BasicLeaseInformation/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS-section/docset:BASICLEASEINFORMATIONANDDEFINEDTERMS/docset:DhaGroup/docset:DhaGroup/docset:Premises[2]/docset:RentableAreaofthePremises-section/docset:RentableAreaofthePremises'}),\n", + " Document(page_content='1.11 Percentage Rent . (a) 55 % of Gross Revenue to Landlord until Landlord receives Percentage Rent in an amount equal to the Annual Market Rent Hurdle (as escalated); and', metadata={'Landlord': 'DHA Group', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'p', 'tag': 'GrossRevenue', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent-section/docset:PercentageRent[2]/docset:PercentageRent/docset:GrossRevenue[1]/docset:GrossRevenue'}),\n", + " Document(page_content='1.11 Percentage Rent . (a) 55 % of Gross Revenue to Landlord until Landlord receives Percentage Rent in an amount equal to the Annual Market Rent Hurdle (as escalated); and', metadata={'Landlord': 'DHA Group', 'Lease Date': 'March 29th , 2019', 'Lease Parties': 'THIS OFFICE LEASE (the \"Lease\") is made and entered into as of March 29th , 2019 , by and between Landlord and Tenant . \"Date of this Lease\" shall mean the date on which the last one of the Landlord and Tenant has signed this Lease .', 'Tenant': 'Shorebucks LLC', 'id': 'md8rieecquyv', 'source': 'Shorebucks LLC_NJ.pdf', 'structure': 'p', 'tag': 'GrossRevenue', 'xpath': '/docset:OFFICELEASE-section/docset:OFFICELEASE/docset:THISOFFICELEASE/docset:WITNESSETH-section/docset:WITNESSETH/docset:GrossRentCreditTheRentCredit-section/docset:GrossRentCreditTheRentCredit/docset:Period/docset:ApplicableSalesTax/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent/docset:PercentageRent-section/docset:PercentageRent[2]/docset:PercentageRent/docset:GrossRevenue[1]/docset:GrossRevenue'})]}" ] }, - "execution_count": 31, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "qa_chain(\"What is rentable area for the property owned by DHA Group?\")" + "qa_chain(\n", + " \"What is rentable area for the property owned by DHA Group?\"\n", + ") # correct answer should be 13,500 sq ft" ] }, { diff --git a/libs/langchain/langchain/document_loaders/docugami.py b/libs/langchain/langchain/document_loaders/docugami.py index dabe51038..af2c95f57 100644 --- a/libs/langchain/langchain/document_loaders/docugami.py +++ b/libs/langchain/langchain/document_loaders/docugami.py @@ -19,6 +19,7 @@ TABLE_NAME = "{http://www.w3.org/1999/xhtml}table" XPATH_KEY = "xpath" DOCUMENT_ID_KEY = "id" DOCUMENT_SOURCE_KEY = "source" +DOCUMENT_NAME_KEY = "name" STRUCTURE_KEY = "structure" TAG_KEY = "tag" PROJECTS_KEY = "projects" @@ -146,7 +147,7 @@ class DocugamiLoader(BaseLoader, BaseModel): metadata = { XPATH_KEY: _xpath_for_chunk(node), DOCUMENT_ID_KEY: document[DOCUMENT_ID_KEY], - DOCUMENT_SOURCE_KEY: document[DOCUMENT_SOURCE_KEY], + DOCUMENT_SOURCE_KEY: document[DOCUMENT_NAME_KEY], STRUCTURE_KEY: node.attrib.get("structure", ""), TAG_KEY: re.sub(r"\{.*\}", "", node.tag), } @@ -349,7 +350,7 @@ class DocugamiLoader(BaseLoader, BaseModel): chunks += self._parse_dgml( { DOCUMENT_ID_KEY: path.name, - DOCUMENT_SOURCE_KEY: path.name, + DOCUMENT_NAME_KEY: path.name, }, file.read(), ) From 50b13ab9384932b9dd4aef64dd08150dbb6a5655 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Wed, 9 Aug 2023 13:26:09 -0700 Subject: [PATCH 004/143] wip --- libs/langchain/langchain/chains/base.py | 8 +- libs/langchain/langchain/schema/runnable.py | 158 ++++++------------ .../smith/evaluation/runner_utils.py | 8 +- 3 files changed, 60 insertions(+), 114 deletions(-) diff --git a/libs/langchain/langchain/chains/base.py b/libs/langchain/langchain/chains/base.py index 301b0143e..a490c5831 100644 --- a/libs/langchain/langchain/chains/base.py +++ b/libs/langchain/langchain/chains/base.py @@ -62,7 +62,9 @@ class Chain(Serializable, Runnable[Dict[str, Any], Dict[str, Any]], ABC): config: Optional[RunnableConfig] = None, **kwargs: Any, ) -> Dict[str, Any]: - return self(input, **(config or {}), **kwargs) + _config: Dict[str, Any] = dict(config) if config else {} + _config.pop("_locals", None) + return self(input, **_config, **kwargs) async def ainvoke( self, @@ -76,7 +78,9 @@ class Chain(Serializable, Runnable[Dict[str, Any], Dict[str, Any]], ABC): None, partial(self.invoke, input, config, **kwargs) ) - return await self.acall(input, **(config or {}), **kwargs) + _config: Dict[str, Any] = dict(config) if config else {} + _config.pop("_locals", None) + return await self.acall(input, **_config, **kwargs) memory: Optional[BaseMemory] = None """Optional memory object. Defaults to None. diff --git a/libs/langchain/langchain/schema/runnable.py b/libs/langchain/langchain/schema/runnable.py index 8edafe459..eebd5a96a 100644 --- a/libs/langchain/langchain/schema/runnable.py +++ b/libs/langchain/langchain/schema/runnable.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio from abc import ABC, abstractmethod from concurrent.futures import ThreadPoolExecutor +from copy import deepcopy from itertools import tee from typing import ( Any, @@ -66,6 +67,35 @@ class RunnableConfig(TypedDict, total=False): Tags are passed to all callbacks, metadata is passed to handle*Start callbacks. """ + _locals: Dict[str, Any] + """ + Local variables + """ + + +def _empty_config() -> RunnableConfig: + return RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) + + +def _get_callback_manager(config: Mapping) -> Any: + from langchain.callbacks.manager import CallbackManager + + return CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) + + +def _get_async_callback_manager(config: Mapping) -> Any: + from langchain.callbacks.manager import AsyncCallbackManager + + return AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) + Input = TypeVar("Input") # Output type should implement __concat__, as eg str, list, dict do @@ -243,7 +273,7 @@ class Runnable(Generic[Input, Output], ABC): return ( config if isinstance(config, list) - else [config.copy() if config is not None else {} for _ in range(length)] + else [deepcopy(config) if config is not None else {} for _ in range(length)] ) def _call_with_config( @@ -255,14 +285,8 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement invoke() in subclasses.""" - from langchain.callbacks.manager import CallbackManager - config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + callback_manager = _get_callback_manager(config) run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input}, @@ -288,14 +312,8 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement ainvoke() in subclasses.""" - from langchain.callbacks.manager import AsyncCallbackManager - config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + callback_manager = _get_async_callback_manager(config) run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input}, @@ -322,8 +340,6 @@ class Runnable(Generic[Input, Output], ABC): """Helper method to transform an Iterator of Input values into an Iterator of Output values, with callbacks. Use this to implement `stream()` or `transform()` in Runnable subclasses.""" - from langchain.callbacks.manager import CallbackManager - # tee the input so we can iterate over it twice input_for_tracing, input_for_transform = tee(input, 2) # Start the input iterator to ensure the input runnable starts before this one @@ -333,11 +349,7 @@ class Runnable(Generic[Input, Output], ABC): final_output_supported = True config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + callback_manager = _get_callback_manager(config) run_manager = callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -393,8 +405,6 @@ class Runnable(Generic[Input, Output], ABC): """Helper method to transform an Async Iterator of Input values into an Async Iterator of Output values, with callbacks. Use this to implement `astream()` or `atransform()` in Runnable subclasses.""" - from langchain.callbacks.manager import AsyncCallbackManager - # tee the input so we can iterate over it twice input_for_tracing, input_for_transform = atee(input, 2) # Start the input iterator to ensure the input runnable starts before this one @@ -404,11 +414,7 @@ class Runnable(Generic[Input, Output], ABC): final_output_supported = True config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + callback_manager = _get_async_callback_manager(config) run_manager = await callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -473,19 +479,9 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): yield from self.fallbacks def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: - from langchain.callbacks.manager import CallbackManager - # setup callbacks config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -516,19 +512,9 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): async def ainvoke( self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -751,19 +737,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): ) def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: - from langchain.callbacks.manager import CallbackManager - # setup callbacks - config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = config or _empty_config() + callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -771,11 +747,12 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): # invoke all steps in sequence try: + callbacks = run_manager.get_child() for step in self.steps: input = step.invoke( input, # mark each step as a child run - _patch_config(config, run_manager.get_child()), + _patch_config(config, callbacks), ) # finish the root run except (KeyboardInterrupt, Exception) as e: @@ -790,19 +767,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): async def ainvoke( self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -946,19 +913,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): def stream( self, input: Input, config: Optional[RunnableConfig] = None ) -> Iterator[Output]: - from langchain.callbacks.manager import CallbackManager - # setup callbacks config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -1023,19 +980,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): async def astream( self, input: Input, config: Optional[RunnableConfig] = None ) -> AsyncIterator[Output]: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -1173,19 +1120,9 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): async def ainvoke( self, input: Input, config: Optional[RunnableConfig] = None ) -> Dict[str, Any]: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), {"input": input} @@ -1464,10 +1401,11 @@ class RouterRunnable( def _patch_config( - config: RunnableConfig, callback_manager: BaseCallbackManager + config: RunnableConfig, callback_manager: BaseCallbackManager, _locals: Optional[Dict[str, Any]] = None ) -> RunnableConfig: - config = config.copy() + config = deepcopy(config) config["callbacks"] = callback_manager + config["_locals"] = _locals or {} return config diff --git a/libs/langchain/langchain/smith/evaluation/runner_utils.py b/libs/langchain/langchain/smith/evaluation/runner_utils.py index 5b3d5775c..be55f6f99 100644 --- a/libs/langchain/langchain/smith/evaluation/runner_utils.py +++ b/libs/langchain/langchain/smith/evaluation/runner_utils.py @@ -636,7 +636,9 @@ async def _arun_chain( else: output = await chain.acall(inputs_, callbacks=callbacks, tags=tags) else: - runnable_config = RunnableConfig(tags=tags or [], callbacks=callbacks) + runnable_config = RunnableConfig( + tags=tags or [], callbacks=callbacks, _locals={} + ) output = await chain.ainvoke(inputs_, config=runnable_config) return output @@ -957,7 +959,9 @@ def _run_chain( else: output = chain(inputs_, callbacks=callbacks, tags=tags) else: - runnable_config = RunnableConfig(tags=tags or [], callbacks=callbacks) + runnable_config = RunnableConfig( + tags=tags or [], callbacks=callbacks, _locals={} + ) output = chain.invoke(inputs_, config=runnable_config) return output From eb0134fbb3c728fb5c9180384276315f6318497b Mon Sep 17 00:00:00 2001 From: Bagatur Date: Wed, 9 Aug 2023 14:13:06 -0700 Subject: [PATCH 005/143] rfc --- libs/langchain/langchain/chat_models/base.py | 8 ++- libs/langchain/langchain/llms/base.py | 15 +++--- libs/langchain/langchain/schema/retriever.py | 8 ++- libs/langchain/langchain/schema/runnable.py | 57 +++++++++++++++++--- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/libs/langchain/langchain/chat_models/base.py b/libs/langchain/langchain/chat_models/base.py index b06b99f99..3d343274f 100644 --- a/libs/langchain/langchain/chat_models/base.py +++ b/libs/langchain/langchain/chat_models/base.py @@ -103,12 +103,14 @@ class BaseChatModel(BaseLanguageModel[BaseMessageChunk], ABC): stop: Optional[List[str]] = None, **kwargs: Any, ) -> BaseMessageChunk: + _config: Dict[str, Any] = dict(config or {}) + _config.pop("_locals", None) return cast( BaseMessageChunk, cast( ChatGeneration, self.generate_prompt( - [self._convert_input(input)], stop=stop, **(config or {}), **kwargs + [self._convert_input(input)], stop=stop, **_config, **kwargs ).generations[0][0], ).message, ) @@ -127,8 +129,10 @@ class BaseChatModel(BaseLanguageModel[BaseMessageChunk], ABC): None, partial(self.invoke, input, config, stop=stop, **kwargs) ) + _config: Dict[str, Any] = dict(config or {}) + _config.pop("_locals", None) llm_result = await self.agenerate_prompt( - [self._convert_input(input)], stop=stop, **(config or {}), **kwargs + [self._convert_input(input)], stop=stop, **_config, **kwargs ) return cast( BaseMessageChunk, cast(ChatGeneration, llm_result.generations[0][0]).message diff --git a/libs/langchain/langchain/llms/base.py b/libs/langchain/langchain/llms/base.py index 7da494de7..044221247 100644 --- a/libs/langchain/langchain/llms/base.py +++ b/libs/langchain/langchain/llms/base.py @@ -219,13 +219,12 @@ class BaseLLM(BaseLanguageModel[str], ABC): stop: Optional[List[str]] = None, **kwargs: Any, ) -> str: - return ( - self.generate_prompt( - [self._convert_input(input)], stop=stop, **(config or {}), **kwargs - ) - .generations[0][0] - .text + _config: Dict[str, Any] = dict(config or {}) + _config.pop("_locals", None) + result = self.generate_prompt( + [self._convert_input(input)], stop=stop, **_config, **kwargs ) + return result.generations[0][0].text async def ainvoke( self, @@ -241,8 +240,10 @@ class BaseLLM(BaseLanguageModel[str], ABC): None, partial(self.invoke, input, config, stop=stop, **kwargs) ) + _config: Dict[str, Any] = dict(config or {}) + _config.pop("_locals", None) llm_result = await self.agenerate_prompt( - [self._convert_input(input)], stop=stop, **(config or {}), **kwargs + [self._convert_input(input)], stop=stop, **_config, **kwargs ) return llm_result.generations[0][0].text diff --git a/libs/langchain/langchain/schema/retriever.py b/libs/langchain/langchain/schema/retriever.py index 9df3e7a13..538ae1ed1 100644 --- a/libs/langchain/langchain/schema/retriever.py +++ b/libs/langchain/langchain/schema/retriever.py @@ -107,7 +107,9 @@ class BaseRetriever(Serializable, Runnable[str, List[Document]], ABC): def invoke( self, input: str, config: Optional[RunnableConfig] = None ) -> List[Document]: - return self.get_relevant_documents(input, **(config or {})) + _config: Dict[str, Any] = dict(config or {}) + _config.pop("_locals", None) + return self.get_relevant_documents(input, **_config) async def ainvoke( self, input: str, config: Optional[RunnableConfig] = None @@ -116,7 +118,9 @@ class BaseRetriever(Serializable, Runnable[str, List[Document]], ABC): # If the retriever doesn't implement async, use default implementation return await super().ainvoke(input, config) - return await self.aget_relevant_documents(input, **(config or {})) + _config: Dict[str, Any] = dict(config or {}) + _config.pop("_locals", None) + return await self.aget_relevant_documents(input, **_config) @abstractmethod def _get_relevant_documents( diff --git a/libs/langchain/langchain/schema/runnable.py b/libs/langchain/langchain/schema/runnable.py index eebd5a96a..47679c888 100644 --- a/libs/langchain/langchain/schema/runnable.py +++ b/libs/langchain/langchain/schema/runnable.py @@ -674,6 +674,46 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): raise first_error +class PutLocalVar(Serializable, Runnable[Input, Input]): + key: Union[str, Dict[str, str]] + + def __init__(self, key: str, **kwargs: Any) -> None: + super().__init__(key=key, **kwargs) + + def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Input: + if config is None: + raise ValueError( + "PutLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + if isinstance(self.key, str): + config["_locals"][self.key] = input + else: + if not isinstance(input, Mapping): + raise ValueError + for get_key, put_key in self.key.items(): + config["_locals"][put_key] = input[get_key] + return self._call_with_config(lambda x: x, input, config) + + +class GetLocalVar(Serializable, Runnable[str, Any]): + key: str + passthrough_key: Optional[str] = None + + def __init__(self, key: str, **kwargs: Any) -> None: + super().__init__(key=key, **kwargs) + + def invoke(self, input: str, config: Optional[RunnableConfig] = None) -> Any: + if config is None: + raise ValueError( + "PutLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + if self.passthrough_key is not None: + return {self.key: config["_locals"][self.key], self.passthrough_key: input} + return config["_locals"][self.key] + + class RunnableSequence(Serializable, Runnable[Input, Output]): """ A sequence of runnables, where the output of each is the input of the next. @@ -749,11 +789,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): try: callbacks = run_manager.get_child() for step in self.steps: - input = step.invoke( - input, - # mark each step as a child run - _patch_config(config, callbacks), - ) + # mark each step as child run + step_config = _patch_config(config, callbacks) + input = step.invoke(input, step_config) # finish the root run except (KeyboardInterrupt, Exception) as e: run_manager.on_chain_error(e) @@ -1401,11 +1439,14 @@ class RouterRunnable( def _patch_config( - config: RunnableConfig, callback_manager: BaseCallbackManager, _locals: Optional[Dict[str, Any]] = None + config: RunnableConfig, + callback_manager: BaseCallbackManager, + _locals: Optional[Dict[str, Any]] = None, ) -> RunnableConfig: - config = deepcopy(config) + config = config.copy() config["callbacks"] = callback_manager - config["_locals"] = _locals or {} + if _locals is not None: + config["_locals"] = _locals return config From 8c1a528c7150a4cc833cedb567b668c3ab17a745 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Thu, 17 Aug 2023 13:52:09 -0700 Subject: [PATCH 006/143] cr --- .../langchain/schema/runnable/base.py | 40 ------------------- .../langchain/schema/runnable/passthrough.py | 5 ++- 2 files changed, 3 insertions(+), 42 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 9354355fa..ee3f7c114 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -653,46 +653,6 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): raise first_error -class PutLocalVar(Serializable, Runnable[Input, Input]): - key: Union[str, Dict[str, str]] - - def __init__(self, key: str, **kwargs: Any) -> None: - super().__init__(key=key, **kwargs) - - def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Input: - if config is None: - raise ValueError( - "PutLocalVar should only be used in a RunnableSequence, and should " - "therefore always receive a non-null config." - ) - if isinstance(self.key, str): - config["_locals"][self.key] = input - else: - if not isinstance(input, Mapping): - raise ValueError - for get_key, put_key in self.key.items(): - config["_locals"][put_key] = input[get_key] - return self._call_with_config(lambda x: x, input, config) - - -class GetLocalVar(Serializable, Runnable[str, Any]): - key: str - passthrough_key: Optional[str] = None - - def __init__(self, key: str, **kwargs: Any) -> None: - super().__init__(key=key, **kwargs) - - def invoke(self, input: str, config: Optional[RunnableConfig] = None) -> Any: - if config is None: - raise ValueError( - "PutLocalVar should only be used in a RunnableSequence, and should " - "therefore always receive a non-null config." - ) - if self.passthrough_key is not None: - return {self.key: config["_locals"][self.key], self.passthrough_key: input} - return config["_locals"][self.key] - - class RunnableSequence(Serializable, Runnable[Input, Output]): """ A sequence of runnables, where the output of each is the input of the next. diff --git a/libs/langchain/langchain/schema/runnable/passthrough.py b/libs/langchain/langchain/schema/runnable/passthrough.py index a97e708b6..41a130aa7 100644 --- a/libs/langchain/langchain/schema/runnable/passthrough.py +++ b/libs/langchain/langchain/schema/runnable/passthrough.py @@ -41,7 +41,8 @@ class RunnablePassthrough(Serializable, Runnable[Input, Input]): ) -> Iterator[Input]: return self._transform_stream_with_config(input, identity, config) - def atransform( + async def atransform( self, input: AsyncIterator[Input], config: RunnableConfig | None = None ) -> AsyncIterator[Input]: - return self._atransform_stream_with_config(input, identity, config) + async for chunk in self._atransform_stream_with_config(input, identity, config): + yield chunk From bd80cad6dbd045e36afe4be4071d1ef612ff9ea9 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Thu, 17 Aug 2023 13:52:19 -0700 Subject: [PATCH 007/143] add --- .../langchain/schema/runnable/locals.py | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 libs/langchain/langchain/schema/runnable/locals.py diff --git a/libs/langchain/langchain/schema/runnable/locals.py b/libs/langchain/langchain/schema/runnable/locals.py new file mode 100644 index 000000000..53d8f5a2c --- /dev/null +++ b/libs/langchain/langchain/schema/runnable/locals.py @@ -0,0 +1,115 @@ +from __future__ import annotations + +from typing import Any, AsyncIterator, Dict, Iterator, Mapping, Optional, Union + +from langchain.load.serializable import Serializable +from langchain.schema.runnable import Runnable, RunnableConfig, RunnablePassthrough +from langchain.schema.runnable.base import Input, Output + + +class PutLocalVar(RunnablePassthrough): + key: Union[str, Mapping[str, str]] + """The key(s) to use for storing the input variable(s) in local state. + + If a string is provided then the entire input is stored under that key. If a + Mapping is provided, then the map values are gotten from the input and + stored in local state under the map keys. + """ + + def __init__(self, key: str, **kwargs: Any) -> None: + super().__init__(key=key, **kwargs) + + def _put(self, input: Input, *, config: Optional[RunnableConfig] = None) -> None: + if config is None: + raise ValueError( + "PutLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + if isinstance(self.key, str): + config["_locals"][self.key] = input + elif isinstance(input, Mapping): + for input_key, put_key in self.key.items(): + config["_locals"][put_key] = input[input_key] + else: + raise TypeError( + f"`key` should be a string or Mapping[str, str], received type " + f"{(type(self.key))}." + ) + + def _concat_put( + self, input: Input, *, config: Optional[RunnableConfig] = None + ) -> None: + if config is None: + raise ValueError( + "PutLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + if isinstance(self.key, str): + if self.key not in config["_locals"]: + config["_locals"][self.key] = input + else: + config["_locals"][self.key] += input + elif isinstance(input, Mapping): + for input_key, put_key in self.key.items(): + if put_key not in config["_locals"]: + config["_locals"][put_key] = input + else: + config["_locals"][put_key] += input + else: + raise TypeError( + f"`key` should be a string or Mapping[str, str], received type " + f"{(type(self.key))}." + ) + + def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Input: + self._put(input, config=config) + return super().invoke(input, config) + + async def ainvoke( + self, input: Input, config: RunnableConfig | None = None + ) -> Input: + self._put(input, config=config) + return await super().ainvoke(input, config) + + def transform( + self, input: Iterator[Input], config: RunnableConfig | None = None + ) -> Iterator[Input]: + for chunk in super().transform(input, config=config): + self._concat_put(input, config=config) + yield chunk + + async def atransform( + self, input: AsyncIterator[Input], config: RunnableConfig | None = None + ) -> AsyncIterator[Input]: + async for chunk in super().atransform(input, config=config): + self._concat_put(input, config=config) + yield chunk + + +class GetLocalVar( + Serializable, Runnable[Input, Union[Output, Dict[str, Union[Input, Output]]]] +): + key: str + """The key to extract from the local state.""" + passthrough_key: Optional[str] = None + """The key to use for passing through the invocation input. + + If None, then only the value retrieved from local state is returned. Otherwise a + dictionary ``{self.key: <>, self.passthrough_key: <>}`` + is returned. + """ + + def __init__(self, key: str, **kwargs: Any) -> None: + super().__init__(key=key, **kwargs) + + def invoke( + self, input: Input, config: Optional[RunnableConfig] = None + ) -> Union[Output, Dict[str, Union[Input, Output]]]: + if config is None: + raise ValueError( + "PutLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + if self.passthrough_key is not None: + return {self.key: config["_locals"][self.key], self.passthrough_key: input} + return config["_locals"][self.key] From c447e9a854deef90de62bad39991f1ea55a8f29b Mon Sep 17 00:00:00 2001 From: Bagatur Date: Thu, 17 Aug 2023 15:29:00 -0700 Subject: [PATCH 008/143] cr --- .../langchain/schema/runnable/base.py | 8 ++-- .../langchain/schema/runnable/locals.py | 40 +++++++++++++++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index ee3f7c114..3f3e90ba2 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -243,8 +243,8 @@ class Runnable(Generic[Input, Output], ABC): def _call_with_config( self, - func: Callable[[Input], Output], - input: Input, + func: Callable[[Any], Output], + input: Any, config: Optional[RunnableConfig], run_type: Optional[str] = None, ) -> Output: @@ -273,8 +273,8 @@ class Runnable(Generic[Input, Output], ABC): async def _acall_with_config( self, - func: Callable[[Input], Awaitable[Output]], - input: Input, + func: Callable[[Any], Awaitable[Output]], + input: Any, config: Optional[RunnableConfig], run_type: Optional[str] = None, ) -> Output: diff --git a/libs/langchain/langchain/schema/runnable/locals.py b/libs/langchain/langchain/schema/runnable/locals.py index 53d8f5a2c..cf51336dc 100644 --- a/libs/langchain/langchain/schema/runnable/locals.py +++ b/libs/langchain/langchain/schema/runnable/locals.py @@ -16,7 +16,7 @@ class PutLocalVar(RunnablePassthrough): stored in local state under the map keys. """ - def __init__(self, key: str, **kwargs: Any) -> None: + def __init__(self, key: Union[str, Mapping[str, str]], **kwargs: Any) -> None: super().__init__(key=key, **kwargs) def _put(self, input: Input, *, config: Optional[RunnableConfig] = None) -> None: @@ -63,13 +63,13 @@ class PutLocalVar(RunnablePassthrough): def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Input: self._put(input, config=config) - return super().invoke(input, config) + return super().invoke(input, config=config) async def ainvoke( self, input: Input, config: RunnableConfig | None = None ) -> Input: self._put(input, config=config) - return await super().ainvoke(input, config) + return await super().ainvoke(input, config=config) def transform( self, input: Iterator[Input], config: RunnableConfig | None = None @@ -102,14 +102,40 @@ class GetLocalVar( def __init__(self, key: str, **kwargs: Any) -> None: super().__init__(key=key, **kwargs) + def _get(self, full_input: Dict) -> Union[Output, Dict[str, Union[Input, Output]]]: + if self.passthrough_key: + return { + self.key: full_input["locals"][self.key], + self.passthrough_key: full_input["input"], + } + else: + return full_input["locals"][self.key] + + async def _aget( + self, full_input: Dict + ) -> Union[Output, Dict[str, Union[Input, Output]]]: + return self._get(full_input) + def invoke( self, input: Input, config: Optional[RunnableConfig] = None ) -> Union[Output, Dict[str, Union[Input, Output]]]: if config is None: raise ValueError( - "PutLocalVar should only be used in a RunnableSequence, and should " + "GetLocalVar should only be used in a RunnableSequence, and should " "therefore always receive a non-null config." ) - if self.passthrough_key is not None: - return {self.key: config["_locals"][self.key], self.passthrough_key: input} - return config["_locals"][self.key] + + log_input = {"input": input, "locals": config["_locals"]} + return self._call_with_config(self._get, log_input, config) + + async def ainvoke( + self, input: Input, config: Optional[RunnableConfig] = None + ) -> Union[Output, Dict[str, Union[Input, Output]]]: + if config is None: + raise ValueError( + "GetLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + + log_input = {"input": input, "locals": config["_locals"]} + return await self._acall_with_config(self._aget, log_input, config) From 6b0a849f5953b05eab530cbceffe5ab6b44c3a72 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Thu, 17 Aug 2023 16:22:12 -0700 Subject: [PATCH 009/143] fix --- .../langchain/schema/runnable/__init__.py | 3 ++ .../langchain/schema/runnable/base.py | 11 +++++--- .../langchain/schema/runnable/locals.py | 28 +++++++++++++------ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/__init__.py b/libs/langchain/langchain/schema/runnable/__init__.py index 0dbabd157..bae6aebb0 100644 --- a/libs/langchain/langchain/schema/runnable/__init__.py +++ b/libs/langchain/langchain/schema/runnable/__init__.py @@ -7,10 +7,13 @@ from langchain.schema.runnable.base import ( RunnableWithFallbacks, ) from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable.locals import GetLocalVar, PutLocalVar from langchain.schema.runnable.passthrough import RunnablePassthrough from langchain.schema.runnable.router import RouterInput, RouterRunnable __all__ = [ + "GetLocalVar", + "PutLocalVar", "RouterInput", "RouterRunnable", "Runnable", diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 3f3e90ba2..704a518cd 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -238,7 +238,10 @@ class Runnable(Generic[Input, Output], ABC): return ( config if isinstance(config, list) - else [deepcopy(config) if config is not None else {} for _ in range(length)] + else [ + deepcopy(config) if config is not None else _empty_config() + for _ in range(length) + ] ) def _call_with_config( @@ -750,7 +753,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: # setup callbacks - config = config or {} + config = config or _empty_config() callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( @@ -896,7 +899,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Iterator[Output]: # setup callbacks - config = config or {} + config = config or _empty_config() callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( @@ -963,7 +966,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> AsyncIterator[Output]: # setup callbacks - config = config or {} + config = config or _empty_config() callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( diff --git a/libs/langchain/langchain/schema/runnable/locals.py b/libs/langchain/langchain/schema/runnable/locals.py index cf51336dc..65e63507b 100644 --- a/libs/langchain/langchain/schema/runnable/locals.py +++ b/libs/langchain/langchain/schema/runnable/locals.py @@ -3,8 +3,9 @@ from __future__ import annotations from typing import Any, AsyncIterator, Dict, Iterator, Mapping, Optional, Union from langchain.load.serializable import Serializable -from langchain.schema.runnable import Runnable, RunnableConfig, RunnablePassthrough -from langchain.schema.runnable.base import Input, Output +from langchain.schema.runnable.base import Input, Output, Runnable +from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable.passthrough import RunnablePassthrough class PutLocalVar(RunnablePassthrough): @@ -27,7 +28,12 @@ class PutLocalVar(RunnablePassthrough): ) if isinstance(self.key, str): config["_locals"][self.key] = input - elif isinstance(input, Mapping): + elif isinstance(self.key, Mapping): + if not isinstance(input, Mapping): + raise TypeError( + f"Received key of type Mapping but input of type {type(input)}. " + f"input is expected to be of type Mapping when key is Mapping." + ) for input_key, put_key in self.key.items(): config["_locals"][put_key] = input[input_key] else: @@ -44,17 +50,23 @@ class PutLocalVar(RunnablePassthrough): "PutLocalVar should only be used in a RunnableSequence, and should " "therefore always receive a non-null config." ) + print(config) if isinstance(self.key, str): if self.key not in config["_locals"]: config["_locals"][self.key] = input else: config["_locals"][self.key] += input - elif isinstance(input, Mapping): + elif isinstance(self.key, Mapping): + if not isinstance(input, Mapping): + raise TypeError( + f"Received key of type Mapping but input of type {type(input)}. " + f"input is expected to be of type Mapping when key is Mapping." + ) for input_key, put_key in self.key.items(): if put_key not in config["_locals"]: - config["_locals"][put_key] = input + config["_locals"][put_key] = input[input_key] else: - config["_locals"][put_key] += input + config["_locals"][put_key] += input[input_key] else: raise TypeError( f"`key` should be a string or Mapping[str, str], received type " @@ -75,14 +87,14 @@ class PutLocalVar(RunnablePassthrough): self, input: Iterator[Input], config: RunnableConfig | None = None ) -> Iterator[Input]: for chunk in super().transform(input, config=config): - self._concat_put(input, config=config) + self._concat_put(chunk, config=config) yield chunk async def atransform( self, input: AsyncIterator[Input], config: RunnableConfig | None = None ) -> AsyncIterator[Input]: async for chunk in super().atransform(input, config=config): - self._concat_put(input, config=config) + self._concat_put(chunk, config=config) yield chunk From 9e906c39ba974ae33d596174873a173b505648e9 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Thu, 17 Aug 2023 16:22:22 -0700 Subject: [PATCH 010/143] nit --- libs/langchain/langchain/schema/runnable/locals.py | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/langchain/langchain/schema/runnable/locals.py b/libs/langchain/langchain/schema/runnable/locals.py index 65e63507b..5061dbf38 100644 --- a/libs/langchain/langchain/schema/runnable/locals.py +++ b/libs/langchain/langchain/schema/runnable/locals.py @@ -50,7 +50,6 @@ class PutLocalVar(RunnablePassthrough): "PutLocalVar should only be used in a RunnableSequence, and should " "therefore always receive a non-null config." ) - print(config) if isinstance(self.key, str): if self.key not in config["_locals"]: config["_locals"][self.key] = input From 6f69b19ff583a37387b8403f15fae7bfbcede4ba Mon Sep 17 00:00:00 2001 From: Bagatur Date: Thu, 17 Aug 2023 16:45:52 -0700 Subject: [PATCH 011/143] wip tests --- .../unit_tests/schema/runnable/__init__.py | 0 .../unit_tests/schema/runnable/test_locals.py | 31 +++++++++++++++++++ .../schema/{ => runnable}/test_runnable.py | 0 3 files changed, 31 insertions(+) create mode 100644 libs/langchain/tests/unit_tests/schema/runnable/__init__.py create mode 100644 libs/langchain/tests/unit_tests/schema/runnable/test_locals.py rename libs/langchain/tests/unit_tests/schema/{ => runnable}/test_runnable.py (100%) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__init__.py b/libs/langchain/tests/unit_tests/schema/runnable/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py new file mode 100644 index 000000000..d0a3fb38d --- /dev/null +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py @@ -0,0 +1,31 @@ +import pytest + +from langchain.schema.runnable import GetLocalVar, PutLocalVar + + +@pytest.mark.asyncio +async def test_put_get() -> None: + runnable = PutLocalVar("input") | GetLocalVar("input") + assert runnable.invoke("foo") == "foo" + assert runnable.batch(["foo", "bar"]) == ["foo", "bar"] + assert list(runnable.stream("foo"))[0] == "foo" + + assert await runnable.ainvoke("foo") == "foo" + assert await runnable.abatch(["foo", "bar"]) == ["foo", "bar"] + async for x in runnable.astream("foo"): + assert x == "foo" + + +def test_missing_config() -> None: + with pytest.raises(ValueError): + PutLocalVar("input").invoke("foo") + + with pytest.raises(ValueError): + GetLocalVar("input").invoke("foo") + + +def test_get_missing_var_invoke() -> None: + runnable = PutLocalVar("input") | GetLocalVar("missing") + with pytest.raises(KeyError): + runnable.invoke("foo") + diff --git a/libs/langchain/tests/unit_tests/schema/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py similarity index 100% rename from libs/langchain/tests/unit_tests/schema/test_runnable.py rename to libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py From ab21af71be3c5a2fbe548061228df525c635ba86 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Thu, 17 Aug 2023 17:28:02 -0700 Subject: [PATCH 012/143] wip --- .../langchain/schema/runnable/base.py | 18 +++++----- .../unit_tests/schema/runnable/test_locals.py | 36 ++++++++++++++++++- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 704a518cd..c91456394 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -253,7 +253,7 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement invoke() in subclasses.""" - config = config or {} + config = config or _empty_config() callback_manager = _get_callback_manager(config) run_manager = callback_manager.on_chain_start( dumpd(self), @@ -283,7 +283,7 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement ainvoke() in subclasses.""" - config = config or {} + config = config or _empty_config() callback_manager = _get_async_callback_manager(config) run_manager = await callback_manager.on_chain_start( dumpd(self), @@ -322,7 +322,7 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = config or {} + config = config or _empty_config() callback_manager = _get_callback_manager(config) run_manager = callback_manager.on_chain_start( dumpd(self), @@ -387,7 +387,7 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = config or {} + config = config or _empty_config() callback_manager = _get_async_callback_manager(config) run_manager = await callback_manager.on_chain_start( dumpd(self), @@ -462,7 +462,7 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: # setup callbacks - config = config or {} + config = config or _empty_config() callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( @@ -495,7 +495,7 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: # setup callbacks - config = config or {} + config = config or _empty_config() callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( @@ -1068,7 +1068,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): from langchain.callbacks.manager import CallbackManager # setup callbacks - config = config or {} + config = config or _empty_config() callback_manager = CallbackManager.configure( inheritable_callbacks=config.get("callbacks"), local_callbacks=None, @@ -1091,7 +1091,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): step.invoke, input, # mark each step as a child run - patch_config(config, run_manager.get_child()), + patch_config(deepcopy(config), run_manager.get_child()), ) for step in steps.values() ] @@ -1108,7 +1108,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Dict[str, Any]: # setup callbacks - config = config or {} + config = config or _empty_config() callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py index d0a3fb38d..dce548fc6 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py @@ -1,6 +1,13 @@ import pytest -from langchain.schema.runnable import GetLocalVar, PutLocalVar +from langchain import PromptTemplate +from langchain.llms import FakeListLLM +from langchain.schema.runnable import ( + GetLocalVar, + PutLocalVar, + RunnablePassthrough, + RunnableSequence, +) @pytest.mark.asyncio @@ -29,3 +36,30 @@ def test_get_missing_var_invoke() -> None: with pytest.raises(KeyError): runnable.invoke("foo") + +def test_get_in_map() -> None: + runnable: RunnableSequence = PutLocalVar("input") | {"bar": GetLocalVar("input")} + assert runnable.invoke("foo") == {"bar": "foo"} + + +def test_cant_put_in_map() -> None: + runnable: RunnableSequence = {"bar": PutLocalVar("input")} | GetLocalVar("input") + with pytest.raises(KeyError): + runnable.invoke("foo") + + +def test_get_passthrough_key() -> None: + runnable = PutLocalVar("input") | GetLocalVar("input", passthrough_key="output") + assert runnable.invoke("foo") == {"input": "foo", "output": "foo"} + + +def test_multi_step_sequence() -> None: + prompt = PromptTemplate.from_template("say {foo}") + runnable = ( + PutLocalVar("foo") + | {"foo": RunnablePassthrough()} + | prompt + | FakeListLLM(responses=["bar"]) + | GetLocalVar("foo", passthrough_key="output") + ) + assert runnable.invoke("hello") == {"foo": "hello", "output": "bar"} From 7fe474d19820e5ffd65d30f03446301a644d8a7c Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:02:11 +0100 Subject: [PATCH 013/143] Update snapshots --- .../schema/{ => runnable}/__snapshots__/test_runnable.ambr | 1 + 1 file changed, 1 insertion(+) rename libs/langchain/tests/unit_tests/schema/{ => runnable}/__snapshots__/test_runnable.ambr (99%) diff --git a/libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr similarity index 99% rename from libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr rename to libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index 2d2872c14..4a59ae630 100644 --- a/libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -1331,6 +1331,7 @@ "lc": 1, "type": "not_implemented", "id": [ + "runnable", "test_runnable", "FakeRetriever" ] From c1b1666ec850e465bf93bd01d34e09fc457076cc Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:02:29 +0100 Subject: [PATCH 014/143] Ensure config defaults apply even when a config is passed in --- .../langchain/schema/runnable/base.py | 36 +++++++++---------- .../schema/runnable/test_runnable.py | 18 +++++++--- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index c91456394..0d9df2bae 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -35,8 +35,11 @@ from langchain.schema.runnable.utils import ( from langchain.utils.aiter import atee, py_anext -def _empty_config() -> RunnableConfig: - return RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) +def _ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: + empty = RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) + if config is not None: + empty.update(config) + return empty def _get_callback_manager(config: Mapping) -> Any: @@ -238,10 +241,7 @@ class Runnable(Generic[Input, Output], ABC): return ( config if isinstance(config, list) - else [ - deepcopy(config) if config is not None else _empty_config() - for _ in range(length) - ] + else [deepcopy(_ensure_config(config)) for _ in range(length)] ) def _call_with_config( @@ -253,7 +253,7 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement invoke() in subclasses.""" - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_callback_manager(config) run_manager = callback_manager.on_chain_start( dumpd(self), @@ -283,7 +283,7 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement ainvoke() in subclasses.""" - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_async_callback_manager(config) run_manager = await callback_manager.on_chain_start( dumpd(self), @@ -322,7 +322,7 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_callback_manager(config) run_manager = callback_manager.on_chain_start( dumpd(self), @@ -387,7 +387,7 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_async_callback_manager(config) run_manager = await callback_manager.on_chain_start( dumpd(self), @@ -462,7 +462,7 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( @@ -495,7 +495,7 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( @@ -724,7 +724,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( @@ -753,7 +753,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( @@ -899,7 +899,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Iterator[Output]: # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_callback_manager(config) # start the root run run_manager = callback_manager.on_chain_start( @@ -966,7 +966,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> AsyncIterator[Output]: # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( @@ -1068,7 +1068,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): from langchain.callbacks.manager import CallbackManager # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = CallbackManager.configure( inheritable_callbacks=config.get("callbacks"), local_callbacks=None, @@ -1108,7 +1108,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Dict[str, Any]: # setup callbacks - config = config or _empty_config() + config = _ensure_config(config) callback_manager = _get_async_callback_manager(config) # start the root run run_manager = await callback_manager.on_chain_start( diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index c0cae4d9b..8bfecb182 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -134,8 +134,12 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: assert fake.batch(["hello", "wooorld"], dict(tags=["a-tag"])) == [5, 7] assert spy.call_args_list == [ - mocker.call("hello", dict(tags=["a-tag"])), - mocker.call("wooorld", dict(tags=["a-tag"])), + mocker.call( + "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) + ), + mocker.call( + "wooorld", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) + ), ] spy.reset_mock() @@ -156,8 +160,14 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: 7, ] assert spy.call_args_list == [ - mocker.call("hello", dict(metadata={"key": "value"})), - mocker.call("wooorld", dict(metadata={"key": "value"})), + mocker.call( + "hello", + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + ), + mocker.call( + "wooorld", + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + ), ] From a5e7dcec61cdcaf2c075b5e83117ee3ab14e92c3 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:03:28 +0100 Subject: [PATCH 015/143] Lint --- libs/langchain/tests/unit_tests/schema/runnable/test_locals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py index dce548fc6..8f8755a96 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py @@ -28,7 +28,7 @@ def test_missing_config() -> None: PutLocalVar("input").invoke("foo") with pytest.raises(ValueError): - GetLocalVar("input").invoke("foo") + GetLocalVar[str, str]("input").invoke("foo") def test_get_missing_var_invoke() -> None: From 8ddaaf3d4100ddbc6fc8e7fa9df39d6fc6a67c9a Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:10:35 +0100 Subject: [PATCH 016/143] Move config helpers --- .../langchain/schema/runnable/base.py | 82 +++++++------------ .../langchain/schema/runnable/config.py | 28 ++++++- 2 files changed, 57 insertions(+), 53 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 0d9df2bae..5a1d5b29e 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -28,40 +28,18 @@ from langchain.callbacks.base import BaseCallbackManager from langchain.load.dump import dumpd from langchain.load.serializable import Serializable from langchain.pydantic_v1 import Field -from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable.config import ( + RunnableConfig, + ensure_config, + get_async_callback_manager_for_config, + get_callback_manager_for_config, +) from langchain.schema.runnable.utils import ( gather_with_concurrency, ) from langchain.utils.aiter import atee, py_anext -def _ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: - empty = RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) - if config is not None: - empty.update(config) - return empty - - -def _get_callback_manager(config: Mapping) -> Any: - from langchain.callbacks.manager import CallbackManager - - return CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) - - -def _get_async_callback_manager(config: Mapping) -> Any: - from langchain.callbacks.manager import AsyncCallbackManager - - return AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) - - Input = TypeVar("Input") # Output type should implement __concat__, as eg str, list, dict do Output = TypeVar("Output") @@ -241,7 +219,7 @@ class Runnable(Generic[Input, Output], ABC): return ( config if isinstance(config, list) - else [deepcopy(_ensure_config(config)) for _ in range(length)] + else [deepcopy(ensure_config(config)) for _ in range(length)] ) def _call_with_config( @@ -253,8 +231,8 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement invoke() in subclasses.""" - config = _ensure_config(config) - callback_manager = _get_callback_manager(config) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input}, @@ -283,8 +261,8 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement ainvoke() in subclasses.""" - config = _ensure_config(config) - callback_manager = _get_async_callback_manager(config) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input}, @@ -322,8 +300,8 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = _ensure_config(config) - callback_manager = _get_callback_manager(config) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) run_manager = callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -387,8 +365,8 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = _ensure_config(config) - callback_manager = _get_async_callback_manager(config) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) run_manager = await callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -462,8 +440,8 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: # setup callbacks - config = _ensure_config(config) - callback_manager = _get_callback_manager(config) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) # start the root run run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -495,8 +473,8 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: # setup callbacks - config = _ensure_config(config) - callback_manager = _get_async_callback_manager(config) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -724,8 +702,8 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: # setup callbacks - config = _ensure_config(config) - callback_manager = _get_callback_manager(config) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) # start the root run run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -753,8 +731,8 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Output: # setup callbacks - config = _ensure_config(config) - callback_manager = _get_async_callback_manager(config) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -899,8 +877,8 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Iterator[Output]: # setup callbacks - config = _ensure_config(config) - callback_manager = _get_callback_manager(config) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) # start the root run run_manager = callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -966,8 +944,8 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None ) -> AsyncIterator[Output]: # setup callbacks - config = _ensure_config(config) - callback_manager = _get_async_callback_manager(config) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), input if isinstance(input, dict) else {"input": input} @@ -1068,7 +1046,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): from langchain.callbacks.manager import CallbackManager # setup callbacks - config = _ensure_config(config) + config = ensure_config(config) callback_manager = CallbackManager.configure( inheritable_callbacks=config.get("callbacks"), local_callbacks=None, @@ -1108,8 +1086,8 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): self, input: Input, config: Optional[RunnableConfig] = None ) -> Dict[str, Any]: # setup callbacks - config = _ensure_config(config) - callback_manager = _get_async_callback_manager(config) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start( dumpd(self), {"input": input} diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index f2bf28fcb..cd620077e 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -1,8 +1,9 @@ from __future__ import annotations -from typing import Any, Dict, List, TypedDict +from typing import Any, Dict, List, Optional, TypedDict from langchain.callbacks.base import Callbacks +from langchain.callbacks.manager import CallbackManager, AsyncCallbackManager class RunnableConfig(TypedDict, total=False): @@ -30,3 +31,28 @@ class RunnableConfig(TypedDict, total=False): """ Local variables """ + + +def ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: + empty = RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) + if config is not None: + empty.update(config) + return empty + + +def get_callback_manager_for_config(config: RunnableConfig) -> CallbackManager: + return CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) + + +def get_async_callback_manager_for_config( + config: RunnableConfig, +) -> AsyncCallbackManager: + return AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) From 46f3850794f5fc14477d5545c6d1edd6bbfeca1a Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:25:41 +0100 Subject: [PATCH 017/143] Lint --- .../langchain/schema/runnable/base.py | 1 - .../langchain/schema/runnable/config.py | 2 +- .../langchain/schema/runnable/locals.py | 78 +++++++++---------- 3 files changed, 39 insertions(+), 42 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index c0caa6d9a..1ca853174 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -52,7 +52,6 @@ from langchain.schema.runnable.utils import ( from langchain.utils.aiter import atee, py_anext from langchain.utils.iter import safetee - Input = TypeVar("Input") # Output type should implement __concat__, as eg str, list, dict do Output = TypeVar("Output") diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index cd620077e..716fc3611 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Any, Dict, List, Optional, TypedDict from langchain.callbacks.base import Callbacks -from langchain.callbacks.manager import CallbackManager, AsyncCallbackManager +from langchain.callbacks.manager import AsyncCallbackManager, CallbackManager class RunnableConfig(TypedDict, total=False): diff --git a/libs/langchain/langchain/schema/runnable/locals.py b/libs/langchain/langchain/schema/runnable/locals.py index 5061dbf38..6d668059e 100644 --- a/libs/langchain/langchain/schema/runnable/locals.py +++ b/libs/langchain/langchain/schema/runnable/locals.py @@ -2,6 +2,10 @@ from __future__ import annotations from typing import Any, AsyncIterator, Dict, Iterator, Mapping, Optional, Union +from langchain.callbacks.manager import ( + AsyncCallbackManagerForChainRun, + CallbackManagerForChainRun, +) from langchain.load.serializable import Serializable from langchain.schema.runnable.base import Input, Output, Runnable from langchain.schema.runnable.config import RunnableConfig @@ -20,30 +24,12 @@ class PutLocalVar(RunnablePassthrough): def __init__(self, key: Union[str, Mapping[str, str]], **kwargs: Any) -> None: super().__init__(key=key, **kwargs) - def _put(self, input: Input, *, config: Optional[RunnableConfig] = None) -> None: - if config is None: - raise ValueError( - "PutLocalVar should only be used in a RunnableSequence, and should " - "therefore always receive a non-null config." - ) - if isinstance(self.key, str): - config["_locals"][self.key] = input - elif isinstance(self.key, Mapping): - if not isinstance(input, Mapping): - raise TypeError( - f"Received key of type Mapping but input of type {type(input)}. " - f"input is expected to be of type Mapping when key is Mapping." - ) - for input_key, put_key in self.key.items(): - config["_locals"][put_key] = input[input_key] - else: - raise TypeError( - f"`key` should be a string or Mapping[str, str], received type " - f"{(type(self.key))}." - ) - def _concat_put( - self, input: Input, *, config: Optional[RunnableConfig] = None + self, + input: Input, + *, + config: Optional[RunnableConfig] = None, + replace: bool = False, ) -> None: if config is None: raise ValueError( @@ -51,7 +37,7 @@ class PutLocalVar(RunnablePassthrough): "therefore always receive a non-null config." ) if isinstance(self.key, str): - if self.key not in config["_locals"]: + if self.key not in config["_locals"] or replace: config["_locals"][self.key] = input else: config["_locals"][self.key] += input @@ -62,7 +48,7 @@ class PutLocalVar(RunnablePassthrough): f"input is expected to be of type Mapping when key is Mapping." ) for input_key, put_key in self.key.items(): - if put_key not in config["_locals"]: + if put_key not in config["_locals"] or replace: config["_locals"][put_key] = input[input_key] else: config["_locals"][put_key] += input[input_key] @@ -73,24 +59,30 @@ class PutLocalVar(RunnablePassthrough): ) def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Input: - self._put(input, config=config) + self._concat_put(input, config=config, replace=True) return super().invoke(input, config=config) async def ainvoke( - self, input: Input, config: RunnableConfig | None = None + self, input: Input, config: Optional[RunnableConfig] = None ) -> Input: - self._put(input, config=config) + self._concat_put(input, config=config, replace=True) return await super().ainvoke(input, config=config) def transform( - self, input: Iterator[Input], config: RunnableConfig | None = None + self, + input: Iterator[Input], + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], ) -> Iterator[Input]: for chunk in super().transform(input, config=config): self._concat_put(chunk, config=config) yield chunk async def atransform( - self, input: AsyncIterator[Input], config: RunnableConfig | None = None + self, + input: AsyncIterator[Input], + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], ) -> AsyncIterator[Input]: async for chunk in super().atransform(input, config=config): self._concat_put(chunk, config=config) @@ -113,19 +105,27 @@ class GetLocalVar( def __init__(self, key: str, **kwargs: Any) -> None: super().__init__(key=key, **kwargs) - def _get(self, full_input: Dict) -> Union[Output, Dict[str, Union[Input, Output]]]: + def _get( + self, + input: Input, + run_manager: Union[CallbackManagerForChainRun, Any], + config: RunnableConfig, + ) -> Union[Output, Dict[str, Union[Input, Output]]]: if self.passthrough_key: return { - self.key: full_input["locals"][self.key], - self.passthrough_key: full_input["input"], + self.key: config["_locals"][self.key], + self.passthrough_key: input, } else: - return full_input["locals"][self.key] + return config["_locals"][self.key] async def _aget( - self, full_input: Dict + self, + input: Input, + run_manager: AsyncCallbackManagerForChainRun, + config: RunnableConfig, ) -> Union[Output, Dict[str, Union[Input, Output]]]: - return self._get(full_input) + return self._get(input, run_manager, config) def invoke( self, input: Input, config: Optional[RunnableConfig] = None @@ -136,8 +136,7 @@ class GetLocalVar( "therefore always receive a non-null config." ) - log_input = {"input": input, "locals": config["_locals"]} - return self._call_with_config(self._get, log_input, config) + return self._call_with_config(self._get, input, config) async def ainvoke( self, input: Input, config: Optional[RunnableConfig] = None @@ -148,5 +147,4 @@ class GetLocalVar( "therefore always receive a non-null config." ) - log_input = {"input": input, "locals": config["_locals"]} - return await self._acall_with_config(self._aget, log_input, config) + return await self._acall_with_config(self._aget, input, config) From 1baedc4e1802fc13de49116ba6becd20c0860b71 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:28:39 +0100 Subject: [PATCH 018/143] Move patch_config --- libs/langchain/langchain/schema/runnable/base.py | 14 +------------- libs/langchain/langchain/schema/runnable/config.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 1ca853174..5fec1c86c 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -34,7 +34,6 @@ if TYPE_CHECKING: ) -from langchain.callbacks.base import BaseCallbackManager from langchain.load.dump import dumpd from langchain.load.serializable import Serializable from langchain.pydantic_v1 import Field @@ -43,6 +42,7 @@ from langchain.schema.runnable.config import ( ensure_config, get_async_callback_manager_for_config, get_callback_manager_for_config, + patch_config, ) from langchain.schema.runnable.utils import ( accepts_run_manager, @@ -1472,18 +1472,6 @@ class RunnableBinding(Serializable, Runnable[Input, Output]): yield item -def patch_config( - config: RunnableConfig, - callback_manager: BaseCallbackManager, - _locals: Optional[Dict[str, Any]] = None, -) -> RunnableConfig: - config = config.copy() - config["callbacks"] = callback_manager - if _locals is not None: - config["_locals"] = _locals - return config - - def coerce_to_runnable( thing: Union[ Runnable[Input, Output], diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index 716fc3611..00408b7ee 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -2,7 +2,7 @@ from __future__ import annotations from typing import Any, Dict, List, Optional, TypedDict -from langchain.callbacks.base import Callbacks +from langchain.callbacks.base import BaseCallbackManager, Callbacks from langchain.callbacks.manager import AsyncCallbackManager, CallbackManager @@ -40,6 +40,15 @@ def ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: return empty +def patch_config( + config: RunnableConfig, + callbacks: BaseCallbackManager, +) -> RunnableConfig: + config = config.copy() + config["callbacks"] = callbacks + return config + + def get_callback_manager_for_config(config: RunnableConfig) -> CallbackManager: return CallbackManager.configure( inheritable_callbacks=config.get("callbacks"), From ddcb4ff5fb3f0ccf3871c2c86744fd8daa436435 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:30:42 +0100 Subject: [PATCH 019/143] Li t --- libs/langchain/langchain/smith/evaluation/runner_utils.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libs/langchain/langchain/smith/evaluation/runner_utils.py b/libs/langchain/langchain/smith/evaluation/runner_utils.py index cc3c46dff..64139f95e 100644 --- a/libs/langchain/langchain/smith/evaluation/runner_utils.py +++ b/libs/langchain/langchain/smith/evaluation/runner_utils.py @@ -654,9 +654,7 @@ async def _arun_chain( else: output = await chain.acall(inputs_, callbacks=callbacks, tags=tags) else: - runnable_config = RunnableConfig( - tags=tags or [], callbacks=callbacks, _locals={} - ) + runnable_config = RunnableConfig(tags=tags or [], callbacks=callbacks) output = await chain.ainvoke(inputs_, config=runnable_config) return output @@ -977,9 +975,7 @@ def _run_chain( else: output = chain(inputs_, callbacks=callbacks, tags=tags) else: - runnable_config = RunnableConfig( - tags=tags or [], callbacks=callbacks, _locals={} - ) + runnable_config = RunnableConfig(tags=tags or [], callbacks=callbacks) output = chain.invoke(inputs_, config=runnable_config) return output From 6ae58da668f375d4bd5ae162fe21bf1f140ffc36 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 10:53:10 +0100 Subject: [PATCH 020/143] Assign defaults in batch calls --- libs/langchain/langchain/schema/runnable/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 5fec1c86c..fcba9c4c1 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -235,7 +235,7 @@ class Runnable(Generic[Input, Output], ABC): ) return ( - config + list(map(ensure_config, config)) if isinstance(config, list) else [deepcopy(ensure_config(config)) for _ in range(length)] ) From d3f10d2f4f49c88747836f281a1651e696f11e20 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 11:36:16 +0100 Subject: [PATCH 021/143] Update test --- .../tests/unit_tests/schema/runnable/test_runnable.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 4d02a07df..5d140d2ad 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -127,8 +127,13 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: ["hello", "wooorld"], [dict(tags=["a-tag"]), dict(metadata={"key": "value"})] ) == [5, 7] assert spy.call_args_list == [ - mocker.call("hello", dict(tags=["a-tag"])), - mocker.call("wooorld", dict(metadata={"key": "value"})), + mocker.call( + "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) + ), + mocker.call( + "wooorld", + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + ), ] spy.reset_mock() From 354c42afd20e9cf93ff1a6cd263b4372c5136b22 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 15:30:30 +0100 Subject: [PATCH 022/143] Lint --- libs/langchain/langchain/schema/runnable/locals.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/locals.py b/libs/langchain/langchain/schema/runnable/locals.py index 6d668059e..755a709fc 100644 --- a/libs/langchain/langchain/schema/runnable/locals.py +++ b/libs/langchain/langchain/schema/runnable/locals.py @@ -63,7 +63,10 @@ class PutLocalVar(RunnablePassthrough): return super().invoke(input, config=config) async def ainvoke( - self, input: Input, config: Optional[RunnableConfig] = None + self, + input: Input, + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], ) -> Input: self._concat_put(input, config=config, replace=True) return await super().ainvoke(input, config=config) @@ -139,7 +142,10 @@ class GetLocalVar( return self._call_with_config(self._get, input, config) async def ainvoke( - self, input: Input, config: Optional[RunnableConfig] = None + self, + input: Input, + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], ) -> Union[Output, Dict[str, Union[Input, Output]]]: if config is None: raise ValueError( From 5cd244e9b7217824c01e271e30f81ef9b923d79c Mon Sep 17 00:00:00 2001 From: Taqi Jaffri Date: Sat, 19 Aug 2023 13:48:15 -0700 Subject: [PATCH 023/143] CR feedback --- .../integrations/document_loaders/docugami.ipynb | 12 ++---------- .../langchain/langchain/document_loaders/docugami.py | 1 + 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/docs/extras/integrations/document_loaders/docugami.ipynb b/docs/extras/integrations/document_loaders/docugami.ipynb index d3f94a8d1..607cf2b14 100644 --- a/docs/extras/integrations/document_loaders/docugami.ipynb +++ b/docs/extras/integrations/document_loaders/docugami.ipynb @@ -19,18 +19,10 @@ "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: lxml in /root/Source/github/docugami.langchain/libs/langchain/.venv/lib/python3.9/site-packages (4.9.3)\n" - ] - } - ], + "outputs": [], "source": [ "# You need the lxml package to use the DocugamiLoader\n", - "!poetry run pip install lxml" + "!poetry run pip install lxml --quiet" ] }, { diff --git a/libs/langchain/langchain/document_loaders/docugami.py b/libs/langchain/langchain/document_loaders/docugami.py index af2c95f57..cd05a9612 100644 --- a/libs/langchain/langchain/document_loaders/docugami.py +++ b/libs/langchain/langchain/document_loaders/docugami.py @@ -147,6 +147,7 @@ class DocugamiLoader(BaseLoader, BaseModel): metadata = { XPATH_KEY: _xpath_for_chunk(node), DOCUMENT_ID_KEY: document[DOCUMENT_ID_KEY], + DOCUMENT_NAME_KEY: document[DOCUMENT_NAME_KEY], DOCUMENT_SOURCE_KEY: document[DOCUMENT_NAME_KEY], STRUCTURE_KEY: node.attrib.get("structure", ""), TAG_KEY: re.sub(r"\{.*\}", "", node.tag), From 069c0a041f95d2672b0eb4a707cc8d6e5a883005 Mon Sep 17 00:00:00 2001 From: Taqi Jaffri Date: Sat, 19 Aug 2023 13:50:16 -0700 Subject: [PATCH 024/143] comment update for poetry install --- docs/extras/integrations/document_loaders/docugami.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extras/integrations/document_loaders/docugami.ipynb b/docs/extras/integrations/document_loaders/docugami.ipynb index 607cf2b14..48db3ae81 100644 --- a/docs/extras/integrations/document_loaders/docugami.ipynb +++ b/docs/extras/integrations/document_loaders/docugami.ipynb @@ -21,7 +21,7 @@ }, "outputs": [], "source": [ - "# You need the lxml package to use the DocugamiLoader\n", + "# You need the lxml package to use the DocugamiLoader (run pip install directly without \"poetry run\" if you are not using poetry)\n", "!poetry run pip install lxml --quiet" ] }, From 182b059bf4d6bfbbd3204a83985dbe90e9613285 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Mon, 21 Aug 2023 17:31:38 -0700 Subject: [PATCH 025/143] param --- .../unit_tests/schema/runnable/test_locals.py | 84 +++++++++++-------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py index 8f8755a96..0430c03c8 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py @@ -1,3 +1,5 @@ +from typing import Any, Callable, Type + import pytest from langchain import PromptTemplate @@ -10,30 +12,42 @@ from langchain.schema.runnable import ( ) -@pytest.mark.asyncio -async def test_put_get() -> None: +@pytest.mark.parametrize( + ("method", "input", "output"), + [ + (lambda r, x: r.invoke(x), "foo", "foo"), + (lambda r, x: r.batch(x), ["foo", "bar"], ["foo", "bar"]), + (lambda r, x: list(r.stream(x))[0], "foo", "foo"), + ], +) +def test_put_get(method: Callable, input: Any, output: Any) -> None: runnable = PutLocalVar("input") | GetLocalVar("input") - assert runnable.invoke("foo") == "foo" - assert runnable.batch(["foo", "bar"]) == ["foo", "bar"] - assert list(runnable.stream("foo"))[0] == "foo" - - assert await runnable.ainvoke("foo") == "foo" - assert await runnable.abatch(["foo", "bar"]) == ["foo", "bar"] - async for x in runnable.astream("foo"): - assert x == "foo" + assert method(runnable, input) == output -def test_missing_config() -> None: - with pytest.raises(ValueError): - PutLocalVar("input").invoke("foo") - - with pytest.raises(ValueError): - GetLocalVar[str, str]("input").invoke("foo") +@pytest.mark.asyncio +@pytest.mark.parametrize( + ("method", "input", "output"), + [ + (lambda r, x: r.ainvoke(x), "foo", "foo"), + (lambda r, x: r.abatch(x), ["foo", "bar"], ["foo", "bar"]), + ], +) +async def test_put_get_async(method: Callable, input: Any, output: Any) -> None: + runnable = PutLocalVar("input") | GetLocalVar("input") + assert await method(runnable, input) == output -def test_get_missing_var_invoke() -> None: - runnable = PutLocalVar("input") | GetLocalVar("missing") - with pytest.raises(KeyError): +@pytest.mark.parametrize( + ("runnable", "error"), + [ + (PutLocalVar("input"), ValueError), + (GetLocalVar("input"), ValueError), + (PutLocalVar("input") | GetLocalVar("missing"), KeyError), + ], +) +def test_incorrect_usage(runnable: RunnableSequence, error: Type[Exception]) -> None: + with pytest.raises(error): runnable.invoke("foo") @@ -42,24 +56,24 @@ def test_get_in_map() -> None: assert runnable.invoke("foo") == {"bar": "foo"} -def test_cant_put_in_map() -> None: +def test_put_in_map() -> None: runnable: RunnableSequence = {"bar": PutLocalVar("input")} | GetLocalVar("input") with pytest.raises(KeyError): runnable.invoke("foo") -def test_get_passthrough_key() -> None: - runnable = PutLocalVar("input") | GetLocalVar("input", passthrough_key="output") - assert runnable.invoke("foo") == {"input": "foo", "output": "foo"} - - -def test_multi_step_sequence() -> None: - prompt = PromptTemplate.from_template("say {foo}") - runnable = ( - PutLocalVar("foo") - | {"foo": RunnablePassthrough()} - | prompt - | FakeListLLM(responses=["bar"]) - | GetLocalVar("foo", passthrough_key="output") - ) - assert runnable.invoke("hello") == {"foo": "hello", "output": "bar"} +@pytest.mark.parametrize( + "runnable", + [ + PutLocalVar("input") | GetLocalVar("input", passthrough_key="output"), + ( + PutLocalVar("input") + | {"input": RunnablePassthrough()} + | PromptTemplate.from_template("say {input}") + | FakeListLLM(responses=["hello"]) + | GetLocalVar("input", passthrough_key="output") + ), + ], +) +def test_put_get_sequence(runnable: RunnableSequence) -> None: + assert runnable.invoke("hello") == {"input": "hello", "output": "hello"} From a9bf409a0900730e88d2f1ffd087c818137fe8df Mon Sep 17 00:00:00 2001 From: Bagatur Date: Mon, 21 Aug 2023 17:37:07 -0700 Subject: [PATCH 026/143] param --- .../unit_tests/schema/runnable/test_locals.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py index 0430c03c8..ee07c0cfc 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py @@ -75,5 +75,19 @@ def test_put_in_map() -> None: ), ], ) -def test_put_get_sequence(runnable: RunnableSequence) -> None: - assert runnable.invoke("hello") == {"input": "hello", "output": "hello"} +@pytest.mark.parametrize( + ("method", "input", "output"), + [ + (lambda r, x: r.invoke(x), "hello", {"input": "hello", "output": "hello"}), + (lambda r, x: r.batch(x), ["hello"], [{"input": "hello", "output": "hello"}]), + ( + lambda r, x: list(r.stream(x))[0], + "hello", + {"input": "hello", "output": "hello"}, + ), + ], +) +def test_put_get_sequence( + runnable: RunnableSequence, method: Callable, input: Any, output: Any +) -> None: + assert method(runnable, input) == output From 4e7e6bfe0a7bd15c4ccd72ed33fe1b35b47be3ef Mon Sep 17 00:00:00 2001 From: Bagatur Date: Mon, 21 Aug 2023 18:01:49 -0700 Subject: [PATCH 027/143] revert --- libs/langchain/langchain/chains/base.py | 23 +++++++++++------ libs/langchain/langchain/chat_models/base.py | 20 +++++++++------ libs/langchain/langchain/llms/base.py | 27 ++++++++++++-------- libs/langchain/langchain/schema/retriever.py | 20 +++++++++------ 4 files changed, 56 insertions(+), 34 deletions(-) diff --git a/libs/langchain/langchain/chains/base.py b/libs/langchain/langchain/chains/base.py index 8a49784f7..5a21dc6a6 100644 --- a/libs/langchain/langchain/chains/base.py +++ b/libs/langchain/langchain/chains/base.py @@ -63,10 +63,13 @@ class Chain(Serializable, Runnable[Dict[str, Any], Dict[str, Any]], ABC): **kwargs: Any, ) -> Dict[str, Any]: config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } - return self(input, **config_kwargs, **kwargs) + return self( + input, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + **kwargs, + ) async def ainvoke( self, @@ -79,11 +82,15 @@ class Chain(Serializable, Runnable[Dict[str, Any], Dict[str, Any]], ABC): return await asyncio.get_running_loop().run_in_executor( None, partial(self.invoke, input, config, **kwargs) ) + config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } - return await self.acall(input, **config_kwargs, **kwargs) + return await self.acall( + input, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + **kwargs, + ) memory: Optional[BaseMemory] = None """Optional memory object. Defaults to None. diff --git a/libs/langchain/langchain/chat_models/base.py b/libs/langchain/langchain/chat_models/base.py index d4c582c19..09199e30d 100644 --- a/libs/langchain/langchain/chat_models/base.py +++ b/libs/langchain/langchain/chat_models/base.py @@ -105,15 +105,17 @@ class BaseChatModel(BaseLanguageModel[BaseMessageChunk], ABC): **kwargs: Any, ) -> BaseMessageChunk: config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } return cast( BaseMessageChunk, cast( ChatGeneration, self.generate_prompt( - [self._convert_input(input)], stop=stop, **config_kwargs, **kwargs + [self._convert_input(input)], + stop=stop, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + **kwargs, ).generations[0][0], ).message, ) @@ -133,11 +135,13 @@ class BaseChatModel(BaseLanguageModel[BaseMessageChunk], ABC): ) config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } llm_result = await self.agenerate_prompt( - [self._convert_input(input)], stop=stop, **config_kwargs, **kwargs + [self._convert_input(input)], + stop=stop, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + **kwargs, ) return cast( BaseMessageChunk, cast(ChatGeneration, llm_result.generations[0][0]).message diff --git a/libs/langchain/langchain/llms/base.py b/libs/langchain/langchain/llms/base.py index 401fe61d0..a833487ff 100644 --- a/libs/langchain/langchain/llms/base.py +++ b/libs/langchain/langchain/llms/base.py @@ -220,13 +220,18 @@ class BaseLLM(BaseLanguageModel[str], ABC): **kwargs: Any, ) -> str: config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } - result = self.generate_prompt( - [self._convert_input(input)], stop=stop, **config_kwargs, **kwargs + return ( + self.generate_prompt( + [self._convert_input(input)], + stop=stop, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + **kwargs, + ) + .generations[0][0] + .text ) - return result.generations[0][0].text async def ainvoke( self, @@ -243,11 +248,13 @@ class BaseLLM(BaseLanguageModel[str], ABC): ) config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } llm_result = await self.agenerate_prompt( - [self._convert_input(input)], stop=stop, **config_kwargs, **kwargs + [self._convert_input(input)], + stop=stop, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + **kwargs, ) return llm_result.generations[0][0].text diff --git a/libs/langchain/langchain/schema/retriever.py b/libs/langchain/langchain/schema/retriever.py index 55a1acb08..5da50e149 100644 --- a/libs/langchain/langchain/schema/retriever.py +++ b/libs/langchain/langchain/schema/retriever.py @@ -108,10 +108,12 @@ class BaseRetriever(Serializable, Runnable[str, List[Document]], ABC): self, input: str, config: Optional[RunnableConfig] = None ) -> List[Document]: config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } - return self.get_relevant_documents(input, **config_kwargs) + return self.get_relevant_documents( + input, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + ) async def ainvoke( self, @@ -124,10 +126,12 @@ class BaseRetriever(Serializable, Runnable[str, List[Document]], ABC): return await super().ainvoke(input, config) config = config or {} - config_kwargs: Dict = { - k: config.get(k) for k in ("callbacks", "tags", "metadata") - } - return await self.aget_relevant_documents(input, **config_kwargs) + return await self.aget_relevant_documents( + input, + callbacks=config.get("callbacks"), + tags=config.get("tags"), + metadata=config.get("metadata"), + ) @abstractmethod def _get_relevant_documents( From 033b874701ac7936e807ae34ae68e829c4a67e6b Mon Sep 17 00:00:00 2001 From: Julien Salinas Date: Tue, 22 Aug 2023 09:26:37 +0200 Subject: [PATCH 028/143] Remove some deprecated text generation parameters. --- libs/langchain/langchain/llms/nlpcloud.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/libs/langchain/langchain/llms/nlpcloud.py b/libs/langchain/langchain/llms/nlpcloud.py index 1420595ee..d908e374e 100644 --- a/libs/langchain/langchain/llms/nlpcloud.py +++ b/libs/langchain/langchain/llms/nlpcloud.py @@ -28,8 +28,6 @@ class NLPCloud(LLM): """Language to use (multilingual addon)""" temperature: float = 0.7 """What sampling temperature to use.""" - min_length: int = 1 - """The minimum number of tokens to generate in the completion.""" max_length: int = 256 """The maximum number of tokens to generate in the completion.""" length_no_input: bool = True @@ -46,14 +44,8 @@ class NLPCloud(LLM): """The number of highest probability tokens to keep for top-k filtering.""" repetition_penalty: float = 1.0 """Penalizes repeated tokens. 1.0 means no penalty.""" - length_penalty: float = 1.0 - """Exponential penalty to the length.""" - do_sample: bool = True - """Whether to use sampling (True) or greedy decoding.""" num_beams: int = 1 """Number of beams for beam search.""" - early_stopping: bool = False - """Whether to stop beam search at num_beams sentences.""" num_return_sequences: int = 1 """How many completions to generate for each prompt.""" @@ -91,7 +83,6 @@ class NLPCloud(LLM): """Get the default parameters for calling NLPCloud API.""" return { "temperature": self.temperature, - "min_length": self.min_length, "max_length": self.max_length, "length_no_input": self.length_no_input, "remove_input": self.remove_input, @@ -100,10 +91,7 @@ class NLPCloud(LLM): "top_p": self.top_p, "top_k": self.top_k, "repetition_penalty": self.repetition_penalty, - "length_penalty": self.length_penalty, - "do_sample": self.do_sample, "num_beams": self.num_beams, - "early_stopping": self.early_stopping, "num_return_sequences": self.num_return_sequences, } From 4d0b7bb8e16b51d450da174559171abcdcce0a31 Mon Sep 17 00:00:00 2001 From: Julien Salinas Date: Tue, 22 Aug 2023 09:28:22 +0200 Subject: [PATCH 029/143] Remove Dolphin and GPT-J from the embeddings docs. These models are not proposed anymore. --- .../integrations/text_embedding/nlp_cloud.ipynb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/extras/integrations/text_embedding/nlp_cloud.ipynb b/docs/extras/integrations/text_embedding/nlp_cloud.ipynb index 6cf97d943..73ae71fe0 100644 --- a/docs/extras/integrations/text_embedding/nlp_cloud.ipynb +++ b/docs/extras/integrations/text_embedding/nlp_cloud.ipynb @@ -9,13 +9,9 @@ "\n", "NLP Cloud is an artificial intelligence platform that allows you to use the most advanced AI engines, and even train your own engines with your own data. \n", "\n", - "The [embeddings](https://docs.nlpcloud.com/#embeddings) endpoint offers several models:\n", + "The [embeddings](https://docs.nlpcloud.com/#embeddings) endpoint offers the following model:\n", "\n", - "* `paraphrase-multilingual-mpnet-base-v2`: Paraphrase Multilingual MPNet Base V2 is a very fast model based on Sentence Transformers that is perfectly suited for embeddings extraction in more than 50 languages (see the full list here).\n", - "\n", - "* `gpt-j`: GPT-J returns advanced embeddings. It might return better results than Sentence Transformers based models (see above) but it is also much slower.\n", - "\n", - "* `dolphin`: Dolphin returns advanced embeddings. It might return better results than Sentence Transformers based models (see above) but it is also much slower. It natively understands the following languages: Bulgarian, Catalan, Chinese, Croatian, Czech, Danish, Dutch, English, French, German, Hungarian, Italian, Japanese, Polish, Portuguese, Romanian, Russian, Serbian, Slovenian, Spanish, Swedish, and Ukrainian." + "* `paraphrase-multilingual-mpnet-base-v2`: Paraphrase Multilingual MPNet Base V2 is a very fast model based on Sentence Transformers that is perfectly suited for embeddings extraction in more than 50 languages (see the full list here)." ] }, { @@ -84,7 +80,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3.11.2 64-bit", "language": "python", "name": "python3" }, @@ -98,7 +94,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.11.2" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } } }, "nbformat": 4, From 3c4f32c8b8c8ef6ff35e97d4b5014d4f4d2ea084 Mon Sep 17 00:00:00 2001 From: Aashish Saini <141953346+AashishSainiShorthillsAI@users.noreply.github.com> Date: Tue, 22 Aug 2023 20:04:05 +0530 Subject: [PATCH 030/143] Replacing Exception type from ValueError to ImportError (#9588) I have restructured the code to ensure uniform handling of ImportError. In place of previously used ValueError, I've adopted the standard practice of raising ImportError with explanatory messages. This modification enhances code readability and clarifies that any problems stem from module importation. @eyurtsev , @baskaryan Thanks --- libs/langchain/langchain/vectorstores/meilisearch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/langchain/vectorstores/meilisearch.py b/libs/langchain/langchain/vectorstores/meilisearch.py index cb9f5d984..313ae6816 100644 --- a/libs/langchain/langchain/vectorstores/meilisearch.py +++ b/libs/langchain/langchain/vectorstores/meilisearch.py @@ -21,7 +21,7 @@ def _create_client( try: import meilisearch except ImportError: - raise ValueError( + raise ImportError( "Could not import meilisearch python package. " "Please install it with `pip install meilisearch`." ) From fba29f203adfe35d14a03511c88661ddd1c76263 Mon Sep 17 00:00:00 2001 From: toddkim95 <42592581+toddkim95@users.noreply.github.com> Date: Tue, 22 Aug 2023 23:36:24 +0900 Subject: [PATCH 031/143] Add to support polars (#9610) ### Description Polars is a DataFrame interface on top of an OLAP Query Engine implemented in Rust. Polars is faster to read than pandas, so I'm looking forward to seeing it added to the document loader. ### Dependencies polars (https://pola-rs.github.io/polars-book/user-guide/) --------- Co-authored-by: Bagatur --- .../document_loaders/polars_dataframe.ipynb | 225 ++++++++++++++++++ .../langchain/document_loaders/__init__.py | 2 + .../langchain/document_loaders/dataframe.py | 39 ++- .../document_loaders/polars_dataframe.py | 32 +++ .../langchain/document_loaders/xorbits.py | 22 +- .../document_loaders/test_polars_dataframe.py | 48 ++++ 6 files changed, 339 insertions(+), 29 deletions(-) create mode 100644 docs/extras/integrations/document_loaders/polars_dataframe.ipynb create mode 100644 libs/langchain/langchain/document_loaders/polars_dataframe.py create mode 100644 libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py diff --git a/docs/extras/integrations/document_loaders/polars_dataframe.ipynb b/docs/extras/integrations/document_loaders/polars_dataframe.ipynb new file mode 100644 index 000000000..52936f165 --- /dev/null +++ b/docs/extras/integrations/document_loaders/polars_dataframe.ipynb @@ -0,0 +1,225 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "213a38a2", + "metadata": {}, + "source": [ + "# Polars DataFrame\n", + "\n", + "This notebook goes over how to load data from a [polars](https://pola-rs.github.io/polars-book/user-guide/) DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f6a7a9e4-80d6-486a-b2e3-636c568aa97c", + "metadata": {}, + "outputs": [], + "source": [ + "#!pip install polars" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79331964", + "metadata": {}, + "outputs": [], + "source": [ + "import polars as pl" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e487044c", + "metadata": {}, + "outputs": [], + "source": [ + "df = pl.read_csv(\"example_data/mlb_teams_2012.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ac273ca1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "shape: (5, 3)
Team "Payroll (millions)" "Wins"
strf64i64
"Nationals"81.3498
"Reds"82.297
"Yankees"197.9695
"Giants"117.6294
"Braves"83.3194
" + ], + "text/plain": [ + "shape: (5, 3)\n", + "┌───────────┬───────────────────────┬─────────┐\n", + "│ Team ┆ \"Payroll (millions)\" ┆ \"Wins\" │\n", + "│ --- ┆ --- ┆ --- │\n", + "│ str ┆ f64 ┆ i64 │\n", + "╞═══════════╪═══════════════════════╪═════════╡\n", + "│ Nationals ┆ 81.34 ┆ 98 │\n", + "│ Reds ┆ 82.2 ┆ 97 │\n", + "│ Yankees ┆ 197.96 ┆ 95 │\n", + "│ Giants ┆ 117.62 ┆ 94 │\n", + "│ Braves ┆ 83.31 ┆ 94 │\n", + "└───────────┴───────────────────────┴─────────┘" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "66e47a13", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders import PolarsDataFrameLoader" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2334caca", + "metadata": {}, + "outputs": [], + "source": [ + "loader = PolarsDataFrameLoader(df, page_content_column=\"Team\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d616c2b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='Nationals', metadata={' \"Payroll (millions)\"': 81.34, ' \"Wins\"': 98}),\n", + " Document(page_content='Reds', metadata={' \"Payroll (millions)\"': 82.2, ' \"Wins\"': 97}),\n", + " Document(page_content='Yankees', metadata={' \"Payroll (millions)\"': 197.96, ' \"Wins\"': 95}),\n", + " Document(page_content='Giants', metadata={' \"Payroll (millions)\"': 117.62, ' \"Wins\"': 94}),\n", + " Document(page_content='Braves', metadata={' \"Payroll (millions)\"': 83.31, ' \"Wins\"': 94}),\n", + " Document(page_content='Athletics', metadata={' \"Payroll (millions)\"': 55.37, ' \"Wins\"': 94}),\n", + " Document(page_content='Rangers', metadata={' \"Payroll (millions)\"': 120.51, ' \"Wins\"': 93}),\n", + " Document(page_content='Orioles', metadata={' \"Payroll (millions)\"': 81.43, ' \"Wins\"': 93}),\n", + " Document(page_content='Rays', metadata={' \"Payroll (millions)\"': 64.17, ' \"Wins\"': 90}),\n", + " Document(page_content='Angels', metadata={' \"Payroll (millions)\"': 154.49, ' \"Wins\"': 89}),\n", + " Document(page_content='Tigers', metadata={' \"Payroll (millions)\"': 132.3, ' \"Wins\"': 88}),\n", + " Document(page_content='Cardinals', metadata={' \"Payroll (millions)\"': 110.3, ' \"Wins\"': 88}),\n", + " Document(page_content='Dodgers', metadata={' \"Payroll (millions)\"': 95.14, ' \"Wins\"': 86}),\n", + " Document(page_content='White Sox', metadata={' \"Payroll (millions)\"': 96.92, ' \"Wins\"': 85}),\n", + " Document(page_content='Brewers', metadata={' \"Payroll (millions)\"': 97.65, ' \"Wins\"': 83}),\n", + " Document(page_content='Phillies', metadata={' \"Payroll (millions)\"': 174.54, ' \"Wins\"': 81}),\n", + " Document(page_content='Diamondbacks', metadata={' \"Payroll (millions)\"': 74.28, ' \"Wins\"': 81}),\n", + " Document(page_content='Pirates', metadata={' \"Payroll (millions)\"': 63.43, ' \"Wins\"': 79}),\n", + " Document(page_content='Padres', metadata={' \"Payroll (millions)\"': 55.24, ' \"Wins\"': 76}),\n", + " Document(page_content='Mariners', metadata={' \"Payroll (millions)\"': 81.97, ' \"Wins\"': 75}),\n", + " Document(page_content='Mets', metadata={' \"Payroll (millions)\"': 93.35, ' \"Wins\"': 74}),\n", + " Document(page_content='Blue Jays', metadata={' \"Payroll (millions)\"': 75.48, ' \"Wins\"': 73}),\n", + " Document(page_content='Royals', metadata={' \"Payroll (millions)\"': 60.91, ' \"Wins\"': 72}),\n", + " Document(page_content='Marlins', metadata={' \"Payroll (millions)\"': 118.07, ' \"Wins\"': 69}),\n", + " Document(page_content='Red Sox', metadata={' \"Payroll (millions)\"': 173.18, ' \"Wins\"': 69}),\n", + " Document(page_content='Indians', metadata={' \"Payroll (millions)\"': 78.43, ' \"Wins\"': 68}),\n", + " Document(page_content='Twins', metadata={' \"Payroll (millions)\"': 94.08, ' \"Wins\"': 66}),\n", + " Document(page_content='Rockies', metadata={' \"Payroll (millions)\"': 78.06, ' \"Wins\"': 64}),\n", + " Document(page_content='Cubs', metadata={' \"Payroll (millions)\"': 88.19, ' \"Wins\"': 61}),\n", + " Document(page_content='Astros', metadata={' \"Payroll (millions)\"': 60.65, ' \"Wins\"': 55})]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loader.load()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "beb55c2f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "page_content='Nationals' metadata={' \"Payroll (millions)\"': 81.34, ' \"Wins\"': 98}\n", + "page_content='Reds' metadata={' \"Payroll (millions)\"': 82.2, ' \"Wins\"': 97}\n", + "page_content='Yankees' metadata={' \"Payroll (millions)\"': 197.96, ' \"Wins\"': 95}\n", + "page_content='Giants' metadata={' \"Payroll (millions)\"': 117.62, ' \"Wins\"': 94}\n", + "page_content='Braves' metadata={' \"Payroll (millions)\"': 83.31, ' \"Wins\"': 94}\n", + "page_content='Athletics' metadata={' \"Payroll (millions)\"': 55.37, ' \"Wins\"': 94}\n", + "page_content='Rangers' metadata={' \"Payroll (millions)\"': 120.51, ' \"Wins\"': 93}\n", + "page_content='Orioles' metadata={' \"Payroll (millions)\"': 81.43, ' \"Wins\"': 93}\n", + "page_content='Rays' metadata={' \"Payroll (millions)\"': 64.17, ' \"Wins\"': 90}\n", + "page_content='Angels' metadata={' \"Payroll (millions)\"': 154.49, ' \"Wins\"': 89}\n", + "page_content='Tigers' metadata={' \"Payroll (millions)\"': 132.3, ' \"Wins\"': 88}\n", + "page_content='Cardinals' metadata={' \"Payroll (millions)\"': 110.3, ' \"Wins\"': 88}\n", + "page_content='Dodgers' metadata={' \"Payroll (millions)\"': 95.14, ' \"Wins\"': 86}\n", + "page_content='White Sox' metadata={' \"Payroll (millions)\"': 96.92, ' \"Wins\"': 85}\n", + "page_content='Brewers' metadata={' \"Payroll (millions)\"': 97.65, ' \"Wins\"': 83}\n", + "page_content='Phillies' metadata={' \"Payroll (millions)\"': 174.54, ' \"Wins\"': 81}\n", + "page_content='Diamondbacks' metadata={' \"Payroll (millions)\"': 74.28, ' \"Wins\"': 81}\n", + "page_content='Pirates' metadata={' \"Payroll (millions)\"': 63.43, ' \"Wins\"': 79}\n", + "page_content='Padres' metadata={' \"Payroll (millions)\"': 55.24, ' \"Wins\"': 76}\n", + "page_content='Mariners' metadata={' \"Payroll (millions)\"': 81.97, ' \"Wins\"': 75}\n", + "page_content='Mets' metadata={' \"Payroll (millions)\"': 93.35, ' \"Wins\"': 74}\n", + "page_content='Blue Jays' metadata={' \"Payroll (millions)\"': 75.48, ' \"Wins\"': 73}\n", + "page_content='Royals' metadata={' \"Payroll (millions)\"': 60.91, ' \"Wins\"': 72}\n", + "page_content='Marlins' metadata={' \"Payroll (millions)\"': 118.07, ' \"Wins\"': 69}\n", + "page_content='Red Sox' metadata={' \"Payroll (millions)\"': 173.18, ' \"Wins\"': 69}\n", + "page_content='Indians' metadata={' \"Payroll (millions)\"': 78.43, ' \"Wins\"': 68}\n", + "page_content='Twins' metadata={' \"Payroll (millions)\"': 94.08, ' \"Wins\"': 66}\n", + "page_content='Rockies' metadata={' \"Payroll (millions)\"': 78.06, ' \"Wins\"': 64}\n", + "page_content='Cubs' metadata={' \"Payroll (millions)\"': 88.19, ' \"Wins\"': 61}\n", + "page_content='Astros' metadata={' \"Payroll (millions)\"': 60.65, ' \"Wins\"': 55}\n" + ] + } + ], + "source": [ + "# Use lazy load for larger table, which won't read the full table into memory\n", + "for i in loader.lazy_load():\n", + " print(i)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/langchain/langchain/document_loaders/__init__.py b/libs/langchain/langchain/document_loaders/__init__.py index 195b586ac..30f69659c 100644 --- a/libs/langchain/langchain/document_loaders/__init__.py +++ b/libs/langchain/langchain/document_loaders/__init__.py @@ -132,6 +132,7 @@ from langchain.document_loaders.pdf import ( PyPDFLoader, UnstructuredPDFLoader, ) +from langchain.document_loaders.polars_dataframe import PolarsDataFrameLoader from langchain.document_loaders.powerpoint import UnstructuredPowerPointLoader from langchain.document_loaders.psychic import PsychicLoader from langchain.document_loaders.pubmed import PubMedLoader @@ -299,6 +300,7 @@ __all__ = [ "PDFPlumberLoader", "PagedPDFSplitter", "PlaywrightURLLoader", + "PolarsDataFrameLoader", "PsychicLoader", "PubMedLoader", "PyMuPDFLoader", diff --git a/libs/langchain/langchain/document_loaders/dataframe.py b/libs/langchain/langchain/document_loaders/dataframe.py index 0476f6a29..261426a3c 100644 --- a/libs/langchain/langchain/document_loaders/dataframe.py +++ b/libs/langchain/langchain/document_loaders/dataframe.py @@ -4,23 +4,15 @@ from langchain.docstore.document import Document from langchain.document_loaders.base import BaseLoader -class DataFrameLoader(BaseLoader): - """Load `Pandas` DataFrame.""" - - def __init__(self, data_frame: Any, page_content_column: str = "text"): +class BaseDataFrameLoader(BaseLoader): + def __init__(self, data_frame: Any, *, page_content_column: str = "text"): """Initialize with dataframe object. Args: - data_frame: Pandas DataFrame object. + data_frame: DataFrame object. page_content_column: Name of the column containing the page content. Defaults to "text". """ - import pandas as pd - - if not isinstance(data_frame, pd.DataFrame): - raise ValueError( - f"Expected data_frame to be a pd.DataFrame, got {type(data_frame)}" - ) self.data_frame = data_frame self.page_content_column = page_content_column @@ -36,3 +28,28 @@ class DataFrameLoader(BaseLoader): def load(self) -> List[Document]: """Load full dataframe.""" return list(self.lazy_load()) + + +class DataFrameLoader(BaseDataFrameLoader): + """Load `Pandas` DataFrame.""" + + def __init__(self, data_frame: Any, page_content_column: str = "text"): + """Initialize with dataframe object. + + Args: + data_frame: Pandas DataFrame object. + page_content_column: Name of the column containing the page content. + Defaults to "text". + """ + try: + import pandas as pd + except ImportError as e: + raise ImportError( + "Unable to import pandas, please install with `pip install pandas`." + ) from e + + if not isinstance(data_frame, pd.DataFrame): + raise ValueError( + f"Expected data_frame to be a pd.DataFrame, got {type(data_frame)}" + ) + super().__init__(data_frame, page_content_column=page_content_column) diff --git a/libs/langchain/langchain/document_loaders/polars_dataframe.py b/libs/langchain/langchain/document_loaders/polars_dataframe.py new file mode 100644 index 000000000..6ece942df --- /dev/null +++ b/libs/langchain/langchain/document_loaders/polars_dataframe.py @@ -0,0 +1,32 @@ +from typing import Any, Iterator + +from langchain.docstore.document import Document +from langchain.document_loaders.dataframe import BaseDataFrameLoader + + +class PolarsDataFrameLoader(BaseDataFrameLoader): + """Load `Polars` DataFrame.""" + + def __init__(self, data_frame: Any, *, page_content_column: str = "text"): + """Initialize with dataframe object. + + Args: + data_frame: Polars DataFrame object. + page_content_column: Name of the column containing the page content. + Defaults to "text". + """ + import polars as pl + + if not isinstance(data_frame, pl.DataFrame): + raise ValueError( + f"Expected data_frame to be a pl.DataFrame, got {type(data_frame)}" + ) + super().__init__(data_frame, page_content_column=page_content_column) + + def lazy_load(self) -> Iterator[Document]: + """Lazy load records from dataframe.""" + + for row in self.data_frame.iter_rows(named=True): + text = row[self.page_content_column] + row.pop(self.page_content_column) + yield Document(page_content=text, metadata=row) diff --git a/libs/langchain/langchain/document_loaders/xorbits.py b/libs/langchain/langchain/document_loaders/xorbits.py index bcc4e680f..723e9dc1b 100644 --- a/libs/langchain/langchain/document_loaders/xorbits.py +++ b/libs/langchain/langchain/document_loaders/xorbits.py @@ -1,10 +1,9 @@ -from typing import Any, Iterator, List +from typing import Any -from langchain.docstore.document import Document -from langchain.document_loaders.base import BaseLoader +from langchain.document_loaders.dataframe import BaseDataFrameLoader -class XorbitsLoader(BaseLoader): +class XorbitsLoader(BaseDataFrameLoader): """Load `Xorbits` DataFrame.""" def __init__(self, data_frame: Any, page_content_column: str = "text"): @@ -30,17 +29,4 @@ class XorbitsLoader(BaseLoader): f"Expected data_frame to be a xorbits.pandas.DataFrame, \ got {type(data_frame)}" ) - self.data_frame = data_frame - self.page_content_column = page_content_column - - def lazy_load(self) -> Iterator[Document]: - """Lazy load records from dataframe.""" - for _, row in self.data_frame.iterrows(): - text = row[self.page_content_column] - metadata = row.to_dict() - metadata.pop(self.page_content_column) - yield Document(page_content=text, metadata=metadata) - - def load(self) -> List[Document]: - """Load full dataframe.""" - return list(self.lazy_load()) + super().__init__(data_frame, page_content_column=page_content_column) diff --git a/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py b/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py new file mode 100644 index 000000000..bd8e129da --- /dev/null +++ b/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py @@ -0,0 +1,48 @@ +import polars as pl +import pytest + +from langchain.document_loaders import PolarsDataFrameLoader +from langchain.schema import Document + + +@pytest.fixture +def sample_data_frame() -> pl.DataFrame: + data = { + "text": ["Hello", "World"], + "author": ["Alice", "Bob"], + "date": ["2022-01-01", "2022-01-02"], + } + return pl.DataFrame(data) + + +def test_load_returns_list_of_documents(sample_data_frame: pl.DataFrame) -> None: + loader = PolarsDataFrameLoader(sample_data_frame) + docs = loader.load() + assert isinstance(docs, list) + assert all(isinstance(doc, Document) for doc in docs) + assert len(docs) == 2 + + +def test_load_converts_dataframe_columns_to_document_metadata( + sample_data_frame: pl.DataFrame, +) -> None: + loader = PolarsDataFrameLoader(sample_data_frame) + docs = loader.load() + + for i, doc in enumerate(docs): + df: pl.DataFrame = sample_data_frame[i] + assert df is not None + assert doc.metadata["author"] == df.select("author").item() + assert doc.metadata["date"] == df.select("date").item() + + +def test_load_uses_page_content_column_to_create_document_text( + sample_data_frame: pl.DataFrame, +) -> None: + sample_data_frame = sample_data_frame.rename(mapping={"text": "dummy_test_column"}) + loader = PolarsDataFrameLoader( + sample_data_frame, page_content_column="dummy_test_column" + ) + docs = loader.load() + assert docs[0].page_content == "Hello" + assert docs[1].page_content == "World" From d4c49b16e4aead34c16f9919be0000cdc775ca3a Mon Sep 17 00:00:00 2001 From: Philippe PRADOS Date: Tue, 22 Aug 2023 16:36:36 +0200 Subject: [PATCH 032/143] Fix ChatMessageHistory (#9594) The initialization of the array of ChatMessageHistory is buggy. The list is shared with all instances. --- .../langchain/memory/chat_message_histories/in_memory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/memory/chat_message_histories/in_memory.py b/libs/langchain/langchain/memory/chat_message_histories/in_memory.py index d8db3f424..53fbbb201 100644 --- a/libs/langchain/langchain/memory/chat_message_histories/in_memory.py +++ b/libs/langchain/langchain/memory/chat_message_histories/in_memory.py @@ -1,6 +1,6 @@ from typing import List -from langchain.pydantic_v1 import BaseModel +from langchain.pydantic_v1 import BaseModel, Field from langchain.schema import ( BaseChatMessageHistory, ) @@ -13,7 +13,7 @@ class ChatMessageHistory(BaseChatMessageHistory, BaseModel): Stores messages in an in memory list. """ - messages: List[BaseMessage] = [] + messages: List[BaseMessage] = Field(default_factory=list) def add_message(self, message: BaseMessage) -> None: """Add a self-created message to the store""" From 1ea2f9adf470185e62de4079a3e6f240147af539 Mon Sep 17 00:00:00 2001 From: Vanessa Arndorfer Date: Tue, 22 Aug 2023 07:36:47 -0700 Subject: [PATCH 033/143] Document AzureML Deployment Example (#9571) Description: Link an example of deploying a Langchain app to an AzureML online endpoint to the deployments documentation page. Co-authored-by: Vanessa Arndorfer --- docs/extras/guides/deployments/template_repos.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/extras/guides/deployments/template_repos.mdx b/docs/extras/guides/deployments/template_repos.mdx index ec8d03237..45c4a43de 100644 --- a/docs/extras/guides/deployments/template_repos.mdx +++ b/docs/extras/guides/deployments/template_repos.mdx @@ -79,3 +79,7 @@ See OpenLLM's [integration doc](https://github.com/bentoml/OpenLLM#%EF%B8%8F-int ## [Databutton](https://databutton.com/home?new-data-app=true) These templates serve as examples of how to build, deploy, and share LangChain applications using Databutton. You can create user interfaces with Streamlit, automate tasks by scheduling Python code, and store files and data in the built-in store. Examples include a Chatbot interface with conversational memory, a Personal search engine, and a starter template for LangChain apps. Deploying and sharing is just one click away. + +## [AzureML Online Endpoint](https://github.com/Azure/azureml-examples/blob/main/sdk/python/endpoints/online/llm/langchain/1_langchain_basic_deploy.ipynb) + +A minimal example of how to deploy LangChain to an Azure Machine Learning Online Endpoint. \ No newline at end of file From dfb9ff10799cbb6f3e1831f11b46851f16089c56 Mon Sep 17 00:00:00 2001 From: Anthony Mahanna <43019056+aMahanna@users.noreply.github.com> Date: Tue, 22 Aug 2023 10:41:06 -0400 Subject: [PATCH 034/143] bugfix: ArangoDB Empty Schema Case (#9574) - Introduces a conditional in `ArangoGraph.generate_schema()` to exclude empty ArangoDB Collections from the schema - Add empty collection test case Issue: N/A Dependencies: None --- libs/langchain/langchain/graphs/arangodb_graph.py | 4 ++++ .../chains/test_graph_database_arangodb.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/libs/langchain/langchain/graphs/arangodb_graph.py b/libs/langchain/langchain/graphs/arangodb_graph.py index 69b78dea3..aedcd9560 100644 --- a/libs/langchain/langchain/graphs/arangodb_graph.py +++ b/libs/langchain/langchain/graphs/arangodb_graph.py @@ -66,6 +66,10 @@ class ArangoGraph: col_type: str = collection["type"] col_size: int = self.db.collection(col_name).count() + # Skip collection if empty + if col_size == 0: + continue + # Set number of ArangoDB documents/edges to retrieve limit_amount = ceil(sample_ratio * col_size) or 1 diff --git a/libs/langchain/tests/integration_tests/chains/test_graph_database_arangodb.py b/libs/langchain/tests/integration_tests/chains/test_graph_database_arangodb.py index 32494beb0..d6ce50756 100644 --- a/libs/langchain/tests/integration_tests/chains/test_graph_database_arangodb.py +++ b/libs/langchain/tests/integration_tests/chains/test_graph_database_arangodb.py @@ -55,6 +55,21 @@ def test_connect_arangodb() -> None: assert ["hello_world"] == sample_aql_result +def test_empty_schema_on_no_data() -> None: + """Test that the schema is empty for an empty ArangoDB Database""" + db = get_arangodb_client() + db.delete_graph("GameOfThrones", drop_collections=True, ignore_missing=True) + db.delete_collection("empty_collection", ignore_missing=True) + db.create_collection("empty_collection") + + graph = ArangoGraph(db) + + assert graph.schema == { + "Graph Schema": [], + "Collection Schema": [], + } + + def test_aql_generation() -> None: """Test that AQL statement is correctly generated and executed.""" db = get_arangodb_client() From 1720e99397af8989fbb035511e8499b6dd045001 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Tue, 22 Aug 2023 07:43:21 -0700 Subject: [PATCH 035/143] add variables for field names (#9563) --- libs/langchain/langchain/vectorstores/milvus.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libs/langchain/langchain/vectorstores/milvus.py b/libs/langchain/langchain/vectorstores/milvus.py index 05ce1b085..c6a5301ff 100644 --- a/libs/langchain/langchain/vectorstores/milvus.py +++ b/libs/langchain/langchain/vectorstores/milvus.py @@ -52,6 +52,9 @@ class Milvus(VectorStore): default of index. drop_old (Optional[bool]): Whether to drop the current collection. Defaults to False. + primary_field (str): Name of the primary key field. Defaults to "pk". + text_field (str): Name of the text field. Defaults to "text". + vector_field (str): Name of the vector field. Defaults to "vector". The connection args used for this class comes in the form of a dict, here are a few of the options: @@ -107,6 +110,10 @@ class Milvus(VectorStore): index_params: Optional[dict] = None, search_params: Optional[dict] = None, drop_old: Optional[bool] = False, + *, + primary_field: str = "pk", + text_field: str = "text", + vector_field: str = "vector", ): """Initialize the Milvus vector store.""" try: @@ -138,11 +145,11 @@ class Milvus(VectorStore): self.consistency_level = consistency_level # In order for a collection to be compatible, pk needs to be auto'id and int - self._primary_field = "pk" - # In order for compatiblility, the text field will need to be called "text" - self._text_field = "text" + self._primary_field = primary_field + # In order for compatibility, the text field will need to be called "text" + self._text_field = text_field # In order for compatibility, the vector field needs to be called "vector" - self._vector_field = "vector" + self._vector_field = vector_field self.fields: list[str] = [] # Create the connection to the server if connection_args is None: From e99ef12cb1e801e2834244505986ce3fa8dfda33 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Tue, 22 Aug 2023 07:44:00 -0700 Subject: [PATCH 036/143] Bagatur/litellm model name (#9613) Co-authored-by: ishaan-jaff --- .../langchain/chat_models/litellm.py | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/libs/langchain/langchain/chat_models/litellm.py b/libs/langchain/langchain/chat_models/litellm.py index d23549dc5..f429c3221 100644 --- a/libs/langchain/langchain/chat_models/litellm.py +++ b/libs/langchain/langchain/chat_models/litellm.py @@ -190,9 +190,6 @@ def _convert_message_to_dict(message: BaseMessage) -> dict: class ChatLiteLLM(BaseChatModel): """`LiteLLM` Chat models API. - To use you must have the google.generativeai Python package installed and - either: - 1. The ``GOOGLE_API_KEY``` environment variable set with your API key, or 2. Pass your API key using the google_api_key kwarg to the ChatGoogle constructor. @@ -206,7 +203,8 @@ class ChatLiteLLM(BaseChatModel): """ client: Any #: :meta private: - model_name: str = "gpt-3.5-turbo" + model: str = "gpt-3.5-turbo" + model_name: Optional[str] = None """Model name to use.""" openai_api_key: Optional[str] = None azure_api_key: Optional[str] = None @@ -217,8 +215,9 @@ class ChatLiteLLM(BaseChatModel): streaming: bool = False api_base: Optional[str] = None organization: Optional[str] = None + custom_llm_provider: Optional[str] = None request_timeout: Optional[Union[float, Tuple[float, float]]] = None - temperature: Optional[float] = None + temperature: Optional[float] = 1 model_kwargs: Dict[str, Any] = Field(default_factory=dict) """Run inference with this temperature. Must by in the closed interval [0.0, 1.0].""" @@ -238,8 +237,11 @@ class ChatLiteLLM(BaseChatModel): @property def _default_params(self) -> Dict[str, Any]: """Get the default parameters for calling OpenAI API.""" + set_model_value = self.model + if self.model_name is not None: + set_model_value = self.model_name return { - "model": self.model_name, + "model": set_model_value, "force_timeout": self.request_timeout, "max_tokens": self.max_tokens, "stream": self.streaming, @@ -251,10 +253,13 @@ class ChatLiteLLM(BaseChatModel): @property def _client_params(self) -> Dict[str, Any]: """Get the parameters used for the openai client.""" + set_model_value = self.model + if self.model_name is not None: + set_model_value = self.model_name self.client.api_base = self.api_base self.client.organization = self.organization creds: Dict[str, Any] = { - "model": self.model_name, + "model": set_model_value, "force_timeout": self.request_timeout, } return {**self._default_params, **creds} @@ -347,7 +352,10 @@ class ChatLiteLLM(BaseChatModel): ) generations.append(gen) token_usage = response.get("usage", {}) - llm_output = {"token_usage": token_usage, "model_name": self.model_name} + set_model_value = self.model + if self.model_name is not None: + set_model_value = self.model_name + llm_output = {"token_usage": token_usage, "model": set_model_value} return ChatResult(generations=generations, llm_output=llm_output) def _create_message_dicts( @@ -437,8 +445,11 @@ class ChatLiteLLM(BaseChatModel): @property def _identifying_params(self) -> Dict[str, Any]: """Get the identifying parameters.""" + set_model_value = self.model + if self.model_name is not None: + set_model_value = self.model_name return { - "model_name": self.model_name, + "model": set_model_value, "temperature": self.temperature, "top_p": self.top_p, "top_k": self.top_k, From b868ef23bc339bdd541b5dbc801f32987cdbf90d Mon Sep 17 00:00:00 2001 From: klae01 <101966044+klae01@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:03:33 +0900 Subject: [PATCH 037/143] Add AINetwork blockchain toolkit integration (#9527) # Description This PR introduces a new toolkit for interacting with the AINetwork blockchain. The toolkit provides a set of tools for performing various operations on the AINetwork blockchain, such as transferring AIN, reading and writing values to the blockchain database, managing apps, setting rules and owners. # Dependencies [ain-py](https://github.com/ainblockchain/ain-py) >= 1.0.2 # Misc The example notebook (langchain/docs/extras/integrations/toolkits/ainetwork.ipynb) is in the PR --------- Co-authored-by: kriii Co-authored-by: Bagatur --- .../integrations/toolkits/ainetwork.ipynb | 461 ++++++++++++++++++ .../agents/agent_toolkits/__init__.py | 2 + .../agent_toolkits/ainetwork/__init__.py | 1 + .../agent_toolkits/ainetwork/toolkit.py | 45 ++ libs/langchain/langchain/tools/__init__.py | 10 + .../langchain/tools/ainetwork/app.py | 95 ++++ .../langchain/tools/ainetwork/base.py | 71 +++ .../langchain/tools/ainetwork/owner.py | 110 +++++ .../langchain/tools/ainetwork/rule.py | 77 +++ .../langchain/tools/ainetwork/transfer.py | 29 ++ .../langchain/tools/ainetwork/utils.py | 62 +++ .../langchain/tools/ainetwork/value.py | 80 +++ .../agent/test_ainetwork_agent.py | 175 +++++++ .../tests/unit_tests/tools/test_public_api.py | 5 + 14 files changed, 1223 insertions(+) create mode 100644 docs/extras/integrations/toolkits/ainetwork.ipynb create mode 100644 libs/langchain/langchain/agents/agent_toolkits/ainetwork/__init__.py create mode 100644 libs/langchain/langchain/agents/agent_toolkits/ainetwork/toolkit.py create mode 100644 libs/langchain/langchain/tools/ainetwork/app.py create mode 100644 libs/langchain/langchain/tools/ainetwork/base.py create mode 100644 libs/langchain/langchain/tools/ainetwork/owner.py create mode 100644 libs/langchain/langchain/tools/ainetwork/rule.py create mode 100644 libs/langchain/langchain/tools/ainetwork/transfer.py create mode 100644 libs/langchain/langchain/tools/ainetwork/utils.py create mode 100644 libs/langchain/langchain/tools/ainetwork/value.py create mode 100644 libs/langchain/tests/integration_tests/agent/test_ainetwork_agent.py diff --git a/docs/extras/integrations/toolkits/ainetwork.ipynb b/docs/extras/integrations/toolkits/ainetwork.ipynb new file mode 100644 index 000000000..b3a84afd0 --- /dev/null +++ b/docs/extras/integrations/toolkits/ainetwork.ipynb @@ -0,0 +1,461 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AINetwork Toolkit\n", + "\n", + "The AINetwork Toolkit is a set of tools for interacting with the AINetwork Blockchain. These tools allow you to transfer AIN, read and write values, create apps, and set permissions for specific paths within the blockchain database." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Installing dependencies\n", + "\n", + "Before using the AINetwork Toolkit, you need to install the ain-py package. You can install it with pip:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install ain-py" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Set environmental variables\n", + "\n", + "You need to set the `AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY` environmental variable to your AIN Blockchain Account Private Key." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY\"] = \"\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get AIN Blockchain private key" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "address: 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac\n", + "private_key: f5e2f359bb6b7836a2ac70815473d1a290c517f847d096f5effe818de8c2cf14\n", + "\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "from ain.account import Account\n", + "\n", + "if os.environ.get(\"AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY\", None):\n", + " account = Account(os.environ[\"AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY\"])\n", + "else:\n", + " account = Account.create()\n", + " os.environ[\"AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY\"] = account.private_key\n", + " print(\n", + " f\"\"\"\n", + "address: {account.address}\n", + "private_key: {account.private_key}\n", + "\"\"\"\n", + " )\n", + "# IMPORTANT: If you plan to use this account in the future, make sure to save the\n", + "# private key in a secure place. Losing access to your private key means losing\n", + "# access to your account." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize the AINetwork Toolkit\n", + "\n", + "You can initialize the AINetwork Toolkit like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.agents.agent_toolkits.ainetwork.toolkit import AINetworkToolkit\n", + "\n", + "toolkit = AINetworkToolkit()\n", + "tools = toolkit.get_tools()\n", + "address = tools[0].interface.wallet.defaultAccount.address" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize the Agent with the AINetwork Toolkit\n", + "\n", + "You can initialize the agent with the AINetwork Toolkit like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "from langchain.agents import initialize_agent, AgentType\n", + "\n", + "llm = ChatOpenAI(temperature=0)\n", + "agent = initialize_agent(\n", + " tools=tools,\n", + " llm=llm,\n", + " verbose=True,\n", + " agent=AgentType.OPENAI_FUNCTIONS,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example Usage\n", + "\n", + "Here are some examples of how you can use the agent with the AINetwork Toolkit:" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define App name to test" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "appName = f\"langchain_demo_{address.lower()}\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create an app in the AINetwork Blockchain database" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m\n", + "Invoking: `AINappOps` with `{'type': 'SET_ADMIN', 'appName': 'langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac'}`\n", + "\n", + "\n", + "\u001b[0m\u001b[36;1m\u001b[1;3m{\"tx_hash\": \"0x018846d6a9fc111edb1a2246ae2484ef05573bd2c584f3d0da155fa4b4936a9e\", \"result\": {\"gas_amount_total\": {\"bandwidth\": {\"service\": 4002, \"app\": {\"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\": 2}}, \"state\": {\"service\": 1640}}, \"gas_cost_total\": 0, \"func_results\": {\"_createApp\": {\"op_results\": {\"0\": {\"path\": \"/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\", \"result\": {\"code\": 0, \"bandwidth_gas_amount\": 1}}, \"1\": {\"path\": \"/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\", \"result\": {\"code\": 0, \"bandwidth_gas_amount\": 1}}, \"2\": {\"path\": \"/manage_app/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/config/admin\", \"result\": {\"code\": 0, \"bandwidth_gas_amount\": 1}}}, \"code\": 0, \"bandwidth_gas_amount\": 2000}}, \"code\": 0, \"bandwidth_gas_amount\": 2001, \"gas_amount_charged\": 5642}}\u001b[0m\u001b[32;1m\u001b[1;3mThe app with the name \"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\" has been created in the AINetwork Blockchain database.\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n", + "The app with the name \"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\" has been created in the AINetwork Blockchain database.\n" + ] + } + ], + "source": [ + "print(\n", + " agent.run(\n", + " f\"Create an app in the AINetwork Blockchain database with the name {appName}\"\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set a value at a given path in the AINetwork Blockchain database" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m\n", + "Invoking: `AINvalueOps` with `{'type': 'SET', 'path': '/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/object', 'value': {'1': 2, '34': 56}}`\n", + "\n", + "\n", + "\u001b[0m\u001b[33;1m\u001b[1;3m{\"tx_hash\": \"0x3d1a16d9808830088cdf4d37f90f4b1fa1242e2d5f6f983829064f45107b5279\", \"result\": {\"gas_amount_total\": {\"bandwidth\": {\"service\": 0, \"app\": {\"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\": 1}}, \"state\": {\"service\": 0, \"app\": {\"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\": 674}}}, \"gas_cost_total\": 0, \"code\": 0, \"bandwidth_gas_amount\": 1, \"gas_amount_charged\": 0}}\u001b[0m\u001b[32;1m\u001b[1;3mThe value {1: 2, '34': 56} has been set at the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/object.\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n", + "The value {1: 2, '34': 56} has been set at the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/object.\n" + ] + } + ], + "source": [ + "print(\n", + " agent.run(f\"Set the value {{1: 2, '34': 56}} at the path /apps/{appName}/object .\")\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set permissions for a path in the AINetwork Blockchain database" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m\n", + "Invoking: `AINruleOps` with `{'type': 'SET', 'path': '/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/user/$from', 'eval': 'auth.addr===$from'}`\n", + "\n", + "\n", + "\u001b[0m\u001b[38;5;200m\u001b[1;3m{\"tx_hash\": \"0x37d5264e580f6a217a347059a735bfa9eb5aad85ff28a95531c6dc09252664d2\", \"result\": {\"gas_amount_total\": {\"bandwidth\": {\"service\": 0, \"app\": {\"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\": 1}}, \"state\": {\"service\": 0, \"app\": {\"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac\": 712}}}, \"gas_cost_total\": 0, \"code\": 0, \"bandwidth_gas_amount\": 1, \"gas_amount_charged\": 0}}\u001b[0m\u001b[32;1m\u001b[1;3mThe write permissions for the path `/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/user/$from` have been set with the eval string `auth.addr===$from`.\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n", + "The write permissions for the path `/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/user/$from` have been set with the eval string `auth.addr===$from`.\n" + ] + } + ], + "source": [ + "print(\n", + " agent.run(\n", + " f\"Set the write permissions for the path /apps/{appName}/user/$from with the\"\n", + " \" eval string auth.addr===$from .\"\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Retrieve the permissions for a path in the AINetwork Blockchain database" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m\n", + "Invoking: `AINownerOps` with `{'type': 'GET', 'path': '/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac'}`\n", + "\n", + "\n", + "\u001b[0m\u001b[33;1m\u001b[1;3m{\".owner\": {\"owners\": {\"0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac\": {\"branch_owner\": true, \"write_function\": true, \"write_owner\": true, \"write_rule\": true}}}}\u001b[0m\u001b[32;1m\u001b[1;3mThe permissions for the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac are as follows:\n", + "\n", + "- Address: 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac\n", + " - branch_owner: true\n", + " - write_function: true\n", + " - write_owner: true\n", + " - write_rule: true\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n", + "The permissions for the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac are as follows:\n", + "\n", + "- Address: 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac\n", + " - branch_owner: true\n", + " - write_function: true\n", + " - write_owner: true\n", + " - write_rule: true\n" + ] + } + ], + "source": [ + "print(agent.run(f\"Retrieve the permissions for the path /apps/{appName}.\"))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get AIN from faucet" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"result\":\"0x0eb07b67b7d0a702cb60e865d3deafff3070d8508077ef793d69d6819fd92ea3\",\"time\":1692348112376}" + ] + } + ], + "source": [ + "!curl http://faucet.ainetwork.ai/api/test/{address}/" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get AIN Balance" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m\n", + "Invoking: `AINvalueOps` with `{'type': 'GET', 'path': '/accounts/0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac/balance'}`\n", + "\n", + "\n", + "\u001b[0m\u001b[33;1m\u001b[1;3m100\u001b[0m\u001b[32;1m\u001b[1;3mThe AIN balance of address 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac is 100 AIN.\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n", + "The AIN balance of address 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac is 100 AIN.\n" + ] + } + ], + "source": [ + "print(agent.run(f\"Check AIN balance of {address}\"))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Transfer AIN" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m\n", + "Invoking: `AINtransfer` with `{'address': '0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b', 'amount': 100}`\n", + "\n", + "\n", + "\u001b[0m\u001b[36;1m\u001b[1;3m{\"tx_hash\": \"0xa59d15d23373bcc00e413ac8ba18cb016bb3bdd54058d62606aec688c6ad3d2e\", \"result\": {\"gas_amount_total\": {\"bandwidth\": {\"service\": 3}, \"state\": {\"service\": 866}}, \"gas_cost_total\": 0, \"func_results\": {\"_transfer\": {\"op_results\": {\"0\": {\"path\": \"/accounts/0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac/balance\", \"result\": {\"code\": 0, \"bandwidth_gas_amount\": 1}}, \"1\": {\"path\": \"/accounts/0x19937B227b1b13f29e7AB18676a89EA3BDEA9C5b/balance\", \"result\": {\"code\": 0, \"bandwidth_gas_amount\": 1}}}, \"code\": 0, \"bandwidth_gas_amount\": 0}}, \"code\": 0, \"bandwidth_gas_amount\": 1, \"gas_amount_charged\": 869}}\u001b[0m\u001b[32;1m\u001b[1;3mThe transfer of 100 AIN to the address 0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b was successful. The transaction hash is 0xa59d15d23373bcc00e413ac8ba18cb016bb3bdd54058d62606aec688c6ad3d2e.\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n", + "The transfer of 100 AIN to the address 0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b was successful. The transaction hash is 0xa59d15d23373bcc00e413ac8ba18cb016bb3bdd54058d62606aec688c6ad3d2e.\n" + ] + } + ], + "source": [ + "print(\n", + " agent.run(\n", + " \"Transfer 100 AIN to the address 0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b\"\n", + " )\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.10.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/libs/langchain/langchain/agents/agent_toolkits/__init__.py b/libs/langchain/langchain/agents/agent_toolkits/__init__.py index f914d0c1e..93532981e 100644 --- a/libs/langchain/langchain/agents/agent_toolkits/__init__.py +++ b/libs/langchain/langchain/agents/agent_toolkits/__init__.py @@ -1,4 +1,5 @@ """Agent toolkits.""" +from langchain.agents.agent_toolkits.ainetwork.toolkit import AINetworkToolkit from langchain.agents.agent_toolkits.amadeus.toolkit import AmadeusToolkit from langchain.agents.agent_toolkits.azure_cognitive_services import ( AzureCognitiveServicesToolkit, @@ -46,6 +47,7 @@ from langchain.agents.agent_toolkits.xorbits.base import create_xorbits_agent from langchain.agents.agent_toolkits.zapier.toolkit import ZapierToolkit __all__ = [ + "AINetworkToolkit", "AmadeusToolkit", "AzureCognitiveServicesToolkit", "FileManagementToolkit", diff --git a/libs/langchain/langchain/agents/agent_toolkits/ainetwork/__init__.py b/libs/langchain/langchain/agents/agent_toolkits/ainetwork/__init__.py new file mode 100644 index 000000000..c4295f2ef --- /dev/null +++ b/libs/langchain/langchain/agents/agent_toolkits/ainetwork/__init__.py @@ -0,0 +1 @@ +"""AINetwork toolkit.""" diff --git a/libs/langchain/langchain/agents/agent_toolkits/ainetwork/toolkit.py b/libs/langchain/langchain/agents/agent_toolkits/ainetwork/toolkit.py new file mode 100644 index 000000000..4fd790c94 --- /dev/null +++ b/libs/langchain/langchain/agents/agent_toolkits/ainetwork/toolkit.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, List, Literal, Optional + +from langchain.agents.agent_toolkits.base import BaseToolkit +from langchain.pydantic_v1 import root_validator +from langchain.tools import BaseTool +from langchain.tools.ainetwork.app import AINAppOps +from langchain.tools.ainetwork.owner import AINOwnerOps +from langchain.tools.ainetwork.rule import AINRuleOps +from langchain.tools.ainetwork.transfer import AINTransfer +from langchain.tools.ainetwork.utils import authenticate +from langchain.tools.ainetwork.value import AINValueOps + +if TYPE_CHECKING: + from ain.ain import Ain + + +class AINetworkToolkit(BaseToolkit): + """Toolkit for interacting with AINetwork Blockchain.""" + + network: Optional[Literal["mainnet", "testnet"]] = "testnet" + interface: Optional[Ain] = None + + @root_validator(pre=True) + def set_interface(cls, values: dict) -> dict: + if not values.get("interface"): + values["interface"] = authenticate(network=values.get("network", "testnet")) + return values + + class Config: + """Pydantic config.""" + + validate_all = True + arbitrary_types_allowed = True + + def get_tools(self) -> List[BaseTool]: + """Get the tools in the toolkit.""" + return [ + AINAppOps(), + AINOwnerOps(), + AINRuleOps(), + AINTransfer(), + AINValueOps(), + ] diff --git a/libs/langchain/langchain/tools/__init__.py b/libs/langchain/langchain/tools/__init__.py index ad4ae9635..14e34d732 100644 --- a/libs/langchain/langchain/tools/__init__.py +++ b/libs/langchain/langchain/tools/__init__.py @@ -17,6 +17,11 @@ tool for the job. CallbackManagerForToolRun, AsyncCallbackManagerForToolRun """ +from langchain.tools.ainetwork.app import AINAppOps +from langchain.tools.ainetwork.owner import AINOwnerOps +from langchain.tools.ainetwork.rule import AINRuleOps +from langchain.tools.ainetwork.transfer import AINTransfer +from langchain.tools.ainetwork.value import AINValueOps from langchain.tools.arxiv.tool import ArxivQueryRun from langchain.tools.azure_cognitive_services import ( AzureCogsFormRecognizerTool, @@ -118,6 +123,11 @@ from langchain.tools.youtube.search import YouTubeSearchTool from langchain.tools.zapier.tool import ZapierNLAListActions, ZapierNLARunAction __all__ = [ + "AINAppOps", + "AINOwnerOps", + "AINRuleOps", + "AINTransfer", + "AINValueOps", "AIPluginTool", "APIOperation", "ArxivQueryRun", diff --git a/libs/langchain/langchain/tools/ainetwork/app.py b/libs/langchain/langchain/tools/ainetwork/app.py new file mode 100644 index 000000000..26599d75d --- /dev/null +++ b/libs/langchain/langchain/tools/ainetwork/app.py @@ -0,0 +1,95 @@ +import builtins +import json +from enum import Enum +from typing import List, Optional, Type, Union + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.pydantic_v1 import BaseModel, Field +from langchain.tools.ainetwork.base import AINBaseTool + + +class AppOperationType(str, Enum): + SET_ADMIN = "SET_ADMIN" + GET_CONFIG = "GET_CONFIG" + + +class AppSchema(BaseModel): + type: AppOperationType = Field(...) + appName: str = Field(..., description="Name of the application on the blockchain") + address: Optional[Union[str, List[str]]] = Field( + None, + description=( + "A single address or a list of addresses. Default: current session's " + "address" + ), + ) + + +class AINAppOps(AINBaseTool): + name: str = "AINappOps" + description: str = """ +Create an app in the AINetwork Blockchain database by creating the /apps/ path. +An address set as `admin` can grant `owner` rights to other addresses (refer to `AINownerOps` for more details). +Also, `admin` is initialized to have all `owner` permissions and `rule` allowed for that path. + +## appName Rule +- [a-z_0-9]+ + +## address Rules +- 0x[0-9a-fA-F]{40} +- Defaults to the current session's address +- Multiple addresses can be specified if needed + +## SET_ADMIN Example 1 +- type: SET_ADMIN +- appName: ain_project + +### Result: +1. Path /apps/ain_project created. +2. Current session's address registered as admin. + +## SET_ADMIN Example 2 +- type: SET_ADMIN +- appName: test_project +- address: [, ] + +### Result: +1. Path /apps/test_project created. +2. and registered as admin. + +""" # noqa: E501 + args_schema: Type[BaseModel] = AppSchema + + async def _arun( + self, + type: AppOperationType, + appName: str, + address: Optional[Union[str, List[str]]] = None, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + from ain.types import ValueOnlyTransactionInput + from ain.utils import getTimestamp + + try: + if type is AppOperationType.SET_ADMIN: + if address is None: + address = self.interface.wallet.defaultAccount.address + if isinstance(address, str): + address = [address] + + res = await self.interface.db.ref( + f"/manage_app/{appName}/create/{getTimestamp()}" + ).setValue( + transactionInput=ValueOnlyTransactionInput( + value={"admin": {address: True for address in address}} + ) + ) + elif type is AppOperationType.GET_CONFIG: + res = await self.interface.db.ref( + f"/manage_app/{appName}/config" + ).getValue() + else: + raise ValueError(f"Unsupported 'type': {type}.") + return json.dumps(res, ensure_ascii=False) + except Exception as e: + return f"{builtins.type(e).__name__}: {str(e)}" diff --git a/libs/langchain/langchain/tools/ainetwork/base.py b/libs/langchain/langchain/tools/ainetwork/base.py new file mode 100644 index 000000000..789976130 --- /dev/null +++ b/libs/langchain/langchain/tools/ainetwork/base.py @@ -0,0 +1,71 @@ +"""Base class for AINetwork tools.""" +from __future__ import annotations + +import asyncio +import threading +from enum import Enum +from typing import TYPE_CHECKING, Any, Optional + +from langchain.callbacks.manager import CallbackManagerForToolRun +from langchain.pydantic_v1 import Field +from langchain.tools.ainetwork.utils import authenticate +from langchain.tools.base import BaseTool + +if TYPE_CHECKING: + from ain.ain import Ain + + +class OperationType(str, Enum): + SET = "SET" + GET = "GET" + + +class AINBaseTool(BaseTool): + """Base class for the AINetwork tools.""" + + interface: Ain = Field(default_factory=authenticate) + """The interface object for the AINetwork Blockchain.""" + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + if loop.is_closed(): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + if loop.is_running(): + result_container = [] + + def thread_target() -> None: + nonlocal result_container + new_loop = asyncio.new_event_loop() + asyncio.set_event_loop(new_loop) + try: + result_container.append( + new_loop.run_until_complete(self._arun(*args, **kwargs)) + ) + except Exception as e: + result_container.append(e) + finally: + new_loop.close() + + thread = threading.Thread(target=thread_target) + thread.start() + thread.join() + result = result_container[0] + if isinstance(result, Exception): + raise result + return result + + else: + result = loop.run_until_complete(self._arun(*args, **kwargs)) + loop.close() + return result diff --git a/libs/langchain/langchain/tools/ainetwork/owner.py b/libs/langchain/langchain/tools/ainetwork/owner.py new file mode 100644 index 000000000..42a2b18d8 --- /dev/null +++ b/libs/langchain/langchain/tools/ainetwork/owner.py @@ -0,0 +1,110 @@ +import builtins +import json +from typing import List, Optional, Type, Union + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.pydantic_v1 import BaseModel, Field +from langchain.tools.ainetwork.base import AINBaseTool, OperationType + + +class RuleSchema(BaseModel): + type: OperationType = Field(...) + path: str = Field(..., description="Blockchain reference path") + address: Optional[Union[str, List[str]]] = Field( + None, description="A single address or a list of addresses" + ) + write_owner: Optional[bool] = Field( + False, description="Authority to edit the `owner` property of the path" + ) + write_rule: Optional[bool] = Field( + False, description="Authority to edit `write rule` for the path" + ) + write_function: Optional[bool] = Field( + False, description="Authority to `set function` for the path" + ) + branch_owner: Optional[bool] = Field( + False, description="Authority to initialize `owner` of sub-paths" + ) + + +class AINOwnerOps(AINBaseTool): + name: str = "AINownerOps" + description: str = """ +Rules for `owner` in AINetwork Blockchain database. +An address set as `owner` can modify permissions according to its granted authorities + +## Path Rule +- (/[a-zA-Z_0-9]+)+ +- Permission checks ascend from the most specific (child) path to broader (parent) paths until an `owner` is located. + +## Address Rules +- 0x[0-9a-fA-F]{40}: 40-digit hexadecimal address +- *: All addresses permitted +- Defaults to the current session's address + +## SET +- `SET` alters permissions for specific addresses, while other addresses remain unaffected. +- When removing an address of `owner`, set all authorities for that address to false. +- message `write_owner permission evaluated false` if fail + +### Example +- type: SET +- path: /apps/langchain +- address: [
,
] +- write_owner: True +- write_rule: True +- write_function: True +- branch_owner: True + +## GET +- Provides all addresses with `owner` permissions and their authorities in the path. + +### Example +- type: GET +- path: /apps/langchain +""" # noqa: E501 + args_schema: Type[BaseModel] = RuleSchema + + async def _arun( + self, + type: OperationType, + path: str, + address: Optional[Union[str, List[str]]] = None, + write_owner: Optional[bool] = None, + write_rule: Optional[bool] = None, + write_function: Optional[bool] = None, + branch_owner: Optional[bool] = None, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + from ain.types import ValueOnlyTransactionInput + + try: + if type is OperationType.SET: + if address is None: + address = self.interface.wallet.defaultAccount.address + if isinstance(address, str): + address = [address] + res = await self.interface.db.ref(path).setOwner( + transactionInput=ValueOnlyTransactionInput( + value={ + ".owner": { + "owners": { + address: { + "write_owner": write_owner or False, + "write_rule": write_rule or False, + "write_function": write_function or False, + "branch_owner": branch_owner or False, + } + for address in address + } + } + } + ) + ) + elif type is OperationType.GET: + res = await self.interface.db.ref(path).getOwner() + else: + raise ValueError(f"Unsupported 'type': {type}.") + return json.dumps(res, ensure_ascii=False) + except Exception as e: + return f"{builtins.type(e).__name__}: {str(e)}" diff --git a/libs/langchain/langchain/tools/ainetwork/rule.py b/libs/langchain/langchain/tools/ainetwork/rule.py new file mode 100644 index 000000000..d66fd2020 --- /dev/null +++ b/libs/langchain/langchain/tools/ainetwork/rule.py @@ -0,0 +1,77 @@ +import builtins +import json +from typing import Optional, Type + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.pydantic_v1 import BaseModel, Field +from langchain.tools.ainetwork.base import AINBaseTool, OperationType + + +class RuleSchema(BaseModel): + type: OperationType = Field(...) + path: str = Field(..., description="Path on the blockchain where the rule applies") + eval: Optional[str] = Field(None, description="eval string to determine permission") + + +class AINRuleOps(AINBaseTool): + name: str = "AINruleOps" + description: str = """ +Covers the write `rule` for the AINetwork Blockchain database. The SET type specifies write permissions using the `eval` variable as a JavaScript eval string. +In order to AINvalueOps with SET at the path, the execution result of the `eval` string must be true. + +## Path Rules +1. Allowed characters for directory: `[a-zA-Z_0-9]` +2. Use `$` for template variables as directory. + +## Eval String Special Variables +- auth.addr: Address of the writer for the path +- newData: New data for the path +- data: Current data for the path +- currentTime: Time in seconds +- lastBlockNumber: Latest processed block number + +## Eval String Functions +- getValue() +- getRule() +- getOwner() +- getFunction() +- evalRule(, , auth, currentTime) +- evalOwner(, 'write_owner', auth) + +## SET Example +- type: SET +- path: /apps/langchain_project_1/$from/$to/$img +- eval: auth.addr===$from&&!getValue('/apps/image_db/'+$img) + +## GET Example +- type: GET +- path: /apps/langchain_project_1 +""" # noqa: E501 + args_schema: Type[BaseModel] = RuleSchema + + async def _arun( + self, + type: OperationType, + path: str, + eval: Optional[str] = None, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + from ain.types import ValueOnlyTransactionInput + + try: + if type is OperationType.SET: + if eval is None: + raise ValueError("'eval' is required for SET operation.") + + res = await self.interface.db.ref(path).setRule( + transactionInput=ValueOnlyTransactionInput( + value={".rule": {"write": eval}} + ) + ) + elif type is OperationType.GET: + res = await self.interface.db.ref(path).getRule() + else: + raise ValueError(f"Unsupported 'type': {type}.") + return json.dumps(res, ensure_ascii=False) + except Exception as e: + return f"{builtins.type(e).__name__}: {str(e)}" diff --git a/libs/langchain/langchain/tools/ainetwork/transfer.py b/libs/langchain/langchain/tools/ainetwork/transfer.py new file mode 100644 index 000000000..b267f724a --- /dev/null +++ b/libs/langchain/langchain/tools/ainetwork/transfer.py @@ -0,0 +1,29 @@ +import json +from typing import Optional, Type + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.pydantic_v1 import BaseModel, Field +from langchain.tools.ainetwork.base import AINBaseTool + + +class TransferSchema(BaseModel): + address: str = Field(..., description="Address to transfer AIN to") + amount: int = Field(..., description="Amount of AIN to transfer") + + +class AINTransfer(AINBaseTool): + name: str = "AINtransfer" + description: str = "Transfers AIN to a specified address" + args_schema: Type[TransferSchema] = TransferSchema + + async def _arun( + self, + address: str, + amount: int, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + try: + res = await self.interface.wallet.transfer(address, amount, nonce=-1) + return json.dumps(res, ensure_ascii=False) + except Exception as e: + return f"{type(e).__name__}: {str(e)}" diff --git a/libs/langchain/langchain/tools/ainetwork/utils.py b/libs/langchain/langchain/tools/ainetwork/utils.py new file mode 100644 index 000000000..0f8179a60 --- /dev/null +++ b/libs/langchain/langchain/tools/ainetwork/utils.py @@ -0,0 +1,62 @@ +"""AINetwork Blockchain tool utils.""" +from __future__ import annotations + +import os +from typing import TYPE_CHECKING, Literal, Optional + +if TYPE_CHECKING: + from ain.ain import Ain + + +def authenticate(network: Optional[Literal["mainnet", "testnet"]] = "testnet") -> Ain: + """Authenticate using the AIN Blockchain""" + + try: + from ain.ain import Ain + except ImportError as e: + raise ImportError( + "Cannot import ain-py related modules. Please install the package with " + "`pip install ain-py`." + ) from e + + if network == "mainnet": + provider_url = "https://mainnet-api.ainetwork.ai/" + chain_id = 1 + if "AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY" in os.environ: + private_key = os.environ["AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY"] + else: + raise EnvironmentError( + "Error: The AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY environmental variable " + "has not been set." + ) + elif network == "testnet": + provider_url = "https://testnet-api.ainetwork.ai/" + chain_id = 0 + if "AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY" in os.environ: + private_key = os.environ["AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY"] + else: + raise EnvironmentError( + "Error: The AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY environmental variable " + "has not been set." + ) + elif network is None: + if ( + "AIN_BLOCKCHAIN_PROVIDER_URL" in os.environ + and "AIN_BLOCKCHAIN_CHAIN_ID" in os.environ + and "AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY" in os.environ + ): + provider_url = os.environ["AIN_BLOCKCHAIN_PROVIDER_URL"] + chain_id = int(os.environ["AIN_BLOCKCHAIN_CHAIN_ID"]) + private_key = os.environ["AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY"] + else: + raise EnvironmentError( + "Error: The AIN_BLOCKCHAIN_PROVIDER_URL and " + "AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY and AIN_BLOCKCHAIN_CHAIN_ID " + "environmental variable has not been set." + ) + else: + raise ValueError(f"Unsupported 'network': {network}") + + ain = Ain(provider_url, chain_id) + ain.wallet.addAndSetDefaultAccount(private_key) + return ain diff --git a/libs/langchain/langchain/tools/ainetwork/value.py b/libs/langchain/langchain/tools/ainetwork/value.py new file mode 100644 index 000000000..2e6c92c68 --- /dev/null +++ b/libs/langchain/langchain/tools/ainetwork/value.py @@ -0,0 +1,80 @@ +import builtins +import json +from typing import Optional, Type, Union + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.pydantic_v1 import BaseModel, Field +from langchain.tools.ainetwork.base import AINBaseTool, OperationType + + +class ValueSchema(BaseModel): + type: OperationType = Field(...) + path: str = Field(..., description="Blockchain reference path") + value: Optional[Union[int, str, float, dict]] = Field( + None, description="Value to be set at the path" + ) + + +class AINValueOps(AINBaseTool): + name: str = "AINvalueOps" + description: str = """ +Covers the read and write value for the AINetwork Blockchain database. + +## SET +- Set a value at a given path + +### Example +- type: SET +- path: /apps/langchain_test_1/object +- value: {1: 2, "34": 56} + +## GET +- Retrieve a value at a given path + +### Example +- type: GET +- path: /apps/langchain_test_1/DB + +## Special paths +- `/accounts/
/balance`: Account balance +- `/accounts/
/nonce`: Account nonce +- `/apps`: Applications +- `/consensus`: Consensus +- `/checkin`: Check-in +- `/deposit//
/`: Deposit +- `/deposit_accounts//
/`: Deposit accounts +- `/escrow`: Escrow +- `/payments`: Payment +- `/sharding`: Sharding +- `/token/name`: Token name +- `/token/symbol`: Token symbol +- `/token/total_supply`: Token total supply +- `/transfer/
/
//value`: Transfer +- `/withdraw//
/`: Withdraw +""" + args_schema: Type[BaseModel] = ValueSchema + + async def _arun( + self, + type: OperationType, + path: str, + value: Optional[Union[int, str, float, dict]] = None, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + from ain.types import ValueOnlyTransactionInput + + try: + if type is OperationType.SET: + if value is None: + raise ValueError("'value' is required for SET operation.") + + res = await self.interface.db.ref(path).setValue( + transactionInput=ValueOnlyTransactionInput(value=value) + ) + elif type is OperationType.GET: + res = await self.interface.db.ref(path).getValue() + else: + raise ValueError(f"Unsupported 'type': {type}.") + return json.dumps(res, ensure_ascii=False) + except Exception as e: + return f"{builtins.type(e).__name__}: {str(e)}" diff --git a/libs/langchain/tests/integration_tests/agent/test_ainetwork_agent.py b/libs/langchain/tests/integration_tests/agent/test_ainetwork_agent.py new file mode 100644 index 000000000..58dd462ba --- /dev/null +++ b/libs/langchain/tests/integration_tests/agent/test_ainetwork_agent.py @@ -0,0 +1,175 @@ +import asyncio +import os +import time +import urllib.request +import uuid +from enum import Enum +from typing import Any +from urllib.error import HTTPError + +import pytest + +from langchain.agents import AgentType, initialize_agent +from langchain.agents.agent_toolkits.ainetwork.toolkit import AINetworkToolkit +from langchain.chat_models import ChatOpenAI +from langchain.tools.ainetwork.utils import authenticate + + +class Match(Enum): + __test__ = False + ListWildcard = 1 + StrWildcard = 2 + DictWildcard = 3 + IntWildcard = 4 + FloatWildcard = 5 + ObjectWildcard = 6 + + @classmethod + def match(cls, value: Any, template: Any) -> bool: + if template is cls.ListWildcard: + return isinstance(value, list) + elif template is cls.StrWildcard: + return isinstance(value, str) + elif template is cls.DictWildcard: + return isinstance(value, dict) + elif template is cls.IntWildcard: + return isinstance(value, int) + elif template is cls.FloatWildcard: + return isinstance(value, float) + elif template is cls.ObjectWildcard: + return True + elif type(value) != type(template): + return False + elif isinstance(value, dict): + if len(value) != len(template): + return False + for k, v in value.items(): + if k not in template or not cls.match(v, template[k]): + return False + return True + elif isinstance(value, list): + if len(value) != len(template): + return False + for i in range(len(value)): + if not cls.match(value[i], template[i]): + return False + return True + else: + return value == template + + +@pytest.mark.requires("ain") +def test_ainetwork_toolkit() -> None: + def get(path: str, type: str = "value", default: Any = None) -> Any: + ref = ain.db.ref(path) + value = asyncio.run( + { + "value": ref.getValue, + "rule": ref.getRule, + "owner": ref.getOwner, + }[type]() + ) + return default if value is None else value + + def validate(path: str, template: Any, type: str = "value") -> bool: + value = get(path, type) + return Match.match(value, template) + + if not os.environ.get("AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY", None): + from ain.account import Account + + account = Account.create() + os.environ["AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY"] = account.private_key + + interface = authenticate(network="testnet") + toolkit = AINetworkToolkit(network="testnet", interface=interface) + llm = ChatOpenAI(model="gpt-4", temperature=0) + agent = initialize_agent( + tools=toolkit.get_tools(), + llm=llm, + verbose=True, + agent=AgentType.OPENAI_FUNCTIONS, + ) + ain = interface + self_address = ain.wallet.defaultAccount.address + co_address = "0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69" + + # Test creating an app + UUID = uuid.UUID( + int=(int(time.time() * 1000) << 64) | (uuid.uuid4().int & ((1 << 64) - 1)) + ) + app_name = f"_langchain_test__{str(UUID).replace('-', '_')}" + agent.run(f"""Create app {app_name}""") + validate(f"/manage_app/{app_name}/config", {"admin": {self_address: True}}) + validate(f"/apps/{app_name}/DB", None, "owner") + + # Test reading owner config + agent.run(f"""Read owner config of /apps/{app_name}/DB .""") + assert ... + + # Test granting owner config + agent.run( + f"""Grant owner authority to {co_address} for edit write rule permission of /apps/{app_name}/DB_co .""" # noqa: E501 + ) + validate( + f"/apps/{app_name}/DB_co", + { + ".owner": { + "owners": { + co_address: { + "branch_owner": False, + "write_function": False, + "write_owner": False, + "write_rule": True, + } + } + } + }, + "owner", + ) + + # Test reading owner config + agent.run(f"""Read owner config of /apps/{app_name}/DB_co .""") + assert ... + + # Test reading owner config + agent.run(f"""Read owner config of /apps/{app_name}/DB .""") + assert ... # Check if owner {self_address} exists + + # Test reading a value + agent.run(f"""Read value in /apps/{app_name}/DB""") + assert ... # empty + + # Test writing a value + agent.run(f"""Write value {{1: 1904, 2: 43}} in /apps/{app_name}/DB""") + validate(f"/apps/{app_name}/DB", {1: 1904, 2: 43}) + + # Test reading a value + agent.run(f"""Read value in /apps/{app_name}/DB""") + assert ... # check value + + # Test reading a rule + agent.run(f"""Read write rule of app {app_name} .""") + assert ... # check rule that self_address exists + + # Test sending AIN + self_balance = get(f"/accounts/{self_address}/balance", default=0) + transaction_history = get(f"/transfer/{self_address}/{co_address}", default={}) + if self_balance < 1: + try: + with urllib.request.urlopen( + f"http://faucet.ainetwork.ai/api/test/{self_address}/" + ) as response: + try_test = response.getcode() + except HTTPError as e: + try_test = e.getcode() + else: + try_test = 200 + + if try_test == 200: + agent.run(f"""Send 1 AIN to {co_address}""") + transaction_update = get(f"/transfer/{self_address}/{co_address}", default={}) + assert any( + transaction_update[key]["value"] == 1 + for key in transaction_update.keys() - transaction_history.keys() + ) diff --git a/libs/langchain/tests/unit_tests/tools/test_public_api.py b/libs/langchain/tests/unit_tests/tools/test_public_api.py index 43c2fb905..6d58dd92e 100644 --- a/libs/langchain/tests/unit_tests/tools/test_public_api.py +++ b/libs/langchain/tests/unit_tests/tools/test_public_api.py @@ -2,6 +2,11 @@ from langchain.tools import __all__ as public_api _EXPECTED = [ + "AINAppOps", + "AINOwnerOps", + "AINRuleOps", + "AINTransfer", + "AINValueOps", "AIPluginTool", "APIOperation", "ArxivQueryRun", From 2b663089b5f6f16890c134d14981db7a0eb446ba Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Tue, 22 Aug 2023 08:10:22 -0700 Subject: [PATCH 038/143] bump 271 (#9615) --- libs/langchain/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 8c3c8c18d..9f7ab9690 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain" -version = "0.0.270" +version = "0.0.271" description = "Building applications with LLMs through composability" authors = [] license = "MIT" From c75e1aa5ed1cad4e3c53bef26644ad1a1137d30a Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 11:36:52 -0400 Subject: [PATCH 039/143] Eliminate special-casing from test CI workflows. (#9562) The previous approach was relying on `_test.yml` taking an input parameter, and then doing almost completely orthogonal things for each parameter value. I've separated out each of those test situations as its own job or workflow file, which eliminated all the special-casing and, in my opinion, improved maintainability by making it much more obvious what code runs when. --- .github/workflows/_pydantic_compatibility.yml | 76 +++++++++++++++++++ .github/workflows/_test.yml | 58 ++------------ .github/workflows/langchain_ci.yml | 44 ++++++++++- .../workflows/langchain_experimental_ci.yml | 3 +- 4 files changed, 124 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/_pydantic_compatibility.yml diff --git a/.github/workflows/_pydantic_compatibility.yml b/.github/workflows/_pydantic_compatibility.yml new file mode 100644 index 000000000..5a54c2f53 --- /dev/null +++ b/.github/workflows/_pydantic_compatibility.yml @@ -0,0 +1,76 @@ +name: pydantic v1/v2 compatibility + +on: + workflow_call: + inputs: + working-directory: + required: true + type: string + description: "From which folder this pipeline executes" + +env: + POETRY_VERSION: "1.5.1" + +jobs: + build: + defaults: + run: + working-directory: ${{ inputs.working-directory }} + runs-on: ubuntu-latest + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + name: Pydantic v1/v2 compatibility - Python ${{ matrix.python-version }} + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: "./.github/actions/poetry_setup" + with: + python-version: ${{ matrix.python-version }} + working-directory: ${{ inputs.working-directory }} + poetry-version: ${{ env.POETRY_VERSION }} + cache-key: pydantic-cross-compat + install-command: poetry install + - name: Install the opposite major version of pydantic + # If normal tests use pydantic v1, here we'll use v2, and vice versa. + shell: bash + run: | + # Determine the major part of pydantic version + REGULAR_VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) + + if [[ "$REGULAR_VERSION" == "1" ]]; then + PYDANTIC_DEP=">=2.1,<3" + TEST_WITH_VERSION="2" + elif [[ "$REGULAR_VERSION" == "2" ]]; then + PYDANTIC_DEP="<2" + TEST_WITH_VERSION="1" + else + echo "Unexpected pydantic major version '$REGULAR_VERSION', cannot determine which version to use for cross-compatibility test." + exit 1 + fi + + # Install via `pip` instead of `poetry add` to avoid changing lockfile, + # which would prevent caching from working: the cache would get saved + # to a different key than where it gets loaded from. + poetry run pip install "pydantic${PYDANTIC_DEP}" + + # Ensure that the correct pydantic is installed now. + echo "Checking pydantic version... Expecting ${TEST_WITH_VERSION}" + + # Determine the major part of pydantic version + CURRENT_VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) + + # Check that the major part of pydantic version is as expected, if not + # raise an error + if [[ "$CURRENT_VERSION" != "$TEST_WITH_VERSION" ]]; then + echo "Error: expected pydantic version ${CURRENT_VERSION} to have been installed, but found: ${TEST_WITH_VERSION}" + exit 1 + fi + echo "Found pydantic version ${CURRENT_VERSION}, as expected" + - name: Run pydantic compatibility tests + shell: bash + run: make test diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 3cc424cb7..179b6303d 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -7,10 +7,6 @@ on: required: true type: string description: "From which folder this pipeline executes" - test_type: - type: string - description: "Test types to run" - default: '["core", "extended", "core-pydantic-2"]' env: POETRY_VERSION: "1.5.1" @@ -28,8 +24,7 @@ jobs: - "3.9" - "3.10" - "3.11" - test_type: ${{ fromJSON(inputs.test_type) }} - name: Python ${{ matrix.python-version }} ${{ matrix.test_type }} + name: Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} @@ -38,51 +33,8 @@ jobs: python-version: ${{ matrix.python-version }} working-directory: ${{ inputs.working-directory }} poetry-version: ${{ env.POETRY_VERSION }} - cache-key: ${{ matrix.test_type }} - install-command: | - if [ "${{ matrix.test_type }}" == "core" ]; then - echo "Running core tests, installing dependencies with poetry..." - poetry install - elif [ "${{ matrix.test_type }}" == "core-pydantic-2" ]; then - echo "Running core-pydantic-v2 tests, installing dependencies with poetry..." - poetry install - - # Install via `pip` instead of `poetry add` to avoid changing lockfile, - # which would prevent caching from working: the cache would get saved - # to a different key than where it gets loaded from. - poetry run pip install 'pydantic>=2.1,<3' - else - echo "Running extended tests, installing dependencies with poetry..." - poetry install -E extended_testing - fi - - name: Verify pydantic version - run: | - if [ "${{ matrix.test_type }}" == "core-pydantic-2" ]; then - EXPECTED_VERSION=2 - else - EXPECTED_VERSION=1 - fi - echo "Checking pydantic version... Expecting ${EXPECTED_VERSION}" - - # Determine the major part of pydantic version - VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) - - # Check that the major part of pydantic version is as expected, if not - # raise an error - if [[ "$VERSION" -ne $EXPECTED_VERSION ]]; then - echo "Error: pydantic version must be equal to ${EXPECTED_VERSION}; Found: ${VERSION}" - exit 1 - fi - echo "Found pydantic version ${VERSION}, as expected" - shell: bash - - name: Run ${{matrix.test_type}} tests - run: | - case "${{ matrix.test_type }}" in - core | core-pydantic-2) - make test - ;; - *) - make extended_tests - ;; - esac + cache-key: core + install-command: poetry install + - name: Run core tests shell: bash + run: make test diff --git a/.github/workflows/langchain_ci.yml b/.github/workflows/langchain_ci.yml index 9dfbd8c3d..b91e039ea 100644 --- a/.github/workflows/langchain_ci.yml +++ b/.github/workflows/langchain_ci.yml @@ -8,10 +8,15 @@ on: paths: - '.github/workflows/_lint.yml' - '.github/workflows/_test.yml' + - '.github/workflows/_pydantic_compatibility.yml' - '.github/workflows/langchain_ci.yml' - 'libs/langchain/**' workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI +env: + POETRY_VERSION: "1.5.1" + WORKDIR: "libs/langchain" + jobs: lint: uses: @@ -19,10 +24,45 @@ jobs: with: working-directory: libs/langchain secrets: inherit + test: uses: ./.github/workflows/_test.yml with: working-directory: libs/langchain - test_type: '["core", "extended", "core-pydantic-2"]' - secrets: inherit \ No newline at end of file + secrets: inherit + + pydantic-compatibility: + uses: + ./.github/workflows/_pydantic_compatibility.yml + with: + working-directory: libs/langchain + secrets: inherit + + extended-tests: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ${{ env.WORKDIR }} + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + name: Python ${{ matrix.python-version }} extended tests + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: "./.github/actions/poetry_setup" + with: + python-version: ${{ matrix.python-version }} + working-directory: ${{ env.WORKDIR }} + poetry-version: ${{ env.POETRY_VERSION }} + cache-key: extended + install-command: | + echo "Running extended tests, installing dependencies with poetry..." + poetry install -E extended_testing + - name: Run extended tests + run: make extended_tests diff --git a/.github/workflows/langchain_experimental_ci.yml b/.github/workflows/langchain_experimental_ci.yml index 9c95634e4..e1d6e66a8 100644 --- a/.github/workflows/langchain_experimental_ci.yml +++ b/.github/workflows/langchain_experimental_ci.yml @@ -25,5 +25,4 @@ jobs: ./.github/workflows/_test.yml with: working-directory: libs/experimental - test_type: '["core"]' - secrets: inherit \ No newline at end of file + secrets: inherit From a1e89aa8d552d8ae207260e9e9035407e5e3e516 Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 11:38:18 -0400 Subject: [PATCH 040/143] Explicitly add the `contents: write` permission for publishing releases. (#9617) --- .github/workflows/_release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/_release.yml b/.github/workflows/_release.yml index d24bf983a..5ddf79ca7 100644 --- a/.github/workflows/_release.yml +++ b/.github/workflows/_release.yml @@ -23,6 +23,9 @@ jobs: # Trusted publishing has to also be configured on PyPI for each package: # https://docs.pypi.org/trusted-publishers/adding-a-publisher/ id-token: write + + # This permission is needed by `ncipollo/release-action` to create the GitHub release. + contents: write defaults: run: working-directory: ${{ inputs.working-directory }} From acb54d8b9da9c5bcf73fade48c3c20f54388662a Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 12:11:38 -0400 Subject: [PATCH 041/143] Reduce cache timeouts to ensure faster builds on timeout. (#9619) The current timeouts are too long, and mean that if the GitHub cache decides to act up, jobs get bogged down for 15min at a time. This has happened 2-3 times already this week -- a tiny fraction of our total workflows but really annoying when it happens to you. We can do better. Installing deps on cache miss takes about ~4min, so it's not worth waiting more than 4min for the deps cache. The black and mypy caches save 1 and 2min, respectively, so wait only up to that long to download them. --- .github/actions/poetry_setup/action.yml | 4 ++-- .github/workflows/_lint.yml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/actions/poetry_setup/action.yml b/.github/actions/poetry_setup/action.yml index 6dbe00026..39c76bec4 100644 --- a/.github/actions/poetry_setup/action.yml +++ b/.github/actions/poetry_setup/action.yml @@ -41,7 +41,7 @@ runs: id: cache-pip name: Cache Pip ${{ inputs.python-version }} env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "15" + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" with: path: | ~/.cache/pip @@ -69,7 +69,7 @@ runs: - uses: actions/cache@v3 id: cache-poetry env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "15" + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }} with: path: | diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index c850258d1..5b1c35a9d 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -84,7 +84,7 @@ jobs: id: cache-pip name: Cache langchain editable pip install - ${{ matrix.python-version }} env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "15" + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" with: path: | ~/.cache/pip @@ -95,7 +95,7 @@ jobs: - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "15" + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" with: python-version: ${{ matrix.python-version }} cache: poetry @@ -115,7 +115,7 @@ jobs: uses: actions/cache@v3 env: CACHE_BASE: black-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', env.WORKDIR)) }} - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "15" + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "1" with: path: | ${{ env.WORKDIR }}/.black_cache @@ -127,7 +127,7 @@ jobs: - name: Get .mypy_cache to speed up mypy uses: actions/cache@v3 env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "15" + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2" with: path: | ${{ env.WORKDIR }}/.mypy_cache From 34088107481a029b60bc6dd166770e80ff72fadd Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Tue, 22 Aug 2023 12:31:18 -0400 Subject: [PATCH 042/143] Add batch util (#9620) Add `batch` utility to langchain --- libs/langchain/langchain/utils/iter.py | 12 +++++++++++ .../tests/unit_tests/utils/__init__.py | 0 .../tests/unit_tests/utils/test_iter.py | 21 +++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 libs/langchain/tests/unit_tests/utils/__init__.py create mode 100644 libs/langchain/tests/unit_tests/utils/test_iter.py diff --git a/libs/langchain/langchain/utils/iter.py b/libs/langchain/langchain/utils/iter.py index 1b95f180e..60834163c 100644 --- a/libs/langchain/langchain/utils/iter.py +++ b/libs/langchain/langchain/utils/iter.py @@ -1,10 +1,12 @@ from collections import deque +from itertools import islice from typing import ( Any, ContextManager, Deque, Generator, Generic, + Iterable, Iterator, List, Optional, @@ -161,3 +163,13 @@ class Tee(Generic[T]): # Why this is needed https://stackoverflow.com/a/44638570 safetee = Tee + + +def batch_iterate(size: int, iterable: Iterable[T]) -> Iterator[List[T]]: + """Utility batching function.""" + it = iter(iterable) + while True: + chunk = list(islice(it, size)) + if not chunk: + return + yield chunk diff --git a/libs/langchain/tests/unit_tests/utils/__init__.py b/libs/langchain/tests/unit_tests/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/langchain/tests/unit_tests/utils/test_iter.py b/libs/langchain/tests/unit_tests/utils/test_iter.py new file mode 100644 index 000000000..f0fd8bf4c --- /dev/null +++ b/libs/langchain/tests/unit_tests/utils/test_iter.py @@ -0,0 +1,21 @@ +from typing import List + +import pytest + +from langchain.utils.iter import batch_iterate + + +@pytest.mark.parametrize( + "input_size, input_iterable, expected_output", + [ + (2, [1, 2, 3, 4, 5], [[1, 2], [3, 4], [5]]), + (3, [10, 20, 30, 40, 50], [[10, 20, 30], [40, 50]]), + (1, [100, 200, 300], [[100], [200], [300]]), + (4, [], []), + ], +) +def test_batch_iterate( + input_size: int, input_iterable: List[str], expected_output: List[str] +) -> None: + """Test batching function.""" + assert list(batch_iterate(input_size, input_iterable)) == expected_output From 3c7cc4d4402a60bb43adf70f4f2037d3d784d24c Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 13:35:21 -0400 Subject: [PATCH 043/143] Test experimental package with `langchain` on `master` branch. (#9621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's possible that langchain-experimental works fine with the latest *published* langchain, but is broken with the langchain on `master`. Unfortunately, you can see this is currently the case — this is why this PR also includes a minor fix for the `langchain` package itself. We want to catch situations like that *before* releasing a new langchain, hence this test. --- .../workflows/langchain_experimental_ci.yml | 40 +++++++++++++++++++ libs/langchain/langchain/llms/base.py | 10 +++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/.github/workflows/langchain_experimental_ci.yml b/.github/workflows/langchain_experimental_ci.yml index e1d6e66a8..cee8cdb7d 100644 --- a/.github/workflows/langchain_experimental_ci.yml +++ b/.github/workflows/langchain_experimental_ci.yml @@ -13,6 +13,10 @@ on: - 'libs/experimental/**' workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI +env: + POETRY_VERSION: "1.5.1" + WORKDIR: "libs/experimental" + jobs: lint: uses: @@ -20,9 +24,45 @@ jobs: with: working-directory: libs/experimental secrets: inherit + test: uses: ./.github/workflows/_test.yml with: working-directory: libs/experimental secrets: inherit + + # It's possible that langchain-experimental works fine with the latest *published* langchain, + # but is broken with the langchain on `master`. + # + # We want to catch situations like that *before* releasing a new langchain, hence this test. + test-with-latest-langchain: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ${{ env.WORKDIR }} + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + name: test with unpublished langchain - Python ${{ matrix.python-version }} + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: "./.github/actions/poetry_setup" + with: + python-version: ${{ matrix.python-version }} + working-directory: ${{ env.WORKDIR }} + poetry-version: ${{ env.POETRY_VERSION }} + cache-key: unpublished-langchain + install-command: | + echo "Running tests with unpublished langchain, installing dependencies with poetry..." + poetry install + + echo "Editably installing langchain outside of poetry, to avoid messing up lockfile..." + poetry run pip install -e ../langchain + - name: Run tests + run: make test diff --git a/libs/langchain/langchain/llms/base.py b/libs/langchain/langchain/llms/base.py index a833487ff..a91ecd9f2 100644 --- a/libs/langchain/langchain/llms/base.py +++ b/libs/langchain/langchain/llms/base.py @@ -528,9 +528,13 @@ class BaseLLM(BaseLanguageModel[str], ABC): f" argument of type {type(prompts)}." ) # Create callback managers - if isinstance(callbacks, list) and ( - isinstance(callbacks[0], (list, BaseCallbackManager)) - or callbacks[0] is None + if ( + isinstance(callbacks, list) + and callbacks + and ( + isinstance(callbacks[0], (list, BaseCallbackManager)) + or callbacks[0] is None + ) ): # We've received a list of callbacks args to apply to each input assert len(callbacks) == len(prompts) From 64a54d8ad80fa8a41bb69f3c2c176980df631cbb Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 14:09:11 -0400 Subject: [PATCH 044/143] `poetry lock` the top-level environment. (#9477) --- poetry.lock | 758 +++++++++++++++++++++++++--------------------------- 1 file changed, 363 insertions(+), 395 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7599ad353..8210605be 100644 --- a/poetry.lock +++ b/poetry.lock @@ -167,22 +167,23 @@ files = [ [[package]] name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." +version = "23.1.0" +description = "Argon2 for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, - {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, ] [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] -docs = ["furo", "sphinx", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] [[package]] name = "argon2-cffi-bindings" @@ -254,13 +255,13 @@ test = ["astroid", "pytest"] [[package]] name = "async-lru" -version = "2.0.3" +version = "2.0.4" description = "Simple LRU cache for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "async-lru-2.0.3.tar.gz", hash = "sha256:b714c9d1415fca4e264da72a9e2abc66880ce7430e03a973341f88ea4c0d4869"}, - {file = "async_lru-2.0.3-py3-none-any.whl", hash = "sha256:00c0a8899c20b9c88663a47732689ff98189c9fa08ad9f734d7722f934d250b1"}, + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, ] [package.dependencies] @@ -268,13 +269,13 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] @@ -427,13 +428,13 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] @@ -598,13 +599,13 @@ files = [ [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -640,17 +641,17 @@ files = [ [[package]] name = "comm" -version = "0.1.3" +version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.6" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] @@ -678,29 +679,29 @@ dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest ( [[package]] name = "debugpy" -version = "1.6.7" +version = "1.6.7.post1" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.7" files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, + {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, + {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, ] [[package]] @@ -727,22 +728,18 @@ files = [ [[package]] name = "dnspython" -version = "2.4.0" +version = "2.4.2" description = "DNS toolkit" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "dnspython-2.4.0-py3-none-any.whl", hash = "sha256:46b4052a55b56beea3a3bdd7b30295c292bd6827dd442348bc116f2d35b17f0a"}, - {file = "dnspython-2.4.0.tar.gz", hash = "sha256:758e691dbb454d5ccf4e1b154a19e52847f79e21a42fef17b969144af29a4e6c"}, + {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, + {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, ] -[package.dependencies] -httpcore = {version = ">=0.17.3", markers = "python_version >= \"3.8\""} -sniffio = ">=1.1,<2.0" - [package.extras] dnssec = ["cryptography (>=2.6,<42.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.24.1)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] doq = ["aioquic (>=0.9.20)"] idna = ["idna (>=2.1,<4.0)"] trio = ["trio (>=0.14,<0.23)"] @@ -772,13 +769,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -818,13 +815,13 @@ dev = ["matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] [[package]] name = "fastjsonschema" -version = "2.17.1" +version = "2.18.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, - {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, + {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, + {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, ] [package.extras] @@ -1021,38 +1018,6 @@ files = [ docs = ["Sphinx", "docutils (<0.18)"] test = ["objgraph", "psutil"] -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "0.17.3" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = "==1.*" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - [[package]] name = "idna" version = "3.4" @@ -1096,13 +1061,13 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.0.0" +version = "6.0.1" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.0-py3-none-any.whl", hash = "sha256:d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185"}, - {file = "importlib_resources-6.0.0.tar.gz", hash = "sha256:4cf94875a8368bd89531a756df9a9ebe1f150e0f885030b461237bc7f2d905f2"}, + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, ] [package.dependencies] @@ -1114,13 +1079,13 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", [[package]] name = "ipykernel" -version = "6.24.0" +version = "6.25.1" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.24.0-py3-none-any.whl", hash = "sha256:2f5fffc7ad8f1fd5aadb4e171ba9129d9668dbafa374732cf9511ada52d6547f"}, - {file = "ipykernel-6.24.0.tar.gz", hash = "sha256:29cea0a716b1176d002a61d0b0c851f34536495bc4ef7dd0222c88b41b816123"}, + {file = "ipykernel-6.25.1-py3-none-any.whl", hash = "sha256:c8a2430b357073b37c76c21c52184db42f6b4b0e438e1eb7df3c4440d120497c"}, + {file = "ipykernel-6.25.1.tar.gz", hash = "sha256:050391364c0977e768e354bdb60cbbfbee7cbb943b1af1618382021136ffd42f"}, ] [package.dependencies] @@ -1197,17 +1162,17 @@ files = [ [[package]] name = "ipywidgets" -version = "8.0.7" +version = "8.1.0" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.0.7-py3-none-any.whl", hash = "sha256:e0aed0c95a1e55b6a123f64305245578bdc09e52965a34941c2b6a578b8c64a0"}, - {file = "ipywidgets-8.0.7.tar.gz", hash = "sha256:50ace0a8886e9a0d68b980db82f94c25d55d21ff2340ed36f802dd9365e94acf"}, + {file = "ipywidgets-8.1.0-py3-none-any.whl", hash = "sha256:6c8396cc7b8c95dfb4e9ab0054f48c002f045e7e5d7ae523f559d64e525a98ab"}, + {file = "ipywidgets-8.1.0.tar.gz", hash = "sha256:ce97dd90525b3066fd00094690964e7eac14cf9b7745d35565b5eeac20cce687"}, ] [package.dependencies] -ipykernel = ">=4.5.1" +comm = ">=0.1.3" ipython = ">=6.1.0" jupyterlab-widgets = ">=3.0.7,<3.1.0" traitlets = ">=4.3.1" @@ -1232,21 +1197,21 @@ arrow = ">=0.15.0" [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] @@ -1288,17 +1253,18 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] name = "jsonschema" -version = "4.18.4" +version = "4.19.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, - {file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"}, + {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, + {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, ] [package.dependencies] @@ -1453,19 +1419,20 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.6.3" +version = "0.7.0" description = "Jupyter Event System library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.6.3-py3-none-any.whl", hash = "sha256:57a2749f87ba387cd1bfd9b22a0875b889237dbf2edc2121ebb22bde47036c17"}, - {file = "jupyter_events-0.6.3.tar.gz", hash = "sha256:9a6e9995f75d1b7146b436ea24d696ce3a35bfa8bfe45e0c33c334c79464d0b3"}, + {file = "jupyter_events-0.7.0-py3-none-any.whl", hash = "sha256:4753da434c13a37c3f3c89b500afa0c0a6241633441421f6adafe2fb2e2b924e"}, + {file = "jupyter_events-0.7.0.tar.gz", hash = "sha256:7be27f54b8388c03eefea123a4f79247c5b9381c49fb1cd48615ee191eb12615"}, ] [package.dependencies] -jsonschema = {version = ">=3.2.0", extras = ["format-nongpl"]} +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} python-json-logger = ">=2.0.4" pyyaml = ">=5.3" +referencing = "*" rfc3339-validator = "*" rfc3986-validator = ">=0.1.1" traitlets = ">=5.3" @@ -1473,7 +1440,7 @@ traitlets = ">=5.3" [package.extras] cli = ["click", "rich"] docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "pytest-cov", "rich"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] [[package]] name = "jupyter-lsp" @@ -1492,13 +1459,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.7.0" +version = "2.7.2" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.7.0-py3-none-any.whl", hash = "sha256:6a77912aff643e53fa14bdb2634884b52b784a4be77ce8e93f7283faed0f0849"}, - {file = "jupyter_server-2.7.0.tar.gz", hash = "sha256:36da0a266d31a41ac335a366c88933c17dfa5bb817a48f5c02c16d303bc9477f"}, + {file = "jupyter_server-2.7.2-py3-none-any.whl", hash = "sha256:98a375347b580e837e7016007c24680a4261ed8ad7cd35196ac087d229f48e5a"}, + {file = "jupyter_server-2.7.2.tar.gz", hash = "sha256:d64fb4e593907290e5df916e3c9399c15ab2cd7bdb71cbcd1d36452dbfb30523"}, ] [package.dependencies] @@ -1516,7 +1483,7 @@ packaging = "*" prometheus-client = "*" pywinpty = {version = "*", markers = "os_name == \"nt\""} pyzmq = ">=24" -send2trash = "*" +send2trash = ">=1.8.2" terminado = ">=0.8.3" tornado = ">=6.2.0" traitlets = ">=5.6.0" @@ -1547,13 +1514,13 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", [[package]] name = "jupyterlab" -version = "4.0.3" +version = "4.0.5" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.3-py3-none-any.whl", hash = "sha256:d369944391b1d15f2d1f3cb965fb67352956279b2ae6f03ce7947a43940a8301"}, - {file = "jupyterlab-4.0.3.tar.gz", hash = "sha256:e14d1ce46a613028111d0d476a1d7d6b094003b7462bac669f5b478317abcb39"}, + {file = "jupyterlab-4.0.5-py3-none-any.whl", hash = "sha256:13b3a326e7b95d72746fe20dbe80ee1e71165d6905e01ceaf1320eb809cb1b47"}, + {file = "jupyterlab-4.0.5.tar.gz", hash = "sha256:de49deb75f9b9aec478ed04754cbefe9c5d22fd796a5783cdc65e212983d3611"}, ] [package.dependencies] @@ -1591,13 +1558,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.23.0" +version = "2.24.0" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_server-2.23.0-py3-none-any.whl", hash = "sha256:a5ea2c839336a8ba7c38c8e7b2f24cedf919f0d439f4d2e606d9322013a95788"}, - {file = "jupyterlab_server-2.23.0.tar.gz", hash = "sha256:83c01aa4ad9451cd61b383e634d939ff713850f4640c0056b2cdb2b6211a74c7"}, + {file = "jupyterlab_server-2.24.0-py3-none-any.whl", hash = "sha256:5f077e142bb8dc9b843d960f940c513581bceca3793a0d80f9c67d9522c4e876"}, + {file = "jupyterlab_server-2.24.0.tar.gz", hash = "sha256:4e6f99e0a5579bbbc32e449c4dbb039561d4f1a7827d5733273ed56738f21f07"}, ] [package.dependencies] @@ -1613,7 +1580,7 @@ requests = ">=2.28" [package.extras] docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] openapi = ["openapi-core (>=0.16.1,<0.17.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.6.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] +test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.7.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] [[package]] name = "jupyterlab-widgets" @@ -1628,7 +1595,7 @@ files = [ [[package]] name = "langchain" -version = "0.0.265" +version = "0.0.268" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" @@ -1642,7 +1609,6 @@ dataclasses-json = "^0.5.7" langsmith = "~0.0.21" numexpr = "^2.8.4" numpy = "^1" -openapi-schema-pydantic = "^1.2" pydantic = ">=1,<3" PyYAML = ">=5.3" requests = "^2" @@ -1656,9 +1622,9 @@ clarifai = ["clarifai (>=9.1.0)"] cohere = ["cohere (>=4,<5)"] docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["amazon-textract-caller (<2)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.0.7,<0.0.8)", "chardet (>=5.1.0,<6.0.0)", "esprima (>=4.0.1,<5.0.0)", "feedparser (>=6.0.10,<7.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "openai (>=0,<1)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +extended-testing = ["amazon-textract-caller (<2)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.0.7,<0.0.8)", "chardet (>=5.1.0,<6.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "openai (>=0,<1)", "openai (>=0,<1)", "openapi-schema-pydantic (>=1.2,<2.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] javascript = ["esprima (>=4.0.1,<5.0.0)"] -llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openllm (>=0.1.19)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] text-helpers = ["chardet (>=5.1.0,<6.0.0)"] @@ -1669,13 +1635,13 @@ url = "libs/langchain" [[package]] name = "langsmith" -version = "0.0.22" +version = "0.0.25" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.22-py3-none-any.whl", hash = "sha256:1bc94a2e5bfa355ca15d9e658c2c2d04c8cc45c61892a1be08a7c3b40f2fd3f4"}, - {file = "langsmith-0.0.22.tar.gz", hash = "sha256:5726c7841294db2a9e5863e20718878d16e28722bdaf3169a278ff3bda2f0be7"}, + {file = "langsmith-0.0.25-py3-none-any.whl", hash = "sha256:d595435ad21fa6077550d7c85472935d1e8241afa042c1e29287d2c95c3ed151"}, + {file = "langsmith-0.0.25.tar.gz", hash = "sha256:e728c398fc1adaa0ed8abeb21f6a92d7fb19fe3ab49d3911c22b03dfe25935d6"}, ] [package.dependencies] @@ -2057,13 +2023,13 @@ test = ["flaky", "ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "p [[package]] name = "nbconvert" -version = "7.7.2" +version = "7.7.4" description = "Converting Jupyter Notebooks" optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.7.2-py3-none-any.whl", hash = "sha256:25e0cf2b663ee0cd5a90afb6b2f2940bf1abe5cc5bc995b88c8156ca65fa7ede"}, - {file = "nbconvert-7.7.2.tar.gz", hash = "sha256:36d3e7bf32f0c075878176cdeeb645931c994cbed5b747bc7a570ba8cd2321f3"}, + {file = "nbconvert-7.7.4-py3-none-any.whl", hash = "sha256:ace26f4386d08eb5c55833596a942048c5502a95e05590cb523826a749a40a37"}, + {file = "nbconvert-7.7.4.tar.gz", hash = "sha256:1113d039fa3fc3a846ffa5a3b0a019e85aaa94c566a09fa0c400fb7638e46087"}, ] [package.dependencies] @@ -2139,13 +2105,13 @@ pip = "*" [[package]] name = "nbformat" -version = "5.9.1" +version = "5.9.2" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.1-py3-none-any.whl", hash = "sha256:b7968ebf4811178a4108ee837eae1442e3f054132100f0359219e9ed1ce3ca45"}, - {file = "nbformat-5.9.1.tar.gz", hash = "sha256:3a7f52d040639cbd8a3890218c8b0ffb93211588c57446c90095e32ba5881b5d"}, + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, ] [package.dependencies] @@ -2179,24 +2145,24 @@ traitlets = ">=5" [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.7" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, + {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, ] [[package]] name = "notebook" -version = "7.0.0" +version = "7.0.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.0.0-py3-none-any.whl", hash = "sha256:71b4e695e658763a2766613176491854708fb46fbe7664bf5e494deeeab92d60"}, - {file = "notebook-7.0.0.tar.gz", hash = "sha256:38b55e6939df0ba73b53212c3b234e41102f1789e0158606cedaebf00abef6c8"}, + {file = "notebook-7.0.2-py3-none-any.whl", hash = "sha256:c77b1499dc9b07ce4f4f26990dcb25b2107b434f2536766b51a72a4228d9a4b6"}, + {file = "notebook-7.0.2.tar.gz", hash = "sha256:d70d6a07418c829bd5f54337ce993b7105261d9026f9d3fe68e9b8aa1a20da9a"}, ] [package.dependencies] @@ -2231,41 +2197,41 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numexpr" -version = "2.8.4" +version = "2.8.5" description = "Fast numerical expression evaluator for NumPy" optional = false python-versions = ">=3.7" files = [ - {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, - {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, - {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, - {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, - {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, - {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, - {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, - {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, - {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, - {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, - {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, - {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, - {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, - {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, + {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, + {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, + {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, + {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, + {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, + {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, + {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, + {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, + {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, + {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, + {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, + {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, ] [package.dependencies] @@ -2326,29 +2292,15 @@ sphinx = ">=1.8" [package.extras] testing = ["matplotlib", "pytest", "pytest-cov"] -[[package]] -name = "openapi-schema-pydantic" -version = "1.2.4" -description = "OpenAPI (v3) specification schema as pydantic class" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "openapi-schema-pydantic-1.2.4.tar.gz", hash = "sha256:3e22cf58b74a69f752cc7e5f1537f6e44164282db2700cbbcd3bb99ddd065196"}, - {file = "openapi_schema_pydantic-1.2.4-py3-none-any.whl", hash = "sha256:a932ecc5dcbb308950282088956e94dea069c9823c84e507d64f6b622222098c"}, -] - -[package.dependencies] -pydantic = ">=1.8.2" - [[package]] name = "overrides" -version = "7.3.1" +version = "7.4.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" files = [ - {file = "overrides-7.3.1-py3-none-any.whl", hash = "sha256:6187d8710a935d09b0bcef8238301d6ee2569d2ac1ae0ec39a8c7924e27f58ca"}, - {file = "overrides-7.3.1.tar.gz", hash = "sha256:8b97c6c1e1681b78cbc9424b138d880f0803c2254c5ebaabdde57bb6c62093f2"}, + {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, + {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, ] [[package]] @@ -2390,13 +2342,13 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] @@ -2426,13 +2378,13 @@ files = [ [[package]] name = "pip" -version = "23.2" +version = "23.2.1" description = "The PyPA recommended tool for installing Python packages." optional = false python-versions = ">=3.7" files = [ - {file = "pip-23.2-py3-none-any.whl", hash = "sha256:78e5353a9dda374b462f2054f83a7b63f3f065c98236a68361845c1b0ee7e35f"}, - {file = "pip-23.2.tar.gz", hash = "sha256:a160a170f3331d9ca1a0247eb1cd79c758879f1f81158f9cd05bbb5df80bea5c"}, + {file = "pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be"}, + {file = "pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"}, ] [[package]] @@ -2448,18 +2400,18 @@ files = [ [[package]] name = "platformdirs" -version = "3.9.1" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, - {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "prometheus-client" @@ -2553,47 +2505,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.11" +version = "1.10.12" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, - {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, - {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, - {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, - {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, - {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, - {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, - {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, - {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, - {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, + {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, + {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, + {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, + {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, + {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, + {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, + {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, + {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, ] [package.dependencies] @@ -2628,13 +2580,13 @@ test = ["pydata-sphinx-theme[doc]", "pytest"] [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -2764,88 +2716,104 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.0" +version = "25.1.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, - {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, - {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, - {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, - {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, - {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, - {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, - {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, - {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, - {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, - {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, - {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, ] [package.dependencies] @@ -2896,13 +2864,13 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] name = "referencing" -version = "0.30.0" +version = "0.30.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.30.0-py3-none-any.whl", hash = "sha256:c257b08a399b6c2f5a3510a50d28ab5dbc7bbde049bcaf954d43c446f83ab548"}, - {file = "referencing-0.30.0.tar.gz", hash = "sha256:47237742e990457f7512c7d27486394a9aadaf876cbfaa4be65b27b4f4d47c6b"}, + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, ] [package.dependencies] @@ -3237,18 +3205,18 @@ themes = ["myst-parser (>=0.12.9,<0.13.0)", "pydata-sphinx-theme (>=0.4.0,<0.5.0 [[package]] name = "sphinx-rtd-theme" -version = "1.2.2" +version = "1.3.0" description = "Read the Docs theme for Sphinx" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "sphinx_rtd_theme-1.2.2-py2.py3-none-any.whl", hash = "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689"}, - {file = "sphinx_rtd_theme-1.2.2.tar.gz", hash = "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7"}, + {file = "sphinx_rtd_theme-1.3.0-py2.py3-none-any.whl", hash = "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0"}, + {file = "sphinx_rtd_theme-1.3.0.tar.gz", hash = "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931"}, ] [package.dependencies] docutils = "<0.19" -sphinx = ">=1.6,<7" +sphinx = ">=1.6,<8" sphinxcontrib-jquery = ">=4,<5" [package.extras] @@ -3373,52 +3341,52 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.19" +version = "2.0.20" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win32.whl", hash = "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win_amd64.whl", hash = "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win32.whl", hash = "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win_amd64.whl", hash = "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win32.whl", hash = "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win_amd64.whl", hash = "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win32.whl", hash = "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win_amd64.whl", hash = "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win32.whl", hash = "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win_amd64.whl", hash = "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0"}, - {file = "SQLAlchemy-2.0.19-py3-none-any.whl", hash = "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972"}, - {file = "SQLAlchemy-2.0.19.tar.gz", hash = "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759b51346aa388c2e606ee206c0bc6f15a5299f6174d1e10cadbe4530d3c7a98"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1506e988ebeaaf316f183da601f24eedd7452e163010ea63dbe52dc91c7fc70e"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5768c268df78bacbde166b48be788b83dddaa2a5974b8810af422ddfe68a9bc8"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3f0dd6d15b6dc8b28a838a5c48ced7455c3e1fb47b89da9c79cc2090b072a50"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:243d0fb261f80a26774829bc2cee71df3222587ac789b7eaf6555c5b15651eed"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6d77c31e1bf4268b4d61b549c341cbff9842f8e115ba6904249c20cb78a61"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win32.whl", hash = "sha256:bcb04441f370cbe6e37c2b8d79e4af9e4789f626c595899d94abebe8b38f9a4d"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win_amd64.whl", hash = "sha256:d32b5ffef6c5bcb452723a496bad2d4c52b346240c59b3e6dba279f6dcc06c14"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd81466bdbc82b060c3c110b2937ab65ace41dfa7b18681fdfad2f37f27acdd7"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fe7d61dc71119e21ddb0094ee994418c12f68c61b3d263ebaae50ea8399c4d4"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e571af672e1bb710b3cc1a9794b55bce1eae5aed41a608c0401885e3491179"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3364b7066b3c7f4437dd345d47271f1251e0cfb0aba67e785343cdbdb0fff08c"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1be86ccea0c965a1e8cd6ccf6884b924c319fcc85765f16c69f1ae7148eba64b"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1d35d49a972649b5080557c603110620a86aa11db350d7a7cb0f0a3f611948a0"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win32.whl", hash = "sha256:27d554ef5d12501898d88d255c54eef8414576f34672e02fe96d75908993cf53"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win_amd64.whl", hash = "sha256:411e7f140200c02c4b953b3dbd08351c9f9818d2bd591b56d0fa0716bd014f1e"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c6aceebbc47db04f2d779db03afeaa2c73ea3f8dcd3987eb9efdb987ffa09a3"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d3f175410a6db0ad96b10bfbb0a5530ecd4fcf1e2b5d83d968dd64791f810ed"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8186be85da6587456c9ddc7bf480ebad1a0e6dcbad3967c4821233a4d4df57"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3d99ba99007dab8233f635c32b5cd24fb1df8d64e17bc7df136cedbea427897"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:76fdfc0f6f5341987474ff48e7a66c3cd2b8a71ddda01fa82fedb180b961630a"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win32.whl", hash = "sha256:d3793dcf5bc4d74ae1e9db15121250c2da476e1af8e45a1d9a52b1513a393459"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win_amd64.whl", hash = "sha256:79fde625a0a55220d3624e64101ed68a059c1c1f126c74f08a42097a72ff66a9"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:599ccd23a7146e126be1c7632d1d47847fa9f333104d03325c4e15440fc7d927"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a58052b5a93425f656675673ef1f7e005a3b72e3f2c91b8acca1b27ccadf5f4"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79543f945be7a5ada9943d555cf9b1531cfea49241809dd1183701f94a748624"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63e73da7fb030ae0a46a9ffbeef7e892f5def4baf8064786d040d45c1d6d1dc5"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ce5e81b800a8afc870bb8e0a275d81957e16f8c4b62415a7b386f29a0cb9763"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb0d3e94c2a84215532d9bcf10229476ffd3b08f481c53754113b794afb62d14"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win32.whl", hash = "sha256:8dd77fd6648b677d7742d2c3cc105a66e2681cc5e5fb247b88c7a7b78351cf74"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win_amd64.whl", hash = "sha256:6f8a934f9dfdf762c844e5164046a9cea25fabbc9ec865c023fe7f300f11ca4a"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:26a3399eaf65e9ab2690c07bd5cf898b639e76903e0abad096cd609233ce5208"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4cde2e1096cbb3e62002efdb7050113aa5f01718035ba9f29f9d89c3758e7e4e"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b09ba72e4e6d341bb5bdd3564f1cea6095d4c3632e45dc69375a1dbe4e26ec"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b74eeafaa11372627ce94e4dc88a6751b2b4d263015b3523e2b1e57291102f0"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:77d37c1b4e64c926fa3de23e8244b964aab92963d0f74d98cbc0783a9e04f501"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eefebcc5c555803065128401a1e224a64607259b5eb907021bf9b175f315d2a6"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win32.whl", hash = "sha256:3423dc2a3b94125094897118b52bdf4d37daf142cbcf26d48af284b763ab90e9"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win_amd64.whl", hash = "sha256:5ed61e3463021763b853628aef8bc5d469fe12d95f82c74ef605049d810f3267"}, + {file = "SQLAlchemy-2.0.20-py3-none-any.whl", hash = "sha256:63a368231c53c93e2b67d0c5556a9836fdcd383f7e3026a39602aad775b14acf"}, + {file = "SQLAlchemy-2.0.20.tar.gz", hash = "sha256:ca8a5ff2aa7f3ade6c498aaafce25b1eaeabe4e42b73e25519183e4566a16fc6"}, ] [package.dependencies] @@ -3426,7 +3394,7 @@ greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or pl typing-extensions = ">=4.2.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] @@ -3484,13 +3452,13 @@ widechars = ["wcwidth"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -3536,13 +3504,13 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "tokenize-rt" -version = "5.1.0" +version = "5.2.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.8" files = [ - {file = "tokenize_rt-5.1.0-py2.py3-none-any.whl", hash = "sha256:9b7bb843e77dd6ed0be5564bfaaba200083911e0497841cd3e9235a6a9794d74"}, - {file = "tokenize_rt-5.1.0.tar.gz", hash = "sha256:08f0c2daa94c4052e53c2fcaa8e32585e6ae9bdfc800974092d031401694e002"}, + {file = "tokenize_rt-5.2.0-py2.py3-none-any.whl", hash = "sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289"}, + {file = "tokenize_rt-5.2.0.tar.gz", hash = "sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054"}, ] [[package]] @@ -3569,22 +3537,22 @@ files = [ [[package]] name = "tornado" -version = "6.3.2" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] [[package]] @@ -3698,17 +3666,17 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.1" +version = "1.6.2" description = "WebSocket client for Python with low level API options" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, - {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, + {file = "websocket-client-1.6.2.tar.gz", hash = "sha256:53e95c826bf800c4c465f50093a8c4ff091c7327023b10bfaff40cf1ef170eaa"}, + {file = "websocket_client-1.6.2-py3-none-any.whl", hash = "sha256:ce54f419dfae71f4bdba69ebe65bf7f0a93fe71bc009ad3a010aacc3eebad537"}, ] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] From 65e893b9cd179fe16ab06232420069c9486f9c34 Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 14:09:23 -0400 Subject: [PATCH 045/143] `poetry lock` on langchain. (#9476) --- libs/langchain/poetry.lock | 5045 +++++++++++++++++------------------- 1 file changed, 2440 insertions(+), 2605 deletions(-) diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index a0a76d097..3c72e227b 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "absl-py" version = "1.4.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -14,18 +13,17 @@ files = [ [[package]] name = "aioboto3" -version = "11.2.0" +version = "11.3.0" description = "Async boto3 wrapper" -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ - {file = "aioboto3-11.2.0-py3-none-any.whl", hash = "sha256:df4b83c3943b009a4dcd9f397f9f0491a374511b1ef37545082a771ca1e549fb"}, - {file = "aioboto3-11.2.0.tar.gz", hash = "sha256:c7f6234fd73efcb60ab6fca383fec33bb6352ca1832f252eac810cd6674f1748"}, + {file = "aioboto3-11.3.0-py3-none-any.whl", hash = "sha256:11e6df5bf317e0dfc1390a29fea9e9f3afd8be99bad2cc9719d2cf44080a16fb"}, + {file = "aioboto3-11.3.0.tar.gz", hash = "sha256:6f504ac312f62be5199033af97f51b20fac31df7f42c128d6643241c8e5741a9"}, ] [package.dependencies] -aiobotocore = {version = "2.5.0", extras = ["boto3"]} +aiobotocore = {version = "2.6.0", extras = ["boto3"]} [package.extras] chalice = ["chalice (>=1.24.0)"] @@ -33,32 +31,30 @@ s3cse = ["cryptography (>=2.3.1)"] [[package]] name = "aiobotocore" -version = "2.5.0" +version = "2.6.0" description = "Async client for aws services using botocore and aiohttp" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "aiobotocore-2.5.0-py3-none-any.whl", hash = "sha256:9a2a022d7b78ec9a2af0de589916d2721cddbf96264401b78d7a73c1a1435f3b"}, - {file = "aiobotocore-2.5.0.tar.gz", hash = "sha256:6a5b397cddd4f81026aa91a14c7dd2650727425740a5af8ba75127ff663faf67"}, + {file = "aiobotocore-2.6.0-py3-none-any.whl", hash = "sha256:0186e6a843364748cdbbf76ee98e9337c44f71a4e694ad1b110d5c516fbce909"}, + {file = "aiobotocore-2.6.0.tar.gz", hash = "sha256:4805d0140bdfa17bfc2d0ba1243c8cc4273e927201fca5cf2e497c0004a9fab7"}, ] [package.dependencies] -aiohttp = ">=3.3.1" -aioitertools = ">=0.5.1" -boto3 = {version = ">=1.26.76,<1.26.77", optional = true, markers = "extra == \"boto3\""} -botocore = ">=1.29.76,<1.29.77" -wrapt = ">=1.10.10" +aiohttp = ">=3.7.4.post0,<4.0.0" +aioitertools = ">=0.5.1,<1.0.0" +boto3 = {version = ">=1.28.17,<1.28.18", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.31.17,<1.31.18" +wrapt = ">=1.10.10,<2.0.0" [package.extras] -awscli = ["awscli (>=1.27.76,<1.27.77)"] -boto3 = ["boto3 (>=1.26.76,<1.26.77)"] +awscli = ["awscli (>=1.29.17,<1.29.18)"] +boto3 = ["boto3 (>=1.28.17,<1.28.18)"] [[package]] name = "aiodns" version = "3.0.0" description = "Simple DNS resolver for asyncio" -category = "main" optional = true python-versions = "*" files = [ @@ -71,111 +67,109 @@ pycares = ">=4.0.0" [[package]] name = "aiofiles" -version = "23.1.0" +version = "23.2.1" description = "File support for asyncio." -category = "main" optional = true -python-versions = ">=3.7,<4.0" +python-versions = ">=3.7" files = [ - {file = "aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2"}, - {file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"}, + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, ] [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.8.5" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, ] [package.dependencies] @@ -194,7 +188,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiohttp-retry" version = "2.8.3" description = "Simple retry client for aiohttp" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -209,7 +202,6 @@ aiohttp = "*" name = "aioitertools" version = "0.11.0" description = "itertools and builtins for AsyncIO and mixed iterables" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -224,7 +216,6 @@ typing_extensions = {version = ">=4.0", markers = "python_version < \"3.10\""} name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -239,7 +230,6 @@ frozenlist = ">=1.1.0" name = "aleph-alpha-client" version = "2.17.0" description = "python client to interact with Aleph Alpha api endpoints" -category = "main" optional = true python-versions = "*" files = [ @@ -267,7 +257,6 @@ types = ["mypy", "types-Pillow", "types-requests"] name = "altair" version = "4.2.2" description = "Altair: A declarative statistical visualization library for Python." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -290,7 +279,6 @@ dev = ["black", "docutils", "flake8", "ipython", "m2r", "mistune (<2.0.0)", "pyt name = "amadeus" version = "8.1.0" description = "Python module for the Amadeus travel APIs" -category = "main" optional = true python-versions = ">=3.4.8" files = [ @@ -301,7 +289,6 @@ files = [ name = "amazon-textract-caller" version = "0.0.29" description = "Amazon Textract Caller tools" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -321,7 +308,6 @@ testing = ["amazon-textract-response-parser", "pytest"] name = "amazon-textract-response-parser" version = "1.0.0" description = "Easily parse JSON returned by Amazon Textract." -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -335,14 +321,13 @@ marshmallow = ">=3.14,<4" [[package]] name = "anyio" -version = "3.7.0" +version = "3.7.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, - {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, ] [package.dependencies] @@ -351,27 +336,14 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (<0.22)"] -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = true -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - [[package]] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -381,29 +353,28 @@ files = [ [[package]] name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." -category = "dev" +version = "23.1.0" +description = "Argon2 for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, - {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, ] [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] -docs = ["furo", "sphinx", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] [[package]] name = "argon2-cffi-bindings" version = "21.2.0" description = "Low-level CFFI bindings for Argon2" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -441,7 +412,6 @@ tests = ["pytest"] name = "arrow" version = "1.2.3" description = "Better dates & times for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -454,14 +424,13 @@ python-dateutil = ">=2.7.0" [[package]] name = "arxiv" -version = "1.4.7" +version = "1.4.8" description = "Python wrapper for the arXiv API: http://arxiv.org/help/api/" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "arxiv-1.4.7-py3-none-any.whl", hash = "sha256:22b8f610957bb6859a25fac9dc205ab6ba76d521791119a5762ea52625e398a0"}, - {file = "arxiv-1.4.7.tar.gz", hash = "sha256:100c8d6b9cd04c7f55f11b34616beb7a1623ab0564b66161b4aeeeb8912c5806"}, + {file = "arxiv-1.4.8-py3-none-any.whl", hash = "sha256:c3dbef0fb7ed85c9b4c2157b40a62f5a04ce0d2f63c3ff7caa7798abf6166378"}, + {file = "arxiv-1.4.8.tar.gz", hash = "sha256:2a818ea749eaa62a6e24fc31d53b769b4d33ff55cfc5dda7c7b7d309a3b29373"}, ] [package.dependencies] @@ -471,7 +440,6 @@ feedparser = "*" name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -489,7 +457,6 @@ test = ["astroid", "pytest"] name = "astunparse" version = "1.6.3" description = "An AST unparser for Python" -category = "main" optional = true python-versions = "*" files = [ @@ -502,43 +469,66 @@ six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" [[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "atlassian-python-api" -version = "3.39.0" +version = "3.41.0" description = "Python Atlassian REST API Wrapper" -category = "main" optional = true python-versions = "*" files = [ - {file = "atlassian-python-api-3.39.0.tar.gz", hash = "sha256:69c556b2485224fdc8b4ff1c071d68c81de6c65526a418fb81d99cc34a5d288c"}, + {file = "atlassian-python-api-3.41.0.tar.gz", hash = "sha256:3ac7dc4b7840fc96f6a22dede9326c810727c261f0ef8986764c6f4f3040058f"}, + {file = "atlassian_python_api-3.41.0-py3-none-any.whl", hash = "sha256:af4e34c0b92f49e742eedbc14b9b38855242ab61e65d4dc4d77c929cda842190"}, ] [package.dependencies] deprecated = "*" oauthlib = "*" requests = "*" -requests_oauthlib = "*" +requests-oauthlib = "*" six = "*" [package.extras] kerberos = ["requests-kerberos"] +[[package]] +name = "attr" +version = "0.3.2" +description = "Simple decorator to set attributes of target function or class in a DRY way." +optional = true +python-versions = "*" +files = [ + {file = "attr-0.3.2-py2.py3-none-any.whl", hash = "sha256:4f4bffeea8c27387bde446675a7ac24f3b8fea1075f12d849b5f5c5181fc8336"}, + {file = "attr-0.3.2.tar.gz", hash = "sha256:1ceebca768181cdcce9827611b1d728e592be5d293911539ea3d0b0bfa1146f4"}, +] + [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -557,7 +547,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "audioread" version = "3.0.0" description = "multi-library, cross-platform audio decoding" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -566,14 +555,13 @@ files = [ [[package]] name = "authlib" -version = "1.2.0" +version = "1.2.1" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." -category = "main" optional = true python-versions = "*" files = [ - {file = "Authlib-1.2.0-py2.py3-none-any.whl", hash = "sha256:4ddf4fd6cfa75c9a460b361d4bd9dac71ffda0be879dbe4292a02e92349ad55a"}, - {file = "Authlib-1.2.0.tar.gz", hash = "sha256:4fa3e80883a5915ef9f5bc28630564bc4ed5b5af39812a3ff130ec76bd631e9d"}, + {file = "Authlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:c88984ea00149a90e3537c964327da930779afa4564e354edfd98410bea01911"}, + {file = "Authlib-1.2.1.tar.gz", hash = "sha256:421f7c6b468d907ca2d9afede256f068f87e34d23dd221c07d13d4c234726afb"}, ] [package.dependencies] @@ -581,27 +569,25 @@ cryptography = ">=3.2" [[package]] name = "awadb" -version = "0.3.9" +version = "0.3.10" description = "AI Native database for embedding vectors" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "awadb-0.3.9-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:8a3f88f9b4426f1c588752a5af89f2daa52b4faf5fe25046f9bfcaa8d8201298"}, - {file = "awadb-0.3.9-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:1d7fa3a75fcdd81d486a5254237234058d772cb70478c2f197ee9560a3596813"}, - {file = "awadb-0.3.9-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8276b5ee5dddc48c2e111253231d64a12684bf10971c44dd5bc01ea737fdffdc"}, - {file = "awadb-0.3.9-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:9c770aa9f9f17852e8cb3e78e1d3677b2c4ffda817889cf23935b3147c94a013"}, - {file = "awadb-0.3.9-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:0abaf08b1accd5b58296a13143eab2f55c576c00d896b692f8a2846bfbb33be9"}, - {file = "awadb-0.3.9-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:ac6d34a6688b6daf412a859ffd85b5c18a30d25d267074dcdbc176a005fc5db2"}, - {file = "awadb-0.3.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:151ae39f9b74a032f86a4cde7399cb5c1bdd796e995de550ae3583ddd1e45884"}, - {file = "awadb-0.3.9-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:1f62bf20c0824ad57711c4898d96b74d7f083cb129b11455f36e64850fe6a064"}, - {file = "awadb-0.3.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3b78e0a3a87ae60242dc9d07eba12f7c455838e6c9afb22fc68c75b510f27614"}, - {file = "awadb-0.3.9-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:51ca452327011cf97aa6a7316e39c7cda5c537c5a8cbbbd28a5f0f1394499845"}, - {file = "awadb-0.3.9-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:5b816916b0d61aace79b0ed0cd0bdc4b35bfc5299a095ba6e2bb350d8f485860"}, - {file = "awadb-0.3.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:608472fcc694e298b4ff920e4e6da502d5314b6441637f608869dc6d4af627db"}, - {file = "awadb-0.3.9-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:50f1ab8cf92cd714ef57dd2c496b9e65003fb531295b8f99cd89b7575578d382"}, - {file = "awadb-0.3.9-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:911b78156cb3c0e723317c622a1d3cabcaea771f464200b30709bbb4143eb8a8"}, - {file = "awadb-0.3.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:330440be36f18e3f02cb645465618fd2a425b3260f2f645d7065d9f93857cf11"}, + {file = "awadb-0.3.10-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:1149b1c6fee95bd6e0f7ff625de060db679ea3985cad2332028eb50a76b9726e"}, + {file = "awadb-0.3.10-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:a447894ed721184a680566ac8584154d6801d1f99e98996c1d4bd198c022aa07"}, + {file = "awadb-0.3.10-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:ab21a90930f58e666a6874618813cc32a93b1e2fd4e66901c9e5392844165034"}, + {file = "awadb-0.3.10-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:bfa1b64dfb9b77710180be9b2971afa6e19608bad54460b819131c2d24efa4f4"}, + {file = "awadb-0.3.10-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:45a3094119ca3ee1a04abf23a9c22a14bb06cd938a128b28de423031b471787f"}, + {file = "awadb-0.3.10-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:5a8f532621e4e551cdf4ccf0fcfb3a31d3be4d4fe262b26ba7bd7ff769722c9c"}, + {file = "awadb-0.3.10-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:52480a9589e564fb03f504fb2eb26a27fcf552129725fd25a458b0db7d56fde5"}, + {file = "awadb-0.3.10-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d38a1fb571a6e708218c00ec08ffc2b136f9eba8d4308f3d8ed1a3dc89fcdef6"}, + {file = "awadb-0.3.10-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:d0e9f2ecb943ea6ba3ccbb849ef79f814fd59efee7d4c698a5220bc3ce308457"}, + {file = "awadb-0.3.10-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:fb4ab07c75bc3a92be9db2241551f60d705b18bcd48af95d57977084477647d9"}, + {file = "awadb-0.3.10-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:157a1f64e8ad3a28cc7cc5a22d39d0703121b1088db46d02adae23ea41a0346c"}, + {file = "awadb-0.3.10-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:afad9bec8a0b183de77210cff12fef7d61f8f524cdfd6c0f4c440f7fea763e30"}, + {file = "awadb-0.3.10-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:71c084197abff80addf3568457a561df54db4bcaf13244f98b68d5fb32d9c2b0"}, + {file = "awadb-0.3.10-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cc9212d8ab743331329b225a594eaa64918e32a06046373bc07821f8e9aa423e"}, ] [package.extras] @@ -609,14 +595,13 @@ test = ["pytest (>=6.0)"] [[package]] name = "azure-ai-formrecognizer" -version = "3.2.1" +version = "3.3.0" description = "Microsoft Azure Form Recognizer Client Library for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "azure-ai-formrecognizer-3.2.1.zip", hash = "sha256:5768765f9720ce87038f56afe0c0b5259192cfb29c840a39595b1e26e4ddfa32"}, - {file = "azure_ai_formrecognizer-3.2.1-py3-none-any.whl", hash = "sha256:4db43b9dd0a2bc5296b752c04dbacb838ae2b8726adfe7cf277c2ea34e99419a"}, + {file = "azure-ai-formrecognizer-3.3.0.zip", hash = "sha256:154b0c5e43d9ca4b8410ff36578723b8811774aee33ce7cfb4dc200ac42f31b5"}, + {file = "azure_ai_formrecognizer-3.3.0-py3-none-any.whl", hash = "sha256:62cf7ec9b109f87a0b3a0277750382cbbe5dcbd911a600bcf580a7ae1c181c71"}, ] [package.dependencies] @@ -629,7 +614,6 @@ typing-extensions = ">=4.0.1" name = "azure-ai-vision" version = "0.11.1b1" description = "Microsoft Azure AI Vision SDK for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -639,25 +623,23 @@ files = [ [[package]] name = "azure-cognitiveservices-speech" -version = "1.29.0" +version = "1.31.0" description = "Microsoft Cognitive Services Speech SDK for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:1beda741dd6e49564e9d970c606f1ea7e007969069842b19327abce119175774"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b189c4248b4adf69fc563abe30780c8f09bad6200414bb2b765abe2d44ed8c96"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:e9474e3ea19ed44f80c2aa7bc1c5c5e9711c5dbdf0662cb2eec31ff7821dbfa8"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cea4984bd3fa582c41ba8ec79cd37f55380bb386e09ca155ae2aac343c8bdac5"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-win32.whl", hash = "sha256:7cdc010e4a4586e78d3a265931520ca0422eed8145d37a7dd1e448e437945e08"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-win_amd64.whl", hash = "sha256:cdba9d39fd9e7ee7cf49c54e8a3ba2b217469219b3a35cb3c993f32ca00d217c"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:43818484c5b0e0f2f22bb47fef5fea32cec779c08eefd7a501d5ae240ce0bd3f"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4684046eb04f17484db768b1de058b0b5a65f7e40c016c0e187247c8c8c9b029"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:8d82aa933677b528fbe0605b9a0ab1f7aa5f09d4aadd48fb21473ba2dfeec614"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0d4a6952d24a32eecec70dd063ba401a1aa6ee72d70c2cc2343bd60741494b67"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win32.whl", hash = "sha256:3dfe69185f910208099c9e635e52de7e846928c6d0dda526b26ef3c1ed8ee62e"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win_amd64.whl", hash = "sha256:39940875d651999e0b60caef20adc9798951a675eece4f5e4fb03bcb77ddef03"}, ] [[package]] name = "azure-common" version = "1.1.28" description = "Microsoft Azure Client Library for Python (Common)" -category = "main" optional = true python-versions = "*" files = [ @@ -667,14 +649,13 @@ files = [ [[package]] name = "azure-core" -version = "1.27.1" +version = "1.29.1" description = "Microsoft Azure Core Library for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "azure-core-1.27.1.zip", hash = "sha256:5975c20808fa388243f01a8b79021bfbe114f503a27c543f002c5fc8bbdd73dd"}, - {file = "azure_core-1.27.1-py3-none-any.whl", hash = "sha256:1b4b19f455eb7b4332c6f92adc2c669353ded07c2722eb436165f0c253737792"}, + {file = "azure-core-1.29.1.zip", hash = "sha256:68e5bb6e3a3230ec202001cc5cb88e57f11c441c8345e921a9ffb8c370abf936"}, + {file = "azure_core-1.29.1-py3-none-any.whl", hash = "sha256:6bcefa1f70ff7bf3c39c07c73d8a21df73288eff7e6a1031eb8cfae71cc7bed4"}, ] [package.dependencies] @@ -687,14 +668,13 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-cosmos" -version = "4.4.0" +version = "4.5.0" description = "Microsoft Azure Cosmos Client Library for Python" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "azure-cosmos-4.4.0.zip", hash = "sha256:4c6785489704f037aa67f725c41eef850f693d99eb6ea3ec49f785a1e35ab021"}, - {file = "azure_cosmos-4.4.0-py3-none-any.whl", hash = "sha256:5ba74668a77f69e60ac7d11e755be7d5d4852ec03482c0a625d221eb10be5de2"}, + {file = "azure-cosmos-4.5.0.zip", hash = "sha256:621af88e16de1464e7ced27e9a719da93c2226863efd839bc5b33c3df9cb3118"}, + {file = "azure_cosmos-4.5.0-py3-none-any.whl", hash = "sha256:c7c6633f047f36fd490dbf1e106bf9d762bfdcf3c9b6206dd8efe5d9e2f2980a"}, ] [package.dependencies] @@ -702,14 +682,13 @@ azure-core = ">=1.23.0,<2.0.0" [[package]] name = "azure-identity" -version = "1.13.0" +version = "1.14.0" description = "Microsoft Azure Identity Library for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "azure-identity-1.13.0.zip", hash = "sha256:c931c27301ffa86b07b4dcf574e29da73e3deba9ab5d1fe4f445bb6a3117e260"}, - {file = "azure_identity-1.13.0-py3-none-any.whl", hash = "sha256:bd700cebb80cd9862098587c29d8677e819beca33c62568ced6d5a8e5e332b82"}, + {file = "azure-identity-1.14.0.zip", hash = "sha256:72441799f8c5c89bfe21026965e266672a7c5d050c2c65119ef899dd5362e2b1"}, + {file = "azure_identity-1.14.0-py3-none-any.whl", hash = "sha256:edabf0e010eb85760e1dd19424d5e8f97ba2c9caff73a16e7b30ccbdbcce369b"}, ] [package.dependencies] @@ -717,13 +696,11 @@ azure-core = ">=1.11.0,<2.0.0" cryptography = ">=2.5" msal = ">=1.20.0,<2.0.0" msal-extensions = ">=0.3.0,<2.0.0" -six = ">=1.12.0" [[package]] name = "azure-search-documents" version = "11.4.0b6" description = "Microsoft Azure Cognitive Search Client Library for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -736,11 +713,24 @@ azure-common = ">=1.1,<2.0" azure-core = ">=1.24.0,<2.0.0" isodate = ">=0.6.0" +[[package]] +name = "babel" +version = "2.12.1" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] + +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + [[package]] name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -752,7 +742,6 @@ files = [ name = "backoff" version = "2.2.1" description = "Function decoration for backoff and retry" -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ @@ -764,7 +753,6 @@ files = [ name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -793,7 +781,6 @@ tzdata = ["tzdata"] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -812,7 +799,6 @@ lxml = ["lxml"] name = "bibtexparser" version = "1.4.0" description = "Bibtex parser for python 3" -category = "main" optional = true python-versions = "*" files = [ @@ -824,37 +810,33 @@ pyparsing = ">=2.0.3" [[package]] name = "black" -version = "23.3.0" +version = "23.7.0" description = "The uncompromising code formatter." -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, + {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, + {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, + {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, + {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, + {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, + {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, ] [package.dependencies] @@ -876,7 +858,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -895,7 +876,6 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] name = "blinker" version = "1.6.2" description = "Fast, simple object-to-object and broadcast signaling" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -905,18 +885,17 @@ files = [ [[package]] name = "boto3" -version = "1.26.76" +version = "1.28.17" description = "The AWS SDK for Python" -category = "main" optional = true python-versions = ">= 3.7" files = [ - {file = "boto3-1.26.76-py3-none-any.whl", hash = "sha256:b4c2969b7677762914394b8273cc1905dfe5b71f250741c1a575487ae357e729"}, - {file = "boto3-1.26.76.tar.gz", hash = "sha256:30c7d967ed1c6b5a05643e42cae9d4d36c3f1cb6782637ddc7007a104cfd9027"}, + {file = "boto3-1.28.17-py3-none-any.whl", hash = "sha256:bca0526f819e0f19c0f1e6eba3e2d1d6b6a92a45129f98c0d716e5aab6d9444b"}, + {file = "boto3-1.28.17.tar.gz", hash = "sha256:90f7cfb5e1821af95b1fc084bc50e6c47fa3edc99f32de1a2591faa0c546bea7"}, ] [package.dependencies] -botocore = ">=1.29.76,<1.30.0" +botocore = ">=1.31.17,<1.32.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.6.0,<0.7.0" @@ -925,14 +904,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.76" +version = "1.31.17" description = "Low-level, data-driven core of boto 3." -category = "main" optional = true python-versions = ">= 3.7" files = [ - {file = "botocore-1.29.76-py3-none-any.whl", hash = "sha256:70735b00cd529f152992231ca6757e458e5ec25db43767b3526e9a35b2f143b7"}, - {file = "botocore-1.29.76.tar.gz", hash = "sha256:c2f67b6b3f8acf2968eafca06526f07b9fb0d27bac4c68a635d51abb675134a7"}, + {file = "botocore-1.31.17-py3-none-any.whl", hash = "sha256:6ac34a1d34aa3750e78b77b8596617e2bab938964694d651939dba2cbde2c12b"}, + {file = "botocore-1.31.17.tar.gz", hash = "sha256:396459065dba4339eb4da4ec8b4e6599728eb89b7caaceea199e26f7d824a41c"}, ] [package.dependencies] @@ -941,13 +919,12 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = ">=1.25.4,<1.27" [package.extras] -crt = ["awscrt (==0.16.9)"] +crt = ["awscrt (==0.16.26)"] [[package]] name = "brotli" version = "1.0.9" description = "Python bindings for the Brotli compression library" -category = "main" optional = true python-versions = "*" files = [ @@ -1039,7 +1016,6 @@ files = [ name = "brotlicffi" version = "1.0.9.2" description = "Python CFFI bindings to the Brotli library" -category = "main" optional = true python-versions = "*" files = [ @@ -1082,7 +1058,6 @@ cffi = ">=1.0.0" name = "build" version = "0.10.0" description = "A simple, correct Python build frontend" -category = "main" optional = true python-versions = ">= 3.7" files = [ @@ -1106,7 +1081,6 @@ virtualenv = ["virtualenv (>=20.0.35)"] name = "cachetools" version = "5.3.1" description = "Extensible memoizing collections and decorators" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1118,7 +1092,6 @@ files = [ name = "cassandra-driver" version = "3.28.0" description = "DataStax Driver for Apache Cassandra" -category = "main" optional = false python-versions = "*" files = [ @@ -1170,7 +1143,6 @@ graph = ["gremlinpython (==3.4.6)"] name = "cassio" version = "0.0.7" description = "A framework-agnostic Python library to seamlessly integrate Apache Cassandra with ML/LLM/genAI workloads." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1184,21 +1156,19 @@ numpy = ">=1.0" [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -1273,21 +1243,19 @@ pycparser = "*" [[package]] name = "chardet" -version = "5.1.0" +version = "5.2.0" description = "Universal encoding detector for Python 3" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, - {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, ] [[package]] name = "charset-normalizer" version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -1370,47 +1338,46 @@ files = [ [[package]] name = "clarifai" -version = "9.1.0" +version = "9.7.1" description = "Clarifai Python Utilities" -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "clarifai-9.1.0-py3-none-any.whl", hash = "sha256:a22b6c34d18067eb6902111bdbd9627dc2b72b743ac50b3f3178dc7663016003"}, - {file = "clarifai-9.1.0.tar.gz", hash = "sha256:f6e65fd81a810c4063f23a066ded68306423da1be0bbf61b32c5ef01214f607f"}, + {file = "clarifai-9.7.1-py3-none-any.whl", hash = "sha256:8e2e8f1b0af7d037ea037b8f2e80fbeb09da7f532d74b0e19002d544a6e75565"}, + {file = "clarifai-9.7.1.tar.gz", hash = "sha256:eca48161f4080b18b665a4cddc11a97c631b5ee0e1fceee018d7a7f225739686"}, ] [package.dependencies] -clarifai-grpc = ">=9.1.0" +clarifai-grpc = ">=9.7.1" +packaging = "*" +tritonclient = "2.34.0" [[package]] name = "clarifai-grpc" -version = "9.1.1" +version = "9.7.3" description = "Clarifai gRPC API Client" -category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "clarifai-grpc-9.1.1.tar.gz", hash = "sha256:d347b64f8d8dcf4dee1c51c5eced3c3f489e3be595ca4c8374323fdf934bae57"}, - {file = "clarifai_grpc-9.1.1-py3-none-any.whl", hash = "sha256:84a49e3d4fa57937ab38fb365c535a8ae255acac4666134d188f5dbe10e865ba"}, + {file = "clarifai-grpc-9.7.3.tar.gz", hash = "sha256:c52f699977ada941b573ecccfb831d397a990589bc261e7988e616be91740701"}, + {file = "clarifai_grpc-9.7.3-py3-none-any.whl", hash = "sha256:5020cac4fd128411a10a91457f74378763cdb5593571e77e0e6db9f5027e65aa"}, ] [package.dependencies] googleapis-common-protos = ">=1.53.0" grpcio = ">=1.44.0" -protobuf = ">=3.12" +protobuf = ">=3.20.3" requests = ">=2.25.1" [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -1420,7 +1387,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-plugins" version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" optional = true python-versions = "*" files = [ @@ -1438,7 +1404,6 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] name = "clickhouse-connect" version = "0.5.25" description = "ClickHouse core driver, SqlAlchemy, and Superset libraries" -category = "main" optional = true python-versions = "~=3.7" files = [ @@ -1528,7 +1493,6 @@ superset = ["apache-superset (>=1.4.1)"] name = "cligj" version = "0.7.2" description = "Click params for commmand line interfaces to GeoJSON" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" files = [ @@ -1546,7 +1510,6 @@ test = ["pytest-cov"] name = "codespell" version = "2.2.5" description = "Codespell" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1562,20 +1525,19 @@ types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency [[package]] name = "cohere" -version = "4.18.0" +version = "4.21" description = "" -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ - {file = "cohere-4.18.0-py3-none-any.whl", hash = "sha256:26b5be3f93c0046be7fd89b2e724190e10f9fceac8bcf8f22581368a1f3af2e4"}, - {file = "cohere-4.18.0.tar.gz", hash = "sha256:ed3d5703384412312fd827e669364b2f0eb3678a1206987cb3e1d98b88409c31"}, + {file = "cohere-4.21-py3-none-any.whl", hash = "sha256:5eb81db62e78b3156e734421cc3e657054f9d9f1d68b9f38cf48fe3a8ae40dbc"}, + {file = "cohere-4.21.tar.gz", hash = "sha256:f611438f409dfc5d5a0a153a585349f5a80b169c7102b5994d9999ecf8440866"}, ] [package.dependencies] aiohttp = ">=3.0,<4.0" backoff = ">=2.0,<3.0" -fastavro = "1.7.4" +fastavro = {version = "1.8.2", markers = "python_version >= \"3.8\""} importlib_metadata = ">=6.0,<7.0" requests = ">=2.25.0,<3.0.0" urllib3 = ">=1.26,<3" @@ -1584,7 +1546,6 @@ urllib3 = ">=1.26,<3" name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -1596,7 +1557,6 @@ files = [ name = "colored" version = "1.4.4" description = "Simple library for color and formatting to terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -1605,18 +1565,17 @@ files = [ [[package]] name = "comm" -version = "0.1.3" +version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] @@ -1625,72 +1584,63 @@ typing = ["mypy (>=0.990)"] [[package]] name = "coverage" -version = "7.2.7" +version = "7.3.0" description = "Code coverage measurement for Python" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "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"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "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"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "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"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "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"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "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"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "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"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, + {file = "coverage-7.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5"}, + {file = "coverage-7.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51"}, + {file = "coverage-7.3.0-cp310-cp310-win32.whl", hash = "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527"}, + {file = "coverage-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f"}, + {file = "coverage-7.3.0-cp311-cp311-win32.whl", hash = "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482"}, + {file = "coverage-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b"}, + {file = "coverage-7.3.0-cp312-cp312-win32.whl", hash = "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321"}, + {file = "coverage-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985"}, + {file = "coverage-7.3.0-cp38-cp38-win32.whl", hash = "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9"}, + {file = "coverage-7.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54"}, + {file = "coverage-7.3.0-cp39-cp39-win32.whl", hash = "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3"}, + {file = "coverage-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e"}, + {file = "coverage-7.3.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0"}, + {file = "coverage-7.3.0.tar.gz", hash = "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865"}, ] [package.dependencies] @@ -1701,31 +1651,34 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "41.0.1" +version = "41.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, - {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, - {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, - {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, + {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, + {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, + {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, ] [package.dependencies] @@ -1745,7 +1698,6 @@ test-randomorder = ["pytest-randomly"] name = "cssselect" version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1755,14 +1707,13 @@ files = [ [[package]] name = "dataclasses-json" -version = "0.5.8" +version = "0.5.9" description = "Easily serialize dataclasses to and from JSON" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "dataclasses-json-0.5.8.tar.gz", hash = "sha256:6572ac08ad9340abcb74fd8c4c8e9752db2a182a402c8e871d0a8aa119e3804e"}, - {file = "dataclasses_json-0.5.8-py3-none-any.whl", hash = "sha256:65b167c15fdf9bde27569c09ac18dd39bf1cc5b7998525024cb4678d2653946c"}, + {file = "dataclasses-json-0.5.9.tar.gz", hash = "sha256:e9ac87b73edc0141aafbce02b44e93553c3123ad574958f0fe52a534b6707e8e"}, + {file = "dataclasses_json-0.5.9-py3-none-any.whl", hash = "sha256:1280542631df1c375b7bc92e5b86d39e06c44760d7e3571a537b3b8acabf2f0c"}, ] [package.dependencies] @@ -1771,41 +1722,39 @@ marshmallow-enum = ">=1.5.1,<2.0.0" typing-inspect = ">=0.4.0" [package.extras] -dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=7.2.0)", "simplejson", "types-dataclasses"] +dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=7.2.0)", "setuptools", "simplejson", "twine", "types-dataclasses", "wheel"] [[package]] name = "debugpy" -version = "1.6.7" +version = "1.6.7.post1" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, + {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, + {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, ] [[package]] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1815,13 +1764,12 @@ files = [ [[package]] name = "deeplake" -version = "3.6.11" +version = "3.6.19" description = "Activeloop Deep Lake" -category = "main" optional = true python-versions = "*" files = [ - {file = "deeplake-3.6.11.tar.gz", hash = "sha256:97e22aa56e0a48dc935597f46a6f968393a4f95e799fa1df8bc7997231a40892"}, + {file = "deeplake-3.6.19.tar.gz", hash = "sha256:6619af93caa338e906d1d9ea3964f312ec5cf2f1b45512b8a877eb741c9740a8"}, ] [package.dependencies] @@ -1838,12 +1786,12 @@ pyjwt = "*" tqdm = "*" [package.extras] -all = ["IPython", "av (>=8.1.0)", "azure-cli", "azure-identity", "azure-storage-blob", "flask", "google-api-python-client (>=2.31.0,<2.32.0)", "google-auth (>=2.0.1,<2.1.0)", "google-auth-oauthlib (>=0.4.5,<0.5.0)", "google-cloud-storage (>=1.42.0,<1.43.0)", "laspy", "libdeeplake (==0.0.60)", "nibabel", "oauth2client (>=4.1.3,<4.2.0)", "pydicom"] +all = ["IPython", "av (>=8.1.0)", "azure-cli", "azure-identity", "azure-storage-blob", "flask", "google-api-python-client (>=2.31.0,<2.32.0)", "google-auth (>=2.0.1,<2.1.0)", "google-auth-oauthlib (>=0.4.5,<0.5.0)", "google-cloud-storage (>=1.42.0,<1.43.0)", "laspy", "libdeeplake (==0.0.68)", "nibabel", "oauth2client (>=4.1.3,<4.2.0)", "pydicom"] audio = ["av (>=8.1.0)"] av = ["av (>=8.1.0)"] azure = ["azure-cli", "azure-identity", "azure-storage-blob"] dicom = ["nibabel", "pydicom"] -enterprise = ["libdeeplake (==0.0.60)", "pyjwt"] +enterprise = ["libdeeplake (==0.0.68)", "pyjwt"] gcp = ["google-auth (>=2.0.1,<2.1.0)", "google-auth-oauthlib (>=0.4.5,<0.5.0)", "google-cloud-storage (>=1.42.0,<1.43.0)"] gdrive = ["google-api-python-client (>=2.31.0,<2.32.0)", "google-auth (>=2.0.1,<2.1.0)", "google-auth-oauthlib (>=0.4.5,<0.5.0)", "oauth2client (>=4.1.3,<4.2.0)"] medical = ["nibabel", "pydicom"] @@ -1855,7 +1803,6 @@ visualizer = ["IPython", "flask"] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1867,7 +1814,6 @@ files = [ name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1885,7 +1831,6 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] name = "deprecation" version = "2.1.0" description = "A library to handle automated deprecations" -category = "main" optional = true python-versions = "*" files = [ @@ -1898,14 +1843,13 @@ packaging = "*" [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" -category = "main" +version = "0.3.7" +description = "serialize all of Python" optional = true python-versions = ">=3.7" files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, ] [package.extras] @@ -1913,20 +1857,18 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "dnspython" -version = "2.3.0" +version = "2.4.2" description = "DNS toolkit" -category = "main" optional = true -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, - {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, + {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, + {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, ] [package.extras] -curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] -dnssec = ["cryptography (>=2.6,<40.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +dnssec = ["cryptography (>=2.6,<42.0)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] doq = ["aioquic (>=0.9.20)"] idna = ["idna (>=2.1,<4.0)"] trio = ["trio (>=0.14,<0.23)"] @@ -1936,7 +1878,6 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"] name = "docarray" version = "0.32.1" description = "The data structure for multimodal data" -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ @@ -1975,7 +1916,6 @@ web = ["fastapi (>=0.87.0)"] name = "docker" version = "6.1.3" description = "A Python library for the Docker Engine API." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1997,7 +1937,6 @@ ssh = ["paramiko (>=2.4.3)"] name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "main" optional = true python-versions = "*" files = [ @@ -2008,7 +1947,6 @@ files = [ name = "duckdb" version = "0.8.1" description = "DuckDB embedded database" -category = "dev" optional = false python-versions = "*" files = [ @@ -2070,7 +2008,6 @@ files = [ name = "duckdb-engine" version = "0.7.3" description = "SQLAlchemy driver for duckdb" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2085,14 +2022,13 @@ sqlalchemy = ">=1.3.22" [[package]] name = "duckduckgo-search" -version = "3.8.3" +version = "3.8.5" description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "duckduckgo_search-3.8.3-py3-none-any.whl", hash = "sha256:4ebed7fd26f8fd00dfd032015afe5c21c64373809b99c3ca28b2233f9509dd0b"}, - {file = "duckduckgo_search-3.8.3.tar.gz", hash = "sha256:8532d86f9c172d371639f22f1da8ba255d2f2b2a9fb77dc0285749347f37c882"}, + {file = "duckduckgo_search-3.8.5-py3-none-any.whl", hash = "sha256:9c85190c439f29e95d0cc9509a77d63dbcdbda49a4f9bdf8ff4b567f4a10a44d"}, + {file = "duckduckgo_search-3.8.5.tar.gz", hash = "sha256:584ea097fa0475cebc278ee464ccd54ba78019dec15a0243723923dc40bc3939"}, ] [package.dependencies] @@ -2105,7 +2041,6 @@ lxml = ">=4.9.2" name = "elastic-transport" version = "8.4.0" description = "Transport classes and utilities shared among Python Elastic client libraries" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -2122,14 +2057,13 @@ develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest- [[package]] name = "elasticsearch" -version = "8.8.0" +version = "8.9.0" description = "Python client for Elasticsearch" -category = "main" optional = true python-versions = ">=3.6, <4" files = [ - {file = "elasticsearch-8.8.0-py3-none-any.whl", hash = "sha256:2223ee9daaa3c80c25b28ec3f7c48e66fce6b767a338333d9a81886046a07df6"}, - {file = "elasticsearch-8.8.0.tar.gz", hash = "sha256:6878313cd598c7c90079fed1d4be72e198da35cba57f4083e6bee91f9c70b0eb"}, + {file = "elasticsearch-8.9.0-py3-none-any.whl", hash = "sha256:0795cbf0f61482070741c09ba02ac8fdf18f5984912fbd08b248fadd8a8c9952"}, + {file = "elasticsearch-8.9.0.tar.gz", hash = "sha256:d3367fc013e04fc7aad349a6de9fad1ee04fb6d627b0e7896aa505c12fde5e04"}, ] [package.dependencies] @@ -2143,8 +2077,7 @@ requests = ["requests (>=2.4.0,<3.0.0)"] name = "entrypoints" version = "0.4" description = "Discover and load entry points from installed packages." -category = "main" -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, @@ -2155,7 +2088,6 @@ files = [ name = "esprima" version = "4.0.1" description = "ECMAScript parsing infrastructure for multipurpose analysis in Python" -category = "main" optional = true python-versions = "*" files = [ @@ -2164,14 +2096,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -2181,7 +2112,6 @@ test = ["pytest (>=6)"] name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" files = [ @@ -2196,7 +2126,6 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] name = "faiss-cpu" version = "1.7.4" description = "A library for efficient similarity search and clustering of dense vectors." -category = "main" optional = true python-versions = "*" files = [ @@ -2229,43 +2158,36 @@ files = [ [[package]] name = "fastavro" -version = "1.7.4" +version = "1.8.2" description = "Fast read/write of AVRO files" -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fastavro-1.7.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7568e621b94e061974b2a96d70670d09910e0a71482dd8610b153c07bd768497"}, - {file = "fastavro-1.7.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4ec994faf64b743647f0027fcc56b01dc15d46c0e48fa15828277cb02dbdcd6"}, - {file = "fastavro-1.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:727fdc1ddd12fcc6addab0b6df12ef999a6babe4b753db891f78aa2ee33edc77"}, - {file = "fastavro-1.7.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2f0cb3f7795fcb0042e0bbbe51204c28338a455986d68409b26dcbde64dd69a"}, - {file = "fastavro-1.7.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bb0a8b5016a99be4b8ce3550889a1bd968c0fb3f521bcfbae24210c6342aee0c"}, - {file = "fastavro-1.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:1d2040b2bf3dc1a75170ea44d1e7e09f84fb77f40ef2e6c6b9f2eaf710557083"}, - {file = "fastavro-1.7.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5542423f46bb7fc9699c467cbf151c2713aa6976ef14f4f5ec3532d80d0bb616"}, - {file = "fastavro-1.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec396e6ab6b272708c8b9a0142df01fff4c7a1f168050f292ab92fdaee0b0257"}, - {file = "fastavro-1.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b10d68c03371b79f461feca1c6c7e9d3f6aea2e9c7472b25cd749c57562aa1"}, - {file = "fastavro-1.7.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f94d5168ec72f3cfcf2181df1c46ad240dc1fcf361717447d2c5237121b9df55"}, - {file = "fastavro-1.7.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bad3dc279ed4ce747989259035cb3607f189ef7aff40339202f9321ca7f83d0b"}, - {file = "fastavro-1.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:8480ff444d9c7abd0bf121dd68656bd2115caca8ed28e71936eff348fde706e0"}, - {file = "fastavro-1.7.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:bd3d669f4ec6915c88bb80b7c14e01d2c3ceb93a61de5dcf33ff13972bba505e"}, - {file = "fastavro-1.7.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a312b128536b81bdb79f27076f513b998abe7d13ee6fe52e99bc01f7ad9b06a"}, - {file = "fastavro-1.7.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:487054d1419f1bfa41e7f19c718cbdbbb254319d3fd5b9ac411054d6432b9d40"}, - {file = "fastavro-1.7.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d2897fe7d1d5b27dcd33c43d68480de36e55a0e651d7731004a36162cd3eed9e"}, - {file = "fastavro-1.7.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6d318b49fd648a1fd93394411fe23761b486ac65dadea7c52dbeb0d0bef30221"}, - {file = "fastavro-1.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a117c3b122a8110c6ab99b3e66736790b4be19ceefb1edf0e732c33b3dc411c8"}, - {file = "fastavro-1.7.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:0cca15e1a1f829e40524004342e425acfb594cefbd3388b0a5d13542750623ac"}, - {file = "fastavro-1.7.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9211ec7a18a46a2aee01a2a979fd79f05f36b11fdb1bc469c9d9fd8cec32579"}, - {file = "fastavro-1.7.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f16bde6b5fb51e15233bfcee0378f48d4221201ba45e497a8063f6d216b7aad7"}, - {file = "fastavro-1.7.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aeca55c905ff4c667f2158564654a778918988811ae3eb28592767edcf5f5c4a"}, - {file = "fastavro-1.7.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b244f3abc024fc043d6637284ba2ffee5a1291c08a0f361ea1af4d829f66f303"}, - {file = "fastavro-1.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:b64e394c87cb99d0681727e1ae5d3633906a72abeab5ea0c692394aeb5a56607"}, - {file = "fastavro-1.7.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:8c8115bdb1c862354d9abd0ea23eab85793bbff139087f2607bd4b83e8ae07ab"}, - {file = "fastavro-1.7.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b27dd08f2338a478185c6ba23308002f334642ce83a6aeaf8308271efef88062"}, - {file = "fastavro-1.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f087c246afab8bac08d86ef21be87cbf4f3779348fb960c081863fc3d570412c"}, - {file = "fastavro-1.7.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b4077e17a2bab37af96e5ca52e61b6f2b85e4577e7a2903f6814642eb6a834f7"}, - {file = "fastavro-1.7.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:776511cecf2ea9da4edd0de5015c1562cd9063683cf94f79bc9e20bab8f06923"}, - {file = "fastavro-1.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:a7ea5565fe2c145e074ce9ba75fafd5479a86b34a8dbd00dd1835cf192290e14"}, - {file = "fastavro-1.7.4.tar.gz", hash = "sha256:6450f47ac4db95ec3a9e6434fec1f8a3c4c8c941de16205832ca8c67dd23d0d2"}, + {file = "fastavro-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:0e08964b2e9a455d831f2557402a683d4c4d45206f2ab9ade7c69d3dc14e0e58"}, + {file = "fastavro-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401a70b1e5c7161420c6019e0c8afa88f7c8a373468591f5ec37639a903c2509"}, + {file = "fastavro-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef1ed3eaa4240c05698d02d8d0c010b9a03780eda37b492da6cd4c9d37e04ec"}, + {file = "fastavro-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:543185a672ff6306beb329b57a7b8a3a2dd1eb21a5ccc530150623d58d48bb98"}, + {file = "fastavro-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ffbf8bae1edb50fe7beeffc3afa8e684686550c2e5d31bf01c25cfa213f581e1"}, + {file = "fastavro-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:bb545eb9d876bc7b785e27e98e7720ada7eee7d7a1729798d2ed51517f13500a"}, + {file = "fastavro-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b837d3038c651046252bc92c1b9899bf21c7927a148a1ff89599c36c2a331ca"}, + {file = "fastavro-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3510e96c0a47e4e914bd1a29c954eb662bfa24849ad92e597cb97cc79f21af7"}, + {file = "fastavro-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccc0e74f2c2ab357f39bb73d67fcdb6dc10e23fdbbd399326139f72ec0fb99a3"}, + {file = "fastavro-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:add51c70d0ab1175601c75cd687bbe9d16ae312cd8899b907aafe0d79ee2bc1d"}, + {file = "fastavro-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d9e2662f57e6453e9a2c9fb4f54b2a9e62e3e46f5a412ac00558112336d23883"}, + {file = "fastavro-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:fea75cf53a93c56dd56e68abce8d314ef877b27451c870cd7ede7582d34c08a7"}, + {file = "fastavro-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f489020bb8664c2737c03457ad5dbd490579ddab6f0a7b5c17fecfe982715a89"}, + {file = "fastavro-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a547625c138efd5e61300119241041906ee8cb426fc7aa789900f87af7ed330d"}, + {file = "fastavro-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53beb458f30c9ad4aa7bff4a42243ff990ffb713b6ce0cd9b360cbc3d648fe52"}, + {file = "fastavro-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7b1b2cbd2dd851452306beed0ab9bdaeeab1cc8ad46f84b47cd81eeaff6dd6b8"}, + {file = "fastavro-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d29e9baee0b2f37ecd09bde3b487cf900431fd548c85be3e4fe1b9a0b2a917f1"}, + {file = "fastavro-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:66e132c710663230292bc63e2cb79cf95b16ccb94a5fc99bb63694b24e312fc5"}, + {file = "fastavro-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38aca63ce604039bcdf2edd14912d00287bdbf8b76f9aa42b28e6ca0bf950092"}, + {file = "fastavro-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9787835f6449ee94713e7993a700432fce3763024791ffa8a58dc91ef9d1f950"}, + {file = "fastavro-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536cb448bc83811056be02749fd9df37a69621678f02597d272970a769e9b40c"}, + {file = "fastavro-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e9d5027cf7d9968f8f819958b41bfedb933323ea6d6a0485eefacaa1afd91f54"}, + {file = "fastavro-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:792adfc0c80c7f1109e0ab4b0decef20691fdf0a45091d397a0563872eb56d42"}, + {file = "fastavro-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:650b22766259f7dd7519dfa4e4658f0e233c319efa130b9cf0c36a500e09cc57"}, + {file = "fastavro-1.8.2.tar.gz", hash = "sha256:ab9d9226d4b66b6b3d0661a57cd45259b0868fed1c0cd4fac95249b9e0973320"}, ] [package.extras] @@ -2276,14 +2198,13 @@ zstandard = ["zstandard"] [[package]] name = "fastjsonschema" -version = "2.17.1" +version = "2.18.0" description = "Fastest Python implementation of JSON schema" -category = "dev" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, - {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, + {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, + {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, ] [package.extras] @@ -2293,7 +2214,6 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc name = "feedfinder2" version = "0.0.4" description = "Find the feed URLs for a website." -category = "main" optional = true python-versions = "*" files = [ @@ -2309,7 +2229,6 @@ six = "*" name = "feedparser" version = "6.0.10" description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -2324,7 +2243,6 @@ sgmllib3k = "*" name = "filelock" version = "3.12.2" description = "A platform independent file lock." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2340,7 +2258,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p name = "fiona" version = "1.9.4.post1" description = "Fiona reads and writes spatial data files" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2385,7 +2302,6 @@ test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] name = "flatbuffers" version = "23.5.26" description = "The FlatBuffers serialization format for Python" -category = "main" optional = true python-versions = "*" files = [ @@ -2397,7 +2313,6 @@ files = [ name = "fqdn" version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -category = "dev" optional = false python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" files = [ @@ -2409,7 +2324,6 @@ files = [ name = "freezegun" version = "1.2.2" description = "Let your Python tests travel through time" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2422,93 +2336,78 @@ python-dateutil = ">=2.7" [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, ] [[package]] name = "fsspec" version = "2023.6.0" description = "File-system specification" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2544,7 +2443,6 @@ tqdm = ["tqdm"] name = "future" version = "0.18.3" description = "Clean single-source support for Python 3 and 2" -category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2555,7 +2453,6 @@ files = [ name = "gast" version = "0.4.0" description = "Python AST that abstracts the underlying Python version" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2567,7 +2464,6 @@ files = [ name = "geojson" version = "2.5.0" description = "Python bindings and utilities for GeoJSON" -category = "main" optional = true python-versions = "*" files = [ @@ -2579,7 +2475,6 @@ files = [ name = "geomet" version = "0.2.1.post1" description = "GeoJSON <-> WKT/WKB conversion utilities" -category = "main" optional = false python-versions = ">2.6, !=3.3.*, <4" files = [ @@ -2595,7 +2490,6 @@ six = "*" name = "geopandas" version = "0.13.2" description = "Geographic pandas extensions" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2614,7 +2508,6 @@ shapely = ">=1.7.1" name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2629,7 +2522,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.32" description = "GitPython is a Python library used to interact with Git repositories" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2644,7 +2536,6 @@ gitdb = ">=4.0.1,<5" name = "google-api-core" version = "2.11.1" description = "Google API client core library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2667,7 +2558,6 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] name = "google-api-python-client" version = "2.70.0" description = "Google API Client Library for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2676,7 +2566,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.19.0,<3.0.0dev" google-auth-httplib2 = ">=0.1.0" httplib2 = ">=0.15.0,<1dev" @@ -2684,14 +2574,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.20.0" +version = "2.22.0" description = "Google Authentication Library" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "google-auth-2.20.0.tar.gz", hash = "sha256:030af34138909ccde0fbce611afc178f1d65d32fbff281f25738b1fe1c6f3eaa"}, - {file = "google_auth-2.20.0-py2.py3-none-any.whl", hash = "sha256:23b7b0950fcda519bfb6692bf0d5289d2ea49fc143717cc7188458ec620e63fa"}, + {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, + {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, ] [package.dependencies] @@ -2712,7 +2601,6 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-auth-httplib2" version = "0.1.0" description = "Google Authentication Library: httplib2 transport" -category = "main" optional = true python-versions = "*" files = [ @@ -2727,18 +2615,17 @@ six = "*" [[package]] name = "google-auth-oauthlib" -version = "0.4.6" +version = "1.0.0" description = "Google Authentication Library" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, - {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, + {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, + {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, ] [package.dependencies] -google-auth = ">=1.0.0" +google-auth = ">=2.15.0" requests-oauthlib = ">=0.7.0" [package.extras] @@ -2748,7 +2635,6 @@ tool = ["click (>=6.0.0)"] name = "google-pasta" version = "0.2.0" description = "pasta is an AST-based Python refactoring library" -category = "main" optional = true python-versions = "*" files = [ @@ -2764,7 +2650,6 @@ six = "*" name = "google-search-results" version = "2.4.2" description = "Scrape and search localized results from Google, Bing, Baidu, Yahoo, Yandex, Ebay, Homedepot, youtube at scale using SerpApi.com" -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -2776,14 +2661,13 @@ requests = "*" [[package]] name = "googleapis-common-protos" -version = "1.59.1" +version = "1.60.0" description = "Common protobufs used in Google APIs" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, - {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, + {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, + {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, ] [package.dependencies] @@ -2794,14 +2678,13 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "gptcache" -version = "0.1.32" +version = "0.1.39.1" description = "GPTCache, a powerful caching library that can be used to speed up and lower the cost of chat applications that rely on the LLM service. GPTCache works as a memcache for AIGC applications, similar to how Redis works for traditional applications." -category = "main" optional = true python-versions = ">=3.8.1" files = [ - {file = "gptcache-0.1.32-py3-none-any.whl", hash = "sha256:e85eb40ac54ebd8c0db1d67ba962b505d87321f287446083cfd80c4f205d2d10"}, - {file = "gptcache-0.1.32.tar.gz", hash = "sha256:0181f61429b153ad5a887beed2a373b31ffe9efbb01b7956b5a6ab32330b16b1"}, + {file = "gptcache-0.1.39.1-py3-none-any.whl", hash = "sha256:81355f7878e12a820dccb017f8a45ea44b73178dac07108c56db664a476a4a07"}, + {file = "gptcache-0.1.39.1.tar.gz", hash = "sha256:a9c629fdeaa94b78a6cfe707a5f9a3a52b361655a3f01327709ca00c78a500eb"}, ] [package.dependencies] @@ -2813,7 +2696,6 @@ requests = "*" name = "gql" version = "3.4.1" description = "GraphQL client for Python" -category = "main" optional = true python-versions = "*" files = [ @@ -2840,7 +2722,6 @@ websockets = ["websockets (>=10,<11)", "websockets (>=9,<10)"] name = "graphql-core" version = "3.2.3" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." -category = "main" optional = true python-versions = ">=3.6,<4" files = [ @@ -2852,7 +2733,6 @@ files = [ name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -2924,124 +2804,118 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.47.5" +version = "1.57.0" description = "HTTP/2-based RPC framework" -category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "grpcio-1.47.5-cp310-cp310-linux_armv7l.whl", hash = "sha256:acc73289d0c44650aa1f21eccfa967f5623b01c3b5e2b4596fe5f9c5bf10956d"}, - {file = "grpcio-1.47.5-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:f3174c798959998876d546944523a558f78a9b9feb22a2cbaaa3822f2e158653"}, - {file = "grpcio-1.47.5-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:64401ee6d54b4d5869bcba4be3cae9f2e335c44a39ba1e29991ad22cfe2abacb"}, - {file = "grpcio-1.47.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39a07eb5e7ec9277e5d124fb0e2d4f51ddbaadc2abdd27e8bbf1716dcf45e581"}, - {file = "grpcio-1.47.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:874b138ca95a6375ae6f6a12c10a348827c9aa8fbd05d025b87b5e050ab55b46"}, - {file = "grpcio-1.47.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90539369afba42fc921cdda9d5f697a421f05a2e82ba58342ffbe88aa586019e"}, - {file = "grpcio-1.47.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b18f970514bbc76547928e26d0cec06996ce3f947a3634b3adbe79d0e48e980"}, - {file = "grpcio-1.47.5-cp310-cp310-win32.whl", hash = "sha256:44c52923be0c4a0f662de43644679c6356960c38c4edf44864c23b998693c7cc"}, - {file = "grpcio-1.47.5-cp310-cp310-win_amd64.whl", hash = "sha256:07761f427551fced386db8c78701d6a167b2a682aa8df808303dd0a0d44bf6c9"}, - {file = "grpcio-1.47.5-cp36-cp36m-linux_armv7l.whl", hash = "sha256:10eb026bf75568de06933366f0340d2b4b207425c74a5640aa1812b8b69e7d9d"}, - {file = "grpcio-1.47.5-cp36-cp36m-macosx_10_10_universal2.whl", hash = "sha256:4f8e7fba6b1150a63aebd04d03be779de4ea4c4a8b28869e7a3c8f0b3ec59edc"}, - {file = "grpcio-1.47.5-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:36d93b19c214bc654fc50ae65cce84b8f7698159191b9d3f21f9ad92ae7bc325"}, - {file = "grpcio-1.47.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e59f916bf58528e55893743151c6bd9f0a393fddfe411a6fffd29a300e6acf2"}, - {file = "grpcio-1.47.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f8b2d316a3be464eb2a20afa7026a235a07a0094be879876611206d8026679"}, - {file = "grpcio-1.47.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:0c3076957cd2aea34fe69384453315fd765948eb6cb73a12f332277308d04b76"}, - {file = "grpcio-1.47.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:007f5ad07d2f3a4a422c1df589a0d25e918b96d8f6069cb6f0254386a5f09262"}, - {file = "grpcio-1.47.5-cp36-cp36m-win32.whl", hash = "sha256:01ac149a5ca9512277b1d2fe85687099f3e442c6f9f924eae003a6700735e23e"}, - {file = "grpcio-1.47.5-cp36-cp36m-win_amd64.whl", hash = "sha256:a32ccc88950f2be619157201161e70a5e5ed9e2427662bb2e60f1a8cea7d0db6"}, - {file = "grpcio-1.47.5-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ec71f15258e086acadb13ec06e4e4c54eb0f5455cd4c618997f847874d5ff9ea"}, - {file = "grpcio-1.47.5-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:4bbf5a63497dbd5e44c4335cab153796a4274be17ca40ec971a7749c3f4fef6a"}, - {file = "grpcio-1.47.5-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:11e1bc97e88232201256b718c63a8a1fd86ec6fca3a501293be5c5e423de9d56"}, - {file = "grpcio-1.47.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e568d84fed80713d2fa3221552beee27ed8034f7eff52bb7871bf5ffe4d4ca78"}, - {file = "grpcio-1.47.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4c838de8e1e7194d3f9a679fd76cc44a1dbe81f18bd39ee233c72347d772bf"}, - {file = "grpcio-1.47.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a74c19baf2f8127b44b3f58e2a5801a17992dae9a20197b4a8fa26e2ea79742b"}, - {file = "grpcio-1.47.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e369ed5ecff11ef85666cabbb5736495604e052c8dc2c03a2104f99dfd0a59e3"}, - {file = "grpcio-1.47.5-cp37-cp37m-win32.whl", hash = "sha256:ccb741fab5117aea981d4ac341d2ce1e588f515f83091807d4e2bb388ed59edd"}, - {file = "grpcio-1.47.5-cp37-cp37m-win_amd64.whl", hash = "sha256:af9d3b075dfcbc343d44b0e98725ba6d56dc0669e61905a4e71e8f4409cfefbd"}, - {file = "grpcio-1.47.5-cp38-cp38-linux_armv7l.whl", hash = "sha256:cac6847a4b9a7e7a1f270a71fef1c17c2e8a6b411c0ca48080ce1e08d284aded"}, - {file = "grpcio-1.47.5-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:54a3e17d155b6fb141e1fbb7c47d30556bec4c940b66ff4d9513536e2e214d4a"}, - {file = "grpcio-1.47.5-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d1873c0b84a0ffb129f75e7c8be45d2cae427baf0b090d15b9ff46c1841c3f53"}, - {file = "grpcio-1.47.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e209df91cf8dfb335c2e26784702b0e12c20dc4de7b9b6d2cccd968146155f06"}, - {file = "grpcio-1.47.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:350e2627684f93f8b59af9c76a03eeb4aa145ecc589569137d4518486f4f1727"}, - {file = "grpcio-1.47.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:23754807314c5aa4c26eb1c50aaf506801a2f7825951100280d2c013b127436f"}, - {file = "grpcio-1.47.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:503c3fa0045f3ef80aa1ad082eac6a888081da2e1cd793f281ed499831e4c498"}, - {file = "grpcio-1.47.5-cp38-cp38-win32.whl", hash = "sha256:a4eecfbe994c88996461bd1459e43ea460952d4147f53e8c18e089764e6808f5"}, - {file = "grpcio-1.47.5-cp38-cp38-win_amd64.whl", hash = "sha256:941927ae4d589a2fef5c22b9c47df9e5e613c737bd750bafc3a9547cc506017c"}, - {file = "grpcio-1.47.5-cp39-cp39-linux_armv7l.whl", hash = "sha256:9891c77e69bd4109c25c1bea51d78fbc5ba2fcd9445bf99225bb8fb03d849913"}, - {file = "grpcio-1.47.5-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:61e83778d85dbbbd7446451ec28b7261e9ebba489cc8c262dfe8fedc119f769b"}, - {file = "grpcio-1.47.5-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:21ccfc0e989531cbdc93c54a7581ea5f7c46bf585016d9320b4be042f1e02374"}, - {file = "grpcio-1.47.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bea35a0114a39827ffe59f73950d242f95d59a9ac2009ae8da7b065c06f0a57f"}, - {file = "grpcio-1.47.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e75b9e52eeb9d1335aaeecf581cb3cea7fc4bafd7bd675c83f208a386a42a8"}, - {file = "grpcio-1.47.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1fb86f95228827b55e860278d142326af4489c0f4220975780daff325fc87172"}, - {file = "grpcio-1.47.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c9b83183525afe58dd9e7bb249f9e55df326e3c3834d09ea476c7a6bb12f73ee"}, - {file = "grpcio-1.47.5-cp39-cp39-win32.whl", hash = "sha256:00bff7492875ab04ec5ed3d92550d8f8aa423151e187b79684c8a22c7a6f1670"}, - {file = "grpcio-1.47.5-cp39-cp39-win_amd64.whl", hash = "sha256:2b32adae820cc0347e5e44efe91b661b436dbca73f25c5763cadb1cafd1dca10"}, - {file = "grpcio-1.47.5.tar.gz", hash = "sha256:b62b8bea0c94b4603bb4c8332d8a814375120bea3c2dbeb71397213bde5ea832"}, + {file = "grpcio-1.57.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:092fa155b945015754bdf988be47793c377b52b88d546e45c6a9f9579ac7f7b6"}, + {file = "grpcio-1.57.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f7349786da979a94690cc5c2b804cab4e8774a3cf59be40d037c4342c906649"}, + {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:82640e57fb86ea1d71ea9ab54f7e942502cf98a429a200b2e743d8672171734f"}, + {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40b72effd4c789de94ce1be2b5f88d7b9b5f7379fe9645f198854112a6567d9a"}, + {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f708a6a17868ad8bf586598bee69abded4996b18adf26fd2d91191383b79019"}, + {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:60fe15288a0a65d5c1cb5b4a62b1850d07336e3ba728257a810317be14f0c527"}, + {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6907b1cf8bb29b058081d2aad677b15757a44ef2d4d8d9130271d2ad5e33efca"}, + {file = "grpcio-1.57.0-cp310-cp310-win32.whl", hash = "sha256:57b183e8b252825c4dd29114d6c13559be95387aafc10a7be645462a0fc98bbb"}, + {file = "grpcio-1.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7b400807fa749a9eb286e2cd893e501b110b4d356a218426cb9c825a0474ca56"}, + {file = "grpcio-1.57.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c6ebecfb7a31385393203eb04ed8b6a08f5002f53df3d59e5e795edb80999652"}, + {file = "grpcio-1.57.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:00258cbe3f5188629828363ae8ff78477ce976a6f63fb2bb5e90088396faa82e"}, + {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:23e7d8849a0e58b806253fd206ac105b328171e01b8f18c7d5922274958cc87e"}, + {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5371bcd861e679d63b8274f73ac281751d34bd54eccdbfcd6aa00e692a82cd7b"}, + {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aed90d93b731929e742967e236f842a4a2174dc5db077c8f9ad2c5996f89f63e"}, + {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe752639919aad9ffb0dee0d87f29a6467d1ef764f13c4644d212a9a853a078d"}, + {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fada6b07ec4f0befe05218181f4b85176f11d531911b64c715d1875c4736d73a"}, + {file = "grpcio-1.57.0-cp311-cp311-win32.whl", hash = "sha256:bb396952cfa7ad2f01061fbc7dc1ad91dd9d69243bcb8110cf4e36924785a0fe"}, + {file = "grpcio-1.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:e503cb45ed12b924b5b988ba9576dc9949b2f5283b8e33b21dcb6be74a7c58d0"}, + {file = "grpcio-1.57.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:fd173b4cf02b20f60860dc2ffe30115c18972d7d6d2d69df97ac38dee03be5bf"}, + {file = "grpcio-1.57.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:d7f8df114d6b4cf5a916b98389aeaf1e3132035420a88beea4e3d977e5f267a5"}, + {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:76c44efa4ede1f42a9d5b2fed1fe9377e73a109bef8675fb0728eb80b0b8e8f2"}, + {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4faea2cfdf762a664ab90589b66f416274887641ae17817de510b8178356bf73"}, + {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c60b83c43faeb6d0a9831f0351d7787a0753f5087cc6fa218d78fdf38e5acef0"}, + {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b363bbb5253e5f9c23d8a0a034dfdf1b7c9e7f12e602fc788c435171e96daccc"}, + {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f1fb0fd4a1e9b11ac21c30c169d169ef434c6e9344ee0ab27cfa6f605f6387b2"}, + {file = "grpcio-1.57.0-cp37-cp37m-win_amd64.whl", hash = "sha256:34950353539e7d93f61c6796a007c705d663f3be41166358e3d88c45760c7d98"}, + {file = "grpcio-1.57.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:871f9999e0211f9551f368612460442a5436d9444606184652117d6a688c9f51"}, + {file = "grpcio-1.57.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:a8a8e560e8dbbdf29288872e91efd22af71e88b0e5736b0daf7773c1fecd99f0"}, + {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2313b124e475aa9017a9844bdc5eafb2d5abdda9d456af16fc4535408c7d6da6"}, + {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4098b6b638d9e0ca839a81656a2fd4bc26c9486ea707e8b1437d6f9d61c3941"}, + {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e5b58e32ae14658085c16986d11e99abd002ddbf51c8daae8a0671fffb3467f"}, + {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0f80bf37f09e1caba6a8063e56e2b87fa335add314cf2b78ebf7cb45aa7e3d06"}, + {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5b7a4ce8f862fe32b2a10b57752cf3169f5fe2915acfe7e6a1e155db3da99e79"}, + {file = "grpcio-1.57.0-cp38-cp38-win32.whl", hash = "sha256:9338bacf172e942e62e5889b6364e56657fbf8ac68062e8b25c48843e7b202bb"}, + {file = "grpcio-1.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:e1cb52fa2d67d7f7fab310b600f22ce1ff04d562d46e9e0ac3e3403c2bb4cc16"}, + {file = "grpcio-1.57.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fee387d2fab144e8a34e0e9c5ca0f45c9376b99de45628265cfa9886b1dbe62b"}, + {file = "grpcio-1.57.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b53333627283e7241fcc217323f225c37783b5f0472316edcaa4479a213abfa6"}, + {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f19ac6ac0a256cf77d3cc926ef0b4e64a9725cc612f97228cd5dc4bd9dbab03b"}, + {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3fdf04e402f12e1de8074458549337febb3b45f21076cc02ef4ff786aff687e"}, + {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5613a2fecc82f95d6c51d15b9a72705553aa0d7c932fad7aed7afb51dc982ee5"}, + {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b670c2faa92124b7397b42303e4d8eb64a4cd0b7a77e35a9e865a55d61c57ef9"}, + {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a635589201b18510ff988161b7b573f50c6a48fae9cb567657920ca82022b37"}, + {file = "grpcio-1.57.0-cp39-cp39-win32.whl", hash = "sha256:d78d8b86fcdfa1e4c21f8896614b6cc7ee01a2a758ec0c4382d662f2a62cf766"}, + {file = "grpcio-1.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:20ec6fc4ad47d1b6e12deec5045ec3cd5402d9a1597f738263e98f490fe07056"}, + {file = "grpcio-1.57.0.tar.gz", hash = "sha256:4b089f7ad1eb00a104078bab8015b0ed0ebcb3b589e527ab009c53893fd4e613"}, ] -[package.dependencies] -six = ">=1.5.2" - [package.extras] -protobuf = ["grpcio-tools (>=1.47.5)"] +protobuf = ["grpcio-tools (>=1.57.0)"] [[package]] name = "grpcio-tools" -version = "1.47.5" +version = "1.48.2" description = "Protobuf code generator for gRPC" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "grpcio-tools-1.47.5.tar.gz", hash = "sha256:62ced60566a4cbcf35c57e887e2e68b4f108b3474ef3ec0022d38cd579345f92"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-linux_armv7l.whl", hash = "sha256:9f92c561b245a562110bd84d3b64b016c8af5afde39febf1f71553ae56f6e8e4"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a0a991844a024705ad177cb858d36e3e6b329ea4a78b7f4c597b2817fc2692e7"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:935976d5436d4306de052d1e00848fa25abc667e185aaaffcd367915f33a67c7"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2481dba6a30d415a4756cd88cc380780e3f00bb41d56b8f6547bc3c09c6f4e7f"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62176978faa96b21e4e821e7070b0feed919726ff730c0b3b7e8d106ddb45bf"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:728eb1f4ef6d380366a2de9940d1f910ece8bf4e44de5ca935cd16d4394e82ff"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d58982c747e107f65c7307ec1646cce105b0785088287bf209f545377aeedaf4"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-win32.whl", hash = "sha256:ea6d8f07b087bc2d579b7727daee2abf38fe5dc475c9e7c4f16b4a2c31895319"}, - {file = "grpcio_tools-1.47.5-cp310-cp310-win_amd64.whl", hash = "sha256:5e7a4e68072639fa767bde1011f5d83f4461a8e60651ea202af597777ee1ffd7"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-linux_armv7l.whl", hash = "sha256:bb1e066fc50ef7503b024924858658692d3e98582a9727b156f2f845da70e11e"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-macosx_10_10_universal2.whl", hash = "sha256:7d3e397a27e652ae6579f1f7dc3fc0c771db977ccaaded1fe113e882df425c15"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:b19d8f1e8422826d49fc428acc66b69aa450c70f7090681df32d535188edf524"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0e017bd1022bc981fa1629e757e0d3d4a1991f999fb90ec714c2683fe05b8fa"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb56ea33c4a33ee3b707f62339fd579e1a8dbbfeb7665d7ff85ee837cf64794"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:02882ff2f703b75d343991608b39104f1621508cf407e427a75c1794ed0fac95"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:84395aacae4f8a3358ad648a8bacf6b15bbb8946d8cf73f47dc77cfe1a154d48"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-win32.whl", hash = "sha256:de8901c64a1091cc474318e7a013af8c30feba34c7954c29ca8f477baf07db28"}, - {file = "grpcio_tools-1.47.5-cp36-cp36m-win_amd64.whl", hash = "sha256:37cb5c3d94ba1efef0d17a66e5e69b177fc934389eda8b76b161a6623e45e714"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-linux_armv7l.whl", hash = "sha256:5c2d3a35e9341ea9c68afe289054bd8604eda4214e6d916f97b19a316537a296"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:89733edb89ec28e52dd9cc25e90b78248b6edd265f564726be2a9c4b4ee78479"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:489f41535d779287759942c6cced93c4219ea53dad46ebdc4faca6220e1dba88"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:072c84f561912400363b81af6bf5424c38fab80f0c9436c0fe19b2e7c2bcf15c"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c650233420279f943bd1dcf286742aaeb4db7cc5f6554a5e8c16c2e4fa19a28f"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dab220aba6b5777b16df5c5b3a30f831cdbc4f493eabdaf9f6585691bad5496a"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:309ca8508f361895ef2d4f533611272228d2412c8cae754b695673c7c65a2f8b"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-win32.whl", hash = "sha256:f8ce5fb65e97866257943cbf6d504195ab55e01ef467988d86322a36041b6de8"}, - {file = "grpcio_tools-1.47.5-cp37-cp37m-win_amd64.whl", hash = "sha256:b9154a18b0ad2bc4b9ceadedd7b67bb65b500b3427495b4d224a1a835aa55ce6"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-linux_armv7l.whl", hash = "sha256:aaa4063bc05a18f32ae98e414e2472477468b966b9a1425c41eec160250beff2"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:093da28f8ce3a0eedd5370b9f09f815fb6c01fd663d60734eab5b300b9a305ec"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0771f57585b9070086dec509b02fa2804a9d4c395e95cd7a6cb42d8f4b5683f7"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68d4cdc674c8596da8e25cf37741aab3f07bdf38731510a92019e5ec57f5fcea"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08fdce5549acca9fd7a45084c62e8ab0a1ca1c530bcbfa089625e9523f224023"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8431b9ee083bec444ca6d48705b89774f97ba0a75e8c33ef3b9a2dc6ed2aa584"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf37376da0062155d728fb9a1d522ea8f5039ebf774885d269f7772cbc3a2e6"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-win32.whl", hash = "sha256:b65a59698f938fa59fd756799cd641c3755fb09cb95de008e4d67a9e5b1af6d5"}, - {file = "grpcio_tools-1.47.5-cp38-cp38-win_amd64.whl", hash = "sha256:17c2b5ce8b3100c8da4ae5070d8d2c2466f174e66d8127fb85ef8a7937a03853"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-linux_armv7l.whl", hash = "sha256:9070301f079fef76fb0d51b84f393c6738587f3a16a2f0ced303362b0cc0ecf6"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:5bcf01116a4d3bed2faf832f8c5618d1c69473576f3925240e3c5042dfbc115e"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:b555b954aa213eac8efe7df507a178c3ab7323df9f501846a1bbccdf81354831"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7604e08530b3edc688e41aa8af46051478d417b08afdf6fc2eafb5eb90528a26"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d3f80818a560abee8189c4f0b074f45c16309b4596e013cb6ce105a022c5965"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c801ebd7fa2304ff85aa15147f134aefe33132d85308c43e46f6a5be78b5a8a8"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:235adfc22e9c703533573344de1d2394ddd92b27c82eb259bb5fb46f885159b8"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-win32.whl", hash = "sha256:d659c257cbb48c843931b584d3c3da5473fa17275e0d04af79c9e9fdd6077179"}, - {file = "grpcio_tools-1.47.5-cp39-cp39-win_amd64.whl", hash = "sha256:9d121c63ff2fddeae2c65f6675eb944f47808a242b647d80b4661b2c5e1e6732"}, + {file = "grpcio-tools-1.48.2.tar.gz", hash = "sha256:8902a035708555cddbd61b5467cea127484362decc52de03f061a1a520fe90cd"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:92acc3e10ba2b0dcb90a88ae9fe1cc0ffba6868545207e4ff20ca95284f8e3c9"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e5bb396d63495667d4df42e506eed9d74fc9a51c99c173c04395fe7604c848f1"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:84a84d601a238572d049d3108e04fe4c206536e81076d56e623bd525a1b38def"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70564521e86a0de35ea9ac6daecff10cb46860aec469af65869974807ce8e98b"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdbbe63f6190187de5946891941629912ac8196701ed2253fa91624a397822ec"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae56f133b05b7e5d780ef7e032dd762adad7f3dc8f64adb43ff5bfabd659f435"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0feb4f2b777fa6377e977faa89c26359d4f31953de15e035505b92f41aa6906"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-win32.whl", hash = "sha256:80f450272316ca0924545f488c8492649ca3aeb7044d4bf59c426dcdee527f7c"}, + {file = "grpcio_tools-1.48.2-cp310-cp310-win_amd64.whl", hash = "sha256:21ff50e321736eba22210bf9b94e05391a9ac345f26e7df16333dc75d63e74fb"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-linux_armv7l.whl", hash = "sha256:d598ccde6338b2cfbb3124f34c95f03394209013f9b1ed4a5360a736853b1c27"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:a43d26714933f23de93ea0bf9c86c66a6ede709b8ca32e357f9e2181703e64ae"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:55fdebc73fb580717656b1bafa4f8eca448726a7aa22726a6c0a7895d2f0f088"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8588819b22d0de3aa1951e1991cc3e4b9aa105eecf6e3e24eb0a2fc8ab958b3e"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9771d4d317dca029dfaca7ec9282d8afe731c18bc536ece37fd39b8a974cc331"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d886a9e052a038642b3af5d18e6f2085d1656d9788e202dc23258cf3a751e7ca"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d77e8b1613876e0d8fd17709509d4ceba13492816426bd156f7e88a4c47e7158"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-win32.whl", hash = "sha256:dcaaecdd5e847de5c1d533ea91522bf56c9e6b2dc98cdc0d45f0a1c26e846ea2"}, + {file = "grpcio_tools-1.48.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0119aabd9ceedfdf41b56b9fdc8284dd85a7f589d087f2694d743f346a368556"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:189be2a9b672300ca6845d94016bdacc052fdbe9d1ae9e85344425efae2ff8ef"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:9443f5c30bac449237c3cf99da125f8d6e6c01e17972bc683ee73b75dea95573"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:e0403e095b343431195db1305248b50019ad55d3dd310254431af87e14ef83a2"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5410d6b601d1404835e34466bd8aee37213489b36ee1aad2276366e265ff29d4"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51be91b7c7056ff9ee48b1eccd4a2840b0126230803a5e09dfc082a5b16a91c1"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:516eedd5eb7af6326050bc2cfceb3a977b9cc1144f283c43cc4956905285c912"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d18599ab572b2f15a8f3db49503272d1bb4fcabb4b4d1214ef03aca1816b20a0"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-win32.whl", hash = "sha256:d18ef2adc05a8ef9e58ac46357f6d4ce7e43e077c7eda0a4425773461f9d0e6e"}, + {file = "grpcio_tools-1.48.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d9753944e5a6b6b78b76ce9d2ae0fe3f748008c1849deb7fadcb64489d6553b"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:3c8749dca04a8d302862ceeb1dfbdd071ee13b281395975f24405a347e5baa57"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7307dd2408b82ea545ae63502ec03036b025f449568556ea9a056e06129a7a4e"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:072234859f6069dc43a6be8ad6b7d682f4ba1dc2e2db2ebf5c75f62eee0f6dfb"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cc298fbfe584de8876a85355efbcf796dfbcfac5948c9560f5df82e79336e2a"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f75973a42c710999acd419968bc79f00327e03e855bbe82c6529e003e49af660"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f766050e491d0b3203b6b85638015f543816a2eb7d089fc04e86e00f6de0e31d"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8e0d74403484eb77e8df2566a64b8b0b484b5c87903678c381634dd72f252d5e"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-win32.whl", hash = "sha256:cb75bac0cd43858cb759ef103fe68f8c540cb58b63dda127e710228fec3007b8"}, + {file = "grpcio_tools-1.48.2-cp38-cp38-win_amd64.whl", hash = "sha256:cabc8b0905cedbc3b2b7b2856334fa35cce3d4bc79ae241cacd8cca8940a5c85"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:e712a6d00606ad19abdeae852a7e521d6f6d0dcea843708fecf3a38be16a851e"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:e7e7668f89fd598c5469bb58e16bfd12b511d9947ccc75aec94da31f62bc3758"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:a415fbec67d4ff7efe88794cbe00cf548d0f0a5484cceffe0a0c89d47694c491"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d96e96ae7361aa51c9cd9c73b677b51f691f98df6086860fcc3c45852d96b0b0"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e20d7885a40e68a2bda92908acbabcdf3c14dd386c3845de73ba139e9df1f132"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8a5614251c46da07549e24f417cf989710250385e9d80deeafc53a0ee7df6325"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ace0035766fe01a1b096aa050be9f0a9f98402317e7aeff8bfe55349be32a407"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-win32.whl", hash = "sha256:4fa4300b1be59b046492ed3c5fdb59760bc6433f44c08f50de900f9552ec7461"}, + {file = "grpcio_tools-1.48.2-cp39-cp39-win_amd64.whl", hash = "sha256:0fb6c1c1e56eb26b224adc028a4204b6ad0f8b292efa28067dff273bbc8b27c4"}, ] [package.dependencies] -grpcio = ">=1.47.5" +grpcio = ">=1.48.2" protobuf = ">=3.12.0,<4.0dev" setuptools = "*" @@ -3049,7 +2923,6 @@ setuptools = "*" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3061,7 +2934,6 @@ files = [ name = "h2" version = "4.1.0" description = "HTTP/2 State-Machine based protocol implementation" -category = "main" optional = true python-versions = ">=3.6.1" files = [ @@ -3075,47 +2947,41 @@ hyperframe = ">=6.0,<7" [[package]] name = "h5py" -version = "3.8.0" +version = "3.9.0" description = "Read and write HDF5 files from Python" -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "h5py-3.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:533d7dad466ddb7e3b30af274b630eb7c1a6e4ddf01d1c373a0334dc2152110a"}, - {file = "h5py-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c873ba9fd4fa875ad62ce0e4891725e257a8fe7f5abdbc17e51a5d54819be55c"}, - {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98a240cd4c1bfd568aaa52ec42d263131a2582dab82d74d3d42a0d954cac12be"}, - {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3389b63222b1c7a158bb7fe69d11ca00066740ec5574596d47a2fe5317f563a"}, - {file = "h5py-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:7f3350fc0a8407d668b13247861c2acd23f7f5fe7d060a3ad9b0820f5fcbcae0"}, - {file = "h5py-3.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db03e3f2c716205fbdabb34d0848459840585225eb97b4f08998c743821ca323"}, - {file = "h5py-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36761693efbe53df179627a775476dcbc37727d6e920958277a7efbc18f1fb73"}, - {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a506fc223def428f4329e7e1f9fe1c8c593eab226e7c0942c8d75308ad49950"}, - {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33b15aae79e9147aebe1d0e54099cbcde8d65e3e227cd5b59e49b1272aa0e09d"}, - {file = "h5py-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:9f6f6ffadd6bfa9b2c5b334805eb4b19ca0a5620433659d8f7fb86692c40a359"}, - {file = "h5py-3.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8f55d9c6c84d7d09c79fb85979e97b81ec6071cc776a97eb6b96f8f6ec767323"}, - {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b685453e538b2b5934c58a644ac3f3b3d0cec1a01b6fb26d57388e9f9b674ad0"}, - {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377865821fe80ad984d003723d6f8890bd54ceeb5981b43c0313b9df95411b30"}, - {file = "h5py-3.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0fef76e10b9216657fa37e7edff6d8be0709b25bd5066474c229b56cf0098df9"}, - {file = "h5py-3.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ffc344ec9984d2cd3ca0265007299a8bac8d85c1ad48f4639d8d3aed2af171"}, - {file = "h5py-3.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bacaa1c16810dd2b3e4417f8e730971b7c4d53d234de61fe4a918db78e80e1e4"}, - {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae730580ae928de409d63cbe4fdca4c82c3ad2bed30511d19d34e995d63c77e"}, - {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47f757d1b76f0ecb8aa0508ec8d1b390df67a8b67ee2515dc1b046f3a1596ea"}, - {file = "h5py-3.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f891b17e3a3e974e93f9e34e7cca9f530806543571ce078998676a555837d91d"}, - {file = "h5py-3.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:290e00fa2de74a10688d1bac98d5a9cdd43f14f58e562c580b5b3dfbd358ecae"}, - {file = "h5py-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:03890b1c123d024fb0239a3279737d5432498c1901c354f8b10d8221d1d16235"}, - {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7865de06779b14d98068da387333ad9bf2756b5b579cc887fac169bc08f87c3"}, - {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49bc857635f935fa30e92e61ac1e87496df8f260a6945a3235e43a9890426866"}, - {file = "h5py-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:5fd2252d1fc364ba0e93dd0b7089f4906b66805cb4e6aca7fa8874ac08649647"}, - {file = "h5py-3.8.0.tar.gz", hash = "sha256:6fead82f0c4000cf38d53f9c030780d81bfa0220218aee13b90b7701c937d95f"}, + {file = "h5py-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb7bdd5e601dd1739698af383be03f3dad0465fe67184ebd5afca770f50df9d6"}, + {file = "h5py-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:78e44686334cbbf2dd21d9df15823bc38663f27a3061f6a032c68a3e30c47bf7"}, + {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f68b41efd110ce9af1cbe6fa8af9f4dcbadace6db972d30828b911949e28fadd"}, + {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12aa556d540f11a2cae53ea7cfb94017353bd271fb3962e1296b342f6550d1b8"}, + {file = "h5py-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d97409e17915798029e297a84124705c8080da901307ea58f29234e09b073ddc"}, + {file = "h5py-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:551e358db05a874a0f827b22e95b30092f2303edc4b91bb62ad2f10e0236e1a0"}, + {file = "h5py-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6822a814b9d8b8363ff102f76ea8d026f0ca25850bb579d85376029ee3e73b93"}, + {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f01202cdea754ab4227dd27014bdbd561a4bbe4b631424fd812f7c2ce9c6ac"}, + {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64acceaf6aff92af091a4b83f6dee3cf8d3061f924a6bb3a33eb6c4658a8348b"}, + {file = "h5py-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:804c7fb42a34c8ab3a3001901c977a5c24d2e9c586a0f3e7c0a389130b4276fc"}, + {file = "h5py-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d9492391ff5c3c80ec30ae2fe82a3f0efd1e750833739c25b0d090e3be1b095"}, + {file = "h5py-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9da9e7e63376c32704e37ad4cea2dceae6964cee0d8515185b3ab9cbd6b947bc"}, + {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e20897c88759cbcbd38fb45b507adc91af3e0f67722aa302d71f02dd44d286"}, + {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbf5225543ca35ce9f61c950b73899a82be7ba60d58340e76d0bd42bf659235a"}, + {file = "h5py-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:36408f8c62f50007d14e000f9f3acf77e103b9e932c114cbe52a3089e50ebf94"}, + {file = "h5py-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:23e74b878bbe1653ab34ca49b83cac85529cd0b36b9d625516c5830cc5ca2eac"}, + {file = "h5py-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f457089c5d524b7998e3649bc63240679b8fb0a3859ea53bbb06841f3d755f1"}, + {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6284061f3214335e1eec883a6ee497dbe7a79f19e6a57fed2dd1f03acd5a8cb"}, + {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7a745efd0d56076999b52e8da5fad5d30823bac98b59c68ae75588d09991a"}, + {file = "h5py-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:79bbca34696c6f9eeeb36a91776070c49a060b2879828e2c8fa6c58b8ed10dd1"}, + {file = "h5py-3.9.0.tar.gz", hash = "sha256:e604db6521c1e367c6bd7fad239c847f53cc46646f2d2651372d05ae5e95f817"}, ] [package.dependencies] -numpy = ">=1.14.5" +numpy = ">=1.17.3" [[package]] name = "hnswlib" version = "0.7.0" description = "hnswlib" -category = "main" optional = true python-versions = "*" files = [ @@ -3129,7 +2995,6 @@ numpy = "*" name = "hpack" version = "4.0.0" description = "Pure-Python HPACK header compression" -category = "main" optional = true python-versions = ">=3.6.1" files = [ @@ -3141,7 +3006,6 @@ files = [ name = "html2text" version = "2020.1.16" description = "Turn HTML into equivalent Markdown-structured text." -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -3151,31 +3015,29 @@ files = [ [[package]] name = "httpcore" -version = "0.17.2" +version = "0.17.3" description = "A minimal low-level HTTP client." -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "httpcore-0.17.2-py3-none-any.whl", hash = "sha256:5581b9c12379c4288fe70f43c710d16060c10080617001e6b22a3b6dbcbefd36"}, - {file = "httpcore-0.17.2.tar.gz", hash = "sha256:125f8375ab60036db632f34f4b627a9ad085048eef7cb7d2616fea0f739f98af"}, + {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, + {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, ] [package.dependencies] anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" +sniffio = "==1.*" [package.extras] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "httplib2" version = "0.22.0" description = "A comprehensive HTTP client library." -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3190,7 +3052,6 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 name = "httpx" version = "0.24.1" description = "The next generation HTTP client." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3206,24 +3067,23 @@ h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} httpcore = ">=0.15.0,<0.18.0" idna = "*" sniffio = "*" -socksio = {version = ">=1.0.0,<2.0.0", optional = true, markers = "extra == \"socks\""} +socksio = {version = "==1.*", optional = true, markers = "extra == \"socks\""} [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.15.1" +version = "0.16.4" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" -category = "main" optional = true python-versions = ">=3.7.0" files = [ - {file = "huggingface_hub-0.15.1-py3-none-any.whl", hash = "sha256:05b0fb0abbf1f625dfee864648ac3049fe225ac4371c7bafaca0c2d3a2f83445"}, - {file = "huggingface_hub-0.15.1.tar.gz", hash = "sha256:a61b7d1a7769fe10119e730277c72ab99d95c48d86a3d6da3e9f3d0f632a4081"}, + {file = "huggingface_hub-0.16.4-py3-none-any.whl", hash = "sha256:0d3df29932f334fead024afc7cb4cc5149d955238b8b5e42dcf9740d6995a349"}, + {file = "huggingface_hub-0.16.4.tar.gz", hash = "sha256:608c7d4f3d368b326d1747f91523dbd1f692871e8e2e7a4750314a2dd8b63e14"}, ] [package.dependencies] @@ -3236,26 +3096,26 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +inference = ["aiohttp", "pydantic"] quality = ["black (>=23.1,<24.0)", "mypy (==0.982)", "ruff (>=0.0.241)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "gradio", "jedi", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["torch"] -typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +typing = ["pydantic", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] [[package]] name = "humbug" -version = "0.3.1" +version = "0.3.2" description = "Humbug: Do you build developer tools? Humbug helps you know your users." -category = "main" optional = true python-versions = "*" files = [ - {file = "humbug-0.3.1-py3-none-any.whl", hash = "sha256:f9e3c8dd60a8ba943194f7ed45caa66e5db43d99f3745c60030ec40e6313a927"}, - {file = "humbug-0.3.1.tar.gz", hash = "sha256:a123ee31551f5465ca7c1ee3da0862a4e0a0e5c8a7b762a863d833da624db215"}, + {file = "humbug-0.3.2-py3-none-any.whl", hash = "sha256:0d302c82019842f4267ed05b54a26b155ab8dc441ac129e2a62c9c4892d53c71"}, + {file = "humbug-0.3.2.tar.gz", hash = "sha256:0fca3cdb6db2348e13d7835b1a743ff545e38344fc55ad4e2a083634b12a0a6e"}, ] [package.dependencies] @@ -3270,7 +3130,6 @@ profile = ["GPUtil", "psutil", "types-psutil"] name = "hyperframe" version = "6.0.1" description = "HTTP/2 framing layer for Python" -category = "main" optional = true python-versions = ">=3.6.1" files = [ @@ -3282,7 +3141,6 @@ files = [ name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -3292,14 +3150,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.0.1" +version = "6.8.0" description = "Read metadata from Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.0.1-py3-none-any.whl", hash = "sha256:1543daade821c89b1c4a55986c326f36e54f2e6ca3bad96be4563d0acb74dcd4"}, - {file = "importlib_metadata-6.0.1.tar.gz", hash = "sha256:950127d57e35a806d520817d3e92eec3f19fdae9f0cd99da77a407c5aabefba3"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] @@ -3308,32 +3165,30 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.0.1" description = "Read resources from Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3343,14 +3198,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.23.2" +version = "6.25.1" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.23.2-py3-none-any.whl", hash = "sha256:7ccb6e2d32fd958c21453db494c914f3474908a2fdefd99ab548a5375b548d1f"}, - {file = "ipykernel-6.23.2.tar.gz", hash = "sha256:fcfb67c5b504aa1bfcda1c5b3716636239e0f7b9290958f1c558c79b4c0e7ed5"}, + {file = "ipykernel-6.25.1-py3-none-any.whl", hash = "sha256:c8a2430b357073b37c76c21c52184db42f6b4b0e438e1eb7df3c4440d120497c"}, + {file = "ipykernel-6.25.1.tar.gz", hash = "sha256:050391364c0977e768e354bdb60cbbfbee7cbb943b1af1618382021136ffd42f"}, ] [package.dependencies] @@ -3359,7 +3213,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -3379,7 +3233,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "8.12.2" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3419,7 +3272,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "ipython-genutils" version = "0.2.0" description = "Vestigial utilities from IPython" -category = "dev" optional = false python-versions = "*" files = [ @@ -3429,18 +3281,17 @@ files = [ [[package]] name = "ipywidgets" -version = "8.0.6" +version = "8.1.0" description = "Jupyter interactive widgets" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.0.6-py3-none-any.whl", hash = "sha256:a60bf8d2528997e05ac83fd19ea2fbe65f2e79fbe1b2b35779bdfc46c2941dcc"}, - {file = "ipywidgets-8.0.6.tar.gz", hash = "sha256:de7d779f2045d60de9f6c25f653fdae2dba57898e6a1284494b3ba20b6893bb8"}, + {file = "ipywidgets-8.1.0-py3-none-any.whl", hash = "sha256:6c8396cc7b8c95dfb4e9ab0054f48c002f045e7e5d7ae523f559d64e525a98ab"}, + {file = "ipywidgets-8.1.0.tar.gz", hash = "sha256:ce97dd90525b3066fd00094690964e7eac14cf9b7745d35565b5eeac20cce687"}, ] [package.dependencies] -ipykernel = ">=4.5.1" +comm = ">=0.1.3" ipython = ">=6.1.0" jupyterlab-widgets = ">=3.0.7,<3.1.0" traitlets = ">=4.3.1" @@ -3453,7 +3304,6 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] name = "isodate" version = "0.6.1" description = "An ISO 8601 date/time/duration parser and formatter" -category = "main" optional = true python-versions = "*" files = [ @@ -3468,7 +3318,6 @@ six = "*" name = "isoduration" version = "20.11.0" description = "Operations with ISO 8601 durations" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3483,7 +3332,6 @@ arrow = ">=0.15.0" name = "jaraco-context" version = "4.3.0" description = "Context managers by jaraco" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3497,29 +3345,27 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jieba3k" version = "0.35.1" description = "Chinese Words Segementation Utilities" -category = "main" optional = true python-versions = "*" files = [ @@ -3530,7 +3376,6 @@ files = [ name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3548,7 +3393,6 @@ i18n = ["Babel (>=2.7)"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3558,21 +3402,19 @@ files = [ [[package]] name = "joblib" -version = "1.2.0" +version = "1.3.2" description = "Lightweight pipelining with Python functions" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] [[package]] name = "jq" version = "1.4.1" description = "jq is a lightweight and flexible JSON processor." -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -3633,11 +3475,24 @@ files = [ {file = "jq-1.4.1.tar.gz", hash = "sha256:52284ee3cb51670e6f537b0ec813654c064c1c0705bd910097ea0fe17313516d"}, ] +[[package]] +name = "json5" +version = "0.9.14" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = "*" +files = [ + {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, + {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, +] + +[package.extras] +dev = ["hypothesis"] + [[package]] name = "jsonable" version = "0.3.1" description = "An abstract class that supports jsonserialization/deserialization." -category = "main" optional = true python-versions = "*" files = [ @@ -3649,7 +3504,6 @@ files = [ name = "jsonlines" version = "3.1.0" description = "Library with helpers for the jsonlines file format" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3664,36 +3518,37 @@ attrs = ">=19.2.0" name = "jsonpointer" version = "2.4" description = "Identify specific nodes in a JSON document (RFC 6901)" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] name = "jsonschema" -version = "4.17.3" +version = "4.19.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, - {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, + {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, + {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, ] [package.dependencies] -attrs = ">=17.4.0" +attrs = ">=22.2.0" fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +referencing = ">=0.28.4" rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} @@ -3701,11 +3556,25 @@ webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-n format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +[[package]] +name = "jsonschema-specifications" +version = "2023.7.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] + +[package.dependencies] +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +referencing = ">=0.28.0" + [[package]] name = "jupyter" version = "1.0.0" description = "Jupyter metapackage. Install all the Jupyter components in one go." -category = "dev" optional = false python-versions = "*" files = [ @@ -3724,34 +3593,31 @@ qtconsole = "*" [[package]] name = "jupyter-client" -version = "7.4.9" +version = "8.3.0" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_client-7.4.9-py3-none-any.whl", hash = "sha256:214668aaea208195f4c13d28eb272ba79f945fc0cf3f11c7092c20b2ca1980e7"}, - {file = "jupyter_client-7.4.9.tar.gz", hash = "sha256:52be28e04171f07aed8f20e1616a5a552ab9fee9cbbe6c1896ae170c3880d392"}, + {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, + {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, ] [package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.9.2" -nest-asyncio = ">=1.5.4" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" -traitlets = "*" +traitlets = ">=5.3" [package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-console" version = "6.6.3" description = "Jupyter terminal console" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3763,7 +3629,7 @@ files = [ ipykernel = ">=6.14" ipython = "*" jupyter-client = ">=7.0.0" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" prompt-toolkit = ">=3.0.30" pygments = "*" pyzmq = ">=17" @@ -3776,7 +3642,6 @@ test = ["flaky", "pexpect", "pytest"] name = "jupyter-core" version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3795,20 +3660,20 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.6.3" +version = "0.7.0" description = "Jupyter Event System library" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.6.3-py3-none-any.whl", hash = "sha256:57a2749f87ba387cd1bfd9b22a0875b889237dbf2edc2121ebb22bde47036c17"}, - {file = "jupyter_events-0.6.3.tar.gz", hash = "sha256:9a6e9995f75d1b7146b436ea24d696ce3a35bfa8bfe45e0c33c334c79464d0b3"}, + {file = "jupyter_events-0.7.0-py3-none-any.whl", hash = "sha256:4753da434c13a37c3f3c89b500afa0c0a6241633441421f6adafe2fb2e2b924e"}, + {file = "jupyter_events-0.7.0.tar.gz", hash = "sha256:7be27f54b8388c03eefea123a4f79247c5b9381c49fb1cd48615ee191eb12615"}, ] [package.dependencies] -jsonschema = {version = ">=3.2.0", extras = ["format-nongpl"]} +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} python-json-logger = ">=2.0.4" pyyaml = ">=5.3" +referencing = "*" rfc3339-validator = "*" rfc3986-validator = ">=0.1.1" traitlets = ">=5.3" @@ -3816,18 +3681,32 @@ traitlets = ">=5.3" [package.extras] cli = ["click", "rich"] docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "pytest-cov", "rich"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] [[package]] -name = "jupyter-server" -version = "2.6.0" -description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "dev" +name = "jupyter-lsp" +version = "2.2.0" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.6.0-py3-none-any.whl", hash = "sha256:19525a1515b5999618a91b3e99ec9f6869aa8c5ba73e0b6279fcda918b54ba36"}, - {file = "jupyter_server-2.6.0.tar.gz", hash = "sha256:ae4af349f030ed08dd78cb7ac1a03a92d886000380c9ea6283f3c542a81f4b06"}, + {file = "jupyter-lsp-2.2.0.tar.gz", hash = "sha256:8ebbcb533adb41e5d635eb8fe82956b0aafbf0fd443b6c4bfa906edeeb8635a1"}, + {file = "jupyter_lsp-2.2.0-py3-none-any.whl", hash = "sha256:9e06b8b4f7dd50300b70dd1a78c0c3b0c3d8fa68e0f2d8a5d1fbab62072aca3f"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.7.2" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.7.2-py3-none-any.whl", hash = "sha256:98a375347b580e837e7016007c24680a4261ed8ad7cd35196ac087d229f48e5a"}, + {file = "jupyter_server-2.7.2.tar.gz", hash = "sha256:d64fb4e593907290e5df916e3c9399c15ab2cd7bdb71cbcd1d36452dbfb30523"}, ] [package.dependencies] @@ -3835,7 +3714,7 @@ anyio = ">=3.1.0" argon2-cffi = "*" jinja2 = "*" jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" jupyter-events = ">=0.6.0" jupyter-server-terminals = "*" nbconvert = ">=6.4.4" @@ -3845,7 +3724,7 @@ packaging = "*" prometheus-client = "*" pywinpty = {version = "*", markers = "os_name == \"nt\""} pyzmq = ">=24" -send2trash = "*" +send2trash = ">=1.8.2" terminado = ">=0.8.3" tornado = ">=6.2.0" traitlets = ">=5.6.0" @@ -3853,13 +3732,12 @@ websocket-client = "*" [package.extras] docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] [[package]] name = "jupyter-server-terminals" version = "0.4.4" description = "A Jupyter Server Extension Providing Terminals." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3875,11 +3753,43 @@ terminado = ">=0.8.3" docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] +[[package]] +name = "jupyterlab" +version = "4.0.5" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.0.5-py3-none-any.whl", hash = "sha256:13b3a326e7b95d72746fe20dbe80ee1e71165d6905e01ceaf1320eb809cb1b47"}, + {file = "jupyterlab-4.0.5.tar.gz", hash = "sha256:de49deb75f9b9aec478ed04754cbefe9c5d22fd796a5783cdc65e212983d3611"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} +ipykernel = "*" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.19.0,<3" +notebook-shim = ">=0.2" +packaging = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["black[jupyter] (==23.3.0)", "build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.0.271)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] + [[package]] name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3888,81 +3798,107 @@ files = [ ] [[package]] -name = "jupyterlab-widgets" -version = "3.0.7" -description = "Jupyter interactive widgets for JupyterLab" -category = "dev" +name = "jupyterlab-server" +version = "2.24.0" +description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.7-py3-none-any.whl", hash = "sha256:c73f8370338ec19f1bec47254752d6505b03601cbd5a67e6a0b184532f73a459"}, - {file = "jupyterlab_widgets-3.0.7.tar.gz", hash = "sha256:c3a50ed5bf528a0c7a869096503af54702f86dda1db469aee1c92dc0c01b43ca"}, + {file = "jupyterlab_server-2.24.0-py3-none-any.whl", hash = "sha256:5f077e142bb8dc9b843d960f940c513581bceca3793a0d80f9c67d9522c4e876"}, + {file = "jupyterlab_server-2.24.0.tar.gz", hash = "sha256:4e6f99e0a5579bbbc32e449c4dbb039561d4f1a7827d5733273ed56738f21f07"}, +] + +[package.dependencies] +babel = ">=2.10" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.17.3" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.28" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.16.1,<0.17.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.7.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.8" +description = "Jupyter interactive widgets for JupyterLab" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_widgets-3.0.8-py3-none-any.whl", hash = "sha256:4715912d6ceab839c9db35953c764b3214ebbc9161c809f6e0510168845dfdf5"}, + {file = "jupyterlab_widgets-3.0.8.tar.gz", hash = "sha256:d428ab97b8d87cc7c54cbf37644d6e0f0e662f23876e05fa460a73ec3257252a"}, ] [[package]] name = "keras" -version = "2.11.0" +version = "2.13.1" description = "Deep learning for humans." -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "keras-2.11.0-py2.py3-none-any.whl", hash = "sha256:38c6fff0ea9a8b06a2717736565c92a73c8cd9b1c239e7125ccb188b7848f65e"}, + {file = "keras-2.13.1-py3-none-any.whl", hash = "sha256:5ce5f706f779fa7330e63632f327b75ce38144a120376b2ae1917c00fa6136af"}, + {file = "keras-2.13.1.tar.gz", hash = "sha256:5df12cc241a015a11b65ddb452c0eeb2744fce21d9b54ba48db87492568ccc68"}, ] [[package]] name = "lancedb" -version = "0.1.8" +version = "0.1.16" description = "lancedb" -category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "lancedb-0.1.8-py3-none-any.whl", hash = "sha256:09e0ae7d989b4ababeaefa2d50b784dd036e231e90fceee543d01ed24bd601de"}, - {file = "lancedb-0.1.8.tar.gz", hash = "sha256:65a3e93829f39db57ad66ab474d380c9e36e696e68b60bed37434ac1ed1fe215"}, + {file = "lancedb-0.1.16-py3-none-any.whl", hash = "sha256:ed5ff765c127fd8c8b193b448a127ae9de4afd458874e6d981edeafa09cf6a4a"}, + {file = "lancedb-0.1.16.tar.gz", hash = "sha256:c22621635ca1b74f24983b8247886f93d23d7477fdbe5c67449a0939c19ef7bd"}, ] [package.dependencies] -pylance = ">=0.4.20" +aiohttp = "*" +attr = "*" +pydantic = "*" +pylance = "0.5.10" ratelimiter = "*" retry = "*" +semver = "*" tqdm = "*" [package.extras] dev = ["black", "pre-commit", "ruff"] docs = ["mkdocs", "mkdocs-jupyter", "mkdocs-material", "mkdocstrings[python]"] -tests = ["doctest", "pytest", "pytest-mock"] +tests = ["pandas (>=1.4)", "pytest", "pytest-asyncio", "pytest-mock"] [[package]] name = "langkit" -version = "0.0.6" +version = "0.0.15" description = "A collection of text metric udfs for whylogs profiling and monitoring in WhyLabs" -category = "main" optional = true python-versions = ">=3.8,<4.0" files = [ - {file = "langkit-0.0.6-py3-none-any.whl", hash = "sha256:5b36830e9094934c933f8756177b5a8a5c7d6dc014ca49076a358c9c8fb5ddbc"}, - {file = "langkit-0.0.6.tar.gz", hash = "sha256:08421bb0799fc831b0d1e431e600cad8acab7d7bdbf6aa6c7535291172a66343"}, + {file = "langkit-0.0.15-py3-none-any.whl", hash = "sha256:7cf2422215264621e7df49b102fca7a6e3d8806081bbecad6fbe9ddfc8c487c6"}, + {file = "langkit-0.0.15.tar.gz", hash = "sha256:999d3c352461886efb67917dc08810c0e6f87d5985565aa0ecb49d56ddd2eb5c"}, ] [package.dependencies] pandas = "*" textstat = ">=0.7.3,<0.8.0" -whylogs = ">=1.2.3,<2.0.0" +whylogs = "1.2.6" [package.extras] -all = ["datasets (>=2.12.0,<3.0.0)", "nltk (>=3.8.1,<4.0.0)", "openai (>=0.27.6,<0.28.0)", "sentence-transformers (>=2.2.2,<3.0.0)", "torch"] +all = ["datasets (>=2.12.0,<3.0.0)", "evaluate (>=0.4.0,<0.5.0)", "nltk (>=3.8.1,<4.0.0)", "openai (>=0.27.6,<0.28.0)", "sentence-transformers (>=2.2.2,<3.0.0)", "torch"] [[package]] name = "langsmith" -version = "0.0.22" +version = "0.0.25" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.22-py3-none-any.whl", hash = "sha256:1bc94a2e5bfa355ca15d9e658c2c2d04c8cc45c61892a1be08a7c3b40f2fd3f4"}, - {file = "langsmith-0.0.22.tar.gz", hash = "sha256:5726c7841294db2a9e5863e20718878d16e28722bdaf3169a278ff3bda2f0be7"}, + {file = "langsmith-0.0.25-py3-none-any.whl", hash = "sha256:d595435ad21fa6077550d7c85472935d1e8241afa042c1e29287d2c95c3ed151"}, + {file = "langsmith-0.0.25.tar.gz", hash = "sha256:e728c398fc1adaa0ed8abeb21f6a92d7fb19fe3ab49d3911c22b03dfe25935d6"}, ] [package.dependencies] @@ -3971,18 +3907,18 @@ requests = ">=2,<3" [[package]] name = "lark" -version = "1.1.5" +version = "1.1.7" description = "a modern parsing library" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "lark-1.1.5-py3-none-any.whl", hash = "sha256:8476f9903e93fbde4f6c327f74d79e9b4bd0ed9294c5dfa3164ab8c581b5de2a"}, - {file = "lark-1.1.5.tar.gz", hash = "sha256:4b534eae1f9af5b4ea000bea95776350befe1981658eea3820a01c37e504bb4d"}, + {file = "lark-1.1.7-py3-none-any.whl", hash = "sha256:9e5dc5bbf93fa1840083707285262514a0ef8a6613874af7ea1cec60468d6e92"}, + {file = "lark-1.1.7.tar.gz", hash = "sha256:be7437bf1f37ab08b355f29ff2571d77d777113d0a8c4352b0c513dced6c5a1e"}, ] [package.extras] atomic-cache = ["atomicwrites"] +interegular = ["interegular (>=0.3.1,<0.4.0)"] nearley = ["js2py"] regex = ["regex"] @@ -3990,7 +3926,6 @@ regex = ["regex"] name = "lazy-loader" version = "0.3" description = "lazy_loader" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4004,27 +3939,28 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] [[package]] name = "libclang" -version = "16.0.0" +version = "16.0.6" description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." -category = "main" optional = true python-versions = "*" files = [ - {file = "libclang-16.0.0-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:65258a6bb3e7dc31dc9b26f8d42f53c9d3b959643ade291fcd1aef4855303ca6"}, - {file = "libclang-16.0.0-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:af55a4aa86fdfe6b2ec68bc8cfe5fdac6c448d591ca7648be86ca17099b41ca8"}, - {file = "libclang-16.0.0-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:a043138caaf2cb076ebb060c6281ec95612926645d425c691991fc9df00e8a24"}, - {file = "libclang-16.0.0-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:eb59652cb0559c0e71784ff4c8ba24c14644becc907b1446563ecfaa622d523b"}, - {file = "libclang-16.0.0-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:7b6686b67a0daa84b4c614bcc119578329fc4fbb52b919565b7376b507c4793b"}, - {file = "libclang-16.0.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2adce42ae652f312245b8f4eda6f30b4076fb61f7619f2dfd0a0c31dee4c32b9"}, - {file = "libclang-16.0.0-py2.py3-none-win_amd64.whl", hash = "sha256:ee20bf93e3dd330f71fc50cdbf13b92ced0aec8e540be64251db53502a9b33f7"}, - {file = "libclang-16.0.0-py2.py3-none-win_arm64.whl", hash = "sha256:bf4628fc4da7a1dd06a244f9b8e121c5ec68076a763c59d6b13cbb103acc935b"}, + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, + {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, + {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, + {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, + {file = "libclang-16.0.6-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:8130482120500476a027171f8f3c8dfc2536b591716eea71fc5da22cae13131b"}, + {file = "libclang-16.0.6-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:1e940048f51d0b0999099a9b78629ab8a64b62af5e9ff1b2b062439c21ee244d"}, + {file = "libclang-16.0.6-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f04e3060ae1f207f234d0608900c99c50edcb743e5e18276d78da2ddd727d39f"}, + {file = "libclang-16.0.6-py2.py3-none-win_amd64.whl", hash = "sha256:daab4a11dae228f1efa9efa3fe638b493b14d8d52c71fb3c7019e2f1df4514c2"}, + {file = "libclang-16.0.6-py2.py3-none-win_arm64.whl", hash = "sha256:4a9acbfd9c135a72f80d5dbff7588dfb0c81458244a89b9e83526e8595880e0a"}, + {file = "libclang-16.0.6.tar.gz", hash = "sha256:4acdde39dfe410c877b4ccc0d4b57eb952100e4ee26bbdf6cfdb88e2033a7d31"}, ] [[package]] name = "libdeeplake" version = "0.0.60" description = "C++ backend for Deep Lake" -category = "main" optional = true python-versions = "*" files = [ @@ -4055,14 +3991,13 @@ numpy = "*" [[package]] name = "librosa" -version = "0.10.0.post2" +version = "0.10.1" description = "Python module for audio and music processing" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "librosa-0.10.0.post2-py3-none-any.whl", hash = "sha256:0f3b56118cb01ea89df4b04e924c7f48c5c13d42cc55a12540eb04ae87ab5848"}, - {file = "librosa-0.10.0.post2.tar.gz", hash = "sha256:6623673da30773beaae962cb4685f188155582f25bc60fc52da968f59eea8567"}, + {file = "librosa-0.10.1-py3-none-any.whl", hash = "sha256:7ab91d9f5fcb75ea14848a05d3b1f825cf8d0c42ca160d19ae6874f2de2d8223"}, + {file = "librosa-0.10.1.tar.gz", hash = "sha256:832f7d150d6dd08ed2aa08c0567a4be58330635c32ddd2208de9bc91300802c7"}, ] [package.dependencies] @@ -4073,7 +4008,7 @@ lazy-loader = ">=0.1" msgpack = ">=1.0" numba = ">=0.51.0" numpy = ">=1.20.3,<1.22.0 || >1.22.0,<1.22.1 || >1.22.1,<1.22.2 || >1.22.2" -pooch = ">=1.0,<1.7" +pooch = ">=1.0" scikit-learn = ">=0.20.0" scipy = ">=1.2.0" soundfile = ">=0.12.1" @@ -4082,14 +4017,13 @@ typing-extensions = ">=4.1.1" [package.extras] display = ["matplotlib (>=3.3.0)"] -docs = ["ipython (>=7.0)", "matplotlib (>=3.3.0)", "mir-eval (>=0.5)", "numba (>=0.51)", "numpydoc", "presets", "sphinx (!=1.3.1,<6)", "sphinx-gallery (>=0.7)", "sphinx-multiversion (>=0.2.3)", "sphinx-rtd-theme (>=1.0.0,<2.0.0)", "sphinxcontrib-svg2pdfconverter"] +docs = ["ipython (>=7.0)", "matplotlib (>=3.3.0)", "mir-eval (>=0.5)", "numba (>=0.51)", "numpydoc", "presets", "sphinx (!=1.3.1)", "sphinx-gallery (>=0.7)", "sphinx-multiversion (>=0.2.3)", "sphinx-rtd-theme (>=1.2.0)", "sphinxcontrib-svg2pdfconverter"] tests = ["matplotlib (>=3.3.0)", "packaging (>=20.0)", "pytest", "pytest-cov", "pytest-mpl", "resampy (>=0.2.2)", "samplerate", "types-decorator"] [[package]] name = "llvmlite" version = "0.40.1" description = "lightweight wrapper around basic LLVM functionality" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -4123,7 +4057,6 @@ files = [ name = "loguru" version = "0.7.0" description = "Python logging made (stupidly) simple" -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -4140,102 +4073,115 @@ dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegu [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] +source = ["Cython (>=0.29.35)"] [[package]] name = "lz4" version = "4.3.2" description = "LZ4 Bindings for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4285,7 +4231,6 @@ tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] name = "manifest-ml" version = "0.0.1" description = "Manifest for Prompt Programming Foundation Models." -category = "main" optional = true python-versions = ">=3.8.0" files = [ @@ -4307,29 +4252,28 @@ dev = ["autopep8 (>=1.6.0)", "black (>=22.3.0)", "docformatter (>=1.4)", "flake8 [[package]] name = "markdown" -version = "3.4.3" +version = "3.4.4" description = "Python implementation of John Gruber's Markdown." -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "Markdown-3.4.3-py3-none-any.whl", hash = "sha256:065fd4df22da73a625f14890dd77eb8040edcbd68794bcd35943be14490608b2"}, - {file = "Markdown-3.4.3.tar.gz", hash = "sha256:8bf101198e004dc93e84a12a7395e31aac6a9c9942848ae1d99b9d72cf9b3520"}, + {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, + {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, ] [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.0)", "mkdocs-nature (>=0.4)"] testing = ["coverage", "pyyaml"] [[package]] name = "markdown-it-py" -version = "2.2.0" +version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] @@ -4342,14 +4286,13 @@ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0 linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4409,7 +4352,6 @@ files = [ name = "marqo" version = "1.2.4" description = "Tensor search for humans" -category = "main" optional = true python-versions = ">=3" files = [ @@ -4426,30 +4368,28 @@ urllib3 = "*" [[package]] name = "marshmallow" -version = "3.19.0" +version = "3.20.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, - {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, + {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, + {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] name = "marshmallow-enum" version = "1.5.1" description = "Enum field for Marshmallow" -category = "main" optional = false python-versions = "*" files = [ @@ -4464,7 +4404,6 @@ marshmallow = ">=2.0.0" name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -4479,7 +4418,6 @@ traitlets = "*" name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4489,21 +4427,19 @@ files = [ [[package]] name = "mistune" -version = "2.0.5" -description = "A sane Markdown parser with useful plugins and renderers" -category = "dev" +version = "3.0.1" +description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "mistune-2.0.5-py2.py3-none-any.whl", hash = "sha256:bad7f5d431886fcbaf5f758118ecff70d31f75231b34024a1341120340a65ce8"}, - {file = "mistune-2.0.5.tar.gz", hash = "sha256:0246113cb2492db875c6be56974a7c893333bf26cd92891c85f63151cee09d34"}, + {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, + {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, ] [[package]] name = "mmh3" version = "3.1.0" description = "Python wrapper for MurmurHash (MurmurHash3), a set of fast and robust hash functions." -category = "main" optional = true python-versions = "*" files = [ @@ -4546,31 +4482,29 @@ files = [ [[package]] name = "momento" -version = "1.6.0" +version = "1.7.1" description = "SDK for Momento" -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ - {file = "momento-1.6.0-py3-none-any.whl", hash = "sha256:a7f9a85a4372274bd5eafba95d6ab72bafa2d947abfbb16f8d0afb4b6501e4fb"}, - {file = "momento-1.6.0.tar.gz", hash = "sha256:55a2f628d750b1da1c5013b7413102b1d9e5545dcf53ce20a0259f35be32a961"}, + {file = "momento-1.7.1-py3-none-any.whl", hash = "sha256:b5b37a7c0015ed98a52a05e156babf58c0cd222771d5e3b83a10b5e2cd821e61"}, + {file = "momento-1.7.1.tar.gz", hash = "sha256:15a627c67de8e95eb9269ce31590650c1289ef8baa793dac4a507329e8e60469"}, ] [package.dependencies] grpcio = ">=1.46.0,<2.0.0" -momento-wire-types = ">=0.64,<0.65" +momento-wire-types = ">=0.67,<0.68" pyjwt = ">=2.4.0,<3.0.0" [[package]] name = "momento-wire-types" -version = "0.64.1" +version = "0.67.0" description = "Momento Client Proto Generated Files" -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ - {file = "momento_wire_types-0.64.1-py3-none-any.whl", hash = "sha256:b6fb773831e7aaf95c60223e450e985606076a45df120814ecb9a97904948fe5"}, - {file = "momento_wire_types-0.64.1.tar.gz", hash = "sha256:625395e2d744117a23e100604b6e44c84fcb020f935c128fc18fd356047ea4ee"}, + {file = "momento_wire_types-0.67.0-py3-none-any.whl", hash = "sha256:b596b45fe20534afba57c57cad50f70cc2b77c0d090646165d4bce66165ed290"}, + {file = "momento_wire_types-0.67.0.tar.gz", hash = "sha256:64fb30794940e6004b4e678b52b8b2728e3fce4390ac427a38054615795165c4"}, ] [package.dependencies] @@ -4579,21 +4513,19 @@ protobuf = ">=3,<5" [[package]] name = "more-itertools" -version = "9.1.0" +version = "10.1.0" description = "More routines for operating on iterables, beyond itertools" -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, - {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, + {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"}, + {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"}, ] [[package]] name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" -category = "main" optional = true python-versions = "*" files = [ @@ -4609,18 +4541,17 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msal" -version = "1.22.0" +version = "1.23.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." -category = "main" optional = true python-versions = "*" files = [ - {file = "msal-1.22.0-py2.py3-none-any.whl", hash = "sha256:9120b7eafdf061c92f7b3d744e5f325fca35873445fa8ffebb40b1086a13dd58"}, - {file = "msal-1.22.0.tar.gz", hash = "sha256:8a82f5375642c1625c89058018430294c109440dce42ea667d466c2cab520acd"}, + {file = "msal-1.23.0-py2.py3-none-any.whl", hash = "sha256:3342e0837a047007f9d479e814b559c3219767453d57920dc40a31986862048b"}, + {file = "msal-1.23.0.tar.gz", hash = "sha256:25c9a33acf84301f93d1fdbe9f1a9c60cd38af0d5fffdbfa378138fc7bc1e86b"}, ] [package.dependencies] -cryptography = ">=0.6,<43" +cryptography = ">=0.6,<44" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" @@ -4631,7 +4562,6 @@ broker = ["pymsalruntime (>=0.13.2,<0.14)"] name = "msal-extensions" version = "1.0.0" description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." -category = "main" optional = true python-versions = "*" files = [ @@ -4650,7 +4580,6 @@ portalocker = [ name = "msgpack" version = "1.0.5" description = "MessagePack serializer" -category = "main" optional = true python-versions = "*" files = [ @@ -4723,7 +4652,6 @@ files = [ name = "msrest" version = "0.7.1" description = "AutoRest swagger generator Python client runtime." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -4745,7 +4673,6 @@ async = ["aiodns", "aiohttp (>=3.0)"] name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4827,36 +4754,36 @@ files = [ [[package]] name = "multiprocess" -version = "0.70.14" -description = "better multiprocessing and multithreading in python" -category = "main" +version = "0.70.15" +description = "better multiprocessing and multithreading in Python" optional = true python-versions = ">=3.7" files = [ - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:560a27540daef4ce8b24ed3cc2496a3c670df66c96d02461a4da67473685adf3"}, - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-manylinux_2_24_i686.whl", hash = "sha256:bfbbfa36f400b81d1978c940616bc77776424e5e34cb0c94974b178d727cfcd5"}, - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:89fed99553a04ec4f9067031f83a886d7fdec5952005551a896a4b6a59575bb9"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:40a5e3685462079e5fdee7c6789e3ef270595e1755199f0d50685e72523e1d2a"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-manylinux_2_24_i686.whl", hash = "sha256:44936b2978d3f2648727b3eaeab6d7fa0bedf072dc5207bf35a96d5ee7c004cf"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e628503187b5d494bf29ffc52d3e1e57bb770ce7ce05d67c4bbdb3a0c7d3b05f"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d5da0fc84aacb0e4bd69c41b31edbf71b39fe2fb32a54eaedcaea241050855c"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-manylinux_2_24_i686.whl", hash = "sha256:6a7b03a5b98e911a7785b9116805bd782815c5e2bd6c91c6a320f26fd3e7b7ad"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:cea5bdedd10aace3c660fedeac8b087136b4366d4ee49a30f1ebf7409bce00ae"}, - {file = "multiprocess-0.70.14-py310-none-any.whl", hash = "sha256:7dc1f2f6a1d34894c8a9a013fbc807971e336e7cc3f3ff233e61b9dc679b3b5c"}, - {file = "multiprocess-0.70.14-py37-none-any.whl", hash = "sha256:93a8208ca0926d05cdbb5b9250a604c401bed677579e96c14da3090beb798193"}, - {file = "multiprocess-0.70.14-py38-none-any.whl", hash = "sha256:6725bc79666bbd29a73ca148a0fb5f4ea22eed4a8f22fce58296492a02d18a7b"}, - {file = "multiprocess-0.70.14-py39-none-any.whl", hash = "sha256:63cee628b74a2c0631ef15da5534c8aedbc10c38910b9c8b18dcd327528d1ec7"}, - {file = "multiprocess-0.70.14.tar.gz", hash = "sha256:3eddafc12f2260d27ae03fe6069b12570ab4764ab59a75e81624fac453fbf46a"}, + {file = "multiprocess-0.70.15-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:aa36c7ed16f508091438687fe9baa393a7a8e206731d321e443745e743a0d4e5"}, + {file = "multiprocess-0.70.15-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:20e024018c46d0d1602024c613007ac948f9754659e3853b0aa705e83f6931d8"}, + {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_i686.whl", hash = "sha256:e576062981c91f0fe8a463c3d52506e598dfc51320a8dd8d78b987dfca91c5db"}, + {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e73f497e6696a0f5433ada2b3d599ae733b87a6e8b008e387c62ac9127add177"}, + {file = "multiprocess-0.70.15-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73db2e7b32dcc7f9b0f075c2ffa45c90b6729d3f1805f27e88534c8d321a1be5"}, + {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_i686.whl", hash = "sha256:4271647bd8a49c28ecd6eb56a7fdbd3c212c45529ad5303b40b3c65fc6928e5f"}, + {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:cf981fb998d6ec3208cb14f0cf2e9e80216e834f5d51fd09ebc937c32b960902"}, + {file = "multiprocess-0.70.15-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:18f9f2c7063346d1617bd1684fdcae8d33380ae96b99427260f562e1a1228b67"}, + {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_i686.whl", hash = "sha256:0eac53214d664c49a34695e5824872db4006b1a465edd7459a251809c3773370"}, + {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1a51dd34096db47fb21fa2b839e615b051d51b97af9a67afbcdaa67186b44883"}, + {file = "multiprocess-0.70.15-py310-none-any.whl", hash = "sha256:7dd58e33235e83cf09d625e55cffd7b0f0eede7ee9223cdd666a87624f60c21a"}, + {file = "multiprocess-0.70.15-py311-none-any.whl", hash = "sha256:134f89053d82c9ed3b73edd3a2531eb791e602d4f4156fc92a79259590bd9670"}, + {file = "multiprocess-0.70.15-py37-none-any.whl", hash = "sha256:f7d4a1629bccb433114c3b4885f69eccc200994323c80f6feee73b0edc9199c5"}, + {file = "multiprocess-0.70.15-py38-none-any.whl", hash = "sha256:bee9afba476c91f9ebee7beeee0601face9eff67d822e893f9a893725fbd6316"}, + {file = "multiprocess-0.70.15-py39-none-any.whl", hash = "sha256:3e0953f5d52b4c76f1c973eaf8214554d146f2be5decb48e928e55c7a2d19338"}, + {file = "multiprocess-0.70.15.tar.gz", hash = "sha256:f20eed3036c0ef477b07a4177cf7c1ba520d9a2677870a4f47fe026f0cd6787e"}, ] [package.dependencies] -dill = ">=0.3.6" +dill = ">=0.3.7" [[package]] name = "mwcli" version = "0.0.3" description = "Utilities for processing MediaWiki on the command line." -category = "main" optional = true python-versions = "*" files = [ @@ -4873,7 +4800,6 @@ para = "*" name = "mwparserfromhell" version = "0.6.4" description = "MWParserFromHell is a parser for MediaWiki wikicode." -category = "main" optional = true python-versions = ">= 3.6" files = [ @@ -4911,7 +4837,6 @@ files = [ name = "mwtypes" version = "0.3.2" description = "A set of types for processing MediaWiki data." -category = "main" optional = true python-versions = "*" files = [ @@ -4926,7 +4851,6 @@ jsonable = ">=0.3.0" name = "mwxml" version = "0.3.3" description = "A set of utilities for processing MediaWiki XML dump data." -category = "main" optional = true python-versions = "*" files = [ @@ -4944,7 +4868,6 @@ para = ">=0.0.1" name = "mypy" version = "0.991" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4995,7 +4918,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -5007,7 +4929,6 @@ files = [ name = "mypy-protobuf" version = "3.3.0" description = "Generate mypy stub files from protobuf specs" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5019,75 +4940,37 @@ files = [ protobuf = ">=3.19.4" types-protobuf = ">=3.19.12" -[[package]] -name = "nbclassic" -version = "1.0.0" -description = "Jupyter Notebook as a Jupyter Server extension." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "nbclassic-1.0.0-py3-none-any.whl", hash = "sha256:f99e4769b4750076cd4235c044b61232110733322384a94a63791d2e7beacc66"}, - {file = "nbclassic-1.0.0.tar.gz", hash = "sha256:0ae11eb2319455d805596bf320336cda9554b41d99ab9a3c31bf8180bffa30e3"}, -] - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=6.1.1" -jupyter-core = ">=4.6.1" -jupyter-server = ">=1.8" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -notebook-shim = ">=0.2.3" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -json-logging = ["json-logging"] -test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-playwright", "pytest-tornasync", "requests", "requests-unixsocket", "testpath"] - [[package]] name = "nbclient" -version = "0.7.4" +version = "0.8.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.7.4-py3-none-any.whl", hash = "sha256:c817c0768c5ff0d60e468e017613e6eae27b6fa31e43f905addd2d24df60c125"}, - {file = "nbclient-0.7.4.tar.gz", hash = "sha256:d447f0e5a4cfe79d462459aec1b3dc5c2e9152597262be8ee27f7d4c02566a0d"}, + {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, + {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, ] [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" nbformat = ">=5.1" -traitlets = ">=5.3" +traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.5.0" +version = "7.7.4" description = "Converting Jupyter Notebooks" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "nbconvert-7.5.0-py3-none-any.whl", hash = "sha256:852e44392d5650ef217a5ce3a8050747051d4e6ba75f0574cb5435049ee6c0d9"}, - {file = "nbconvert-7.5.0.tar.gz", hash = "sha256:f78fd22fd2410b960d5d9bcecf3e1d6c7bdc5fec2c865964c84aa4e74e6e88da"}, + {file = "nbconvert-7.7.4-py3-none-any.whl", hash = "sha256:ace26f4386d08eb5c55833596a942048c5502a95e05590cb523826a749a40a37"}, + {file = "nbconvert-7.7.4.tar.gz", hash = "sha256:1113d039fa3fc3a846ffa5a3b0a019e85aaa94c566a09fa0c400fb7638e46087"}, ] [package.dependencies] @@ -5099,7 +4982,7 @@ jinja2 = ">=3.0" jupyter-core = ">=4.7" jupyterlab-pygments = "*" markupsafe = ">=2.0" -mistune = ">=2.0.3,<3" +mistune = ">=2.0.3,<4" nbclient = ">=0.5.0" nbformat = ">=5.7" packaging = "*" @@ -5114,19 +4997,18 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] -webpdf = ["pyppeteer (>=1,<1.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.0" +version = "5.9.2" description = "The Jupyter Notebook format" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.0-py3-none-any.whl", hash = "sha256:8c8fa16d6d05062c26177754bfbfac22de644888e2ef69d27ad2a334cf2576e5"}, - {file = "nbformat-5.9.0.tar.gz", hash = "sha256:e98ebb6120c3efbafdee2a40af2a140cadee90bb06dd69a2a63d9551fcc7f976"}, + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, ] [package.dependencies] @@ -5143,7 +5025,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nebula3-python" version = "3.4.0" description = "Python client for NebulaGraph V3.4" -category = "main" optional = true python-versions = "*" files = [ @@ -5159,13 +5040,12 @@ six = ">=1.16.0" [[package]] name = "neo4j" -version = "5.9.0" +version = "5.11.0" description = "Neo4j Bolt driver for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "neo4j-5.9.0.tar.gz", hash = "sha256:b0abc0065f616bfd8230a48b1f6c91f9aacd7e2aea76d72d09a745ae169cf4da"}, + {file = "neo4j-5.11.0.tar.gz", hash = "sha256:81d425ef9a53279c6909ec8d33e7dc913acc840292f0f3a047f3c3c5b74bccb5"}, ] [package.dependencies] @@ -5177,21 +5057,19 @@ pandas = ["numpy (>=1.7.0,<2.0.0)", "pandas (>=1.1.0,<3.0.0)"] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.7" description = "Patch asyncio to allow nested event loops" -category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, + {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, ] [[package]] name = "networkx" version = "2.8.8" description = "Python package for creating and manipulating graphs and networks" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -5210,7 +5088,6 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] name = "newspaper3k" version = "0.2.8" description = "Simplified python article discovery & extraction." -category = "main" optional = true python-versions = "*" files = [ @@ -5235,14 +5112,13 @@ tldextract = ">=2.0.1" [[package]] name = "nlpcloud" -version = "1.0.42" +version = "1.1.44" description = "Python client for the NLP Cloud API" -category = "main" optional = true python-versions = "*" files = [ - {file = "nlpcloud-1.0.42-py3-none-any.whl", hash = "sha256:85bf408a86c8bc14c7c80a63c9d964cd03d54cc0fe153c01d9d0a4215975b5ad"}, - {file = "nlpcloud-1.0.42.tar.gz", hash = "sha256:5d3dda69d62b758664f04124513745b53311d4ba1c88ed23428fd0085709716c"}, + {file = "nlpcloud-1.1.44-py3-none-any.whl", hash = "sha256:ca05fe9d6bd7def583b4202b63ca423234c5b921e2ced5a20e9a0020619dc4c5"}, + {file = "nlpcloud-1.1.44.tar.gz", hash = "sha256:74e5bf33d1492620a28b8fa5649e8f8366c0752a6e978251b7361d23b56025b3"}, ] [package.dependencies] @@ -5252,7 +5128,6 @@ requests = "*" name = "nltk" version = "3.8.1" description = "Natural Language Toolkit" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -5278,7 +5153,6 @@ twitter = ["twython"] name = "nomic" version = "1.1.14" description = "The offical Nomic python client." -category = "main" optional = true python-versions = "*" files = [ @@ -5304,44 +5178,32 @@ gpt4all = ["peft (==0.3.0.dev0)", "sentencepiece", "torch", "transformers (==4.2 [[package]] name = "notebook" -version = "6.5.4" -description = "A web-based notebook environment for interactive computing" -category = "dev" +version = "7.0.2" +description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "notebook-6.5.4-py3-none-any.whl", hash = "sha256:dd17e78aefe64c768737b32bf171c1c766666a21cc79a44d37a1700771cab56f"}, - {file = "notebook-6.5.4.tar.gz", hash = "sha256:517209568bd47261e2def27a140e97d49070602eea0d226a696f42a7f16c9a4e"}, + {file = "notebook-7.0.2-py3-none-any.whl", hash = "sha256:c77b1499dc9b07ce4f4f26990dcb25b2107b434f2536766b51a72a4228d9a4b6"}, + {file = "notebook-7.0.2.tar.gz", hash = "sha256:d70d6a07418c829bd5f54337ce993b7105261d9026f9d3fe68e9b8aa1a20da9a"}, ] [package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=5.3.4" -jupyter-core = ">=4.6.1" -nbclassic = ">=0.4.7" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" +importlib-resources = {version = ">=5.0", markers = "python_version < \"3.9\""} +jupyter-server = ">=2.4.0,<3" +jupyterlab = ">=4.0.2,<5" +jupyterlab-server = ">=2.22.1,<3" +notebook-shim = ">=0.2,<0.3" +tornado = ">=6.2.0" [package.extras] -docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -json-logging = ["json-logging"] -test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixsocket", "selenium (==4.1.5)", "testpath"] +dev = ["hatch", "pre-commit"] +docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" version = "0.2.3" description = "A shim layer for notebook traits and config" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5359,7 +5221,6 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" name = "numba" version = "0.57.1" description = "compiling Python code using LLVM" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -5391,14 +5252,13 @@ files = [ [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -llvmlite = ">=0.40.0dev0,<0.41" +llvmlite = "==0.40.*" numpy = ">=1.21,<1.25" [[package]] name = "numcodecs" version = "0.11.0" description = "A Python package providing buffer compression and transformation codecs for use" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -5429,42 +5289,41 @@ zfpy = ["zfpy (>=1.0.0)"] [[package]] name = "numexpr" -version = "2.8.4" +version = "2.8.5" description = "Fast numerical expression evaluator for NumPy" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, - {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, - {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, - {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, - {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, - {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, - {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, - {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, - {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, - {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, - {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, - {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, - {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, - {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, + {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, + {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, + {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, + {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, + {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, + {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, + {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, + {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, + {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, + {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, + {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, + {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, ] [package.dependencies] @@ -5474,7 +5333,6 @@ numpy = ">=1.13.3" name = "numpy" version = "1.24.3" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -5512,7 +5370,6 @@ files = [ name = "nvidia-cublas-cu11" version = "11.10.3.66" description = "CUBLAS native runtime libraries" -category = "main" optional = true python-versions = ">=3" files = [ @@ -5528,7 +5385,6 @@ wheel = "*" name = "nvidia-cuda-nvrtc-cu11" version = "11.7.99" description = "NVRTC native runtime libraries" -category = "main" optional = true python-versions = ">=3" files = [ @@ -5545,7 +5401,6 @@ wheel = "*" name = "nvidia-cuda-runtime-cu11" version = "11.7.99" description = "CUDA Runtime native Libraries" -category = "main" optional = true python-versions = ">=3" files = [ @@ -5561,7 +5416,6 @@ wheel = "*" name = "nvidia-cudnn-cu11" version = "8.5.0.96" description = "cuDNN runtime libraries" -category = "main" optional = true python-versions = ">=3" files = [ @@ -5577,7 +5431,6 @@ wheel = "*" name = "o365" version = "2.0.27" description = "Microsoft Graph and Office 365 API made easy" -category = "main" optional = true python-versions = ">=3.4" files = [ @@ -5598,7 +5451,6 @@ tzlocal = ">=4.0,<5.0" name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -5615,7 +5467,6 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "openai" version = "0.27.8" description = "Python client library for the OpenAI API" -category = "main" optional = false python-versions = ">=3.7.1" files = [ @@ -5630,7 +5481,7 @@ tqdm = "*" [package.extras] datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)", "pytest-asyncio", "pytest-mock"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] @@ -5638,7 +5489,6 @@ wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1 name = "openapi-schema-pydantic" version = "1.2.4" description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" optional = true python-versions = ">=3.6.1" files = [ @@ -5653,7 +5503,6 @@ pydantic = ">=1.8.2" name = "openlm" version = "0.0.5" description = "Drop-in OpenAI-compatible that can call LLMs from other providers" -category = "main" optional = true python-versions = ">=3.8.1,<4.0" files = [ @@ -5666,14 +5515,13 @@ requests = ">=2,<3" [[package]] name = "opensearch-py" -version = "2.2.0" +version = "2.3.1" description = "Python client for OpenSearch" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" files = [ - {file = "opensearch-py-2.2.0.tar.gz", hash = "sha256:109fe8d2e1e8f419a22358eb901025f51e6ad2f50014c8962e23796b2a23cb67"}, - {file = "opensearch_py-2.2.0-py2.py3-none-any.whl", hash = "sha256:595dcebe42e21cdf945add0b5dbaecccace1a8a5ba65d60314813767b564263c"}, + {file = "opensearch-py-2.3.1.tar.gz", hash = "sha256:f82a2e914835f7d645a632777de9a62d0c0de60ffd2f8cdae2ccfa4cfc40a185"}, + {file = "opensearch_py-2.3.1-py2.py3-none-any.whl", hash = "sha256:eafbc5d56a7ca696afba7d77bcda1bbb849050cbf9265d57d8476576cb576395"}, ] [package.dependencies] @@ -5693,7 +5541,6 @@ kerberos = ["requests-kerberos"] name = "opt-einsum" version = "3.3.0" description = "Optimizing numpys einsum function" -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -5710,77 +5557,88 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"] [[package]] name = "orjson" -version = "3.9.1" +version = "3.9.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "orjson-3.9.1-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4434b7b786fdc394b95d029fb99949d7c2b05bbd4bf5cb5e3906be96ffeee3b"}, - {file = "orjson-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09faf14f74ed47e773fa56833be118e04aa534956f661eb491522970b7478e3b"}, - {file = "orjson-3.9.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:503eb86a8d53a187fe66aa80c69295a3ca35475804da89a9547e4fce5f803822"}, - {file = "orjson-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20f2804b5a1dbd3609c086041bd243519224d47716efd7429db6c03ed28b7cc3"}, - {file = "orjson-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fd828e0656615a711c4cc4da70f3cac142e66a6703ba876c20156a14e28e3fa"}, - {file = "orjson-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec53d648176f873203b9c700a0abacab33ca1ab595066e9d616f98cdc56f4434"}, - {file = "orjson-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e186ae76b0d97c505500664193ddf508c13c1e675d9b25f1f4414a7606100da6"}, - {file = "orjson-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d4edee78503016f4df30aeede0d999b3cb11fb56f47e9db0e487bce0aaca9285"}, - {file = "orjson-3.9.1-cp310-none-win_amd64.whl", hash = "sha256:a4cc5d21e68af982d9a2528ac61e604f092c60eed27aef3324969c68f182ec7e"}, - {file = "orjson-3.9.1-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:761b6efd33c49de20dd73ce64cc59da62c0dab10aa6015f582680e0663cc792c"}, - {file = "orjson-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31229f9d0b8dc2ef7ee7e4393f2e4433a28e16582d4b25afbfccc9d68dc768f8"}, - {file = "orjson-3.9.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b7ab18d55ecb1de543d452f0a5f8094b52282b916aa4097ac11a4c79f317b86"}, - {file = "orjson-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db774344c39041f4801c7dfe03483df9203cbd6c84e601a65908e5552228dd25"}, - {file = "orjson-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae47ef8c0fe89c4677db7e9e1fb2093ca6e66c3acbee5442d84d74e727edad5e"}, - {file = "orjson-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:103952c21575b9805803c98add2eaecd005580a1e746292ed2ec0d76dd3b9746"}, - {file = "orjson-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2cb0121e6f2c9da3eddf049b99b95fef0adf8480ea7cb544ce858706cdf916eb"}, - {file = "orjson-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:24d4ddaa2876e657c0fd32902b5c451fd2afc35159d66a58da7837357044b8c2"}, - {file = "orjson-3.9.1-cp311-none-win_amd64.whl", hash = "sha256:0b53b5f72cf536dd8aa4fc4c95e7e09a7adb119f8ff8ee6cc60f735d7740ad6a"}, - {file = "orjson-3.9.1-cp37-cp37m-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4b68d01a506242316a07f1d2f29fb0a8b36cee30a7c35076f1ef59dce0890c1"}, - {file = "orjson-3.9.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9dd4abe6c6fd352f00f4246d85228f6a9847d0cc14f4d54ee553718c225388f"}, - {file = "orjson-3.9.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e20bca5e13041e31ceba7a09bf142e6d63c8a7467f5a9c974f8c13377c75af2"}, - {file = "orjson-3.9.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8ae0467d01eb1e4bcffef4486d964bfd1c2e608103e75f7074ed34be5df48cc"}, - {file = "orjson-3.9.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06f6ab4697fab090517f295915318763a97a12ee8186054adf21c1e6f6abbd3d"}, - {file = "orjson-3.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8515867713301fa065c58ec4c9053ba1a22c35113ab4acad555317b8fd802e50"}, - {file = "orjson-3.9.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:393d0697d1dfa18d27d193e980c04fdfb672c87f7765b87952f550521e21b627"}, - {file = "orjson-3.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d96747662d3666f79119e5d28c124e7d356c7dc195cd4b09faea4031c9079dc9"}, - {file = "orjson-3.9.1-cp37-none-win_amd64.whl", hash = "sha256:6d173d3921dd58a068c88ec22baea7dbc87a137411501618b1292a9d6252318e"}, - {file = "orjson-3.9.1-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d1c2b0b4246c992ce2529fc610a446b945f1429445ece1c1f826a234c829a918"}, - {file = "orjson-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19f70ba1f441e1c4bb1a581f0baa092e8b3e3ce5b2aac2e1e090f0ac097966da"}, - {file = "orjson-3.9.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:375d65f002e686212aac42680aed044872c45ee4bc656cf63d4a215137a6124a"}, - {file = "orjson-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4751cee4a7b1daeacb90a7f5adf2170ccab893c3ab7c5cea58b45a13f89b30b3"}, - {file = "orjson-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d9a2a4b2302d5ebc3695498ebc305c3568e5ad4f3501eb30a6405a32d8af22"}, - {file = "orjson-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46b4facc32643b2689dfc292c0c463985dac4b6ab504799cf51fc3c6959ed668"}, - {file = "orjson-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec7c8a0f1bf35da0d5fd14f8956f3b82a9a6918a3c6963d718dfd414d6d3b604"}, - {file = "orjson-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d3a40b0fbe06ccd4d6a99e523d20b47985655bcada8d1eba485b1b32a43e4904"}, - {file = "orjson-3.9.1-cp38-none-win_amd64.whl", hash = "sha256:402f9d3edfec4560a98880224ec10eba4c5f7b4791e4bc0d4f4d8df5faf2a006"}, - {file = "orjson-3.9.1-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:49c0d78dcd34626e2e934f1192d7c052b94e0ecadc5f386fd2bda6d2e03dadf5"}, - {file = "orjson-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:125f63e56d38393daa0a1a6dc6fedefca16c538614b66ea5997c3bd3af35ef26"}, - {file = "orjson-3.9.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08927970365d2e1f3ce4894f9ff928a7b865d53f26768f1bbdd85dd4fee3e966"}, - {file = "orjson-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9a744e212d4780ecd67f4b6b128b2e727bee1df03e7059cddb2dfe1083e7dc4"}, - {file = "orjson-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d1dbf36db7240c61eec98c8d21545d671bce70be0730deb2c0d772e06b71af3"}, - {file = "orjson-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80a1e384626f76b66df615f7bb622a79a25c166d08c5d2151ffd41f24c4cc104"}, - {file = "orjson-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:15d28872fb055bf17ffca913826e618af61b2f689d2b170f72ecae1a86f80d52"}, - {file = "orjson-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e4d905338f9ef32c67566929dfbfbb23cc80287af8a2c38930fb0eda3d40b76"}, - {file = "orjson-3.9.1-cp39-none-win_amd64.whl", hash = "sha256:48a27da6c7306965846565cc385611d03382bbd84120008653aa2f6741e2105d"}, - {file = "orjson-3.9.1.tar.gz", hash = "sha256:db373a25ec4a4fccf8186f9a72a1b3442837e40807a736a815ab42481e83b7d0"}, + {file = "orjson-3.9.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ad6845912a71adcc65df7c8a7f2155eba2096cf03ad2c061c93857de70d699ad"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e298e0aacfcc14ef4476c3f409e85475031de24e5b23605a465e9bf4b2156273"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:83c9939073281ef7dd7c5ca7f54cceccb840b440cec4b8a326bda507ff88a0a6"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e174cc579904a48ee1ea3acb7045e8a6c5d52c17688dfcb00e0e842ec378cabf"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8d51702f42c785b115401e1d64a27a2ea767ae7cf1fb8edaa09c7cf1571c660"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d61c0c7414ddee1ef4d0f303e2222f8cced5a2e26d9774751aecd72324c9e"}, + {file = "orjson-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d748cc48caf5a91c883d306ab648df1b29e16b488c9316852844dd0fd000d1c2"}, + {file = "orjson-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bd19bc08fa023e4c2cbf8294ad3f2b8922f4de9ba088dbc71e6b268fdf54591c"}, + {file = "orjson-3.9.5-cp310-none-win32.whl", hash = "sha256:5793a21a21bf34e1767e3d61a778a25feea8476dcc0bdf0ae1bc506dc34561ea"}, + {file = "orjson-3.9.5-cp310-none-win_amd64.whl", hash = "sha256:2bcec0b1024d0031ab3eab7a8cb260c8a4e4a5e35993878a2da639d69cdf6a65"}, + {file = "orjson-3.9.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8547b95ca0e2abd17e1471973e6d676f1d8acedd5f8fb4f739e0612651602d66"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87ce174d6a38d12b3327f76145acbd26f7bc808b2b458f61e94d83cd0ebb4d76"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a960bb1bc9a964d16fcc2d4af5a04ce5e4dfddca84e3060c35720d0a062064fe"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a7aa5573a949760d6161d826d34dc36db6011926f836851fe9ccb55b5a7d8e8"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b2852afca17d7eea85f8e200d324e38c851c96598ac7b227e4f6c4e59fbd3df"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa185959c082475288da90f996a82e05e0c437216b96f2a8111caeb1d54ef926"}, + {file = "orjson-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:89c9332695b838438ea4b9a482bce8ffbfddde4df92750522d928fb00b7b8dce"}, + {file = "orjson-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2493f1351a8f0611bc26e2d3d407efb873032b4f6b8926fed8cfed39210ca4ba"}, + {file = "orjson-3.9.5-cp311-none-win32.whl", hash = "sha256:ffc544e0e24e9ae69301b9a79df87a971fa5d1c20a6b18dca885699709d01be0"}, + {file = "orjson-3.9.5-cp311-none-win_amd64.whl", hash = "sha256:89670fe2732e3c0c54406f77cad1765c4c582f67b915c74fda742286809a0cdc"}, + {file = "orjson-3.9.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:15df211469625fa27eced4aa08dc03e35f99c57d45a33855cc35f218ea4071b8"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9f17c59fe6c02bc5f89ad29edb0253d3059fe8ba64806d789af89a45c35269a"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca6b96659c7690773d8cebb6115c631f4a259a611788463e9c41e74fa53bf33f"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26fafe966e9195b149950334bdbe9026eca17fe8ffe2d8fa87fdc30ca925d30"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9006b1eb645ecf460da067e2dd17768ccbb8f39b01815a571bfcfab7e8da5e52"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebfdbf695734b1785e792a1315e41835ddf2a3e907ca0e1c87a53f23006ce01d"}, + {file = "orjson-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4a3943234342ab37d9ed78fb0a8f81cd4b9532f67bf2ac0d3aa45fa3f0a339f3"}, + {file = "orjson-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e6762755470b5c82f07b96b934af32e4d77395a11768b964aaa5eb092817bc31"}, + {file = "orjson-3.9.5-cp312-none-win_amd64.whl", hash = "sha256:c74df28749c076fd6e2157190df23d43d42b2c83e09d79b51694ee7315374ad5"}, + {file = "orjson-3.9.5-cp37-cp37m-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:88e18a74d916b74f00d0978d84e365c6bf0e7ab846792efa15756b5fb2f7d49d"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28514b5b6dfaf69097be70d0cf4f1407ec29d0f93e0b4131bf9cc8fd3f3e374"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b81aca8c7be61e2566246b6a0ca49f8aece70dd3f38c7f5c837f398c4cb142"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:385c1c713b1e47fd92e96cf55fd88650ac6dfa0b997e8aa7ecffd8b5865078b1"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9850c03a8e42fba1a508466e6a0f99472fd2b4a5f30235ea49b2a1b32c04c11"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4449f84bbb13bcef493d8aa669feadfced0f7c5eea2d0d88b5cc21f812183af8"}, + {file = "orjson-3.9.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:86127bf194f3b873135e44ce5dc9212cb152b7e06798d5667a898a00f0519be4"}, + {file = "orjson-3.9.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0abcd039f05ae9ab5b0ff11624d0b9e54376253b7d3217a358d09c3edf1d36f7"}, + {file = "orjson-3.9.5-cp37-none-win32.whl", hash = "sha256:10cc8ad5ff7188efcb4bec196009d61ce525a4e09488e6d5db41218c7fe4f001"}, + {file = "orjson-3.9.5-cp37-none-win_amd64.whl", hash = "sha256:ff27e98532cb87379d1a585837d59b187907228268e7b0a87abe122b2be6968e"}, + {file = "orjson-3.9.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5bfa79916ef5fef75ad1f377e54a167f0de334c1fa4ebb8d0224075f3ec3d8c0"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87dfa6ac0dae764371ab19b35eaaa46dfcb6ef2545dfca03064f21f5d08239f"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50ced24a7b23058b469ecdb96e36607fc611cbaee38b58e62a55c80d1b3ad4e1"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1b74ea2a3064e1375da87788897935832e806cc784de3e789fd3c4ab8eb3fa5"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7cb961efe013606913d05609f014ad43edfaced82a576e8b520a5574ce3b2b9"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1225d2d5ee76a786bda02f8c5e15017462f8432bb960de13d7c2619dba6f0275"}, + {file = "orjson-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f39f4b99199df05c7ecdd006086259ed25886cdbd7b14c8cdb10c7675cfcca7d"}, + {file = "orjson-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a461dc9fb60cac44f2d3218c36a0c1c01132314839a0e229d7fb1bba69b810d8"}, + {file = "orjson-3.9.5-cp38-none-win32.whl", hash = "sha256:dedf1a6173748202df223aea29de814b5836732a176b33501375c66f6ab7d822"}, + {file = "orjson-3.9.5-cp38-none-win_amd64.whl", hash = "sha256:fa504082f53efcbacb9087cc8676c163237beb6e999d43e72acb4bb6f0db11e6"}, + {file = "orjson-3.9.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6900f0248edc1bec2a2a3095a78a7e3ef4e63f60f8ddc583687eed162eedfd69"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17404333c40047888ac40bd8c4d49752a787e0a946e728a4e5723f111b6e55a5"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0eefb7cfdd9c2bc65f19f974a5d1dfecbac711dae91ed635820c6b12da7a3c11"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68c78b2a3718892dc018adbc62e8bab6ef3c0d811816d21e6973dee0ca30c152"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:591ad7d9e4a9f9b104486ad5d88658c79ba29b66c5557ef9edf8ca877a3f8d11"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cc2cbf302fbb2d0b2c3c142a663d028873232a434d89ce1b2604ebe5cc93ce8"}, + {file = "orjson-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b26b5aa5e9ee1bad2795b925b3adb1b1b34122cb977f30d89e0a1b3f24d18450"}, + {file = "orjson-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef84724f7d29dcfe3aafb1fc5fc7788dca63e8ae626bb9298022866146091a3e"}, + {file = "orjson-3.9.5-cp39-none-win32.whl", hash = "sha256:664cff27f85939059472afd39acff152fbac9a091b7137092cb651cf5f7747b5"}, + {file = "orjson-3.9.5-cp39-none-win_amd64.whl", hash = "sha256:91dda66755795ac6100e303e206b636568d42ac83c156547634256a2e68de694"}, + {file = "orjson-3.9.5.tar.gz", hash = "sha256:6daf5ee0b3cf530b9978cdbf71024f1c16ed4a67d05f6ec435c6e7fe7a52724c"}, ] [[package]] name = "overrides" -version = "7.3.1" +version = "7.4.0" description = "A decorator to automatically detect mismatch when overriding a method." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "overrides-7.3.1-py3-none-any.whl", hash = "sha256:6187d8710a935d09b0bcef8238301d6ee2569d2ac1ae0ec39a8c7924e27f58ca"}, - {file = "overrides-7.3.1.tar.gz", hash = "sha256:8b97c6c1e1681b78cbc9424b138d880f0803c2254c5ebaabdde57bb6c62093f2"}, + {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, + {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, ] [[package]] name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5790,37 +5648,36 @@ files = [ [[package]] name = "pandas" -version = "2.0.2" +version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"}, - {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"}, - {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"}, - {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"}, - {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"}, - {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"}, - {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"}, - {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"}, - {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"}, - {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"}, - {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, ] [package.dependencies] @@ -5834,7 +5691,7 @@ pytz = ">=2020.1" tzdata = ">=2022.1" [package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] aws = ["s3fs (>=2021.08.0)"] clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] @@ -5853,14 +5710,13 @@ plot = ["matplotlib (>=3.6.1)"] postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] spss = ["pyreadstat (>=1.1.2)"] sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.6.3)"] [[package]] name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -5872,7 +5728,6 @@ files = [ name = "para" version = "0.0.8" description = "a set utilities that ake advantage of python's 'multiprocessing' module to distribute CPU-intensive tasks" -category = "main" optional = true python-versions = "*" files = [ @@ -5884,7 +5739,6 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -5898,39 +5752,36 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathos" -version = "0.3.0" +version = "0.3.1" description = "parallel graph management and execution in heterogeneous computing" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "pathos-0.3.0-py3-none-any.whl", hash = "sha256:b1f5a79b1c79a594330d451832642ee5bb61dd77dc75ba9e5c72087c77e8994c"}, - {file = "pathos-0.3.0.tar.gz", hash = "sha256:24fa8db51fbd9284da8e191794097c4bb2aa3fce411090e57af6385e61b97e09"}, + {file = "pathos-0.3.1-py3-none-any.whl", hash = "sha256:b1c7145e2adcc19c7e9cac48f110ea5a63e300c1cc10c2947d4857dc97a47b46"}, + {file = "pathos-0.3.1.tar.gz", hash = "sha256:c9a088021493c5cb627d4459bba6c0533c684199e271a5dc297d62be23d74019"}, ] [package.dependencies] -dill = ">=0.3.6" -multiprocess = ">=0.70.14" -pox = ">=0.3.2" -ppft = ">=1.7.6.6" +dill = ">=0.3.7" +multiprocess = ">=0.70.15" +pox = ">=0.3.3" +ppft = ">=1.7.6.7" [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] name = "pdfminer-six" version = "20221105" description = "PDF parser and analyzer" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -5951,7 +5802,6 @@ image = ["Pillow"] name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "main" optional = false python-versions = "*" files = [ @@ -5966,7 +5816,6 @@ ptyprocess = ">=0.5" name = "pgvector" version = "0.1.8" description = "pgvector support for Python" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -5980,7 +5829,6 @@ numpy = "*" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -5990,78 +5838,67 @@ files = [ [[package]] name = "pillow" -version = "9.5.0" +version = "10.0.0" description = "Python Imaging Library (Fork)" -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, + {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, + {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, + {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, + {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, + {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, + {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, + {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, + {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, ] [package.extras] @@ -6072,7 +5909,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "pinecone-client" version = "2.2.2" description = "Pinecone client and SDK" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -6098,7 +5934,6 @@ grpc = ["googleapis-common-protos (>=1.53.0)", "grpc-gateway-protoc-gen-openapiv name = "pinecone-text" version = "0.4.2" description = "Text utilities library by Pinecone.io" -category = "main" optional = true python-versions = ">=3.8,<4.0" files = [ @@ -6118,7 +5953,6 @@ wget = ">=3.2,<4.0" name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -6128,35 +5962,33 @@ files = [ [[package]] name = "platformdirs" -version = "3.6.0" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.6.0-py3-none-any.whl", hash = "sha256:ffa199e3fbab8365778c4a10e1fbf1b9cd50707de826eb304b50e57ec0cc8d38"}, - {file = "platformdirs-3.6.0.tar.gz", hash = "sha256:57e28820ca8094678b807ff529196506d7a21e17156cb1cddb3e74cebce54640"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "playwright" -version = "1.35.0" +version = "1.37.0" description = "A high-level API to automate web browsers" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "playwright-1.35.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:9eb7fdb7bb3f4e528e63641b83827531739c58a40c71d4ea0030321d3f04a742"}, - {file = "playwright-1.35.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:444446b55bfb33ac62398f9f71a8fdb6cee1ceda3316d95db3c6419c51bca9be"}, - {file = "playwright-1.35.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:4f486ea09940a35c08ec26f272bdcb6c1e043d400f3b9b924d541c5f4a7ed8f3"}, - {file = "playwright-1.35.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:a29cd048b3eddaf116b154328bcb8e3f3a637753cbb926ae3ef5a5e694ed2d64"}, - {file = "playwright-1.35.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1d0686bdb6d7c2ce75087a1d6c7820e3de65be893f8a5ec64455613e884b39"}, - {file = "playwright-1.35.0-py3-none-win32.whl", hash = "sha256:188481e780166eae9a2215bb3a58043ae167f7cc963282c7b7d14ba53858451c"}, - {file = "playwright-1.35.0-py3-none-win_amd64.whl", hash = "sha256:2df7cfaaca881fd065f68e1c72a8216679a5b096f2add60c8c7c9dc909fdf7ef"}, + {file = "playwright-1.37.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b476f63251876f1625f490af8d58ec0db90b555c623b7f54105f91d33878c06d"}, + {file = "playwright-1.37.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:68d56efe5ce916bab349177e90726837a6f0cae77ebd6a5200f5333b787b25fb"}, + {file = "playwright-1.37.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:428fdf9bfff586b73f96df53692d50d422afb93ca4650624f61e8181f548fed2"}, + {file = "playwright-1.37.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:41f0280472af94c426e941f6a969ff6a7ea156dc15fd01d09ac4b8f092e2346e"}, + {file = "playwright-1.37.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b574889ef97b7f44a633aa10d72b8966a850a4354d915fd0bc7e8658e825dd63"}, + {file = "playwright-1.37.0-py3-none-win32.whl", hash = "sha256:8b5d96aae54289129ab19d3d0e2e431171ae3e5d88d49a10900dcbe569a27d43"}, + {file = "playwright-1.37.0-py3-none-win_amd64.whl", hash = "sha256:678b9926be2df06321d11a525d4bf08d9f4a5b151354a3b82fe2ac14476322d5"}, ] [package.dependencies] @@ -6166,14 +5998,13 @@ typing-extensions = {version = "*", markers = "python_version <= \"3.8\""} [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.extras] @@ -6182,19 +6013,18 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pooch" -version = "1.6.0" +version = "1.7.0" description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" -category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pooch-1.6.0-py3-none-any.whl", hash = "sha256:3bf0e20027096836b8dbce0152dbb785a269abeb621618eb4bdd275ff1e23c9c"}, - {file = "pooch-1.6.0.tar.gz", hash = "sha256:57d20ec4b10dd694d2b05bb64bc6b109c6e85a6c1405794ce87ed8b341ab3f44"}, + {file = "pooch-1.7.0-py3-none-any.whl", hash = "sha256:74258224fc33d58f53113cf955e8d51bf01386b91492927d0d1b6b341a765ad7"}, + {file = "pooch-1.7.0.tar.gz", hash = "sha256:f174a1041b6447f0eef8860f76d17f60ed2f857dc0efa387a7f08228af05d998"}, ] [package.dependencies] -appdirs = ">=1.3.0" packaging = ">=20.0" +platformdirs = ">=2.5.0" requests = ">=2.19.0" [package.extras] @@ -6206,7 +6036,6 @@ xxhash = ["xxhash (>=1.4.3)"] name = "portalocker" version = "2.7.0" description = "Wraps the portalocker recipe for easy usage" -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -6224,41 +6053,38 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "pox" -version = "0.3.2" +version = "0.3.3" description = "utilities for filesystem exploration and automated builds" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "pox-0.3.2-py3-none-any.whl", hash = "sha256:56fe2f099ecd8a557b8948082504492de90e8598c34733c9b1fdeca8f7b6de61"}, - {file = "pox-0.3.2.tar.gz", hash = "sha256:e825225297638d6e3d49415f8cfb65407a5d15e56f2fb7fe9d9b9e3050c65ee1"}, + {file = "pox-0.3.3-py3-none-any.whl", hash = "sha256:e95febf7401918478a3c1441a3630656d9a2049803889b4f589821372889d0ce"}, + {file = "pox-0.3.3.tar.gz", hash = "sha256:e1ced66f2a0c92a58cf3646bc7ccb8b4773d40884b76f85eeda0670474871667"}, ] [[package]] name = "ppft" -version = "1.7.6.6" -description = "distributed and parallel python" -category = "main" +version = "1.7.6.7" +description = "distributed and parallel Python" optional = true python-versions = ">=3.7" files = [ - {file = "ppft-1.7.6.6-py3-none-any.whl", hash = "sha256:f355d2caeed8bd7c9e4a860c471f31f7e66d1ada2791ab5458ea7dca15a51e41"}, - {file = "ppft-1.7.6.6.tar.gz", hash = "sha256:f933f0404f3e808bc860745acb3b79cd4fe31ea19a20889a645f900415be60f1"}, + {file = "ppft-1.7.6.7-py3-none-any.whl", hash = "sha256:fedb1b1253729d62483f2e1f36547fd50a5fc873ffbf9b78b48cfdc727d4180c"}, + {file = "ppft-1.7.6.7.tar.gz", hash = "sha256:ab34436814e2f18238f35688fd869b2641b2d2d8dca22b8d246f6701dfc954c8"}, ] [package.extras] -dill = ["dill (>=0.3.6)"] +dill = ["dill (>=0.3.7)"] [[package]] name = "prometheus-client" -version = "0.17.0" +version = "0.17.1" description = "Python client for the Prometheus monitoring system." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "prometheus_client-0.17.0-py3-none-any.whl", hash = "sha256:a77b708cf083f4d1a3fb3ce5c95b4afa32b9c521ae363354a4a910204ea095ce"}, - {file = "prometheus_client-0.17.0.tar.gz", hash = "sha256:9c3b26f1535945e85b8934fb374678d263137b78ef85f305b1156c7c881cd11b"}, + {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, + {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, ] [package.extras] @@ -6266,14 +6092,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.38" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, ] [package.dependencies] @@ -6281,44 +6106,39 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "3.19.6" +version = "3.20.3" description = "Protocol Buffers" -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "protobuf-3.19.6-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:010be24d5a44be7b0613750ab40bc8b8cedc796db468eae6c779b395f50d1fa1"}, - {file = "protobuf-3.19.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11478547958c2dfea921920617eb457bc26867b0d1aa065ab05f35080c5d9eb6"}, - {file = "protobuf-3.19.6-cp310-cp310-win32.whl", hash = "sha256:559670e006e3173308c9254d63facb2c03865818f22204037ab76f7a0ff70b5f"}, - {file = "protobuf-3.19.6-cp310-cp310-win_amd64.whl", hash = "sha256:347b393d4dd06fb93a77620781e11c058b3b0a5289262f094379ada2920a3730"}, - {file = "protobuf-3.19.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a8ce5ae0de28b51dff886fb922012dad885e66176663950cb2344c0439ecb473"}, - {file = "protobuf-3.19.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90b0d02163c4e67279ddb6dc25e063db0130fc299aefabb5d481053509fae5c8"}, - {file = "protobuf-3.19.6-cp36-cp36m-win32.whl", hash = "sha256:30f5370d50295b246eaa0296533403961f7e64b03ea12265d6dfce3a391d8992"}, - {file = "protobuf-3.19.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0c0714b025ec057b5a7600cb66ce7c693815f897cfda6d6efb58201c472e3437"}, - {file = "protobuf-3.19.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5057c64052a1f1dd7d4450e9aac25af6bf36cfbfb3a1cd89d16393a036c49157"}, - {file = "protobuf-3.19.6-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:bb6776bd18f01ffe9920e78e03a8676530a5d6c5911934c6a1ac6eb78973ecb6"}, - {file = "protobuf-3.19.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84a04134866861b11556a82dd91ea6daf1f4925746b992f277b84013a7cc1229"}, - {file = "protobuf-3.19.6-cp37-cp37m-win32.whl", hash = "sha256:4bc98de3cdccfb5cd769620d5785b92c662b6bfad03a202b83799b6ed3fa1fa7"}, - {file = "protobuf-3.19.6-cp37-cp37m-win_amd64.whl", hash = "sha256:aa3b82ca1f24ab5326dcf4ea00fcbda703e986b22f3d27541654f749564d778b"}, - {file = "protobuf-3.19.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2b2d2913bcda0e0ec9a784d194bc490f5dc3d9d71d322d070b11a0ade32ff6ba"}, - {file = "protobuf-3.19.6-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d0b635cefebd7a8a0f92020562dead912f81f401af7e71f16bf9506ff3bdbb38"}, - {file = "protobuf-3.19.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a552af4dc34793803f4e735aabe97ffc45962dfd3a237bdde242bff5a3de684"}, - {file = "protobuf-3.19.6-cp38-cp38-win32.whl", hash = "sha256:0469bc66160180165e4e29de7f445e57a34ab68f49357392c5b2f54c656ab25e"}, - {file = "protobuf-3.19.6-cp38-cp38-win_amd64.whl", hash = "sha256:91d5f1e139ff92c37e0ff07f391101df77e55ebb97f46bbc1535298d72019462"}, - {file = "protobuf-3.19.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c0ccd3f940fe7f3b35a261b1dd1b4fc850c8fde9f74207015431f174be5976b3"}, - {file = "protobuf-3.19.6-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:30a15015d86b9c3b8d6bf78d5b8c7749f2512c29f168ca259c9d7727604d0e39"}, - {file = "protobuf-3.19.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:878b4cd080a21ddda6ac6d1e163403ec6eea2e206cf225982ae04567d39be7b0"}, - {file = "protobuf-3.19.6-cp39-cp39-win32.whl", hash = "sha256:5a0d7539a1b1fb7e76bf5faa0b44b30f812758e989e59c40f77a7dab320e79b9"}, - {file = "protobuf-3.19.6-cp39-cp39-win_amd64.whl", hash = "sha256:bbf5cea5048272e1c60d235c7bd12ce1b14b8a16e76917f371c718bd3005f045"}, - {file = "protobuf-3.19.6-py2.py3-none-any.whl", hash = "sha256:14082457dc02be946f60b15aad35e9f5c69e738f80ebbc0900a19bc83734a5a4"}, - {file = "protobuf-3.19.6.tar.gz", hash = "sha256:5f5540d57a43042389e87661c6eaa50f47c19c6176e8cf1c4f287aeefeccb5c4"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, + {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, + {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, + {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, + {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, + {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, + {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, + {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, + {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, + {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, + {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, + {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, + {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, + {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, + {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, ] [[package]] name = "psutil" version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -6343,14 +6163,13 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "psychicapi" -version = "0.8.0" +version = "0.8.4" description = "Psychic.dev is an open-source data integration platform for LLMs. This is the Python client for Psychic" -category = "main" optional = true python-versions = "*" files = [ - {file = "psychicapi-0.8.0-py2-none-any.whl", hash = "sha256:4f8e776eb9bc7e3f9243021cff1d840f60aa7923bb2a941d0a37dfc5936b5fa3"}, - {file = "psychicapi-0.8.0.tar.gz", hash = "sha256:6af053734c848f0c9865f430794c9a8a48b5f9f72663247b11647829d1dbc27f"}, + {file = "psychicapi-0.8.4-py3-none-any.whl", hash = "sha256:bf0a0ea858a79c8d443565d0d1ae8d7f8c63095bf4fd2bd7723241e46b59bbd4"}, + {file = "psychicapi-0.8.4.tar.gz", hash = "sha256:18dc3f2e4ab4dbbf6002c39f4ce680fbd7b86253d92403a5e6530ddf07064224"}, ] [package.dependencies] @@ -6358,81 +6177,77 @@ requests = "*" [[package]] name = "psycopg2-binary" -version = "2.9.6" +version = "2.9.7" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "psycopg2-binary-2.9.6.tar.gz", hash = "sha256:1f64dcfb8f6e0c014c7f55e51c9759f024f70ea572fbdef123f85318c297947c"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d26e0342183c762de3276cca7a530d574d4e25121ca7d6e4a98e4f05cb8e4df7"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c48d8f2db17f27d41fb0e2ecd703ea41984ee19362cbce52c097963b3a1b4365"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a76e027f87753f9bd1ab5f7c9cb8c7628d1077ef927f5e2446477153a602f2c"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6460c7a99fc939b849431f1e73e013d54aa54293f30f1109019c56a0b2b2ec2f"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae102a98c547ee2288637af07393dd33f440c25e5cd79556b04e3fca13325e5f"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9972aad21f965599ed0106f65334230ce826e5ae69fda7cbd688d24fa922415e"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a40c00dbe17c0af5bdd55aafd6ff6679f94a9be9513a4c7e071baf3d7d22a70"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:cacbdc5839bdff804dfebc058fe25684cae322987f7a38b0168bc1b2df703fb1"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f0438fa20fb6c7e202863e0d5ab02c246d35efb1d164e052f2f3bfe2b152bd0"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-win32.whl", hash = "sha256:b6c8288bb8a84b47e07013bb4850f50538aa913d487579e1921724631d02ea1b"}, - {file = "psycopg2_binary-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:61b047a0537bbc3afae10f134dc6393823882eb263088c271331602b672e52e9"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:964b4dfb7c1c1965ac4c1978b0f755cc4bd698e8aa2b7667c575fb5f04ebe06b"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afe64e9b8ea66866a771996f6ff14447e8082ea26e675a295ad3bdbffdd72afb"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e2ee79e7cf29582ef770de7dab3d286431b01c3bb598f8e05e09601b890081"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa74c903a3c1f0d9b1c7e7b53ed2d929a4910e272add6700c38f365a6002820"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83456c2d4979e08ff56180a76429263ea254c3f6552cd14ada95cff1dec9bb8"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0645376d399bfd64da57148694d78e1f431b1e1ee1054872a5713125681cf1be"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99e34c82309dd78959ba3c1590975b5d3c862d6f279f843d47d26ff89d7d7e1"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4ea29fc3ad9d91162c52b578f211ff1c931d8a38e1f58e684c45aa470adf19e2"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4ac30da8b4f57187dbf449294d23b808f8f53cad6b1fc3623fa8a6c11d176dd0"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78e6e2a00c223e164c417628572a90093c031ed724492c763721c2e0bc2a8df"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-win32.whl", hash = "sha256:1876843d8e31c89c399e31b97d4b9725a3575bb9c2af92038464231ec40f9edb"}, - {file = "psycopg2_binary-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b4b24f75d16a89cc6b4cdff0eb6a910a966ecd476d1e73f7ce5985ff1328e9a6"}, - {file = "psycopg2_binary-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:498807b927ca2510baea1b05cc91d7da4718a0f53cb766c154c417a39f1820a0"}, - {file = "psycopg2_binary-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0d236c2825fa656a2d98bbb0e52370a2e852e5a0ec45fc4f402977313329174d"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34b9ccdf210cbbb1303c7c4db2905fa0319391bd5904d32689e6dd5c963d2ea8"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d2222e61f313c4848ff05353653bf5f5cf6ce34df540e4274516880d9c3763"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30637a20623e2a2eacc420059be11527f4458ef54352d870b8181a4c3020ae6b"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8122cfc7cae0da9a3077216528b8bb3629c43b25053284cc868744bfe71eb141"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38601cbbfe600362c43714482f43b7c110b20cb0f8172422c616b09b85a750c5"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c7e62ab8b332147a7593a385d4f368874d5fe4ad4e341770d4983442d89603e3"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2ab652e729ff4ad76d400df2624d223d6e265ef81bb8aa17fbd63607878ecbee"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c83a74b68270028dc8ee74d38ecfaf9c90eed23c8959fca95bd703d25b82c88e"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d4e6036decf4b72d6425d5b29bbd3e8f0ff1059cda7ac7b96d6ac5ed34ffbacd"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:a8c28fd40a4226b4a84bdf2d2b5b37d2c7bd49486b5adcc200e8c7ec991dfa7e"}, - {file = "psycopg2_binary-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:51537e3d299be0db9137b321dfb6a5022caaab275775680e0c3d281feefaca6b"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4499e0a83b7b7edcb8dabecbd8501d0d3a5ef66457200f77bde3d210d5debb"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e13a5a2c01151f1208d5207e42f33ba86d561b7a89fca67c700b9486a06d0e2"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e0f754d27fddcfd74006455b6e04e6705d6c31a612ec69ddc040a5468e44b4e"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d57c3fd55d9058645d26ae37d76e61156a27722097229d32a9e73ed54819982a"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f14375d6f73b62800530b581aed3ada394039877818b2d5f7fc77e3bb6894d"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441cc2f8869a4f0f4bb408475e5ae0ee1f3b55b33f350406150277f7f35384fc"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:65bee1e49fa6f9cf327ce0e01c4c10f39165ee76d35c846ade7cb0ec6683e303"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af335bac6b666cc6aea16f11d486c3b794029d9df029967f9938a4bed59b6a19"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cfec476887aa231b8548ece2e06d28edc87c1397ebd83922299af2e051cf2827"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65c07febd1936d63bfde78948b76cd4c2a411572a44ac50719ead41947d0f26b"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-win32.whl", hash = "sha256:4dfb4be774c4436a4526d0c554af0cc2e02082c38303852a36f6456ece7b3503"}, - {file = "psycopg2_binary-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:02c6e3cf3439e213e4ee930308dc122d6fb4d4bea9aef4a12535fbd605d1a2fe"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9182eb20f41417ea1dd8e8f7888c4d7c6e805f8a7c98c1081778a3da2bee3e4"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a6979cf527e2603d349a91060f428bcb135aea2be3201dff794813256c274f1"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8338a271cb71d8da40b023a35d9c1e919eba6cbd8fa20a54b748a332c355d896"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ed340d2b858d6e6fb5083f87c09996506af483227735de6964a6100b4e6a54"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81e65376e52f03422e1fb475c9514185669943798ed019ac50410fb4c4df232"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfb13af3c5dd3a9588000910178de17010ebcccd37b4f9794b00595e3a8ddad3"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c727b597c6444a16e9119386b59388f8a424223302d0c06c676ec8b4bc1f963"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d67fbdaf177da06374473ef6f7ed8cc0a9dc640b01abfe9e8a2ccb1b1402c1f"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0892ef645c2fabb0c75ec32d79f4252542d0caec1d5d949630e7d242ca4681a3"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:02c0f3757a4300cf379eb49f543fb7ac527fb00144d39246ee40e1df684ab514"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-win32.whl", hash = "sha256:c3dba7dab16709a33a847e5cd756767271697041fbe3fe97c215b1fc1f5c9848"}, - {file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249"}, + {file = "psycopg2-binary-2.9.7.tar.gz", hash = "sha256:1b918f64a51ffe19cd2e230b3240ba481330ce1d4b7875ae67305bd1d37b041c"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ea5f8ee87f1eddc818fc04649d952c526db4426d26bab16efbe5a0c52b27d6ab"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2993ccb2b7e80844d534e55e0f12534c2871952f78e0da33c35e648bf002bbff"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbbc3c5d15ed76b0d9db7753c0db40899136ecfe97d50cbde918f630c5eb857a"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:692df8763b71d42eb8343f54091368f6f6c9cfc56dc391858cdb3c3ef1e3e584"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dcfd5d37e027ec393a303cc0a216be564b96c80ba532f3d1e0d2b5e5e4b1e6e"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17cc17a70dfb295a240db7f65b6d8153c3d81efb145d76da1e4a096e9c5c0e63"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e5666632ba2b0d9757b38fc17337d84bdf932d38563c5234f5f8c54fd01349c9"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7db7b9b701974c96a88997d458b38ccb110eba8f805d4b4f74944aac48639b42"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c82986635a16fb1fa15cd5436035c88bc65c3d5ced1cfaac7f357ee9e9deddd4"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fe13712357d802080cfccbf8c6266a3121dc0e27e2144819029095ccf708372"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-win32.whl", hash = "sha256:122641b7fab18ef76b18860dd0c772290566b6fb30cc08e923ad73d17461dc63"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:f8651cf1f144f9ee0fa7d1a1df61a9184ab72962531ca99f077bbdcba3947c58"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ecc15666f16f97709106d87284c136cdc82647e1c3f8392a672616aed3c7151"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fbb1184c7e9d28d67671992970718c05af5f77fc88e26fd7136613c4ece1f89"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7968fd20bd550431837656872c19575b687f3f6f98120046228e451e4064df"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094af2e77a1976efd4956a031028774b827029729725e136514aae3cdf49b87b"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26484e913d472ecb6b45937ea55ce29c57c662066d222fb0fbdc1fab457f18c5"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f309b77a7c716e6ed9891b9b42953c3ff7d533dc548c1e33fddc73d2f5e21f9"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d92e139ca388ccfe8c04aacc163756e55ba4c623c6ba13d5d1595ed97523e4b"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2df562bb2e4e00ee064779902d721223cfa9f8f58e7e52318c97d139cf7f012d"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4eec5d36dbcfc076caab61a2114c12094c0b7027d57e9e4387b634e8ab36fd44"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1011eeb0c51e5b9ea1016f0f45fa23aca63966a4c0afcf0340ccabe85a9f65bd"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-win32.whl", hash = "sha256:ded8e15f7550db9e75c60b3d9fcbc7737fea258a0f10032cdb7edc26c2a671fd"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:8a136c8aaf6615653450817a7abe0fc01e4ea720ae41dfb2823eccae4b9062a3"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2dec5a75a3a5d42b120e88e6ed3e3b37b46459202bb8e36cd67591b6e5feebc1"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc10da7e7df3380426521e8c1ed975d22df678639da2ed0ec3244c3dc2ab54c8"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee919b676da28f78f91b464fb3e12238bd7474483352a59c8a16c39dfc59f0c5"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb1c0e682138f9067a58fc3c9a9bf1c83d8e08cfbee380d858e63196466d5c86"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00d8db270afb76f48a499f7bb8fa70297e66da67288471ca873db88382850bf4"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b0c2b466b2f4d89ccc33784c4ebb1627989bd84a39b79092e560e937a11d4ac"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:51d1b42d44f4ffb93188f9b39e6d1c82aa758fdb8d9de65e1ddfe7a7d250d7ad"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:11abdbfc6f7f7dea4a524b5f4117369b0d757725798f1593796be6ece20266cb"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f02f4a72cc3ab2565c6d9720f0343cb840fb2dc01a2e9ecb8bc58ccf95dc5c06"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-win32.whl", hash = "sha256:81d5dd2dd9ab78d31a451e357315f201d976c131ca7d43870a0e8063b6b7a1ec"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-win_amd64.whl", hash = "sha256:62cb6de84d7767164a87ca97e22e5e0a134856ebcb08f21b621c6125baf61f16"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59f7e9109a59dfa31efa022e94a244736ae401526682de504e87bd11ce870c22"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:95a7a747bdc3b010bb6a980f053233e7610276d55f3ca506afff4ad7749ab58a"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c721ee464e45ecf609ff8c0a555018764974114f671815a0a7152aedb9f3343"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4f37bbc6588d402980ffbd1f3338c871368fb4b1cfa091debe13c68bb3852b3"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac83ab05e25354dad798401babaa6daa9577462136ba215694865394840e31f8"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:024eaeb2a08c9a65cd5f94b31ace1ee3bb3f978cd4d079406aef85169ba01f08"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1c31c2606ac500dbd26381145684d87730a2fac9a62ebcfbaa2b119f8d6c19f4"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:42a62ef0e5abb55bf6ffb050eb2b0fcd767261fa3faf943a4267539168807522"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7952807f95c8eba6a8ccb14e00bf170bb700cafcec3924d565235dffc7dc4ae8"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e02bc4f2966475a7393bd0f098e1165d470d3fa816264054359ed4f10f6914ea"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-win32.whl", hash = "sha256:fdca0511458d26cf39b827a663d7d87db6f32b93efc22442a742035728603d5f"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:d0b16e5bb0ab78583f0ed7ab16378a0f8a89a27256bb5560402749dbe8a164d7"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6822c9c63308d650db201ba22fe6648bd6786ca6d14fdaf273b17e15608d0852"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f94cb12150d57ea433e3e02aabd072205648e86f1d5a0a692d60242f7809b15"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5ee89587696d808c9a00876065d725d4ae606f5f7853b961cdbc348b0f7c9a1"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad5ec10b53cbb57e9a2e77b67e4e4368df56b54d6b00cc86398578f1c635f329"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:642df77484b2dcaf87d4237792246d8068653f9e0f5c025e2c692fc56b0dda70"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6a8b575ac45af1eaccbbcdcf710ab984fd50af048fe130672377f78aaff6fc1"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f955aa50d7d5220fcb6e38f69ea126eafecd812d96aeed5d5f3597f33fad43bb"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad26d4eeaa0d722b25814cce97335ecf1b707630258f14ac4d2ed3d1d8415265"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ced63c054bdaf0298f62681d5dcae3afe60cbae332390bfb1acf0e23dcd25fc8"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2b04da24cbde33292ad34a40db9832a80ad12de26486ffeda883413c9e1b1d5e"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-win32.whl", hash = "sha256:18f12632ab516c47c1ac4841a78fddea6508a8284c7cf0f292cb1a523f2e2379"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb3b8d55924a6058a26db69fb1d3e7e32695ff8b491835ba9f479537e14dcf9f"}, ] [[package]] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -6444,7 +6259,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -6459,7 +6273,6 @@ tests = ["pytest"] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -6471,7 +6284,6 @@ files = [ name = "py-trello" version = "0.19.0" description = "Python wrapper around the Trello API" -category = "main" optional = true python-versions = "*" files = [ @@ -6488,7 +6300,6 @@ requests-oauthlib = ">=0.4.1" name = "py4j" version = "0.10.9.7" description = "Enables Python programs to dynamically access arbitrary Java objects" -category = "main" optional = true python-versions = "*" files = [ @@ -6500,7 +6311,6 @@ files = [ name = "pyaes" version = "1.6.1" description = "Pure-Python Implementation of the AES block-cipher and common modes of operation" -category = "main" optional = true python-versions = "*" files = [ @@ -6511,7 +6321,6 @@ files = [ name = "pyarrow" version = "12.0.1" description = "Python library for Apache Arrow" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -6549,7 +6358,6 @@ numpy = ">=1.16.6" name = "pyasn1" version = "0.5.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -6561,7 +6369,6 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" -category = "main" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -6576,7 +6383,6 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pycares" version = "4.3.0" description = "Python interface for c-ares" -category = "main" optional = true python-versions = "*" files = [ @@ -6644,7 +6450,6 @@ idna = ["idna (>=2.1)"] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -6656,7 +6461,6 @@ files = [ name = "pydantic" version = "1.10.12" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -6709,7 +6513,6 @@ email = ["email-validator (>=1.0.3)"] name = "pydeck" version = "0.8.0" description = "Widget for deck.gl maps" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -6729,7 +6532,6 @@ jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "t name = "pyee" version = "9.0.4" description = "A port of node.js's EventEmitter to python." -category = "dev" optional = false python-versions = "*" files = [ @@ -6742,14 +6544,13 @@ typing-extensions = "*" [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -6757,14 +6558,13 @@ plugins = ["importlib-metadata"] [[package]] name = "pyjwt" -version = "2.7.0" +version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, - {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.dependencies] @@ -6778,108 +6578,113 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylance" -version = "0.4.21" +version = "0.5.10" description = "python wrapper for lance-rs" -category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "pylance-0.4.21-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:639a9a8312a7d1edecb930ad4c6894ec2fa0fb7b7f1fc50f305e3b050d635599"}, - {file = "pylance-0.4.21-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:8752f45c8a5b269f1622a20ef87aa0e653cdf8c212caa92be327cf3c63e811ba"}, - {file = "pylance-0.4.21-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a901a1bdf3b11d1e5d299de4aea0a054169fe3a371306996ee188b9696a7c3b"}, - {file = "pylance-0.4.21-cp38-abi3-win_amd64.whl", hash = "sha256:bf1be8bbf5021cdbcea68e5529541bdfbc161d825dde55031a1c7e15d037128d"}, + {file = "pylance-0.5.10-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:ca5b649fe3adfacaec7680c708fc3a952f6d8b43fd193afdfc5f3e8e13c47b82"}, + {file = "pylance-0.5.10-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:a5b47ca4cf91709f0f7cd9f9604c6c9c6efc031f38035c27a7d0a21d9b83f507"}, + {file = "pylance-0.5.10-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ffa28a110345a6ce191285171b70a13696aa92cb4c1d6318d5444df65ab8025"}, + {file = "pylance-0.5.10-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0244faa5b039d6bb0e00d8f27222542c0e86bbf9128b6d8db9e5072ec0ea19"}, + {file = "pylance-0.5.10-cp38-abi3-win_amd64.whl", hash = "sha256:92727d6a8f383f16a8e5503d41e2212881fe829b493f6f6aec202c2c7dce7d65"}, ] [package.dependencies] numpy = ">=1.22" -pandas = ">=1.4" pyarrow = ">=10" [package.extras] -tests = ["duckdb", "polars[pandas,pyarrow]", "pytest"] +tests = ["duckdb", "ml_dtypes", "pandas (>=1.4)", "polars[pandas,pyarrow]", "pytest", "tensorflow"] [[package]] name = "pymongo" -version = "4.3.3" +version = "4.5.0" description = "Python driver for MongoDB " -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "pymongo-4.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:74731c9e423c93cbe791f60c27030b6af6a948cef67deca079da6cd1bb583a8e"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux1_i686.whl", hash = "sha256:66413c50d510e5bcb0afc79880d1693a2185bcea003600ed898ada31338c004e"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9b87b23570565a6ddaa9244d87811c2ee9cffb02a753c8a2da9c077283d85845"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:695939036a320f4329ccf1627edefbbb67cc7892b8222d297b0dd2313742bfee"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:ffcc8394123ea8d43fff8e5d000095fe7741ce3f8988366c5c919c4f5eb179d3"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:943f208840777f34312c103a2d1caab02d780c4e9be26b3714acf6c4715ba7e1"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:01f7cbe88d22440b6594c955e37312d932fd632ffed1a86d0c361503ca82cc9d"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdb87309de97c63cb9a69132e1cb16be470e58cffdfbad68fdd1dc292b22a840"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d86c35d94b5499689354ccbc48438a79f449481ee6300f3e905748edceed78e7"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a966d5304b7d90c45c404914e06bbf02c5bf7e99685c6c12f0047ef2aa837142"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be1d2ce7e269215c3ee9a215e296b7a744aff4f39233486d2c4d77f5f0c561a6"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b6163dac53ef1e5d834297810c178050bd0548a4136cd4e0f56402185916ca"}, - {file = "pymongo-4.3.3-cp310-cp310-win32.whl", hash = "sha256:dc0cff74cd36d7e1edba91baa09622c35a8a57025f2f2b7a41e3f83b1db73186"}, - {file = "pymongo-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:cafa52873ae12baa512a8721afc20de67a36886baae6a5f394ddef0ce9391f91"}, - {file = "pymongo-4.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:599d3f6fbef31933b96e2d906b0f169b3371ff79ea6aaf6ecd76c947a3508a3d"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0640b4e9d008e13956b004d1971a23377b3d45491f87082161c92efb1e6c0d6"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:341221e2f2866a5960e6f8610f4cbac0bb13097f3b1a289aa55aba984fc0d969"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7fac06a539daef4fcf5d8288d0d21b412f9b750454cd5a3cf90484665db442a"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a51901066696c4af38c6c63a1f0aeffd5e282367ff475de8c191ec9609b56d"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3055510fdfdb1775bc8baa359783022f70bb553f2d46e153c094dfcb08578ff"}, - {file = "pymongo-4.3.3-cp311-cp311-win32.whl", hash = "sha256:524d78673518dcd352a91541ecd2839c65af92dc883321c2109ef6e5cd22ef23"}, - {file = "pymongo-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:b8a03af1ce79b902a43f5f694c4ca8d92c2a4195db0966f08f266549e2fc49bc"}, - {file = "pymongo-4.3.3-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:39b03045c71f761aee96a12ebfbc2f4be89e724ff6f5e31c2574c1a0e2add8bd"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6fcfbf435eebf8a1765c6d1f46821740ebe9f54f815a05c8fc30d789ef43cb12"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7d43ac9c7eeda5100fb0a7152fab7099c9cf9e5abd3bb36928eb98c7d7a339c6"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3b93043b14ba7eb08c57afca19751658ece1cfa2f0b7b1fb5c7a41452fbb8482"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:c09956606c08c4a7c6178a04ba2dd9388fcc5db32002ade9c9bc865ab156ab6d"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:b0cfe925610f2fd59555bb7fc37bd739e4b197d33f2a8b2fae7b9c0c6640318c"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:4d00b91c77ceb064c9b0459f0d6ea5bfdbc53ea9e17cf75731e151ef25a830c7"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:c6258a3663780ae47ba73d43eb63c79c40ffddfb764e09b56df33be2f9479837"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e758f0e734e1e90357ae01ec9c6daf19ff60a051192fe110d8fb25c62600e"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f3621a46cdc7a9ba8080422262398a91762a581d27e0647746588d3f995c88"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47f7aa217b25833cd6f0e72b0d224be55393c2692b4f5e0561cb3beeb10296e9"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2fdc855149efe7cdcc2a01ca02bfa24761c640203ea94df467f3baf19078be"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5effd87c7d363890259eac16c56a4e8da307286012c076223997f8cc4a8c435b"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dd1cf2995fdbd64fc0802313e8323f5fa18994d51af059b5b8862b73b5e53f0"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bb869707d8e30645ed6766e44098600ca6cdf7989c22a3ea2b7966bb1d98d4b2"}, - {file = "pymongo-4.3.3-cp37-cp37m-win32.whl", hash = "sha256:49210feb0be8051a64d71691f0acbfbedc33e149f0a5d6e271fddf6a12493fed"}, - {file = "pymongo-4.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:54c377893f2cbbffe39abcff5ff2e917b082c364521fa079305f6f064e1a24a9"}, - {file = "pymongo-4.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c184ec5be465c0319440734491e1aa4709b5f3ba75fdfc9dbbc2ae715a7f6829"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:dca34367a4e77fcab0693e603a959878eaf2351585e7d752cac544bc6b2dee46"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd6a4afb20fb3c26a7bfd4611a0bbb24d93cbd746f5eb881f114b5e38fd55501"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0c466710871d0026c190fc4141e810cf9d9affbf4935e1d273fbdc7d7cda6143"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:d07d06dba5b5f7d80f9cc45501456e440f759fe79f9895922ed486237ac378a8"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:711bc52cb98e7892c03e9b669bebd89c0a890a90dbc6d5bb2c47f30239bac6e9"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:34b040e095e1671df0c095ec0b04fc4ebb19c4c160f87c2b55c079b16b1a6b00"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4ed00f96e147f40b565fe7530d1da0b0f3ab803d5dd5b683834500fa5d195ec4"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef888f48eb9203ee1e04b9fb27429017b290fb916f1e7826c2f7808c88798394"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:316498b642c00401370b2156b5233b256f9b33799e0a8d9d0b8a7da217a20fca"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa7e202feb683dad74f00dea066690448d0cfa310f8a277db06ec8eb466601b5"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52896e22115c97f1c829db32aa2760b0d61839cfe08b168c2b1d82f31dbc5f55"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c051fe37c96b9878f37fa58906cb53ecd13dcb7341d3a85f1e2e2f6b10782d9"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5134d33286c045393c7beb51be29754647cec5ebc051cf82799c5ce9820a2ca2"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a9c2885b4a8e6e39db5662d8b02ca6dcec796a45e48c2de12552841f061692ba"}, - {file = "pymongo-4.3.3-cp38-cp38-win32.whl", hash = "sha256:a6cd6f1db75eb07332bd3710f58f5fce4967eadbf751bad653842750a61bda62"}, - {file = "pymongo-4.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:d5571b6978750601f783cea07fb6b666837010ca57e5cefa389c1d456f6222e2"}, - {file = "pymongo-4.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81d1a7303bd02ca1c5be4aacd4db73593f573ba8e0c543c04c6da6275fd7a47e"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:016c412118e1c23fef3a1eada4f83ae6e8844fd91986b2e066fc1b0013cdd9ae"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8fd6e191b92a10310f5a6cfe10d6f839d79d192fb02480bda325286bd1c7b385"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e2961b05f9c04a53da8bfc72f1910b6aec7205fcf3ac9c036d24619979bbee4b"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:b38a96b3eed8edc515b38257f03216f382c4389d022a8834667e2bc63c0c0c31"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:c1a70c51da9fa95bd75c167edb2eb3f3c4d27bc4ddd29e588f21649d014ec0b7"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8a06a0c02f5606330e8f2e2f3b7949877ca7e4024fa2bff5a4506bec66c49ec7"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6c2216d8b6a6d019c6f4b1ad55f890e5e77eb089309ffc05b6911c09349e7474"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eac0a143ef4f28f49670bf89cb15847eb80b375d55eba401ca2f777cd425f338"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08fc250b5552ee97ceeae0f52d8b04f360291285fc7437f13daa516ce38fdbc6"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704d939656e21b073bfcddd7228b29e0e8a93dd27b54240eaafc0b9a631629a6"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1074f1a6f23e28b983c96142f2d45be03ec55d93035b471c26889a7ad2365db3"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b16250238de8dafca225647608dddc7bbb5dce3dd53b4d8e63c1cc287394c2f"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7761cacb8745093062695b11574effea69db636c2fd0a9269a1f0183712927b4"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd7bb378d82b88387dc10227cfd964f6273eb083e05299e9b97cbe075da12d11"}, - {file = "pymongo-4.3.3-cp39-cp39-win32.whl", hash = "sha256:dc24d245026a72d9b4953729d31813edd4bd4e5c13622d96e27c284942d33f24"}, - {file = "pymongo-4.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:fc28e8d85d392a06434e9a934908d97e2cf453d69488d2bcd0bfb881497fd975"}, - {file = "pymongo-4.3.3.tar.gz", hash = "sha256:34e95ffb0a68bffbc3b437f2d1f25fc916fef3df5cdeed0992da5f42fae9b807"}, + {file = "pymongo-4.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d4fa1b01fa7e5b7bb8d312e3542e211b320eb7a4e3d8dc884327039d93cb9e0"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux1_i686.whl", hash = "sha256:dfcd2b9f510411de615ccedd47462dae80e82fdc09fe9ab0f0f32f11cf57eeb5"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:3e33064f1984db412b34d51496f4ea785a9cff621c67de58e09fb28da6468a52"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:33faa786cc907de63f745f587e9879429b46033d7d97a7b84b37f4f8f47b9b32"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:76a262c41c1a7cbb84a3b11976578a7eb8e788c4b7bfbd15c005fb6ca88e6e50"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:0f4b125b46fe377984fbaecf2af40ed48b05a4b7676a2ff98999f2016d66b3ec"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:40d5f6e853ece9bfc01e9129b228df446f49316a4252bb1fbfae5c3c9dedebad"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:152259f0f1a60f560323aacf463a3642a65a25557683f49cfa08c8f1ecb2395a"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d64878d1659d2a5bdfd0f0a4d79bafe68653c573681495e424ab40d7b6d6d41"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1bb3a62395ffe835dbef3a1cbff48fbcce709c78bd1f52e896aee990928432b"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe48f50fb6348511a3268a893bfd4ab5f263f5ac220782449d03cd05964d1ae7"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7591a3beea6a9a4fa3080d27d193b41f631130e3ffa76b88c9ccea123f26dc59"}, + {file = "pymongo-4.5.0-cp310-cp310-win32.whl", hash = "sha256:3a7166d57dc74d679caa7743b8ecf7dc3a1235a9fd178654dddb2b2a627ae229"}, + {file = "pymongo-4.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:21b953da14549ff62ea4ae20889c71564328958cbdf880c64a92a48dda4c9c53"}, + {file = "pymongo-4.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ead4f19d0257a756b21ac2e0e85a37a7245ddec36d3b6008d5bfe416525967dc"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aff6279e405dc953eeb540ab061e72c03cf38119613fce183a8e94f31be608f"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4c8d6aa91d3e35016847cbe8d73106e3d1c9a4e6578d38e2c346bfe8edb3ca"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08819da7864f9b8d4a95729b2bea5fffed08b63d3b9c15b4fea47de655766cf5"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a253b765b7cbc4209f1d8ee16c7287c4268d3243070bf72d7eec5aa9dfe2a2c2"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8027c9063579083746147cf401a7072a9fb6829678076cd3deff28bb0e0f50c8"}, + {file = "pymongo-4.5.0-cp311-cp311-win32.whl", hash = "sha256:9d2346b00af524757576cc2406414562cced1d4349c92166a0ee377a2a483a80"}, + {file = "pymongo-4.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:c3c3525ea8658ee1192cdddf5faf99b07ebe1eeaa61bf32821126df6d1b8072b"}, + {file = "pymongo-4.5.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e5a27f348909235a106a3903fc8e70f573d89b41d723a500869c6569a391cff7"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9a9a39b7cac81dca79fca8c2a6479ef4c7b1aab95fad7544cc0e8fd943595a2"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:496c9cbcb4951183d4503a9d7d2c1e3694aab1304262f831d5e1917e60386036"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23cc6d7eb009c688d70da186b8f362d61d5dd1a2c14a45b890bd1e91e9c451f2"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fff7d17d30b2cd45afd654b3fc117755c5d84506ed25fda386494e4e0a3416e1"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6422b6763b016f2ef2beedded0e546d6aa6ba87910f9244d86e0ac7690f75c96"}, + {file = "pymongo-4.5.0-cp312-cp312-win32.whl", hash = "sha256:77cfff95c1fafd09e940b3fdcb7b65f11442662fad611d0e69b4dd5d17a81c60"}, + {file = "pymongo-4.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e57d859b972c75ee44ea2ef4758f12821243e99de814030f69a3decb2aa86807"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2b0176f9233a5927084c79ff80b51bd70bfd57e4f3d564f50f80238e797f0c8a"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:89b3f2da57a27913d15d2a07d58482f33d0a5b28abd20b8e643ab4d625e36257"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:5caee7bd08c3d36ec54617832b44985bd70c4cbd77c5b313de6f7fce0bb34f93"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:1d40ad09d9f5e719bc6f729cc6b17f31c0b055029719406bd31dde2f72fca7e7"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:076afa0a4a96ca9f77fec0e4a0d241200b3b3a1766f8d7be9a905ecf59a7416b"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:3fa3648e4f1e63ddfe53563ee111079ea3ab35c3b09cd25bc22dadc8269a495f"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:44ee985194c426ddf781fa784f31ffa29cb59657b2dba09250a4245431847d73"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b33c17d9e694b66d7e96977e9e56df19d662031483efe121a24772a44ccbbc7e"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d79ae3bb1ff041c0db56f138c88ce1dfb0209f3546d8d6e7c3f74944ecd2439"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d67225f05f6ea27c8dc57f3fa6397c96d09c42af69d46629f71e82e66d33fa4f"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41771b22dd2822540f79a877c391283d4e6368125999a5ec8beee1ce566f3f82"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a1f26bc1f5ce774d99725773901820dfdfd24e875028da4a0252a5b48dcab5c"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3236cf89d69679eaeb9119c840f5c7eb388a2110b57af6bb6baf01a1da387c18"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e1f61355c821e870fb4c17cdb318669cfbcf245a291ce5053b41140870c3e5cc"}, + {file = "pymongo-4.5.0-cp37-cp37m-win32.whl", hash = "sha256:49dce6957598975d8b8d506329d2a3a6c4aee911fa4bbcf5e52ffc6897122950"}, + {file = "pymongo-4.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2227a08b091bd41df5aadee0a5037673f691e2aa000e1968b1ea2342afc6880"}, + {file = "pymongo-4.5.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:435228d3c16a375274ac8ab9c4f9aef40c5e57ddb8296e20ecec9e2461da1017"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8e559116e4128630ad3b7e788e2e5da81cbc2344dee246af44471fa650486a70"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:840eaf30ccac122df260b6005f9dfae4ac287c498ee91e3e90c56781614ca238"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b4fe46b58010115514b842c669a0ed9b6a342017b15905653a5b1724ab80917f"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:a8127437ebc196a6f5e8fddd746bd0903a400dc6b5ae35df672dd1ccc7170a2a"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:2988ef5e6b360b3ff1c6d55c53515499de5f48df31afd9f785d788cdacfbe2d3"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e249190b018d63c901678053b4a43e797ca78b93fb6d17633e3567d4b3ec6107"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1240edc1a448d4ada4bf1a0e55550b6292420915292408e59159fd8bbdaf8f63"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6d2a56fc2354bb6378f3634402eec788a8f3facf0b3e7d468db5f2b5a78d763"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a0aade2b11dc0c326ccd429ee4134d2d47459ff68d449c6d7e01e74651bd255"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74c0da07c04d0781490b2915e7514b1adb265ef22af039a947988c331ee7455b"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3754acbd7efc7f1b529039fcffc092a15e1cf045e31f22f6c9c5950c613ec4d"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:631492573a1bef2f74f9ac0f9d84e0ce422c251644cd81207530af4aa2ee1980"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e2654d1278384cff75952682d17c718ecc1ad1d6227bb0068fd826ba47d426a5"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:168172ef7856e20ec024fe2a746bfa895c88b32720138e6438fd765ebd2b62dd"}, + {file = "pymongo-4.5.0-cp38-cp38-win32.whl", hash = "sha256:b25f7bea162b3dbec6d33c522097ef81df7c19a9300722fa6853f5b495aecb77"}, + {file = "pymongo-4.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:b520aafc6cb148bac09ccf532f52cbd31d83acf4d3e5070d84efe3c019a1adbf"}, + {file = "pymongo-4.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8543253adfaa0b802bfa88386db1009c6ebb7d5684d093ee4edc725007553d21"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:bc5d8c3647b8ae28e4312f1492b8f29deebd31479cd3abaa989090fb1d66db83"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:505f8519c4c782a61d94a17b0da50be639ec462128fbd10ab0a34889218fdee3"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:53f2dda54d76a98b43a410498bd12f6034b2a14b6844ca08513733b2b20b7ad8"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:9c04b9560872fa9a91251030c488e0a73bce9321a70f991f830c72b3f8115d0d"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:58a63a26a1e3dc481dd3a18d6d9f8bd1d576cd1ffe0d479ba7dd38b0aeb20066"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:f076b779aa3dc179aa3ed861be063a313ed4e48ae9f6a8370a9b1295d4502111"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:1b1d7d9aabd8629a31d63cd106d56cca0e6420f38e50563278b520f385c0d86e"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37df8f6006286a5896d1cbc3efb8471ced42e3568d38e6cb00857277047b0d63"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56320c401f544d762fc35766936178fbceb1d9261cd7b24fbfbc8fb6f67aa8a5"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbd705d5f3c3d1ff2d169e418bb789ff07ab3c70d567cc6ba6b72b04b9143481"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80a167081c75cf66b32f30e2f1eaee9365af935a86dbd76788169911bed9b5d5"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c42748ccc451dfcd9cef6c5447a7ab727351fd9747ad431db5ebb18a9b78a4d"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf62da7a4cdec9a4b2981fcbd5e08053edffccf20e845c0b6ec1e77eb7fab61d"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b5bbb87fa0511bd313d9a2c90294c88db837667c2bda2ea3fa7a35b59fd93b1f"}, + {file = "pymongo-4.5.0-cp39-cp39-win32.whl", hash = "sha256:465fd5b040206f8bce7016b01d7e7f79d2fcd7c2b8e41791be9632a9df1b4999"}, + {file = "pymongo-4.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:63d8019eee119df308a075b8a7bdb06d4720bf791e2b73d5ab0e7473c115d79c"}, + {file = "pymongo-4.5.0.tar.gz", hash = "sha256:681f252e43b3ef054ca9161635f81b730f4d8cadd28b3f2b2004f5a72f853982"}, ] [package.dependencies] @@ -6887,9 +6692,9 @@ dnspython = ">=1.16.0,<3.0.0" [package.extras] aws = ["pymongo-auth-aws (<2.0.0)"] -encryption = ["pymongo-auth-aws (<2.0.0)", "pymongocrypt (>=1.3.0,<2.0.0)"] -gssapi = ["pykerberos"] -ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] +encryption = ["certifi", "pymongo[aws]", "pymongocrypt (>=1.6.0,<2.0.0)"] +gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] +ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] snappy = ["python-snappy"] zstd = ["zstandard"] @@ -6897,7 +6702,6 @@ zstd = ["zstandard"] name = "pympler" version = "1.0.1" description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -6907,49 +6711,47 @@ files = [ [[package]] name = "pymupdf" -version = "1.22.3" +version = "1.22.5" description = "Python bindings for the PDF toolkit and renderer MuPDF" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "PyMuPDF-1.22.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0aff7ba35eb2cc285efea87500dd5ee0aaf94f4bb23a79187f0a74101aba7964"}, - {file = "PyMuPDF-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:13e90a5301990dafc5bba6bfa32aafca1f35809497c274c9d4af4f4bac2d8870"}, - {file = "PyMuPDF-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201c7aecf9530c3a5aa33cd3d6b68e36492ff9ac48cb270d8f18e66654744419"}, - {file = "PyMuPDF-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbffc6cabb0cb20033870bde954bbed1436cf9fce33a14682e283bc893767250"}, - {file = "PyMuPDF-1.22.3-cp310-cp310-win32.whl", hash = "sha256:e344632215882b49fd2e28ffb848f55b1b34db6b5389917e4865b4d779cbdb4a"}, - {file = "PyMuPDF-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d9bccfb29cbe3962a858c200376d54e7ba64d6f64c0b972ed5b68ff20157b06"}, - {file = "PyMuPDF-1.22.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01daa4e3c2c1b93d357ba0d747d713ad40e0123b9bdca2395bf166f62dd8f703"}, - {file = "PyMuPDF-1.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46c7fab408ae4d55c4181f95a76bc4f365f5ead3291f67274d6fe90f1b90c479"}, - {file = "PyMuPDF-1.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a58af441ce454f33f75a4c93a5f76e4659f2c7c849036180f24ab4b84d9e512f"}, - {file = "PyMuPDF-1.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eddb0975ddd0bcf39812616b5675c26d740f83b12a39c3b5c4425f02c3da754"}, - {file = "PyMuPDF-1.22.3-cp311-cp311-win32.whl", hash = "sha256:ed4a624ffc9bebe5c67fc80e16798300d404089585bcdac14448034bd38c5072"}, - {file = "PyMuPDF-1.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:4d2422dffdb4f1c2c8128e6d151f4de5e722388df276ac165572ad5290ad228a"}, - {file = "PyMuPDF-1.22.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:48ece127e202470209dc63ad8fa85f3e19ce302f5af02d38c7fc0b5798b9bfa6"}, - {file = "PyMuPDF-1.22.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f00097e8d2bc46dacdb776aeb810b1c760949f6353abdf6d12e8aefdc95dd35"}, - {file = "PyMuPDF-1.22.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5932564a713bd7d576418070c3dd926cb5800edb4411f48813f7694af7386d3e"}, - {file = "PyMuPDF-1.22.3-cp37-cp37m-win32.whl", hash = "sha256:d4f38ecb9518ba2dc12f5f35f33c64ec5466faf20b833f4ac21a2a4190ffef93"}, - {file = "PyMuPDF-1.22.3-cp37-cp37m-win_amd64.whl", hash = "sha256:90950b328603a83b26c2eb2af0cf5498582fbbab84e86074bbb0ae44d745e2a3"}, - {file = "PyMuPDF-1.22.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a2040351a1279fafa1db82e5af50a785eb01dc4e1adb3c98e0abfd6e0a4995f"}, - {file = "PyMuPDF-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a67f2b12120ce9fe5c3f7cb192643134af2c4e28773a2cd5d56cbe1cae66d1b9"}, - {file = "PyMuPDF-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e0904c9bffdfbb527f4fe293986d74477780f0c98f59fa5b42a95e3e441e1f4"}, - {file = "PyMuPDF-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aaf3352d9c443ad7622e70b0ff9124079b09c16a1a1aa3f3dde9ba0e19f32a2"}, - {file = "PyMuPDF-1.22.3-cp38-cp38-win32.whl", hash = "sha256:4c037d5752efd562ac72e74295dfcc8d8dd406c0f6849054b29d2cbc32237ae0"}, - {file = "PyMuPDF-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:be0803be2709285f17c932ee11d4b7f6d11d3e74e1888094e6310c55e9543673"}, - {file = "PyMuPDF-1.22.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa934c1a02f1f3bb04e447b95ef5b19d03cb2575fee76d23cb7a6d0c526444e2"}, - {file = "PyMuPDF-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:932747941ed4973410244376ba77693253e4387e8e09cf2458bc9133348fc16e"}, - {file = "PyMuPDF-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4ea7b016c4561004b48143b8879e1d888e5ba3a1440e6558ea9a47f0d2e6f65"}, - {file = "PyMuPDF-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf275e5dbf332554f98b469899e5a0928b91cb574a5319aeecf1b7e8075cf4b7"}, - {file = "PyMuPDF-1.22.3-cp39-cp39-win32.whl", hash = "sha256:07d171255964f5a382e280a95a3148c08fc4ec20bf7907e040cf423cf29afe30"}, - {file = "PyMuPDF-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:60db199553fc9c88cb9f2afba35f9cd54c042e7a6ea2b151ddcc542e6e75ac61"}, - {file = "PyMuPDF-1.22.3.tar.gz", hash = "sha256:5ecd928e96e63092571020973aa145b57b75707f3a3df97c742e563112615891"}, + {file = "PyMuPDF-1.22.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:640b8e4cb116dd87a3c854e49808a4f63625e663a7bc5b1efc971db5b4775367"}, + {file = "PyMuPDF-1.22.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:17efbbf0e2d99d24cfc302fac512928eb294f10b7b67d597d04dafd012812e4e"}, + {file = "PyMuPDF-1.22.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc9b9bf0f2beea3911750d2d66247608be8cbad33b7a050cacec9e4c105a1ca"}, + {file = "PyMuPDF-1.22.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7734a32a91eea4b502b8f9d2915cdba0a372226e14fb983876d763110dcefef"}, + {file = "PyMuPDF-1.22.5-cp310-cp310-win32.whl", hash = "sha256:c2fd70ca9961f7871810dce1b7d0a42a69eb8ff2d786621123952bd505a6867e"}, + {file = "PyMuPDF-1.22.5-cp310-cp310-win_amd64.whl", hash = "sha256:add310c96df6933cfb4ce3821c9c7b5c133e8aa609a4c9416e1c7af546163488"}, + {file = "PyMuPDF-1.22.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:017aaba511526facfc928e9d95d2c10d28a2821b05b9039bf422031a7da8584e"}, + {file = "PyMuPDF-1.22.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fe5e44a14864d921fb96669a82f9635846806176f77f1d73c61feb84ebf4d84"}, + {file = "PyMuPDF-1.22.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e74d766f79e41e10c51865233042ab2cc4612ca7942812dca0603f4d0f8f73d"}, + {file = "PyMuPDF-1.22.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8175452fcc99a0af6429d8acd87682a3a70c5879d73532c7327f71ce508a35"}, + {file = "PyMuPDF-1.22.5-cp311-cp311-win32.whl", hash = "sha256:42f59f4999d7f8b35c850050bd965e98c081a7d9b92d5f9dcf30203b30d06876"}, + {file = "PyMuPDF-1.22.5-cp311-cp311-win_amd64.whl", hash = "sha256:3d71c47aa14b73f2df7d03be8c547a05df6c6898d8c63a0f752b26f206eefd3c"}, + {file = "PyMuPDF-1.22.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4bcad7ea4b3ab82c46fe8da27ec738d38c213ed9935ef67d98ed09574d9a234e"}, + {file = "PyMuPDF-1.22.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b04a83ddcb3f7c935c75a1f7f6050c85fe4062a2ea64c47ee6bda788d037761"}, + {file = "PyMuPDF-1.22.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d02ee28663077f15d529b04d27588b174fa937daf73a294df279bbf70c468f5c"}, + {file = "PyMuPDF-1.22.5-cp37-cp37m-win32.whl", hash = "sha256:411fc35f6dae16ec940b6b0406e84be6ff29f93b30908ea1427e2a4bd594d4ba"}, + {file = "PyMuPDF-1.22.5-cp37-cp37m-win_amd64.whl", hash = "sha256:7c8c0f686865e330de90b93d53b100f7f07c2f10f5449ceb721121f459f7cc4a"}, + {file = "PyMuPDF-1.22.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ae9f81b8fe0a3e6386a24887a92736793479c5918ecac3b7deac2d02abf1f2"}, + {file = "PyMuPDF-1.22.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7562436dadf8382e59ac3739fbbf9d5b2d807fafc7f28cb884863430e0de6505"}, + {file = "PyMuPDF-1.22.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c22046e5f2cf0d72f9809a967340db1b238fefe58322896bc7c3f3d1d10b42"}, + {file = "PyMuPDF-1.22.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa601dc4116c17a6b09255b031b5a1891e3ac18b50ec536452a725a6b75db8d"}, + {file = "PyMuPDF-1.22.5-cp38-cp38-win32.whl", hash = "sha256:3d0fe749e648f5245059d5f771fb50c1a988a1d2e82268b56377b2176a9fee5d"}, + {file = "PyMuPDF-1.22.5-cp38-cp38-win_amd64.whl", hash = "sha256:4fbc5bfe6ecc53929e3fd0db9846fb7da084ddb4b1fc1063857245fa783974d9"}, + {file = "PyMuPDF-1.22.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87b36e0797ab7fbb7ef594c7a6e0febc7ffb4101a42ea796726a8288391a3769"}, + {file = "PyMuPDF-1.22.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:01119edb7e4c3dd8c154d237b8ac927bd359eea8d31468f9a89aa308b5bca04e"}, + {file = "PyMuPDF-1.22.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fde02fcb387863873b56730f4b9f65515d87c92c12299f0f0a74b3ccdfe35062"}, + {file = "PyMuPDF-1.22.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c55814bbf6461aef9b34cb524d1d14857d5ec6ccfbb78ecfb1d07dfc40eeb8"}, + {file = "PyMuPDF-1.22.5-cp39-cp39-win32.whl", hash = "sha256:0542178c3a399282903705a8cc298e7f33f4770605e0a9db344aff5d375bcf0b"}, + {file = "PyMuPDF-1.22.5-cp39-cp39-win_amd64.whl", hash = "sha256:f8ca46a6987e14f58ec8dfda2d2376bacd113c1fec5f58bebf90838bb4408ab9"}, + {file = "PyMuPDF-1.22.5.tar.gz", hash = "sha256:5ec8d5106752297529d0d68d46cfc4ce99914aabd99be843f1599a1842d63fe9"}, ] [[package]] name = "pyowm" version = "3.3.0" description = "A Python wrapper around OpenWeatherMap web APIs" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -6967,14 +6769,13 @@ requests = [ [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = true python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, ] [package.extras] @@ -6982,53 +6783,50 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pypdf" -version = "3.9.1" +version = "3.15.2" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "pypdf-3.9.1-py3-none-any.whl", hash = "sha256:5f4abdb4691a8d7631e7f2db09f66cfe3a388a072882d8375c6b1bdc28027c0a"}, - {file = "pypdf-3.9.1.tar.gz", hash = "sha256:c2b7fcfe25fbd04e8da600cb2700267ecee7e8781dc798cce3a4f567143a4df1"}, + {file = "pypdf-3.15.2-py3-none-any.whl", hash = "sha256:f6e598292be34187287a609c72815c1502b3dc2c997b374ba0870ce79d2e975a"}, + {file = "pypdf-3.15.2.tar.gz", hash = "sha256:cdf7d75ebb8901f3352cf9488c5f662c6de9c52e432c429d15cada67ba372fce"}, ] [package.dependencies] typing_extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] -crypto = ["PyCryptodome"] -dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "wheel"] +crypto = ["PyCryptodome", "cryptography"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "wheel"] docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] -full = ["Pillow", "PyCryptodome"] -image = ["Pillow"] +full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] +image = ["Pillow (>=8.0.0)"] [[package]] name = "pypdfium2" -version = "4.15.0" +version = "4.18.0" description = "Python bindings to PDFium" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "pypdfium2-4.15.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:9cc6b28a1cbbefde86782d1d32316634f9f6a111d37515800954b729835d3531"}, - {file = "pypdfium2-4.15.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:024d51840dc21bdd4660133231353504b0eeca520fcf0d5732cb774fd830c8ad"}, - {file = "pypdfium2-4.15.0-py3-none-manylinux_2_26_aarch64.whl", hash = "sha256:13896844b73a22d6890e717f4976578ec1aebaf8086860af63f20d44c553d323"}, - {file = "pypdfium2-4.15.0-py3-none-manylinux_2_26_armv7l.whl", hash = "sha256:792255c4a17394d9a95f4f88d07b13ff18f960832aaf87f7d1f181949e671915"}, - {file = "pypdfium2-4.15.0-py3-none-manylinux_2_26_i686.whl", hash = "sha256:8757c200b50e4ea61f73d4586b1a21df3ec5cf8fe851eb6ccf0efc9e96e42540"}, - {file = "pypdfium2-4.15.0-py3-none-manylinux_2_26_x86_64.whl", hash = "sha256:310ee240cb62baa5f7448efc3345121c9b002f76acfa689fea2f4554d7a1ad06"}, - {file = "pypdfium2-4.15.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:54ca35658f14d9aa0a6e9dab3543909540e02b9fb691507ac86cfcca8f864d5e"}, - {file = "pypdfium2-4.15.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:033270711de410b8cfd8ff1d3778afaade538c157726a09622a950b7e9aed782"}, - {file = "pypdfium2-4.15.0-py3-none-win32.whl", hash = "sha256:99b47d3eadc9c01af3c19760962ea6635c2222260ae3d1f8b0844b4cacdccdcb"}, - {file = "pypdfium2-4.15.0-py3-none-win_amd64.whl", hash = "sha256:1279225608650687cc2de7dd6d2c90ed313fcc948e749f434a798ea26e688d3f"}, - {file = "pypdfium2-4.15.0-py3-none-win_arm64.whl", hash = "sha256:ff9650d4a6638e43e7237d538b621a5004b87f665c4c9e3dc773a484d12ba9bb"}, - {file = "pypdfium2-4.15.0.tar.gz", hash = "sha256:1d7ea82690c5b195c065e714380f9bce11b3fdaac5acfac0508c841ef862ab60"}, + {file = "pypdfium2-4.18.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:aa682c7cd859522e61b7730190e188d5f8298077ec4ddf2c98abde8743500baf"}, + {file = "pypdfium2-4.18.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4dba0f58ab4a4a1ecc280ad6c69c2cb4dc811b168b43455db28e43e09edf780b"}, + {file = "pypdfium2-4.18.0-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:2d96d6d064126fee88c03a5f5d0b1615f5a4d5fd82e634e545b6f64ac9b1815e"}, + {file = "pypdfium2-4.18.0-py3-none-manylinux_2_17_armv7l.whl", hash = "sha256:cdb00af9b9c13369808206479bead17d2ed58f0ca2a8fef786f165bb734914e3"}, + {file = "pypdfium2-4.18.0-py3-none-manylinux_2_17_i686.whl", hash = "sha256:72659da24f028565929418a0a44e0c1671dc53b60893a0ce5e8588b454feaed8"}, + {file = "pypdfium2-4.18.0-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:3f816600000723e1ef3a6296ed0f4404fa3f5607c62c0de2fc35ad0b3f300c17"}, + {file = "pypdfium2-4.18.0-py3-none-musllinux_1_1_i686.whl", hash = "sha256:70e1b3e50a153900722b7e80e66c358326f0aa7acf8b100f6bd1728c6cb9a88f"}, + {file = "pypdfium2-4.18.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:6d42b94f316ba5233f65946a9aae143a4b36463b316da18657a4cf415baf7d3a"}, + {file = "pypdfium2-4.18.0-py3-none-win32.whl", hash = "sha256:f3bb10fc8ccde0344fd63f618a4093eb4d19e4ffa85a5e773c98c34c291a3d2f"}, + {file = "pypdfium2-4.18.0-py3-none-win_amd64.whl", hash = "sha256:add05ec5193f573454114d42e12c10d98406623b18727e27e9dc392f975c0f05"}, + {file = "pypdfium2-4.18.0-py3-none-win_arm64.whl", hash = "sha256:9e9a1d5b8605c229ef6a173c0aa3a45a4fb507ae8ebcfe670167da14abfdf62a"}, + {file = "pypdfium2-4.18.0.tar.gz", hash = "sha256:c937121dc475942697fbb3e04ffa7b28d36afc2b76cc9aac22fbd327c6dc6d61"}, ] [[package]] name = "pyphen" version = "0.14.0" description = "Pure Python module to hyphenate text" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -7044,7 +6842,6 @@ test = ["flake8", "isort", "pytest"] name = "pyproj" version = "3.5.0" description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -7092,7 +6889,6 @@ certifi = "*" name = "pyproject-hooks" version = "1.0.0" description = "Wrappers to call pyproject.toml-based build backend hooks." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -7103,48 +6899,10 @@ files = [ [package.dependencies] tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, -] - [[package]] name = "pysocks" version = "1.7.1" description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -7155,13 +6913,12 @@ files = [ [[package]] name = "pyspark" -version = "3.4.0" +version = "3.4.1" description = "Apache Spark Python API" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "pyspark-3.4.0.tar.gz", hash = "sha256:167a23e11854adb37f8602de6fcc3a4f96fd5f1e323b9bb83325f38408c5aafd"}, + {file = "pyspark-3.4.1.tar.gz", hash = "sha256:72cd66ab8cf61a75854e5a753f75bea35ee075c3a96f9de4e2a66d02ec7fc652"}, ] [package.dependencies] @@ -7178,7 +6935,6 @@ sql = ["numpy (>=1.15)", "pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] name = "pytesseract" version = "0.3.10" description = "Python-tesseract is a python wrapper for Google's Tesseract-OCR" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -7192,14 +6948,13 @@ Pillow = ">=8.0.0" [[package]] name = "pytest" -version = "7.3.2" +version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.3.2-py3-none-any.whl", hash = "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295"}, - {file = "pytest-7.3.2.tar.gz", hash = "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] @@ -7217,7 +6972,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-asyncio" version = "0.20.3" description = "Pytest support for asyncio" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -7236,7 +6990,6 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -7255,7 +7008,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-dotenv" version = "0.5.2" description = "A py.test plugin that parses environment files before running tests" -category = "dev" optional = false python-versions = "*" files = [ @@ -7271,7 +7023,6 @@ python-dotenv = ">=0.9.1" name = "pytest-mock" version = "3.11.1" description = "Thin-wrapper around the mock package for easier use with pytest" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -7289,7 +7040,6 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] name = "pytest-socket" version = "0.6.0" description = "Pytest Plugin to disable socket calls during tests" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -7304,7 +7054,6 @@ pytest = ">=3.6.3" name = "pytest-vcr" version = "1.0.2" description = "Plugin for managing VCR.py cassettes" -category = "dev" optional = false python-versions = "*" files = [ @@ -7320,7 +7069,6 @@ vcrpy = "*" name = "pytest-watcher" version = "0.2.6" description = "Continiously runs pytest on changes in *.py files" -category = "dev" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ @@ -7333,14 +7081,13 @@ watchdog = ">=2.0.0" [[package]] name = "python-arango" -version = "7.5.9" +version = "7.6.0" description = "Python Driver for ArangoDB" -category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "python-arango-7.5.9.tar.gz", hash = "sha256:c16e5b0bfa7a662015e1708f723c5c324e05a32cf98169229f01fd20200cd0db"}, - {file = "python_arango-7.5.9-py3-none-any.whl", hash = "sha256:aa8587420e7b704c646bf7791b8149674ee562ec0202ba2363100a9cb5dec00f"}, + {file = "python-arango-7.6.0.tar.gz", hash = "sha256:36c94e1ce155c507578a61245af6f30544e5946b8f8d1de33196f35cdbaee522"}, + {file = "python_arango-7.6.0-py3-none-any.whl", hash = "sha256:a92d9636a1ab6a240a206dc05703ae54f267088f7d243c1fd31f60255e5af2fa"}, ] [package.dependencies] @@ -7359,7 +7106,6 @@ dev = ["black (>=22.3.0)", "flake8 (>=4.0.1)", "isort (>=5.10.1)", "mock", "mypy name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -7374,7 +7120,6 @@ six = ">=1.5" name = "python-dotenv" version = "1.0.0" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -7389,7 +7134,6 @@ cli = ["click (>=5.0)"] name = "python-json-logger" version = "2.0.7" description = "A python library adding a json log formatter" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -7397,11 +7141,75 @@ files = [ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] +[[package]] +name = "python-rapidjson" +version = "1.10" +description = "Python wrapper around rapidjson" +optional = true +python-versions = ">=3.6" +files = [ + {file = "python-rapidjson-1.10.tar.gz", hash = "sha256:acfecbf5edb91ec72a20a125de7f56b8c2f6161eff4c65382c8ee6a2484d3540"}, + {file = "python_rapidjson-1.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1db7b0af882999f5685eb7046a0f3b3aca5d55a3e84b3089747d29a4ec6fdade"}, + {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87c8c8b615513f9dc414af1554140589036d14840f5e1f1845965e1c0a080e1"}, + {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0a2f5c4abe529ca2764343416e35710a263832533b7bdc76c3285efb5b5ecc8"}, + {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40467c3a6d8f070cc4d196fe46a79ed59d1a13a4d3fdc6a0325a21816600e5a7"}, + {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df4e7237a3e77666ccb9b437013294e6aa3968528f7c61f60f6f38eea0f8f79"}, + {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:99a5215f24ff1fa6cc67ee275a6852aa56d934d3b8cd7a40197feb632b54fd76"}, + {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3dbea0ee9fa1cd6ecc13a949f6bb94013639d39cdb56f58df4ab61130d35e57c"}, + {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:6d1d0c5da3bd5f701b1aed550e1e7bd59b16ae642877cddf18815006cf998f9a"}, + {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:072f76c1f1483bcc4056d7d3a8b0319bf841a73e955f188302094b62b2163bf9"}, + {file = "python_rapidjson-1.10-cp310-cp310-win32.whl", hash = "sha256:c95d466307a2140a7687a575103980c6e81c9f62d19556cafad3d6b2932b7eb1"}, + {file = "python_rapidjson-1.10-cp310-cp310-win_amd64.whl", hash = "sha256:454ffda58cc6fed64d983b1b8ae4b39a563b4fd671dae9132e06450025898539"}, + {file = "python_rapidjson-1.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fff343076fbeee0cd7e4e3fb9472f2d567a127ec7b8b5b7ecba6bf7960a3ce07"}, + {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:686482c67727edad4b6d0c753bc159f35134a5a623e9651c4b7c008ef2996252"}, + {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ef7d55688b7123d62690b193537cc048fa9f35cfa43d249fedc0d9fd398890a"}, + {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f27c0601792533ab6e98452961d61566480dc155da19d2a358a5fd9a85d9321"}, + {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95176e35e3bacb8a1a27f563e815b5b57c717992c871b1c25fd76a835fbba32c"}, + {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47a0ec20886b8be86af307c10d699a447e22979ed7dd1f2b7ed5cb7496b3d920"}, + {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7968c0cb09d9a76aa2483556ba46ab42634baf216cb2f2c7cd6bf77119a33c1"}, + {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5faab270a4dd49216ceaca7169682680b2f5df8311c1ed259e4612d9d0cf61b7"}, + {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81b797934dc037810f5f98af138b55a3b6f18dd569cc5e8f81fe79956a4717ca"}, + {file = "python_rapidjson-1.10-cp311-cp311-win32.whl", hash = "sha256:6c1d62cc58a61629fc5e216fb7b3a1b02787c98fded874a7b474b1e6325e377e"}, + {file = "python_rapidjson-1.10-cp311-cp311-win_amd64.whl", hash = "sha256:29d31fc4254f1a4dca420e58bd1331e990fc2959d09ff2daa7934d52732a8491"}, + {file = "python_rapidjson-1.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:718f4e217b511cfbf9166f55ccf4bf4e4538495bee403e390cf89791c0debc26"}, + {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:541bbb96353cf3fe2bdb29e727087226532be4e4573daad6f042cfdea533a564"}, + {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50f0402a6899c6a177d4a37152deefcd59c61e44bef56b71e8d006a186c86286"}, + {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c035e17744d6d6fba073b550b0040a74e55f2ad33fd798df206ff6879b41ad10"}, + {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da970bde42309a74a5556e696673ea11c4545b8bee5081b84265ded460b2e9ef"}, + {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7437a649821008aa456f2fbec737880d7f9bdda7ec94cc1743a43ccf32b5d26"}, + {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:362d969bbd277f78bf0b1ffaa810857ea40351146b827f896f8d49e9c25fc99c"}, + {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:409256e7748c4ab7f17b3793c7a78ca01914c487644fc42140d116ed4dec8c4f"}, + {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a34a7e2853456fe50ba2ee22e38e7841e55eee10021d4496cce62285f148e8e7"}, + {file = "python_rapidjson-1.10-cp37-cp37m-win32.whl", hash = "sha256:bc4a97940e5afa60a598483d0eb863b26e4810aaf030d92a4301f5fc183e1b6d"}, + {file = "python_rapidjson-1.10-cp37-cp37m-win_amd64.whl", hash = "sha256:89586b67f9c69b66885774acebf3d018e7b8f93cea2b3cffa306ec9d37877594"}, + {file = "python_rapidjson-1.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e38082b1a8ce3e2bd55821852c0cd643cdabe6497fd9c054f6b47a099afbea0"}, + {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0955ef22fabb36b26fcad702ae54c1bce2bc2a74b1883c42d251d72011d0d426"}, + {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a9db03c68ab0158bcdf80299b2c980186d148aa3e05d5650fea5148a425a29a"}, + {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde8ab0f06debaa06d93085f19dc3ec3db53f22883f1625dd32b96a87e7009de"}, + {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23539c9f7d85d64a00d3cb44c7d9ab3be2184d4da42a5f3263dcfd1d0203ee43"}, + {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8bfd484285f3477acef0bb45abd2b80b6252e35a5a53395ce48f0327cbe43c23"}, + {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8b0ed643ebaa8ddf3f40422752efe83abda29aa30a9e6866ccd9dd591b5057d0"}, + {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:5aeca661a0f229f1312fb3ad3e1a5c6736d49942d80d4931810158559eb8f119"}, + {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8a68ed066e8f0878b7112f943cf35ba9e5217395bcdd8cb478cde01871e2701c"}, + {file = "python_rapidjson-1.10-cp38-cp38-win32.whl", hash = "sha256:d286be6f63446776c4958bb37824c683194b4878fc9cd5b7255134fb5a6ba536"}, + {file = "python_rapidjson-1.10-cp38-cp38-win_amd64.whl", hash = "sha256:aece5270c6e6d5c3d54586c9a5fb9677d70d7019744a59560c5c369c7b9bba25"}, + {file = "python_rapidjson-1.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc09c5ad0fe71f262cdcc5655409f132f1560a8af80e76e7757945ce401fdbab"}, + {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f6447bd7a8ff5135ab7e372b48a174d3c560d5b322e32bd465e8458e6e4593"}, + {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22ede69213885391b46cc14596bfd4cd1a5c6f34a2db6600fb08b03982dbc7b7"}, + {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a9425129623718a04b885a12190faa23e7997c4e8632054e18df7ea473f746d"}, + {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60e10f32e1a8d155448842934cbe71eb620b4b4a0cb3627ba4c4856e27556534"}, + {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8d23caab17b87ed5b82e28cdc19172ba1ca65c982e3fff387961d3f33710031f"}, + {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f07d4fcdcfd64bdad0143b9705c5d5089677ebddf60ac6c1f8074a34b1c70cf9"}, + {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:87b991c7ae435489c56a46cef228d2b65a3df689ee4fe24fab69c791c841f633"}, + {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3706a5c4f21073c04be133c36565efc6e3f5646a03c8d19af78c19d7c70eb708"}, + {file = "python_rapidjson-1.10-cp39-cp39-win32.whl", hash = "sha256:47f9078ea6884f700166a8728d863609fec62232e66a33b8fb4a7706ce7c731c"}, + {file = "python_rapidjson-1.10-cp39-cp39-win_amd64.whl", hash = "sha256:9e4921ab7002ae9faad7f439a7c50aa195039f177e9e51a76c34c97966c79a79"}, +] + [[package]] name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -7413,7 +7221,6 @@ files = [ name = "pytz-deprecation-shim" version = "0.1.0.post0" description = "Shims to make deprecation of pytz easier" -category = "main" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -7429,7 +7236,6 @@ tzdata = {version = "*", markers = "python_version >= \"3.6\""} name = "pyvespa" version = "0.33.0" description = "Python API for vespa.ai" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -7454,7 +7260,6 @@ ml = ["keras-tuner", "tensorflow", "tensorflow-ranking", "torch (<1.13)", "trans name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -7476,155 +7281,167 @@ files = [ [[package]] name = "pywinpty" -version = "2.0.10" +version = "2.0.11" description = "Pseudo terminal support for Windows from Python." -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.10-cp310-none-win_amd64.whl", hash = "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16"}, - {file = "pywinpty-2.0.10-cp311-none-win_amd64.whl", hash = "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a"}, - {file = "pywinpty-2.0.10-cp37-none-win_amd64.whl", hash = "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3"}, - {file = "pywinpty-2.0.10-cp38-none-win_amd64.whl", hash = "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8"}, - {file = "pywinpty-2.0.10-cp39-none-win_amd64.whl", hash = "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7"}, - {file = "pywinpty-2.0.10.tar.gz", hash = "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea"}, + {file = "pywinpty-2.0.11-cp310-none-win_amd64.whl", hash = "sha256:452f10ac9ff8ab9151aa8cea9e491a9612a12250b1899278c6a56bc184afb47f"}, + {file = "pywinpty-2.0.11-cp311-none-win_amd64.whl", hash = "sha256:6701867d42aec1239bc0fedf49a336570eb60eb886e81763db77ea2b6c533cc3"}, + {file = "pywinpty-2.0.11-cp38-none-win_amd64.whl", hash = "sha256:0ffd287751ad871141dc9724de70ea21f7fc2ff1af50861e0d232cf70739d8c4"}, + {file = "pywinpty-2.0.11-cp39-none-win_amd64.whl", hash = "sha256:e4e7f023c28ca7aa8e1313e53ba80a4d10171fe27857b7e02f99882dfe3e8638"}, + {file = "pywinpty-2.0.11.tar.gz", hash = "sha256:e244cffe29a894876e2cd251306efd0d8d64abd5ada0a46150a4a71c0b9ad5c5"}, ] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "pyzmq" -version = "25.1.0" +version = "25.1.1" description = "Python bindings for 0MQ" -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, - {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, - {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, - {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, - {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, - {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, - {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, - {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, - {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, - {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, - {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, - {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, ] [package.dependencies] @@ -7634,7 +7451,6 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "qdrant-client" version = "1.4.0" description = "Client library for the Qdrant vector search engine" -category = "main" optional = true python-versions = ">=3.7,<3.12" files = [ @@ -7655,7 +7471,6 @@ urllib3 = ">=1.26.14,<2.0.0" name = "qtconsole" version = "5.4.3" description = "Jupyter Qt console" -category = "dev" optional = false python-versions = ">= 3.7" files = [ @@ -7682,7 +7497,6 @@ test = ["flaky", "pytest", "pytest-qt"] name = "qtpy" version = "2.3.1" description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -7700,7 +7514,6 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] name = "rank-bm25" version = "0.2.2" description = "Various BM25 algorithms for document ranking" -category = "main" optional = true python-versions = "*" files = [ @@ -7716,104 +7529,103 @@ dev = ["pytest"] [[package]] name = "rapidfuzz" -version = "3.1.1" +version = "3.2.0" description = "rapid fuzzy string matching" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "rapidfuzz-3.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:17e4cbe6632aae7c35101c4b7c498e83f6eacf61be0def4ff98167df30dc69ca"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:167dbce2da6bb5b73d43e53434c5a9d7d1214b658b315420e44044782f4c482b"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdee4f4d04761ce167538adbefa01a64e7cab949d89aa09df39ef0d5e859fb2a"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e77ed7d0bd8d9be530c462c921904ada8d3417671eed749784c5a315af334d"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdd2ab5ab56fcaf839a9f58caa8756dbfeba0b3dc187850b763d0a1e6ee9c97a"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0843c53d54d5b7d6122d8f1d7574d8c91a7aacc5c316f74d6e33d98aec82949d"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b3e953dcef0302eeb4fe8c7c4907e50d175199fc07da05ad6bd1d8d141ff138"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec5523d5c08c639cd4e301d42f3ad7c6fb061a1f1cd6b5b627e59af345edfed7"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b4995792e106c3f1ab6f56dd6089918b065888e2e55a71e3fea8d0f66bf30989"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cdbf9a76ea47f14026daaed43a2c2150ab0e9a4d5396909f028380f33e61c522"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f25d1975e846d07990cf946a5927a932aa7cccd308ae9979b03a58ff1cd80087"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e0755f5ac6c3d1dc2505eb2e6eaf5508ff17b42c084406714fbabf2d50d098b6"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de784bbe06d32e66617cd20766c37aae2438902d54b3fa608d2e0a929ca705f4"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-win32.whl", hash = "sha256:ef6c38040d868dcc0132fad377aafeb5b2da71354759e77f41ae599316df2dee"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:7c74fde444bcd13ef3a803c578b28f33b4f9edf368f46ca3de57fda456065967"}, - {file = "rapidfuzz-3.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:e549da8d68ad4ee385c918ea8b9efeda875df9edf6c6b48df927bd061c00bfef"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:58ca539cc6ce385d650138a9b1908b05622c2dd08a23d5aea4890523ef3774d5"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91946c496e6f380939dbea14ff6ce6de87480445c09d03964f5374101462594b"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f2024f83a9300440e845b441e71726471f7567021c1d80796ca02e71c5f0dc2"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17b017f9e1b88dfd6d9b03170ef8e86477de0d9d37fbfcbe72ca070cacbe1b65"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6772eb7cc4429f1eae5a9b41e5b0b1af8f0d50727c6e338d9ad5bceee01da5a"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c089ce856919e03f4dd8f9168d60ac580d30cd0451fd60dcdef73010eca68973"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f2cd9a3760080876fc59edb26926e51d6db44dea65e85f1eb04aa5f58c3bc41"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f32791ee045a7b3d6a56208a55d996d5f7a32fdb688f5c5ee899cb7589539eb"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:68d910048b36613701ea671de68f701e2c1ba2839295238def840ff1fc1b15f4"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6f767d4823002e65c06ea273f952fda2b88775e1c2d508564f04d32cdd7f65b2"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:10313075642a9f1f948d356f4f0803ae28a496d7967b466b9cae1a4be8aa4df3"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1465ea085154378e69bf4bc5e27bdac5c94684416882ace31865232adc9239a2"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:53e3c588e7ea158fa80095dd0ff53f49e2ede9a8d71a3a5b964ca045d845a9b9"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-win32.whl", hash = "sha256:cb08db5c122fea4196483b82f7596e50ef9cab1770f7696c197bf0815ac4dd17"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7c65112c87568274d399ad7a62902cef17801c2bd047b162e79e43758b3ce27"}, - {file = "rapidfuzz-3.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:ea3e46a534de97a6cad2018cb950492a0fcacad380e35440ce3c1c8fef96a261"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a8bb256b34fcad4f3fa00be6b57fe35bcb54f031911195929145c67d9738ffec"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51f21f37aec6bc117e9083181ddc3cbbcbf56b6506492b128d8e836d3545ca80"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a371846f45ed9d24927a8d5222884536c1e171543396b36250fafb2e848bc92"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25eea5c8006b6c8747ca204675c9e939f3c4d27167fb43b2aa211443d34f9abd"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db5e71e5a810d2f1163c914e01b3ba241409a98286ac4850ff26076115ae401b"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c07e16ab38e717931319cff1340debbf2ef940a1cda4eb70e323079b62df306"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aadc5a8b9859737a8f87831215b7fab0c04afeb960bb987c528421a4e6dfb8b6"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0de229cb613be060580c71c1674acbde57921c7ed33d7a726e071a2562924113"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1bf8aba99b267aad0a01dfb44ee39803676007724abcfb72129c350476b2341"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d3264e4a02e4148e30078104fb0c1b6c8eb166ddc5ebe843a22433f58f87dc47"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:712331c1c70c79a219c2ac233b4e25e75ffad51042840d147d5e94519c7d8a1a"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:6ede2d42ad55bd4e7a3394e98c5f58ddace78775493391732d32be61268a4116"}, - {file = "rapidfuzz-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:32a5c47b5153f25eb512dbb91f9850225d2dcfb3404a1c48406726c7732b0726"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:51bb8f7aa4fe45618e75cdccf08491c752a7f137ffbf7d3afd1809791ac8c326"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:788fb03c5acb5b48f5f918f4cbb5dc072498becf018c64e7e27d6b76e63e68b8"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc7f25e20781c8d42e813516ee4ff9043ecce4a8e25fc94ee6732a83d81c1c99"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4a751f216fd1222a4a8c7ceff5180872a156202c3bdca1b337e5a5b09298dfd"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83b48b789f2da1688882cba595c40179194ab15ec17ea1d4c9de9ee239649904"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a6f5cd9f1282da49b8d0747c40f3fea2d64ab5e4c2cc2295baf87ff7a0d062"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5fe8054c244bf63be2380efc275edd86da3a706460d42911dc3ff914f3260a5"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4d509e9aa011e1be5e4da7c5062dc4fc3688714687110536925980b3d03ac6"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ccc1b5b467766110085c80bb9311d233fccc8ed1ce965aebba3125e1bab04cba"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7e181411958d04d5b437a0981e87815e8f1b1909f5ae0e339246d3bc464f53e7"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:c53cf36cdb10819b7154fefdbffbef442ba567d9c1ca74a7e76fd759ace45e6c"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:851b44130393139cb336aa54c681d595d75a3160b7be330f3acc0c3b9dabce70"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49d900da023eeb3bfbe9feee126312eb9fd0458129aa5a581e4d8d8bf4483d14"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-win32.whl", hash = "sha256:6c0e96821029c46847df4ff266ea283a2b6163a4f76a4567f9986934e9c4410c"}, - {file = "rapidfuzz-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7af18372f576e36e93f4662bdf64043ac23dfa02d7f768d7e7e1d0211bb9cb35"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8b966344ed4122a71ab8ccdca2954db1ce0d8049cb9bcac58db07558f9d9ec32"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a293370448f2e46fdc6e086ac99923015bdc53973a65d3df35aefc685e1a5809"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:351d253fdee62d6d0e80c75f0505accc1ce8cc73a50779c60986ef21c92f20f9"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e951c874a0e5b375b2af9b5f264eefc679c0685c166ee0641e703ef0795509b"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4019def8a18bc867ac61f08a542bf474a7a9b3f662f5d5cd169c9135866562f5"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:086a2d84c2e497e3ab160ccf164e319bca874d9383d008fcadf91ede8ac7997f"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d4da453fbd8793ebb11bed396f8a4b9041d6227bf055903447305dd7942312f"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f56af1d46fbeaaa0dc50901c2dc439c7a455cfdac2f1acf6cffeb65ae82c48"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7726f67e4a0b2b4392f03aa62e16b12a697156c6735df27b21bd3ab561b01659"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d72916d27fb88741bfb576b0b0639354ca00f5e91046171c985262c68a86bbb5"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c85bb6946fb02231d1e60ab45c36ecee04ecf7f725e094f5beee798b6b7d36d"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:fb7049dff52cded65184a3d2ff45cfd226bff7314f49a8f4b83f943eea9181a7"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:408007b4bc5a0a0cb9bfcdcc8cffa9b71fec6ee53ccdf9c26b57539f7e264ab5"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-win32.whl", hash = "sha256:9dc7154889937ca5a004d17f62b4798e0af52f69c38eb3112dbdb52b006d4419"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:16c506bac2e0a6f6581b334a7802c2f0d8343ec1d77e5cf9452c33d6219abef8"}, - {file = "rapidfuzz-3.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:5e11e11880951e767342b56627ab2dc9d3ef90e2605b656e9b5e6e0beadaaf0f"}, - {file = "rapidfuzz-3.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8b8f32463781e4703965c9cf7a609a19a74478f332e0d62cd9d0e7a9db91321"}, - {file = "rapidfuzz-3.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b408ac3c7f8c3414bfd5c6044ca4bb385b390bcf5eae3ad884cef48628c131ae"}, - {file = "rapidfuzz-3.1.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ff1a517de2b1e80ddf1a3037a6ebca9925154c1af70751518d50d5c332e1ec8"}, - {file = "rapidfuzz-3.1.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e23665be5918f979180130babedab9317fbb34cdae237c7defad7e86bc684e"}, - {file = "rapidfuzz-3.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:15260263a0c7bffac934a53b6622d77e06e10929ee4d2e62ac6f70c13988f351"}, - {file = "rapidfuzz-3.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f7acc5c9c7cf567372de5b6c817f93db508e7b9bd7f29bd6187df8d2cc60ced5"}, - {file = "rapidfuzz-3.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79f5a3ab7ff6c46336f38690f0564bc7689cefa180257ed9078c42f75b10c9d2"}, - {file = "rapidfuzz-3.1.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:362e366e79fcc9a8866b41f20ef4d2987a06f8b134096e659594c059aa8a6d88"}, - {file = "rapidfuzz-3.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:819d9317c3d86b508d87ab1bca5867f3abc18b902c822bc57366ccc6330a030b"}, - {file = "rapidfuzz-3.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4a64ddfb7084b678da7778c1263aee2baae5a2ca55ec5589a022defc38103eb1"}, - {file = "rapidfuzz-3.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8243bb4bb4db7c3501932ced6a978b284e19c3619b6802455e47bfd0905adb81"}, - {file = "rapidfuzz-3.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39c7d0dbd77a7f28ff85a1dff2afb2ed73e5cd81cca3f654450ed339a271c0ab"}, - {file = "rapidfuzz-3.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4afab735bb0ac3ec9bafcc35376ed336d26af6140c4d81e4c869e77df77ecd5"}, - {file = "rapidfuzz-3.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69d503a7641b5a63aa53c7aca0b857d38f48cd7bae39f8563679b324e3d2d47a"}, - {file = "rapidfuzz-3.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ef3ad80458e47723812976a2ea1282ff207ad20e6cb19da1917f76699bd5aaa5"}, - {file = "rapidfuzz-3.1.1.tar.gz", hash = "sha256:a06a08be3cb7d7df7993dd16e84aaf59bd5a7ff98a9f1b3e893d18b273a71c64"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f5787f1cc456207dee1902804209e1a90df67e88517213aeeb1b248822413b4c"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8d91137b0b5a6ef06c3979b6302265129dee1741486b6baa241ac63a632bea7"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c130e73e0079f403b7c3dbf6f85816a3773971c3e639f7289f8b4337b8fd70fe"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e18059188bfe3cdbc3462aeec2fa3302b08717e04ca34e2cc6e02fb3c0280d8"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37bb6bd6a79d5524f121ff2a7d7df4491519b3f43565dccd4596bd75aa73ab7c"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca0d6aee42effaf2e8883d2181196dd0957b1af5731b0763f10f994c32c823db"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49fc2cbbf05bfa1af3fe4c0e0c8e5c8ac118d6b6ddfb0081cff48ad53734f7ac"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd4fdee46f6ba7d254dba8e7e8f33012c964fc891a06b036b0fd20cab0db301"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab2863732eafd1cc58f249f145c20ad13d4c902d3ef3a369b00438c05e5bfb55"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a9658c545de62ac948027092ba7f4e8507ebc5c9aef964eca654409c58f207f0"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5f3e36cfadaf29f081ad4ca476e320b639d610e930e0557f395780c9b2bdb135"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:239ffc04328e14f5e4097102bd934352a43d5912acf34fb7d3e3fe306de92787"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b56ce39ba0a77501d491bc20a2266989ae0264452758b004950ee5f4c10c641f"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win32.whl", hash = "sha256:dbebd639579ab113644699fe0c536ae00aba15b224e40a79987684333d1104a5"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:88e99229c4df99a7e5810d4d361033b44e29d8eb4faaddcfb8e4bdcb604cf40a"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:8e39c4e2e85828aa6c39cc7f30e2917d991b40190a2a3af1fa02396a3362a54e"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f2e618389427c5e8304357a78f83df22558e61f11bc21aeb95dd544c274d330"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a2a6babfe4d3ce2eadd0079ee7861cb5f1584845c5a3394edead85457e7d7464"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f223deb06895c9c136b40cd8fd7e96ee745c3bb9ed502d7367f6ad9ab6fdd40e"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0de6962b45f761355fa4b37de635e4df467d57530732a40d82e748a5bc911731"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76953516cb3b75fb1234c5a90e0b86be4525f055a9e276237adb1ffe40dca536"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1e04861dddbb477500449dc67fb037656a049b6f78c4c434c6000e64aa42bb4"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff6e725eec9c769f9d22126c80a6ada90275c0d693eca2b35d5933178bda5a2"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21ce33242e579ba255c8a8b438782164acaa55bf188d9410298c40cbaa07d5"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:986a7aad18768b920bb710e15ed7629d1da0af31589348c0a51d152820efc05d"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6e98f0a6fac14b7b9893147deceae12131f6ff169ae1c973635ef97617949c8f"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5dd5c4b9f5cd8a8271a90d1bab643028e7172808c68ed5d8dde661a3e51098e3"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e336b0a81c5a8e689edf6928136d19e791733a66509026d9acbaa148238186e0"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fa44afb731535a803c4c15ee846257fef050768af96d1d6c0eadb30285d0f7b"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win32.whl", hash = "sha256:d04ad155dbecc0c143912f691d38d4790e290c2ce5411b146c0e00d4f4afd26f"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:b9e79e27344af95a71a3bb6cd3562581da5d0780ff847a13ad69ee622d940d3c"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:dc53747e73f34e8f3a3c1b0bc5b437b90a2c69d873e97781aa7c06543201409a"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:613c1043332eeba0c0910de71af221ac10d820b4fa9615b0083c733b90a757f9"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0907f87beca70e44f78e318eede2416ddba19ec43d28af9248617e8a1741ef3"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcfd184e0b5c58497cc3d961f49ac07ae1656d161c6c4d06230d267ae4e11f00"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7d53a2f1ccfb169be26fa3824b1b185420592c75853f16c6b7115315ea6784"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2eac585803c4e8132ed5f4a150621db05c418304982c88cf706abdded65e1632"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc859f654b350def5df2ebc6d09f822b04399823e3dad1c3f2e8776c825fcde7"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8a165f64c528edc0bbbd09c76d64efd4dbe4240fd1961710b69586ef40486e79"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:56a392b655597ecf40535b56bfb7c0856c10c0abc0cbc369fd25a1665420710b"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5863b176da42b1bb450a28375ef1502f81fbecd210a5aae295d7f2221284ad41"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:8f8590c39a3f745b314f2697b140c8f8600fe7ecfb2101e9e4ec6e7716c66827"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:da00990adf1fbc0904f22409b3451473fa465a0ef49f3075703c206080aa31b2"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:2504205552bf568ac478f17dd612d0e31c4a82c645c66209a442df7e572b5adc"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:af3ac648232c109e36c8b941106d726969972644aa3ef55218c5988aa1daea03"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:04d22f6058ce5d620ec4ecd771e44cfa77d571137d6c6547df57bdfc44ee2a98"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac7ddcd372ed202d1b59b117506da695b291f135435cfbf3e71490aa8e687173"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd3fca0224b84350f73eab1fb5728c58fd25ee4f20e512607c7d83f9bc836d3f"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bdb1f92c4666c7e1d3c21268b931cf3f06f32af98dfdeb37641159b15fa31dd"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:871052405c465a45b53a3dc854a8be62079f42cdbb052651ff0b65e2452131e6"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb9bb1af5680741cf974f510fb3894907a1b308e819aff3d9ea10b5326e8a5f6"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84ce2e010677835fa5ba591419e4404f11a1446f33eec3724a2bff557ae5144a"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c13107e0fdca5ccae70659f45646d57453338a9dfc6b152fb7372e4bf73466a0"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:538027685a1a8f1699e329f6443951267f169bfa149298734ea679db8f0e7171"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3557736672115d082979a8a12f884ed5b24268f4471fee85cfb2ec7212b68607"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6bc5e3da74644cf75663f5b438e0ae79b67d1f96d082cda771b0ecfed0528f40"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d2d0fc98d9d7bba44f929d201c2c2c35eb69ea2ffef43d939b297dafef934625"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bf85a3bf34f27383691e8af0fd148b2a3a89f1444d4640d04ef58030f596ee0"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-win32.whl", hash = "sha256:cf5ea3f1d65a0bee707245a0096c3a6f769b3ad6f1b9afc7176dfb73eb0ac98f"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:54906095444ea8b0a4013f3799b3f2c380205d7f60b9c55774e7d2264fa8d9c6"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6d44218823533e0d47770feef86c73c90a6f7e8d4923eafabf56a1fa3444eda0"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87c3d4077e61c66d5dd11198a317f83db8e8cf034239baa16e4384037b611652"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0e1142350566349c41173685988d942ebc89578f25ee27750d261e7d79e1ce"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de44a378751fdfb19ddf6af412b3395db4b21ab61f40139f815c82f1a1611b50"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0983b30c7b289f540b11cdb550e301b3f2e8f0ef9df866aa24a16f6cd96041"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adfffb79288437006be412d74e28cddd7c5e6cc9f84a34aa9c356b13dc1ad2c9"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a284386652efb3b7d41ed5dd101ab4ce5936f585c52a47fa9838fc0342235700"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c546c83d6bc9006b86f56921b92c3e16d8ddeb4e1663653e755a5d8a3ac258da"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:53b3575fa398a5021192c1592dce98965560ad00690be3ade056eab99288562c"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:366ade5d0067dc6281e2a6c9e5c91bbfe023b09cef86894de8fe480b4696e3bf"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f946dec03cc2c77bc091d186c007d1e957d1f16a4d68a181f5fa75aea40bdf87"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:045e5cccb0e792005d5465de0ea4621b9b67778580e558f266984704e68b0087"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fd80288b9538c87209893f0934563c20b6a43acf30693794bcc111b294447ee9"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win32.whl", hash = "sha256:a359436754ed5dd10d88706f076caa7f8e5c1469bf5ebba1897dc87aa9ff953e"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:75df3d9b895910ee810b2c96c8626cc2b5b63bb237762db36ff79fb466eccc43"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:893833a903875a50acdbcb7ed33b5426ba47412bd18b3eb80d56d982b641dc59"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3002c3660180747243cccb40c95ade1960e6665b340f211a114f5994b345ab53"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa50de7e0f95e1400b2bf38cfeb6e40cf87c862537871c2f7b2050b5db0a9dfc"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54842a578a2a8e5258812a9032ffb55e6f1185490fd160cae64e57b4dc342297"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:108861623838cd574b0faa3309ce8525c2086159de7f9e23ac263a987c070ebd"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d39128415f0b52be08c15eeee5f79288189933a4d6fa5dc5fff11e20614b7989"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3af2b75635f33ffab84e295773c84a176d4cba75311d836ad79b6795e9da11ac"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68c678f7f3ca3d83d1e1dd7fb7db3232037d9eef12a47f1d5fe248a76ca47571"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d2bd257034e910df0951cdeff337dbd086d7d90af3ed9f6721e7bba9fc388a"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7f20e68cad26fc140c6f2ac9e8f2632a0cd66e407ba3ea4ace63c669fd4719"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f09fd9dc73180deb9ca1c4fbd9cc27378f0ab6ee74e97318c38c5080708702b6"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af7914fc7683f921492f32314cfbe915a5376cc08a982e09084cbd9b866c9fd4"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a242c4b909abbcfa44504dc5041d5eeca4cd088ae51afd6a52b4dc61684fa2"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b07afaca28398b93d727a2565491c455896898b66daee4664acde4af94e557"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e4c4a031c50e4eeb4787263319a0ac5bed20f4a263d28eac060150e3ba0018"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d19c2853a464c7b98cc408654412fd875b030f78023ccbefc4ba9eec754e07e7"}, + {file = "rapidfuzz-3.2.0.tar.gz", hash = "sha256:448d031d9960fea7826d42bd4284156fc68d3b55a6946eb34ca5c6acf960577b"}, ] [package.extras] @@ -7823,7 +7635,6 @@ full = ["numpy"] name = "ratelimiter" version = "1.2.0.post0" description = "Simple python rate limiting object" -category = "main" optional = true python-versions = "*" files = [ @@ -7838,7 +7649,6 @@ test = ["pytest (>=3.0)", "pytest-asyncio"] name = "rdflib" version = "6.3.2" description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ @@ -7858,14 +7668,13 @@ networkx = ["networkx (>=2.0.0,<3.0.0)"] [[package]] name = "redis" -version = "4.5.5" +version = "4.6.0" description = "Python client for Redis database and key-value store" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "redis-4.5.5-py3-none-any.whl", hash = "sha256:77929bc7f5dab9adf3acba2d3bb7d7658f1e0c2f1cafe7eb36434e751c471119"}, - {file = "redis-4.5.5.tar.gz", hash = "sha256:dc87a0bdef6c8bfe1ef1e1c40be7034390c2ae02d92dcd0c7ca1729443899880"}, + {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, + {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, ] [package.dependencies] @@ -7875,114 +7684,127 @@ async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2 hiredis = ["hiredis (>=1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +[[package]] +name = "referencing" +version = "0.30.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "regex" -version = "2023.6.3" +version = "2023.8.8" description = "Alternative regular expression module, to replace re." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, - {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, - {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, - {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, - {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, - {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, - {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, - {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, - {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, - {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, - {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, - {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, - {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, - {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, - {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, - {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, - {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, + {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, + {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, + {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, + {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, + {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, + {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, + {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, + {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, + {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, + {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, + {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, + {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, + {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, + {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, + {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, ] [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] @@ -7990,7 +7812,7 @@ certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7", optional = true, markers = "extra == \"socks\""} -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -8000,7 +7822,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-file" version = "1.5.1" description = "File transport adapter for Requests" -category = "main" optional = true python-versions = "*" files = [ @@ -8016,7 +7837,6 @@ six = "*" name = "requests-oauthlib" version = "1.3.1" description = "OAuthlib authentication support for Requests." -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -8035,7 +7855,6 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "requests-toolbelt" version = "1.0.0" description = "A utility belt for advanced users of python-requests" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -8050,7 +7869,6 @@ requests = ">=2.0.1,<3.0.0" name = "responses" version = "0.22.0" description = "A utility library for mocking out the `requests` Python library." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -8071,7 +7889,6 @@ tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asy name = "retry" version = "0.9.2" description = "Easy to use retry decorator." -category = "main" optional = true python-versions = "*" files = [ @@ -8087,7 +7904,6 @@ py = ">=1.4.26,<2.0.0" name = "rfc3339-validator" version = "0.1.4" description = "A pure python RFC3339 validator" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -8102,7 +7918,6 @@ six = "*" name = "rfc3986-validator" version = "0.1.1" description = "Pure python rfc3986 validator" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -8112,14 +7927,13 @@ files = [ [[package]] name = "rich" -version = "13.4.2" +version = "13.5.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = true python-versions = ">=3.7.0" files = [ - {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, - {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, + {file = "rich-13.5.2-py3-none-any.whl", hash = "sha256:146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808"}, + {file = "rich-13.5.2.tar.gz", hash = "sha256:fb9d6c0a0f643c99eed3875b5377a184132ba9be4d61516a55273d3554d75a39"}, ] [package.dependencies] @@ -8130,11 +7944,116 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9 [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rpds-py" +version = "0.9.2" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:ab6919a09c055c9b092798ce18c6c4adf49d24d4d9e43a92b257e3f2548231e7"}, + {file = "rpds_py-0.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d55777a80f78dd09410bd84ff8c95ee05519f41113b2df90a69622f5540c4f8b"}, + {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a216b26e5af0a8e265d4efd65d3bcec5fba6b26909014effe20cd302fd1138fa"}, + {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29cd8bfb2d716366a035913ced99188a79b623a3512292963d84d3e06e63b496"}, + {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44659b1f326214950a8204a248ca6199535e73a694be8d3e0e869f820767f12f"}, + {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:745f5a43fdd7d6d25a53ab1a99979e7f8ea419dfefebcab0a5a1e9095490ee5e"}, + {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a987578ac5214f18b99d1f2a3851cba5b09f4a689818a106c23dbad0dfeb760f"}, + {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf4151acb541b6e895354f6ff9ac06995ad9e4175cbc6d30aaed08856558201f"}, + {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:03421628f0dc10a4119d714a17f646e2837126a25ac7a256bdf7c3943400f67f"}, + {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13b602dc3e8dff3063734f02dcf05111e887f301fdda74151a93dbbc249930fe"}, + {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fae5cb554b604b3f9e2c608241b5d8d303e410d7dfb6d397c335f983495ce7f6"}, + {file = "rpds_py-0.9.2-cp310-none-win32.whl", hash = "sha256:47c5f58a8e0c2c920cc7783113df2fc4ff12bf3a411d985012f145e9242a2764"}, + {file = "rpds_py-0.9.2-cp310-none-win_amd64.whl", hash = "sha256:4ea6b73c22d8182dff91155af018b11aac9ff7eca085750455c5990cb1cfae6e"}, + {file = "rpds_py-0.9.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e564d2238512c5ef5e9d79338ab77f1cbbda6c2d541ad41b2af445fb200385e3"}, + {file = "rpds_py-0.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f411330a6376fb50e5b7a3e66894e4a39e60ca2e17dce258d53768fea06a37bd"}, + {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e7521f5af0233e89939ad626b15278c71b69dc1dfccaa7b97bd4cdf96536bb7"}, + {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8d3335c03100a073883857e91db9f2e0ef8a1cf42dc0369cbb9151c149dbbc1b"}, + {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d25b1c1096ef0447355f7293fbe9ad740f7c47ae032c2884113f8e87660d8f6e"}, + {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a5d3fbd02efd9cf6a8ffc2f17b53a33542f6b154e88dd7b42ef4a4c0700fdad"}, + {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5934e2833afeaf36bd1eadb57256239785f5af0220ed8d21c2896ec4d3a765f"}, + {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:095b460e117685867d45548fbd8598a8d9999227e9061ee7f012d9d264e6048d"}, + {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91378d9f4151adc223d584489591dbb79f78814c0734a7c3bfa9c9e09978121c"}, + {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:24a81c177379300220e907e9b864107614b144f6c2a15ed5c3450e19cf536fae"}, + {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de0b6eceb46141984671802d412568d22c6bacc9b230174f9e55fc72ef4f57de"}, + {file = "rpds_py-0.9.2-cp311-none-win32.whl", hash = "sha256:700375326ed641f3d9d32060a91513ad668bcb7e2cffb18415c399acb25de2ab"}, + {file = "rpds_py-0.9.2-cp311-none-win_amd64.whl", hash = "sha256:0766babfcf941db8607bdaf82569ec38107dbb03c7f0b72604a0b346b6eb3298"}, + {file = "rpds_py-0.9.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1440c291db3f98a914e1afd9d6541e8fc60b4c3aab1a9008d03da4651e67386"}, + {file = "rpds_py-0.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0f2996fbac8e0b77fd67102becb9229986396e051f33dbceada3debaacc7033f"}, + {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f30d205755566a25f2ae0382944fcae2f350500ae4df4e795efa9e850821d82"}, + {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:159fba751a1e6b1c69244e23ba6c28f879a8758a3e992ed056d86d74a194a0f3"}, + {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1f044792e1adcea82468a72310c66a7f08728d72a244730d14880cd1dabe36b"}, + {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9251eb8aa82e6cf88510530b29eef4fac825a2b709baf5b94a6094894f252387"}, + {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01899794b654e616c8625b194ddd1e5b51ef5b60ed61baa7a2d9c2ad7b2a4238"}, + {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0c43f8ae8f6be1d605b0465671124aa8d6a0e40f1fb81dcea28b7e3d87ca1e1"}, + {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:207f57c402d1f8712618f737356e4b6f35253b6d20a324d9a47cb9f38ee43a6b"}, + {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b52e7c5ae35b00566d244ffefba0f46bb6bec749a50412acf42b1c3f402e2c90"}, + {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:978fa96dbb005d599ec4fd9ed301b1cc45f1a8f7982d4793faf20b404b56677d"}, + {file = "rpds_py-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6aa8326a4a608e1c28da191edd7c924dff445251b94653988efb059b16577a4d"}, + {file = "rpds_py-0.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aad51239bee6bff6823bbbdc8ad85136c6125542bbc609e035ab98ca1e32a192"}, + {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd4dc3602370679c2dfb818d9c97b1137d4dd412230cfecd3c66a1bf388a196"}, + {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd9da77c6ec1f258387957b754f0df60766ac23ed698b61941ba9acccd3284d1"}, + {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:190ca6f55042ea4649ed19c9093a9be9d63cd8a97880106747d7147f88a49d18"}, + {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:876bf9ed62323bc7dcfc261dbc5572c996ef26fe6406b0ff985cbcf460fc8a4c"}, + {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa2818759aba55df50592ecbc95ebcdc99917fa7b55cc6796235b04193eb3c55"}, + {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ea4d00850ef1e917815e59b078ecb338f6a8efda23369677c54a5825dbebb55"}, + {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5855c85eb8b8a968a74dc7fb014c9166a05e7e7a8377fb91d78512900aadd13d"}, + {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:14c408e9d1a80dcb45c05a5149e5961aadb912fff42ca1dd9b68c0044904eb32"}, + {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:65a0583c43d9f22cb2130c7b110e695fff834fd5e832a776a107197e59a1898e"}, + {file = "rpds_py-0.9.2-cp38-none-win32.whl", hash = "sha256:71f2f7715935a61fa3e4ae91d91b67e571aeb5cb5d10331ab681256bda2ad920"}, + {file = "rpds_py-0.9.2-cp38-none-win_amd64.whl", hash = "sha256:674c704605092e3ebbbd13687b09c9f78c362a4bc710343efe37a91457123044"}, + {file = "rpds_py-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:07e2c54bef6838fa44c48dfbc8234e8e2466d851124b551fc4e07a1cfeb37260"}, + {file = "rpds_py-0.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fdf55283ad38c33e35e2855565361f4bf0abd02470b8ab28d499c663bc5d7c"}, + {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:890ba852c16ace6ed9f90e8670f2c1c178d96510a21b06d2fa12d8783a905193"}, + {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50025635ba8b629a86d9d5474e650da304cb46bbb4d18690532dd79341467846"}, + {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517cbf6e67ae3623c5127206489d69eb2bdb27239a3c3cc559350ef52a3bbf0b"}, + {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0836d71ca19071090d524739420a61580f3f894618d10b666cf3d9a1688355b1"}, + {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c439fd54b2b9053717cca3de9583be6584b384d88d045f97d409f0ca867d80f"}, + {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f68996a3b3dc9335037f82754f9cdbe3a95db42bde571d8c3be26cc6245f2324"}, + {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7d68dc8acded354c972116f59b5eb2e5864432948e098c19fe6994926d8e15c3"}, + {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f963c6b1218b96db85fc37a9f0851eaf8b9040aa46dec112611697a7023da535"}, + {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a46859d7f947061b4010e554ccd1791467d1b1759f2dc2ec9055fa239f1bc26"}, + {file = "rpds_py-0.9.2-cp39-none-win32.whl", hash = "sha256:e07e5dbf8a83c66783a9fe2d4566968ea8c161199680e8ad38d53e075df5f0d0"}, + {file = "rpds_py-0.9.2-cp39-none-win_amd64.whl", hash = "sha256:682726178138ea45a0766907957b60f3a1bf3acdf212436be9733f28b6c5af3c"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:196cb208825a8b9c8fc360dc0f87993b8b260038615230242bf18ec84447c08d"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c7671d45530fcb6d5e22fd40c97e1e1e01965fc298cbda523bb640f3d923b387"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83b32f0940adec65099f3b1c215ef7f1d025d13ff947975a055989cb7fd019a4"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f67da97f5b9eac838b6980fc6da268622e91f8960e083a34533ca710bec8611"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03975db5f103997904c37e804e5f340c8fdabbb5883f26ee50a255d664eed58c"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:987b06d1cdb28f88a42e4fb8a87f094e43f3c435ed8e486533aea0bf2e53d931"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c861a7e4aef15ff91233751619ce3a3d2b9e5877e0fcd76f9ea4f6847183aa16"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02938432352359805b6da099c9c95c8a0547fe4b274ce8f1a91677401bb9a45f"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ef1f08f2a924837e112cba2953e15aacfccbbfcd773b4b9b4723f8f2ddded08e"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:35da5cc5cb37c04c4ee03128ad59b8c3941a1e5cd398d78c37f716f32a9b7f67"}, + {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:141acb9d4ccc04e704e5992d35472f78c35af047fa0cfae2923835d153f091be"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79f594919d2c1a0cc17d1988a6adaf9a2f000d2e1048f71f298b056b1018e872"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a06418fe1155e72e16dddc68bb3780ae44cebb2912fbd8bb6ff9161de56e1798"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b2eb034c94b0b96d5eddb290b7b5198460e2d5d0c421751713953a9c4e47d10"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b08605d248b974eb02f40bdcd1a35d3924c83a2a5e8f5d0fa5af852c4d960af"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0805911caedfe2736935250be5008b261f10a729a303f676d3d5fea6900c96a"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab2299e3f92aa5417d5e16bb45bb4586171c1327568f638e8453c9f8d9e0f020"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c8d7594e38cf98d8a7df25b440f684b510cf4627fe038c297a87496d10a174f"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b9ec12ad5f0a4625db34db7e0005be2632c1013b253a4a60e8302ad4d462afd"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1fcdee18fea97238ed17ab6478c66b2095e4ae7177e35fb71fbe561a27adf620"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:933a7d5cd4b84f959aedeb84f2030f0a01d63ae6cf256629af3081cf3e3426e8"}, + {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:686ba516e02db6d6f8c279d1641f7067ebb5dc58b1d0536c4aaebb7bf01cdc5d"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0173c0444bec0a3d7d848eaeca2d8bd32a1b43f3d3fde6617aac3731fa4be05f"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d576c3ef8c7b2d560e301eb33891d1944d965a4d7a2eacb6332eee8a71827db6"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed89861ee8c8c47d6beb742a602f912b1bb64f598b1e2f3d758948721d44d468"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1054a08e818f8e18910f1bee731583fe8f899b0a0a5044c6e680ceea34f93876"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99e7c4bb27ff1aab90dcc3e9d37ee5af0231ed98d99cb6f5250de28889a3d502"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c545d9d14d47be716495076b659db179206e3fd997769bc01e2d550eeb685596"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9039a11bca3c41be5a58282ed81ae422fa680409022b996032a43badef2a3752"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fb39aca7a64ad0c9490adfa719dbeeb87d13be137ca189d2564e596f8ba32c07"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2d8b3b3a2ce0eaa00c5bbbb60b6713e94e7e0becab7b3db6c5c77f979e8ed1f1"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:99b1c16f732b3a9971406fbfe18468592c5a3529585a45a35adbc1389a529a03"}, + {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c27ee01a6c3223025f4badd533bea5e87c988cb0ba2811b690395dfe16088cfe"}, + {file = "rpds_py-0.9.2.tar.gz", hash = "sha256:8d70e8f14900f2657c249ea4def963bed86a29b81f81f5b76b5a9215680de945"}, +] + [[package]] name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = true python-versions = ">=3.6,<4" files = [ @@ -8149,7 +8068,6 @@ pyasn1 = ">=0.1.3" name = "ruff" version = "0.0.249" description = "An extremely fast Python linter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -8174,14 +8092,13 @@ files = [ [[package]] name = "s3transfer" -version = "0.6.1" +version = "0.6.2" description = "An Amazon S3 Transfer Manager" -category = "main" optional = true python-versions = ">= 3.7" files = [ - {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, - {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, + {file = "s3transfer-0.6.2-py3-none-any.whl", hash = "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084"}, + {file = "s3transfer-0.6.2.tar.gz", hash = "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861"}, ] [package.dependencies] @@ -8192,60 +8109,62 @@ crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] [[package]] name = "safetensors" -version = "0.3.1" +version = "0.3.2" description = "Fast and Safe Tensor serialization" -category = "main" optional = true python-versions = "*" files = [ - {file = "safetensors-0.3.1-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:2ae9b7dd268b4bae6624729dac86deb82104820e9786429b0583e5168db2f770"}, - {file = "safetensors-0.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:08c85c1934682f1e2cd904d38433b53cd2a98245a7cc31f5689f9322a2320bbf"}, - {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba625c7af9e1c5d0d91cb83d2fba97d29ea69d4db2015d9714d24c7f6d488e15"}, - {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b57d5890c619ec10d9f1b6426b8690d0c9c2868a90dc52f13fae6f6407ac141f"}, - {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c9f562ea696d50b95cadbeb1716dc476714a87792ffe374280c0835312cbfe2"}, - {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c115951b3a865ece8d98ee43882f2fd0a999c0200d6e6fec24134715ebe3b57"}, - {file = "safetensors-0.3.1-cp310-cp310-win32.whl", hash = "sha256:118f8f7503ea312fc7af27e934088a1b589fb1eff5a7dea2cd1de6c71ee33391"}, - {file = "safetensors-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:54846eaae25fded28a7bebbb66be563cad221b4c80daee39e2f55df5e5e0266f"}, - {file = "safetensors-0.3.1-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:5af82e10946c4822506db0f29269f43147e889054704dde994d4e22f0c37377b"}, - {file = "safetensors-0.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:626c86dd1d930963c8ea7f953a3787ae85322551e3a5203ac731d6e6f3e18f44"}, - {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e30677e6af1f4cc4f2832546e91dbb3b0aa7d575bfa473d2899d524e1ace08"}, - {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d534b80bc8d39945bb902f34b0454773971fe9e5e1f2142af451759d7e52b356"}, - {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ddd0ddd502cf219666e7d30f23f196cb87e829439b52b39f3e7da7918c3416df"}, - {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997a2cc14023713f423e6d16536d55cb16a3d72850f142e05f82f0d4c76d383b"}, - {file = "safetensors-0.3.1-cp311-cp311-win32.whl", hash = "sha256:6ae9ca63d9e22f71ec40550207bd284a60a6b4916ae6ca12c85a8d86bf49e0c3"}, - {file = "safetensors-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:62aa7421ca455418423e35029524489480adda53e3f702453580180ecfebe476"}, - {file = "safetensors-0.3.1-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:6d54b3ed367b6898baab75dfd057c24f36ec64d3938ffff2af981d56bfba2f42"}, - {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262423aeda91117010f8c607889066028f680fbb667f50cfe6eae96f22f9d150"}, - {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10efe2513a8327fd628cea13167089588acc23093ba132aecfc536eb9a4560fe"}, - {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:689b3d6a7ebce70ee9438267ee55ea89b575c19923876645e927d08757b552fe"}, - {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14cd9a87bc73ce06903e9f8ee8b05b056af6f3c9f37a6bd74997a16ed36ff5f4"}, - {file = "safetensors-0.3.1-cp37-cp37m-win32.whl", hash = "sha256:a77cb39624480d5f143c1cc272184f65a296f573d61629eff5d495d2e0541d3e"}, - {file = "safetensors-0.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9eff3190bfbbb52eef729911345c643f875ca4dbb374aa6c559675cfd0ab73db"}, - {file = "safetensors-0.3.1-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:05cbfef76e4daa14796db1bbb52072d4b72a44050c368b2b1f6fd3e610669a89"}, - {file = "safetensors-0.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:c49061461f4a81e5ec3415070a3f135530834c89cbd6a7db7cd49e3cb9d9864b"}, - {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cf7e73ca42974f098ce0cf4dd8918983700b6b07a4c6827d50c8daefca776e"}, - {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04f909442d6223ff0016cd2e1b2a95ef8039b92a558014627363a2e267213f62"}, - {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c573c5a0d5d45791ae8c179e26d74aff86e719056591aa7edb3ca7be55bc961"}, - {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6994043b12e717cf2a6ba69077ac41f0d3675b2819734f07f61819e854c622c7"}, - {file = "safetensors-0.3.1-cp38-cp38-win32.whl", hash = "sha256:158ede81694180a0dbba59422bc304a78c054b305df993c0c6e39c6330fa9348"}, - {file = "safetensors-0.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdc725beff7121ea8d39a7339f5a6abcb01daa189ea56290b67fe262d56e20f"}, - {file = "safetensors-0.3.1-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:cba910fcc9e5e64d32d62b837388721165e9c7e45d23bc3a38ad57694b77f40d"}, - {file = "safetensors-0.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a4f7dbfe7285573cdaddd85ef6fa84ebbed995d3703ab72d71257944e384612f"}, - {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54aed0802f9eaa83ca7b1cbb986bfb90b8e2c67b6a4bcfe245627e17dad565d4"}, - {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34b75a766f3cfc99fd4c33e329b76deae63f5f388e455d863a5d6e99472fca8e"}, - {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a0f31904f35dc14919a145b2d7a2d8842a43a18a629affe678233c4ea90b4af"}, - {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcf527ecc5f58907fd9031510378105487f318cc91ecdc5aee3c7cc8f46030a8"}, - {file = "safetensors-0.3.1-cp39-cp39-win32.whl", hash = "sha256:e2f083112cf97aa9611e2a05cc170a2795eccec5f6ff837f4565f950670a9d83"}, - {file = "safetensors-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f4f614b8e8161cd8a9ca19c765d176a82b122fa3d3387b77862145bfe9b4e93"}, - {file = "safetensors-0.3.1.tar.gz", hash = "sha256:571da56ff8d0bec8ae54923b621cda98d36dcef10feb36fd492c4d0c2cd0e869"}, + {file = "safetensors-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b6a66989075c2891d743153e8ba9ca84ee7232c8539704488f454199b8b8f84d"}, + {file = "safetensors-0.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:670d6bc3a3b377278ce2971fa7c36ebc0a35041c4ea23b9df750a39380800195"}, + {file = "safetensors-0.3.2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:564f42838721925b5313ae864ba6caa6f4c80a9fbe63cf24310c3be98ab013cd"}, + {file = "safetensors-0.3.2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:7f80af7e4ab3188daaff12d43d078da3017a90d732d38d7af4eb08b6ca2198a5"}, + {file = "safetensors-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec30d78f20f1235b252d59cbb9755beb35a1fde8c24c89b3c98e6a1804cfd432"}, + {file = "safetensors-0.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16063d94d8f600768d3c331b1e97964b1bf3772e19710105fe24ec5a6af63770"}, + {file = "safetensors-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb44e140bf2aeda98d9dde669dbec15f7b77f96a9274469b91a6cf4bcc5ec3b"}, + {file = "safetensors-0.3.2-cp310-cp310-win32.whl", hash = "sha256:2961c1243fd0da46aa6a1c835305cc4595486f8ac64632a604d0eb5f2de76175"}, + {file = "safetensors-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c813920482c337d1424d306e1b05824a38e3ef94303748a0a287dea7a8c4f805"}, + {file = "safetensors-0.3.2-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:707df34bd9b9047e97332136ad98e57028faeccdb9cfe1c3b52aba5964cc24bf"}, + {file = "safetensors-0.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:becc5bb85b2947eae20ed23b407ebfd5277d9a560f90381fe2c42e6c043677ba"}, + {file = "safetensors-0.3.2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:30a75707be5cc9686490bde14b9a371cede4af53244ea72b340cfbabfffdf58a"}, + {file = "safetensors-0.3.2-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:54ad6af663e15e2b99e2ea3280981b7514485df72ba6d014dc22dae7ba6a5e6c"}, + {file = "safetensors-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37764b3197656ef507a266c453e909a3477dabc795962b38e3ad28226f53153b"}, + {file = "safetensors-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4939067736783acd8391d83cd97d6c202f94181951ce697d519f9746381b6a39"}, + {file = "safetensors-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0fac127ff8fb04834da5c6d85a8077e6a1c9180a11251d96f8068db922a17"}, + {file = "safetensors-0.3.2-cp311-cp311-win32.whl", hash = "sha256:155b82dbe2b0ebff18cde3f76b42b6d9470296e92561ef1a282004d449fa2b4c"}, + {file = "safetensors-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:a86428d196959619ce90197731be9391b5098b35100a7228ef4643957648f7f5"}, + {file = "safetensors-0.3.2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:c1f8ab41ed735c5b581f451fd15d9602ff51aa88044bfa933c5fa4b1d0c644d1"}, + {file = "safetensors-0.3.2-cp37-cp37m-macosx_13_0_x86_64.whl", hash = "sha256:bc9cfb3c9ea2aec89685b4d656f9f2296f0f0d67ecf2bebf950870e3be89b3db"}, + {file = "safetensors-0.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace5d471e3d78e0d93f952707d808b5ab5eac77ddb034ceb702e602e9acf2be9"}, + {file = "safetensors-0.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de3e20a388b444381bcda1a3193cce51825ddca277e4cf3ed1fe8d9b2d5722cd"}, + {file = "safetensors-0.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d7d70d48585fe8df00725aa788f2e64fd24a4c9ae07cd6be34f6859d0f89a9c"}, + {file = "safetensors-0.3.2-cp37-cp37m-win32.whl", hash = "sha256:6ff59bc90cdc857f68b1023be9085fda6202bbe7f2fd67d06af8f976d6adcc10"}, + {file = "safetensors-0.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8b05c93da15fa911763a89281906ca333ed800ab0ef1c7ce53317aa1a2322f19"}, + {file = "safetensors-0.3.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:8969cfd9e8d904e8d3c67c989e1bd9a95e3cc8980d4f95e4dcd43c299bb94253"}, + {file = "safetensors-0.3.2-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:f54148ac027556eb02187e9bc1556c4d916c99ca3cb34ca36a7d304d675035c1"}, + {file = "safetensors-0.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caec25fedbcf73f66c9261984f07885680f71417fc173f52279276c7f8a5edd3"}, + {file = "safetensors-0.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50224a1d99927ccf3b75e27c3d412f7043280431ab100b4f08aad470c37cf99a"}, + {file = "safetensors-0.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa98f49e95f02eb750d32c4947e7d5aa43883149ebd0414920866446525b70f0"}, + {file = "safetensors-0.3.2-cp38-cp38-win32.whl", hash = "sha256:33409df5e28a83dc5cc5547a3ac17c0f1b13a1847b1eb3bc4b3be0df9915171e"}, + {file = "safetensors-0.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e04a7cbbb3856159ab99e3adb14521544f65fcb8548cce773a1435a0f8d78d27"}, + {file = "safetensors-0.3.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:7c864cf5dcbfb608c5378f83319c60cc9c97263343b57c02756b7613cd5ab4dd"}, + {file = "safetensors-0.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:14e8c19d6dc51d4f70ee33c46aff04c8ba3f95812e74daf8036c24bc86e75cae"}, + {file = "safetensors-0.3.2-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:042a60f633c3c7009fdf6a7c182b165cb7283649d2a1e9c7a4a1c23454bd9a5b"}, + {file = "safetensors-0.3.2-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:fafd95e5ef41e8f312e2a32b7031f7b9b2a621b255f867b221f94bb2e9f51ae8"}, + {file = "safetensors-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ed77cf358abce2307f03634694e0b2a29822e322a1623e0b1aa4b41e871bf8b"}, + {file = "safetensors-0.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d344e8b2681a33aafc197c90b0def3229b3317d749531c72fa6259d0caa5c8c"}, + {file = "safetensors-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87ff0024ef2e5722a79af24688ce4a430f70601d0cf712a744105ed4b8f67ba5"}, + {file = "safetensors-0.3.2-cp39-cp39-win32.whl", hash = "sha256:827af9478b78977248ba93e2fd97ea307fb63f463f80cef4824460f8c2542a52"}, + {file = "safetensors-0.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9b09f27c456efa301f98681ea14b12f81f2637889f6336223ccab71e42c34541"}, + {file = "safetensors-0.3.2.tar.gz", hash = "sha256:2dbd34554ed3b99435a0e84df077108f5334c8336b5ed9cb8b6b98f7b10da2f6"}, ] [package.extras] -all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] -dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] +all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] +dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)"] numpy = ["numpy (>=1.21.6)"] paddlepaddle = ["paddlepaddle (>=2.4.1)"] +pinned-tf = ["tensorflow (==2.11.0)"] quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] tensorflow = ["tensorflow (>=2.11.0)"] testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] @@ -8253,52 +8172,50 @@ torch = ["torch (>=1.10)"] [[package]] name = "scikit-learn" -version = "1.2.2" +version = "1.3.0" description = "A set of python modules for machine learning and data mining" -category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, - {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, - {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, - {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, + {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, + {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, + {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, + {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, + {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, ] [package.dependencies] joblib = ">=1.1.1" numpy = ">=1.17.3" -scipy = ">=1.3.2" +scipy = ">=1.5.0" threadpoolctl = ">=2.0.0" [package.extras] benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] [[package]] name = "scipy" version = "1.9.3" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -8333,11 +8250,21 @@ dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "semver" +version = "3.0.1" +description = "Python helper for Semantic Versioning (https://semver.org)" +optional = true +python-versions = ">=3.7" +files = [ + {file = "semver-3.0.1-py3-none-any.whl", hash = "sha256:2a23844ba1647362c7490fe3995a86e097bb590d16f0f32dfc383008f19e4cdf"}, + {file = "semver-3.0.1.tar.gz", hash = "sha256:9ec78c5447883c67b97f98c3b6212796708191d22e4ad30f4570f840171cbce1"}, +] + [[package]] name = "send2trash" version = "1.8.2" description = "Send file to trash natively under Mac OS X, Windows and Linux" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -8354,7 +8281,6 @@ win32 = ["pywin32"] name = "sentence-transformers" version = "2.2.2" description = "Multilingual text embeddings" -category = "main" optional = true python-versions = ">=3.6.0" files = [ @@ -8377,7 +8303,6 @@ transformers = ">=4.6.0,<5.0.0" name = "sentencepiece" version = "0.1.99" description = "SentencePiece python wrapper" -category = "main" optional = true python-versions = "*" files = [ @@ -8432,7 +8357,6 @@ files = [ name = "setuptools" version = "67.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -8449,7 +8373,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "sgmllib3k" version = "1.0.0" description = "Py3k port of sgmllib." -category = "main" optional = true python-versions = "*" files = [ @@ -8460,7 +8383,6 @@ files = [ name = "shapely" version = "2.0.1" description = "Manipulation and analysis of geometric objects" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -8508,14 +8430,13 @@ files = [ numpy = ">=1.14" [package.extras] -docs = ["matplotlib", "numpydoc (>=1.1.0,<1.2.0)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] test = ["pytest", "pytest-cov"] [[package]] name = "singlestoredb" version = "0.7.1" description = "Interface to the SingleStore database and cluster management APIs" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -8548,7 +8469,6 @@ sqlalchemy = ["sqlalchemy-singlestoredb"] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -8560,7 +8480,6 @@ files = [ name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -8572,7 +8491,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -8584,7 +8502,6 @@ files = [ name = "socksio" version = "1.0.0" description = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -8596,7 +8513,6 @@ files = [ name = "soundfile" version = "0.12.1" description = "An audio library based on libsndfile, CFFI and NumPy" -category = "main" optional = true python-versions = "*" files = [ @@ -8620,7 +8536,6 @@ numpy = ["numpy"] name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -8630,40 +8545,36 @@ files = [ [[package]] name = "soxr" -version = "0.3.5" +version = "0.3.6" description = "High quality, one-dimensional sample-rate conversion library" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "soxr-0.3.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21c3aa3b2e12351b4310eea9d56cf52ec0769e6832f911ee6ba32f85b7c92baa"}, - {file = "soxr-0.3.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac3d7abc96082ff18a31fb1d678ddc0562f0c5e6d91f1cf0024b044989f63e93"}, - {file = "soxr-0.3.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:145e1e9d1b873a59ce0b5aa463ccacc40cf4bb74d9d8e6cef23433c752bfecea"}, - {file = "soxr-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a376b3678801ffc1d0b9ae918b958be29d5884ca1b4bbeab32e29c567723bb3"}, - {file = "soxr-0.3.5-cp310-cp310-win32.whl", hash = "sha256:907e2eb176bdefec40cc8f6015b7cef7f3d525a34219b3580b603ee696cb25c6"}, - {file = "soxr-0.3.5-cp310-cp310-win_amd64.whl", hash = "sha256:0a6dbf9c7b7a3642916aba264c1d0b872b2e173be56204ed1895dbe381a32077"}, - {file = "soxr-0.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:22c08a41e8eee99241fc0e9afb510f9bc7ada4a149d469b8891b596281a27db3"}, - {file = "soxr-0.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdacbe4ce4a1001043f1f8f0744480e294f5c5106e7861fd7033a83a869ba371"}, - {file = "soxr-0.3.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b9acd5c42159eac4a90807524d9aa450d6ea0c750df94455c151165896d922e"}, - {file = "soxr-0.3.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44b5d30f4e0d98b6d0034c00b04d5571ad070ce5cf3772f93193095b01b373de"}, - {file = "soxr-0.3.5-cp311-cp311-win32.whl", hash = "sha256:677d5f44e85fdf0fdef33cd0e6087470732dd2e08fa73286c3659814110d1183"}, - {file = "soxr-0.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a479984dd17bf0b50fb9fd659eba54a2dc59bf6eba9c29bb3a4a79ecec7dc9a4"}, - {file = "soxr-0.3.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a2eb4f273ca14d7cfa882b234a03497d0e5dfd6f769a488a0962fe500450838c"}, - {file = "soxr-0.3.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a254c5e1adddb1204d8f327158b6c11a854908a10b5782103f38a67156108334"}, - {file = "soxr-0.3.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5766727dfee4d3616edd2a866a9a0d2f272c01545bed165c5a2676fbfd278723"}, - {file = "soxr-0.3.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2578664c6f94329685d864cdcae59794121bcbd808441572b2ffd01e7adc45dd"}, - {file = "soxr-0.3.5-cp38-cp38-win32.whl", hash = "sha256:8a6f03804f48d986610eab8ca2b52e50b495f40ec13507741cd95f00ef7c2cb6"}, - {file = "soxr-0.3.5-cp38-cp38-win_amd64.whl", hash = "sha256:592e9393e433501769a7e36b10460f4578c8e4ec3cddeec1aaaea4688e3558ef"}, - {file = "soxr-0.3.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:93adbf04f51c7a5113059395633c2647f73bf195fa820256e1dd4da78af59275"}, - {file = "soxr-0.3.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37c4ec7ce275f284b0bf9741e5e6844a211ba1a850b2bf1c6a47769cdd3d109e"}, - {file = "soxr-0.3.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18d5f3151fe4a88dfc37447bc6c397072aedcf36aeffb325cc817350ac5ad78e"}, - {file = "soxr-0.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:549a8358ba3b99a75588453c96aaa802e0c84d40957bdbe1f820f14f83a052ca"}, - {file = "soxr-0.3.5-cp39-cp39-win32.whl", hash = "sha256:799df1875803dc9c4a4d3a7c285b8c1cb34b40dc39dba7ac7bac85d072f936a5"}, - {file = "soxr-0.3.5-cp39-cp39-win_amd64.whl", hash = "sha256:4dd3f61929eb304c109f1f3b6cc8243e3a1a46d636d5bd86b5a7f50609ecd7d6"}, - {file = "soxr-0.3.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:028af32bd4ce4b4c8183bb36da99e23ae954a114034d74538b4cae1bf40a0555"}, - {file = "soxr-0.3.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1299e2aae4d659e222bcbbaca69a51ee99571486070ed49a393725ea6010a8e9"}, - {file = "soxr-0.3.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:162f4e8b9a014c6819b4db6def2d43f7f4d97432ae33f2edfc8e5d0c97cf1cb3"}, - {file = "soxr-0.3.5.tar.gz", hash = "sha256:b6b60f6381c98249a2f2a594e9234b647b78856c76c060597d53ed27b6efd249"}, + {file = "soxr-0.3.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f64bc45a30ee6d9765cc4b1fdb6b9d5ec7d2880fc42a2e968c662ed3abe83c7"}, + {file = "soxr-0.3.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8fe418fcee2173422b5c25ca4d9e03a86dd9d08f1502b0077987e2018ac943df"}, + {file = "soxr-0.3.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9074ee0901057353455febc5fe91a83dae1f97ade4e96acc8b95bd3d70cb495"}, + {file = "soxr-0.3.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0b01688e7e591411a3499a62427a87236be31c84d6a88afd381947568f445df"}, + {file = "soxr-0.3.6-cp310-cp310-win_amd64.whl", hash = "sha256:03834c82977dc8976a183e22dfc9dd0f65198f416ac79f6bb13310e63c795662"}, + {file = "soxr-0.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:97a89e3798f22bd04c475b30c041ee2f2e223effb4f80a71d4f5e278f7939138"}, + {file = "soxr-0.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:705af37f7a63d3abecf9121bff392241636b403bcf6e232fb527d0b108aa8700"}, + {file = "soxr-0.3.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e73f8b9fb5ac3ad26155a6c789284bea1de98701c184e0ecb9cb328e9f81dfc2"}, + {file = "soxr-0.3.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1add0aeed67f2396d7b4cefa36887ba8db1a185791f085c12aafa82e96d6fdf"}, + {file = "soxr-0.3.6-cp311-cp311-win_amd64.whl", hash = "sha256:ba651652a64623a61ea86717357dcbf4d71f7f3695da979056ca257890f47d10"}, + {file = "soxr-0.3.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c17f5efa78575afdbb854afbead11be5b209340e0ba801073ea4af31eeb567e7"}, + {file = "soxr-0.3.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:475f86acd92e97275b86940afabf0f108252b6a684fc724cef8019308d234162"}, + {file = "soxr-0.3.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f5d31d750886651137664cf55283e96a6f324d914d137f758d339d08a18347d"}, + {file = "soxr-0.3.6-cp37-cp37m-win_amd64.whl", hash = "sha256:15277be23858ae9e1eeaec8151bbcd41ebf70c35ea067bb5e897f6834804256c"}, + {file = "soxr-0.3.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac7da6054eff748f414cfaa8172249c492da7e88dde6aa97bfb2272d87727060"}, + {file = "soxr-0.3.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd1874aa176b5ae755f26c5bd7d9d45217839719a4343862d2fe72e50c57dd16"}, + {file = "soxr-0.3.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c40a25ae9520d7752e7ece07c3ec2bc58f30893c20a58c9d7a5311e7499290"}, + {file = "soxr-0.3.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ad635ee478635efca9457b811bba373272319b45a1941d7f9d9ac8c2e98b3bc"}, + {file = "soxr-0.3.6-cp38-cp38-win_amd64.whl", hash = "sha256:dcf107a32d971e329b330a8f2026fedb118e39f5d549f65743184f8ec5d38204"}, + {file = "soxr-0.3.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:385a37d39813e1d633229bcd94ab6bd76b27b779d38f2f6cbc390926f3965d31"}, + {file = "soxr-0.3.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a78c61bf65b2e9d5612cbcab449a4a070ea84a18ff0757a840e0fa49b574225"}, + {file = "soxr-0.3.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79872546786c3d05ff90260197863811532823fcfb58aeb647e916c6aa57299d"}, + {file = "soxr-0.3.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c72ab44bfd72ecadb0a29e38487c241eb69a9867d3476e528c64e957fc06ff7"}, + {file = "soxr-0.3.6-cp39-cp39-win_amd64.whl", hash = "sha256:2b2dd2e2625b4b98360cd1607d72e4bd2eac60de3a18244b8a4d45f9168a4541"}, + {file = "soxr-0.3.6.tar.gz", hash = "sha256:6b3d98da77353b5bbb4401cef83cec7f1538844dc27c7badf89c2855b43f42b4"}, ] [package.dependencies] @@ -8675,61 +8586,60 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.16" +version = "2.0.20" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7641f6ed2682de84d77c4894cf2e43700f3cf7a729361d7f9cac98febf3d8614"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d3cbdb2f07fb0e4b897dc1df39166735e194fb946f28f26f4c9f9801c8b24f7"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08a791c75d6154d46914d1e23bd81d9455f2950ec1de81f2723848c593d2c8b"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91eb8f89fcce8f709f8a4d65d265bc48a80264ee14c7c9e955f3222f19b4b39c"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc1dae11bd5167f9eb53b3ccad24a79813004612141e76de21cf4c028dc30b34"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b2801f85c5c0293aa710f8aa5262c707a83c1c203962ae5a22b4d9095e71aa9d"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-win32.whl", hash = "sha256:c5e333b81fe10d14efebd4e9429b7bb865ed9463ca8bef07a7136dfa1fd4a37b"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-win_amd64.whl", hash = "sha256:f387b496a4c9474d8580195bb2660264a3f295a04d3a9d00f4fa15e9e597427e"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7be04dbe3470fe8dd332fdb48c979887c381ef6c635eddf2dec43d2766111be4"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2938edc512dd1fa48653e14c1655ab46144d4450f0e6b33da7acd8ba77fbfd7"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a2856e12cf5f54301ddf043bcbf0552561d61555e1bcf348b63f42b8e1eec2"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d320fde566b864adbc19abb40ecb80f4e25d6f084639969bb972d5cca16858"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e85e315725807c127ad8ba3d628fdb861cf9ebfb0e10c39a97c01e257cdd71b"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63ea36c08792a7a8a08958bc806ecff6b491386feeaf14607c3d9d2d9325e67f"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-win32.whl", hash = "sha256:bdaf89dd82f4a0e1b8b5ffc9cdc0c9551be6175f7eee5af6a838e92ba2e57100"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-win_amd64.whl", hash = "sha256:5a934eff1a2882137be3384826f997db8441d43b61fda3094923e69fffe474be"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbcc51fdbc89fafe4f4fe66f59372a8be88ded04de34ef438ab04f980beb12d4"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff6496ad5e9dc8baeb93a151cc2f599d01e5f8928a2aaf0b09a06428fdbaf553"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6ef848e5afcd1bda3e9a843751f845c0ca888b61e669237680e913d84ec206"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3ef876615ff4b53e2033022195830ec4941a6e21068611f8d77de60203b90a98"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8544c6e62eacb77d5106e2055ef10f2407fc0dbd547e879f8745b2032eefd2bc"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-win32.whl", hash = "sha256:2f3b6c31b915159b96b68372212fa77f69230b0a32acab40cf539d2823954f5a"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-win_amd64.whl", hash = "sha256:d0c96592f54edd571e00ba6b1ed5df8263328ca1da9e78088c0ebc93c2e6562c"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a2e9f50a906d0b81292576a9fb458f8cace904c81a67088f4a2ca9ff2856f55d"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc97238fa44be86971270943a0c21c19ce18b8d1596919048e57912e8abc02cc"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0db6734cb5644c55d0262a813b764c6e2cda1e66e939a488b3d6298cdc7344c2"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:131f0c894c6572cb1bdcf97c92d999d3128c4ff1ca13061296057072f61afe13"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f662cf69484c59f8a3435902c40dfc34d86050bdb15e23d437074ce9f153306b"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b72f4e4def50414164a1d899f2ce4e782a029fad0ed5585981d1611e8ae29a74"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-win32.whl", hash = "sha256:0e4645b260cfe375a0603aa117f0a47680864cf37833129da870919e88b08d8f"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-win_amd64.whl", hash = "sha256:f409f35a0330ab0cb18ece736b86d8b8233c64f4461fcb10993f67afc0ac7e5a"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e19546924f0cf2ec930d1faf318b7365e5827276410a513340f31a2b423e96a4"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce1fc3f64fd42d5f763d6b83651471f32920338a1ba107a3186211474861af57"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e2569dac4e3cb85365b91ab569d06a221e0e17e65ce59949d00c3958946282b"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f2035dea56ff1a429077e481496f813378beb02b823d2e3e7eb05bc1a7a8ca"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:81d867c1be5abd49f7e547c108391f371a9d980ba7ec34666c50d683f782b754"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2de1477af7f48c633b8ecb88245aedd811dca88e88aee9e9d787b388abe74c44"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-win32.whl", hash = "sha256:5e8522b49e0e640287308b68f71cc338446bbe1c226c8f81743baa91b0246e92"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-win_amd64.whl", hash = "sha256:43e69c8c1cea0188b7094e22fb93ae1a1890aac748628b7e925024a206f75368"}, - {file = "SQLAlchemy-2.0.16-py3-none-any.whl", hash = "sha256:53081c6fce0d49bb36d05f12dc87e008c9b0df58a163b792c5fc4ac638925f98"}, - {file = "SQLAlchemy-2.0.16.tar.gz", hash = "sha256:1e2caba78e7d1f5003e88817b7a1754d4e58f4a8f956dc423bf8e304c568ab09"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759b51346aa388c2e606ee206c0bc6f15a5299f6174d1e10cadbe4530d3c7a98"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1506e988ebeaaf316f183da601f24eedd7452e163010ea63dbe52dc91c7fc70e"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5768c268df78bacbde166b48be788b83dddaa2a5974b8810af422ddfe68a9bc8"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3f0dd6d15b6dc8b28a838a5c48ced7455c3e1fb47b89da9c79cc2090b072a50"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:243d0fb261f80a26774829bc2cee71df3222587ac789b7eaf6555c5b15651eed"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6d77c31e1bf4268b4d61b549c341cbff9842f8e115ba6904249c20cb78a61"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win32.whl", hash = "sha256:bcb04441f370cbe6e37c2b8d79e4af9e4789f626c595899d94abebe8b38f9a4d"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win_amd64.whl", hash = "sha256:d32b5ffef6c5bcb452723a496bad2d4c52b346240c59b3e6dba279f6dcc06c14"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd81466bdbc82b060c3c110b2937ab65ace41dfa7b18681fdfad2f37f27acdd7"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fe7d61dc71119e21ddb0094ee994418c12f68c61b3d263ebaae50ea8399c4d4"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e571af672e1bb710b3cc1a9794b55bce1eae5aed41a608c0401885e3491179"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3364b7066b3c7f4437dd345d47271f1251e0cfb0aba67e785343cdbdb0fff08c"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1be86ccea0c965a1e8cd6ccf6884b924c319fcc85765f16c69f1ae7148eba64b"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1d35d49a972649b5080557c603110620a86aa11db350d7a7cb0f0a3f611948a0"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win32.whl", hash = "sha256:27d554ef5d12501898d88d255c54eef8414576f34672e02fe96d75908993cf53"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win_amd64.whl", hash = "sha256:411e7f140200c02c4b953b3dbd08351c9f9818d2bd591b56d0fa0716bd014f1e"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c6aceebbc47db04f2d779db03afeaa2c73ea3f8dcd3987eb9efdb987ffa09a3"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d3f175410a6db0ad96b10bfbb0a5530ecd4fcf1e2b5d83d968dd64791f810ed"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8186be85da6587456c9ddc7bf480ebad1a0e6dcbad3967c4821233a4d4df57"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3d99ba99007dab8233f635c32b5cd24fb1df8d64e17bc7df136cedbea427897"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:76fdfc0f6f5341987474ff48e7a66c3cd2b8a71ddda01fa82fedb180b961630a"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win32.whl", hash = "sha256:d3793dcf5bc4d74ae1e9db15121250c2da476e1af8e45a1d9a52b1513a393459"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win_amd64.whl", hash = "sha256:79fde625a0a55220d3624e64101ed68a059c1c1f126c74f08a42097a72ff66a9"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:599ccd23a7146e126be1c7632d1d47847fa9f333104d03325c4e15440fc7d927"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a58052b5a93425f656675673ef1f7e005a3b72e3f2c91b8acca1b27ccadf5f4"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79543f945be7a5ada9943d555cf9b1531cfea49241809dd1183701f94a748624"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63e73da7fb030ae0a46a9ffbeef7e892f5def4baf8064786d040d45c1d6d1dc5"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ce5e81b800a8afc870bb8e0a275d81957e16f8c4b62415a7b386f29a0cb9763"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb0d3e94c2a84215532d9bcf10229476ffd3b08f481c53754113b794afb62d14"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win32.whl", hash = "sha256:8dd77fd6648b677d7742d2c3cc105a66e2681cc5e5fb247b88c7a7b78351cf74"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win_amd64.whl", hash = "sha256:6f8a934f9dfdf762c844e5164046a9cea25fabbc9ec865c023fe7f300f11ca4a"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:26a3399eaf65e9ab2690c07bd5cf898b639e76903e0abad096cd609233ce5208"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4cde2e1096cbb3e62002efdb7050113aa5f01718035ba9f29f9d89c3758e7e4e"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b09ba72e4e6d341bb5bdd3564f1cea6095d4c3632e45dc69375a1dbe4e26ec"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b74eeafaa11372627ce94e4dc88a6751b2b4d263015b3523e2b1e57291102f0"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:77d37c1b4e64c926fa3de23e8244b964aab92963d0f74d98cbc0783a9e04f501"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eefebcc5c555803065128401a1e224a64607259b5eb907021bf9b175f315d2a6"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win32.whl", hash = "sha256:3423dc2a3b94125094897118b52bdf4d37daf142cbcf26d48af284b763ab90e9"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win_amd64.whl", hash = "sha256:5ed61e3463021763b853628aef8bc5d469fe12d95f82c74ef605049d810f3267"}, + {file = "SQLAlchemy-2.0.20-py3-none-any.whl", hash = "sha256:63a368231c53c93e2b67d0c5556a9836fdcd383f7e3026a39602aad775b14acf"}, + {file = "SQLAlchemy-2.0.20.tar.gz", hash = "sha256:ca8a5ff2aa7f3ade6c498aaafce25b1eaeabe4e42b73e25519183e4566a16fc6"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} typing-extensions = ">=4.2.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] @@ -8756,7 +8666,6 @@ sqlcipher = ["sqlcipher3-binary"] name = "sqlitedict" version = "2.1.0" description = "Persistent dict in Python, backed up by sqlite3 and pickle, multithread-safe." -category = "main" optional = true python-versions = "*" files = [ @@ -8767,7 +8676,6 @@ files = [ name = "sqlparams" version = "5.1.0" description = "Convert between various DB API 2.0 parameter styles." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -8779,7 +8687,6 @@ files = [ name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -8799,7 +8706,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "streamlit" version = "1.22.0" description = "A faster way to build and share data apps" -category = "main" optional = true python-versions = ">=3.7, !=3.9.7" files = [ @@ -8840,7 +8746,6 @@ snowflake = ["snowflake-snowpark-python"] name = "stringcase" version = "1.2.0" description = "String case converter." -category = "main" optional = true python-versions = "*" files = [ @@ -8851,7 +8756,6 @@ files = [ name = "sympy" version = "1.12" description = "Computer algebra system (CAS) in Python" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -8864,14 +8768,13 @@ mpmath = ">=0.19" [[package]] name = "syrupy" -version = "4.0.2" +version = "4.2.1" description = "Pytest Snapshot Test Utility" -category = "dev" optional = false python-versions = ">=3.8.1,<4" files = [ - {file = "syrupy-4.0.2-py3-none-any.whl", hash = "sha256:dfd1f0fad298eee753de4f2471d4346412c4435885c4b7beea648d4934c6620a"}, - {file = "syrupy-4.0.2.tar.gz", hash = "sha256:3c75ab6866580679b2cb9abe78e74c3e2011fffc6333651c6beb2a78a716ab80"}, + {file = "syrupy-4.2.1-py3-none-any.whl", hash = "sha256:4054878270184979a20e78b17a19f5f19eb62c6cbdc3adac6f432a528ddeb099"}, + {file = "syrupy-4.2.1.tar.gz", hash = "sha256:8c2f4e0c4416780f21f3cd696c64b046d79ddff43522d6a9a4ad7a4f48e9a594"}, ] [package.dependencies] @@ -8880,14 +8783,12 @@ pytest = ">=7.0.0,<8.0.0" [[package]] name = "telethon" -version = "1.28.5" +version = "1.29.3" description = "Full-featured Telegram client library for Python 3" -category = "main" optional = true python-versions = ">=3.5" files = [ - {file = "Telethon-1.28.5-py3-none-any.whl", hash = "sha256:edc42fd58b8e1569830d3ead564cafa60fd51d684f03ee2a1fdd5f77a5a10438"}, - {file = "Telethon-1.28.5.tar.gz", hash = "sha256:b3990ec22351a3f3e1af376729c985025bbdd3bdabdde8c156112c3d3dfe1941"}, + {file = "Telethon-1.29.3.tar.gz", hash = "sha256:cac3091ab61bdd2286bdfb72fb3ab7cc86a9e8d3327ff8fec56d215e05009e1e"}, ] [package.dependencies] @@ -8899,14 +8800,13 @@ cryptg = ["cryptg"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -8914,230 +8814,209 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tensorboard" -version = "2.11.2" +version = "2.13.0" description = "TensorBoard lets you watch Tensors Flow" -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tensorboard-2.11.2-py3-none-any.whl", hash = "sha256:cbaa2210c375f3af1509f8571360a19ccc3ded1d9641533414874b5deca47e89"}, + {file = "tensorboard-2.13.0-py3-none-any.whl", hash = "sha256:ab69961ebddbddc83f5fa2ff9233572bdad5b883778c35e4fe94bf1798bd8481"}, ] [package.dependencies] absl-py = ">=0.4" google-auth = ">=1.6.3,<3" -google-auth-oauthlib = ">=0.4.1,<0.5" -grpcio = ">=1.24.3" +google-auth-oauthlib = ">=0.5,<1.1" +grpcio = ">=1.48.2" markdown = ">=2.6.8" numpy = ">=1.12.0" -protobuf = ">=3.9.2,<4" +protobuf = ">=3.19.6" requests = ">=2.21.0,<3" setuptools = ">=41.0.0" -tensorboard-data-server = ">=0.6.0,<0.7.0" -tensorboard-plugin-wit = ">=1.6.0" +tensorboard-data-server = ">=0.7.0,<0.8.0" werkzeug = ">=1.0.1" wheel = ">=0.26" [[package]] name = "tensorboard-data-server" -version = "0.6.1" +version = "0.7.1" description = "Fast data loading for TensorBoard" -category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tensorboard_data_server-0.6.1-py3-none-any.whl", hash = "sha256:809fe9887682d35c1f7d1f54f0f40f98bb1f771b14265b453ca051e2ce58fca7"}, - {file = "tensorboard_data_server-0.6.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:fa8cef9be4fcae2f2363c88176638baf2da19c5ec90addb49b1cde05c95c88ee"}, - {file = "tensorboard_data_server-0.6.1-py3-none-manylinux2010_x86_64.whl", hash = "sha256:d8237580755e58eff68d1f3abefb5b1e39ae5c8b127cc40920f9c4fb33f4b98a"}, -] - -[[package]] -name = "tensorboard-plugin-wit" -version = "1.8.1" -description = "What-If Tool TensorBoard plugin." -category = "main" -optional = true -python-versions = "*" -files = [ - {file = "tensorboard_plugin_wit-1.8.1-py3-none-any.whl", hash = "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe"}, + {file = "tensorboard_data_server-0.7.1-py3-none-any.whl", hash = "sha256:9938bd39f5041797b33921066fba0eab03a0dd10d1887a05e62ae58841ad4c3f"}, + {file = "tensorboard_data_server-0.7.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:be8d016a1aa394e6198280d4a3dc37898f56467310c5f5e617cac10a783e055a"}, + {file = "tensorboard_data_server-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:255c02b7f5b03dd5c0a88c928e563441ff39e1d4b4a234cdbe09f016e53d9594"}, ] [[package]] name = "tensorflow" -version = "2.11.1" +version = "2.13.0" description = "TensorFlow is an open source machine learning framework for everyone." -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tensorflow-2.11.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:ac0e46c5de7985def49e4f688a0ca4180949a4d5dc62b89e9c6640db3c3982ba"}, - {file = "tensorflow-2.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b1669c523fa6dc240688bffe79f08dfbb76bf5e23a7fe10e722ba658637a44"}, - {file = "tensorflow-2.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a96595e0c068d54717405fa12f36b4a5bb0a9fc53fb9065155a92cff944b35b"}, - {file = "tensorflow-2.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:13197f18f31a52d3f2eac28743d1b06abb8efd86017f184110a1b16841b745b1"}, - {file = "tensorflow-2.11.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9f030f1bc9e7763fa03ec5738323c42021ababcd562fe861b3a3f41e9ff10e43"}, - {file = "tensorflow-2.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f12855c1e8373c1327650061fd6a9a3d3772e1bac8241202ea8ccb56213d005"}, - {file = "tensorflow-2.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cd4279cb500074a8ab28af116af7f060f0b015651bef552769d51e55d6fd5c"}, - {file = "tensorflow-2.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:f5a2f75f28cd5fb615a5306f2091eac7da3a8fff949ab8804ec06b8e3682f837"}, - {file = "tensorflow-2.11.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ea93246ad6c90ff0422f06a82164836fe8098989a8a65c3b02c720eadbe15dde"}, - {file = "tensorflow-2.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ba6b3c2f68037e965a19427a1f2a5f0351b7ceae6c686938a8485b08e1e1f3"}, - {file = "tensorflow-2.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ddd5c61f68d8125c985370de96a24a80aee5e3f1604efacec7e1c34ca72de24"}, - {file = "tensorflow-2.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d8834df3f72d7eab56bc2f34f2e52b82d705776b80b36bf5470b7538c9865c"}, + {file = "tensorflow-2.13.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:89125443e998548059c4e4a129dfab2b1ff7f2fd4c8eaed97842c3cd9b663101"}, + {file = "tensorflow-2.13.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5e0fdadec59de3d11c5b5129ddc38e739bde7aa13095b82e19d4380e14d04999"}, + {file = "tensorflow-2.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ad6a7ff49b4a690fbf37a5adaf28ba2686350a859c5f13c58dc8d2cc670375"}, + {file = "tensorflow-2.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f0b69ee2f800399fc6bc7ec55fecfa33662d136e425485959d90638f32a32a"}, + {file = "tensorflow-2.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb2ff1129c93e853c19897d6a22ed0ec56387f5c6290ec03dec1c6f7b80bc396"}, + {file = "tensorflow-2.13.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:6fff426661d286a4c634da44275d2ea2b951f392f3e65c8603681e7cb040586a"}, + {file = "tensorflow-2.13.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:076d953a1508dc58bf95f30f58bcc9ee364b1353c61e143cb20c2dada91afb05"}, + {file = "tensorflow-2.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2978b39e8b3919059b5fd9e28508d50a77965d06ed0b537ed71c97de22dabdf"}, + {file = "tensorflow-2.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ee67901702b26787ad685cca65730c163c101c0c2f238a2584d714e0fa8c25"}, + {file = "tensorflow-2.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:00060c5516a61e30c51936084ebc37091d116efe9ae74b2818cbd8b2006218e7"}, + {file = "tensorflow-2.13.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:948003b5a23b72b3d89746d729e62ec5f01e47460f05521b2211d95069f569ba"}, + {file = "tensorflow-2.13.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:06559eeaa69e6561cccbe2d02b015bcec663e875c8bbc4643f55692476e52147"}, + {file = "tensorflow-2.13.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbb83561bb7d55859eaefc70c674e58713d4e10c10927423ed836a5289bbfa86"}, + {file = "tensorflow-2.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2822ac48c38d69b7fb104e606dacbd763c4bf5d3b20791f25be16a5076d01912"}, + {file = "tensorflow-2.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:9c04bc3023b6c4cfb9ee9759c3f03f21993891b4c345df52eb5519204fbf28c0"}, + {file = "tensorflow-2.13.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:7a08c0e2938ed5b642a8787678123827477b81d316055d5073fff82fa183eb82"}, + {file = "tensorflow-2.13.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e0cf94d36ceaba8f158c6e15404a81fd5b3aa4cb04147c674cf55bd1aec78154"}, + {file = "tensorflow-2.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de77306c0c22c9d8754f54700752ac3a1efee895c5357308e6594436404bfbc0"}, + {file = "tensorflow-2.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72d68b8c2f382e2d01b956c8ba516c0a7d5dad98111dd351bf82bfa646aa1c72"}, + {file = "tensorflow-2.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:fa7abe265cc3ebccc9b405a280bf674824c6d85df5e6ccfa985987b3c9d265b4"}, ] [package.dependencies] absl-py = ">=1.0.0" astunparse = ">=1.6.0" -flatbuffers = ">=2.0" +flatbuffers = ">=23.1.21" gast = ">=0.2.1,<=0.4.0" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.11.0,<2.12" +keras = ">=2.13.1,<2.14" libclang = ">=13.0.0" -numpy = ">=1.20" +numpy = ">=1.22,<=1.24.3" opt-einsum = ">=2.3.2" packaging = "*" -protobuf = ">=3.9.2,<3.20" +protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.11,<2.12" -tensorflow-estimator = ">=2.11.0,<2.12" +tensorboard = ">=2.13,<2.14" +tensorflow-estimator = ">=2.13.0,<2.14" tensorflow-io-gcs-filesystem = {version = ">=0.23.1", markers = "platform_machine != \"arm64\" or platform_system != \"Darwin\""} termcolor = ">=1.1.0" -typing-extensions = ">=3.6.6" +typing-extensions = ">=3.6.6,<4.6.0" wrapt = ">=1.11.0" [[package]] name = "tensorflow-estimator" -version = "2.11.0" +version = "2.13.0" description = "TensorFlow Estimator." -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "tensorflow_estimator-2.11.0-py2.py3-none-any.whl", hash = "sha256:ea3b64acfff3d9a244f06178c9bdedcbdd3f125b67d0888dba8229498d06468b"}, + {file = "tensorflow_estimator-2.13.0-py2.py3-none-any.whl", hash = "sha256:6f868284eaa654ae3aa7cacdbef2175d0909df9fcf11374f5166f8bf475952aa"}, ] [[package]] name = "tensorflow-hub" -version = "0.13.0" +version = "0.14.0" description = "TensorFlow Hub is a library to foster the publication, discovery, and consumption of reusable parts of machine learning models." -category = "main" optional = true python-versions = "*" files = [ - {file = "tensorflow_hub-0.13.0-py2.py3-none-any.whl", hash = "sha256:3544f4fd9fd99e4eeb6da1b5b5320e4a2dbdef7f9bb778f66f76d6790f32dd65"}, + {file = "tensorflow_hub-0.14.0-py2.py3-none-any.whl", hash = "sha256:519c6b56c4d304667fbd8ce66bd637e6a750c901215468db2cc6bfd0739bb0b0"}, ] [package.dependencies] numpy = ">=1.12.0" protobuf = ">=3.19.6" -[package.extras] -make-image-classifier = ["keras-preprocessing[image]"] -make-nearest-neighbour-index = ["annoy", "apache-beam"] - [[package]] name = "tensorflow-io-gcs-filesystem" -version = "0.32.0" +version = "0.33.0" description = "TensorFlow IO" -category = "main" optional = true python-versions = ">=3.7, <3.12" files = [ - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:74a7e25e83d4117a7ebb09a3f247553a5497393ab48c3ee0cf0d17b405026817"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:045d51bba586390d0545fcd8a18727d62b175eb142f6f4c6d719d39de40774cd"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db682e9a510c27dd35710ba5a2c62c371e25b727741b2fe3a920355fa501e947"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:7f15fd22e592661b10de317be2f42a0f84be7bfc5e6a565fcfcb04b60d625b78"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:336d9b3fe6b55aea149c4f6aa1fd6ffaf27d4e5c37e55a182340b47caba38846"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842f5f09cd756bdb3b4d0b5571b3a6f72fd534d42da938b9acf0ef462995eada"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:1ce80e1555d6ee88dda67feddf366cc8b30252b5837a7a17303df7b06a71fc2e"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05e65d3cb6c93a7929b384d86c6369c63cbbab8a770440a3d95e094878403f9f"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:21de7dcc06eb1e7de3c022b0072d90ba35ef886578149663437aa7a6fb5bf6b3"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:79fdd02103b8ae9f8b89af41f744c013fa1caaea709de19833917795e3063857"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5635df0bbe40f971dc1b946e3372744b0bdfda45c38ffcd28ef53a32bb8da4da"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:122be149e5f6a030f5c2901be0cc3cb07619232f7b03889e2cdf3da1c0d4f92f"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8214cdf85bea694160f9035ff395221c1e25e119784ccb4c104919b1f5dec84e"}, - {file = "tensorflow_io_gcs_filesystem-0.32.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28202492d904a6e280cf27560791e87ac1c7566000db82065d63a70c27008af2"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:2dd49262831ee20f03fd3f5d2c679e7111cd1575e0ad60f60b5632f2da555bfc"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e1d833f6856aec465652c0d7a75a7c28cf83b132b8351ba0c4df4e05136c403"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8295a65fd4fa731b06b31fab223e3ba11369430537169934a17f7bcc07dfef76"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:58f953665620725c842de8f4074c14779bf11d9081e4d0d8f2b75145de9ee20a"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac69d8ba4d27435a5e199248b3a3befc19e65d86a97a52a19ee1f43195f51207"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c793e313e9cfed6caa328ec1a162844006a4bc016ba1d116813d7541938a9"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:99c063f766fdb431d555f17fa185979195abb0477445f054fe16567bfd340fd7"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfa1df21535f7c945041fda99da2940a56b67d86e20aa2ac8cde3d371bc08659"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8d3ddd86a0f7cf4d35f2401d5b28d574d0f296b4e4349c69c671f7b83fc6ce8f"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4657f92dcc2474adc773bf69b836818b416c22cfadaac05b9b64f2a53f3009ee"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcf4fc3a44f75b7dccb7b40ca709872bf7f0e812522f82aa7881ecdc0d86af48"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:68db367697353184667bbd94faf53a58e7b695acb905f23da1e8ccad8bd6b451"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a57e64cd5d22085f9b475df9d12086a894eb8861524970c8839a2ec315841a20"}, + {file = "tensorflow_io_gcs_filesystem-0.33.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7916ca0accdd259c3fbee1b1f0816d61d6e8a639aa5bc1d4cdfbaf63b344623"}, ] [package.extras] -tensorflow = ["tensorflow (>=2.12.0,<2.13.0)"] -tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.12.0,<2.13.0)"] -tensorflow-cpu = ["tensorflow-cpu (>=2.12.0,<2.13.0)"] -tensorflow-gpu = ["tensorflow-gpu (>=2.12.0,<2.13.0)"] -tensorflow-rocm = ["tensorflow-rocm (>=2.12.0,<2.13.0)"] +tensorflow = ["tensorflow (>=2.13.0,<2.14.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.13.0,<2.14.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.13.0,<2.14.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.13.0,<2.14.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.13.0,<2.14.0)"] [[package]] name = "tensorflow-macos" -version = "2.11.0" +version = "2.13.0" description = "TensorFlow is an open source machine learning framework for everyone." -category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tensorflow_macos-2.11.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0bdbd1bb564d01bd735d6d11451f0658c3dd8187369ee9dd3ed6de6bbdd6df53"}, - {file = "tensorflow_macos-2.11.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:66eb67915cf418eddd3b4c158132609efd50895fa09fd55e4b2f14a3ab85bd34"}, - {file = "tensorflow_macos-2.11.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:6810731e2c8353123f6c9c944d2765b58a2226e7eb9fec1e360f73977c6c6aa4"}, - {file = "tensorflow_macos-2.11.0-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:881b36d97b67d24197250a091c52c31db14aecfdbf1ac20418a148ec37321978"}, - {file = "tensorflow_macos-2.11.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8d56b0d0bd140008b0cc4877804c9c310e1e2735444fa99bc7c88ffb2909153d"}, - {file = "tensorflow_macos-2.11.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:db97cd91b905bd01069069f07325a2a291705222eb4914148b9574090a5815ae"}, + {file = "tensorflow_macos-2.13.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:331cc23682374ca5f3f92e069bd7fbb6e4d48a50278a9cd05e5b33f16d9a31e7"}, + {file = "tensorflow_macos-2.13.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5dca8291125c0151bf426a2789689e02c623ce4540432cf66a073d361d3d6870"}, + {file = "tensorflow_macos-2.13.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b0cea604f50a032dc426d7a6a91dc53a9df001cfa94fc814972e9d4cf062d31b"}, + {file = "tensorflow_macos-2.13.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:d9571357a39cc8cdecfd22e67dfdcebf840be67a88a8c7464bd3b9b3e0aad446"}, ] [package.dependencies] absl-py = ">=1.0.0" astunparse = ">=1.6.0" -flatbuffers = ">=2.0" +flatbuffers = ">=23.1.21" gast = ">=0.2.1,<=0.4.0" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.11.0,<2.12" +keras = ">=2.13.1,<2.14" libclang = ">=13.0.0" -numpy = ">=1.20" +numpy = ">=1.22,<=1.24.3" opt-einsum = ">=2.3.2" packaging = "*" -protobuf = ">=3.9.2,<3.20" +protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.11,<2.12" -tensorflow-estimator = ">=2.11.0,<2.12" +tensorboard = ">=2.13,<2.14" +tensorflow-estimator = ">=2.13.0,<2.14" termcolor = ">=1.1.0" -typing-extensions = ">=3.6.6" +typing-extensions = ">=3.6.6,<4.6.0" wrapt = ">=1.11.0" [[package]] name = "tensorflow-text" -version = "2.11.0" +version = "2.13.0" description = "TF.Text is a TensorFlow library of text related ops, modules, and subgraphs." -category = "main" optional = true python-versions = "*" files = [ - {file = "tensorflow_text-2.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9d4797e331da37419f2b19159fbc0f125ed60467340e9a209ab8f8d65856704"}, - {file = "tensorflow_text-2.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4abede4191820ae6d5a7c74f02c335a5f2e2df174eaa38b481b2b82a3330152"}, - {file = "tensorflow_text-2.11.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:49194f85e03a2e3f017ac8e0e3d3927104fa20e6e883b43087cff032fe2cbe14"}, - {file = "tensorflow_text-2.11.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3ea14efeb1d627ed5098e791e95bb98ee6f9f928f9eda785205e184cc20b428"}, - {file = "tensorflow_text-2.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a207ceea4c71a932c35e4d208d7b8c3edc65a5ba0eebfdc9233fc8da546625c9"}, - {file = "tensorflow_text-2.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:506fbea82a1ec566d7d0f771adad589c44727d904311103169466d88236ec2c8"}, - {file = "tensorflow_text-2.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cf0033bf47872b57d46f78d7058db5676f396a9327fa4d063a2c73cce43586ae"}, - {file = "tensorflow_text-2.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56693df33461ab0e7f32549010ca38a8d01291fd67142e0396d0aeb9fcad2e09"}, + {file = "tensorflow_text-2.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef7694623a79793a1db0ac66ab834596ea40f4fe5c7fdd92e402537c9e496bf7"}, + {file = "tensorflow_text-2.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94589df89c531f4c2c61029203c45d1f299f3204b47c3a1aa8ff636e7f58dadf"}, + {file = "tensorflow_text-2.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:142b35fc7f633250db2c4810e0e60eadc015292c7dde3fff6189213056f8fd7d"}, + {file = "tensorflow_text-2.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8af4379cfe8f454d3e8ad38627153e20d852a5ba10591b47c9dbb64490ae4f16"}, + {file = "tensorflow_text-2.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d764c90ecceb9b603170a5c9b448b1cd369709c24d230913be83156ac4e3a431"}, + {file = "tensorflow_text-2.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b98316df6dd576e62a7a56bd093d1488446d84831bacd1cbb46eb339585fd381"}, ] [package.dependencies] -tensorflow = {version = ">=2.11.0,<2.12", markers = "platform_machine != \"arm64\" or platform_system != \"Darwin\""} +tensorflow = {version = ">=2.13.0,<2.14", markers = "platform_machine != \"arm64\" or platform_system != \"Darwin\""} tensorflow-hub = ">=0.8.0" -tensorflow-macos = {version = ">=2.11.0,<2.12", markers = "platform_machine == \"arm64\" and platform_system == \"Darwin\""} +tensorflow-macos = {version = ">=2.13.0,<2.14", markers = "platform_machine == \"arm64\" and platform_system == \"Darwin\""} [package.extras] -tensorflow-cpu = ["tensorflow-cpu (>=2.11.0,<2.12)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.12.0,<2.13)"] tests = ["absl-py", "pytest", "tensorflow-datasets (>=3.2.0)"] [[package]] name = "termcolor" version = "2.3.0" description = "ANSI color formatting for output in terminal" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -9152,7 +9031,6 @@ tests = ["pytest", "pytest-cov"] name = "terminado" version = "0.17.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -9173,7 +9051,6 @@ test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] name = "textstat" version = "0.7.3" description = "Calculate statistical features from text" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -9186,21 +9063,19 @@ pyphen = "*" [[package]] name = "threadpoolctl" -version = "3.1.0" +version = "3.2.0" description = "threadpoolctl" -category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, - {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, + {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, + {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, ] [[package]] name = "tigrisdb" version = "1.0.0b6" description = "Python SDK for Tigris " -category = "main" optional = true python-versions = ">=3.8,<4.0" files = [ @@ -9216,7 +9091,6 @@ protobuf = ">=3.19.6" name = "tiktoken" version = "0.3.3" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -9262,7 +9136,6 @@ blobfile = ["blobfile (>=2)"] name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -9281,7 +9154,6 @@ test = ["flake8", "isort", "pytest"] name = "tinysegmenter" version = "0.3" description = "Very compact Japanese tokenizer" -category = "main" optional = true python-versions = "*" files = [ @@ -9292,7 +9164,6 @@ files = [ name = "tldextract" version = "3.4.4" description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -9310,7 +9181,6 @@ requests-file = ">=1.4" name = "tokenizers" version = "0.13.3" description = "Fast and Customizable Tokenizers" -category = "main" optional = true python-versions = "*" files = [ @@ -9365,7 +9235,6 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -9377,7 +9246,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -9389,7 +9257,6 @@ files = [ name = "toolz" version = "0.12.0" description = "List processing tools and functional utilities" -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -9401,7 +9268,6 @@ files = [ name = "torch" version = "1.13.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -category = "main" optional = true python-versions = ">=3.7.0" files = [ @@ -9442,7 +9308,6 @@ opt-einsum = ["opt-einsum (>=3.3)"] name = "torchvision" version = "0.14.1" description = "image and video datasets and models for torch deep learning" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -9469,7 +9334,7 @@ files = [ [package.dependencies] numpy = "*" -pillow = ">=5.3.0,<8.3.0 || >=8.4.0" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" requests = "*" torch = "1.13.1" typing-extensions = "*" @@ -9479,42 +9344,40 @@ scipy = ["scipy"] [[package]] name = "tornado" -version = "6.3.2" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -9523,7 +9386,6 @@ telegram = ["requests"] name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -9537,19 +9399,18 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "transformers" -version = "4.30.2" +version = "4.32.0" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" -category = "main" optional = true -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "transformers-4.30.2-py3-none-any.whl", hash = "sha256:c332e3a3097f9ed89ce556b403251235931c00237b8bc2d7adaa19d226c13f1d"}, - {file = "transformers-4.30.2.tar.gz", hash = "sha256:f4a8aac4e1baffab4033f4a345b0d7dc7957d12a4f1ba969afea08205a513045"}, + {file = "transformers-4.32.0-py3-none-any.whl", hash = "sha256:32d8adf0ed76285508e7fd66657b4448ec1f882599ae6bf6f9c36bd7bf798402"}, + {file = "transformers-4.32.0.tar.gz", hash = "sha256:ca510f9688d2fe7347abbbfbd13f2f6dcd3c8349870c8d0ed98beed5f579b354"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.14.1,<1.0" +huggingface-hub = ">=0.15.1,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" @@ -9560,20 +9421,20 @@ tokenizers = ">=0.11.1,<0.11.3 || >0.11.3,<0.14" tqdm = ">=4.27" [package.extras] -accelerate = ["accelerate (>=0.20.2)"] -agents = ["Pillow", "accelerate (>=0.20.2)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.9,!=1.12.0)"] -all = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +accelerate = ["accelerate (>=0.20.3)"] +agents = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.9,!=1.12.0)"] +all = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.14)", "tensorflow-text (<2.14)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] -deepspeed = ["accelerate (>=0.20.2)", "deepspeed (>=0.8.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.8.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.6.9)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +deepspeed = ["accelerate (>=0.20.3)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.6,<2.14)", "tensorflow-text (<2.14)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.6,<2.14)", "tensorflow-text (<2.14)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.14)", "tensorflow-text (<2.14)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] docs-specific = ["hf-doc-builder"] fairscale = ["fairscale (>0.3)"] -flax = ["flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "optax (>=0.0.8,<=0.1.4)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune]", "sigopt"] @@ -9587,29 +9448,49 @@ quality = ["GitPython (<3.1.19)", "black (>=23.1,<24.0)", "datasets (!=2.5.0)", ray = ["ray[tune]"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] -sentencepiece = ["protobuf (<=3.20.3)", "sentencepiece (>=0.1.91,!=0.1.92)"] -serving = ["fastapi", "pydantic", "starlette", "uvicorn"] +sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic (<2)", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] -tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.14)", "tensorflow-text (<2.14)", "tf2onnx"] +tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.14)", "tensorflow-text (<2.14)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] tokenizers = ["tokenizers (>=0.11.1,!=0.11.3,<0.14)"] -torch = ["accelerate (>=0.20.2)", "torch (>=1.9,!=1.12.0)"] +torch = ["accelerate (>=0.20.3)", "torch (>=1.9,!=1.12.0)"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -torch-vision = ["Pillow", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.14.1,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.3)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] +torch-vision = ["Pillow (<10.0.0)", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.15.1,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] -vision = ["Pillow"] +vision = ["Pillow (<10.0.0)"] + +[[package]] +name = "tritonclient" +version = "2.34.0" +description = "Python client library and utilities for communicating with Triton Inference Server" +optional = true +python-versions = "*" +files = [ + {file = "tritonclient-2.34.0-py3-none-any.whl", hash = "sha256:876ff68aba141eeb047fdc1eeeebef42c47126c40cbd3f92b3800c8afe55dbcc"}, + {file = "tritonclient-2.34.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:ce5845f94f8a014f6de1ca13e07049c31b4bdffca594bbe0654a6db58eb2ce4b"}, + {file = "tritonclient-2.34.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:57fd1016bd52f9c5a4e62d01ce37e59925575a9d293d091c6a91d8ee468cd804"}, +] + +[package.dependencies] +numpy = ">=1.19.1" +python-rapidjson = ">=0.9.1" + +[package.extras] +all = ["aiohttp (>=3.8.1,<4.0.0)", "geventhttpclient (>=1.4.4,<=2.0.2)", "grpcio (>=1.41.0)", "numpy (>=1.19.1)", "packaging (>=14.1)", "protobuf (>=3.5.0,<4)", "python-rapidjson (>=0.9.1)"] +grpc = ["grpcio (>=1.41.0)", "numpy (>=1.19.1)", "packaging (>=14.1)", "protobuf (>=3.5.0,<4)", "python-rapidjson (>=0.9.1)"] +http = ["aiohttp (>=3.8.1,<4.0.0)", "geventhttpclient (>=1.4.4,<=2.0.2)", "numpy (>=1.19.1)", "python-rapidjson (>=0.9.1)"] [[package]] name = "types-chardet" version = "5.0.4.6" description = "Typing stubs for chardet" -category = "dev" optional = false python-versions = "*" files = [ @@ -9619,26 +9500,24 @@ files = [ [[package]] name = "types-protobuf" -version = "4.23.0.1" +version = "4.24.0.1" description = "Typing stubs for protobuf" -category = "dev" optional = false python-versions = "*" files = [ - {file = "types-protobuf-4.23.0.1.tar.gz", hash = "sha256:7bd5ea122a057b11a82b785d9de464932a1e9175fe977a4128adef11d7f35547"}, - {file = "types_protobuf-4.23.0.1-py3-none-any.whl", hash = "sha256:c926104f69ea62103846681b35b690d8d100ecf86c6cdda16c850a1313a272e4"}, + {file = "types-protobuf-4.24.0.1.tar.gz", hash = "sha256:90adea3b693d6a40d8ef075c58fe6b5cc6e01fe1496301a7e6fc70398dcff92e"}, + {file = "types_protobuf-4.24.0.1-py3-none-any.whl", hash = "sha256:df203a204e4ae97d4cca4c9cf725262579dd7857a19f9e7fc74871ccfa073c01"}, ] [[package]] name = "types-pyopenssl" -version = "23.2.0.0" +version = "23.2.0.2" description = "Typing stubs for pyOpenSSL" -category = "dev" optional = false python-versions = "*" files = [ - {file = "types-pyOpenSSL-23.2.0.0.tar.gz", hash = "sha256:43e307e8dfb3a7a8208a19874ca060305f460c529d4eaca8a2669ea89499f244"}, - {file = "types_pyOpenSSL-23.2.0.0-py3-none-any.whl", hash = "sha256:ba803a99440b0c2e9ab4e197084aeefc55bdfe8a580d367b2aa4210810a21240"}, + {file = "types-pyOpenSSL-23.2.0.2.tar.gz", hash = "sha256:6a010dac9ecd42b582d7dd2cc3e9e40486b79b3b64bb2fffba1474ff96af906d"}, + {file = "types_pyOpenSSL-23.2.0.2-py3-none-any.whl", hash = "sha256:19536aa3debfbe25a918cf0d898e9f5fbbe6f3594a429da7914bf331deb1b342"}, ] [package.dependencies] @@ -9646,38 +9525,35 @@ cryptography = ">=35.0.0" [[package]] name = "types-pytz" -version = "2023.3.0.0" +version = "2023.3.0.1" description = "Typing stubs for pytz" -category = "dev" optional = false python-versions = "*" files = [ - {file = "types-pytz-2023.3.0.0.tar.gz", hash = "sha256:ecdc70d543aaf3616a7e48631543a884f74205f284cefd6649ddf44c6a820aac"}, - {file = "types_pytz-2023.3.0.0-py3-none-any.whl", hash = "sha256:4fc2a7fbbc315f0b6630e0b899fd6c743705abe1094d007b0e612d10da15e0f3"}, + {file = "types-pytz-2023.3.0.1.tar.gz", hash = "sha256:1a7b8d4aac70981cfa24478a41eadfcd96a087c986d6f150d77e3ceb3c2bdfab"}, + {file = "types_pytz-2023.3.0.1-py3-none-any.whl", hash = "sha256:65152e872137926bb67a8fe6cc9cfd794365df86650c5d5fdc7b167b0f38892e"}, ] [[package]] name = "types-pyyaml" -version = "6.0.12.10" +version = "6.0.12.11" description = "Typing stubs for PyYAML" -category = "dev" optional = false python-versions = "*" files = [ - {file = "types-PyYAML-6.0.12.10.tar.gz", hash = "sha256:ebab3d0700b946553724ae6ca636ea932c1b0868701d4af121630e78d695fc97"}, - {file = "types_PyYAML-6.0.12.10-py3-none-any.whl", hash = "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f"}, + {file = "types-PyYAML-6.0.12.11.tar.gz", hash = "sha256:7d340b19ca28cddfdba438ee638cd4084bde213e501a3978738543e27094775b"}, + {file = "types_PyYAML-6.0.12.11-py3-none-any.whl", hash = "sha256:a461508f3096d1d5810ec5ab95d7eeecb651f3a15b71959999988942063bf01d"}, ] [[package]] name = "types-redis" -version = "4.5.5.2" +version = "4.6.0.5" description = "Typing stubs for redis" -category = "dev" optional = false python-versions = "*" files = [ - {file = "types-redis-4.5.5.2.tar.gz", hash = "sha256:2fe82f374d9dddf007deaf23d81fddcfd9523d9522bf11523c5c43bc5b27099e"}, - {file = "types_redis-4.5.5.2-py3-none-any.whl", hash = "sha256:bf8692252038dbe03b007ca4fde87d3ae8e10610854a6858e3bf5d01721a7c4b"}, + {file = "types-redis-4.6.0.5.tar.gz", hash = "sha256:5f179d10bd3ca995a8134aafcddfc3e12d52b208437c4529ef27e68acb301f38"}, + {file = "types_redis-4.6.0.5-py3-none-any.whl", hash = "sha256:4f662060247a2363c7a8f0b7e52915d68960870ff16a749a891eabcf87ed0be4"}, ] [package.dependencies] @@ -9686,14 +9562,13 @@ types-pyOpenSSL = "*" [[package]] name = "types-requests" -version = "2.31.0.1" +version = "2.31.0.2" description = "Typing stubs for requests" -category = "main" optional = false python-versions = "*" files = [ - {file = "types-requests-2.31.0.1.tar.gz", hash = "sha256:3de667cffa123ce698591de0ad7db034a5317457a596eb0b4944e5a9d9e8d1ac"}, - {file = "types_requests-2.31.0.1-py3-none-any.whl", hash = "sha256:afb06ef8f25ba83d59a1d424bd7a5a939082f94b94e90ab5e6116bd2559deaa3"}, + {file = "types-requests-2.31.0.2.tar.gz", hash = "sha256:6aa3f7faf0ea52d728bb18c0a0d1522d9bfd8c72d26ff6f61bfc3d06a411cf40"}, + {file = "types_requests-2.31.0.2-py3-none-any.whl", hash = "sha256:56d181c85b5925cbc59f4489a57e72a8b2166f18273fd8ba7b6fe0c0b986f12a"}, ] [package.dependencies] @@ -9701,45 +9576,41 @@ types-urllib3 = "*" [[package]] name = "types-toml" -version = "0.10.8.6" +version = "0.10.8.7" description = "Typing stubs for toml" -category = "dev" optional = false python-versions = "*" files = [ - {file = "types-toml-0.10.8.6.tar.gz", hash = "sha256:6d3ac79e36c9ee593c5d4fb33a50cca0e3adceb6ef5cff8b8e5aef67b4c4aaf2"}, - {file = "types_toml-0.10.8.6-py3-none-any.whl", hash = "sha256:de7b2bb1831d6f7a4b554671ffe5875e729753496961b3e9b202745e4955dafa"}, + {file = "types-toml-0.10.8.7.tar.gz", hash = "sha256:58b0781c681e671ff0b5c0319309910689f4ab40e8a2431e205d70c94bb6efb1"}, + {file = "types_toml-0.10.8.7-py3-none-any.whl", hash = "sha256:61951da6ad410794c97bec035d59376ce1cbf4453dc9b6f90477e81e4442d631"}, ] [[package]] name = "types-urllib3" -version = "1.26.25.13" +version = "1.26.25.14" description = "Typing stubs for urllib3" -category = "main" optional = false python-versions = "*" files = [ - {file = "types-urllib3-1.26.25.13.tar.gz", hash = "sha256:3300538c9dc11dad32eae4827ac313f5d986b8b21494801f1bf97a1ac6c03ae5"}, - {file = "types_urllib3-1.26.25.13-py3-none-any.whl", hash = "sha256:5dbd1d2bef14efee43f5318b5d36d805a489f6600252bb53626d4bfafd95e27c"}, + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, ] [[package]] name = "typing-extensions" -version = "4.7.1" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] [[package]] name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -9755,7 +9626,6 @@ typing-extensions = ">=3.7.4" name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -9765,14 +9635,13 @@ files = [ [[package]] name = "tzlocal" -version = "4.3" +version = "4.3.1" description = "tzinfo object for the local timezone" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, - {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, + {file = "tzlocal-4.3.1-py3-none-any.whl", hash = "sha256:67d7e7f4ce0a98e9dfde2e02474c60fe846ed032d78b555c554c2e9cba472d84"}, + {file = "tzlocal-4.3.1.tar.gz", hash = "sha256:ee32ef8c20803c19a96ed366addd3d4a729ef6309cb5c7359a0cc2eeeb7fa46a"}, ] [package.dependencies] @@ -9785,24 +9654,22 @@ devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pyte [[package]] name = "uri-template" -version = "1.2.0" +version = "1.3.0" description = "RFC 6570 URI Template Processor" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "uri_template-1.2.0-py3-none-any.whl", hash = "sha256:f1699c77b73b925cf4937eae31ab282a86dc885c333f2e942513f08f691fc7db"}, - {file = "uri_template-1.2.0.tar.gz", hash = "sha256:934e4d09d108b70eb8a24410af8615294d09d279ce0e7cbcdaef1bd21f932b06"}, + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, ] [package.extras] -dev = ["flake8 (<4.0.0)", "flake8-annotations", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-noqa", "flake8-requirements", "flake8-type-annotations", "flake8-use-fstring", "mypy", "pep8-naming"] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] [[package]] name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -9814,7 +9681,6 @@ files = [ name = "urllib3" version = "1.26.16" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -9829,36 +9695,28 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "validators" -version = "0.20.0" -description = "Python Data Validation for Humans™." -category = "main" +version = "0.21.0" +description = "Python Data Validation for Humans™" optional = true -python-versions = ">=3.4" +python-versions = ">=3.8,<4.0" files = [ - {file = "validators-0.20.0.tar.gz", hash = "sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a"}, + {file = "validators-0.21.0-py3-none-any.whl", hash = "sha256:3470db6f2384c49727ee319afa2e97aec3f8fad736faa6067e0fd7f9eaf2c551"}, + {file = "validators-0.21.0.tar.gz", hash = "sha256:245b98ab778ed9352a7269c6a8f6c2a839bed5b2a7e3e60273ce399d247dd4b3"}, ] -[package.dependencies] -decorator = ">=3.4.0" - -[package.extras] -test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] - [[package]] name = "vcrpy" -version = "4.3.1" +version = "5.1.0" description = "Automatically mock your HTTP interactions to simplify and speed up testing" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "vcrpy-4.3.1-py2.py3-none-any.whl", hash = "sha256:35398f1b373f32340f39d735ea45f40d679ace316f3dddf8cbcbc2f120e6d1d0"}, - {file = "vcrpy-4.3.1.tar.gz", hash = "sha256:24e2d450bf1c2f9f9b4246ee91beb7d58f862a9f2f030514b14783b83c5146ec"}, + {file = "vcrpy-5.1.0-py2.py3-none-any.whl", hash = "sha256:605e7b7a63dcd940db1df3ab2697ca7faf0e835c0852882142bafb19649d599e"}, + {file = "vcrpy-5.1.0.tar.gz", hash = "sha256:bbf1532f2618a04f11bce2a99af3a9647a32c880957293ff91e0a5f187b6b3d2"}, ] [package.dependencies] PyYAML = "*" -six = ">=1.5" urllib3 = {version = "<2", markers = "python_version < \"3.10\""} wrapt = "*" yarl = "*" @@ -9867,7 +9725,6 @@ yarl = "*" name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -9907,7 +9764,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -9917,14 +9773,13 @@ files = [ [[package]] name = "weaviate-client" -version = "3.20.1" +version = "3.23.0" description = "A python native Weaviate client" -category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "weaviate-client-3.20.1.tar.gz", hash = "sha256:752912423f6334575c3feffcc98e5604e2d4b3bd3baddbff57d38db23bec3e9f"}, - {file = "weaviate_client-3.20.1-py3-none-any.whl", hash = "sha256:175f1665d9f1e580dcfa48cfd4dab1e49925d1655b0b4720d0f2ee7709c956f6"}, + {file = "weaviate-client-3.23.0.tar.gz", hash = "sha256:3ffd7f1460c9e32755d84d4f5fc63dfc0bd990dbe2c3dc20d5c68119d467680e"}, + {file = "weaviate_client-3.23.0-py3-none-any.whl", hash = "sha256:3d3bb75c1d96b2b71e213c5eb885ae3e3f42e4304955383c467d100187d9ff8e"}, ] [package.dependencies] @@ -9940,7 +9795,6 @@ grpc = ["grpcio", "grpcio-tools"] name = "webcolors" version = "1.13" description = "A library for working with the color formats defined by HTML and CSS." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -9956,7 +9810,6 @@ tests = ["pytest", "pytest-cov"] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "dev" optional = false python-versions = "*" files = [ @@ -9966,31 +9819,29 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.0" +version = "1.6.2" description = "WebSocket client for Python with low level API options" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.0.tar.gz", hash = "sha256:e84c7eafc66aade6d1967a51dfd219aabdf81d15b9705196e11fd81f48666b78"}, - {file = "websocket_client-1.6.0-py3-none-any.whl", hash = "sha256:72d7802608745b0a212f79b478642473bd825777d8637b6c8c421bf167790d4f"}, + {file = "websocket-client-1.6.2.tar.gz", hash = "sha256:53e95c826bf800c4c465f50093a8c4ff091c7327023b10bfaff40cf1ef170eaa"}, + {file = "websocket_client-1.6.2-py3-none-any.whl", hash = "sha256:ce54f419dfae71f4bdba69ebe65bf7f0a93fe71bc009ad3a010aacc3eebad537"}, ] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] [[package]] name = "werkzeug" -version = "2.3.6" +version = "2.3.7" description = "The comprehensive WSGI web application library." -category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "Werkzeug-2.3.6-py3-none-any.whl", hash = "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890"}, - {file = "Werkzeug-2.3.6.tar.gz", hash = "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"}, + {file = "werkzeug-2.3.7-py3-none-any.whl", hash = "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528"}, + {file = "werkzeug-2.3.7.tar.gz", hash = "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8"}, ] [package.dependencies] @@ -10003,7 +9854,6 @@ watchdog = ["watchdog (>=2.3)"] name = "wget" version = "3.2" description = "pure python download utility" -category = "main" optional = true python-versions = "*" files = [ @@ -10012,29 +9862,27 @@ files = [ [[package]] name = "wheel" -version = "0.40.0" +version = "0.41.2" description = "A built-package format for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, + {file = "wheel-0.41.2-py3-none-any.whl", hash = "sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8"}, + {file = "wheel-0.41.2.tar.gz", hash = "sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985"}, ] [package.extras] -test = ["pytest (>=6.0.0)"] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "whylabs-client" -version = "0.5.1" +version = "0.5.4" description = "WhyLabs API client" -category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "whylabs-client-0.5.1.tar.gz", hash = "sha256:f7aacfab7d176812c2eb4cdeb8c52521eed0d30bc2a0836399798197a513cf04"}, - {file = "whylabs_client-0.5.1-py3-none-any.whl", hash = "sha256:dc6958d5bb390f1057fe6f513cbce55c4e71d5f8a1461a7c93eb73814089de33"}, + {file = "whylabs-client-0.5.4.tar.gz", hash = "sha256:d0cccfaac53412362559db7b093f3d2008b68ac8a78109b617c692d59757813f"}, + {file = "whylabs_client-0.5.4-py3-none-any.whl", hash = "sha256:9854a047040fd2d7e84bd8f28a0b1c9e1822a16d8bcaee302d301c0bd1eddf64"}, ] [package.dependencies] @@ -10043,14 +9891,13 @@ urllib3 = ">=1.25.3" [[package]] name = "whylogs" -version = "1.2.3" +version = "1.2.6" description = "Profile and monitor your ML data pipeline end-to-end" -category = "main" optional = true python-versions = ">=3.7.1,<4" files = [ - {file = "whylogs-1.2.3-py3-none-any.whl", hash = "sha256:92cfe02985760c52d25b88bad69001901844ff51c76b62537bce1c31d12c271e"}, - {file = "whylogs-1.2.3.tar.gz", hash = "sha256:d0000f502b1b30c48a5ad9535488370e961e85825dafdd75421447ffff0516e7"}, + {file = "whylogs-1.2.6-py3-none-any.whl", hash = "sha256:9b71d8468396b303539b69003f93d8f5cdad03ad0112df12a697bf662c1baf34"}, + {file = "whylogs-1.2.6.tar.gz", hash = "sha256:e65ef4e6bbd2bfb7302787d71733f53345c4bc0f6ec9e34481178ff4a867a143"}, ] [package.dependencies] @@ -10079,7 +9926,6 @@ viz = ["Pillow (>=9.2.0,<10.0.0)", "ipython", "numpy", "numpy (>=1.23.2)", "pyba name = "whylogs-sketching" version = "3.4.1.dev3" description = "sketching library of whylogs" -category = "main" optional = true python-versions = "*" files = [ @@ -10118,21 +9964,19 @@ files = [ [[package]] name = "widgetsnbextension" -version = "4.0.7" +version = "4.0.8" description = "Jupyter interactive widgets for Jupyter Notebook" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.7-py3-none-any.whl", hash = "sha256:be3228a73bbab189a16be2d4a3cd89ecbd4e31948bfdc64edac17dcdee3cd99c"}, - {file = "widgetsnbextension-4.0.7.tar.gz", hash = "sha256:ea67c17a7cd4ae358f8f46c3b304c40698bc0423732e3f273321ee141232c8be"}, + {file = "widgetsnbextension-4.0.8-py3-none-any.whl", hash = "sha256:2e37f0ce9da11651056280c7efe96f2db052fe8fc269508e3724f5cbd6c93018"}, + {file = "widgetsnbextension-4.0.8.tar.gz", hash = "sha256:9ec291ba87c2dfad42c3d5b6f68713fa18be1acd7476569516b2431682315c17"}, ] [[package]] name = "wikipedia" version = "1.4.0" description = "Wikipedia API for Python" -category = "main" optional = true python-versions = "*" files = [ @@ -10147,7 +9991,6 @@ requests = ">=2.0.0,<3.0.0" name = "win32-setctime" version = "1.1.0" description = "A small Python utility to set file creation time on Windows" -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -10162,7 +10005,6 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] name = "wolframalpha" version = "5.0.0" description = "Wolfram|Alpha 2.0 API client" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -10183,7 +10025,6 @@ testing = ["keyring", "pmxbot", "pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7 name = "wonderwords" version = "2.2.0" description = "A python package for random words and sentences in the english language" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -10198,7 +10039,6 @@ cli = ["rich (==9.10.0)"] name = "wrapt" version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -10281,14 +10121,13 @@ files = [ [[package]] name = "xata" -version = "1.0.0a7" +version = "1.0.0b0" description = "Python client for Xata.io" -category = "main" optional = true python-versions = ">=3.8,<4.0" files = [ - {file = "xata-1.0.0a7-py3-none-any.whl", hash = "sha256:1427e97bccddfd5fa8fba56ba993b2d78f1dc074e729d06ccc79c48d07bd023a"}, - {file = "xata-1.0.0a7.tar.gz", hash = "sha256:32769ddc22cc091bf133e66b91662185047fff05aa431e7c760b55cd0ddef6c3"}, + {file = "xata-1.0.0b0-py3-none-any.whl", hash = "sha256:10dab3d4382c62e04081ada0c381f80abb6f67f7601239c71b20870846a60472"}, + {file = "xata-1.0.0b0.tar.gz", hash = "sha256:241c6c52398b663da7a5107054d6ec0abca331de88bc2de7b0f0b13971b7b7f4"}, ] [package.dependencies] @@ -10301,7 +10140,6 @@ requests = ">=2.28.1,<3.0.0" name = "xmltodict" version = "0.13.0" description = "Makes working with XML feel like you are working with JSON" -category = "main" optional = true python-versions = ">=3.4" files = [ @@ -10313,7 +10151,6 @@ files = [ name = "yarl" version = "1.9.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -10399,25 +10236,23 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "zstandard" version = "0.21.0" description = "Zstandard bindings for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ From d564ec944c1a17a1cfebb44c9111f3e076d69d2e Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 14:09:35 -0400 Subject: [PATCH 046/143] `poetry lock` the experimental package. (#9478) --- .../langchain_experimental/cpal/base.py | 2 +- .../pydantic_v1/__init__.py | 17 +- .../pydantic_v1/dataclasses.py | 17 +- .../pydantic_v1/main.py | 17 +- libs/experimental/poetry.lock | 826 ++++++++---------- .../integration_tests/chains/test_cpal.py | 2 +- 6 files changed, 397 insertions(+), 484 deletions(-) diff --git a/libs/experimental/langchain_experimental/cpal/base.py b/libs/experimental/langchain_experimental/cpal/base.py index 498bb7b06..bba59d5d3 100644 --- a/libs/experimental/langchain_experimental/cpal/base.py +++ b/libs/experimental/langchain_experimental/cpal/base.py @@ -6,7 +6,6 @@ from __future__ import annotations import json from typing import Any, ClassVar, Dict, List, Optional, Type -import pydantic from langchain.base_language import BaseLanguageModel from langchain.callbacks.manager import CallbackManagerForChainRun from langchain.chains.base import Chain @@ -14,6 +13,7 @@ from langchain.chains.llm import LLMChain from langchain.output_parsers import PydanticOutputParser from langchain.prompts.prompt import PromptTemplate +from langchain_experimental import pydantic_v1 as pydantic from langchain_experimental.cpal.constants import Constant from langchain_experimental.cpal.models import ( CausalModel, diff --git a/libs/experimental/langchain_experimental/pydantic_v1/__init__.py b/libs/experimental/langchain_experimental/pydantic_v1/__init__.py index 859822531..826f1c500 100644 --- a/libs/experimental/langchain_experimental/pydantic_v1/__init__.py +++ b/libs/experimental/langchain_experimental/pydantic_v1/__init__.py @@ -1,3 +1,4 @@ +import typing from importlib import metadata ## Create namespaces for pydantic v1 and v2. @@ -11,11 +12,19 @@ from importlib import metadata # unambiguously uses either v1 or v2 API. # * This change is easier to roll out and roll back. -try: - from pydantic.v1 import * # noqa: F403 -except ImportError: +# It's currently impossible to support mypy for both pydantic v1 and v2 at once: +# https://github.com/pydantic/pydantic/issues/6022 +# +# In the lint environment, pydantic is currently v1. +# When we upgrade it to pydantic v2, we'll need +# to replace this with `from pydantic.v1 import *`. +if typing.TYPE_CHECKING: from pydantic import * # noqa: F403 - +else: + try: + from pydantic.v1 import * # noqa: F403 + except ImportError: + from pydantic import * # noqa: F403 try: _PYDANTIC_MAJOR_VERSION: int = int(metadata.version("pydantic").split(".")[0]) diff --git a/libs/experimental/langchain_experimental/pydantic_v1/dataclasses.py b/libs/experimental/langchain_experimental/pydantic_v1/dataclasses.py index bb7253c29..25a7810a0 100644 --- a/libs/experimental/langchain_experimental/pydantic_v1/dataclasses.py +++ b/libs/experimental/langchain_experimental/pydantic_v1/dataclasses.py @@ -1,4 +1,15 @@ -try: - from pydantic.v1.dataclasses import * # noqa: F403 -except ImportError: +import typing + +# It's currently impossible to support mypy for both pydantic v1 and v2 at once: +# https://github.com/pydantic/pydantic/issues/6022 +# +# In the lint environment, pydantic is currently v1. +# When we upgrade it to pydantic v2, we'll need to +# replace this with `from pydantic.v1.dataclasses import *`. +if typing.TYPE_CHECKING: from pydantic.dataclasses import * # noqa: F403 +else: + try: + from pydantic.v1.dataclasses import * # noqa: F403 + except ImportError: + from pydantic.dataclasses import * # noqa: F403 diff --git a/libs/experimental/langchain_experimental/pydantic_v1/main.py b/libs/experimental/langchain_experimental/pydantic_v1/main.py index 4b8f1670e..2fa4c9958 100644 --- a/libs/experimental/langchain_experimental/pydantic_v1/main.py +++ b/libs/experimental/langchain_experimental/pydantic_v1/main.py @@ -1,4 +1,15 @@ -try: - from pydantic.v1.main import * # noqa: F403 -except ImportError: +import typing + +# It's currently impossible to support mypy for both pydantic v1 and v2 at once: +# https://github.com/pydantic/pydantic/issues/6022 +# +# In the lint environment, pydantic is currently v1. +# When we upgrade it to pydantic v2, we'll need +# to replace this with `from pydantic.v1.main import *`. +if typing.TYPE_CHECKING: from pydantic.main import * # noqa: F403 +else: + try: + from pydantic.v1.main import * # noqa: F403 + except ImportError: + from pydantic.main import * # noqa: F403 diff --git a/libs/experimental/poetry.lock b/libs/experimental/poetry.lock index 91191a459..71b7d1b94 100644 --- a/libs/experimental/poetry.lock +++ b/libs/experimental/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "aiohttp" version = "3.8.5" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -113,7 +112,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +126,6 @@ frozenlist = ">=1.1.0" name = "anyio" version = "3.7.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -150,7 +147,6 @@ trio = ["trio (<0.22)"] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -160,29 +156,28 @@ files = [ [[package]] name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." -category = "dev" +version = "23.1.0" +description = "Argon2 for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, - {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, ] [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] -docs = ["furo", "sphinx", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] [[package]] name = "argon2-cffi-bindings" version = "21.2.0" description = "Low-level CFFI bindings for Argon2" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -220,7 +215,6 @@ tests = ["pytest"] name = "arrow" version = "1.2.3" description = "Better dates & times for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -235,7 +229,6 @@ python-dateutil = ">=2.7.0" name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -251,14 +244,13 @@ test = ["astroid", "pytest"] [[package]] name = "async-lru" -version = "2.0.3" +version = "2.0.4" description = "Simple LRU cache for asyncio" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "async-lru-2.0.3.tar.gz", hash = "sha256:b714c9d1415fca4e264da72a9e2abc66880ce7430e03a973341f88ea4c0d4869"}, - {file = "async_lru-2.0.3-py3-none-any.whl", hash = "sha256:00c0a8899c20b9c88663a47732689ff98189c9fa08ad9f734d7722f934d250b1"}, + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, ] [package.dependencies] @@ -266,21 +258,19 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -299,7 +289,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -314,7 +303,6 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -326,7 +314,6 @@ files = [ name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -345,7 +332,6 @@ lxml = ["lxml"] name = "black" version = "23.7.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -392,7 +378,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -409,21 +394,19 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" optional = false python-versions = "*" files = [ @@ -500,7 +483,6 @@ pycparser = "*" name = "charset-normalizer" version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -583,14 +565,13 @@ files = [ [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -600,7 +581,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -610,18 +590,17 @@ files = [ [[package]] name = "comm" -version = "0.1.3" +version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] @@ -632,7 +611,6 @@ typing = ["mypy (>=0.990)"] name = "dataclasses-json" version = "0.5.9" description = "Easily serialize dataclasses to and from JSON" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -650,37 +628,35 @@ dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest ( [[package]] name = "debugpy" -version = "1.6.7" +version = "1.6.7.post1" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, + {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, + {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, ] [[package]] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -692,7 +668,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -702,14 +677,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -719,7 +693,6 @@ test = ["pytest (>=6)"] name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" files = [ @@ -732,14 +705,13 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" -version = "2.17.1" +version = "2.18.0" description = "Fastest Python implementation of JSON schema" -category = "dev" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, - {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, + {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, + {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, ] [package.extras] @@ -749,7 +721,6 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc name = "fqdn" version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -category = "dev" optional = false python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" files = [ @@ -761,7 +732,6 @@ files = [ name = "frozenlist" version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -832,7 +802,6 @@ files = [ name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -906,7 +875,6 @@ test = ["objgraph", "psutil"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -918,7 +886,6 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -936,14 +903,13 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.0.0" +version = "6.0.1" description = "Read resources from Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.0-py3-none-any.whl", hash = "sha256:d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185"}, - {file = "importlib_resources-6.0.0.tar.gz", hash = "sha256:4cf94875a8368bd89531a756df9a9ebe1f150e0f885030b461237bc7f2d905f2"}, + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, ] [package.dependencies] @@ -957,7 +923,6 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -967,14 +932,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.24.0" +version = "6.25.1" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.24.0-py3-none-any.whl", hash = "sha256:2f5fffc7ad8f1fd5aadb4e171ba9129d9668dbafa374732cf9511ada52d6547f"}, - {file = "ipykernel-6.24.0.tar.gz", hash = "sha256:29cea0a716b1176d002a61d0b0c851f34536495bc4ef7dd0222c88b41b816123"}, + {file = "ipykernel-6.25.1-py3-none-any.whl", hash = "sha256:c8a2430b357073b37c76c21c52184db42f6b4b0e438e1eb7df3c4440d120497c"}, + {file = "ipykernel-6.25.1.tar.gz", hash = "sha256:050391364c0977e768e354bdb60cbbfbee7cbb943b1af1618382021136ffd42f"}, ] [package.dependencies] @@ -983,7 +947,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -1003,7 +967,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "8.12.2" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1043,7 +1006,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "ipython-genutils" version = "0.2.0" description = "Vestigial utilities from IPython" -category = "dev" optional = false python-versions = "*" files = [ @@ -1053,18 +1015,17 @@ files = [ [[package]] name = "ipywidgets" -version = "8.0.7" +version = "8.1.0" description = "Jupyter interactive widgets" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.0.7-py3-none-any.whl", hash = "sha256:e0aed0c95a1e55b6a123f64305245578bdc09e52965a34941c2b6a578b8c64a0"}, - {file = "ipywidgets-8.0.7.tar.gz", hash = "sha256:50ace0a8886e9a0d68b980db82f94c25d55d21ff2340ed36f802dd9365e94acf"}, + {file = "ipywidgets-8.1.0-py3-none-any.whl", hash = "sha256:6c8396cc7b8c95dfb4e9ab0054f48c002f045e7e5d7ae523f559d64e525a98ab"}, + {file = "ipywidgets-8.1.0.tar.gz", hash = "sha256:ce97dd90525b3066fd00094690964e7eac14cf9b7745d35565b5eeac20cce687"}, ] [package.dependencies] -ipykernel = ">=4.5.1" +comm = ">=0.1.3" ipython = ">=6.1.0" jupyterlab-widgets = ">=3.0.7,<3.1.0" traitlets = ">=4.3.1" @@ -1077,7 +1038,6 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] name = "isoduration" version = "20.11.0" description = "Operations with ISO 8601 durations" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1090,29 +1050,27 @@ arrow = ">=0.15.0" [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1130,7 +1088,6 @@ i18n = ["Babel (>=2.7)"] name = "json5" version = "0.9.14" description = "A Python implementation of the JSON5 data format." -category = "dev" optional = false python-versions = "*" files = [ @@ -1145,23 +1102,22 @@ dev = ["hypothesis"] name = "jsonpointer" version = "2.4" description = "Identify specific nodes in a JSON document (RFC 6901)" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] name = "jsonschema" -version = "4.18.4" +version = "4.19.0" description = "An implementation of JSON Schema validation for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, - {file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"}, + {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, + {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, ] [package.dependencies] @@ -1188,7 +1144,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.7.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1204,7 +1159,6 @@ referencing = ">=0.28.0" name = "jupyter" version = "1.0.0" description = "Jupyter metapackage. Install all the Jupyter components in one go." -category = "dev" optional = false python-versions = "*" files = [ @@ -1225,7 +1179,6 @@ qtconsole = "*" name = "jupyter-client" version = "8.3.0" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1235,7 +1188,7 @@ files = [ [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -1249,7 +1202,6 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt name = "jupyter-console" version = "6.6.3" description = "Jupyter terminal console" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1261,7 +1213,7 @@ files = [ ipykernel = ">=6.14" ipython = "*" jupyter-client = ">=7.0.0" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" prompt-toolkit = ">=3.0.30" pygments = "*" pyzmq = ">=17" @@ -1274,7 +1226,6 @@ test = ["flaky", "pexpect", "pytest"] name = "jupyter-core" version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1293,20 +1244,20 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.6.3" +version = "0.7.0" description = "Jupyter Event System library" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.6.3-py3-none-any.whl", hash = "sha256:57a2749f87ba387cd1bfd9b22a0875b889237dbf2edc2121ebb22bde47036c17"}, - {file = "jupyter_events-0.6.3.tar.gz", hash = "sha256:9a6e9995f75d1b7146b436ea24d696ce3a35bfa8bfe45e0c33c334c79464d0b3"}, + {file = "jupyter_events-0.7.0-py3-none-any.whl", hash = "sha256:4753da434c13a37c3f3c89b500afa0c0a6241633441421f6adafe2fb2e2b924e"}, + {file = "jupyter_events-0.7.0.tar.gz", hash = "sha256:7be27f54b8388c03eefea123a4f79247c5b9381c49fb1cd48615ee191eb12615"}, ] [package.dependencies] -jsonschema = {version = ">=3.2.0", extras = ["format-nongpl"]} +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} python-json-logger = ">=2.0.4" pyyaml = ">=5.3" +referencing = "*" rfc3339-validator = "*" rfc3986-validator = ">=0.1.1" traitlets = ">=5.3" @@ -1314,13 +1265,12 @@ traitlets = ">=5.3" [package.extras] cli = ["click", "rich"] docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "pytest-cov", "rich"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] [[package]] name = "jupyter-lsp" version = "2.2.0" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1334,14 +1284,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.7.0" +version = "2.7.2" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.7.0-py3-none-any.whl", hash = "sha256:6a77912aff643e53fa14bdb2634884b52b784a4be77ce8e93f7283faed0f0849"}, - {file = "jupyter_server-2.7.0.tar.gz", hash = "sha256:36da0a266d31a41ac335a366c88933c17dfa5bb817a48f5c02c16d303bc9477f"}, + {file = "jupyter_server-2.7.2-py3-none-any.whl", hash = "sha256:98a375347b580e837e7016007c24680a4261ed8ad7cd35196ac087d229f48e5a"}, + {file = "jupyter_server-2.7.2.tar.gz", hash = "sha256:d64fb4e593907290e5df916e3c9399c15ab2cd7bdb71cbcd1d36452dbfb30523"}, ] [package.dependencies] @@ -1349,7 +1298,7 @@ anyio = ">=3.1.0" argon2-cffi = "*" jinja2 = "*" jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" jupyter-events = ">=0.6.0" jupyter-server-terminals = "*" nbconvert = ">=6.4.4" @@ -1359,7 +1308,7 @@ packaging = "*" prometheus-client = "*" pywinpty = {version = "*", markers = "os_name == \"nt\""} pyzmq = ">=24" -send2trash = "*" +send2trash = ">=1.8.2" terminado = ">=0.8.3" tornado = ">=6.2.0" traitlets = ">=5.6.0" @@ -1373,7 +1322,6 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc name = "jupyter-server-terminals" version = "0.4.4" description = "A Jupyter Server Extension Providing Terminals." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1391,14 +1339,13 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", [[package]] name = "jupyterlab" -version = "4.0.3" +version = "4.0.5" description = "JupyterLab computational environment" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.3-py3-none-any.whl", hash = "sha256:d369944391b1d15f2d1f3cb965fb67352956279b2ae6f03ce7947a43940a8301"}, - {file = "jupyterlab-4.0.3.tar.gz", hash = "sha256:e14d1ce46a613028111d0d476a1d7d6b094003b7462bac669f5b478317abcb39"}, + {file = "jupyterlab-4.0.5-py3-none-any.whl", hash = "sha256:13b3a326e7b95d72746fe20dbe80ee1e71165d6905e01ceaf1320eb809cb1b47"}, + {file = "jupyterlab-4.0.5.tar.gz", hash = "sha256:de49deb75f9b9aec478ed04754cbefe9c5d22fd796a5783cdc65e212983d3611"}, ] [package.dependencies] @@ -1427,7 +1374,6 @@ test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-cons name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1437,14 +1383,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.23.0" +version = "2.24.0" description = "A set of server components for JupyterLab and JupyterLab like applications." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_server-2.23.0-py3-none-any.whl", hash = "sha256:a5ea2c839336a8ba7c38c8e7b2f24cedf919f0d439f4d2e606d9322013a95788"}, - {file = "jupyterlab_server-2.23.0.tar.gz", hash = "sha256:83c01aa4ad9451cd61b383e634d939ff713850f4640c0056b2cdb2b6211a74c7"}, + {file = "jupyterlab_server-2.24.0-py3-none-any.whl", hash = "sha256:5f077e142bb8dc9b843d960f940c513581bceca3793a0d80f9c67d9522c4e876"}, + {file = "jupyterlab_server-2.24.0.tar.gz", hash = "sha256:4e6f99e0a5579bbbc32e449c4dbb039561d4f1a7827d5733273ed56738f21f07"}, ] [package.dependencies] @@ -1460,13 +1405,12 @@ requests = ">=2.28" [package.extras] docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] openapi = ["openapi-core (>=0.16.1,<0.17.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.6.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] +test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.7.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] [[package]] name = "jupyterlab-widgets" version = "3.0.8" description = "Jupyter interactive widgets for JupyterLab" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1478,7 +1422,6 @@ files = [ name = "langchain" version = "0.0.239" description = "Building applications with LLMs through composability" -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -1516,25 +1459,23 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langsmith" -version = "0.0.12" +version = "0.0.25" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.12-py3-none-any.whl", hash = "sha256:d7a4360d1984b57689c6470ffcef79dcb217dd7129bdfd3bcfcb22dc058787f6"}, - {file = "langsmith-0.0.12.tar.gz", hash = "sha256:5abf30ac4ebb6b68955bea617669585e80a6fe9def90664503d5fbd6d095e91e"}, + {file = "langsmith-0.0.25-py3-none-any.whl", hash = "sha256:d595435ad21fa6077550d7c85472935d1e8241afa042c1e29287d2c95c3ed151"}, + {file = "langsmith-0.0.25.tar.gz", hash = "sha256:e728c398fc1adaa0ed8abeb21f6a92d7fb19fe3ab49d3911c22b03dfe25935d6"}, ] [package.dependencies] -pydantic = ">=1,<2" +pydantic = ">=1,<3" requests = ">=2,<3" [[package]] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1594,7 +1535,6 @@ files = [ name = "marshmallow" version = "3.20.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1615,7 +1555,6 @@ tests = ["pytest", "pytz", "simplejson"] name = "marshmallow-enum" version = "1.5.1" description = "Enum field for Marshmallow" -category = "main" optional = false python-versions = "*" files = [ @@ -1630,7 +1569,6 @@ marshmallow = ">=2.0.0" name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1645,7 +1583,6 @@ traitlets = "*" name = "mistune" version = "3.0.1" description = "A sane and fast Markdown parser with useful plugins and renderers" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1657,7 +1594,6 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1741,7 +1677,6 @@ files = [ name = "mypy" version = "0.991" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1792,7 +1727,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1804,7 +1738,6 @@ files = [ name = "nbclient" version = "0.8.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1814,7 +1747,7 @@ files = [ [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" nbformat = ">=5.1" traitlets = ">=5.4" @@ -1825,14 +1758,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.7.2" +version = "7.7.4" description = "Converting Jupyter Notebooks" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.7.2-py3-none-any.whl", hash = "sha256:25e0cf2b663ee0cd5a90afb6b2f2940bf1abe5cc5bc995b88c8156ca65fa7ede"}, - {file = "nbconvert-7.7.2.tar.gz", hash = "sha256:36d3e7bf32f0c075878176cdeeb645931c994cbed5b747bc7a570ba8cd2321f3"}, + {file = "nbconvert-7.7.4-py3-none-any.whl", hash = "sha256:ace26f4386d08eb5c55833596a942048c5502a95e05590cb523826a749a40a37"}, + {file = "nbconvert-7.7.4.tar.gz", hash = "sha256:1113d039fa3fc3a846ffa5a3b0a019e85aaa94c566a09fa0c400fb7638e46087"}, ] [package.dependencies] @@ -1864,14 +1796,13 @@ webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.1" +version = "5.9.2" description = "The Jupyter Notebook format" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.1-py3-none-any.whl", hash = "sha256:b7968ebf4811178a4108ee837eae1442e3f054132100f0359219e9ed1ce3ca45"}, - {file = "nbformat-5.9.1.tar.gz", hash = "sha256:3a7f52d040639cbd8a3890218c8b0ffb93211588c57446c90095e32ba5881b5d"}, + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, ] [package.dependencies] @@ -1886,26 +1817,24 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.7" description = "Patch asyncio to allow nested event loops" -category = "dev" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, + {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, ] [[package]] name = "notebook" -version = "7.0.0" +version = "7.0.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.0.0-py3-none-any.whl", hash = "sha256:71b4e695e658763a2766613176491854708fb46fbe7664bf5e494deeeab92d60"}, - {file = "notebook-7.0.0.tar.gz", hash = "sha256:38b55e6939df0ba73b53212c3b234e41102f1789e0158606cedaebf00abef6c8"}, + {file = "notebook-7.0.2-py3-none-any.whl", hash = "sha256:c77b1499dc9b07ce4f4f26990dcb25b2107b434f2536766b51a72a4228d9a4b6"}, + {file = "notebook-7.0.2.tar.gz", hash = "sha256:d70d6a07418c829bd5f54337ce993b7105261d9026f9d3fe68e9b8aa1a20da9a"}, ] [package.dependencies] @@ -1925,7 +1854,6 @@ test = ["ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[tes name = "notebook-shim" version = "0.2.3" description = "A shim layer for notebook traits and config" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1941,42 +1869,41 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numexpr" -version = "2.8.4" +version = "2.8.5" description = "Fast numerical expression evaluator for NumPy" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, - {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, - {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, - {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, - {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, - {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, - {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, - {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, - {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, - {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, - {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, - {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, - {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, - {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, + {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, + {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, + {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, + {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, + {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, + {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, + {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, + {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, + {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, + {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, + {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, + {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, ] [package.dependencies] @@ -1986,7 +1913,6 @@ numpy = ">=1.13.3" name = "numpy" version = "1.24.4" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2024,7 +1950,6 @@ files = [ name = "openapi-schema-pydantic" version = "1.2.4" description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -2037,21 +1962,19 @@ pydantic = ">=1.8.2" [[package]] name = "overrides" -version = "7.3.1" +version = "7.4.0" description = "A decorator to automatically detect mismatch when overriding a method." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "overrides-7.3.1-py3-none-any.whl", hash = "sha256:6187d8710a935d09b0bcef8238301d6ee2569d2ac1ae0ec39a8c7924e27f58ca"}, - {file = "overrides-7.3.1.tar.gz", hash = "sha256:8b97c6c1e1681b78cbc9424b138d880f0803c2254c5ebaabdde57bb6c62093f2"}, + {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, + {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, ] [[package]] name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2063,7 +1986,6 @@ files = [ name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2075,7 +1997,6 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2089,21 +2010,19 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -2118,7 +2037,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -2130,7 +2048,6 @@ files = [ name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2140,25 +2057,23 @@ files = [ [[package]] name = "platformdirs" -version = "3.9.1" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, - {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2174,7 +2089,6 @@ testing = ["pytest", "pytest-benchmark"] name = "prometheus-client" version = "0.17.1" description = "Python client for the Prometheus monitoring system." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2189,7 +2103,6 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.39" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -2204,7 +2117,6 @@ wcwidth = "*" name = "psutil" version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2231,7 +2143,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -2243,7 +2154,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -2258,7 +2168,6 @@ tests = ["pytest"] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2268,48 +2177,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.11" +version = "1.10.12" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, - {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, - {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, - {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, - {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, - {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, - {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, - {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, - {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, - {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, + {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, + {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, + {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, + {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, + {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, + {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, + {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, + {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, ] [package.dependencies] @@ -2321,14 +2229,13 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -2338,7 +2245,6 @@ plugins = ["importlib-metadata"] name = "pytest" version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2361,7 +2267,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -2376,7 +2281,6 @@ six = ">=1.5" name = "python-json-logger" version = "2.0.7" description = "A python library adding a json log formatter" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2388,7 +2292,6 @@ files = [ name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "dev" optional = false python-versions = "*" files = [ @@ -2400,7 +2303,6 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "dev" optional = false python-versions = "*" files = [ @@ -2424,7 +2326,6 @@ files = [ name = "pywinpty" version = "2.0.11" description = "Pseudo terminal support for Windows from Python." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2439,7 +2340,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2487,89 +2387,104 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.0" +version = "25.1.1" description = "Python bindings for 0MQ" -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, - {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, - {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, - {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, - {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, - {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, - {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, - {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, - {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, - {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, - {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, - {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, ] [package.dependencies] @@ -2579,7 +2494,6 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "qtconsole" version = "5.4.3" description = "Jupyter Qt console" -category = "dev" optional = false python-versions = ">= 3.7" files = [ @@ -2606,7 +2520,6 @@ test = ["flaky", "pytest", "pytest-qt"] name = "qtpy" version = "2.3.1" description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2622,14 +2535,13 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] name = "referencing" -version = "0.30.0" +version = "0.30.2" description = "JSON Referencing + Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.30.0-py3-none-any.whl", hash = "sha256:c257b08a399b6c2f5a3510a50d28ab5dbc7bbde049bcaf954d43c446f83ab548"}, - {file = "referencing-0.30.0.tar.gz", hash = "sha256:47237742e990457f7512c7d27486394a9aadaf876cbfaa4be65b27b4f4d47c6b"}, + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, ] [package.dependencies] @@ -2640,7 +2552,6 @@ rpds-py = ">=0.7.0" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2662,7 +2573,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "rfc3339-validator" version = "0.1.4" description = "A pure python RFC3339 validator" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2677,7 +2587,6 @@ six = "*" name = "rfc3986-validator" version = "0.1.1" description = "Pure python rfc3986 validator" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2689,7 +2598,6 @@ files = [ name = "rpds-py" version = "0.9.2" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2796,7 +2704,6 @@ files = [ name = "ruff" version = "0.0.249" description = "An extremely fast Python linter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2823,7 +2730,6 @@ files = [ name = "send2trash" version = "1.8.2" description = "Send file to trash natively under Mac OS X, Windows and Linux" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -2840,7 +2746,6 @@ win32 = ["pywin32"] name = "setuptools" version = "67.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2857,7 +2762,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2869,7 +2773,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2881,7 +2784,6 @@ files = [ name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2891,61 +2793,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.19" +version = "2.0.20" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win32.whl", hash = "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win_amd64.whl", hash = "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win32.whl", hash = "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win_amd64.whl", hash = "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win32.whl", hash = "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win_amd64.whl", hash = "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win32.whl", hash = "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win_amd64.whl", hash = "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win32.whl", hash = "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win_amd64.whl", hash = "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0"}, - {file = "SQLAlchemy-2.0.19-py3-none-any.whl", hash = "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972"}, - {file = "SQLAlchemy-2.0.19.tar.gz", hash = "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759b51346aa388c2e606ee206c0bc6f15a5299f6174d1e10cadbe4530d3c7a98"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1506e988ebeaaf316f183da601f24eedd7452e163010ea63dbe52dc91c7fc70e"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5768c268df78bacbde166b48be788b83dddaa2a5974b8810af422ddfe68a9bc8"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3f0dd6d15b6dc8b28a838a5c48ced7455c3e1fb47b89da9c79cc2090b072a50"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:243d0fb261f80a26774829bc2cee71df3222587ac789b7eaf6555c5b15651eed"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6d77c31e1bf4268b4d61b549c341cbff9842f8e115ba6904249c20cb78a61"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win32.whl", hash = "sha256:bcb04441f370cbe6e37c2b8d79e4af9e4789f626c595899d94abebe8b38f9a4d"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win_amd64.whl", hash = "sha256:d32b5ffef6c5bcb452723a496bad2d4c52b346240c59b3e6dba279f6dcc06c14"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd81466bdbc82b060c3c110b2937ab65ace41dfa7b18681fdfad2f37f27acdd7"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fe7d61dc71119e21ddb0094ee994418c12f68c61b3d263ebaae50ea8399c4d4"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e571af672e1bb710b3cc1a9794b55bce1eae5aed41a608c0401885e3491179"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3364b7066b3c7f4437dd345d47271f1251e0cfb0aba67e785343cdbdb0fff08c"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1be86ccea0c965a1e8cd6ccf6884b924c319fcc85765f16c69f1ae7148eba64b"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1d35d49a972649b5080557c603110620a86aa11db350d7a7cb0f0a3f611948a0"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win32.whl", hash = "sha256:27d554ef5d12501898d88d255c54eef8414576f34672e02fe96d75908993cf53"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win_amd64.whl", hash = "sha256:411e7f140200c02c4b953b3dbd08351c9f9818d2bd591b56d0fa0716bd014f1e"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c6aceebbc47db04f2d779db03afeaa2c73ea3f8dcd3987eb9efdb987ffa09a3"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d3f175410a6db0ad96b10bfbb0a5530ecd4fcf1e2b5d83d968dd64791f810ed"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8186be85da6587456c9ddc7bf480ebad1a0e6dcbad3967c4821233a4d4df57"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3d99ba99007dab8233f635c32b5cd24fb1df8d64e17bc7df136cedbea427897"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:76fdfc0f6f5341987474ff48e7a66c3cd2b8a71ddda01fa82fedb180b961630a"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win32.whl", hash = "sha256:d3793dcf5bc4d74ae1e9db15121250c2da476e1af8e45a1d9a52b1513a393459"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win_amd64.whl", hash = "sha256:79fde625a0a55220d3624e64101ed68a059c1c1f126c74f08a42097a72ff66a9"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:599ccd23a7146e126be1c7632d1d47847fa9f333104d03325c4e15440fc7d927"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a58052b5a93425f656675673ef1f7e005a3b72e3f2c91b8acca1b27ccadf5f4"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79543f945be7a5ada9943d555cf9b1531cfea49241809dd1183701f94a748624"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63e73da7fb030ae0a46a9ffbeef7e892f5def4baf8064786d040d45c1d6d1dc5"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ce5e81b800a8afc870bb8e0a275d81957e16f8c4b62415a7b386f29a0cb9763"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb0d3e94c2a84215532d9bcf10229476ffd3b08f481c53754113b794afb62d14"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win32.whl", hash = "sha256:8dd77fd6648b677d7742d2c3cc105a66e2681cc5e5fb247b88c7a7b78351cf74"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win_amd64.whl", hash = "sha256:6f8a934f9dfdf762c844e5164046a9cea25fabbc9ec865c023fe7f300f11ca4a"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:26a3399eaf65e9ab2690c07bd5cf898b639e76903e0abad096cd609233ce5208"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4cde2e1096cbb3e62002efdb7050113aa5f01718035ba9f29f9d89c3758e7e4e"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b09ba72e4e6d341bb5bdd3564f1cea6095d4c3632e45dc69375a1dbe4e26ec"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b74eeafaa11372627ce94e4dc88a6751b2b4d263015b3523e2b1e57291102f0"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:77d37c1b4e64c926fa3de23e8244b964aab92963d0f74d98cbc0783a9e04f501"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eefebcc5c555803065128401a1e224a64607259b5eb907021bf9b175f315d2a6"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win32.whl", hash = "sha256:3423dc2a3b94125094897118b52bdf4d37daf142cbcf26d48af284b763ab90e9"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win_amd64.whl", hash = "sha256:5ed61e3463021763b853628aef8bc5d469fe12d95f82c74ef605049d810f3267"}, + {file = "SQLAlchemy-2.0.20-py3-none-any.whl", hash = "sha256:63a368231c53c93e2b67d0c5556a9836fdcd383f7e3026a39602aad775b14acf"}, + {file = "SQLAlchemy-2.0.20.tar.gz", hash = "sha256:ca8a5ff2aa7f3ade6c498aaafce25b1eaeabe4e42b73e25519183e4566a16fc6"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} typing-extensions = ">=4.2.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] @@ -2972,7 +2873,6 @@ sqlcipher = ["sqlcipher3-binary"] name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -2990,14 +2890,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -3007,7 +2906,6 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] name = "terminado" version = "0.17.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3028,7 +2926,6 @@ test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3047,7 +2944,6 @@ test = ["flake8", "isort", "pytest"] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3057,30 +2953,28 @@ files = [ [[package]] name = "tornado" -version = "6.3.2" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] [[package]] name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3096,7 +2990,6 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] name = "types-pyyaml" version = "6.0.12.11" description = "Typing stubs for PyYAML" -category = "dev" optional = false python-versions = "*" files = [ @@ -3108,7 +3001,6 @@ files = [ name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3120,7 +3012,6 @@ files = [ name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -3136,7 +3027,6 @@ typing-extensions = ">=3.7.4" name = "uri-template" version = "1.3.0" description = "RFC 6570 URI Template Processor" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3151,7 +3041,6 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake name = "urllib3" version = "2.0.4" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3169,7 +3058,6 @@ zstd = ["zstandard (>=0.18.0)"] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -3181,7 +3069,6 @@ files = [ name = "webcolors" version = "1.13" description = "A library for working with the color formats defined by HTML and CSS." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3197,7 +3084,6 @@ tests = ["pytest", "pytest-cov"] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "dev" optional = false python-versions = "*" files = [ @@ -3207,18 +3093,17 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.1" +version = "1.6.2" description = "WebSocket client for Python with low level API options" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, - {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, + {file = "websocket-client-1.6.2.tar.gz", hash = "sha256:53e95c826bf800c4c465f50093a8c4ff091c7327023b10bfaff40cf1ef170eaa"}, + {file = "websocket_client-1.6.2-py3-none-any.whl", hash = "sha256:ce54f419dfae71f4bdba69ebe65bf7f0a93fe71bc009ad3a010aacc3eebad537"}, ] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] @@ -3226,7 +3111,6 @@ test = ["websockets"] name = "widgetsnbextension" version = "4.0.8" description = "Jupyter interactive widgets for Jupyter Notebook" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3238,7 +3122,6 @@ files = [ name = "yarl" version = "1.9.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3326,7 +3209,6 @@ multidict = ">=4.0" name = "zipp" version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" optional = false python-versions = ">=3.8" files = [ diff --git a/libs/experimental/tests/integration_tests/chains/test_cpal.py b/libs/experimental/tests/integration_tests/chains/test_cpal.py index c9f703de8..f37758617 100644 --- a/libs/experimental/tests/integration_tests/chains/test_cpal.py +++ b/libs/experimental/tests/integration_tests/chains/test_cpal.py @@ -5,12 +5,12 @@ import unittest from typing import Type from unittest import mock -import pydantic import pytest from langchain import OpenAI from langchain.output_parsers import PydanticOutputParser from langchain.prompts.prompt import PromptTemplate +from langchain_experimental import pydantic_v1 as pydantic from langchain_experimental.cpal.base import ( CausalChain, CPALChain, From 35812d00964cc1d96fde501b2e55c4c93387ecf9 Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 14:21:26 -0400 Subject: [PATCH 047/143] Set up concurrency groups and workflow cancelation in CI. (#9564) If another push to the same PR or branch happens while its CI is still running, cancel the earlier run in favor of the next run. There's no point in testing an outdated version of the code. GitHub only allows a limited number of job runners to be active at the same time, so it's better to cancel pointless jobs early so that more useful jobs can run sooner. --- .github/workflows/langchain_ci.yml | 10 ++++++++++ .github/workflows/langchain_experimental_ci.yml | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/.github/workflows/langchain_ci.yml b/.github/workflows/langchain_ci.yml index b91e039ea..932cce90a 100644 --- a/.github/workflows/langchain_ci.yml +++ b/.github/workflows/langchain_ci.yml @@ -13,6 +13,16 @@ on: - 'libs/langchain/**' workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI +# If another push to the same PR or branch happens while this workflow is still running, +# cancel the earlier run in favor of the next run. +# +# There's no point in testing an outdated version of the code. GitHub only allows +# a limited number of job runners to be active at the same time, so it's better to cancel +# pointless jobs early so that more useful jobs can run sooner. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + env: POETRY_VERSION: "1.5.1" WORKDIR: "libs/langchain" diff --git a/.github/workflows/langchain_experimental_ci.yml b/.github/workflows/langchain_experimental_ci.yml index cee8cdb7d..9edaf6aca 100644 --- a/.github/workflows/langchain_experimental_ci.yml +++ b/.github/workflows/langchain_experimental_ci.yml @@ -13,6 +13,16 @@ on: - 'libs/experimental/**' workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI +# If another push to the same PR or branch happens while this workflow is still running, +# cancel the earlier run in favor of the next run. +# +# There's no point in testing an outdated version of the code. GitHub only allows +# a limited number of job runners to be active at the same time, so it's better to cancel +# pointless jobs early so that more useful jobs can run sooner. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + env: POETRY_VERSION: "1.5.1" WORKDIR: "libs/experimental" From f1e602996a397ce3f7751feea86a0e8dd1e96aee Mon Sep 17 00:00:00 2001 From: Myeongseop Kim <81076998+amicus-veritatis@users.noreply.github.com> Date: Wed, 23 Aug 2023 03:54:07 +0900 Subject: [PATCH 048/143] import tqdm.auto instead of tqdm tqdm for OpenAIEmbeddings (#9584) - Description: current code does not work very well on jupyter notebook, so I changed the code so that it imports `tqdm.auto` instead. - Issue: #9582 - Dependencies: N/A - Tag maintainer: @hwchase17, @baskaryan - Twitter handle: N/A Co-authored-by: Eugene Yurtsev --- libs/langchain/langchain/embeddings/openai.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/embeddings/openai.py b/libs/langchain/langchain/embeddings/openai.py index 9c78e2499..976c879f9 100644 --- a/libs/langchain/langchain/embeddings/openai.py +++ b/libs/langchain/langchain/embeddings/openai.py @@ -352,9 +352,9 @@ class OpenAIEmbeddings(BaseModel, Embeddings): if self.show_progress_bar: try: - import tqdm + from tqdm.auto import tqdm - _iter = tqdm.tqdm(range(0, len(tokens), _chunk_size)) + _iter = tqdm(range(0, len(tokens), _chunk_size)) except ImportError: _iter = range(0, len(tokens), _chunk_size) else: From f3ba9ce7f473fe1ecff72af7e60f4d66b34bb2dd Mon Sep 17 00:00:00 2001 From: seamusp Date: Tue, 22 Aug 2023 11:57:58 -0700 Subject: [PATCH 049/143] Remove -E all from installation instructions (#9573) Update installation instructions to only install test dependencies rather than all dependencies. --------- Co-authored-by: Eugene Yurtsev --- .github/CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a3e2e5912..e4d1e54e3 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -80,10 +80,10 @@ For example, to contribute to `langchain` run `cd libs/langchain` before getting To install requirements: ```bash -poetry install -E all +poetry install --with test ``` -This will install all requirements for running the package, examples, linting, formatting, tests, and coverage. Note the `-E all` flag will install all optional dependencies necessary for integration testing. +This will install all requirements for running the package, examples, linting, formatting, tests, and coverage. ❗Note: If during installation you receive a `WheelFileValidationError` for `debugpy`, please make sure you are running Poetry v1.5.1. This bug was present in older versions of Poetry (e.g. 1.4.1) and has been resolved in newer releases. If you are still seeing this bug on v1.5.1, you may also try disabling "modern installation" (`poetry config installer.modern-installation false`) and re-installing requirements. See [this `debugpy` issue](https://github.com/microsoft/debugpy/issues/1246) for more details. From 81163e3c0c67a3bfc6124ba843383eb258b24764 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Tue, 22 Aug 2023 11:58:16 -0700 Subject: [PATCH 050/143] parent retriever nit (#9570) if ids are nullable seems like they should have default val None. mirrors VectorStore interface as well. cc @mcantillon21 @jacoblee93 --- .../langchain/langchain/retrievers/parent_document_retriever.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/langchain/retrievers/parent_document_retriever.py b/libs/langchain/langchain/retrievers/parent_document_retriever.py index f56b89290..6757ba3dd 100644 --- a/libs/langchain/langchain/retrievers/parent_document_retriever.py +++ b/libs/langchain/langchain/retrievers/parent_document_retriever.py @@ -97,7 +97,7 @@ class ParentDocumentRetriever(BaseRetriever): def add_documents( self, documents: List[Document], - ids: Optional[List[str]], + ids: Optional[List[str]] = None, add_to_docstore: bool = True, ) -> None: """Adds documents to the docstore and vectorstores. From 83986ea98a9a43b4d0508e3beeda9c3b5b77b832 Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 15:59:22 -0400 Subject: [PATCH 051/143] Cache poetry install + unify Python/Poetry setup for lint and test jobs. (#9625) With this PR: - All lint and test jobs use the exact same Python + Poetry installation approach, instead of lints doing it one way and tests doing it another way. - The Poetry installation itself is cached, which saves ~15s per run. - We no longer pass shell commands as workflow arguments to a workflow that just runs them in a shell. This makes our actions more resilient to shell code injection. If y'all like this approach, I can modify the scheduled tests workflow and the release workflow to use this too. --- .github/actions/poetry_setup/action.yml | 46 ++++++------------- .github/workflows/_lint.yml | 39 ++++++++-------- .github/workflows/_pydantic_compatibility.yml | 11 +++-- .github/workflows/_test.yml | 11 +++-- .github/workflows/langchain_ci.yml | 15 ++++-- .../workflows/langchain_experimental_ci.yml | 19 +++++--- 6 files changed, 72 insertions(+), 69 deletions(-) diff --git a/.github/actions/poetry_setup/action.yml b/.github/actions/poetry_setup/action.yml index 39c76bec4..851ddda11 100644 --- a/.github/actions/poetry_setup/action.yml +++ b/.github/actions/poetry_setup/action.yml @@ -15,19 +15,13 @@ inputs: description: Poetry version required: true - install-command: - description: Command run for installing dependencies - required: false - default: poetry install - cache-key: description: Cache key to use for manual handling of caching required: true working-directory: - description: Directory to run install-command in - required: false - default: "" + description: Directory whose poetry.lock file should be cached + required: true runs: using: composite @@ -38,47 +32,35 @@ runs: python-version: ${{ inputs.python-version }} - uses: actions/cache@v3 - id: cache-pip - name: Cache Pip ${{ inputs.python-version }} + id: cache-bin-poetry + name: Cache Poetry binary - Python ${{ inputs.python-version }} env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "1" with: path: | - ~/.cache/pip - key: pip-${{ runner.os }}-${{ runner.arch }}-py-${{ inputs.python-version }} + /opt/pipx/venvs/poetry + /opt/pipx_bin/poetry + # This step caches the poetry installation, so make sure it's keyed on the poetry version as well. + key: bin-poetry-${{ runner.os }}-${{ runner.arch }}-py-${{ inputs.python-version }}-${{ inputs.poetry-version }} - name: Install poetry + if: steps.cache-bin-poetry.outputs.cache-hit != 'true' shell: bash env: POETRY_VERSION: ${{ inputs.poetry-version }} PYTHON_VERSION: ${{ inputs.python-version }} run: pipx install "poetry==$POETRY_VERSION" --python "python$PYTHON_VERSION" --verbose - - name: Check Poetry File - shell: bash - working-directory: ${{ inputs.working-directory }} - run: | - poetry check - - - name: Check lock file - shell: bash - working-directory: ${{ inputs.working-directory }} - run: | - poetry lock --check - - - uses: actions/cache@v3 - id: cache-poetry + - name: Restore pip and poetry cached dependencies + uses: actions/cache@v3 env: SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }} with: path: | + ~/.cache/pip ~/.cache/pypoetry/virtualenvs ~/.cache/pypoetry/cache ~/.cache/pypoetry/artifacts ${{ env.WORKDIR }}/.venv - key: poetry-${{ runner.os }}-${{ runner.arch }}-py-${{ inputs.python-version }}-poetry-${{ inputs.poetry-version }}-${{ inputs.cache-key }}-${{ hashFiles(format('{0}/poetry.lock', env.WORKDIR)) }} - - - run: ${{ inputs.install-command }} - working-directory: ${{ inputs.working-directory }} - shell: bash + key: py-deps-${{ runner.os }}-${{ runner.arch }}-py-${{ inputs.python-version }}-poetry-${{ inputs.poetry-version }}-${{ inputs.cache-key }}-${{ hashFiles(format('{0}/**/poetry.lock', env.WORKDIR)) }} diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index 5b1c35a9d..1a01b225a 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -80,31 +80,32 @@ jobs: find "$WORKDIR" -name '*.py' -type f -not -newermt "$OLDEST_COMMIT_TIME" -exec touch -c -m -t '200001010000' '{}' '+' echo "oldest-commit=$OLDEST_COMMIT" >> "$GITHUB_OUTPUT" - - uses: actions/cache@v3 - id: cache-pip - name: Cache langchain editable pip install - ${{ matrix.python-version }} - env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" - with: - path: | - ~/.cache/pip - key: pip-editable-langchain-deps-${{ runner.os }}-${{ runner.arch }}-py-${{ matrix.python-version }} - - name: Install poetry - run: | - pipx install "poetry==$POETRY_VERSION" - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "4" + + - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }} + uses: "./.github/actions/poetry_setup" with: python-version: ${{ matrix.python-version }} - cache: poetry - cache-dependency-path: | - ${{ env.WORKDIR }}/**/poetry.lock + poetry-version: ${{ env.POETRY_VERSION }} + working-directory: ${{ inputs.working-directory }} + cache-key: lint + + - name: Check Poetry File + shell: bash + working-directory: ${{ inputs.working-directory }} + run: | + poetry check + + - name: Check lock file + shell: bash + working-directory: ${{ inputs.working-directory }} + run: | + poetry lock --check + - name: Install dependencies working-directory: ${{ inputs.working-directory }} run: | poetry install + - name: Install langchain editable working-directory: ${{ inputs.working-directory }} if: ${{ inputs.working-directory != 'libs/langchain' }} diff --git a/.github/workflows/_pydantic_compatibility.yml b/.github/workflows/_pydantic_compatibility.yml index 5a54c2f53..7d8fe26d9 100644 --- a/.github/workflows/_pydantic_compatibility.yml +++ b/.github/workflows/_pydantic_compatibility.yml @@ -27,14 +27,19 @@ jobs: name: Pydantic v1/v2 compatibility - Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} + + - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }} uses: "./.github/actions/poetry_setup" with: python-version: ${{ matrix.python-version }} - working-directory: ${{ inputs.working-directory }} poetry-version: ${{ env.POETRY_VERSION }} + working-directory: ${{ inputs.working-directory }} cache-key: pydantic-cross-compat - install-command: poetry install + + - name: Install dependencies + shell: bash + run: poetry install + - name: Install the opposite major version of pydantic # If normal tests use pydantic v1, here we'll use v2, and vice versa. shell: bash diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 179b6303d..76d86a286 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -27,14 +27,19 @@ jobs: name: Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} + + - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }} uses: "./.github/actions/poetry_setup" with: python-version: ${{ matrix.python-version }} - working-directory: ${{ inputs.working-directory }} poetry-version: ${{ env.POETRY_VERSION }} + working-directory: ${{ inputs.working-directory }} cache-key: core - install-command: poetry install + + - name: Install dependencies + shell: bash + run: poetry install + - name: Run core tests shell: bash run: make test diff --git a/.github/workflows/langchain_ci.yml b/.github/workflows/langchain_ci.yml index 932cce90a..8f1fc5d87 100644 --- a/.github/workflows/langchain_ci.yml +++ b/.github/workflows/langchain_ci.yml @@ -64,15 +64,20 @@ jobs: name: Python ${{ matrix.python-version }} extended tests steps: - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} + + - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }} uses: "./.github/actions/poetry_setup" with: python-version: ${{ matrix.python-version }} - working-directory: ${{ env.WORKDIR }} poetry-version: ${{ env.POETRY_VERSION }} + working-directory: libs/langchain cache-key: extended - install-command: | - echo "Running extended tests, installing dependencies with poetry..." - poetry install -E extended_testing + + - name: Install dependencies + shell: bash + run: | + echo "Running extended tests, installing dependencies with poetry..." + poetry install -E extended_testing + - name: Run extended tests run: make extended_tests diff --git a/.github/workflows/langchain_experimental_ci.yml b/.github/workflows/langchain_experimental_ci.yml index 9edaf6aca..c62ff18b3 100644 --- a/.github/workflows/langchain_experimental_ci.yml +++ b/.github/workflows/langchain_experimental_ci.yml @@ -61,18 +61,23 @@ jobs: name: test with unpublished langchain - Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} + + - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }} uses: "./.github/actions/poetry_setup" with: python-version: ${{ matrix.python-version }} - working-directory: ${{ env.WORKDIR }} poetry-version: ${{ env.POETRY_VERSION }} + working-directory: ${{ env.WORKDIR }} cache-key: unpublished-langchain - install-command: | - echo "Running tests with unpublished langchain, installing dependencies with poetry..." - poetry install - echo "Editably installing langchain outside of poetry, to avoid messing up lockfile..." - poetry run pip install -e ../langchain + - name: Install dependencies + shell: bash + run: | + echo "Running tests with unpublished langchain, installing dependencies with poetry..." + poetry install + + echo "Editably installing langchain outside of poetry, to avoid messing up lockfile..." + poetry run pip install -e ../langchain + - name: Run tests run: make test From c06f34fa352eed33cee4d25f42a7074f52791996 Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 16:07:53 -0400 Subject: [PATCH 052/143] Use new Python setup approach for scheduled tests. (#9626) Using the same new unified Python setup as the regular tests and the lint job, as set up in #9625. --- .github/workflows/scheduled_test.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scheduled_test.yml b/.github/workflows/scheduled_test.yml index 39b553d5c..b71eee059 100644 --- a/.github/workflows/scheduled_test.yml +++ b/.github/workflows/scheduled_test.yml @@ -25,18 +25,25 @@ jobs: name: Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} uses: "./.github/actions/poetry_setup" with: python-version: ${{ matrix.python-version }} poetry-version: ${{ env.POETRY_VERSION }} working-directory: libs/langchain - install-command: | - echo "Running scheduled tests, installing dependencies with poetry..." - poetry install --with=test_integration + cache-key: scheduled + + - name: Install dependencies + working-directory: libs/langchain + shell: bash + run: | + echo "Running scheduled tests, installing dependencies with poetry..." + poetry install --with=test_integration + - name: Run tests + shell: bash env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | make scheduled_tests - shell: bash From f29312eb844621837054446cfac37bd007984d5c Mon Sep 17 00:00:00 2001 From: Adilkhan Sarsen <54854336+adolkhan@users.noreply.github.com> Date: Wed, 23 Aug 2023 04:12:24 +0600 Subject: [PATCH 053/143] Fixing deeplake.mdx file as it uses outdates links (#9602) deeplake.mdx was using old links and was not working properly, in the PR we fix the issue. --- docs/api_reference/guide_imports.json | 4 ++-- docs/docs_skeleton/vercel.json | 2 +- .../{deeplake.mdx => activeloop_deeplake.mdx} | 12 +++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) rename docs/extras/integrations/providers/{deeplake.mdx => activeloop_deeplake.mdx} (73%) diff --git a/docs/api_reference/guide_imports.json b/docs/api_reference/guide_imports.json index 9c608a732..832c03f99 100644 --- a/docs/api_reference/guide_imports.json +++ b/docs/api_reference/guide_imports.json @@ -2071,8 +2071,8 @@ "PromptLayer": "https://python.langchain.com/docs/integrations/providers/promptlayer", "PromptLayer OpenAI": "https://python.langchain.com/docs/integrations/llms/promptlayer_openai" }, - "DeepLake": { - "Deep Lake": "https://python.langchain.com/docs/integrations/providers/deeplake", + "Activeloop DeepLake": { + "Deep Lake": "https://python.langchain.com/docs/integrations/providers/activeloop_deeplake", "Activeloop's Deep Lake": "https://python.langchain.com/docs/integrations/vectorstores/activeloop_deeplake", "Analysis of Twitter the-algorithm source code with LangChain, GPT4 and Activeloop's Deep Lake": "https://python.langchain.com/docs/use_cases/question_answering/how_to/code/twitter-the-algorithm-analysis-deeplake", "Use LangChain, GPT and Activeloop's Deep Lake to work with code base": "https://python.langchain.com/docs/use_cases/question_answering/how_to/code/code-analysis-deeplake", diff --git a/docs/docs_skeleton/vercel.json b/docs/docs_skeleton/vercel.json index 6472c0453..fe9f5ace3 100644 --- a/docs/docs_skeleton/vercel.json +++ b/docs/docs_skeleton/vercel.json @@ -166,7 +166,7 @@ }, { "source": "/docs/integrations/deeplake", - "destination": "/docs/integrations/providers/deeplake" + "destination": "/docs/integrations/providers/activeloop_deeplake" }, { "source": "/docs/integrations/diffbot", diff --git a/docs/extras/integrations/providers/deeplake.mdx b/docs/extras/integrations/providers/activeloop_deeplake.mdx similarity index 73% rename from docs/extras/integrations/providers/deeplake.mdx rename to docs/extras/integrations/providers/activeloop_deeplake.mdx index 88bd76888..a60d63f25 100644 --- a/docs/extras/integrations/providers/deeplake.mdx +++ b/docs/extras/integrations/providers/activeloop_deeplake.mdx @@ -1,4 +1,4 @@ -# Deep Lake +# Activeloop Deep Lake This page covers how to use the Deep Lake ecosystem within LangChain. ## Why Deep Lake? @@ -6,9 +6,15 @@ This page covers how to use the Deep Lake ecosystem within LangChain. - Not only stores embeddings, but also the original data with automatic version control. - Truly serverless. Doesn't require another service and can be used with major cloud providers (AWS S3, GCS, etc.) + +Activeloop Deep Lake supports SelfQuery Retrieval: +[Activeloop Deep Lake Self Query Retrieval](/docs/extras/modules/data_connection/retrievers/self_query/activeloop_deeplake_self_query) + + ## More Resources 1. [Ultimate Guide to LangChain & Deep Lake: Build ChatGPT to Answer Questions on Your Financial Data](https://www.activeloop.ai/resources/ultimate-guide-to-lang-chain-deep-lake-build-chat-gpt-to-answer-questions-on-your-financial-data/) -2. [Twitter the-algorithm codebase analysis with Deep Lake](../use_cases/code/twitter-the-algorithm-analysis-deeplake.html) +2. [Twitter the-algorithm codebase analysis with Deep Lake](/docs/use_cases/question_answering/how_to/code/twitter-the-algorithm-analysis-deeplake) +4. [Code Understanding](/docs/modules/data_connection/retrievers/self_query/activeloop_deeplake_self_query) 3. Here is [whitepaper](https://www.deeplake.ai/whitepaper) and [academic paper](https://arxiv.org/pdf/2209.10785.pdf) for Deep Lake 4. Here is a set of additional resources available for review: [Deep Lake](https://github.com/activeloopai/deeplake), [Get started](https://docs.activeloop.ai/getting-started) and [Tutorials](https://docs.activeloop.ai/hub-tutorials) @@ -27,4 +33,4 @@ from langchain.vectorstores import DeepLake ``` -For a more detailed walkthrough of the Deep Lake wrapper, see [this notebook](/docs/integrations/vectorstores/deeplake.html) +For a more detailed walkthrough of the Deep Lake wrapper, see [this notebook](/docs/integrations/vectorstores/activeloop_deeplake) From ca8232a3c1331766d8f7874c7bb22ca17fde663f Mon Sep 17 00:00:00 2001 From: Kim Minjong Date: Wed, 23 Aug 2023 05:18:24 +0700 Subject: [PATCH 054/143] Update BaseChatModel.astream to respect generation_info (#9430) Currently, generation_info is not respected by only reflecting messages in chunks. Change it to add generations so that generation chunks are merged properly. --------- Co-authored-by: Harrison Chase --- libs/langchain/langchain/chat_models/base.py | 24 +++++++-------- .../chat_models/test_openai.py | 30 +++++++++++++++++++ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/libs/langchain/langchain/chat_models/base.py b/libs/langchain/langchain/chat_models/base.py index 09199e30d..2d0db37c0 100644 --- a/libs/langchain/langchain/chat_models/base.py +++ b/libs/langchain/langchain/chat_models/base.py @@ -176,22 +176,22 @@ class BaseChatModel(BaseLanguageModel[BaseMessageChunk], ABC): dumpd(self), [messages], invocation_params=params, options=options ) try: - message: Optional[BaseMessageChunk] = None + generation: Optional[ChatGenerationChunk] = None for chunk in self._stream( messages, stop=stop, run_manager=run_manager, **kwargs ): yield chunk.message - if message is None: - message = chunk.message + if generation is None: + generation = chunk else: - message += chunk.message - assert message is not None + generation += chunk + assert generation is not None except (KeyboardInterrupt, Exception) as e: run_manager.on_llm_error(e) raise e else: run_manager.on_llm_end( - LLMResult(generations=[[ChatGeneration(message=message)]]), + LLMResult(generations=[[generation]]), ) async def astream( @@ -223,22 +223,22 @@ class BaseChatModel(BaseLanguageModel[BaseMessageChunk], ABC): dumpd(self), [messages], invocation_params=params, options=options ) try: - message: Optional[BaseMessageChunk] = None + generation: Optional[ChatGenerationChunk] = None async for chunk in self._astream( messages, stop=stop, run_manager=run_manager, **kwargs ): yield chunk.message - if message is None: - message = chunk.message + if generation is None: + generation = chunk else: - message += chunk.message - assert message is not None + generation += chunk + assert generation is not None except (KeyboardInterrupt, Exception) as e: await run_manager.on_llm_error(e) raise e else: await run_manager.on_llm_end( - LLMResult(generations=[[ChatGeneration(message=message)]]), + LLMResult(generations=[[generation]]), ) # --- Custom methods --- diff --git a/libs/langchain/tests/integration_tests/chat_models/test_openai.py b/libs/langchain/tests/integration_tests/chat_models/test_openai.py index 19adbf1cd..7637014a4 100644 --- a/libs/langchain/tests/integration_tests/chat_models/test_openai.py +++ b/libs/langchain/tests/integration_tests/chat_models/test_openai.py @@ -1,6 +1,8 @@ """Test ChatOpenAI wrapper.""" +from typing import Any + import pytest from langchain.callbacks.manager import CallbackManager @@ -89,6 +91,34 @@ def test_chat_openai_streaming() -> None: assert isinstance(response, BaseMessage) +@pytest.mark.scheduled +def test_chat_openai_streaming_generation_info() -> None: + """Test that generation info is preserved when streaming.""" + + class _FakeCallback(FakeCallbackHandler): + saved_things: dict = {} + + def on_llm_end( + self, + *args: Any, + **kwargs: Any, + ) -> Any: + # Save the generation + self.saved_things["generation"] = args[0] + + callback = _FakeCallback() + callback_manager = CallbackManager([callback]) + chat = ChatOpenAI( + max_tokens=2, + temperature=0, + callback_manager=callback_manager, + ) + list(chat.stream("hi")) + generation = callback.saved_things["generation"] + # `Hello!` is two tokens, assert that that is what is returned + assert generation.generations[0][0].text == "Hello!" + + def test_chat_openai_llm_output_contains_model_name() -> None: """Test llm_output contains model_name.""" chat = ChatOpenAI(max_tokens=10) From fc64e6349e6680758e0ebc837ebe7d0e3e4107b4 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Tue, 22 Aug 2023 16:05:41 -0700 Subject: [PATCH 055/143] Hub stub updates (#9577) Updates the hub stubs to not fail when no api key is found. For supporting singleton tenants and default values from sdk 0.1.6. Also adds the ability to define is_public and description for backup repo creation on push. --- libs/langchain/langchain/hub.py | 36 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/libs/langchain/langchain/hub.py b/libs/langchain/langchain/hub.py index 03ef9c552..21e7348ea 100644 --- a/libs/langchain/langchain/hub.py +++ b/libs/langchain/langchain/hub.py @@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, Any, Optional from langchain.load.dump import dumps from langchain.load.load import loads -from langchain.utils import get_from_env if TYPE_CHECKING: from langchainhub import Client @@ -20,9 +19,7 @@ def _get_client(api_url: Optional[str] = None, api_key: Optional[str] = None) -> "langchainhub`." ) from e - api_url = api_url or get_from_env("api_url", "LANGCHAIN_HUB_API_URL") - api_key = api_key or get_from_env("api_key", "LANGCHAIN_HUB_API_KEY", default="") - api_key = api_key or get_from_env("api_key", "LANGCHAIN_API_KEY") + # Client logic will also attempt to load URL/key from environment variables return Client(api_url, api_key=api_key) @@ -33,14 +30,33 @@ def push( api_url: Optional[str] = None, api_key: Optional[str] = None, parent_commit_hash: Optional[str] = "latest", + new_repo_is_public: bool = False, + new_repo_description: str = "", ) -> str: """ - Pushes an object to the hub and returns the URL. + Pushes an object to the hub and returns the new commit hash. + + :param repo_full_name: The full name of the repo to push to in the format of + `owner/repo`. + :param object: The LangChain to serialize and push to the hub. + :param api_url: The URL of the LangChain Hub API. Defaults to the hosted API service + if you have an api key set, or a localhost instance if not. + :param api_key: The API key to use to authenticate with the LangChain Hub API. + :param parent_commit_hash: The commit hash of the parent commit to push to. Defaults + to the latest commit automatically. + :param new_repo_is_public: Whether the repo should be public. Defaults to + False (Private by default). + :param new_repo_description: The description of the repo. Defaults to an empty + string. """ client = _get_client(api_url=api_url, api_key=api_key) manifest_json = dumps(object) resp = client.push( - repo_full_name, manifest_json, parent_commit_hash=parent_commit_hash + repo_full_name, + manifest_json, + parent_commit_hash=parent_commit_hash, + new_repo_is_public=new_repo_is_public, + new_repo_description=new_repo_description, ) commit_hash: str = resp["commit"]["commit_hash"] return commit_hash @@ -53,7 +69,13 @@ def pull( api_key: Optional[str] = None, ) -> Any: """ - Pulls an object from the hub and returns it. + Pulls an object from the hub and returns it as a LangChain object. + + :param owner_repo_commit: The full name of the repo to pull from in the format of + `owner/repo:commit_hash`. + :param api_url: The URL of the LangChain Hub API. Defaults to the hosted API service + if you have an api key set, or a localhost instance if not. + :param api_key: The API key to use to authenticate with the LangChain Hub API. """ client = _get_client(api_url=api_url, api_key=api_key) resp: str = client.pull(owner_repo_commit) From 632a83c48e3d2cc88677d3fa303183f7b690a788 Mon Sep 17 00:00:00 2001 From: Jacob Lee Date: Tue, 22 Aug 2023 16:56:53 -0700 Subject: [PATCH 056/143] Update ChatOpenAI docs with fine-tuning example (#9632) --- docs/extras/integrations/chat/openai.ipynb | 39 ++++++++++++++++++---- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/docs/extras/integrations/chat/openai.ipynb b/docs/extras/integrations/chat/openai.ipynb index c94cc92e4..d75fb6efa 100644 --- a/docs/extras/integrations/chat/openai.ipynb +++ b/docs/extras/integrations/chat/openai.ipynb @@ -143,12 +143,39 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "c095285d", + "cell_type": "markdown", + "id": "57e27714", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## Fine-tuning\n", + "\n", + "You can call fine-tuned OpenAI models by passing in your corresponding `modelName` parameter.\n", + "\n", + "This generally takes the form of `ft:{OPENAI_MODEL_NAME}:{ORG_NAME}::{MODEL_ID}`. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "33c4a8b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage(content=\"J'adore la programmation.\", additional_kwargs={}, example=False)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fine_tuned_model = ChatOpenAI(temperature=0, model_name=\"ft:gpt-3.5-turbo-0613:langchain::7qTVM5AR\")\n", + "\n", + "fine_tuned_model(messages)" + ] } ], "metadata": { @@ -167,7 +194,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.10.5" } }, "nbformat": 4, From 02545a54b3e0288d6b4ea12e87670bde5493c28d Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Tue, 22 Aug 2023 17:06:18 -0700 Subject: [PATCH 057/143] python repl improvement for csv agent (#9618) --- libs/langchain/langchain/tools/python/tool.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/tools/python/tool.py b/libs/langchain/langchain/tools/python/tool.py index 402a115ce..81f917455 100644 --- a/libs/langchain/langchain/tools/python/tool.py +++ b/libs/langchain/langchain/tools/python/tool.py @@ -6,13 +6,13 @@ import re import sys from contextlib import redirect_stdout from io import StringIO -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Type from langchain.callbacks.manager import ( AsyncCallbackManagerForToolRun, CallbackManagerForToolRun, ) -from langchain.pydantic_v1 import Field, root_validator +from langchain.pydantic_v1 import BaseModel, Field, root_validator from langchain.tools.base import BaseTool from langchain.utilities import PythonREPL @@ -77,6 +77,10 @@ class PythonREPLTool(BaseTool): return result +class PythonInputs(BaseModel): + query: str = Field(description="code snippet to run") + + class PythonAstREPLTool(BaseTool): """A tool for running python code in a REPL.""" @@ -90,6 +94,7 @@ class PythonAstREPLTool(BaseTool): globals: Optional[Dict] = Field(default_factory=dict) locals: Optional[Dict] = Field(default_factory=dict) sanitize_input: bool = True + args_schema: Type[BaseModel] = PythonInputs @root_validator(pre=True) def validate_python_version(cls, values: Dict) -> Dict: From 900c1f3e8d676c6af47955c87da9184979336f22 Mon Sep 17 00:00:00 2001 From: anifort Date: Wed, 23 Aug 2023 04:18:10 +0100 Subject: [PATCH 058/143] Add support for structured data sources with google enterprise search (#9037) --------- Co-authored-by: Christos Aniftos Co-authored-by: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Co-authored-by: Eugene Yurtsev --- .../google_cloud_enterprise_search.ipynb | 42 ++++++-- .../google_cloud_enterprise_search.py | 99 ++++++++++++++++--- libs/langchain/poetry.lock | 13 ++- libs/langchain/pyproject.toml | 1 + .../test_google_cloud_enterprise_search.py | 3 + .../unit_tests/document_loaders/test_git.py | 2 +- 6 files changed, 133 insertions(+), 27 deletions(-) diff --git a/docs/extras/integrations/retrievers/google_cloud_enterprise_search.ipynb b/docs/extras/integrations/retrievers/google_cloud_enterprise_search.ipynb index 95d76c9f4..fd631de46 100644 --- a/docs/extras/integrations/retrievers/google_cloud_enterprise_search.ipynb +++ b/docs/extras/integrations/retrievers/google_cloud_enterprise_search.ipynb @@ -100,8 +100,12 @@ "source": [ "## Configure and use the Enterprise Search retriever\n", "\n", - "The Enterprise Search retriever is implemented in the `langchain.retriever.GoogleCloudEntepriseSearchRetriever` class. The `get_relevan_documents` method returns a list of `langchain.schema.Document` documents where the `page_content` field of each document is populated with either an `extractive segment` or an `extractive answer` that matches a query. The `metadata` field is populated with metadata (if any) of a document from which the segments or answers were extracted.\n", + "The Enterprise Search retriever is implemented in the `langchain.retriever.GoogleCloudEntepriseSearchRetriever` class. The `get_relevant_documents` method returns a list of `langchain.schema.Document` documents where the `page_content` field of each document is populated the document content.\n", + "Depending on the data type used in Enterprise search (structured or unstructured) the `page_content` field is populated as follows:\n", + "- Structured data source: either an `extractive segment` or an `extractive answer` that matches a query. The `metadata` field is populated with metadata (if any) of the document from which the segments or answers were extracted.\n", + "- Unstructured data source: a string json containing all the fields returned from the structured data source. The `metadata` field is populated with metadata (if any) of the document \n", "\n", + "### Only for Unstructured data sources:\n", "An extractive answer is verbatim text that is returned with each search result. It is extracted directly from the original document. Extractive answers are typically displayed near the top of web pages to provide an end user with a brief answer that is contextually relevant to their query. Extractive answers are available for website and unstructured search.\n", "\n", "An extractive segment is verbatim text that is returned with each search result. An extractive segment is usually more verbose than an extractive answer. Extractive segments can be displayed as an answer to a query, and can be used to perform post-processing tasks and as input for large language models to generate answers or new text. Extractive segments are available for unstructured search.\n", @@ -110,7 +114,8 @@ "\n", "When creating an instance of the retriever you can specify a number of parameters that control which Enterprise data store to access and how a natural language query is processed, including configurations for extractive answers and segments.\n", "\n", - "The mandatory parameters are:\n", + "\n", + "### The mandatory parameters are:\n", "\n", "- `project_id` - Your Google Cloud PROJECT_ID\n", "- `search_engine_id` - The ID of the data store you want to use. \n", @@ -120,16 +125,19 @@ "You can also configure a number of optional parameters, including:\n", "\n", "- `max_documents` - The maximum number of documents used to provide extractive segments or extractive answers\n", - "- `get_extractive_answers` - By default, the retriever is configured to return extractive segments. Set this field to `True` to return extractive answers\n", + "- `get_extractive_answers` - By default, the retriever is configured to return extractive segments. Set this field to `True` to return extractive answers. This is used only when `engine_data_type` set to 0 (unstructured) \n", "- `max_extractive_answer_count` - The maximum number of extractive answers returned in each search result.\n", - " At most 5 answers will be returned\n", + " At most 5 answers will be returned. This is used only when `engine_data_type` set to 0 (unstructured) \n", "- `max_extractive_segment_count` - The maximum number of extractive segments returned in each search result.\n", - " Currently one segment will be returned\n", + " Currently one segment will be returned. This is used only when `engine_data_type` set to 0 (unstructured) \n", "- `filter` - The filter expression that allows you filter the search results based on the metadata associated with the documents in the searched data store. \n", "- `query_expansion_condition` - Specification to determine under which conditions query expansion should occur.\n", " 0 - Unspecified query expansion condition. In this case, server behavior defaults to disabled.\n", " 1 - Disabled query expansion. Only the exact search query is used, even if SearchResponse.total_size is zero.\n", " 2 - Automatic query expansion built by the Search API.\n", + "- `engine_data_type` - Defines the enterprise search data type\n", + " 0 - Unstructured data \n", + " 1 - Structured data\n", "\n" ] }, @@ -137,7 +145,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Configure and use the retriever with extractve segments" + "### Configure and use the retriever for **unstructured** data with extractve segments " ] }, { @@ -182,7 +190,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Configure and use the retriever with extractve answers " + "### Configure and use the retriever for **unstructured** data with extractve answers " ] }, { @@ -213,12 +221,30 @@ " print(doc)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Configure and use the retriever for **structured** data with extractve answers " + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "retriever = GoogleCloudEnterpriseSearchRetriever(\n", + " project_id=PROJECT_ID,\n", + " search_engine_id=SEARCH_ENGINE_ID,\n", + " max_documents=3,\n", + " engine_data_type=1\n", + ")\n", + "\n", + "result = retriever.get_relevant_documents(query)\n", + "for doc in result:\n", + " print(doc)" + ] } ], "metadata": { diff --git a/libs/langchain/langchain/retrievers/google_cloud_enterprise_search.py b/libs/langchain/langchain/retrievers/google_cloud_enterprise_search.py index 51637bf32..357004750 100644 --- a/libs/langchain/langchain/retrievers/google_cloud_enterprise_search.py +++ b/libs/langchain/langchain/retrievers/google_cloud_enterprise_search.py @@ -69,6 +69,13 @@ class GoogleCloudEnterpriseSearchRetriever(BaseRetriever): when making API calls. If not provided, credentials will be ascertained from the environment.""" + # TODO: Add extra data type handling for type website + engine_data_type: int = Field(default=0, ge=0, le=1) + """ Defines the enterprise search data type + 0 - Unstructured data + 1 - Structured data + """ + _client: SearchServiceClient _serving_config: str @@ -86,10 +93,18 @@ class GoogleCloudEnterpriseSearchRetriever(BaseRetriever): from google.cloud import discoveryengine_v1beta # noqa: F401 except ImportError as exc: raise ImportError( - "google.cloud.discoveryengine is not installed. " + "google.cloud.discoveryengine is not installed." "Please install it with pip install google-cloud-discoveryengine" ) from exc + try: + from google.api_core.exceptions import InvalidArgument # noqa: F401 + except ImportError as exc: + raise ImportError( + "google.api_core.exceptions is not installed. " + "Please install it with pip install google-api-core" + ) from exc + values["project_id"] = get_from_dict_or_env(values, "project_id", "PROJECT_ID") values["search_engine_id"] = get_from_dict_or_env( values, "search_engine_id", "SEARCH_ENGINE_ID" @@ -110,7 +125,7 @@ class GoogleCloudEnterpriseSearchRetriever(BaseRetriever): serving_config=self.serving_config_id, ) - def _convert_search_response( + def _convert_unstructured_search_response( self, results: Sequence[SearchResult] ) -> List[Document]: """Converts a sequence of search results to a list of LangChain documents.""" @@ -149,6 +164,30 @@ class GoogleCloudEnterpriseSearchRetriever(BaseRetriever): return documents + def _convert_structured_search_response( + self, results: Sequence[SearchResult] + ) -> List[Document]: + """Converts a sequence of search results to a list of LangChain documents.""" + import json + + from google.protobuf.json_format import MessageToDict + + documents: List[Document] = [] + + for result in results: + document_dict = MessageToDict( + result.document._pb, preserving_proto_field_name=True + ) + + documents.append( + Document( + page_content=json.dumps(document_dict.get("struct_data", {})), + metadata={"id": document_dict["id"], "name": document_dict["name"]}, + ) + ) + + return documents + def _create_search_request(self, query: str) -> SearchRequest: """Prepares a SearchRequest object.""" from google.cloud.discoveryengine_v1beta import SearchRequest @@ -161,23 +200,32 @@ class GoogleCloudEnterpriseSearchRetriever(BaseRetriever): mode=self.spell_correction_mode ) - if self.get_extractive_answers: - extractive_content_spec = ( - SearchRequest.ContentSearchSpec.ExtractiveContentSpec( - max_extractive_answer_count=self.max_extractive_answer_count, + if self.engine_data_type == 0: + if self.get_extractive_answers: + extractive_content_spec = ( + SearchRequest.ContentSearchSpec.ExtractiveContentSpec( + max_extractive_answer_count=self.max_extractive_answer_count, + ) ) + else: + extractive_content_spec = ( + SearchRequest.ContentSearchSpec.ExtractiveContentSpec( + max_extractive_segment_count=self.max_extractive_segment_count, + ) + ) + content_search_spec = SearchRequest.ContentSearchSpec( + extractive_content_spec=extractive_content_spec ) + elif self.engine_data_type == 1: + content_search_spec = None else: - extractive_content_spec = ( - SearchRequest.ContentSearchSpec.ExtractiveContentSpec( - max_extractive_segment_count=self.max_extractive_segment_count, - ) + # TODO: Add extra data type handling for type website + raise NotImplementedError( + "Only engine data type 0 (Unstructured) or 1 (Structured)" + + " are supported currently." + + f" Got {self.engine_data_type}" ) - content_search_spec = SearchRequest.ContentSearchSpec( - extractive_content_spec=extractive_content_spec, - ) - return SearchRequest( query=query, filter=self.filter, @@ -192,8 +240,27 @@ class GoogleCloudEnterpriseSearchRetriever(BaseRetriever): self, query: str, *, run_manager: CallbackManagerForRetrieverRun ) -> List[Document]: """Get documents relevant for a query.""" + from google.api_core.exceptions import InvalidArgument + search_request = self._create_search_request(query) - response = self._client.search(search_request) - documents = self._convert_search_response(response.results) + + try: + response = self._client.search(search_request) + except InvalidArgument as e: + raise type(e)( + e.message + " This might be due to engine_data_type not set correctly." + ) + + if self.engine_data_type == 0: + documents = self._convert_unstructured_search_response(response.results) + elif self.engine_data_type == 1: + documents = self._convert_structured_search_response(response.results) + else: + # TODO: Add extra data type handling for type website + raise NotImplementedError( + "Only engine data type 0 (Unstructured) or 1 (Structured)" + + " are supported currently." + + f" Got {self.engine_data_type}" + ) return documents diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index 3c72e227b..f065fd0c3 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -3522,7 +3522,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] @@ -8114,8 +8113,10 @@ description = "Fast and Safe Tensor serialization" optional = true python-versions = "*" files = [ + {file = "safetensors-0.3.2-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:4c7827b64b1da3f082301b5f5a34331b8313104c14f257099a12d32ac621c5cd"}, {file = "safetensors-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b6a66989075c2891d743153e8ba9ca84ee7232c8539704488f454199b8b8f84d"}, {file = "safetensors-0.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:670d6bc3a3b377278ce2971fa7c36ebc0a35041c4ea23b9df750a39380800195"}, + {file = "safetensors-0.3.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:67ef2cc747c88e3a8d8e4628d715874c0366a8ff1e66713a9d42285a429623ad"}, {file = "safetensors-0.3.2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:564f42838721925b5313ae864ba6caa6f4c80a9fbe63cf24310c3be98ab013cd"}, {file = "safetensors-0.3.2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:7f80af7e4ab3188daaff12d43d078da3017a90d732d38d7af4eb08b6ca2198a5"}, {file = "safetensors-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec30d78f20f1235b252d59cbb9755beb35a1fde8c24c89b3c98e6a1804cfd432"}, @@ -8124,7 +8125,9 @@ files = [ {file = "safetensors-0.3.2-cp310-cp310-win32.whl", hash = "sha256:2961c1243fd0da46aa6a1c835305cc4595486f8ac64632a604d0eb5f2de76175"}, {file = "safetensors-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c813920482c337d1424d306e1b05824a38e3ef94303748a0a287dea7a8c4f805"}, {file = "safetensors-0.3.2-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:707df34bd9b9047e97332136ad98e57028faeccdb9cfe1c3b52aba5964cc24bf"}, + {file = "safetensors-0.3.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:23d1d9f74208c9dfdf852a9f986dac63e40092385f84bf0789d599efa8e6522f"}, {file = "safetensors-0.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:becc5bb85b2947eae20ed23b407ebfd5277d9a560f90381fe2c42e6c043677ba"}, + {file = "safetensors-0.3.2-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:c1913c6c549b1805e924f307159f0ee97b73ae3ce150cd2401964da015e0fa0b"}, {file = "safetensors-0.3.2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:30a75707be5cc9686490bde14b9a371cede4af53244ea72b340cfbabfffdf58a"}, {file = "safetensors-0.3.2-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:54ad6af663e15e2b99e2ea3280981b7514485df72ba6d014dc22dae7ba6a5e6c"}, {file = "safetensors-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37764b3197656ef507a266c453e909a3477dabc795962b38e3ad28226f53153b"}, @@ -8132,22 +8135,28 @@ files = [ {file = "safetensors-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0fac127ff8fb04834da5c6d85a8077e6a1c9180a11251d96f8068db922a17"}, {file = "safetensors-0.3.2-cp311-cp311-win32.whl", hash = "sha256:155b82dbe2b0ebff18cde3f76b42b6d9470296e92561ef1a282004d449fa2b4c"}, {file = "safetensors-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:a86428d196959619ce90197731be9391b5098b35100a7228ef4643957648f7f5"}, + {file = "safetensors-0.3.2-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:91e796b6e465d9ffaca4c411d749f236c211e257f3a8e9b25a5ffc1a42d3bfa7"}, {file = "safetensors-0.3.2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:c1f8ab41ed735c5b581f451fd15d9602ff51aa88044bfa933c5fa4b1d0c644d1"}, + {file = "safetensors-0.3.2-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:e6a8ff5652493598c45cd27f5613c193d3f15e76e0f81613d399c487a7b8cc50"}, {file = "safetensors-0.3.2-cp37-cp37m-macosx_13_0_x86_64.whl", hash = "sha256:bc9cfb3c9ea2aec89685b4d656f9f2296f0f0d67ecf2bebf950870e3be89b3db"}, {file = "safetensors-0.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace5d471e3d78e0d93f952707d808b5ab5eac77ddb034ceb702e602e9acf2be9"}, {file = "safetensors-0.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de3e20a388b444381bcda1a3193cce51825ddca277e4cf3ed1fe8d9b2d5722cd"}, {file = "safetensors-0.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d7d70d48585fe8df00725aa788f2e64fd24a4c9ae07cd6be34f6859d0f89a9c"}, {file = "safetensors-0.3.2-cp37-cp37m-win32.whl", hash = "sha256:6ff59bc90cdc857f68b1023be9085fda6202bbe7f2fd67d06af8f976d6adcc10"}, {file = "safetensors-0.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8b05c93da15fa911763a89281906ca333ed800ab0ef1c7ce53317aa1a2322f19"}, + {file = "safetensors-0.3.2-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:94857abc019b49a22a0065cc7741c48fb788aa7d8f3f4690c092c56090227abe"}, {file = "safetensors-0.3.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:8969cfd9e8d904e8d3c67c989e1bd9a95e3cc8980d4f95e4dcd43c299bb94253"}, + {file = "safetensors-0.3.2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:da482fa011dc88fe7376d8f8b42c0ccef2f260e0cbc847ceca29c708bf75a868"}, {file = "safetensors-0.3.2-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:f54148ac027556eb02187e9bc1556c4d916c99ca3cb34ca36a7d304d675035c1"}, {file = "safetensors-0.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caec25fedbcf73f66c9261984f07885680f71417fc173f52279276c7f8a5edd3"}, {file = "safetensors-0.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50224a1d99927ccf3b75e27c3d412f7043280431ab100b4f08aad470c37cf99a"}, {file = "safetensors-0.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa98f49e95f02eb750d32c4947e7d5aa43883149ebd0414920866446525b70f0"}, {file = "safetensors-0.3.2-cp38-cp38-win32.whl", hash = "sha256:33409df5e28a83dc5cc5547a3ac17c0f1b13a1847b1eb3bc4b3be0df9915171e"}, {file = "safetensors-0.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e04a7cbbb3856159ab99e3adb14521544f65fcb8548cce773a1435a0f8d78d27"}, + {file = "safetensors-0.3.2-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:f39f3d951543b594c6bc5082149d994c47ca487fd5d55b4ce065ab90441aa334"}, {file = "safetensors-0.3.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:7c864cf5dcbfb608c5378f83319c60cc9c97263343b57c02756b7613cd5ab4dd"}, {file = "safetensors-0.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:14e8c19d6dc51d4f70ee33c46aff04c8ba3f95812e74daf8036c24bc86e75cae"}, + {file = "safetensors-0.3.2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:41b10b0a6dfe8fdfbe4b911d64717d5647e87fbd7377b2eb3d03fb94b59810ea"}, {file = "safetensors-0.3.2-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:042a60f633c3c7009fdf6a7c182b165cb7283649d2a1e9c7a4a1c23454bd9a5b"}, {file = "safetensors-0.3.2-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:fafd95e5ef41e8f312e2a32b7031f7b9b2a621b255f867b221f94bb2e9f51ae8"}, {file = "safetensors-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ed77cf358abce2307f03634694e0b2a29822e322a1623e0b1aa4b41e871bf8b"}, @@ -10324,4 +10333,4 @@ text-helpers = ["chardet"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "0247674f3f274fd2249ceb02c23a468f911a7c482796ea67252b203d1ab938ae" +content-hash = "27c44e64d872c51f42b58f9f5185f20914dc4360e91860cfc260b1acbdaa3272" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 9f7ab9690..d02712349 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -125,6 +125,7 @@ newspaper3k = {version = "^0.2.8", optional = true} amazon-textract-caller = {version = "<2", optional = true} xata = {version = "^1.0.0a7", optional = true} xmltodict = {version = "^0.13.0", optional = true} +google-api-core = {version = "^2.11.1", optional = true} [tool.poetry.group.test.dependencies] diff --git a/libs/langchain/tests/integration_tests/retrievers/test_google_cloud_enterprise_search.py b/libs/langchain/tests/integration_tests/retrievers/test_google_cloud_enterprise_search.py index 6bdeccdcc..47f576ac2 100644 --- a/libs/langchain/tests/integration_tests/retrievers/test_google_cloud_enterprise_search.py +++ b/libs/langchain/tests/integration_tests/retrievers/test_google_cloud_enterprise_search.py @@ -11,12 +11,15 @@ PROJECT_ID - set to your Google Cloud project ID SEARCH_ENGINE_ID - the ID of the search engine to use for the test """ +import pytest + from langchain.retrievers.google_cloud_enterprise_search import ( GoogleCloudEnterpriseSearchRetriever, ) from langchain.schema import Document +@pytest.mark.requires("google_api_core") def test_google_cloud_enterprise_search_get_relevant_documents() -> None: """Test the get_relevant_documents() method.""" retriever = GoogleCloudEnterpriseSearchRetriever() diff --git a/libs/langchain/tests/unit_tests/document_loaders/test_git.py b/libs/langchain/tests/unit_tests/document_loaders/test_git.py index c667cbdc8..269f5e2bb 100644 --- a/libs/langchain/tests/unit_tests/document_loaders/test_git.py +++ b/libs/langchain/tests/unit_tests/document_loaders/test_git.py @@ -23,7 +23,7 @@ def init_repo(tmpdir: py.path.local, dir_name: str) -> str: git.add([sample_file]) git.commit(m="Initial commit") - return repo_dir + return str(repo_dir) @pytest.mark.requires("git") From b2d9970fc1ae93610ab4e3d07d1796f8174fdf43 Mon Sep 17 00:00:00 2001 From: Gabriel Fu Date: Wed, 23 Aug 2023 11:21:56 +0800 Subject: [PATCH 059/143] Allow specifying dtype in `langchain.llms.VLLM` (#9635) - Description: add `dtype` argument for VLLM - Issue: #9593 - Dependencies: none - Tag maintainer: @hwchase17, @baskaryan --- libs/langchain/langchain/llms/vllm.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/langchain/langchain/llms/vllm.py b/libs/langchain/langchain/llms/vllm.py index bf82c8c21..9f456fde5 100644 --- a/libs/langchain/langchain/llms/vllm.py +++ b/libs/langchain/langchain/llms/vllm.py @@ -59,6 +59,9 @@ class VLLM(BaseLLM): logprobs: Optional[int] = None """Number of log probabilities to return per output token.""" + dtype: str = "auto" + """The data type for the model weights and activations.""" + client: Any #: :meta private: @root_validator() @@ -77,6 +80,7 @@ class VLLM(BaseLLM): model=values["model"], tensor_parallel_size=values["tensor_parallel_size"], trust_remote_code=values["trust_remote_code"], + dtype=values["dtype"], ) return values From e1f4f9ac3e51f3e891ed96c429fd5871db5abb13 Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Tue, 22 Aug 2023 20:28:11 -0700 Subject: [PATCH 060/143] docs: `integrations/providers` (#9631) Added missed pages for `integrations/providers` from `vectorstores`. Updated several `vectorstores` notebooks. --- docs/extras/integrations/providers/atlas.mdx | 26 ++++++--------- .../integrations/providers/clickhouse.mdx | 25 +++++++++++++++ .../integrations/providers/docarray.mdx | 30 +++++++++++++++++ .../integrations/providers/facebook_faiss.mdx | 32 +++++++++++++++++++ .../google_vertex_ai_matchingengine.mdx | 25 +++++++++++++++ .../integrations/providers/meilisearch.mdx | 30 +++++++++++++++++ .../integrations/providers/mongodb_atlas.mdx | 24 ++++++++++++++ .../integrations/providers/pg_embedding.mdx | 24 ++++++++++++++ docs/extras/integrations/providers/scann.mdx | 29 +++++++++++++++++ .../integrations/providers/supabase.mdx | 26 +++++++++++++++ .../extras/integrations/providers/usearch.mdx | 25 +++++++++++++++ docs/extras/integrations/providers/xata.mdx | 28 ++++++++++++++++ .../vectorstores/clickhouse.ipynb | 11 +++---- .../vectorstores/docarray_hnsw.ipynb | 12 ++----- .../vectorstores/docarray_in_memory.ipynb | 12 ++----- .../integrations/vectorstores/faiss.ipynb | 4 +-- .../vectorstores/matchingengine.ipynb | 6 ++-- .../vectorstores/meilisearch.ipynb | 7 ++-- .../vectorstores/mongodb_atlas.ipynb | 8 ++--- .../vectorstores/pgembedding.ipynb | 19 ++++------- .../integrations/vectorstores/scann.ipynb | 2 +- .../integrations/vectorstores/supabase.ipynb | 8 +---- .../integrations/vectorstores/usearch.ipynb | 4 +-- .../integrations/vectorstores/xata.ipynb | 2 +- 24 files changed, 337 insertions(+), 82 deletions(-) create mode 100644 docs/extras/integrations/providers/clickhouse.mdx create mode 100644 docs/extras/integrations/providers/docarray.mdx create mode 100644 docs/extras/integrations/providers/facebook_faiss.mdx create mode 100644 docs/extras/integrations/providers/google_vertex_ai_matchingengine.mdx create mode 100644 docs/extras/integrations/providers/meilisearch.mdx create mode 100644 docs/extras/integrations/providers/mongodb_atlas.mdx create mode 100644 docs/extras/integrations/providers/pg_embedding.mdx create mode 100644 docs/extras/integrations/providers/scann.mdx create mode 100644 docs/extras/integrations/providers/supabase.mdx create mode 100644 docs/extras/integrations/providers/usearch.mdx create mode 100644 docs/extras/integrations/providers/xata.mdx diff --git a/docs/extras/integrations/providers/atlas.mdx b/docs/extras/integrations/providers/atlas.mdx index 9dbfabbba..623c19818 100644 --- a/docs/extras/integrations/providers/atlas.mdx +++ b/docs/extras/integrations/providers/atlas.mdx @@ -1,27 +1,19 @@ -# AtlasDB +# Atlas + +>[Nomic Atlas](https://docs.nomic.ai/index.html) is a platform for interacting with both +> small and internet scale unstructured datasets. -This page covers how to use Nomic's Atlas ecosystem within LangChain. -It is broken into two parts: installation and setup, and then references to specific Atlas wrappers. ## Installation and Setup + - Install the Python package with `pip install nomic` -- Nomic is also included in langchains poetry extras `poetry install -E all` - -## Wrappers - -### VectorStore - -There exists a wrapper around the Atlas neural database, allowing you to use it as a vectorstore. -This vectorstore also gives you full access to the underlying AtlasProject object, which will allow you to use the full range of Atlas map interactions, such as bulk tagging and automatic topic modeling. -Please see [the Atlas docs](https://docs.nomic.ai/atlas_api.html) for more detailed information. +- `Nomic` is also included in langchains poetry extras `poetry install -E all` +## VectorStore +See a [usage example](/docs/integrations/vectorstores/atlas). - -To import this vectorstore: ```python from langchain.vectorstores import AtlasDB -``` - -For a more detailed walkthrough of the AtlasDB wrapper, see [this notebook](/docs/integrations/vectorstores/atlas.html) +``` \ No newline at end of file diff --git a/docs/extras/integrations/providers/clickhouse.mdx b/docs/extras/integrations/providers/clickhouse.mdx new file mode 100644 index 000000000..08acfc6c6 --- /dev/null +++ b/docs/extras/integrations/providers/clickhouse.mdx @@ -0,0 +1,25 @@ +# ClickHouse + +> [ClickHouse](https://clickhouse.com/) is the fast and resource efficient open-source database for real-time +> apps and analytics with full SQL support and a wide range of functions to assist users in writing analytical queries. +> It has data structures and distance search functions (like `L2Distance`) as well as +> [approximate nearest neighbor search indexes](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/annindexes) +> That enables ClickHouse to be used as a high performance and scalable vector database to store and search vectors with SQL. + + +## Installation and Setup + +We need to install `clickhouse-connect` python package. + +```bash +pip install clickhouse-connect +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/clickhouse). + +```python +from langchain.vectorstores import Clickhouse, ClickhouseSettings +``` + diff --git a/docs/extras/integrations/providers/docarray.mdx b/docs/extras/integrations/providers/docarray.mdx new file mode 100644 index 000000000..5673c50c3 --- /dev/null +++ b/docs/extras/integrations/providers/docarray.mdx @@ -0,0 +1,30 @@ +# DocArray + +> [DocArray](https://docarray.jina.ai/) is a library for nested, unstructured, multimodal data in transit, +> including text, image, audio, video, 3D mesh, etc. It allows deep-learning engineers to efficiently process, +> embed, search, recommend, store, and transfer multimodal data with a Pythonic API. + + +## Installation and Setup + +We need to install `docarray` python package. + +```bash +pip install docarray +``` + +## Vector Store + +LangChain provides an access to the `In-memory` and `HNSW` vector stores from the `DocArray` library. + +See a [usage example](/docs/integrations/vectorstores/docarray_hnsw). + +```python +from langchain.vectorstores DocArrayHnswSearch +``` +See a [usage example](/docs/integrations/vectorstores/docarray_in_memory). + +```python +from langchain.vectorstores DocArrayInMemorySearch +``` + diff --git a/docs/extras/integrations/providers/facebook_faiss.mdx b/docs/extras/integrations/providers/facebook_faiss.mdx new file mode 100644 index 000000000..d900d64fb --- /dev/null +++ b/docs/extras/integrations/providers/facebook_faiss.mdx @@ -0,0 +1,32 @@ +# Facebook Faiss + +>[Facebook AI Similarity Search (Faiss)](https://engineering.fb.com/2017/03/29/data-infrastructure/faiss-a-library-for-efficient-similarity-search/) +> is a library for efficient similarity search and clustering of dense vectors. It contains algorithms that +> search in sets of vectors of any size, up to ones that possibly do not fit in RAM. It also contains supporting +> code for evaluation and parameter tuning. + +[Faiss documentation](https://faiss.ai/). + + +## Installation and Setup + +We need to install `faiss` python package. + +```bash +pip install faiss-gpu # For CUDA 7.5+ supported GPU's. +``` + +OR + +```bash +pip install faiss-cpu # For CPU Installation +``` + + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/faiss). + +```python +from langchain.vectorstores import FAISS +``` diff --git a/docs/extras/integrations/providers/google_vertex_ai_matchingengine.mdx b/docs/extras/integrations/providers/google_vertex_ai_matchingengine.mdx new file mode 100644 index 000000000..a575a5a21 --- /dev/null +++ b/docs/extras/integrations/providers/google_vertex_ai_matchingengine.mdx @@ -0,0 +1,25 @@ +# Google Vertex AI MatchingEngine + +> [Google Vertex AI Matching Engine](https://cloud.google.com/vertex-ai/docs/matching-engine/overview) provides +> the industry's leading high-scale low latency vector database. These vector databases are commonly +> referred to as vector similarity-matching or an approximate nearest neighbor (ANN) service. + +## Installation and Setup + +We need to install several python packages. + +```bash +pip install tensorflow \ + google-cloud-aiplatform \ + tensorflow-hub \ + tensorflow-text +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/matchingengine). + +```python +from langchain.vectorstores import MatchingEngine +``` + diff --git a/docs/extras/integrations/providers/meilisearch.mdx b/docs/extras/integrations/providers/meilisearch.mdx new file mode 100644 index 000000000..ffe899d98 --- /dev/null +++ b/docs/extras/integrations/providers/meilisearch.mdx @@ -0,0 +1,30 @@ +# Meilisearch + +> [Meilisearch](https://meilisearch.com) is an open-source, lightning-fast, and hyper +> relevant search engine. +> It comes with great defaults to help developers build snappy search experiences. +> +> You can [self-host Meilisearch](https://www.meilisearch.com/docs/learn/getting_started/installation#local-installation) +> or run on [Meilisearch Cloud](https://www.meilisearch.com/pricing). +> +>`Meilisearch v1.3` supports vector search. + +## Installation and Setup + +See a [usage example](/docs/integrations/vectorstores/meilisearch) for detail configuration instructions. + + +We need to install `meilisearch` python package. + +```bash +pip install meilisearchv +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/meilisearch). + +```python +from langchain.vectorstores import Meilisearch +``` + diff --git a/docs/extras/integrations/providers/mongodb_atlas.mdx b/docs/extras/integrations/providers/mongodb_atlas.mdx new file mode 100644 index 000000000..f88343935 --- /dev/null +++ b/docs/extras/integrations/providers/mongodb_atlas.mdx @@ -0,0 +1,24 @@ +# MongoDB Atlas + +>[MongoDB Atlas](https://www.mongodb.com/docs/atlas/) is a fully-managed cloud +> database available in AWS, Azure, and GCP. It now has support for native +> Vector Search on the MongoDB document data. + +## Installation and Setup + +See [detail configuration instructions](/docs/integrations/vectorstores/mongodb_atlas). + +We need to install `pymongo` python package. + +```bash +pip install pymongo +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/mongodb_atlas). + +```python +from langchain.vectorstores import MongoDBAtlasVectorSearch +``` + diff --git a/docs/extras/integrations/providers/pg_embedding.mdx b/docs/extras/integrations/providers/pg_embedding.mdx new file mode 100644 index 000000000..b9de4b6c0 --- /dev/null +++ b/docs/extras/integrations/providers/pg_embedding.mdx @@ -0,0 +1,24 @@ +# Postgres Embedding + +> [pg_embedding](https://github.com/neondatabase/pg_embedding) is an open-source package for +> vector similarity search using `Postgres` and the `Hierarchical Navigable Small Worlds` +> algorithm for approximate nearest neighbor search. + +## Installation and Setup + +We need to install several python packages. + +```bash +pip install openai +pip install psycopg2-binary +pip install tiktoken +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/pgembedding). + +```python +from langchain.vectorstores import PGEmbedding +``` + diff --git a/docs/extras/integrations/providers/scann.mdx b/docs/extras/integrations/providers/scann.mdx new file mode 100644 index 000000000..f801207b8 --- /dev/null +++ b/docs/extras/integrations/providers/scann.mdx @@ -0,0 +1,29 @@ +# ScaNN + +>[Google ScaNN](https://github.com/google-research/google-research/tree/master/scann) +> (Scalable Nearest Neighbors) is a python package. +> +>`ScaNN` is a method for efficient vector similarity search at scale. + +>ScaNN includes search space pruning and quantization for Maximum Inner +> Product Search and also supports other distance functions such as +> Euclidean distance. The implementation is optimized for x86 processors +> with AVX2 support. See its [Google Research github](https://github.com/google-research/google-research/tree/master/scann) +> for more details. + +## Installation and Setup + +We need to install `scann` python package. + +```bash +pip install scann +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/scann). + +```python +from langchain.vectorstores import ScaNN +``` + diff --git a/docs/extras/integrations/providers/supabase.mdx b/docs/extras/integrations/providers/supabase.mdx new file mode 100644 index 000000000..a57b7079b --- /dev/null +++ b/docs/extras/integrations/providers/supabase.mdx @@ -0,0 +1,26 @@ +# Supabase (Postgres) + +>[Supabase](https://supabase.com/docs) is an open source `Firebase` alternative. +> `Supabase` is built on top of `PostgreSQL`, which offers strong `SQL` +> querying capabilities and enables a simple interface with already-existing tools and frameworks. + +>[PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL) also known as `Postgres`, +> is a free and open-source relational database management system (RDBMS) +> emphasizing extensibility and `SQL` compliance. + +## Installation and Setup + +We need to install `supabase` python package. + +```bash +pip install supabase +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/supabase). + +```python +from langchain.vectorstores import SupabaseVectorStore +``` + diff --git a/docs/extras/integrations/providers/usearch.mdx b/docs/extras/integrations/providers/usearch.mdx new file mode 100644 index 000000000..68044246c --- /dev/null +++ b/docs/extras/integrations/providers/usearch.mdx @@ -0,0 +1,25 @@ +# USearch +>[USearch](https://unum-cloud.github.io/usearch/) is a Smaller & Faster Single-File Vector Search Engine. + +>`USearch's` base functionality is identical to `FAISS`, and the interface should look +> familiar if you have ever investigated Approximate Nearest Neighbors search. +> `USearch` and `FAISS` both employ `HNSW` algorithm, but they differ significantly +> in their design principles. `USearch` is compact and broadly compatible with FAISS without +> sacrificing performance, with a primary focus on user-defined metrics and fewer dependencies. +> +## Installation and Setup + +We need to install `usearch` python package. + +```bash +pip install usearch +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/usearch). + +```python +from langchain.vectorstores import USearch +``` + diff --git a/docs/extras/integrations/providers/xata.mdx b/docs/extras/integrations/providers/xata.mdx new file mode 100644 index 000000000..880f302f9 --- /dev/null +++ b/docs/extras/integrations/providers/xata.mdx @@ -0,0 +1,28 @@ +# Xata + +> [Xata](https://xata.io) is a serverless data platform, based on `PostgreSQL`. +> It provides a Python SDK for interacting with your database, and a UI +> for managing your data. +> `Xata` has a native vector type, which can be added to any table, and +> supports similarity search. LangChain inserts vectors directly to `Xata`, +> and queries it for the nearest neighbors of a given vector, so that you can +> use all the LangChain Embeddings integrations with `Xata`. + + +## Installation and Setup + + +We need to install `xata` python package. + +```bash +pip install xata==1.0.0a7 +``` + +## Vector Store + +See a [usage example](/docs/integrations/vectorstores/xata). + +```python +from langchain.vectorstores import XataVectorStore +``` + diff --git a/docs/extras/integrations/vectorstores/clickhouse.ipynb b/docs/extras/integrations/vectorstores/clickhouse.ipynb index 56a306a8e..97cdcccf0 100644 --- a/docs/extras/integrations/vectorstores/clickhouse.ipynb +++ b/docs/extras/integrations/vectorstores/clickhouse.ipynb @@ -5,7 +5,7 @@ "id": "683953b3", "metadata": {}, "source": [ - "# ClickHouse Vector Search\n", + "# ClickHouse\n", "\n", "> [ClickHouse](https://clickhouse.com/) is the fastest and most resource efficient open-source database for real-time apps and analytics with full SQL support and a wide range of functions to assist users in writing analytical queries. Lately added data structures and distance search functions (like `L2Distance`) as well as [approximate nearest neighbor search indexes](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/annindexes) enable ClickHouse to be used as a high performance and scalable vector database to store and search vectors with SQL.\n", "\n", @@ -198,8 +198,7 @@ "ExecuteTime": { "end_time": "2023-06-03T08:28:58.252991Z", "start_time": "2023-06-03T08:28:58.197560Z" - }, - "scrolled": false + } }, "outputs": [ { @@ -246,9 +245,7 @@ "cell_type": "code", "execution_count": 8, "id": "54f4f561", - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -395,7 +392,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/docarray_hnsw.ipynb b/docs/extras/integrations/vectorstores/docarray_hnsw.ipynb index 329c3a676..1537668b2 100644 --- a/docs/extras/integrations/vectorstores/docarray_hnsw.ipynb +++ b/docs/extras/integrations/vectorstores/docarray_hnsw.ipynb @@ -1,20 +1,18 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "2ce41f46-5711-4311-b04d-2fe233ac5b1b", "metadata": {}, "source": [ - "# DocArrayHnswSearch\n", + "# DocArray HnswSearch\n", "\n", - ">[DocArrayHnswSearch](https://docs.docarray.org/user_guide/storing/index_hnswlib/) is a lightweight Document Index implementation provided by [Docarray](https://docs.docarray.org/) that runs fully locally and is best suited for small- to medium-sized datasets. It stores vectors on disk in [hnswlib](https://github.com/nmslib/hnswlib), and stores all other data in [SQLite](https://www.sqlite.org/index.html).\n", + ">[DocArrayHnswSearch](https://docs.docarray.org/user_guide/storing/index_hnswlib/) is a lightweight Document Index implementation provided by [Docarray](https://github.com/docarray/docarray) that runs fully locally and is best suited for small- to medium-sized datasets. It stores vectors on disk in [hnswlib](https://github.com/nmslib/hnswlib), and stores all other data in [SQLite](https://www.sqlite.org/index.html).\n", "\n", "This notebook shows how to use functionality related to the `DocArrayHnswSearch`." ] }, { - "attachments": {}, "cell_type": "markdown", "id": "7ee37d28", "metadata": {}, @@ -57,7 +55,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "8dbb6de2", "metadata": { @@ -103,7 +100,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "ed6f905b-4853-4a44-9730-614aa8e22b78", "metadata": {}, @@ -151,7 +147,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "3febb987-e903-416f-af26-6897d84c8d61", "metadata": {}, @@ -160,7 +155,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "bb1df11a", "metadata": {}, @@ -236,7 +230,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/docarray_in_memory.ipynb b/docs/extras/integrations/vectorstores/docarray_in_memory.ipynb index 4e5d06de8..220c69ad0 100644 --- a/docs/extras/integrations/vectorstores/docarray_in_memory.ipynb +++ b/docs/extras/integrations/vectorstores/docarray_in_memory.ipynb @@ -1,20 +1,18 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "a3afefb0-7e99-4912-a222-c6b186da11af", "metadata": {}, "source": [ - "# DocArrayInMemorySearch\n", + "# DocArray InMemorySearch\n", "\n", - ">[DocArrayInMemorySearch](https://docs.docarray.org/user_guide/storing/index_in_memory/) is a document index provided by [Docarray](https://docs.docarray.org/) that stores documents in memory. It is a great starting point for small datasets, where you may not want to launch a database server.\n", + ">[DocArrayInMemorySearch](https://docs.docarray.org/user_guide/storing/index_in_memory/) is a document index provided by [Docarray](https://github.com/docarray/docarray) that stores documents in memory. It is a great starting point for small datasets, where you may not want to launch a database server.\n", "\n", "This notebook shows how to use functionality related to the `DocArrayInMemorySearch`." ] }, { - "attachments": {}, "cell_type": "markdown", "id": "5031a3ec", "metadata": {}, @@ -56,7 +54,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "6e57a389-f637-4b8f-9ab2-759ae7485f78", "metadata": {}, @@ -98,7 +95,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "efbb6684-3846-4332-a624-ddd4d75844c1", "metadata": {}, @@ -146,7 +142,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "43896697-f99e-47b6-9117-47a25e9afa9c", "metadata": {}, @@ -155,7 +150,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "414a9bc9", "metadata": {}, @@ -224,7 +218,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/faiss.ipynb b/docs/extras/integrations/vectorstores/faiss.ipynb index 7a355c373..7969982ca 100644 --- a/docs/extras/integrations/vectorstores/faiss.ipynb +++ b/docs/extras/integrations/vectorstores/faiss.ipynb @@ -5,7 +5,7 @@ "id": "683953b3", "metadata": {}, "source": [ - "# FAISS\n", + "# Faiss\n", "\n", ">[Facebook AI Similarity Search (Faiss)](https://engineering.fb.com/2017/03/29/data-infrastructure/faiss-a-library-for-efficient-similarity-search/) is a library for efficient similarity search and clustering of dense vectors. It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM. It also contains supporting code for evaluation and parameter tuning.\n", "\n", @@ -596,7 +596,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.17" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/matchingengine.ipynb b/docs/extras/integrations/vectorstores/matchingengine.ipynb index 5f80f2c88..faee307c3 100644 --- a/docs/extras/integrations/vectorstores/matchingengine.ipynb +++ b/docs/extras/integrations/vectorstores/matchingengine.ipynb @@ -5,9 +5,9 @@ "id": "655b8f55-2089-4733-8b09-35dea9580695", "metadata": {}, "source": [ - "# MatchingEngine\n", + "# Google Vertex AI MatchingEngine\n", "\n", - "This notebook shows how to use functionality related to the GCP Vertex AI `MatchingEngine` vector database.\n", + "This notebook shows how to use functionality related to the `GCP Vertex AI MatchingEngine` vector database.\n", "\n", "> Vertex AI [Matching Engine](https://cloud.google.com/vertex-ai/docs/matching-engine/overview) provides the industry's leading high-scale low latency vector database. These vector databases are commonly referred to as vector similarity-matching or an approximate nearest neighbor (ANN) service.\n", "\n", @@ -348,7 +348,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/meilisearch.ipynb b/docs/extras/integrations/vectorstores/meilisearch.ipynb index 7f640ea0e..572c29e1c 100644 --- a/docs/extras/integrations/vectorstores/meilisearch.ipynb +++ b/docs/extras/integrations/vectorstores/meilisearch.ipynb @@ -197,7 +197,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -205,7 +204,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -229,7 +227,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -298,9 +295,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/extras/integrations/vectorstores/mongodb_atlas.ipynb b/docs/extras/integrations/vectorstores/mongodb_atlas.ipynb index 35e3342b0..5c4475d02 100644 --- a/docs/extras/integrations/vectorstores/mongodb_atlas.ipynb +++ b/docs/extras/integrations/vectorstores/mongodb_atlas.ipynb @@ -1,14 +1,13 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "683953b3", "metadata": {}, "source": [ "# MongoDB Atlas\n", "\n", - ">[MongoDB Atlas](https://www.mongodb.com/docs/atlas/) is a fully-managed cloud database available in AWS , Azure, and GCP. It now has support for native Vector Search on your MongoDB document data.\n", + ">[MongoDB Atlas](https://www.mongodb.com/docs/atlas/) is a fully-managed cloud database available in AWS, Azure, and GCP. It now has support for native Vector Search on your MongoDB document data.\n", "\n", "This notebook shows how to use `MongoDB Atlas Vector Search` to store your embeddings in MongoDB documents, create a vector search index, and perform KNN search with an approximate nearest neighbor algorithm.\n", "\n", @@ -44,7 +43,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "457ace44-1d95-4001-9dd5-78811ab208ad", "metadata": {}, @@ -63,7 +61,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "1f3ecc42", "metadata": {}, @@ -147,7 +144,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "851a2ec9-9390-49a4-8412-3e132c9f789d", "metadata": {}, @@ -191,7 +187,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/pgembedding.ipynb b/docs/extras/integrations/vectorstores/pgembedding.ipynb index f26360206..34928df3b 100644 --- a/docs/extras/integrations/vectorstores/pgembedding.ipynb +++ b/docs/extras/integrations/vectorstores/pgembedding.ipynb @@ -1,18 +1,17 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "1292f057", "metadata": {}, "source": [ - "# pg_embedding\n", + "# Postgres Embedding\n", "\n", - "> [pg_embedding](https://github.com/neondatabase/pg_embedding) is an open-source vector similarity search for `Postgres` that uses Hierarchical Navigable Small Worlds for approximate nearest neighbor search.\n", + "> [Postgres Embedding](https://github.com/neondatabase/pg_embedding) is an open-source vector similarity search for `Postgres` that uses `Hierarchical Navigable Small Worlds (HNSW)` for approximate nearest neighbor search.\n", "\n", - "It supports:\n", - "- exact and approximate nearest neighbor search using HNSW\n", - "- L2 distance\n", + ">It supports:\n", + ">- exact and approximate nearest neighbor search using HNSW\n", + ">- L2 distance\n", "\n", "This notebook shows how to use the Postgres vector database (`PGEmbedding`).\n", "\n", @@ -36,7 +35,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "b2e49694", "metadata": {}, @@ -158,7 +156,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "7ef7b052", "metadata": {}, @@ -167,7 +164,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "939151f7", "metadata": {}, @@ -192,7 +188,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "f9510e6b", "metadata": {}, @@ -214,7 +209,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "7adacf29", "metadata": {}, @@ -236,7 +230,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "528893fb", "metadata": {}, @@ -330,7 +323,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/scann.ipynb b/docs/extras/integrations/vectorstores/scann.ipynb index 7eb32642f..4d63bd288 100644 --- a/docs/extras/integrations/vectorstores/scann.ipynb +++ b/docs/extras/integrations/vectorstores/scann.ipynb @@ -182,7 +182,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.11" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/supabase.ipynb b/docs/extras/integrations/vectorstores/supabase.ipynb index 19dbc3d36..9ba5dacd0 100644 --- a/docs/extras/integrations/vectorstores/supabase.ipynb +++ b/docs/extras/integrations/vectorstores/supabase.ipynb @@ -1,7 +1,6 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "683953b3", "metadata": {}, @@ -10,7 +9,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "cc80fa84-1f2f-48b4-bd39-3e6412f012f1", "metadata": {}, @@ -87,7 +85,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "69bff365-3039-4ff8-a641-aa190166179d", "metadata": {}, @@ -237,7 +234,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "18152965", "metadata": {}, @@ -246,7 +242,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "ea13e80a", "metadata": {}, @@ -287,7 +282,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "794a7552", "metadata": {}, @@ -439,7 +433,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/usearch.ipynb b/docs/extras/integrations/vectorstores/usearch.ipynb index 9778a9884..b4aefa2a1 100644 --- a/docs/extras/integrations/vectorstores/usearch.ipynb +++ b/docs/extras/integrations/vectorstores/usearch.ipynb @@ -8,7 +8,7 @@ "# USearch\n", ">[USearch](https://unum-cloud.github.io/usearch/) is a Smaller & Faster Single-File Vector Search Engine\n", "\n", - "USearch's base functionality is identical to FAISS, and the interface should look familiar if you have ever investigated Approximate Nearest Neigbors search. FAISS is a widely recognized standard for high-performance vector search engines. USearch and FAISS both employ the same HNSW algorithm, but they differ significantly in their design principles. USearch is compact and broadly compatible without sacrificing performance, with a primary focus on user-defined metrics and fewer dependencies." + ">USearch's base functionality is identical to FAISS, and the interface should look familiar if you have ever investigated Approximate Nearest Neigbors search. FAISS is a widely recognized standard for high-performance vector search engines. USearch and FAISS both employ the same HNSW algorithm, but they differ significantly in their design principles. USearch is compact and broadly compatible without sacrificing performance, with a primary focus on user-defined metrics and fewer dependencies." ] }, { @@ -187,7 +187,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/vectorstores/xata.ipynb b/docs/extras/integrations/vectorstores/xata.ipynb index 601e8599f..42f2e012e 100644 --- a/docs/extras/integrations/vectorstores/xata.ipynb +++ b/docs/extras/integrations/vectorstores/xata.ipynb @@ -232,7 +232,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.12" } }, "nbformat": 4, From b379c5f9c89199370d9175ce6ee34d469567e533 Mon Sep 17 00:00:00 2001 From: Jun Liu Date: Wed, 23 Aug 2023 14:00:15 +1000 Subject: [PATCH 061/143] Fixed the error on ConfluenceLoader when content_format=VIEW and `keep_markdown_format`=True (#9633) - Description: a description of the change when I set `content_format=ContentFormat.VIEW` and `keep_markdown_format=True` on ConfluenceLoader, it shows the following error: ``` langchain/document_loaders/confluence.py", line 459, in process_page page["body"]["storage"]["value"], heading_style="ATX" KeyError: 'storage' ``` The reason is because the content format was set to `view` but it was still trying to get the content from `page["body"]["storage"]["value"]`. Also added the other content formats which are supported by Atlassian API https://stackoverflow.com/questions/34353955/confluence-rest-api-expanding-page-body-when-retrieving-page-by-title/34363386#34363386 - Issue: the issue # it fixes (if applicable), Not applicable. - Dependencies: any dependencies required for this change, Added optional dependency `markdownify` if anyone wants to extract in markdown format. --------- Co-authored-by: Bagatur --- .../langchain/document_loaders/confluence.py | 27 +++++++----- libs/langchain/poetry.lock | 19 +++++++- libs/langchain/pyproject.toml | 2 + .../document_loaders/test_confluence.py | 44 +++++++++++++++++-- 4 files changed, 75 insertions(+), 17 deletions(-) diff --git a/libs/langchain/langchain/document_loaders/confluence.py b/libs/langchain/langchain/document_loaders/confluence.py index a1151c08e..739f52f48 100644 --- a/libs/langchain/langchain/document_loaders/confluence.py +++ b/libs/langchain/langchain/document_loaders/confluence.py @@ -20,16 +20,14 @@ logger = logging.getLogger(__name__) class ContentFormat(str, Enum): """Enumerator of the content formats of Confluence page.""" + EDITOR = "body.editor" + EXPORT_VIEW = "body.export_view" + ANONYMOUS_EXPORT_VIEW = "body.anonymous_export_view" STORAGE = "body.storage" VIEW = "body.view" def get_content(self, page: dict) -> str: - if self == ContentFormat.STORAGE: - return page["body"]["storage"]["value"] - elif self == ContentFormat.VIEW: - return page["body"]["view"]["value"] - - raise ValueError("unknown content format") + return page["body"][self.name.lower()]["value"] class ConfluenceLoader(BaseLoader): @@ -52,7 +50,10 @@ class ConfluenceLoader(BaseLoader): raw XML representation for storage. The view format is the HTML representation for viewing with macros are rendered as though it is viewed by users. You can pass a enum `content_format` argument to `load()` to specify the content format, this is - set to `ContentFormat.STORAGE` by default. + set to `ContentFormat.STORAGE` by default, the supported values are: + `ContentFormat.EDITOR`, `ContentFormat.EXPORT_VIEW`, + `ContentFormat.ANONYMOUS_EXPORT_VIEW`, `ContentFormat.STORAGE`, + and `ContentFormat.VIEW`. Hint: space_key and page_id can both be found in the URL of a page in Confluence - https://yoursite.atlassian.com/wiki/spaces//pages/ @@ -238,7 +239,11 @@ class ConfluenceLoader(BaseLoader): :type include_attachments: bool, optional :param include_comments: defaults to False :type include_comments: bool, optional - :param content_format: Specify content format, defaults to ContentFormat.STORAGE + :param content_format: Specify content format, defaults to + ContentFormat.STORAGE, the supported values are: + `ContentFormat.EDITOR`, `ContentFormat.EXPORT_VIEW`, + `ContentFormat.ANONYMOUS_EXPORT_VIEW`, + `ContentFormat.STORAGE`, and `ContentFormat.VIEW`. :type content_format: ContentFormat :param limit: Maximum number of pages to retrieve per request, defaults to 50 :type limit: int, optional @@ -473,14 +478,12 @@ class ConfluenceLoader(BaseLoader): else: attachment_texts = [] + content = content_format.get_content(page) if keep_markdown_format: # Use markdownify to keep the page Markdown style - text = markdownify( - page["body"]["storage"]["value"], heading_style="ATX" - ) + "".join(attachment_texts) + text = markdownify(content, heading_style="ATX") + "".join(attachment_texts) else: - content = content_format.get_content(page) if keep_newlines: text = BeautifulSoup( content.replace("

", "\n

").replace("
", "\n"), "lxml" diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index f065fd0c3..3ea9c4734 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -4288,6 +4288,21 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +[[package]] +name = "markdownify" +version = "0.11.6" +description = "Convert HTML to markdown." +optional = true +python-versions = "*" +files = [ + {file = "markdownify-0.11.6-py3-none-any.whl", hash = "sha256:ba35fe289d5e9073bcd7d2cad629278fe25f1a93741fcdc0bfb4f009076d8324"}, + {file = "markdownify-0.11.6.tar.gz", hash = "sha256:009b240e0c9f4c8eaf1d085625dcd4011e12f0f8cec55dedf9ea6f7655e49bfe"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.9,<5" +six = ">=1.15,<2" + [[package]] name = "markupsafe" version = "2.1.3" @@ -10323,7 +10338,7 @@ clarifai = ["clarifai"] cohere = ["cohere"] docarray = ["docarray"] embeddings = ["sentence-transformers"] -extended-testing = ["amazon-textract-caller", "atlassian-python-api", "beautifulsoup4", "bibtexparser", "cassio", "chardet", "esprima", "faiss-cpu", "feedparser", "geopandas", "gitpython", "gql", "html2text", "jinja2", "jq", "lxml", "mwparserfromhell", "mwxml", "newspaper3k", "openai", "openai", "openapi-schema-pydantic", "pandas", "pdfminer-six", "pgvector", "psychicapi", "py-trello", "pymupdf", "pypdf", "pypdfium2", "pyspark", "rank-bm25", "rapidfuzz", "requests-toolbelt", "scikit-learn", "streamlit", "sympy", "telethon", "tqdm", "xata", "xmltodict"] +extended-testing = ["amazon-textract-caller", "atlassian-python-api", "beautifulsoup4", "bibtexparser", "cassio", "chardet", "esprima", "faiss-cpu", "feedparser", "geopandas", "gitpython", "gql", "html2text", "jinja2", "jq", "lxml", "markdownify", "mwparserfromhell", "mwxml", "newspaper3k", "openai", "openai", "openapi-schema-pydantic", "pandas", "pdfminer-six", "pgvector", "psychicapi", "py-trello", "pymupdf", "pypdf", "pypdfium2", "pyspark", "rank-bm25", "rapidfuzz", "requests-toolbelt", "scikit-learn", "streamlit", "sympy", "telethon", "tqdm", "xata", "xmltodict"] javascript = ["esprima"] llms = ["clarifai", "cohere", "huggingface_hub", "manifest-ml", "nlpcloud", "openai", "openlm", "torch", "transformers"] openai = ["openai", "tiktoken"] @@ -10333,4 +10348,4 @@ text-helpers = ["chardet"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "27c44e64d872c51f42b58f9f5185f20914dc4360e91860cfc260b1acbdaa3272" +content-hash = "83280a03c352011c2a51081a29aca67bb5c4c23054ad1b7be94f89d6ce52460b" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index d02712349..61f05175d 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -126,6 +126,7 @@ amazon-textract-caller = {version = "<2", optional = true} xata = {version = "^1.0.0a7", optional = true} xmltodict = {version = "^0.13.0", optional = true} google-api-core = {version = "^2.11.1", optional = true} +markdownify = {version = "^0.11.6", optional = true} [tool.poetry.group.test.dependencies] @@ -338,6 +339,7 @@ extended_testing = [ "xmltodict", "faiss-cpu", "openapi-schema-pydantic", + "markdownify", ] [tool.ruff] diff --git a/libs/langchain/tests/unit_tests/document_loaders/test_confluence.py b/libs/langchain/tests/unit_tests/document_loaders/test_confluence.py index 42de78598..0048a8fba 100644 --- a/libs/langchain/tests/unit_tests/document_loaders/test_confluence.py +++ b/libs/langchain/tests/unit_tests/document_loaders/test_confluence.py @@ -6,7 +6,7 @@ import pytest import requests from langchain.docstore.document import Document -from langchain.document_loaders.confluence import ConfluenceLoader +from langchain.document_loaders.confluence import ConfluenceLoader, ContentFormat @pytest.fixture @@ -152,6 +152,40 @@ class TestConfluenceLoader: assert mock_confluence.cql.call_count == 0 assert mock_confluence.get_page_child_by_type.call_count == 0 + def test_confluence_loader_when_content_format_and_keep_markdown_format_enabled( + self, mock_confluence: MagicMock + ) -> None: + # one response with two pages + mock_confluence.get_all_pages_from_space.return_value = [ + self._get_mock_page("123", ContentFormat.VIEW), + self._get_mock_page("456", ContentFormat.VIEW), + ] + mock_confluence.get_all_restrictions_for_content.side_effect = [ + self._get_mock_page_restrictions("123"), + self._get_mock_page_restrictions("456"), + ] + + confluence_loader = self._get_mock_confluence_loader(mock_confluence) + + documents = confluence_loader.load( + space_key=self.MOCK_SPACE_KEY, + content_format=ContentFormat.VIEW, + keep_markdown_format=True, + max_pages=2, + ) + + assert mock_confluence.get_all_pages_from_space.call_count == 1 + + assert len(documents) == 2 + assert all(isinstance(doc, Document) for doc in documents) + assert documents[0].page_content == "Content 123\n\n" + assert documents[1].page_content == "Content 456\n\n" + + assert mock_confluence.get_page_by_id.call_count == 0 + assert mock_confluence.get_all_pages_by_label.call_count == 0 + assert mock_confluence.cql.call_count == 0 + assert mock_confluence.get_page_child_by_type.call_count == 0 + def _get_mock_confluence_loader( self, mock_confluence: MagicMock ) -> ConfluenceLoader: @@ -163,11 +197,15 @@ class TestConfluenceLoader: confluence_loader.confluence = mock_confluence return confluence_loader - def _get_mock_page(self, page_id: str) -> Dict: + def _get_mock_page( + self, page_id: str, content_format: ContentFormat = ContentFormat.STORAGE + ) -> Dict: return { "id": f"{page_id}", "title": f"Page {page_id}", - "body": {"storage": {"value": f"

Content {page_id}

"}}, + "body": { + f"{content_format.name.lower()}": {"value": f"

Content {page_id}

"} + }, "status": "current", "type": "page", "_links": { From 2a06e7b2166bb4af2cd5d11b2e59205fc1621388 Mon Sep 17 00:00:00 2001 From: Joseph McElroy Date: Wed, 23 Aug 2023 15:04:09 +0100 Subject: [PATCH 062/143] ElasticsearchStore: improve error logging for adding documents (#9648) Not obvious what the error is when you cannot index. This pr adds the ability to log the first errors reason, to help the user diagnose the issue. Also added some more documentation for when you want to use the vectorstore with an embedding model deployed in elasticsearch. Credit: @elastic and @phoey1 --- .../vectorstores/elasticsearch.ipynb | 118 ++++++++++++------ .../langchain/vectorstores/elasticsearch.py | 12 +- .../vectorstores/test_elasticsearch.py | 33 +++++ 3 files changed, 124 insertions(+), 39 deletions(-) diff --git a/docs/extras/integrations/vectorstores/elasticsearch.ipynb b/docs/extras/integrations/vectorstores/elasticsearch.ipynb index 6164b76da..173c2436f 100644 --- a/docs/extras/integrations/vectorstores/elasticsearch.ipynb +++ b/docs/extras/integrations/vectorstores/elasticsearch.ipynb @@ -14,6 +14,16 @@ "This notebook shows how to use functionality related to the `Elasticsearch` database." ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5bbffe2", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install elasticsearch openai tiktoken langchain" + ] + }, { "cell_type": "markdown", "id": "b66c12b2-2a07-4136-ac77-ce1c9fa7a409", @@ -119,33 +129,6 @@ "```" ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "d6197931-cbe5-460c-a5e6-b5eedb83887c", - "metadata": { - "id": "d6197931-cbe5-460c-a5e6-b5eedb83887c", - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: elasticsearch in /Users/joe/Library/Caches/pypoetry/virtualenvs/langchain-monorepo-ln7dNLl5-py3.10/lib/python3.10/site-packages (8.9.0)\n", - "Requirement already satisfied: elastic-transport<9,>=8 in /Users/joe/Library/Caches/pypoetry/virtualenvs/langchain-monorepo-ln7dNLl5-py3.10/lib/python3.10/site-packages (from elasticsearch) (8.4.0)\n", - "Requirement already satisfied: urllib3<2,>=1.26.2 in /Users/joe/Library/Caches/pypoetry/virtualenvs/langchain-monorepo-ln7dNLl5-py3.10/lib/python3.10/site-packages (from elastic-transport<9,>=8->elasticsearch) (1.26.16)\n", - "Requirement already satisfied: certifi in /Users/joe/Library/Caches/pypoetry/virtualenvs/langchain-monorepo-ln7dNLl5-py3.10/lib/python3.10/site-packages (from elastic-transport<9,>=8->elasticsearch) (2023.7.22)\n", - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" - ] - } - ], - "source": [ - "!pip install elasticsearch" - ] - }, { "cell_type": "markdown", "id": "ea167a29", @@ -528,24 +511,89 @@ "\n", "To use this, specify the model_id in `ElasticsearchStore` `ApproxRetrievalStrategy` constructor via the `query_model_id` argument.\n", "\n", - "**NOTE** This requires the model to be deployed and running in Elasticsearch ml node. \n", - "\n", - "```python\n", + "**NOTE** This requires the model to be deployed and running in Elasticsearch ml node. See [notebook example](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/integrations/hugging-face/loading-model-from-hugging-face.ipynb) on how to deploy the model with eland.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a0c85e7", + "metadata": {}, + "outputs": [], + "source": [ + "APPROX_SELF_DEPLOYED_INDEX_NAME = \"test-approx-self-deployed\"\n", "\n", "# Note: This does not have an embedding function specified\n", "# Instead, we will use the embedding model deployed in Elasticsearch\n", "db = ElasticsearchStore( \n", - " es_url=\"http://localhost:9200\", \n", - " index_name=\"test\",\n", + " es_cloud_id=\"\",\n", + " es_user=\"elastic\",\n", + " es_password=\"\", \n", + " index_name=APPROX_SELF_DEPLOYED_INDEX_NAME,\n", + " query_field=\"text_field\",\n", + " vector_query_field=\"vector_query_field.predicted_value\",\n", " strategy=ElasticsearchStore.ApproxRetrievalStrategy(\n", " query_model_id=\"sentence-transformers__all-minilm-l6-v2\"\n", " )\n", ")\n", "\n", - "# Perform search\n", - "db.similarity_search(\"hello world\", k=10)\n", - "```\n", + "# Setup a Ingest Pipeline to perform the embedding\n", + "# of the text field\n", + "db.client.ingest.put_pipeline(\n", + " id=\"test_pipeline\",\n", + " processors=[\n", + " {\n", + " \"inference\": {\n", + " \"model_id\": \"sentence-transformers__all-minilm-l6-v2\",\n", + " \"field_map\": {\"query_field\": \"text_field\"},\n", + " \"target_field\": \"vector_query_field\",\n", + " }\n", + " }\n", + " ],\n", + ")\n", "\n", + "# creating a new index with the pipeline,\n", + "# not relying on langchain to create the index\n", + "db.client.indices.create(\n", + " index=APPROX_SELF_DEPLOYED_INDEX_NAME,\n", + " mappings={\n", + " \"properties\": {\n", + " \"text_field\": {\"type\": \"text\"},\n", + " \"vector_query_field\": {\n", + " \"properties\": {\n", + " \"predicted_value\": {\n", + " \"type\": \"dense_vector\",\n", + " \"dims\": 384,\n", + " \"index\": True,\n", + " \"similarity\": \"l2_norm\",\n", + " }\n", + " }\n", + " },\n", + " }\n", + " },\n", + " settings={\"index\": {\"default_pipeline\": \"test_pipeline\"}},\n", + ")\n", + "\n", + "db.from_texts([\"hello world\"], \n", + " es_cloud_id=\"\",\n", + " es_user=\"elastic\",\n", + " es_password=\"\", \n", + " index_name=APPROX_SELF_DEPLOYED_INDEX_NAME,\n", + " query_field=\"text_field\",\n", + " vector_query_field=\"vector_query_field.predicted_value\",\n", + " strategy=ElasticsearchStore.ApproxRetrievalStrategy(\n", + " query_model_id=\"sentence-transformers__all-minilm-l6-v2\"\n", + " ))\n", + "\n", + "# Perform search\n", + "db.similarity_search(\"hello world\", k=10)" + ] + }, + { + "cell_type": "markdown", + "id": "53959de6", + "metadata": {}, + "source": [ "## SparseVectorRetrievalStrategy (ELSER)\n", "This strategy uses Elasticsearch's sparse vector retrieval to retrieve the top-k results. We only support our own \"ELSER\" embedding model for now.\n", "\n", diff --git a/libs/langchain/langchain/vectorstores/elasticsearch.py b/libs/langchain/langchain/vectorstores/elasticsearch.py index c8dd59901..27f0ef307 100644 --- a/libs/langchain/langchain/vectorstores/elasticsearch.py +++ b/libs/langchain/langchain/vectorstores/elasticsearch.py @@ -710,7 +710,7 @@ class ElasticsearchStore(VectorStore): after deleting documents. Defaults to True. """ try: - from elasticsearch.helpers import bulk + from elasticsearch.helpers import BulkIndexError, bulk except ImportError: raise ImportError( "Could not import elasticsearch python package. " @@ -731,8 +731,10 @@ class ElasticsearchStore(VectorStore): logger.debug(f"Deleted {len(body)} texts from index") return True - except Exception as e: + except BulkIndexError as e: logger.error(f"Error deleting texts: {e}") + firstError = e.errors[0].get("index", {}).get("error", {}) + logger.error(f"First error reason: {firstError.get('reason')}") raise e else: @@ -801,7 +803,7 @@ class ElasticsearchStore(VectorStore): List of ids from adding the texts into the vectorstore. """ try: - from elasticsearch.helpers import bulk + from elasticsearch.helpers import BulkIndexError, bulk except ImportError: raise ImportError( "Could not import elasticsearch python package. " @@ -867,8 +869,10 @@ class ElasticsearchStore(VectorStore): logger.debug(f"added texts {ids} to index") return ids - except Exception as e: + except BulkIndexError as e: logger.error(f"Error adding texts: {e}") + firstError = e.errors[0].get("index", {}).get("error", {}) + logger.error(f"First error reason: {firstError.get('reason')}") raise e else: diff --git a/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py b/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py index 79b42ddd0..f2e451ee7 100644 --- a/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py +++ b/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py @@ -5,6 +5,7 @@ import uuid from typing import Generator, List, Union import pytest +from elasticsearch.helpers import BulkIndexError from langchain.docstore.document import Document from langchain.vectorstores.elasticsearch import ElasticsearchStore @@ -480,6 +481,8 @@ class TestElasticsearch: document={"text_field": text, "metadata": {}}, ) + docsearch.client.indices.refresh(index=index_name) + def assert_query(query_body: dict, query: str) -> dict: assert query_body == { "knn": { @@ -574,3 +577,33 @@ class TestElasticsearch: docsearch.delete([ids[3]]) output = docsearch.similarity_search("gni", k=10) assert len(output) == 0 + + def test_elasticsearch_indexing_exception_error( + self, + elasticsearch_connection: dict, + index_name: str, + caplog: pytest.LogCaptureFixture, + ) -> None: + """Test bulk exception logging is giving better hints.""" + + docsearch = ElasticsearchStore( + embedding=ConsistentFakeEmbeddings(), + **elasticsearch_connection, + index_name=index_name, + ) + + docsearch.client.indices.create( + index=index_name, + mappings={"properties": {}}, + settings={"index": {"default_pipeline": "not-existing-pipeline"}}, + ) + + texts = ["foo"] + + with pytest.raises(BulkIndexError): + docsearch.add_texts(texts) + + error_reason = "pipeline with id [not-existing-pipeline] does not exist" + log_message = f"First error reason: {error_reason}" + + assert log_message in caplog.text From eb92da84a1de4bc83e8e0c951b4806d2a892d19a Mon Sep 17 00:00:00 2001 From: Aashish Saini <141953346+AashishSainiShorthillsAI@users.noreply.github.com> Date: Wed, 23 Aug 2023 19:34:29 +0530 Subject: [PATCH 063/143] Fixings grammatical errors in Doc Files (#9647) Fixing some typos and grammatical error is doc file. @eyurtsev , @baskaryan Thanks --------- Co-authored-by: Aayush <142384656+AayushShorthillsAI@users.noreply.github.com> Co-authored-by: Ishita Chauhan <136303787+IshitaChauhanShortHillsAI@users.noreply.github.com> --- docs/docs_skeleton/docs/community.md | 4 ++-- .../docs_skeleton/docs/guides/evaluation/comparison/index.mdx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs_skeleton/docs/community.md b/docs/docs_skeleton/docs/community.md index c3c703150..f438de16f 100644 --- a/docs/docs_skeleton/docs/community.md +++ b/docs/docs_skeleton/docs/community.md @@ -47,8 +47,8 @@ If you’re working on something you’re proud of, and think the LangChain comm Here’s where our team hangs out, talks shop, spotlights cool work, and shares what we’re up to. We’d love to see you there too. -- **[Twitter](https://twitter.com/LangChainAI):** we post about what we’re working on and what cool things we’re seeing in the space. If you tag @langchainai in your post, we’ll almost certainly see it, and can snow you some love! -- **[Discord](https://discord.gg/6adMQxSpJS):** connect with with >30k developers who are building with LangChain +- **[Twitter](https://twitter.com/LangChainAI):** we post about what we’re working on and what cool things we’re seeing in the space. If you tag @langchainai in your post, we’ll almost certainly see it, and can show you some love! +- **[Discord](https://discord.gg/6adMQxSpJS):** connect with >30k developers who are building with LangChain - **[GitHub](https://github.com/langchain-ai/langchain):** open pull requests, contribute to a discussion, and/or contribute - **[Subscribe to our bi-weekly Release Notes](https://6w1pwbss0py.typeform.com/to/KjZB1auB):** a twice/month email roundup of the coolest things going on in our orbit - **Slack:** if you’re building an application in production at your company, we’d love to get into a Slack channel together. Fill out [this form](https://airtable.com/appwQzlErAS2qiP0L/shrGtGaVBVAz7NcV2) and we’ll get in touch about setting one up. diff --git a/docs/docs_skeleton/docs/guides/evaluation/comparison/index.mdx b/docs/docs_skeleton/docs/guides/evaluation/comparison/index.mdx index 8dc4fe7a0..7f4f03342 100644 --- a/docs/docs_skeleton/docs/guides/evaluation/comparison/index.mdx +++ b/docs/docs_skeleton/docs/guides/evaluation/comparison/index.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 --- # Comparison Evaluators -Comparison evaluators in LangChain help measure two different chain or LLM outputs. These evaluators are helpful for comparative analyses, such as A/B testing between two language models, or comparing different versions of the same model. They can also be useful for things like generating preference scores for ai-assisted reinforcement learning. +Comparison evaluators in LangChain help measure two different chains or LLM outputs. These evaluators are helpful for comparative analyses, such as A/B testing between two language models, or comparing different versions of the same model. They can also be useful for things like generating preference scores for ai-assisted reinforcement learning. These evaluators inherit from the `PairwiseStringEvaluator` class, providing a comparison interface for two strings - typically, the outputs from two different prompts or models, or two versions of the same model. In essence, a comparison evaluator performs an evaluation on a pair of strings and returns a dictionary containing the evaluation score and other relevant details. @@ -16,7 +16,7 @@ Here's a summary of the key methods and properties of a comparison evaluator: - `requires_input`: This property indicates whether this evaluator requires an input string. - `requires_reference`: This property specifies whether this evaluator requires a reference label. -Detailed information about creating custom evaluators and the available built-in comparison evaluators are provided in the following sections. +Detailed information about creating custom evaluators and the available built-in comparison evaluators is provided in the following sections. import DocCardList from "@theme/DocCardList"; From 5b9bdcac1b6828dccf44e21f8d8e4ae2fd47f822 Mon Sep 17 00:00:00 2001 From: Junlin Zhou Date: Wed, 23 Aug 2023 22:05:02 +0800 Subject: [PATCH 064/143] docs: fix link url (#9643) This pull request corrects the URL links in the Async API documentation to align with the updated project layout. The links had not been updated despite the changes in layout. --- .../modules/agents/how_to/async_agent.ipynb | 196 +++++++++--------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/docs/extras/modules/agents/how_to/async_agent.ipynb b/docs/extras/modules/agents/how_to/async_agent.ipynb index fd05c4f8f..aa8096f13 100644 --- a/docs/extras/modules/agents/how_to/async_agent.ipynb +++ b/docs/extras/modules/agents/how_to/async_agent.ipynb @@ -9,7 +9,7 @@ "\n", "LangChain provides async support for Agents by leveraging the [asyncio](https://docs.python.org/3/library/asyncio.html) library.\n", "\n", - "Async methods are currently supported for the following `Tools`: [`GoogleSerperAPIWrapper`](https://github.com/hwchase17/langchain/blob/master/langchain/utilities/google_serper.py), [`SerpAPIWrapper`](https://github.com/hwchase17/langchain/blob/master/langchain/serpapi.py), [`LLMMathChain`](https://github.com/hwchase17/langchain/blob/master/langchain/chains/llm_math/base.py) and [`Qdrant`](https://github.com/hwchase17/langchain/blob/master/langchain/vectorstores/qdrant.py). Async support for other agent tools are on the roadmap.\n", + "Async methods are currently supported for the following `Tools`: [`GoogleSerperAPIWrapper`](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/utilities/google_serper.py), [`SerpAPIWrapper`](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/utilities/serpapi.py), [`LLMMathChain`](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/chains/llm_math/base.py) and [`Qdrant`](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/vectorstores/qdrant.py). Async support for other agent tools are on the roadmap.\n", "\n", "For `Tool`s that have a `coroutine` implemented (the four mentioned above), the `AgentExecutor` will `await` them directly. Otherwise, the `AgentExecutor` will call the `Tool`'s `func` via `asyncio.get_event_loop().run_in_executor` to avoid blocking the main runloop.\n", "\n", @@ -76,91 +76,91 @@ "text": [ "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", - "\u001B[32;1m\u001B[1;3m I need to find out who won the US Open men's final in 2019 and then calculate his age raised to the 0.334 power.\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to find out who won the US Open men's final in 2019 and then calculate his age raised to the 0.334 power.\n", "Action: Google Serper\n", - "Action Input: \"Who won the US Open men's final in 2019?\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3mRafael Nadal defeated Daniil Medvedev in the final, 7–5, 6–3, 5–7, 4–6, 6–4 to win the men's singles tennis title at the 2019 US Open. It was his fourth US ... Draw: 128 (16 Q / 8 WC). Champion: Rafael Nadal. Runner-up: Daniil Medvedev. Score: 7–5, 6–3, 5–7, 4–6, 6–4. Bianca Andreescu won the women's singles title, defeating Serena Williams in straight sets in the final, becoming the first Canadian to win a Grand Slam singles ... Rafael Nadal won his 19th career Grand Slam title, and his fourth US Open crown, by surviving an all-time comback effort from Daniil ... Rafael Nadal beats Daniil Medvedev in US Open final to claim 19th major title. World No2 claims 7-5, 6-3, 5-7, 4-6, 6-4 victory over Russian ... Rafael Nadal defeated Daniil Medvedev in the men's singles final of the U.S. Open on Sunday. Rafael Nadal survived. The 33-year-old defeated Daniil Medvedev in the final of the 2019 U.S. Open to earn his 19th Grand Slam title Sunday ... NEW YORK -- Rafael Nadal defeated Daniil Medvedev in an epic five-set match, 7-5, 6-3, 5-7, 4-6, 6-4 to win the men's singles title at the ... Nadal previously won the U.S. Open three times, most recently in 2017. Ahead of the match, Nadal said he was “super happy to be back in the ... Watch the full match between Daniil Medvedev and Rafael ... Duration: 4:47:32. Posted: Mar 20, 2020. US Open 2019: Rafael Nadal beats Daniil Medvedev · Updated: Sep. 08, 2019, 11:11 p.m. |; Published: Sep · Published: Sep. 08, 2019, 10:06 p.m.. 26. US Open ...\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I now know that Rafael Nadal won the US Open men's final in 2019 and he is 33 years old.\n", + "Action Input: \"Who won the US Open men's final in 2019?\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mRafael Nadal defeated Daniil Medvedev in the final, 7–5, 6–3, 5–7, 4–6, 6–4 to win the men's singles tennis title at the 2019 US Open. It was his fourth US ... Draw: 128 (16 Q / 8 WC). Champion: Rafael Nadal. Runner-up: Daniil Medvedev. Score: 7–5, 6–3, 5–7, 4–6, 6–4. Bianca Andreescu won the women's singles title, defeating Serena Williams in straight sets in the final, becoming the first Canadian to win a Grand Slam singles ... Rafael Nadal won his 19th career Grand Slam title, and his fourth US Open crown, by surviving an all-time comback effort from Daniil ... Rafael Nadal beats Daniil Medvedev in US Open final to claim 19th major title. World No2 claims 7-5, 6-3, 5-7, 4-6, 6-4 victory over Russian ... Rafael Nadal defeated Daniil Medvedev in the men's singles final of the U.S. Open on Sunday. Rafael Nadal survived. The 33-year-old defeated Daniil Medvedev in the final of the 2019 U.S. Open to earn his 19th Grand Slam title Sunday ... NEW YORK -- Rafael Nadal defeated Daniil Medvedev in an epic five-set match, 7-5, 6-3, 5-7, 4-6, 6-4 to win the men's singles title at the ... Nadal previously won the U.S. Open three times, most recently in 2017. Ahead of the match, Nadal said he was “super happy to be back in the ... Watch the full match between Daniil Medvedev and Rafael ... Duration: 4:47:32. Posted: Mar 20, 2020. US Open 2019: Rafael Nadal beats Daniil Medvedev · Updated: Sep. 08, 2019, 11:11 p.m. |; Published: Sep · Published: Sep. 08, 2019, 10:06 p.m.. 26. US Open ...\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now know that Rafael Nadal won the US Open men's final in 2019 and he is 33 years old.\n", "Action: Calculator\n", - "Action Input: 33^0.334\u001B[0m\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 3.215019829667466\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I now know the final answer.\n", - "Final Answer: Rafael Nadal won the US Open men's final in 2019 and his age raised to the 0.334 power is 3.215019829667466.\u001B[0m\n", + "Action Input: 33^0.334\u001b[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 3.215019829667466\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n", + "Final Answer: Rafael Nadal won the US Open men's final in 2019 and his age raised to the 0.334 power is 3.215019829667466.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", - "\u001B[32;1m\u001B[1;3m I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.\n", "Action: Google Serper\n", - "Action Input: \"Olivia Wilde boyfriend\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3mSudeikis and Wilde's relationship ended in November 2020. Wilde was publicly served with court documents regarding child custody while she was presenting Don't Worry Darling at CinemaCon 2022. In January 2021, Wilde began dating singer Harry Styles after meeting during the filming of Don't Worry Darling.\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to find out Harry Styles' age.\n", + "Action Input: \"Olivia Wilde boyfriend\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mSudeikis and Wilde's relationship ended in November 2020. Wilde was publicly served with court documents regarding child custody while she was presenting Don't Worry Darling at CinemaCon 2022. In January 2021, Wilde began dating singer Harry Styles after meeting during the filming of Don't Worry Darling.\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to find out Harry Styles' age.\n", "Action: Google Serper\n", - "Action Input: \"Harry Styles age\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3m29 years\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to calculate 29 raised to the 0.23 power.\n", + "Action Input: \"Harry Styles age\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3m29 years\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to calculate 29 raised to the 0.23 power.\n", "Action: Calculator\n", - "Action Input: 29^0.23\u001B[0m\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.169459462491557\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I now know the final answer.\n", - "Final Answer: Harry Styles is Olivia Wilde's boyfriend and his current age raised to the 0.23 power is 2.169459462491557.\u001B[0m\n", + "Action Input: 29^0.23\u001b[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.169459462491557\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n", + "Final Answer: Harry Styles is Olivia Wilde's boyfriend and his current age raised to the 0.23 power is 2.169459462491557.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", - "\u001B[32;1m\u001B[1;3m I need to find out who won the most recent grand prix and then calculate their age raised to the 0.23 power.\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to find out who won the most recent grand prix and then calculate their age raised to the 0.23 power.\n", "Action: Google Serper\n", - "Action Input: \"who won the most recent formula 1 grand prix\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3mMax Verstappen won his first Formula 1 world title on Sunday after the championship was decided by a last-lap overtake of his rival Lewis Hamilton in the Abu Dhabi Grand Prix. Dec 12, 2021\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to find out Max Verstappen's age\n", + "Action Input: \"who won the most recent formula 1 grand prix\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mMax Verstappen won his first Formula 1 world title on Sunday after the championship was decided by a last-lap overtake of his rival Lewis Hamilton in the Abu Dhabi Grand Prix. Dec 12, 2021\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to find out Max Verstappen's age\n", "Action: Google Serper\n", - "Action Input: \"Max Verstappen age\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3m25 years\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to calculate 25 raised to the 0.23 power\n", + "Action Input: \"Max Verstappen age\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3m25 years\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to calculate 25 raised to the 0.23 power\n", "Action: Calculator\n", - "Action Input: 25^0.23\u001B[0m\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.096651272316035\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I now know the final answer\n", - "Final Answer: Max Verstappen, aged 25, won the most recent Formula 1 grand prix and his age raised to the 0.23 power is 2.096651272316035.\u001B[0m\n", + "Action Input: 25^0.23\u001b[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.096651272316035\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", + "Final Answer: Max Verstappen, aged 25, won the most recent Formula 1 grand prix and his age raised to the 0.23 power is 2.096651272316035.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", - "\u001B[32;1m\u001B[1;3m I need to find out who won the US Open women's final in 2019 and then calculate her age raised to the 0.34 power.\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to find out who won the US Open women's final in 2019 and then calculate her age raised to the 0.34 power.\n", "Action: Google Serper\n", - "Action Input: \"US Open women's final 2019 winner\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3mWHAT HAPPENED: #SheTheNorth? She the champion. Nineteen-year-old Canadian Bianca Andreescu sealed her first Grand Slam title on Saturday, downing 23-time major champion Serena Williams in the 2019 US Open women's singles final, 6-3, 7-5. Sep 7, 2019\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I now need to calculate her age raised to the 0.34 power.\n", + "Action Input: \"US Open women's final 2019 winner\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mWHAT HAPPENED: #SheTheNorth? She the champion. Nineteen-year-old Canadian Bianca Andreescu sealed her first Grand Slam title on Saturday, downing 23-time major champion Serena Williams in the 2019 US Open women's singles final, 6-3, 7-5. Sep 7, 2019\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now need to calculate her age raised to the 0.34 power.\n", "Action: Calculator\n", - "Action Input: 19^0.34\u001B[0m\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.7212987634680084\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I now know the final answer.\n", - "Final Answer: Nineteen-year-old Canadian Bianca Andreescu won the US Open women's final in 2019 and her age raised to the 0.34 power is 2.7212987634680084.\u001B[0m\n", + "Action Input: 19^0.34\u001b[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.7212987634680084\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n", + "Final Answer: Nineteen-year-old Canadian Bianca Andreescu won the US Open women's final in 2019 and her age raised to the 0.34 power is 2.7212987634680084.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", - "\u001B[32;1m\u001B[1;3m I need to find out who Beyonce's husband is and then calculate his age raised to the 0.19 power.\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to find out who Beyonce's husband is and then calculate his age raised to the 0.19 power.\n", "Action: Google Serper\n", - "Action Input: \"Who is Beyonce's husband?\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3mJay-Z\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to find out Jay-Z's age\n", + "Action Input: \"Who is Beyonce's husband?\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mJay-Z\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to find out Jay-Z's age\n", "Action: Google Serper\n", - "Action Input: \"How old is Jay-Z?\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3m53 years\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to calculate 53 raised to the 0.19 power\n", + "Action Input: \"How old is Jay-Z?\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3m53 years\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to calculate 53 raised to the 0.19 power\n", "Action: Calculator\n", - "Action Input: 53^0.19\u001B[0m\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.12624064206896\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I now know the final answer\n", - "Final Answer: Jay-Z is Beyonce's husband and his age raised to the 0.19 power is 2.12624064206896.\u001B[0m\n", + "Action Input: 53^0.19\u001b[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.12624064206896\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", + "Final Answer: Jay-Z is Beyonce's husband and his age raised to the 0.19 power is 2.12624064206896.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "Serial executed in 89.97 seconds.\n" ] } @@ -197,77 +197,77 @@ "text": [ "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", "\n", "\n", - "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n", - "\u001B[32;1m\u001B[1;3m I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.\n", "Action: Google Serper\n", - "Action Input: \"Olivia Wilde boyfriend\"\u001B[0m\u001B[32;1m\u001B[1;3m I need to find out who Beyonce's husband is and then calculate his age raised to the 0.19 power.\n", + "Action Input: \"Olivia Wilde boyfriend\"\u001b[0m\u001b[32;1m\u001b[1;3m I need to find out who Beyonce's husband is and then calculate his age raised to the 0.19 power.\n", "Action: Google Serper\n", - "Action Input: \"Who is Beyonce's husband?\"\u001B[0m\u001B[32;1m\u001B[1;3m I need to find out who won the most recent formula 1 grand prix and then calculate their age raised to the 0.23 power.\n", + "Action Input: \"Who is Beyonce's husband?\"\u001b[0m\u001b[32;1m\u001b[1;3m I need to find out who won the most recent formula 1 grand prix and then calculate their age raised to the 0.23 power.\n", "Action: Google Serper\n", - "Action Input: \"most recent formula 1 grand prix winner\"\u001B[0m\u001B[32;1m\u001B[1;3m I need to find out who won the US Open men's final in 2019 and then calculate his age raised to the 0.334 power.\n", + "Action Input: \"most recent formula 1 grand prix winner\"\u001b[0m\u001b[32;1m\u001b[1;3m I need to find out who won the US Open men's final in 2019 and then calculate his age raised to the 0.334 power.\n", "Action: Google Serper\n", - "Action Input: \"Who won the US Open men's final in 2019?\"\u001B[0m\u001B[32;1m\u001B[1;3m I need to find out who won the US Open women's final in 2019 and then calculate her age raised to the 0.34 power.\n", + "Action Input: \"Who won the US Open men's final in 2019?\"\u001b[0m\u001b[32;1m\u001b[1;3m I need to find out who won the US Open women's final in 2019 and then calculate her age raised to the 0.34 power.\n", "Action: Google Serper\n", - "Action Input: \"US Open women's final 2019 winner\"\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3mSudeikis and Wilde's relationship ended in November 2020. Wilde was publicly served with court documents regarding child custody while she was presenting Don't Worry Darling at CinemaCon 2022. In January 2021, Wilde began dating singer Harry Styles after meeting during the filming of Don't Worry Darling.\u001B[0m\n", + "Action Input: \"US Open women's final 2019 winner\"\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mSudeikis and Wilde's relationship ended in November 2020. Wilde was publicly served with court documents regarding child custody while she was presenting Don't Worry Darling at CinemaCon 2022. In January 2021, Wilde began dating singer Harry Styles after meeting during the filming of Don't Worry Darling.\u001b[0m\n", "Thought:\n", - "Observation: \u001B[36;1m\u001B[1;3mJay-Z\u001B[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mJay-Z\u001b[0m\n", "Thought:\n", - "Observation: \u001B[36;1m\u001B[1;3mRafael Nadal defeated Daniil Medvedev in the final, 7–5, 6–3, 5–7, 4–6, 6–4 to win the men's singles tennis title at the 2019 US Open. It was his fourth US ... Draw: 128 (16 Q / 8 WC). Champion: Rafael Nadal. Runner-up: Daniil Medvedev. Score: 7–5, 6–3, 5–7, 4–6, 6–4. Bianca Andreescu won the women's singles title, defeating Serena Williams in straight sets in the final, becoming the first Canadian to win a Grand Slam singles ... Rafael Nadal won his 19th career Grand Slam title, and his fourth US Open crown, by surviving an all-time comback effort from Daniil ... Rafael Nadal beats Daniil Medvedev in US Open final to claim 19th major title. World No2 claims 7-5, 6-3, 5-7, 4-6, 6-4 victory over Russian ... Rafael Nadal defeated Daniil Medvedev in the men's singles final of the U.S. Open on Sunday. Rafael Nadal survived. The 33-year-old defeated Daniil Medvedev in the final of the 2019 U.S. Open to earn his 19th Grand Slam title Sunday ... NEW YORK -- Rafael Nadal defeated Daniil Medvedev in an epic five-set match, 7-5, 6-3, 5-7, 4-6, 6-4 to win the men's singles title at the ... Nadal previously won the U.S. Open three times, most recently in 2017. Ahead of the match, Nadal said he was “super happy to be back in the ... Watch the full match between Daniil Medvedev and Rafael ... Duration: 4:47:32. Posted: Mar 20, 2020. US Open 2019: Rafael Nadal beats Daniil Medvedev · Updated: Sep. 08, 2019, 11:11 p.m. |; Published: Sep · Published: Sep. 08, 2019, 10:06 p.m.. 26. US Open ...\u001B[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mRafael Nadal defeated Daniil Medvedev in the final, 7–5, 6–3, 5–7, 4–6, 6–4 to win the men's singles tennis title at the 2019 US Open. It was his fourth US ... Draw: 128 (16 Q / 8 WC). Champion: Rafael Nadal. Runner-up: Daniil Medvedev. Score: 7–5, 6–3, 5–7, 4–6, 6–4. Bianca Andreescu won the women's singles title, defeating Serena Williams in straight sets in the final, becoming the first Canadian to win a Grand Slam singles ... Rafael Nadal won his 19th career Grand Slam title, and his fourth US Open crown, by surviving an all-time comback effort from Daniil ... Rafael Nadal beats Daniil Medvedev in US Open final to claim 19th major title. World No2 claims 7-5, 6-3, 5-7, 4-6, 6-4 victory over Russian ... Rafael Nadal defeated Daniil Medvedev in the men's singles final of the U.S. Open on Sunday. Rafael Nadal survived. The 33-year-old defeated Daniil Medvedev in the final of the 2019 U.S. Open to earn his 19th Grand Slam title Sunday ... NEW YORK -- Rafael Nadal defeated Daniil Medvedev in an epic five-set match, 7-5, 6-3, 5-7, 4-6, 6-4 to win the men's singles title at the ... Nadal previously won the U.S. Open three times, most recently in 2017. Ahead of the match, Nadal said he was “super happy to be back in the ... Watch the full match between Daniil Medvedev and Rafael ... Duration: 4:47:32. Posted: Mar 20, 2020. US Open 2019: Rafael Nadal beats Daniil Medvedev · Updated: Sep. 08, 2019, 11:11 p.m. |; Published: Sep · Published: Sep. 08, 2019, 10:06 p.m.. 26. US Open ...\u001b[0m\n", "Thought:\n", - "Observation: \u001B[36;1m\u001B[1;3mWHAT HAPPENED: #SheTheNorth? She the champion. Nineteen-year-old Canadian Bianca Andreescu sealed her first Grand Slam title on Saturday, downing 23-time major champion Serena Williams in the 2019 US Open women's singles final, 6-3, 7-5. Sep 7, 2019\u001B[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mWHAT HAPPENED: #SheTheNorth? She the champion. Nineteen-year-old Canadian Bianca Andreescu sealed her first Grand Slam title on Saturday, downing 23-time major champion Serena Williams in the 2019 US Open women's singles final, 6-3, 7-5. Sep 7, 2019\u001b[0m\n", "Thought:\n", - "Observation: \u001B[36;1m\u001B[1;3mLewis Hamilton holds the record for the most race wins in Formula One history, with 103 wins to date. Michael Schumacher, the previous record holder, ... Michael Schumacher (top left) and Lewis Hamilton (top right) have each won the championship a record seven times during their careers, while Sebastian Vettel ( ... Grand Prix, Date, Winner, Car, Laps, Time. Bahrain, 05 Mar 2023, Max Verstappen VER, Red Bull Racing Honda RBPT, 57, 1:33:56.736. Saudi Arabia, 19 Mar 2023 ... The Red Bull driver Max Verstappen of the Netherlands celebrated winning his first Formula 1 world title at the Abu Dhabi Grand Prix. Perez wins sprint as Verstappen, Russell clash. Red Bull's Sergio Perez won the first sprint of the 2023 Formula One season after catching and passing Charles ... The most successful driver in the history of F1 is Lewis Hamilton. The man from Stevenage has won 103 Grands Prix throughout his illustrious career and is still ... Lewis Hamilton: 103. Max Verstappen: 37. Michael Schumacher: 91. Fernando Alonso: 32. Max Verstappen and Sergio Perez will race in a very different-looking Red Bull this weekend after the team unveiled a striking special livery for the Miami GP. Lewis Hamilton holds the record of most victories with 103, ahead of Michael Schumacher (91) and Sebastian Vettel (53). Schumacher also holds the record for the ... Lewis Hamilton holds the record for the most race wins in Formula One history, with 103 wins to date. Michael Schumacher, the previous record holder, is second ...\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to find out Harry Styles' age.\n", + "Observation: \u001b[36;1m\u001b[1;3mLewis Hamilton holds the record for the most race wins in Formula One history, with 103 wins to date. Michael Schumacher, the previous record holder, ... Michael Schumacher (top left) and Lewis Hamilton (top right) have each won the championship a record seven times during their careers, while Sebastian Vettel ( ... Grand Prix, Date, Winner, Car, Laps, Time. Bahrain, 05 Mar 2023, Max Verstappen VER, Red Bull Racing Honda RBPT, 57, 1:33:56.736. Saudi Arabia, 19 Mar 2023 ... The Red Bull driver Max Verstappen of the Netherlands celebrated winning his first Formula 1 world title at the Abu Dhabi Grand Prix. Perez wins sprint as Verstappen, Russell clash. Red Bull's Sergio Perez won the first sprint of the 2023 Formula One season after catching and passing Charles ... The most successful driver in the history of F1 is Lewis Hamilton. The man from Stevenage has won 103 Grands Prix throughout his illustrious career and is still ... Lewis Hamilton: 103. Max Verstappen: 37. Michael Schumacher: 91. Fernando Alonso: 32. Max Verstappen and Sergio Perez will race in a very different-looking Red Bull this weekend after the team unveiled a striking special livery for the Miami GP. Lewis Hamilton holds the record of most victories with 103, ahead of Michael Schumacher (91) and Sebastian Vettel (53). Schumacher also holds the record for the ... Lewis Hamilton holds the record for the most race wins in Formula One history, with 103 wins to date. Michael Schumacher, the previous record holder, is second ...\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to find out Harry Styles' age.\n", "Action: Google Serper\n", - "Action Input: \"Harry Styles age\"\u001B[0m\u001B[32;1m\u001B[1;3m I need to find out Jay-Z's age\n", + "Action Input: \"Harry Styles age\"\u001b[0m\u001b[32;1m\u001b[1;3m I need to find out Jay-Z's age\n", "Action: Google Serper\n", - "Action Input: \"How old is Jay-Z?\"\u001B[0m\u001B[32;1m\u001B[1;3m I now know that Rafael Nadal won the US Open men's final in 2019 and he is 33 years old.\n", + "Action Input: \"How old is Jay-Z?\"\u001b[0m\u001b[32;1m\u001b[1;3m I now know that Rafael Nadal won the US Open men's final in 2019 and he is 33 years old.\n", "Action: Calculator\n", - "Action Input: 33^0.334\u001B[0m\u001B[32;1m\u001B[1;3m I now need to calculate her age raised to the 0.34 power.\n", + "Action Input: 33^0.334\u001b[0m\u001b[32;1m\u001b[1;3m I now need to calculate her age raised to the 0.34 power.\n", "Action: Calculator\n", - "Action Input: 19^0.34\u001B[0m\n", - "Observation: \u001B[36;1m\u001B[1;3m29 years\u001B[0m\n", + "Action Input: 19^0.34\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3m29 years\u001b[0m\n", "Thought:\n", - "Observation: \u001B[36;1m\u001B[1;3m53 years\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m Max Verstappen won the most recent Formula 1 grand prix.\n", + "Observation: \u001b[36;1m\u001b[1;3m53 years\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m Max Verstappen won the most recent Formula 1 grand prix.\n", "Action: Calculator\n", - "Action Input: Max Verstappen's age (23) raised to the 0.23 power\u001B[0m\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.7212987634680084\u001B[0m\n", + "Action Input: Max Verstappen's age (23) raised to the 0.23 power\u001b[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.7212987634680084\u001b[0m\n", "Thought:\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 3.215019829667466\u001B[0m\n", - "Thought:\u001B[32;1m\u001B[1;3m I need to calculate 29 raised to the 0.23 power.\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 3.215019829667466\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I need to calculate 29 raised to the 0.23 power.\n", "Action: Calculator\n", - "Action Input: 29^0.23\u001B[0m\u001B[32;1m\u001B[1;3m I need to calculate 53 raised to the 0.19 power\n", + "Action Input: 29^0.23\u001b[0m\u001b[32;1m\u001b[1;3m I need to calculate 53 raised to the 0.19 power\n", "Action: Calculator\n", - "Action Input: 53^0.19\u001B[0m\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.0568252837687546\u001B[0m\n", + "Action Input: 53^0.19\u001b[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.0568252837687546\u001b[0m\n", "Thought:\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.169459462491557\u001B[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.169459462491557\u001b[0m\n", "Thought:\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", - "Observation: \u001B[33;1m\u001B[1;3mAnswer: 2.12624064206896\u001B[0m\n", + "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.12624064206896\u001b[0m\n", "Thought:\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "\n", - "\u001B[1m> Finished chain.\u001B[0m\n", + "\u001b[1m> Finished chain.\u001b[0m\n", "Concurrent executed in 17.52 seconds.\n" ] } From 39a5d022252c24da330b3430ef32f823df29ed21 Mon Sep 17 00:00:00 2001 From: Guy Korland Date: Wed, 23 Aug 2023 17:14:31 +0300 Subject: [PATCH 065/143] Cleanup of ruff warnings use isinstance() instead of type() (#9655) Minor cosmetic PR just cleanup of `ruff` warnings use `isinstance()` instead of `type()` --- libs/langchain/langchain/document_loaders/mhtml.py | 2 +- libs/langchain/langchain/retrievers/self_query/myscale.py | 2 +- libs/langchain/langchain/utilities/serpapi.py | 2 +- .../integration_tests/document_loaders/test_joplin.py | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/langchain/langchain/document_loaders/mhtml.py b/libs/langchain/langchain/document_loaders/mhtml.py index c7b7f55ec..efe1030c2 100644 --- a/libs/langchain/langchain/document_loaders/mhtml.py +++ b/libs/langchain/langchain/document_loaders/mhtml.py @@ -52,7 +52,7 @@ class MHTMLLoader(BaseLoader): message = email.message_from_string(f.read()) parts = message.get_payload() - if type(parts) is not list: + if not isinstance(parts, list): parts = [message] for part in parts: diff --git a/libs/langchain/langchain/retrievers/self_query/myscale.py b/libs/langchain/langchain/retrievers/self_query/myscale.py index 5c11b53d4..e4c5dde4b 100644 --- a/libs/langchain/langchain/retrievers/self_query/myscale.py +++ b/libs/langchain/langchain/retrievers/self_query/myscale.py @@ -103,7 +103,7 @@ class MyScaleTranslator(Visitor): value = comparison.value comp = comparison.comparator - value = f"'{value}'" if type(value) is str else value + value = f"'{value}'" if isinstance(value, str) else value # convert timestamp for datetime objects if type(value) is datetime.date: diff --git a/libs/langchain/langchain/utilities/serpapi.py b/libs/langchain/langchain/utilities/serpapi.py index ab132b53a..4d5af0997 100644 --- a/libs/langchain/langchain/utilities/serpapi.py +++ b/libs/langchain/langchain/utilities/serpapi.py @@ -129,7 +129,7 @@ class SerpAPIWrapper(BaseModel): """Process response from SerpAPI.""" if "error" in res.keys(): raise ValueError(f"Got error from SerpAPI: {res['error']}") - if "answer_box" in res.keys() and type(res["answer_box"]) == list: + if "answer_box" in res.keys() and isinstance(res["answer_box"], list): res["answer_box"] = res["answer_box"][0] if "answer_box" in res.keys() and "answer" in res["answer_box"].keys(): toret = res["answer_box"]["answer"] diff --git a/libs/langchain/tests/integration_tests/document_loaders/test_joplin.py b/libs/langchain/tests/integration_tests/document_loaders/test_joplin.py index 0b7c8dc19..76a1918b6 100644 --- a/libs/langchain/tests/integration_tests/document_loaders/test_joplin.py +++ b/libs/langchain/tests/integration_tests/document_loaders/test_joplin.py @@ -5,7 +5,7 @@ def test_joplin_loader() -> None: loader = JoplinLoader() docs = loader.load() - assert type(docs) is list - assert type(docs[0].page_content) is str - assert type(docs[0].metadata["source"]) is str - assert type(docs[0].metadata["title"]) is str + assert isinstance(docs, list) + assert isinstance(docs[0].page_content, str) + assert isinstance(docs[0].metadata["source"], str) + assert isinstance(docs[0].metadata["title"], str) From f0ae10a20e38f203ac16e38ad47cbb1b1921b828 Mon Sep 17 00:00:00 2001 From: Yong woo Song Date: Wed, 23 Aug 2023 23:15:18 +0900 Subject: [PATCH 066/143] Fix typo in tigris (#9637) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The link has a **typo** in [tigirs docs](https://python.langchain.com/docs/integrations/providers/tigris), so I couldn't access it. So, I have corrected it. Thanks! ☺️ --- docs/extras/integrations/providers/tigris.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extras/integrations/providers/tigris.mdx b/docs/extras/integrations/providers/tigris.mdx index 62a53d471..08c79f095 100644 --- a/docs/extras/integrations/providers/tigris.mdx +++ b/docs/extras/integrations/providers/tigris.mdx @@ -1,6 +1,6 @@ # Tigris -> [Tigris](htttps://tigrisdata.com) is an open source Serverless NoSQL Database and Search Platform designed to simplify building high-performance vector search applications. +> [Tigris](https://tigrisdata.com) is an open source Serverless NoSQL Database and Search Platform designed to simplify building high-performance vector search applications. > `Tigris` eliminates the infrastructure complexity of managing, operating, and synchronizing multiple tools, allowing you to focus on building great applications instead. ## Installation and Setup From 8a03836160194e4a3deb5993d7a888e70aacf0cf Mon Sep 17 00:00:00 2001 From: Zizhong Zhang Date: Wed, 23 Aug 2023 10:04:53 -0700 Subject: [PATCH 067/143] docs: fix PromptGuard docs (#9659) Fix PromptGuard docs. Noticed several trivial issues on the docs when integrating the new class. cc @baskaryan --- docs/extras/integrations/llms/promptguard.ipynb | 10 +++++----- libs/langchain/langchain/llms/promptguard.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/extras/integrations/llms/promptguard.ipynb b/docs/extras/integrations/llms/promptguard.ipynb index 7cc447bbf..f93244eca 100644 --- a/docs/extras/integrations/llms/promptguard.ipynb +++ b/docs/extras/integrations/llms/promptguard.ipynb @@ -39,7 +39,7 @@ "\n", "# Set API keys\n", "\n", - "os.environ['PROMPT_GUARD_API_KEY'] = \"\"\n", + "os.environ['PROMPTGUARD_API_KEY'] = \"\"\n", "os.environ['OPENAI_API_KEY'] = \"\"" ] }, @@ -47,9 +47,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Use PromptGuardLLMWrapper\n", + "# Use PromptGuard LLM Wrapper\n", "\n", - "Applying promptguard to your application could be as simple as wrapping your LLM using the PromptGuardLLMWrapper class by replace `llm=OpenAI()` with `llm=PromptGuardLLMWrapper(OpenAI())`." + "Applying promptguard to your application could be as simple as wrapping your LLM using the PromptGuard class by replace `llm=OpenAI()` with `llm=PromptGuard(base_llm=OpenAI())`." ] }, { @@ -64,7 +64,7 @@ "from langchain.llms import OpenAI\n", "from langchain.memory import ConversationBufferWindowMemory\n", "\n", - "from langchain.llms import PromptGuardLLMWrapper\n", + "from langchain.llms import PromptGuard\n", "\n", "langchain.verbose = True\n", "langchain.debug = True\n", @@ -106,7 +106,7 @@ "\n", "chain = LLMChain(\n", " prompt=PromptTemplate.from_template(prompt_template),\n", - " llm=PromptGuardLLMWrapper(llm=OpenAI()),\n", + " llm=PromptGuard(base_llm=OpenAI()),\n", " memory=ConversationBufferWindowMemory(k=2),\n", " verbose=True,\n", ")\n", diff --git a/libs/langchain/langchain/llms/promptguard.py b/libs/langchain/langchain/llms/promptguard.py index a6e859746..9f99ff401 100644 --- a/libs/langchain/langchain/llms/promptguard.py +++ b/libs/langchain/langchain/llms/promptguard.py @@ -23,10 +23,10 @@ class PromptGuard(LLM): Example: .. code-block:: python - from langchain.llms import PromptGuardLLM + from langchain.llms import PromptGuard from langchain.chat_models import ChatOpenAI - prompt_guard_llm = PromptGuardLLM(base_llm=ChatOpenAI()) + prompt_guard_llm = PromptGuard(base_llm=ChatOpenAI()) """ base_llm: BaseLanguageModel From ef2500584cbb50527b738d3af4b10b8ead56f0f9 Mon Sep 17 00:00:00 2001 From: Bagatur Date: Wed, 23 Aug 2023 10:15:45 -0700 Subject: [PATCH 068/143] fmt --- libs/langchain/langchain/schema/runnable/__init__.py | 2 +- .../langchain/schema/runnable/{locals.py => _locals.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename libs/langchain/langchain/schema/runnable/{locals.py => _locals.py} (100%) diff --git a/libs/langchain/langchain/schema/runnable/__init__.py b/libs/langchain/langchain/schema/runnable/__init__.py index bae6aebb0..16f99324b 100644 --- a/libs/langchain/langchain/schema/runnable/__init__.py +++ b/libs/langchain/langchain/schema/runnable/__init__.py @@ -1,3 +1,4 @@ +from langchain.schema.runnable._locals import GetLocalVar, PutLocalVar from langchain.schema.runnable.base import ( Runnable, RunnableBinding, @@ -7,7 +8,6 @@ from langchain.schema.runnable.base import ( RunnableWithFallbacks, ) from langchain.schema.runnable.config import RunnableConfig -from langchain.schema.runnable.locals import GetLocalVar, PutLocalVar from langchain.schema.runnable.passthrough import RunnablePassthrough from langchain.schema.runnable.router import RouterInput, RouterRunnable diff --git a/libs/langchain/langchain/schema/runnable/locals.py b/libs/langchain/langchain/schema/runnable/_locals.py similarity index 100% rename from libs/langchain/langchain/schema/runnable/locals.py rename to libs/langchain/langchain/schema/runnable/_locals.py From 1c64db575c16bc3a3ec5e815bf5f39d385238222 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:24:27 -0700 Subject: [PATCH 069/143] Runnable locals(#9007) Adds Runnables that can manipulate variables local to a RunnableSequence run --------- Co-authored-by: Nuno Campos --- .../langchain/schema/runnable/__init__.py | 3 + .../langchain/schema/runnable/_locals.py | 156 +++++++++++++++++ .../langchain/schema/runnable/base.py | 164 ++++-------------- .../langchain/schema/runnable/config.py | 44 ++++- .../langchain/schema/runnable/passthrough.py | 5 +- .../unit_tests/schema/runnable/__init__.py | 0 .../__snapshots__/test_runnable.ambr | 1 + .../unit_tests/schema/runnable/test_locals.py | 93 ++++++++++ .../schema/{ => runnable}/test_runnable.py | 27 ++- 9 files changed, 353 insertions(+), 140 deletions(-) create mode 100644 libs/langchain/langchain/schema/runnable/_locals.py create mode 100644 libs/langchain/tests/unit_tests/schema/runnable/__init__.py rename libs/langchain/tests/unit_tests/schema/{ => runnable}/__snapshots__/test_runnable.ambr (99%) create mode 100644 libs/langchain/tests/unit_tests/schema/runnable/test_locals.py rename libs/langchain/tests/unit_tests/schema/{ => runnable}/test_runnable.py (97%) diff --git a/libs/langchain/langchain/schema/runnable/__init__.py b/libs/langchain/langchain/schema/runnable/__init__.py index 0dbabd157..16f99324b 100644 --- a/libs/langchain/langchain/schema/runnable/__init__.py +++ b/libs/langchain/langchain/schema/runnable/__init__.py @@ -1,3 +1,4 @@ +from langchain.schema.runnable._locals import GetLocalVar, PutLocalVar from langchain.schema.runnable.base import ( Runnable, RunnableBinding, @@ -11,6 +12,8 @@ from langchain.schema.runnable.passthrough import RunnablePassthrough from langchain.schema.runnable.router import RouterInput, RouterRunnable __all__ = [ + "GetLocalVar", + "PutLocalVar", "RouterInput", "RouterRunnable", "Runnable", diff --git a/libs/langchain/langchain/schema/runnable/_locals.py b/libs/langchain/langchain/schema/runnable/_locals.py new file mode 100644 index 000000000..755a709fc --- /dev/null +++ b/libs/langchain/langchain/schema/runnable/_locals.py @@ -0,0 +1,156 @@ +from __future__ import annotations + +from typing import Any, AsyncIterator, Dict, Iterator, Mapping, Optional, Union + +from langchain.callbacks.manager import ( + AsyncCallbackManagerForChainRun, + CallbackManagerForChainRun, +) +from langchain.load.serializable import Serializable +from langchain.schema.runnable.base import Input, Output, Runnable +from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable.passthrough import RunnablePassthrough + + +class PutLocalVar(RunnablePassthrough): + key: Union[str, Mapping[str, str]] + """The key(s) to use for storing the input variable(s) in local state. + + If a string is provided then the entire input is stored under that key. If a + Mapping is provided, then the map values are gotten from the input and + stored in local state under the map keys. + """ + + def __init__(self, key: Union[str, Mapping[str, str]], **kwargs: Any) -> None: + super().__init__(key=key, **kwargs) + + def _concat_put( + self, + input: Input, + *, + config: Optional[RunnableConfig] = None, + replace: bool = False, + ) -> None: + if config is None: + raise ValueError( + "PutLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + if isinstance(self.key, str): + if self.key not in config["_locals"] or replace: + config["_locals"][self.key] = input + else: + config["_locals"][self.key] += input + elif isinstance(self.key, Mapping): + if not isinstance(input, Mapping): + raise TypeError( + f"Received key of type Mapping but input of type {type(input)}. " + f"input is expected to be of type Mapping when key is Mapping." + ) + for input_key, put_key in self.key.items(): + if put_key not in config["_locals"] or replace: + config["_locals"][put_key] = input[input_key] + else: + config["_locals"][put_key] += input[input_key] + else: + raise TypeError( + f"`key` should be a string or Mapping[str, str], received type " + f"{(type(self.key))}." + ) + + def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Input: + self._concat_put(input, config=config, replace=True) + return super().invoke(input, config=config) + + async def ainvoke( + self, + input: Input, + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], + ) -> Input: + self._concat_put(input, config=config, replace=True) + return await super().ainvoke(input, config=config) + + def transform( + self, + input: Iterator[Input], + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], + ) -> Iterator[Input]: + for chunk in super().transform(input, config=config): + self._concat_put(chunk, config=config) + yield chunk + + async def atransform( + self, + input: AsyncIterator[Input], + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], + ) -> AsyncIterator[Input]: + async for chunk in super().atransform(input, config=config): + self._concat_put(chunk, config=config) + yield chunk + + +class GetLocalVar( + Serializable, Runnable[Input, Union[Output, Dict[str, Union[Input, Output]]]] +): + key: str + """The key to extract from the local state.""" + passthrough_key: Optional[str] = None + """The key to use for passing through the invocation input. + + If None, then only the value retrieved from local state is returned. Otherwise a + dictionary ``{self.key: <>, self.passthrough_key: <>}`` + is returned. + """ + + def __init__(self, key: str, **kwargs: Any) -> None: + super().__init__(key=key, **kwargs) + + def _get( + self, + input: Input, + run_manager: Union[CallbackManagerForChainRun, Any], + config: RunnableConfig, + ) -> Union[Output, Dict[str, Union[Input, Output]]]: + if self.passthrough_key: + return { + self.key: config["_locals"][self.key], + self.passthrough_key: input, + } + else: + return config["_locals"][self.key] + + async def _aget( + self, + input: Input, + run_manager: AsyncCallbackManagerForChainRun, + config: RunnableConfig, + ) -> Union[Output, Dict[str, Union[Input, Output]]]: + return self._get(input, run_manager, config) + + def invoke( + self, input: Input, config: Optional[RunnableConfig] = None + ) -> Union[Output, Dict[str, Union[Input, Output]]]: + if config is None: + raise ValueError( + "GetLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + + return self._call_with_config(self._get, input, config) + + async def ainvoke( + self, + input: Input, + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], + ) -> Union[Output, Dict[str, Union[Input, Output]]]: + if config is None: + raise ValueError( + "GetLocalVar should only be used in a RunnableSequence, and should " + "therefore always receive a non-null config." + ) + + return await self._acall_with_config(self._aget, input, config) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 87490cdd1..aab395c46 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -5,6 +5,7 @@ import copy import threading from abc import ABC, abstractmethod from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait +from copy import deepcopy from functools import partial from itertools import tee from typing import ( @@ -34,11 +35,16 @@ if TYPE_CHECKING: ) -from langchain.callbacks.base import BaseCallbackManager from langchain.load.dump import dumpd from langchain.load.serializable import Serializable from langchain.pydantic_v1 import Field -from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable.config import ( + RunnableConfig, + ensure_config, + get_async_callback_manager_for_config, + get_callback_manager_for_config, + patch_config, +) from langchain.schema.runnable.utils import ( accepts_run_manager, accepts_run_manager_and_config, @@ -238,9 +244,9 @@ class Runnable(Generic[Input, Output], ABC): ) return ( - config + list(map(ensure_config, config)) if isinstance(config, list) - else [config.copy() if config is not None else {} for _ in range(length)] + else [deepcopy(ensure_config(config)) for _ in range(length)] ) def _call_with_config( @@ -256,14 +262,8 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement invoke() in subclasses.""" - from langchain.callbacks.manager import CallbackManager - - config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) run_manager = callback_manager.on_chain_start( dumpd(self), input, @@ -303,14 +303,8 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement ainvoke() in subclasses.""" - from langchain.callbacks.manager import AsyncCallbackManager - - config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) run_manager = await callback_manager.on_chain_start( dumpd(self), input, @@ -358,8 +352,6 @@ class Runnable(Generic[Input, Output], ABC): """Helper method to transform an Iterator of Input values into an Iterator of Output values, with callbacks. Use this to implement `stream()` or `transform()` in Runnable subclasses.""" - from langchain.callbacks.manager import CallbackManager - # tee the input so we can iterate over it twice input_for_tracing, input_for_transform = tee(input, 2) # Start the input iterator to ensure the input runnable starts before this one @@ -368,12 +360,8 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) run_manager = callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -444,8 +432,6 @@ class Runnable(Generic[Input, Output], ABC): """Helper method to transform an Async Iterator of Input values into an Async Iterator of Output values, with callbacks. Use this to implement `astream()` or `atransform()` in Runnable subclasses.""" - from langchain.callbacks.manager import AsyncCallbackManager - # tee the input so we can iterate over it twice input_for_tracing, input_for_transform = atee(input, 2) # Start the input iterator to ensure the input runnable starts before this one @@ -454,12 +440,8 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) run_manager = await callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -535,19 +517,9 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): yield from self.fallbacks def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: - from langchain.callbacks.manager import CallbackManager - # setup callbacks - config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) # start the root run run_manager = callback_manager.on_chain_start(dumpd(self), input) first_error = None @@ -577,19 +549,9 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Output: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks - config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -808,19 +770,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): ) def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: - from langchain.callbacks.manager import CallbackManager - # setup callbacks - config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) # start the root run run_manager = callback_manager.on_chain_start(dumpd(self), input) @@ -846,19 +798,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Output: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks - config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -993,19 +935,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Iterator[Output]: - from langchain.callbacks.manager import CallbackManager - # setup callbacks - config = config or {} - callback_manager = CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = ensure_config(config) + callback_manager = get_callback_manager_for_config(config) # start the root run run_manager = callback_manager.on_chain_start(dumpd(self), input) @@ -1069,19 +1001,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> AsyncIterator[Output]: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks - config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -1193,7 +1115,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): from langchain.callbacks.manager import CallbackManager # setup callbacks - config = config or {} + config = ensure_config(config) callback_manager = CallbackManager.configure( inheritable_callbacks=config.get("callbacks"), local_callbacks=None, @@ -1216,7 +1138,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): step.invoke, input, # mark each step as a child run - patch_config(config, run_manager.get_child()), + patch_config(deepcopy(config), run_manager.get_child()), ) for step in steps.values() ] @@ -1235,19 +1157,9 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Dict[str, Any]: - from langchain.callbacks.manager import AsyncCallbackManager - # setup callbacks - config = config or {} - callback_manager = AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - local_callbacks=None, - verbose=False, - inheritable_tags=config.get("tags"), - local_tags=None, - inheritable_metadata=config.get("metadata"), - local_metadata=None, - ) + config = ensure_config(config) + callback_manager = get_async_callback_manager_for_config(config) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -1540,14 +1452,6 @@ class RunnableBinding(Serializable, Runnable[Input, Output]): yield item -def patch_config( - config: RunnableConfig, callback_manager: BaseCallbackManager -) -> RunnableConfig: - config = config.copy() - config["callbacks"] = callback_manager - return config - - def coerce_to_runnable( thing: Union[ Runnable[Input, Output], diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index 715b79fd9..00408b7ee 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -1,8 +1,9 @@ from __future__ import annotations -from typing import Any, Dict, List, TypedDict +from typing import Any, Dict, List, Optional, TypedDict -from langchain.callbacks.base import Callbacks +from langchain.callbacks.base import BaseCallbackManager, Callbacks +from langchain.callbacks.manager import AsyncCallbackManager, CallbackManager class RunnableConfig(TypedDict, total=False): @@ -25,3 +26,42 @@ class RunnableConfig(TypedDict, total=False): Callbacks for this call and any sub-calls (eg. a Chain calling an LLM). Tags are passed to all callbacks, metadata is passed to handle*Start callbacks. """ + + _locals: Dict[str, Any] + """ + Local variables + """ + + +def ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: + empty = RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) + if config is not None: + empty.update(config) + return empty + + +def patch_config( + config: RunnableConfig, + callbacks: BaseCallbackManager, +) -> RunnableConfig: + config = config.copy() + config["callbacks"] = callbacks + return config + + +def get_callback_manager_for_config(config: RunnableConfig) -> CallbackManager: + return CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) + + +def get_async_callback_manager_for_config( + config: RunnableConfig, +) -> AsyncCallbackManager: + return AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) diff --git a/libs/langchain/langchain/schema/runnable/passthrough.py b/libs/langchain/langchain/schema/runnable/passthrough.py index 420b13fe8..d5d7c152c 100644 --- a/libs/langchain/langchain/schema/runnable/passthrough.py +++ b/libs/langchain/langchain/schema/runnable/passthrough.py @@ -47,10 +47,11 @@ class RunnablePassthrough(Serializable, Runnable[Input, Input]): ) -> Iterator[Input]: return self._transform_stream_with_config(input, identity, config) - def atransform( + async def atransform( self, input: AsyncIterator[Input], config: Optional[RunnableConfig] = None, **kwargs: Any, ) -> AsyncIterator[Input]: - return self._atransform_stream_with_config(input, identity, config) + async for chunk in self._atransform_stream_with_config(input, identity, config): + yield chunk diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__init__.py b/libs/langchain/tests/unit_tests/schema/runnable/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr similarity index 99% rename from libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr rename to libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index 321edb7a2..11e554a9c 100644 --- a/libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -1352,6 +1352,7 @@ "lc": 1, "type": "not_implemented", "id": [ + "runnable", "test_runnable", "FakeRetriever" ] diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py new file mode 100644 index 000000000..ee07c0cfc --- /dev/null +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py @@ -0,0 +1,93 @@ +from typing import Any, Callable, Type + +import pytest + +from langchain import PromptTemplate +from langchain.llms import FakeListLLM +from langchain.schema.runnable import ( + GetLocalVar, + PutLocalVar, + RunnablePassthrough, + RunnableSequence, +) + + +@pytest.mark.parametrize( + ("method", "input", "output"), + [ + (lambda r, x: r.invoke(x), "foo", "foo"), + (lambda r, x: r.batch(x), ["foo", "bar"], ["foo", "bar"]), + (lambda r, x: list(r.stream(x))[0], "foo", "foo"), + ], +) +def test_put_get(method: Callable, input: Any, output: Any) -> None: + runnable = PutLocalVar("input") | GetLocalVar("input") + assert method(runnable, input) == output + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + ("method", "input", "output"), + [ + (lambda r, x: r.ainvoke(x), "foo", "foo"), + (lambda r, x: r.abatch(x), ["foo", "bar"], ["foo", "bar"]), + ], +) +async def test_put_get_async(method: Callable, input: Any, output: Any) -> None: + runnable = PutLocalVar("input") | GetLocalVar("input") + assert await method(runnable, input) == output + + +@pytest.mark.parametrize( + ("runnable", "error"), + [ + (PutLocalVar("input"), ValueError), + (GetLocalVar("input"), ValueError), + (PutLocalVar("input") | GetLocalVar("missing"), KeyError), + ], +) +def test_incorrect_usage(runnable: RunnableSequence, error: Type[Exception]) -> None: + with pytest.raises(error): + runnable.invoke("foo") + + +def test_get_in_map() -> None: + runnable: RunnableSequence = PutLocalVar("input") | {"bar": GetLocalVar("input")} + assert runnable.invoke("foo") == {"bar": "foo"} + + +def test_put_in_map() -> None: + runnable: RunnableSequence = {"bar": PutLocalVar("input")} | GetLocalVar("input") + with pytest.raises(KeyError): + runnable.invoke("foo") + + +@pytest.mark.parametrize( + "runnable", + [ + PutLocalVar("input") | GetLocalVar("input", passthrough_key="output"), + ( + PutLocalVar("input") + | {"input": RunnablePassthrough()} + | PromptTemplate.from_template("say {input}") + | FakeListLLM(responses=["hello"]) + | GetLocalVar("input", passthrough_key="output") + ), + ], +) +@pytest.mark.parametrize( + ("method", "input", "output"), + [ + (lambda r, x: r.invoke(x), "hello", {"input": "hello", "output": "hello"}), + (lambda r, x: r.batch(x), ["hello"], [{"input": "hello", "output": "hello"}]), + ( + lambda r, x: list(r.stream(x))[0], + "hello", + {"input": "hello", "output": "hello"}, + ), + ], +) +def test_put_get_sequence( + runnable: RunnableSequence, method: Callable, input: Any, output: Any +) -> None: + assert method(runnable, input) == output diff --git a/libs/langchain/tests/unit_tests/schema/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py similarity index 97% rename from libs/langchain/tests/unit_tests/schema/test_runnable.py rename to libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 352ddea40..80d63c691 100644 --- a/libs/langchain/tests/unit_tests/schema/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -132,15 +132,24 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: ["hello", "wooorld"], [dict(tags=["a-tag"]), dict(metadata={"key": "value"})] ) == [5, 7] assert spy.call_args_list == [ - mocker.call("hello", dict(tags=["a-tag"])), - mocker.call("wooorld", dict(metadata={"key": "value"})), + mocker.call( + "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) + ), + mocker.call( + "wooorld", + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + ), ] spy.reset_mock() assert fake.batch(["hello", "wooorld"], dict(tags=["a-tag"])) == [5, 7] assert spy.call_args_list == [ - mocker.call("hello", dict(tags=["a-tag"])), - mocker.call("wooorld", dict(tags=["a-tag"])), + mocker.call( + "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) + ), + mocker.call( + "wooorld", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) + ), ] spy.reset_mock() @@ -161,8 +170,14 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: 7, ] assert spy.call_args_list == [ - mocker.call("hello", dict(metadata={"key": "value"})), - mocker.call("wooorld", dict(metadata={"key": "value"})), + mocker.call( + "hello", + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + ), + mocker.call( + "wooorld", + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + ), ] From ef87affd4d40d6810a2dbba4d7b25913fc2955e9 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:24:59 -0700 Subject: [PATCH 070/143] Revert "Locals in config" (#9661) Reverts langchain-ai/langchain#9007 --- .../langchain/schema/runnable/__init__.py | 3 - .../langchain/schema/runnable/_locals.py | 156 ----------------- .../langchain/schema/runnable/base.py | 164 ++++++++++++++---- .../langchain/schema/runnable/config.py | 44 +---- .../langchain/schema/runnable/passthrough.py | 5 +- .../__snapshots__/test_runnable.ambr | 1 - .../unit_tests/schema/runnable/__init__.py | 0 .../unit_tests/schema/runnable/test_locals.py | 93 ---------- .../schema/{runnable => }/test_runnable.py | 27 +-- 9 files changed, 140 insertions(+), 353 deletions(-) delete mode 100644 libs/langchain/langchain/schema/runnable/_locals.py rename libs/langchain/tests/unit_tests/schema/{runnable => }/__snapshots__/test_runnable.ambr (99%) delete mode 100644 libs/langchain/tests/unit_tests/schema/runnable/__init__.py delete mode 100644 libs/langchain/tests/unit_tests/schema/runnable/test_locals.py rename libs/langchain/tests/unit_tests/schema/{runnable => }/test_runnable.py (97%) diff --git a/libs/langchain/langchain/schema/runnable/__init__.py b/libs/langchain/langchain/schema/runnable/__init__.py index 16f99324b..0dbabd157 100644 --- a/libs/langchain/langchain/schema/runnable/__init__.py +++ b/libs/langchain/langchain/schema/runnable/__init__.py @@ -1,4 +1,3 @@ -from langchain.schema.runnable._locals import GetLocalVar, PutLocalVar from langchain.schema.runnable.base import ( Runnable, RunnableBinding, @@ -12,8 +11,6 @@ from langchain.schema.runnable.passthrough import RunnablePassthrough from langchain.schema.runnable.router import RouterInput, RouterRunnable __all__ = [ - "GetLocalVar", - "PutLocalVar", "RouterInput", "RouterRunnable", "Runnable", diff --git a/libs/langchain/langchain/schema/runnable/_locals.py b/libs/langchain/langchain/schema/runnable/_locals.py deleted file mode 100644 index 755a709fc..000000000 --- a/libs/langchain/langchain/schema/runnable/_locals.py +++ /dev/null @@ -1,156 +0,0 @@ -from __future__ import annotations - -from typing import Any, AsyncIterator, Dict, Iterator, Mapping, Optional, Union - -from langchain.callbacks.manager import ( - AsyncCallbackManagerForChainRun, - CallbackManagerForChainRun, -) -from langchain.load.serializable import Serializable -from langchain.schema.runnable.base import Input, Output, Runnable -from langchain.schema.runnable.config import RunnableConfig -from langchain.schema.runnable.passthrough import RunnablePassthrough - - -class PutLocalVar(RunnablePassthrough): - key: Union[str, Mapping[str, str]] - """The key(s) to use for storing the input variable(s) in local state. - - If a string is provided then the entire input is stored under that key. If a - Mapping is provided, then the map values are gotten from the input and - stored in local state under the map keys. - """ - - def __init__(self, key: Union[str, Mapping[str, str]], **kwargs: Any) -> None: - super().__init__(key=key, **kwargs) - - def _concat_put( - self, - input: Input, - *, - config: Optional[RunnableConfig] = None, - replace: bool = False, - ) -> None: - if config is None: - raise ValueError( - "PutLocalVar should only be used in a RunnableSequence, and should " - "therefore always receive a non-null config." - ) - if isinstance(self.key, str): - if self.key not in config["_locals"] or replace: - config["_locals"][self.key] = input - else: - config["_locals"][self.key] += input - elif isinstance(self.key, Mapping): - if not isinstance(input, Mapping): - raise TypeError( - f"Received key of type Mapping but input of type {type(input)}. " - f"input is expected to be of type Mapping when key is Mapping." - ) - for input_key, put_key in self.key.items(): - if put_key not in config["_locals"] or replace: - config["_locals"][put_key] = input[input_key] - else: - config["_locals"][put_key] += input[input_key] - else: - raise TypeError( - f"`key` should be a string or Mapping[str, str], received type " - f"{(type(self.key))}." - ) - - def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Input: - self._concat_put(input, config=config, replace=True) - return super().invoke(input, config=config) - - async def ainvoke( - self, - input: Input, - config: Optional[RunnableConfig] = None, - **kwargs: Optional[Any], - ) -> Input: - self._concat_put(input, config=config, replace=True) - return await super().ainvoke(input, config=config) - - def transform( - self, - input: Iterator[Input], - config: Optional[RunnableConfig] = None, - **kwargs: Optional[Any], - ) -> Iterator[Input]: - for chunk in super().transform(input, config=config): - self._concat_put(chunk, config=config) - yield chunk - - async def atransform( - self, - input: AsyncIterator[Input], - config: Optional[RunnableConfig] = None, - **kwargs: Optional[Any], - ) -> AsyncIterator[Input]: - async for chunk in super().atransform(input, config=config): - self._concat_put(chunk, config=config) - yield chunk - - -class GetLocalVar( - Serializable, Runnable[Input, Union[Output, Dict[str, Union[Input, Output]]]] -): - key: str - """The key to extract from the local state.""" - passthrough_key: Optional[str] = None - """The key to use for passing through the invocation input. - - If None, then only the value retrieved from local state is returned. Otherwise a - dictionary ``{self.key: <>, self.passthrough_key: <>}`` - is returned. - """ - - def __init__(self, key: str, **kwargs: Any) -> None: - super().__init__(key=key, **kwargs) - - def _get( - self, - input: Input, - run_manager: Union[CallbackManagerForChainRun, Any], - config: RunnableConfig, - ) -> Union[Output, Dict[str, Union[Input, Output]]]: - if self.passthrough_key: - return { - self.key: config["_locals"][self.key], - self.passthrough_key: input, - } - else: - return config["_locals"][self.key] - - async def _aget( - self, - input: Input, - run_manager: AsyncCallbackManagerForChainRun, - config: RunnableConfig, - ) -> Union[Output, Dict[str, Union[Input, Output]]]: - return self._get(input, run_manager, config) - - def invoke( - self, input: Input, config: Optional[RunnableConfig] = None - ) -> Union[Output, Dict[str, Union[Input, Output]]]: - if config is None: - raise ValueError( - "GetLocalVar should only be used in a RunnableSequence, and should " - "therefore always receive a non-null config." - ) - - return self._call_with_config(self._get, input, config) - - async def ainvoke( - self, - input: Input, - config: Optional[RunnableConfig] = None, - **kwargs: Optional[Any], - ) -> Union[Output, Dict[str, Union[Input, Output]]]: - if config is None: - raise ValueError( - "GetLocalVar should only be used in a RunnableSequence, and should " - "therefore always receive a non-null config." - ) - - return await self._acall_with_config(self._aget, input, config) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index aab395c46..87490cdd1 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -5,7 +5,6 @@ import copy import threading from abc import ABC, abstractmethod from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait -from copy import deepcopy from functools import partial from itertools import tee from typing import ( @@ -35,16 +34,11 @@ if TYPE_CHECKING: ) +from langchain.callbacks.base import BaseCallbackManager from langchain.load.dump import dumpd from langchain.load.serializable import Serializable from langchain.pydantic_v1 import Field -from langchain.schema.runnable.config import ( - RunnableConfig, - ensure_config, - get_async_callback_manager_for_config, - get_callback_manager_for_config, - patch_config, -) +from langchain.schema.runnable.config import RunnableConfig from langchain.schema.runnable.utils import ( accepts_run_manager, accepts_run_manager_and_config, @@ -244,9 +238,9 @@ class Runnable(Generic[Input, Output], ABC): ) return ( - list(map(ensure_config, config)) + config if isinstance(config, list) - else [deepcopy(ensure_config(config)) for _ in range(length)] + else [config.copy() if config is not None else {} for _ in range(length)] ) def _call_with_config( @@ -262,8 +256,14 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement invoke() in subclasses.""" - config = ensure_config(config) - callback_manager = get_callback_manager_for_config(config) + from langchain.callbacks.manager import CallbackManager + + config = config or {} + callback_manager = CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) run_manager = callback_manager.on_chain_start( dumpd(self), input, @@ -303,8 +303,14 @@ class Runnable(Generic[Input, Output], ABC): ) -> Output: """Helper method to transform an Input value to an Output value, with callbacks. Use this method to implement ainvoke() in subclasses.""" - config = ensure_config(config) - callback_manager = get_async_callback_manager_for_config(config) + from langchain.callbacks.manager import AsyncCallbackManager + + config = config or {} + callback_manager = AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) run_manager = await callback_manager.on_chain_start( dumpd(self), input, @@ -352,6 +358,8 @@ class Runnable(Generic[Input, Output], ABC): """Helper method to transform an Iterator of Input values into an Iterator of Output values, with callbacks. Use this to implement `stream()` or `transform()` in Runnable subclasses.""" + from langchain.callbacks.manager import CallbackManager + # tee the input so we can iterate over it twice input_for_tracing, input_for_transform = tee(input, 2) # Start the input iterator to ensure the input runnable starts before this one @@ -360,8 +368,12 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = ensure_config(config) - callback_manager = get_callback_manager_for_config(config) + config = config or {} + callback_manager = CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) run_manager = callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -432,6 +444,8 @@ class Runnable(Generic[Input, Output], ABC): """Helper method to transform an Async Iterator of Input values into an Async Iterator of Output values, with callbacks. Use this to implement `astream()` or `atransform()` in Runnable subclasses.""" + from langchain.callbacks.manager import AsyncCallbackManager + # tee the input so we can iterate over it twice input_for_tracing, input_for_transform = atee(input, 2) # Start the input iterator to ensure the input runnable starts before this one @@ -440,8 +454,12 @@ class Runnable(Generic[Input, Output], ABC): final_output: Optional[Output] = None final_output_supported = True - config = ensure_config(config) - callback_manager = get_async_callback_manager_for_config(config) + config = config or {} + callback_manager = AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + inheritable_tags=config.get("tags"), + inheritable_metadata=config.get("metadata"), + ) run_manager = await callback_manager.on_chain_start( dumpd(self), {"input": ""}, @@ -517,9 +535,19 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): yield from self.fallbacks def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: + from langchain.callbacks.manager import CallbackManager + # setup callbacks - config = ensure_config(config) - callback_manager = get_callback_manager_for_config(config) + config = config or {} + callback_manager = CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + local_callbacks=None, + verbose=False, + inheritable_tags=config.get("tags"), + local_tags=None, + inheritable_metadata=config.get("metadata"), + local_metadata=None, + ) # start the root run run_manager = callback_manager.on_chain_start(dumpd(self), input) first_error = None @@ -549,9 +577,19 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Output: + from langchain.callbacks.manager import AsyncCallbackManager + # setup callbacks - config = ensure_config(config) - callback_manager = get_async_callback_manager_for_config(config) + config = config or {} + callback_manager = AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + local_callbacks=None, + verbose=False, + inheritable_tags=config.get("tags"), + local_tags=None, + inheritable_metadata=config.get("metadata"), + local_metadata=None, + ) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -770,9 +808,19 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): ) def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output: + from langchain.callbacks.manager import CallbackManager + # setup callbacks - config = ensure_config(config) - callback_manager = get_callback_manager_for_config(config) + config = config or {} + callback_manager = CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + local_callbacks=None, + verbose=False, + inheritable_tags=config.get("tags"), + local_tags=None, + inheritable_metadata=config.get("metadata"), + local_metadata=None, + ) # start the root run run_manager = callback_manager.on_chain_start(dumpd(self), input) @@ -798,9 +846,19 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Output: + from langchain.callbacks.manager import AsyncCallbackManager + # setup callbacks - config = ensure_config(config) - callback_manager = get_async_callback_manager_for_config(config) + config = config or {} + callback_manager = AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + local_callbacks=None, + verbose=False, + inheritable_tags=config.get("tags"), + local_tags=None, + inheritable_metadata=config.get("metadata"), + local_metadata=None, + ) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -935,9 +993,19 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Iterator[Output]: + from langchain.callbacks.manager import CallbackManager + # setup callbacks - config = ensure_config(config) - callback_manager = get_callback_manager_for_config(config) + config = config or {} + callback_manager = CallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + local_callbacks=None, + verbose=False, + inheritable_tags=config.get("tags"), + local_tags=None, + inheritable_metadata=config.get("metadata"), + local_metadata=None, + ) # start the root run run_manager = callback_manager.on_chain_start(dumpd(self), input) @@ -1001,9 +1069,19 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> AsyncIterator[Output]: + from langchain.callbacks.manager import AsyncCallbackManager + # setup callbacks - config = ensure_config(config) - callback_manager = get_async_callback_manager_for_config(config) + config = config or {} + callback_manager = AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + local_callbacks=None, + verbose=False, + inheritable_tags=config.get("tags"), + local_tags=None, + inheritable_metadata=config.get("metadata"), + local_metadata=None, + ) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -1115,7 +1193,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): from langchain.callbacks.manager import CallbackManager # setup callbacks - config = ensure_config(config) + config = config or {} callback_manager = CallbackManager.configure( inheritable_callbacks=config.get("callbacks"), local_callbacks=None, @@ -1138,7 +1216,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): step.invoke, input, # mark each step as a child run - patch_config(deepcopy(config), run_manager.get_child()), + patch_config(config, run_manager.get_child()), ) for step in steps.values() ] @@ -1157,9 +1235,19 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Dict[str, Any]: + from langchain.callbacks.manager import AsyncCallbackManager + # setup callbacks - config = ensure_config(config) - callback_manager = get_async_callback_manager_for_config(config) + config = config or {} + callback_manager = AsyncCallbackManager.configure( + inheritable_callbacks=config.get("callbacks"), + local_callbacks=None, + verbose=False, + inheritable_tags=config.get("tags"), + local_tags=None, + inheritable_metadata=config.get("metadata"), + local_metadata=None, + ) # start the root run run_manager = await callback_manager.on_chain_start(dumpd(self), input) @@ -1452,6 +1540,14 @@ class RunnableBinding(Serializable, Runnable[Input, Output]): yield item +def patch_config( + config: RunnableConfig, callback_manager: BaseCallbackManager +) -> RunnableConfig: + config = config.copy() + config["callbacks"] = callback_manager + return config + + def coerce_to_runnable( thing: Union[ Runnable[Input, Output], diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index 00408b7ee..715b79fd9 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -1,9 +1,8 @@ from __future__ import annotations -from typing import Any, Dict, List, Optional, TypedDict +from typing import Any, Dict, List, TypedDict -from langchain.callbacks.base import BaseCallbackManager, Callbacks -from langchain.callbacks.manager import AsyncCallbackManager, CallbackManager +from langchain.callbacks.base import Callbacks class RunnableConfig(TypedDict, total=False): @@ -26,42 +25,3 @@ class RunnableConfig(TypedDict, total=False): Callbacks for this call and any sub-calls (eg. a Chain calling an LLM). Tags are passed to all callbacks, metadata is passed to handle*Start callbacks. """ - - _locals: Dict[str, Any] - """ - Local variables - """ - - -def ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: - empty = RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) - if config is not None: - empty.update(config) - return empty - - -def patch_config( - config: RunnableConfig, - callbacks: BaseCallbackManager, -) -> RunnableConfig: - config = config.copy() - config["callbacks"] = callbacks - return config - - -def get_callback_manager_for_config(config: RunnableConfig) -> CallbackManager: - return CallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) - - -def get_async_callback_manager_for_config( - config: RunnableConfig, -) -> AsyncCallbackManager: - return AsyncCallbackManager.configure( - inheritable_callbacks=config.get("callbacks"), - inheritable_tags=config.get("tags"), - inheritable_metadata=config.get("metadata"), - ) diff --git a/libs/langchain/langchain/schema/runnable/passthrough.py b/libs/langchain/langchain/schema/runnable/passthrough.py index d5d7c152c..420b13fe8 100644 --- a/libs/langchain/langchain/schema/runnable/passthrough.py +++ b/libs/langchain/langchain/schema/runnable/passthrough.py @@ -47,11 +47,10 @@ class RunnablePassthrough(Serializable, Runnable[Input, Input]): ) -> Iterator[Input]: return self._transform_stream_with_config(input, identity, config) - async def atransform( + def atransform( self, input: AsyncIterator[Input], config: Optional[RunnableConfig] = None, **kwargs: Any, ) -> AsyncIterator[Input]: - async for chunk in self._atransform_stream_with_config(input, identity, config): - yield chunk + return self._atransform_stream_with_config(input, identity, config) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr similarity index 99% rename from libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr rename to libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr index 11e554a9c..321edb7a2 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/__snapshots__/test_runnable.ambr @@ -1352,7 +1352,6 @@ "lc": 1, "type": "not_implemented", "id": [ - "runnable", "test_runnable", "FakeRetriever" ] diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__init__.py b/libs/langchain/tests/unit_tests/schema/runnable/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py b/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py deleted file mode 100644 index ee07c0cfc..000000000 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_locals.py +++ /dev/null @@ -1,93 +0,0 @@ -from typing import Any, Callable, Type - -import pytest - -from langchain import PromptTemplate -from langchain.llms import FakeListLLM -from langchain.schema.runnable import ( - GetLocalVar, - PutLocalVar, - RunnablePassthrough, - RunnableSequence, -) - - -@pytest.mark.parametrize( - ("method", "input", "output"), - [ - (lambda r, x: r.invoke(x), "foo", "foo"), - (lambda r, x: r.batch(x), ["foo", "bar"], ["foo", "bar"]), - (lambda r, x: list(r.stream(x))[0], "foo", "foo"), - ], -) -def test_put_get(method: Callable, input: Any, output: Any) -> None: - runnable = PutLocalVar("input") | GetLocalVar("input") - assert method(runnable, input) == output - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - ("method", "input", "output"), - [ - (lambda r, x: r.ainvoke(x), "foo", "foo"), - (lambda r, x: r.abatch(x), ["foo", "bar"], ["foo", "bar"]), - ], -) -async def test_put_get_async(method: Callable, input: Any, output: Any) -> None: - runnable = PutLocalVar("input") | GetLocalVar("input") - assert await method(runnable, input) == output - - -@pytest.mark.parametrize( - ("runnable", "error"), - [ - (PutLocalVar("input"), ValueError), - (GetLocalVar("input"), ValueError), - (PutLocalVar("input") | GetLocalVar("missing"), KeyError), - ], -) -def test_incorrect_usage(runnable: RunnableSequence, error: Type[Exception]) -> None: - with pytest.raises(error): - runnable.invoke("foo") - - -def test_get_in_map() -> None: - runnable: RunnableSequence = PutLocalVar("input") | {"bar": GetLocalVar("input")} - assert runnable.invoke("foo") == {"bar": "foo"} - - -def test_put_in_map() -> None: - runnable: RunnableSequence = {"bar": PutLocalVar("input")} | GetLocalVar("input") - with pytest.raises(KeyError): - runnable.invoke("foo") - - -@pytest.mark.parametrize( - "runnable", - [ - PutLocalVar("input") | GetLocalVar("input", passthrough_key="output"), - ( - PutLocalVar("input") - | {"input": RunnablePassthrough()} - | PromptTemplate.from_template("say {input}") - | FakeListLLM(responses=["hello"]) - | GetLocalVar("input", passthrough_key="output") - ), - ], -) -@pytest.mark.parametrize( - ("method", "input", "output"), - [ - (lambda r, x: r.invoke(x), "hello", {"input": "hello", "output": "hello"}), - (lambda r, x: r.batch(x), ["hello"], [{"input": "hello", "output": "hello"}]), - ( - lambda r, x: list(r.stream(x))[0], - "hello", - {"input": "hello", "output": "hello"}, - ), - ], -) -def test_put_get_sequence( - runnable: RunnableSequence, method: Callable, input: Any, output: Any -) -> None: - assert method(runnable, input) == output diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/test_runnable.py similarity index 97% rename from libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py rename to libs/langchain/tests/unit_tests/schema/test_runnable.py index 80d63c691..352ddea40 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/test_runnable.py @@ -132,24 +132,15 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: ["hello", "wooorld"], [dict(tags=["a-tag"]), dict(metadata={"key": "value"})] ) == [5, 7] assert spy.call_args_list == [ - mocker.call( - "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) - ), - mocker.call( - "wooorld", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), - ), + mocker.call("hello", dict(tags=["a-tag"])), + mocker.call("wooorld", dict(metadata={"key": "value"})), ] spy.reset_mock() assert fake.batch(["hello", "wooorld"], dict(tags=["a-tag"])) == [5, 7] assert spy.call_args_list == [ - mocker.call( - "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) - ), - mocker.call( - "wooorld", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) - ), + mocker.call("hello", dict(tags=["a-tag"])), + mocker.call("wooorld", dict(tags=["a-tag"])), ] spy.reset_mock() @@ -170,14 +161,8 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: 7, ] assert spy.call_args_list == [ - mocker.call( - "hello", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), - ), - mocker.call( - "wooorld", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), - ), + mocker.call("hello", dict(metadata={"key": "value"})), + mocker.call("wooorld", dict(metadata={"key": "value"})), ] From 5508baf1eb991240030ce0dde57678619c64063a Mon Sep 17 00:00:00 2001 From: karynzv Date: Wed, 23 Aug 2023 18:33:37 +0100 Subject: [PATCH 071/143] Add CrateDB prompt (#9657) Adds a prompt template for the CrateDB SQL dialect. --- .../langchain/chains/sql_database/prompt.py | 21 +++++++++++++++++++ libs/langchain/pyproject.toml | 2 +- pyproject.toml | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/chains/sql_database/prompt.py b/libs/langchain/langchain/chains/sql_database/prompt.py index 3b2040931..b212ecd30 100644 --- a/libs/langchain/langchain/chains/sql_database/prompt.py +++ b/libs/langchain/langchain/chains/sql_database/prompt.py @@ -42,6 +42,26 @@ DECIDER_PROMPT = PromptTemplate( output_parser=CommaSeparatedListOutputParser(), ) +_cratedb_prompt = """You are a CrateDB expert. Given an input question, first create a syntactically correct CrateDB query to run, then look at the results of the query and return the answer to the input question. +Unless the user specifies in the question a specific number of examples to obtain, query for at most {top_k} results using the LIMIT clause as per CrateDB. You can order the results to return the most informative data in the database. +Never query for all columns from a table. You must query only the columns that are needed to answer the question. Wrap each column name in double quotes (") to denote them as delimited identifiers. +Pay attention to use only the column names you can see in the tables below. Be careful to not query for columns that do not exist. Also, pay attention to which column is in which table. +Pay attention to use CURRENT_DATE function to get the current date, if the question involves "today". + +Use the following format: + +Question: Question here +SQLQuery: SQL Query to run +SQLResult: Result of the SQLQuery +Answer: Final answer here + +""" + +CRATEDB_PROMPT = PromptTemplate( + input_variables=["input", "table_info", "top_k"], + template=_cratedb_prompt + PROMPT_SUFFIX, +) + _duckdb_prompt = """You are a DuckDB expert. Given an input question, first create a syntactically correct DuckDB query to run, then look at the results of the query and return the answer to the input question. Unless the user specifies in the question a specific number of examples to obtain, query for at most {top_k} results using the LIMIT clause as per DuckDB. You can order the results to return the most informative data in the database. Never query for all columns from a table. You must query only the columns that are needed to answer the question. Wrap each column name in double quotes (") to denote them as delimited identifiers. @@ -250,6 +270,7 @@ PRESTODB_PROMPT = PromptTemplate( SQL_PROMPTS = { + "crate": CRATEDB_PROMPT, "duckdb": DUCKDB_PROMPT, "googlesql": GOOGLESQL_PROMPT, "mssql": MSSQL_PROMPT, diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 61f05175d..296cbae35 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -391,4 +391,4 @@ ignore-regex = '.*(Stati Uniti|Tense=Pres).*' # whats is a typo but used frequently in queries so kept as is # aapply - async apply # unsecure - typo but part of API, decided to not bother for now -ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon' +ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate' diff --git a/pyproject.toml b/pyproject.toml index f886dda49..dcf5c938a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,4 +40,4 @@ ignore-regex = '.*(Stati Uniti|Tense=Pres).*' # whats is a typo but used frequently in queries so kept as is # aapply - async apply # unsecure - typo but part of API, decided to not bother for now -ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon' \ No newline at end of file +ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate' \ No newline at end of file From d8e2dd4c89e52372de3a20690005b1597b706e6a Mon Sep 17 00:00:00 2001 From: Bagatur Date: Wed, 23 Aug 2023 11:30:44 -0700 Subject: [PATCH 072/143] mv --- docs/docs_skeleton/vercel.json | 4 ++++ .../{ => text_embedding}/caching_embeddings.ipynb | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) rename docs/extras/modules/data_connection/{ => text_embedding}/caching_embeddings.ipynb (99%) diff --git a/docs/docs_skeleton/vercel.json b/docs/docs_skeleton/vercel.json index fe9f5ace3..b88a1f8e2 100644 --- a/docs/docs_skeleton/vercel.json +++ b/docs/docs_skeleton/vercel.json @@ -1,5 +1,9 @@ { "redirects": [ + { + "source": "/docs/modules/data_connection/caching_embeddings(/?)", + "destination": "/docs/modules/data_connection/text_embedding/caching_embeddings" + }, { "source": "/en/latest/additional_resources/youtube.html", "destination": "/docs/additional_resources/youtube" diff --git a/docs/extras/modules/data_connection/caching_embeddings.ipynb b/docs/extras/modules/data_connection/text_embedding/caching_embeddings.ipynb similarity index 99% rename from docs/extras/modules/data_connection/caching_embeddings.ipynb rename to docs/extras/modules/data_connection/text_embedding/caching_embeddings.ipynb index bf87f9e05..2a2c3b09d 100644 --- a/docs/extras/modules/data_connection/caching_embeddings.ipynb +++ b/docs/extras/modules/data_connection/text_embedding/caching_embeddings.ipynb @@ -5,7 +5,7 @@ "id": "bf4061ce", "metadata": {}, "source": [ - "# Caching Embeddings\n", + "# Caching\n", "\n", "Embeddings can be stored or temporarily cached to avoid needing to recompute them.\n", "\n", @@ -586,7 +586,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.10" + "version": "3.9.1" } }, "nbformat": 4, From d414d47c7891064be3ceefe7ea537602b410ffa5 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 11:34:18 +0100 Subject: [PATCH 073/143] Use a shared executor for all parallel calls --- .../langchain/schema/runnable/__init__.py | 3 +- .../langchain/schema/runnable/base.py | 132 +++++++++--------- .../langchain/schema/runnable/config.py | 48 ++++++- .../schema/runnable/test_runnable.py | 47 ++++--- 4 files changed, 138 insertions(+), 92 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/__init__.py b/libs/langchain/langchain/schema/runnable/__init__.py index 16f99324b..24b235d4d 100644 --- a/libs/langchain/langchain/schema/runnable/__init__.py +++ b/libs/langchain/langchain/schema/runnable/__init__.py @@ -7,11 +7,12 @@ from langchain.schema.runnable.base import ( RunnableSequence, RunnableWithFallbacks, ) -from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable.config import RunnableConfig, patch_config from langchain.schema.runnable.passthrough import RunnablePassthrough from langchain.schema.runnable.router import RouterInput, RouterRunnable __all__ = [ + "patch_config", "GetLocalVar", "PutLocalVar", "RouterInput", diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index aab395c46..fd0666d93 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1,11 +1,9 @@ from __future__ import annotations import asyncio -import copy import threading from abc import ABC, abstractmethod -from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait -from copy import deepcopy +from concurrent.futures import FIRST_COMPLETED, wait from functools import partial from itertools import tee from typing import ( @@ -43,6 +41,7 @@ from langchain.schema.runnable.config import ( ensure_config, get_async_callback_manager_for_config, get_callback_manager_for_config, + get_executor_for_config, patch_config, ) from langchain.schema.runnable.utils import ( @@ -104,8 +103,6 @@ class Runnable(Generic[Input, Output], ABC): self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: """ @@ -118,15 +115,19 @@ class Runnable(Generic[Input, Output], ABC): if len(inputs) == 1: return [self.invoke(inputs[0], configs[0], **kwargs)] - with ThreadPoolExecutor(max_workers=max_concurrency) as executor: - return list(executor.map(partial(self.invoke, **kwargs), inputs, configs)) + with get_executor_for_config(configs[0]) as executor: + return list( + executor.map( + partial(self.invoke, **kwargs), + inputs, + (patch_config(c, executor=executor) for c in configs), + ) + ) async def abatch( self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: """ @@ -136,7 +137,7 @@ class Runnable(Generic[Input, Output], ABC): configs = self._get_config_list(config, len(inputs)) coros = map(partial(self.ainvoke, **kwargs), inputs, configs) - return await gather_with_concurrency(max_concurrency, *coros) + return await gather_with_concurrency(configs[0].get("max_concurrency"), *coros) def stream( self, @@ -246,7 +247,7 @@ class Runnable(Generic[Input, Output], ABC): return ( list(map(ensure_config, config)) if isinstance(config, list) - else [deepcopy(ensure_config(config)) for _ in range(length)] + else [patch_config(config, deep_copy_locals=True) for _ in range(length)] ) def _call_with_config( @@ -527,7 +528,7 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): try: output = runnable.invoke( input, - patch_config(config, run_manager.get_child()), + patch_config(config, callbacks=run_manager.get_child()), ) except self.exceptions_to_handle as e: if first_error is None: @@ -560,7 +561,7 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): try: output = await runnable.ainvoke( input, - patch_config(config, run_manager.get_child()), + patch_config(config, callbacks=run_manager.get_child()), ) except self.exceptions_to_handle as e: if first_error is None: @@ -580,8 +581,6 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: from langchain.callbacks.manager import CallbackManager @@ -615,10 +614,9 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): inputs, [ # each step a child run of the corresponding root run - patch_config(config, rm.get_child()) + patch_config(config, callbacks=rm.get_child()) for rm, config in zip(run_managers, configs) ], - max_concurrency=max_concurrency, ) except self.exceptions_to_handle as e: if first_error is None: @@ -641,14 +639,9 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: - from langchain.callbacks.manager import ( - AsyncCallbackManager, - AsyncCallbackManagerForChainRun, - ) + from langchain.callbacks.manager import AsyncCallbackManager # setup callbacks configs = self._get_config_list(config, len(inputs)) @@ -679,10 +672,9 @@ class RunnableWithFallbacks(Serializable, Runnable[Input, Output]): inputs, [ # each step a child run of the corresponding root run - patch_config(config, rm.get_child()) + patch_config(config, callbacks=rm.get_child()) for rm, config in zip(run_managers, configs) ], - max_concurrency=max_concurrency, ) except self.exceptions_to_handle as e: if first_error is None: @@ -782,7 +774,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): input = step.invoke( input, # mark each step as a child run - patch_config(config, run_manager.get_child()), + patch_config(config, callbacks=run_manager.get_child()), ) # finish the root run except (KeyboardInterrupt, Exception) as e: @@ -810,7 +802,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): input = await step.ainvoke( input, # mark each step as a child run - patch_config(config, run_manager.get_child()), + patch_config(config, callbacks=run_manager.get_child()), ) # finish the root run except (KeyboardInterrupt, Exception) as e: @@ -824,8 +816,6 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: from langchain.callbacks.manager import CallbackManager @@ -852,16 +842,18 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): # invoke try: - for step in self.steps: - inputs = step.batch( - inputs, - [ - # each step a child run of the corresponding root run - patch_config(config, rm.get_child()) - for rm, config in zip(run_managers, configs) - ], - max_concurrency=max_concurrency, - ) + with get_executor_for_config(configs[0]) as executor: + for step in self.steps: + inputs = step.batch( + inputs, + [ + # each step a child run of the corresponding root run + patch_config( + config, callbacks=rm.get_child(), executor=executor + ) + for rm, config in zip(run_managers, configs) + ], + ) # finish the root runs except (KeyboardInterrupt, Exception) as e: for rm in run_managers: @@ -876,8 +868,6 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: from langchain.callbacks.manager import ( @@ -914,10 +904,9 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): inputs, [ # each step a child run of the corresponding root run - patch_config(config, rm.get_child()) + patch_config(config, callbacks=rm.get_child()) for rm, config in zip(run_managers, configs) ], - max_concurrency=max_concurrency, ) # finish the root runs except (KeyboardInterrupt, Exception) as e: @@ -956,7 +945,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): input = step.invoke( input, # mark each step as a child run - patch_config(config, run_manager.get_child()), + patch_config(config, callbacks=run_manager.get_child()), ) except (KeyboardInterrupt, Exception) as e: run_manager.on_chain_error(e) @@ -968,12 +957,13 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): try: # stream the first of the last steps with non-streaming input final_pipeline = steps[streaming_start_index].stream( - input, patch_config(config, run_manager.get_child()) + input, patch_config(config, callbacks=run_manager.get_child()) ) # stream the rest of the last steps with streaming input for step in steps[streaming_start_index + 1 :]: final_pipeline = step.transform( - final_pipeline, patch_config(config, run_manager.get_child()) + final_pipeline, + patch_config(config, callbacks=run_manager.get_child()), ) for output in final_pipeline: yield output @@ -1022,7 +1012,7 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): input = await step.ainvoke( input, # mark each step as a child run - patch_config(config, run_manager.get_child()), + patch_config(config, callbacks=run_manager.get_child()), ) except (KeyboardInterrupt, Exception) as e: await run_manager.on_chain_error(e) @@ -1034,12 +1024,13 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): try: # stream the first of the last steps with non-streaming input final_pipeline = steps[streaming_start_index].astream( - input, patch_config(config, run_manager.get_child()) + input, patch_config(config, callbacks=run_manager.get_child()) ) # stream the rest of the last steps with streaming input for step in steps[streaming_start_index + 1 :]: final_pipeline = step.atransform( - final_pipeline, patch_config(config, run_manager.get_child()) + final_pipeline, + patch_config(config, callbacks=run_manager.get_child()), ) async for output in final_pipeline: yield output @@ -1068,7 +1059,7 @@ class RunnableMapChunk(Dict[str, Any]): """ def __add__(self, other: RunnableMapChunk) -> RunnableMapChunk: - chunk = copy.deepcopy(self) + chunk = self.copy() for key in other: if key not in chunk or chunk[key] is None: chunk[key] = other[key] @@ -1076,6 +1067,15 @@ class RunnableMapChunk(Dict[str, Any]): chunk[key] += other[key] return chunk + def __radd__(self, other: RunnableMapChunk) -> RunnableMapChunk: + chunk = RunnableMapChunk(other) + for key in self: + if key not in chunk or chunk[key] is None: + chunk[key] = self[key] + elif self[key] is not None: + chunk[key] += self[key] + return chunk + class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): """ @@ -1132,13 +1132,18 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): try: # copy to avoid issues from the caller mutating the steps during invoke() steps = dict(self.steps) - with ThreadPoolExecutor() as executor: + with get_executor_for_config(config) as executor: futures = [ executor.submit( step.invoke, input, # mark each step as a child run - patch_config(deepcopy(config), run_manager.get_child()), + patch_config( + config, + deep_copy_locals=True, + callbacks=run_manager.get_child(), + executor=executor, + ), ) for step in steps.values() ] @@ -1172,7 +1177,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): step.ainvoke( input, # mark each step as a child run - patch_config(config, run_manager.get_child()), + patch_config(config, callbacks=run_manager.get_child()), ) for step in steps.values() ) @@ -1197,14 +1202,16 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): # Each step gets a copy of the input iterator, # which is consumed in parallel in a separate thread. input_copies = list(safetee(input, len(steps), lock=threading.Lock())) - with ThreadPoolExecutor() as executor: + with get_executor_for_config(config) as executor: # Create the transform() generator for each step named_generators = [ ( name, step.transform( input_copies.pop(), - patch_config(config, run_manager.get_child()), + patch_config( + config, callbacks=run_manager.get_child(), executor=executor + ), ), ) for name, step in steps.items() @@ -1265,7 +1272,8 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): ( name, step.atransform( - input_copies.pop(), patch_config(config, run_manager.get_child()) + input_copies.pop(), + patch_config(config, callbacks=run_manager.get_child()), ), ) for name, step in steps.items() @@ -1393,25 +1401,17 @@ class RunnableBinding(Serializable, Runnable[Input, Output]): self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: - return self.bound.batch( - inputs, config, max_concurrency=max_concurrency, **{**self.kwargs, **kwargs} - ) + return self.bound.batch(inputs, config, **{**self.kwargs, **kwargs}) async def abatch( self, inputs: List[Input], config: Optional[Union[RunnableConfig, List[RunnableConfig]]] = None, - *, - max_concurrency: Optional[int] = None, **kwargs: Optional[Any], ) -> List[Output]: - return await self.bound.abatch( - inputs, config, max_concurrency=max_concurrency, **{**self.kwargs, **kwargs} - ) + return await self.bound.abatch(inputs, config, **{**self.kwargs, **kwargs}) def stream( self, diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index 00408b7ee..9eff2ffaa 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -1,6 +1,9 @@ from __future__ import annotations +from concurrent.futures import Executor, ThreadPoolExecutor +from contextlib import contextmanager +from copy import deepcopy -from typing import Any, Dict, List, Optional, TypedDict +from typing import Any, Dict, Generator, List, Optional, TypedDict from langchain.callbacks.base import BaseCallbackManager, Callbacks from langchain.callbacks.manager import AsyncCallbackManager, CallbackManager @@ -32,20 +35,44 @@ class RunnableConfig(TypedDict, total=False): Local variables """ + max_concurrency: Optional[int] + """ + Maximum number of parallel calls to make. If not provided, defaults to ThreadPoolExecutor's default. This is ignored if an executor is provided. + """ + + executor: Executor + """ + Externally-managed executor to use for parallel calls. If not provided, a new + ThreadPoolExecutor will be created. + """ + def ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: - empty = RunnableConfig(tags=[], metadata={}, callbacks=None, _locals={}) + empty = RunnableConfig( + tags=[], + metadata={}, + callbacks=None, + _locals={}, + ) if config is not None: empty.update(config) return empty def patch_config( - config: RunnableConfig, - callbacks: BaseCallbackManager, + config: Optional[RunnableConfig], + *, + deep_copy_locals: bool = False, + callbacks: Optional[BaseCallbackManager] = None, + executor: Optional[Executor] = None, ) -> RunnableConfig: - config = config.copy() - config["callbacks"] = callbacks + config = ensure_config(config) + if deep_copy_locals: + config["_locals"] = deepcopy(config["_locals"]) + if callbacks is not None: + config["callbacks"] = callbacks + if executor is not None: + config["executor"] = executor return config @@ -65,3 +92,12 @@ def get_async_callback_manager_for_config( inheritable_tags=config.get("tags"), inheritable_metadata=config.get("metadata"), ) + + +@contextmanager +def get_executor_for_config(config: RunnableConfig) -> Generator[Executor, None, None]: + if config.get("executor"): + yield config["executor"] + else: + with ThreadPoolExecutor(max_workers=config.get("max_concurrency")) as executor: + yield executor diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 80d63c691..98cab172a 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -131,26 +131,25 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: assert fake.batch( ["hello", "wooorld"], [dict(tags=["a-tag"]), dict(metadata={"key": "value"})] ) == [5, 7] - assert spy.call_args_list == [ - mocker.call( - "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) - ), - mocker.call( - "wooorld", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), - ), - ] + + assert len(spy.call_args_list) == 2 + for i, call in enumerate(spy.call_args_list): + assert call.args[0] == ("hello" if i == 0 else "wooorld") + if i == 0: + assert call.args[1].get("tags") == ["a-tag"] + assert call.args[1].get("metadata") == {} + else: + assert call.args[1].get("tags") == [] + assert call.args[1].get("metadata") == {"key": "value"} + spy.reset_mock() assert fake.batch(["hello", "wooorld"], dict(tags=["a-tag"])) == [5, 7] - assert spy.call_args_list == [ - mocker.call( - "hello", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) - ), - mocker.call( - "wooorld", dict(tags=["a-tag"], metadata={}, callbacks=None, _locals={}) - ), - ] + assert len(spy.call_args_list) == 2 + for i, call in enumerate(spy.call_args_list): + assert call.args[0] == ("hello" if i == 0 else "wooorld") + assert call.args[1].get("tags") == ["a-tag"] + assert call.args[1].get("metadata") == {} spy.reset_mock() assert await fake.ainvoke("hello", config={"callbacks": []}) == 5 @@ -172,11 +171,21 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: assert spy.call_args_list == [ mocker.call( "hello", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + dict( + metadata={"key": "value"}, + tags=[], + callbacks=None, + _locals={}, + ), ), mocker.call( "wooorld", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + dict( + metadata={"key": "value"}, + tags=[], + callbacks=None, + _locals={}, + ), ), ] From cc83f5469492703d697ff48241f458465444ebf6 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 11:37:44 +0100 Subject: [PATCH 074/143] L:int --- .../unit_tests/schema/runnable/test_runnable.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 98cab172a..7b8048924 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -171,21 +171,11 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: assert spy.call_args_list == [ mocker.call( "hello", - dict( - metadata={"key": "value"}, - tags=[], - callbacks=None, - _locals={}, - ), + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), ), mocker.call( "wooorld", - dict( - metadata={"key": "value"}, - tags=[], - callbacks=None, - _locals={}, - ), + dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), ), ] From e420bf22b61f8849660da3571988285a2d750c5c Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 14:21:34 +0100 Subject: [PATCH 075/143] Lint --- libs/langchain/langchain/schema/runnable/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index fd0666d93..9f5ae53ed 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1059,7 +1059,7 @@ class RunnableMapChunk(Dict[str, Any]): """ def __add__(self, other: RunnableMapChunk) -> RunnableMapChunk: - chunk = self.copy() + chunk = RunnableMapChunk(self) for key in other: if key not in chunk or chunk[key] is None: chunk[key] = other[key] From 3458489936f03f5fb1b25ee11542711bb5785a10 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 15:11:36 +0100 Subject: [PATCH 076/143] Lint --- libs/langchain/langchain/schema/runnable/config.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index 9eff2ffaa..4ad3b4fb8 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -1,8 +1,8 @@ from __future__ import annotations + from concurrent.futures import Executor, ThreadPoolExecutor from contextlib import contextmanager from copy import deepcopy - from typing import Any, Dict, Generator, List, Optional, TypedDict from langchain.callbacks.base import BaseCallbackManager, Callbacks @@ -37,7 +37,8 @@ class RunnableConfig(TypedDict, total=False): max_concurrency: Optional[int] """ - Maximum number of parallel calls to make. If not provided, defaults to ThreadPoolExecutor's default. This is ignored if an executor is provided. + Maximum number of parallel calls to make. If not provided, defaults to + ThreadPoolExecutor's default. This is ignored if an executor is provided. """ executor: Executor From db4b256a2811651c551dca268de96f330b777c17 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 15:14:29 +0100 Subject: [PATCH 077/143] Add error for batch of 0 --- libs/langchain/langchain/schema/runnable/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 9f5ae53ed..d66013276 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -238,6 +238,8 @@ class Runnable(Generic[Input, Output], ABC): Helper method to get a list of configs from a single config or a list of configs, useful for subclasses overriding batch() or abatch(). """ + if length < 1: + raise ValueError(f"length must be >= 1, but got {length}") if isinstance(config, list) and len(config) != length: raise ValueError( f"config must be a list of the same length as inputs, " From c184be5511c9e9b678c424f1d1abee7343fe9376 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 11:34:18 +0100 Subject: [PATCH 078/143] Use a shared executor for all parallel calls --- .../unit_tests/schema/runnable/test_runnable.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 7b8048924..98cab172a 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -171,11 +171,21 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: assert spy.call_args_list == [ mocker.call( "hello", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + dict( + metadata={"key": "value"}, + tags=[], + callbacks=None, + _locals={}, + ), ), mocker.call( "wooorld", - dict(metadata={"key": "value"}, tags=[], callbacks=None, _locals={}), + dict( + metadata={"key": "value"}, + tags=[], + callbacks=None, + _locals={}, + ), ), ] From 93bbf67afc30a1feca3096df65dd1c49240cfdcf Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 14:08:54 +0100 Subject: [PATCH 079/143] WIP Add test Add test Lint --- .../langchain/schema/runnable/base.py | 41 ++++++ .../runnable/__snapshots__/test_runnable.ambr | 133 ++++++++++++++++++ .../schema/runnable/test_runnable.py | 17 +++ 3 files changed, 191 insertions(+) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index d66013276..7631c54dd 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -217,6 +217,12 @@ class Runnable(Generic[Input, Output], ABC): """ return RunnableBinding(bound=self, kwargs=kwargs) + def each(self) -> Runnable[List[Input], List[Output]]: + """ + Wrap a Runnable to run it on each element of the input sequence. + """ + return RunnableEach(bound=self) + def with_fallbacks( self, fallbacks: Sequence[Runnable[Input, Output]], @@ -1360,6 +1366,41 @@ class RunnableLambda(Runnable[Input, Output]): return self._call_with_config(self.func, input, config) +class RunnableEach(Serializable, Runnable[List[Input], List[Output]]): + """ + A runnable that delegates calls to another runnable with each element of the input sequence. + """ + + bound: Runnable[Input, Output] + + class Config: + arbitrary_types_allowed = True + + @property + def lc_serializable(self) -> bool: + return True + + @property + def lc_namespace(self) -> List[str]: + return self.__class__.__module__.split(".")[:-1] + + def each(self) -> RunnableEach[Input, Output]: # type: ignore[override] + return self + + def bind(self, **kwargs: Any) -> RunnableEach[Input, Output]: + return RunnableEach(bound=self.bound.bind(**kwargs)) + + def invoke( + self, input: List[Input], config: Optional[RunnableConfig] = None + ) -> List[Output]: + return self.bound.batch(input, config) + + async def ainvoke( + self, input: List[Input], config: Optional[RunnableConfig] = None + ) -> List[Output]: + return await self.bound.abatch(input, config) + + class RunnableBinding(Serializable, Runnable[Input, Output]): """ A runnable that delegates calls to another runnable with a set of kwargs. diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index 11e554a9c..44793ce3a 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -464,6 +464,139 @@ Run(id=UUID('00000000-0000-4000-8000-000000000000'), name='RunnableSequence', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'runnable', 'RunnableSequence'], 'kwargs': {'first': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, 'middle': [{'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'chat_models', 'fake', 'FakeListChatModel']}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'output_parsers', 'list', 'CommaSeparatedListOutputParser'], 'kwargs': {}}, {'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nicer assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, {'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'chat_models', 'fake', 'FakeListChatModel']}], 'last': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'output_parsers', 'list', 'CommaSeparatedListOutputParser'], 'kwargs': {}}}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'output': ['baz', 'qux']}, reference_example_id=None, parent_run_id=None, tags=[], execution_order=None, child_execution_order=None, child_runs=[Run(id=UUID('00000000-0000-4000-8000-000000000001'), name='ChatPromptTemplate', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='prompt', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptValue'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'SystemMessage'], 'kwargs': {'content': 'You are a nice assistant.', 'additional_kwargs': {}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': 'What is your name?', 'additional_kwargs': {}}}]}}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000002'), name='FakeListChatModel', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='llm', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={'invocation_params': {'responses': ['foo, bar'], '_type': 'fake-list-chat-model', 'stop': None}, 'options': {'stop': None}}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'chat_models', 'fake', 'FakeListChatModel']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'prompts': ['System: You are a nice assistant.\nHuman: What is your name?']}, outputs={'generations': [[{'text': 'foo, bar', 'generation_info': None, 'message': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'foo, bar'}}}]], 'llm_output': None, 'run': None}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000003'), name='CommaSeparatedListOutputParser', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='parser', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'output_parsers', 'list', 'CommaSeparatedListOutputParser'], 'kwargs': {}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'input': AIMessage(content='foo, bar', additional_kwargs={}, example=False)}, outputs={'output': ['foo', 'bar']}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000004'), name='RunnableLambda', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'input': ['foo', 'bar']}, outputs={'question': 'foobar'}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000005'), name='ChatPromptTemplate', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='prompt', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nicer assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'foobar'}, outputs={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptValue'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'SystemMessage'], 'kwargs': {'content': 'You are a nicer assistant.', 'additional_kwargs': {}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': 'foobar', 'additional_kwargs': {}}}]}}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000006'), name='FakeListChatModel', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='llm', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={'invocation_params': {'responses': ['baz, qux'], '_type': 'fake-list-chat-model', 'stop': None}, 'options': {'stop': None}}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'chat_models', 'fake', 'FakeListChatModel']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'prompts': ['System: You are a nicer assistant.\nHuman: foobar']}, outputs={'generations': [[{'text': 'baz, qux', 'generation_info': None, 'message': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'baz, qux'}}}]], 'llm_output': None, 'run': None}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000007'), name='CommaSeparatedListOutputParser', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='parser', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'output_parsers', 'list', 'CommaSeparatedListOutputParser'], 'kwargs': {}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'input': AIMessage(content='baz, qux', additional_kwargs={}, example=False)}, outputs={'output': ['baz', 'qux']}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[])]), ]) # --- +# name: test_each + ''' + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "schema", + "runnable", + "RunnableSequence" + ], + "kwargs": { + "first": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "chat", + "ChatPromptTemplate" + ], + "kwargs": { + "messages": [ + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "chat", + "SystemMessagePromptTemplate" + ], + "kwargs": { + "prompt": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "prompt", + "PromptTemplate" + ], + "kwargs": { + "input_variables": [], + "template": "You are a nice assistant.", + "template_format": "f-string", + "partial_variables": {} + } + } + } + }, + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "chat", + "HumanMessagePromptTemplate" + ], + "kwargs": { + "prompt": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "prompt", + "PromptTemplate" + ], + "kwargs": { + "input_variables": [ + "question" + ], + "template": "{question}", + "template_format": "f-string", + "partial_variables": {} + } + } + } + } + ] + } + }, + "middle": [ + { + "lc": 1, + "type": "not_implemented", + "id": [ + "langchain", + "llms", + "fake", + "FakeStreamingListLLM" + ] + }, + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "output_parsers", + "list", + "CommaSeparatedListOutputParser" + ], + "kwargs": {} + } + ], + "last": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "schema", + "runnable", + "RunnableEach" + ], + "kwargs": { + "bound": { + "lc": 1, + "type": "not_implemented", + "id": [ + "langchain", + "llms", + "fake", + "FakeStreamingListLLM" + ] + } + } + } + } + } + ''' +# --- # name: test_llm_with_fallbacks[llm_chain_with_fallbacks] ''' { diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 98cab172a..cb5c01472 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -1,5 +1,6 @@ from typing import Any, Dict, List, Optional from uuid import UUID +from xml.dom import ValidationErr import pytest from freezegun import freeze_time @@ -20,6 +21,7 @@ from langchain.prompts.chat import ( HumanMessagePromptTemplate, SystemMessagePromptTemplate, ) +from langchain.pydantic_v1 import ValidationError from langchain.schema.document import Document from langchain.schema.messages import ( AIMessage, @@ -1086,3 +1088,18 @@ async def test_llm_with_fallbacks( assert await runnable.abatch(["hi", "hey", "bye"]) == ["bar"] * 3 assert list(await runnable.ainvoke("hello")) == list("bar") assert dumps(runnable, pretty=True) == snapshot + + +def test_each(snapshot: SnapshotAssertion) -> None: + prompt = ( + SystemMessagePromptTemplate.from_template("You are a nice assistant.") + + "{question}" + ) + first_llm = FakeStreamingListLLM(responses=["first item, second item, third item"]) + second_llm = FakeStreamingListLLM(responses=["this", "is", "a", "test"]) + + chain = prompt | first_llm | CommaSeparatedListOutputParser() | second_llm.each() + + assert dumps(chain, pretty=True) == snapshot + output = chain.invoke({"question": "What up"}) + assert output == ["this", "is", "a"] From 9777c2801d5ac7f8c9bab2d12e44e4c4501f48fb Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 16:18:04 +0100 Subject: [PATCH 080/143] Update method and docstring --- .../langchain/schema/runnable/base.py | 7 +++--- .../runnable/__snapshots__/test_runnable.ambr | 7 +++--- .../schema/runnable/test_runnable.py | 23 ++++++++++++++++--- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 7631c54dd..b477ecdaa 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -217,9 +217,10 @@ class Runnable(Generic[Input, Output], ABC): """ return RunnableBinding(bound=self, kwargs=kwargs) - def each(self) -> Runnable[List[Input], List[Output]]: + def map(self) -> Runnable[List[Input], List[Output]]: """ - Wrap a Runnable to run it on each element of the input sequence. + Return a new Runnable that maps a list of inputs to a list of outputs, + by calling invoke() with each input. """ return RunnableEach(bound=self) @@ -1384,7 +1385,7 @@ class RunnableEach(Serializable, Runnable[List[Input], List[Output]]): def lc_namespace(self) -> List[str]: return self.__class__.__module__.split(".")[:-1] - def each(self) -> RunnableEach[Input, Output]: # type: ignore[override] + def map(self) -> RunnableEach[Input, Output]: # type: ignore[override] return self def bind(self, **kwargs: Any) -> RunnableEach[Input, Output]: diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index 44793ce3a..fe06e568f 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -563,10 +563,9 @@ "lc": 1, "type": "constructor", "id": [ - "langchain", - "output_parsers", - "list", - "CommaSeparatedListOutputParser" + "runnable", + "test_runnable", + "FakeSplitIntoListParser" ], "kwargs": {} } diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index cb5c01472..c6630d7a6 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -21,7 +21,6 @@ from langchain.prompts.chat import ( HumanMessagePromptTemplate, SystemMessagePromptTemplate, ) -from langchain.pydantic_v1 import ValidationError from langchain.schema.document import Document from langchain.schema.messages import ( AIMessage, @@ -29,7 +28,7 @@ from langchain.schema.messages import ( HumanMessage, SystemMessage, ) -from langchain.schema.output_parser import StrOutputParser +from langchain.schema.output_parser import BaseOutputParser, StrOutputParser from langchain.schema.retriever import BaseRetriever from langchain.schema.runnable import ( RouterRunnable, @@ -1090,6 +1089,24 @@ async def test_llm_with_fallbacks( assert dumps(runnable, pretty=True) == snapshot +class FakeSplitIntoListParser(BaseOutputParser[List[str]]): + """Parse the output of an LLM call to a comma-separated list.""" + + @property + def lc_serializable(self) -> bool: + return True + + def get_format_instructions(self) -> str: + return ( + "Your response should be a list of comma separated values, " + "eg: `foo, bar, baz`" + ) + + def parse(self, text: str) -> List[str]: + """Parse the output of an LLM call.""" + return text.strip().split(", ") + + def test_each(snapshot: SnapshotAssertion) -> None: prompt = ( SystemMessagePromptTemplate.from_template("You are a nice assistant.") @@ -1098,7 +1115,7 @@ def test_each(snapshot: SnapshotAssertion) -> None: first_llm = FakeStreamingListLLM(responses=["first item, second item, third item"]) second_llm = FakeStreamingListLLM(responses=["this", "is", "a", "test"]) - chain = prompt | first_llm | CommaSeparatedListOutputParser() | second_llm.each() + chain = prompt | first_llm | FakeSplitIntoListParser() | second_llm.map() assert dumps(chain, pretty=True) == snapshot output = chain.invoke({"question": "What up"}) From fdcd50aab4c163ba2fb560a4f472371ecf533813 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 16:22:01 +0100 Subject: [PATCH 081/143] Extend test --- .../tests/unit_tests/schema/runnable/test_runnable.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index c6630d7a6..ed40dec28 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -1113,10 +1113,16 @@ def test_each(snapshot: SnapshotAssertion) -> None: + "{question}" ) first_llm = FakeStreamingListLLM(responses=["first item, second item, third item"]) + parser = FakeSplitIntoListParser() second_llm = FakeStreamingListLLM(responses=["this", "is", "a", "test"]) - chain = prompt | first_llm | FakeSplitIntoListParser() | second_llm.map() + chain = prompt | first_llm | parser | second_llm.map() assert dumps(chain, pretty=True) == snapshot output = chain.invoke({"question": "What up"}) assert output == ["this", "is", "a"] + + assert (parser | second_llm.map()).invoke("first item, second item") == [ + "test", + "this", + ] From 3ddabe8b2cc334a08e241df0cfafb851b745292e Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Wed, 23 Aug 2023 19:44:41 +0100 Subject: [PATCH 082/143] Code review --- libs/langchain/langchain/schema/runnable/base.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index b477ecdaa..d9e439fb4 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1385,9 +1385,6 @@ class RunnableEach(Serializable, Runnable[List[Input], List[Output]]): def lc_namespace(self) -> List[str]: return self.__class__.__module__.split(".")[:-1] - def map(self) -> RunnableEach[Input, Output]: # type: ignore[override] - return self - def bind(self, **kwargs: Any) -> RunnableEach[Input, Output]: return RunnableEach(bound=self.bound.bind(**kwargs)) From 882b97cfd26c1a0a8913ea5dbcb322947e933010 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Wed, 23 Aug 2023 19:50:20 +0100 Subject: [PATCH 083/143] Lint --- libs/langchain/langchain/schema/runnable/base.py | 7 ++++--- libs/langchain/langchain/utilities/openapi.py | 2 +- .../tests/unit_tests/schema/runnable/test_runnable.py | 1 - 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index d9e439fb4..c7dd38865 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1369,7 +1369,8 @@ class RunnableLambda(Runnable[Input, Output]): class RunnableEach(Serializable, Runnable[List[Input], List[Output]]): """ - A runnable that delegates calls to another runnable with each element of the input sequence. + A runnable that delegates calls to another runnable + with each element of the input sequence. """ bound: Runnable[Input, Output] @@ -1394,9 +1395,9 @@ class RunnableEach(Serializable, Runnable[List[Input], List[Output]]): return self.bound.batch(input, config) async def ainvoke( - self, input: List[Input], config: Optional[RunnableConfig] = None + self, input: List[Input], config: Optional[RunnableConfig] = None, **kwargs: Any ) -> List[Output]: - return await self.bound.abatch(input, config) + return await self.bound.abatch(input, config, **kwargs) class RunnableBinding(Serializable, Runnable[Input, Output]): diff --git a/libs/langchain/langchain/utilities/openapi.py b/libs/langchain/langchain/utilities/openapi.py index 34224a2bb..16dd5b680 100644 --- a/libs/langchain/langchain/utilities/openapi.py +++ b/libs/langchain/langchain/utilities/openapi.py @@ -54,7 +54,7 @@ if _PYDANTIC_MAJOR_VERSION == 1: try: from openapi_schema_pydantic import OpenAPI except ImportError: - OpenAPI = object + OpenAPI = object # type: ignore class OpenAPISpec(OpenAPI): """OpenAPI Model that removes mis-formatted parts of the spec.""" diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index ed40dec28..4f3e3b4b9 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -1,6 +1,5 @@ from typing import Any, Dict, List, Optional from uuid import UUID -from xml.dom import ValidationErr import pytest from freezegun import freeze_time From 1751fe114d55091cd83bb1cd84a12615dcb5dd4b Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Wed, 23 Aug 2023 19:52:13 +0100 Subject: [PATCH 084/143] Add one more test --- .../schema/runnable/__snapshots__/test_runnable.ambr | 3 +++ .../tests/unit_tests/schema/runnable/test_runnable.py | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index fe06e568f..828227fd3 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -545,6 +545,9 @@ } } } + ], + "input_variables": [ + "question" ] } }, diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 4f3e3b4b9..544b42da6 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -1106,6 +1106,17 @@ class FakeSplitIntoListParser(BaseOutputParser[List[str]]): return text.strip().split(", ") +def test_each_simple() -> None: + """Test that each() works with a simple runnable.""" + parser = FakeSplitIntoListParser() + assert parser.invoke("first item, second item") == ["first item", "second item"] + assert parser.map().invoke(["a, b", "c"]) == [["a", "b"], ["c"]] + assert parser.map().map().invoke([["a, b", "c"], ["c, e"]]) == [ + [["a", "b"], ["c"]], + [["c", "e"]], + ] + + def test_each(snapshot: SnapshotAssertion) -> None: prompt = ( SystemMessagePromptTemplate.from_template("You are a nice assistant.") From 677da6a0fd7ac8e6c3127487b09b6bd3e1d620d8 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Thu, 17 Aug 2023 14:25:43 +0100 Subject: [PATCH 085/143] Add support for async funcs in RunnableSequence --- .../langchain/schema/runnable/base.py | 41 ++++++- .../runnable/__snapshots__/test_runnable.ambr | 116 ++++++++++++++++++ .../schema/runnable/test_runnable.py | 46 +++++++ 3 files changed, 199 insertions(+), 4 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index c7dd38865..722a7c376 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import inspect import threading from abc import ABC, abstractmethod from concurrent.futures import FIRST_COMPLETED, wait @@ -12,6 +13,7 @@ from typing import ( AsyncIterator, Awaitable, Callable, + Coroutine, Dict, Generic, Iterator, @@ -1343,8 +1345,17 @@ class RunnableLambda(Runnable[Input, Output]): A runnable that runs a callable. """ - def __init__(self, func: Callable[[Input], Output]) -> None: - if callable(func): + def __init__( + self, + func: Union[Callable[[Input], Output], Coroutine[Input, Any, Output]], + afunc: Optional[Coroutine[Input, Any, Output]] = None, + ) -> None: + if afunc is not None: + self.afunc = afunc + + if inspect.iscoroutinefunction(func): + self.afunc = func + elif callable(func): self.func = func else: raise TypeError( @@ -1354,7 +1365,12 @@ class RunnableLambda(Runnable[Input, Output]): def __eq__(self, other: Any) -> bool: if isinstance(other, RunnableLambda): - return self.func == other.func + if hasattr(self, "func") and hasattr(other, "func"): + return self.func == other.func + elif hasattr(self, "afunc") and hasattr(other, "afunc"): + return self.afunc == other.afunc + else: + return False else: return False @@ -1364,7 +1380,24 @@ class RunnableLambda(Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Output: - return self._call_with_config(self.func, input, config) + if hasattr(self, "func"): + return self._call_with_config(self.func, input, config) + else: + raise TypeError( + "Cannot invoke a coroutine function synchronously." + "Use `ainvoke` instead." + ) + + async def ainvoke( + self, + input: Input, + config: Optional[RunnableConfig] = None, + **kwargs: Optional[Any], + ) -> Output: + if hasattr(self, "afunc"): + return await self._acall_with_config(self.afunc, input, config) + else: + return await super().ainvoke(input, config) class RunnableEach(Serializable, Runnable[List[Input], List[Output]]): diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index 828227fd3..ac8deb3de 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -1187,6 +1187,122 @@ Run(id=UUID('00000000-0000-4000-8000-000000000003'), name='RunnableSequence', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'runnable', 'RunnableSequence'], 'kwargs': {'first': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, 'last': {'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your favorite color?'}, outputs={'output': 'foo'}, reference_example_id=None, parent_run_id=None, tags=[], execution_order=None, child_execution_order=None, child_runs=[Run(id=UUID('00000000-0000-4000-8000-000000000004'), name='ChatPromptTemplate', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='prompt', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your favorite color?'}, outputs={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptValue'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'SystemMessage'], 'kwargs': {'content': 'You are a nice assistant.', 'additional_kwargs': {}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': 'What is your favorite color?', 'additional_kwargs': {}}}]}}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000003'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000005'), name='FakeListLLM', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='llm', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={'invocation_params': {'responses': ['foo', 'bar'], '_type': 'fake-list', 'stop': None}, 'options': {'stop': None}}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'prompts': ['System: You are a nice assistant.\nHuman: What is your favorite color?']}, outputs={'generations': [[{'text': 'foo', 'generation_info': None}]], 'llm_output': None, 'run': None}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000003'), tags=[], execution_order=None, child_execution_order=None, child_runs=[])]), ]) # --- +# name: test_prompt_with_llm_and_async_lambda + ''' + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "schema", + "runnable", + "RunnableSequence" + ], + "kwargs": { + "first": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "chat", + "ChatPromptTemplate" + ], + "kwargs": { + "messages": [ + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "chat", + "SystemMessagePromptTemplate" + ], + "kwargs": { + "prompt": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "prompt", + "PromptTemplate" + ], + "kwargs": { + "input_variables": [], + "template": "You are a nice assistant.", + "template_format": "f-string", + "partial_variables": {} + } + } + } + }, + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "chat", + "HumanMessagePromptTemplate" + ], + "kwargs": { + "prompt": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "prompts", + "prompt", + "PromptTemplate" + ], + "kwargs": { + "input_variables": [ + "question" + ], + "template": "{question}", + "template_format": "f-string", + "partial_variables": {} + } + } + } + } + ] + } + }, + "middle": [ + { + "lc": 1, + "type": "not_implemented", + "id": [ + "langchain", + "llms", + "fake", + "FakeListLLM" + ] + } + ], + "last": { + "lc": 1, + "type": "not_implemented", + "id": [ + "langchain", + "schema", + "runnable", + "base", + "RunnableLambda" + ] + } + } + } + ''' +# --- +# name: test_prompt_with_llm_and_async_lambda.1 + list([ + Run(id=UUID('00000000-0000-4000-8000-000000000000'), name='RunnableSequence', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'runnable', 'RunnableSequence'], 'kwargs': {'first': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}]}}, 'middle': [{'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}], 'last': {'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'output': 'foo'}, reference_example_id=None, parent_run_id=None, tags=[], execution_order=None, child_execution_order=None, child_runs=[Run(id=UUID('00000000-0000-4000-8000-000000000001'), name='ChatPromptTemplate', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='prompt', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}]}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptValue'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'SystemMessage'], 'kwargs': {'content': 'You are a nice assistant.', 'additional_kwargs': {}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': 'What is your name?', 'additional_kwargs': {}}}]}}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000002'), name='FakeListLLM', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='llm', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={'invocation_params': {'responses': ['foo', 'bar'], '_type': 'fake-list', 'stop': None}, 'options': {'stop': None}}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'prompts': ['System: You are a nice assistant.\nHuman: What is your name?']}, outputs={'generations': [[{'text': 'foo', 'generation_info': None}]], 'llm_output': None, 'run': None}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000003'), name='RunnableLambda', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'input': 'foo'}, outputs={'output': 'foo'}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[])]), + ]) +# --- # name: test_router_runnable ''' { diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 544b42da6..8c616770e 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -1,3 +1,4 @@ +from ast import Not from typing import Any, Dict, List, Optional from uuid import UUID @@ -38,6 +39,7 @@ from langchain.schema.runnable import ( RunnablePassthrough, RunnableSequence, RunnableWithFallbacks, + passthrough, ) @@ -438,6 +440,50 @@ async def test_prompt_with_llm( ) +@pytest.mark.asyncio +@freeze_time("2023-01-01") +async def test_prompt_with_llm_and_async_lambda( + mocker: MockerFixture, snapshot: SnapshotAssertion +) -> None: + prompt = ( + SystemMessagePromptTemplate.from_template("You are a nice assistant.") + + "{question}" + ) + llm = FakeListLLM(responses=["foo", "bar"]) + + async def passthrough(input: Any) -> Any: + return input + + chain = prompt | llm | passthrough + + assert isinstance(chain, RunnableSequence) + assert chain.first == prompt + assert chain.middle == [llm] + assert chain.last == RunnableLambda(func=passthrough) + assert dumps(chain, pretty=True) == snapshot + + # Test invoke + prompt_spy = mocker.spy(prompt.__class__, "ainvoke") + llm_spy = mocker.spy(llm.__class__, "ainvoke") + tracer = FakeTracer() + assert ( + await chain.ainvoke( + {"question": "What is your name?"}, dict(callbacks=[tracer]) + ) + == "foo" + ) + assert prompt_spy.call_args.args[1] == {"question": "What is your name?"} + assert llm_spy.call_args.args[1] == ChatPromptValue( + messages=[ + SystemMessage(content="You are a nice assistant."), + HumanMessage(content="What is your name?"), + ] + ) + assert tracer.runs == snapshot + mocker.stop(prompt_spy) + mocker.stop(llm_spy) + + @freeze_time("2023-01-01") def test_prompt_with_chat_model_and_parser( mocker: MockerFixture, snapshot: SnapshotAssertion From 6d19709b65d98e1ff7f37a459357e5470bd1c4bf Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Thu, 17 Aug 2023 15:04:36 +0100 Subject: [PATCH 086/143] RunnableLambda, if func returns a Runnable, run it --- .../langchain/schema/runnable/base.py | 59 +++++++++- .../langchain/schema/runnable/config.py | 9 ++ .../runnable/__snapshots__/test_runnable.ambr | 82 +++++++++++++- .../schema/runnable/test_runnable.py | 104 +++++++++++++++++- 4 files changed, 245 insertions(+), 9 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 722a7c376..3f6148e94 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -13,7 +13,6 @@ from typing import ( AsyncIterator, Awaitable, Callable, - Coroutine, Dict, Generic, Iterator, @@ -1347,8 +1346,8 @@ class RunnableLambda(Runnable[Input, Output]): def __init__( self, - func: Union[Callable[[Input], Output], Coroutine[Input, Any, Output]], - afunc: Optional[Coroutine[Input, Any, Output]] = None, + func: Union[Callable[[Input], Output], Callable[[Input], Awaitable[Output]]], + afunc: Optional[Callable[[Input], Awaitable[Output]]] = None, ) -> None: if afunc is not None: self.afunc = afunc @@ -1356,7 +1355,7 @@ class RunnableLambda(Runnable[Input, Output]): if inspect.iscoroutinefunction(func): self.afunc = func elif callable(func): - self.func = func + self.func = cast(Callable[[Input], Output], func) else: raise TypeError( "Expected a callable type for `func`." @@ -1374,6 +1373,54 @@ class RunnableLambda(Runnable[Input, Output]): else: return False + def _invoke( + self, + input: Input, + run_manager: CallbackManagerForChainRun, + config: RunnableConfig, + ) -> Output: + output = self.func(input) + # If the output is a runnable, invoke it + if isinstance(output, Runnable): + recursion_limit = config["recursion_limit"] + if recursion_limit <= 0: + raise RecursionError( + f"Recursion limit reached when invoking {self} with input {input}." + ) + output = output.invoke( + input, + patch_config( + config, + callbacks=run_manager.get_child(), + recursion_limit=recursion_limit - 1, + ), + ) + return output + + async def _ainvoke( + self, + input: Input, + run_manager: AsyncCallbackManagerForChainRun, + config: RunnableConfig, + ) -> Output: + output = await self.afunc(input) + # If the output is a runnable, invoke it + if isinstance(output, Runnable): + recursion_limit = config["recursion_limit"] + if recursion_limit <= 0: + raise RecursionError( + f"Recursion limit reached when invoking {self} with input {input}." + ) + output = await output.ainvoke( + input, + patch_config( + config, + callbacks=run_manager.get_child(), + recursion_limit=recursion_limit - 1, + ), + ) + return output + def invoke( self, input: Input, @@ -1381,7 +1428,7 @@ class RunnableLambda(Runnable[Input, Output]): **kwargs: Optional[Any], ) -> Output: if hasattr(self, "func"): - return self._call_with_config(self.func, input, config) + return self._call_with_config(self._invoke, input, config) else: raise TypeError( "Cannot invoke a coroutine function synchronously." @@ -1395,7 +1442,7 @@ class RunnableLambda(Runnable[Input, Output]): **kwargs: Optional[Any], ) -> Output: if hasattr(self, "afunc"): - return await self._acall_with_config(self.afunc, input, config) + return await self._acall_with_config(self._ainvoke, input, config) else: return await super().ainvoke(input, config) diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index 4ad3b4fb8..ce4e11861 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -47,6 +47,11 @@ class RunnableConfig(TypedDict, total=False): ThreadPoolExecutor will be created. """ + recursion_limit: int + """ + Maximum number of times a call can recurse. If not provided, defaults to 10. + """ + def ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: empty = RunnableConfig( @@ -54,6 +59,7 @@ def ensure_config(config: Optional[RunnableConfig]) -> RunnableConfig: metadata={}, callbacks=None, _locals={}, + recursion_limit=10, ) if config is not None: empty.update(config) @@ -66,6 +72,7 @@ def patch_config( deep_copy_locals: bool = False, callbacks: Optional[BaseCallbackManager] = None, executor: Optional[Executor] = None, + recursion_limit: Optional[int] = None, ) -> RunnableConfig: config = ensure_config(config) if deep_copy_locals: @@ -74,6 +81,8 @@ def patch_config( config["callbacks"] = callbacks if executor is not None: config["executor"] = executor + if recursion_limit is not None: + config["recursion_limit"] = recursion_limit return config diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index ac8deb3de..c48d4edbd 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -599,6 +599,83 @@ } ''' # --- +# name: test_higher_order_lambda_runnable + ''' + { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "schema", + "runnable", + "RunnableSequence" + ], + "kwargs": { + "first": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "schema", + "runnable", + "RunnableMap" + ], + "kwargs": { + "steps": { + "key": { + "lc": 1, + "type": "not_implemented", + "id": [ + "langchain", + "schema", + "runnable", + "base", + "RunnableLambda" + ] + }, + "input": { + "lc": 1, + "type": "constructor", + "id": [ + "langchain", + "schema", + "runnable", + "RunnableMap" + ], + "kwargs": { + "steps": { + "question": { + "lc": 1, + "type": "not_implemented", + "id": [ + "langchain", + "schema", + "runnable", + "base", + "RunnableLambda" + ] + } + } + } + } + } + } + }, + "last": { + "lc": 1, + "type": "not_implemented", + "id": [ + "langchain", + "schema", + "runnable", + "base", + "RunnableLambda" + ] + } + } + } + ''' +# --- # name: test_llm_with_fallbacks[llm_chain_with_fallbacks] ''' { @@ -1268,6 +1345,9 @@ } } } + ], + "input_variables": [ + "question" ] } }, @@ -1300,7 +1380,7 @@ # --- # name: test_prompt_with_llm_and_async_lambda.1 list([ - Run(id=UUID('00000000-0000-4000-8000-000000000000'), name='RunnableSequence', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'runnable', 'RunnableSequence'], 'kwargs': {'first': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}]}}, 'middle': [{'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}], 'last': {'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'output': 'foo'}, reference_example_id=None, parent_run_id=None, tags=[], execution_order=None, child_execution_order=None, child_runs=[Run(id=UUID('00000000-0000-4000-8000-000000000001'), name='ChatPromptTemplate', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='prompt', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}]}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptValue'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'SystemMessage'], 'kwargs': {'content': 'You are a nice assistant.', 'additional_kwargs': {}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': 'What is your name?', 'additional_kwargs': {}}}]}}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000002'), name='FakeListLLM', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='llm', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={'invocation_params': {'responses': ['foo', 'bar'], '_type': 'fake-list', 'stop': None}, 'options': {'stop': None}}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'prompts': ['System: You are a nice assistant.\nHuman: What is your name?']}, outputs={'generations': [[{'text': 'foo', 'generation_info': None}]], 'llm_output': None, 'run': None}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000003'), name='RunnableLambda', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'input': 'foo'}, outputs={'output': 'foo'}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[])]), + Run(id=UUID('00000000-0000-4000-8000-000000000000'), name='RunnableSequence', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'runnable', 'RunnableSequence'], 'kwargs': {'first': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, 'middle': [{'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}], 'last': {'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'output': 'foo'}, reference_example_id=None, parent_run_id=None, tags=[], execution_order=None, child_execution_order=None, child_runs=[Run(id=UUID('00000000-0000-4000-8000-000000000001'), name='ChatPromptTemplate', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='prompt', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptTemplate'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'SystemMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': [], 'template': 'You are a nice assistant.', 'template_format': 'f-string', 'partial_variables': {}}}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'HumanMessagePromptTemplate'], 'kwargs': {'prompt': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['question'], 'template': '{question}', 'template_format': 'f-string', 'partial_variables': {}}}}}], 'input_variables': ['question']}}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'question': 'What is your name?'}, outputs={'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'chat', 'ChatPromptValue'], 'kwargs': {'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'SystemMessage'], 'kwargs': {'content': 'You are a nice assistant.', 'additional_kwargs': {}}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': 'What is your name?', 'additional_kwargs': {}}}]}}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000002'), name='FakeListLLM', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='llm', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={'invocation_params': {'responses': ['foo', 'bar'], '_type': 'fake-list', 'stop': None}, 'options': {'stop': None}}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'llms', 'fake', 'FakeListLLM']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'prompts': ['System: You are a nice assistant.\nHuman: What is your name?']}, outputs={'generations': [[{'text': 'foo', 'generation_info': None}]], 'llm_output': None, 'run': None}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[]), Run(id=UUID('00000000-0000-4000-8000-000000000003'), name='RunnableLambda', start_time=FakeDatetime(2023, 1, 1, 0, 0), run_type='chain', end_time=FakeDatetime(2023, 1, 1, 0, 0), extra={}, error=None, serialized={'lc': 1, 'type': 'not_implemented', 'id': ['langchain', 'schema', 'runnable', 'base', 'RunnableLambda']}, events=[{'name': 'start', 'time': FakeDatetime(2023, 1, 1, 0, 0)}, {'name': 'end', 'time': FakeDatetime(2023, 1, 1, 0, 0)}], inputs={'input': 'foo'}, outputs={'output': 'foo'}, reference_example_id=None, parent_run_id=UUID('00000000-0000-4000-8000-000000000000'), tags=[], execution_order=None, child_execution_order=None, child_runs=[])]), ]) # --- # name: test_router_runnable diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 8c616770e..0a36408d2 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -1,4 +1,4 @@ -from ast import Not +from operator import itemgetter from typing import Any, Dict, List, Optional from uuid import UUID @@ -39,7 +39,6 @@ from langchain.schema.runnable import ( RunnablePassthrough, RunnableSequence, RunnableWithFallbacks, - passthrough, ) @@ -178,6 +177,7 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: tags=[], callbacks=None, _locals={}, + recursion_limit=10, ), ), mocker.call( @@ -187,6 +187,7 @@ async def test_default_method_implementations(mocker: MockerFixture) -> None: tags=[], callbacks=None, _locals={}, + recursion_limit=10, ), ), ] @@ -768,6 +769,105 @@ async def test_router_runnable( assert len(router_run.child_runs) == 2 +@pytest.mark.asyncio +@freeze_time("2023-01-01") +async def test_higher_order_lambda_runnable( + mocker: MockerFixture, snapshot: SnapshotAssertion +) -> None: + math_chain = ChatPromptTemplate.from_template( + "You are a math genius. Answer the question: {question}" + ) | FakeListLLM(responses=["4"]) + english_chain = ChatPromptTemplate.from_template( + "You are an english major. Answer the question: {question}" + ) | FakeListLLM(responses=["2"]) + input_map = RunnableMap( + { # type: ignore[arg-type] + "key": lambda x: x["key"], + "input": {"question": lambda x: x["question"]}, + } + ) + + def router(input: Dict[str, Any]) -> Runnable: + if input["key"] == "math": + return itemgetter("input") | math_chain + elif input["key"] == "english": + return itemgetter("input") | english_chain + else: + raise ValueError(f"Unknown key: {input['key']}") + + chain: Runnable = input_map | router + assert dumps(chain, pretty=True) == snapshot + + result = chain.invoke({"key": "math", "question": "2 + 2"}) + assert result == "4" + + result2 = chain.batch( + [{"key": "math", "question": "2 + 2"}, {"key": "english", "question": "2 + 2"}] + ) + assert result2 == ["4", "2"] + + result = await chain.ainvoke({"key": "math", "question": "2 + 2"}) + assert result == "4" + + result2 = await chain.abatch( + [{"key": "math", "question": "2 + 2"}, {"key": "english", "question": "2 + 2"}] + ) + assert result2 == ["4", "2"] + + # Test invoke + math_spy = mocker.spy(math_chain.__class__, "invoke") + tracer = FakeTracer() + assert ( + chain.invoke({"key": "math", "question": "2 + 2"}, dict(callbacks=[tracer])) + == "4" + ) + assert math_spy.call_args.args[1] == { + "key": "math", + "input": {"question": "2 + 2"}, + } + assert len([r for r in tracer.runs if r.parent_run_id is None]) == 1 + parent_run = next(r for r in tracer.runs if r.parent_run_id is None) + assert len(parent_run.child_runs) == 2 + router_run = parent_run.child_runs[1] + assert router_run.name == "RunnableLambda" + assert len(router_run.child_runs) == 1 + math_run = router_run.child_runs[0] + assert math_run.name == "RunnableSequence" + assert len(math_run.child_runs) == 3 + + # Test ainvoke + async def arouter(input: Dict[str, Any]) -> Runnable: + if input["key"] == "math": + return itemgetter("input") | math_chain + elif input["key"] == "english": + return itemgetter("input") | english_chain + else: + raise ValueError(f"Unknown key: {input['key']}") + + achain: Runnable = input_map | arouter + math_spy = mocker.spy(math_chain.__class__, "ainvoke") + tracer = FakeTracer() + assert ( + await achain.ainvoke( + {"key": "math", "question": "2 + 2"}, dict(callbacks=[tracer]) + ) + == "4" + ) + assert math_spy.call_args.args[1] == { + "key": "math", + "input": {"question": "2 + 2"}, + } + assert len([r for r in tracer.runs if r.parent_run_id is None]) == 1 + parent_run = next(r for r in tracer.runs if r.parent_run_id is None) + assert len(parent_run.child_runs) == 2 + router_run = parent_run.child_runs[1] + assert router_run.name == "RunnableLambda" + assert len(router_run.child_runs) == 1 + math_run = router_run.child_runs[0] + assert math_run.name == "RunnableSequence" + assert len(math_run.child_runs) == 3 + + @freeze_time("2023-01-01") def test_seq_prompt_map(mocker: MockerFixture, snapshot: SnapshotAssertion) -> None: passthrough = mocker.Mock(side_effect=lambda x: x) From c326751085ad2f89a21a74c86c9a3597904bdebe Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 18 Aug 2023 09:22:35 +0100 Subject: [PATCH 087/143] Lint --- .../langchain/tests/unit_tests/schema/runnable/test_runnable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 0a36408d2..5214f5b36 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -780,7 +780,7 @@ async def test_higher_order_lambda_runnable( english_chain = ChatPromptTemplate.from_template( "You are an english major. Answer the question: {question}" ) | FakeListLLM(responses=["2"]) - input_map = RunnableMap( + input_map: Runnable = RunnableMap( { # type: ignore[arg-type] "key": lambda x: x["key"], "input": {"question": lambda x: x["question"]}, From da18e177f13023da59c64234f6ad76b845abee3e Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Fri, 18 Aug 2023 09:21:05 -0700 Subject: [PATCH 088/143] Update libs/langchain/langchain/schema/runnable/base.py Co-authored-by: Eugene Yurtsev --- libs/langchain/langchain/schema/runnable/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 3f6148e94..a4c95c12e 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1444,6 +1444,8 @@ class RunnableLambda(Runnable[Input, Output]): if hasattr(self, "afunc"): return await self._acall_with_config(self._ainvoke, input, config) else: + # Delegating to super implementation of ainvoke. + # Uses asyncio executor to run the sync version (invoke) return await super().ainvoke(input, config) From 6424b3cde0136c0b5fb8698bc764435692b017bd Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Wed, 23 Aug 2023 20:02:35 +0100 Subject: [PATCH 089/143] Add another test --- .../unit_tests/schema/runnable/test_runnable.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py index 5214f5b36..f24475331 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py +++ b/libs/langchain/tests/unit_tests/schema/runnable/test_runnable.py @@ -1,5 +1,5 @@ from operator import itemgetter -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Union from uuid import UUID import pytest @@ -1282,3 +1282,17 @@ def test_each(snapshot: SnapshotAssertion) -> None: "test", "this", ] + + +def test_recursive_lambda() -> None: + def _simple_recursion(x: int) -> Union[int, Runnable]: + if x < 10: + return RunnableLambda(lambda *args: _simple_recursion(x + 1)) + else: + return x + + runnable = RunnableLambda(_simple_recursion) + assert runnable.invoke(5) == 10 + + with pytest.raises(RecursionError): + runnable.invoke(0, {"recursion_limit": 9}) From 20ce283fa7ff7efa5447e922ffa64b3889603c4a Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Wed, 23 Aug 2023 20:03:35 +0100 Subject: [PATCH 090/143] Format --- libs/langchain/langchain/schema/runnable/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index a4c95c12e..a130dc62b 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1445,7 +1445,7 @@ class RunnableLambda(Runnable[Input, Output]): return await self._acall_with_config(self._ainvoke, input, config) else: # Delegating to super implementation of ainvoke. - # Uses asyncio executor to run the sync version (invoke) + # Uses asyncio executor to run the sync version (invoke) return await super().ainvoke(input, config) From 278ef0bdcf56e4a6d4009cd415a6a0d64ee0cf79 Mon Sep 17 00:00:00 2001 From: Jacob Lee Date: Wed, 23 Aug 2023 13:02:26 -0700 Subject: [PATCH 091/143] Adds ChatOllama (#9628) @rlancemartin --------- Co-authored-by: Adilkhan Sarsen <54854336+adolkhan@users.noreply.github.com> Co-authored-by: Kim Minjong Co-authored-by: Harrison Chase Co-authored-by: Lance Martin Co-authored-by: Bagatur --- docs/extras/integrations/chat/ollama.ipynb | 382 ++++++++++++++++++ .../langchain/callbacks/streaming_stdout.py | 9 + .../langchain/chat_models/__init__.py | 2 + .../langchain/chat_models/anthropic.py | 2 +- .../langchain/langchain/chat_models/ollama.py | 122 ++++++ libs/langchain/langchain/llms/ollama.py | 49 ++- 6 files changed, 550 insertions(+), 16 deletions(-) create mode 100644 docs/extras/integrations/chat/ollama.ipynb create mode 100644 libs/langchain/langchain/chat_models/ollama.py diff --git a/docs/extras/integrations/chat/ollama.ipynb b/docs/extras/integrations/chat/ollama.ipynb new file mode 100644 index 000000000..41a90405b --- /dev/null +++ b/docs/extras/integrations/chat/ollama.ipynb @@ -0,0 +1,382 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Ollama\n", + "\n", + "[Ollama](https://ollama.ai/) allows you to run open-source large language models, such as LLaMA2, locally.\n", + "\n", + "Ollama bundles model weights, configuration, and data into a single package, defined by a Modelfile. \n", + "\n", + "It optimizes setup and configuration details, including GPU usage.\n", + "\n", + "For a complete list of supported models and model variants, see the [Ollama model library](https://ollama.ai/library).\n", + "\n", + "## Setup\n", + "\n", + "First, follow [these instructions](https://github.com/jmorganca/ollama) to set up and run a local Ollama instance:\n", + "\n", + "* [Download](https://ollama.ai/download)\n", + "* Fetch a model via `ollama pull `\n", + "* e.g., for `Llama-7b`: `ollama pull llama2`\n", + "* This will download the most basic version of the model (e.g., minimum # parameters and 4-bit quantization)\n", + "* On Mac, it will download to:\n", + "\n", + "`~/.ollama/models/manifests/registry.ollama.ai/library//latest`\n", + "\n", + "* And we can specify a particular version, e.g., for `ollama pull vicuna:13b-v1.5-16k-q4_0`\n", + "* The file is here with the model version in place of `latest`\n", + "\n", + "`~/.ollama/models/manifests/registry.ollama.ai/library/vicuna/13b-v1.5-16k-q4_0`\n", + "\n", + "You can easily access models in a few ways:\n", + "\n", + "1/ if the app is running:\n", + "* All of your local models are automatically served on `localhost:11434`\n", + "* Select your model when setting `llm = Ollama(..., model=\":\")`\n", + "* If you set `llm = Ollama(..., model=\"> Use the following pieces of context to answer the question at the end. \n", + "If you don't know the answer, just say that you don't know, don't try to make up an answer. \n", + "Use three sentences maximum and keep the answer as concise as possible. <>\n", + "{context}\n", + "Question: {question}\n", + "Helpful Answer:[/INST]\"\"\"\n", + "QA_CHAIN_PROMPT = PromptTemplate(\n", + " input_variables=[\"context\", \"question\"],\n", + " template=template,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Chat model\n", + "from langchain.chat_models import ChatOllama\n", + "from langchain.callbacks.manager import CallbackManager\n", + "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", + "chat_model = ChatOllama(model=\"llama2:13b-chat\",\n", + " verbose=True,\n", + " callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# QA chain\n", + "from langchain.chains import RetrievalQA\n", + "qa_chain = RetrievalQA.from_chain_type(\n", + " chat_model,\n", + " retriever=vectorstore.as_retriever(),\n", + " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Based on the provided context, there are three approaches to task decomposition for AI agents:\n", + "\n", + "1. LLM with simple prompting, such as \"Steps for XYZ.\" or \"What are the subgoals for achieving XYZ?\"\n", + "2. Task-specific instructions, such as \"Write a story outline\" for writing a novel.\n", + "3. Human inputs." + ] + } + ], + "source": [ + "question = \"What are the various approaches to Task Decomposition for AI Agents?\"\n", + "result = qa_chain({\"query\": question})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also get logging for tokens." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Based on the given context, here is the answer to the question \"What are the approaches to Task Decomposition?\"\n", + "\n", + "There are three approaches to task decomposition:\n", + "\n", + "1. LLM with simple prompting, such as \"Steps for XYZ.\" or \"What are the subgoals for achieving XYZ?\"\n", + "2. Using task-specific instructions, like \"Write a story outline\" for writing a novel.\n", + "3. With human inputs.{'model': 'llama2:13b-chat', 'created_at': '2023-08-23T15:37:51.469127Z', 'done': True, 'context': [1, 29871, 1, 29961, 25580, 29962, 518, 25580, 29962, 518, 25580, 29962, 3532, 14816, 29903, 6778, 4803, 278, 1494, 12785, 310, 3030, 304, 1234, 278, 1139, 472, 278, 1095, 29889, 29871, 13, 3644, 366, 1016, 29915, 29873, 1073, 278, 1234, 29892, 925, 1827, 393, 366, 1016, 29915, 29873, 1073, 29892, 1016, 29915, 29873, 1018, 304, 1207, 701, 385, 1234, 29889, 29871, 13, 11403, 2211, 25260, 7472, 322, 3013, 278, 1234, 408, 3022, 895, 408, 1950, 29889, 529, 829, 14816, 29903, 6778, 13, 5398, 26227, 508, 367, 2309, 313, 29896, 29897, 491, 365, 26369, 411, 2560, 9508, 292, 763, 376, 7789, 567, 363, 1060, 29979, 29999, 7790, 29876, 29896, 19602, 376, 5618, 526, 278, 1014, 1484, 1338, 363, 3657, 15387, 1060, 29979, 29999, 29973, 613, 313, 29906, 29897, 491, 773, 3414, 29899, 14940, 11994, 29936, 321, 29889, 29887, 29889, 376, 6113, 263, 5828, 27887, 1213, 363, 5007, 263, 9554, 29892, 470, 313, 29941, 29897, 411, 5199, 10970, 29889, 13, 13, 5398, 26227, 508, 367, 2309, 313, 29896, 29897, 491, 365, 26369, 411, 2560, 9508, 292, 763, 376, 7789, 567, 363, 1060, 29979, 29999, 7790, 29876, 29896, 19602, 376, 5618, 526, 278, 1014, 1484, 1338, 363, 3657, 15387, 1060, 29979, 29999, 29973, 613, 313, 29906, 29897, 491, 773, 3414, 29899, 14940, 11994, 29936, 321, 29889, 29887, 29889, 376, 6113, 263, 5828, 27887, 1213, 363, 5007, 263, 9554, 29892, 470, 313, 29941, 29897, 411, 5199, 10970, 29889, 13, 13, 1451, 16047, 267, 297, 1472, 29899, 8489, 18987, 322, 3414, 26227, 29901, 1858, 9450, 975, 263, 3309, 29891, 4955, 322, 17583, 3902, 8253, 278, 1650, 2913, 3933, 18066, 292, 29889, 365, 26369, 29879, 21117, 304, 10365, 13900, 746, 20050, 411, 15668, 4436, 29892, 3907, 963, 3109, 16424, 9401, 304, 25618, 1058, 5110, 515, 14260, 322, 1059, 29889, 13, 13, 1451, 16047, 267, 297, 1472, 29899, 8489, 18987, 322, 3414, 26227, 29901, 1858, 9450, 975, 263, 3309, 29891, 4955, 322, 17583, 3902, 8253, 278, 1650, 2913, 3933, 18066, 292, 29889, 365, 26369, 29879, 21117, 304, 10365, 13900, 746, 20050, 411, 15668, 4436, 29892, 3907, 963, 3109, 16424, 9401, 304, 25618, 1058, 5110, 515, 14260, 322, 1059, 29889, 13, 16492, 29901, 1724, 526, 278, 13501, 304, 9330, 897, 510, 3283, 29973, 13, 29648, 1319, 673, 10834, 29914, 25580, 29962, 518, 29914, 25580, 29962, 518, 29914, 25580, 29962, 29871, 16564, 373, 278, 2183, 3030, 29892, 1244, 338, 278, 1234, 304, 278, 1139, 376, 5618, 526, 278, 13501, 304, 9330, 897, 510, 3283, 3026, 13, 13, 8439, 526, 2211, 13501, 304, 3414, 26227, 29901, 13, 13, 29896, 29889, 365, 26369, 411, 2560, 9508, 292, 29892, 1316, 408, 376, 7789, 567, 363, 1060, 29979, 29999, 1213, 470, 376, 5618, 526, 278, 1014, 1484, 1338, 363, 3657, 15387, 1060, 29979, 29999, 3026, 13, 29906, 29889, 5293, 3414, 29899, 14940, 11994, 29892, 763, 376, 6113, 263, 5828, 27887, 29908, 363, 5007, 263, 9554, 29889, 13, 29941, 29889, 2973, 5199, 10970, 29889, 2], 'total_duration': 9514823750, 'load_duration': 795542, 'sample_count': 99, 'sample_duration': 68732000, 'prompt_eval_count': 146, 'prompt_eval_duration': 6206275000, 'eval_count': 98, 'eval_duration': 3229641000}\n" + ] + } + ], + "source": [ + "from langchain.schema import LLMResult\n", + "from langchain.callbacks.base import BaseCallbackHandler\n", + "\n", + "class GenerationStatisticsCallback(BaseCallbackHandler):\n", + " def on_llm_end(self, response: LLMResult, **kwargs) -> None:\n", + " print(response.generations[0][0].generation_info)\n", + " \n", + "callback_manager = CallbackManager([StreamingStdOutCallbackHandler(), GenerationStatisticsCallback()])\n", + "\n", + "chat_model = ChatOllama(model=\"llama2:13b-chat\",\n", + " verbose=True,\n", + " callback_manager=callback_manager)\n", + "\n", + "qa_chain = RetrievalQA.from_chain_type(\n", + " chat_model,\n", + " retriever=vectorstore.as_retriever(),\n", + " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT},\n", + ")\n", + "\n", + "question = \"What are the approaches to Task Decomposition?\"\n", + "result = qa_chain({\"query\": question})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`eval_count` / (`eval_duration`/10e9) gets `tok / s`" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "30.343929867127645" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "98 / (3229641000/1000/1000/1000)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/libs/langchain/langchain/callbacks/streaming_stdout.py b/libs/langchain/langchain/callbacks/streaming_stdout.py index 4acde4ceb..2c71bc769 100644 --- a/libs/langchain/langchain/callbacks/streaming_stdout.py +++ b/libs/langchain/langchain/callbacks/streaming_stdout.py @@ -4,6 +4,7 @@ from typing import Any, Dict, List, Union from langchain.callbacks.base import BaseCallbackHandler from langchain.schema import AgentAction, AgentFinish, LLMResult +from langchain.schema.messages import BaseMessage class StreamingStdOutCallbackHandler(BaseCallbackHandler): @@ -14,6 +15,14 @@ class StreamingStdOutCallbackHandler(BaseCallbackHandler): ) -> None: """Run when LLM starts running.""" + def on_chat_model_start( + self, + serialized: Dict[str, Any], + messages: List[List[BaseMessage]], + **kwargs: Any + ) -> None: + """Run when LLM starts running.""" + def on_llm_new_token(self, token: str, **kwargs: Any) -> None: """Run on new LLM token. Only available when streaming is enabled.""" sys.stdout.write(token) diff --git a/libs/langchain/langchain/chat_models/__init__.py b/libs/langchain/langchain/chat_models/__init__.py index 0f26a852b..ee21a2377 100644 --- a/libs/langchain/langchain/chat_models/__init__.py +++ b/libs/langchain/langchain/chat_models/__init__.py @@ -27,6 +27,7 @@ from langchain.chat_models.human import HumanInputChatModel from langchain.chat_models.jinachat import JinaChat from langchain.chat_models.litellm import ChatLiteLLM from langchain.chat_models.mlflow_ai_gateway import ChatMLflowAIGateway +from langchain.chat_models.ollama import ChatOllama from langchain.chat_models.openai import ChatOpenAI from langchain.chat_models.promptlayer_openai import PromptLayerChatOpenAI from langchain.chat_models.vertexai import ChatVertexAI @@ -39,6 +40,7 @@ __all__ = [ "ChatAnthropic", "ChatGooglePalm", "ChatMLflowAIGateway", + "ChatOllama", "ChatVertexAI", "JinaChat", "HumanInputChatModel", diff --git a/libs/langchain/langchain/chat_models/anthropic.py b/libs/langchain/langchain/chat_models/anthropic.py index e201e382f..ef1da6319 100644 --- a/libs/langchain/langchain/chat_models/anthropic.py +++ b/libs/langchain/langchain/chat_models/anthropic.py @@ -32,7 +32,7 @@ class ChatAnthropic(BaseChatModel, _AnthropicCommon): .. code-block:: python import anthropic - from langchain.llms import Anthropic + from langchain.chat_models import ChatAnthropic model = ChatAnthropic(model="", anthropic_api_key="my-api-key") """ diff --git a/libs/langchain/langchain/chat_models/ollama.py b/libs/langchain/langchain/chat_models/ollama.py new file mode 100644 index 000000000..a1fdcd0ac --- /dev/null +++ b/libs/langchain/langchain/chat_models/ollama.py @@ -0,0 +1,122 @@ +import json +from typing import Any, Iterator, List, Optional + +from langchain.callbacks.manager import ( + CallbackManagerForLLMRun, +) +from langchain.chat_models.base import BaseChatModel +from langchain.llms.ollama import _OllamaCommon +from langchain.schema import ChatResult +from langchain.schema.messages import ( + AIMessage, + AIMessageChunk, + BaseMessage, + ChatMessage, + HumanMessage, + SystemMessage, +) +from langchain.schema.output import ChatGeneration, ChatGenerationChunk + + +def _stream_response_to_chat_generation_chunk( + stream_response: str, +) -> ChatGenerationChunk: + """Convert a stream response to a generation chunk.""" + parsed_response = json.loads(stream_response) + generation_info = parsed_response if parsed_response.get("done") is True else None + return ChatGenerationChunk( + message=AIMessageChunk(content=parsed_response.get("response", "")), + generation_info=generation_info, + ) + + +class ChatOllama(BaseChatModel, _OllamaCommon): + """Ollama locally runs large language models. + + To use, follow the instructions at https://ollama.ai/. + + Example: + .. code-block:: python + + from langchain.chat_models import ChatOllama + ollama = ChatOllama(model="llama2") + """ + + @property + def _llm_type(self) -> str: + """Return type of chat model.""" + return "ollama-chat" + + @property + def lc_serializable(self) -> bool: + return True + + def _format_message_as_text(self, message: BaseMessage) -> str: + if isinstance(message, ChatMessage): + message_text = f"\n\n{message.role.capitalize()}: {message.content}" + elif isinstance(message, HumanMessage): + message_text = f"[INST] {message.content} [/INST]" + elif isinstance(message, AIMessage): + message_text = f"{message.content}" + elif isinstance(message, SystemMessage): + message_text = f"<> {message.content} <>" + else: + raise ValueError(f"Got unknown type {message}") + return message_text + + def _format_messages_as_text(self, messages: List[BaseMessage]) -> str: + return "\n".join( + [self._format_message_as_text(message) for message in messages] + ) + + def _generate( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + **kwargs: Any, + ) -> ChatResult: + """Call out to Ollama's generate endpoint. + + Args: + messages: The list of base messages to pass into the model. + stop: Optional list of stop words to use when generating. + + Returns: + Chat generations from the model + + Example: + .. code-block:: python + + response = ollama([ + HumanMessage(content="Tell me about the history of AI") + ]) + """ + + prompt = self._format_messages_as_text(messages) + final_chunk = super()._stream_with_aggregation( + prompt, stop=stop, run_manager=run_manager, verbose=self.verbose, **kwargs + ) + chat_generation = ChatGeneration( + message=AIMessage(content=final_chunk.text), + generation_info=final_chunk.generation_info, + ) + return ChatResult(generations=[chat_generation]) + + def _stream( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + **kwargs: Any, + ) -> Iterator[ChatGenerationChunk]: + prompt = self._format_messages_as_text(messages) + for stream_resp in self._create_stream(prompt, stop, **kwargs): + if stream_resp: + chunk = _stream_response_to_chat_generation_chunk(stream_resp) + yield chunk + if run_manager: + run_manager.on_llm_new_token( + chunk.text, + verbose=self.verbose, + ) diff --git a/libs/langchain/langchain/llms/ollama.py b/libs/langchain/langchain/llms/ollama.py index ec132c08b..527bbcbc4 100644 --- a/libs/langchain/langchain/llms/ollama.py +++ b/libs/langchain/langchain/llms/ollama.py @@ -144,9 +144,35 @@ class _OllamaCommon(BaseLanguageModel): ) return response.iter_lines(decode_unicode=True) + def _stream_with_aggregation( + self, + prompt: str, + stop: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + verbose: bool = False, + **kwargs: Any, + ) -> GenerationChunk: + final_chunk: Optional[GenerationChunk] = None + for stream_resp in self._create_stream(prompt, stop, **kwargs): + if stream_resp: + chunk = _stream_response_to_generation_chunk(stream_resp) + if final_chunk is None: + final_chunk = chunk + else: + final_chunk += chunk + if run_manager: + run_manager.on_llm_new_token( + chunk.text, + verbose=verbose, + ) + if final_chunk is None: + raise ValueError("No data received from Ollama stream.") + + return final_chunk + class Ollama(BaseLLM, _OllamaCommon): - """Ollama locally run large language models. + """Ollama locally runs large language models. To use, follow the instructions at https://ollama.ai/. @@ -191,20 +217,13 @@ class Ollama(BaseLLM, _OllamaCommon): # TODO: add caching here. generations = [] for prompt in prompts: - final_chunk: Optional[GenerationChunk] = None - for stream_resp in self._create_stream(prompt, stop, **kwargs): - if stream_resp: - chunk = _stream_response_to_generation_chunk(stream_resp) - if final_chunk is None: - final_chunk = chunk - else: - final_chunk += chunk - if run_manager: - run_manager.on_llm_new_token( - chunk.text, - verbose=self.verbose, - ) - + final_chunk = super()._stream_with_aggregation( + prompt, + stop=stop, + run_manager=run_manager, + verbose=self.verbose, + **kwargs, + ) generations.append([final_chunk]) return LLMResult(generations=generations) From cd81e8a8f22d7f4c99db884632df769231538d2b Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Wed, 23 Aug 2023 19:09:10 -0400 Subject: [PATCH 092/143] Add exclude to GenericLoader.from_file_system (#9539) support exclude param in GenericLoader.from_filesystem --------- Co-authored-by: Kyle Pancamo <50267605+KylePancamo@users.noreply.github.com> Co-authored-by: Bagatur --- .../langchain/document_loaders/concurrent.py | 21 +++++++++++++++++-- .../langchain/document_loaders/generic.py | 8 ++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/libs/langchain/langchain/document_loaders/concurrent.py b/libs/langchain/langchain/document_loaders/concurrent.py index 2044dcc7f..bb55d6700 100644 --- a/libs/langchain/langchain/document_loaders/concurrent.py +++ b/libs/langchain/langchain/document_loaders/concurrent.py @@ -44,6 +44,7 @@ class ConcurrentLoader(GenericLoader): path: _PathLike, *, glob: str = "**/[!.]*", + exclude: Sequence[str] = (), suffixes: Optional[Sequence[str]] = None, show_progress: bool = False, parser: Union[DEFAULT, BaseBlobParser] = "default", @@ -52,12 +53,28 @@ class ConcurrentLoader(GenericLoader): """ Create a concurrent generic document loader using a filesystem blob loader. + + + Args: + path: The path to the directory to load documents from. + glob: The glob pattern to use to find documents. + suffixes: The suffixes to use to filter documents. If None, all files + matching the glob will be loaded. + exclude: A list of patterns to exclude from the loader. + show_progress: Whether to show a progress bar or not (requires tqdm). + Proxies to the file system loader. + parser: A blob parser which knows how to parse blobs into documents + num_workers: Max number of concurrent workers to use. """ blob_loader = FileSystemBlobLoader( - path, glob=glob, suffixes=suffixes, show_progress=show_progress + path, + glob=glob, + exclude=exclude, + suffixes=suffixes, + show_progress=show_progress, ) if isinstance(parser, str): blob_parser = get_parser(parser) else: blob_parser = parser - return cls(blob_loader, blob_parser, num_workers) + return cls(blob_loader, blob_parser, num_workers=num_workers) diff --git a/libs/langchain/langchain/document_loaders/generic.py b/libs/langchain/langchain/document_loaders/generic.py index 2728e0ae9..26d7577a3 100644 --- a/libs/langchain/langchain/document_loaders/generic.py +++ b/libs/langchain/langchain/document_loaders/generic.py @@ -105,6 +105,7 @@ class GenericLoader(BaseLoader): path: _PathLike, *, glob: str = "**/[!.]*", + exclude: Sequence[str] = (), suffixes: Optional[Sequence[str]] = None, show_progress: bool = False, parser: Union[DEFAULT, BaseBlobParser] = "default", @@ -116,6 +117,7 @@ class GenericLoader(BaseLoader): glob: The glob pattern to use to find documents. suffixes: The suffixes to use to filter documents. If None, all files matching the glob will be loaded. + exclude: A list of patterns to exclude from the loader. show_progress: Whether to show a progress bar or not (requires tqdm). Proxies to the file system loader. parser: A blob parser which knows how to parse blobs into documents @@ -124,7 +126,11 @@ class GenericLoader(BaseLoader): A generic document loader. """ blob_loader = FileSystemBlobLoader( - path, glob=glob, suffixes=suffixes, show_progress=show_progress + path, + glob=glob, + exclude=exclude, + suffixes=suffixes, + show_progress=show_progress, ) if isinstance(parser, str): blob_parser = get_parser(parser) From cbaea8d63b98b3c1a8cb3778c9bceec28e258896 Mon Sep 17 00:00:00 2001 From: Keras Conv3d <35223092+tianhanwen@users.noreply.github.com> Date: Thu, 24 Aug 2023 07:38:31 +0800 Subject: [PATCH 093/143] tair fix distance_type error, and add hybrid search (#9531) - fix: distance_type error, - feature: Tair add hybrid search --------- Co-authored-by: thw Co-authored-by: Bagatur --- .../integrations/vectorstores/tair.ipynb | 79 ++++++++++++++++--- libs/langchain/langchain/vectorstores/tair.py | 40 +++++++--- 2 files changed, 99 insertions(+), 20 deletions(-) diff --git a/docs/extras/integrations/vectorstores/tair.ipynb b/docs/extras/integrations/vectorstores/tair.ipynb index e3e7b024d..0b55b9f56 100644 --- a/docs/extras/integrations/vectorstores/tair.ipynb +++ b/docs/extras/integrations/vectorstores/tair.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -27,13 +27,30 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "RuntimeError", + "evalue": "Error loading ../../../state_of_the_union.txt", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/opt/homebrew/lib/python3.10/site-packages/langchain/document_loaders/text.py:40\u001b[0m, in \u001b[0;36mTextLoader.load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m---> 40\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mopen\u001b[39;49m(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mfile_path, encoding\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mencoding) \u001b[39mas\u001b[39;00m f:\n\u001b[1;32m 41\u001b[0m text \u001b[39m=\u001b[39m f\u001b[39m.\u001b[39mread()\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '../../../state_of_the_union.txt'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[30], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mlangchain\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mdocument_loaders\u001b[39;00m \u001b[39mimport\u001b[39;00m TextLoader\n\u001b[1;32m 3\u001b[0m loader \u001b[39m=\u001b[39m TextLoader(\u001b[39m\"\u001b[39m\u001b[39m../../../state_of_the_union.txt\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m----> 4\u001b[0m documents \u001b[39m=\u001b[39m loader\u001b[39m.\u001b[39;49mload()\n\u001b[1;32m 5\u001b[0m text_splitter \u001b[39m=\u001b[39m CharacterTextSplitter(chunk_size\u001b[39m=\u001b[39m\u001b[39m1000\u001b[39m, chunk_overlap\u001b[39m=\u001b[39m\u001b[39m0\u001b[39m)\n\u001b[1;32m 6\u001b[0m docs \u001b[39m=\u001b[39m text_splitter\u001b[39m.\u001b[39msplit_documents(documents)\n", + "File \u001b[0;32m/opt/homebrew/lib/python3.10/site-packages/langchain/document_loaders/text.py:56\u001b[0m, in \u001b[0;36mTextLoader.load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mRuntimeError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mError loading \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfile_path\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m) \u001b[39mfrom\u001b[39;00m \u001b[39me\u001b[39;00m\n\u001b[1;32m 55\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m \u001b[39mas\u001b[39;00m e:\n\u001b[0;32m---> 56\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mRuntimeError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mError loading \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfile_path\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m) \u001b[39mfrom\u001b[39;00m \u001b[39me\u001b[39;00m\n\u001b[1;32m 58\u001b[0m metadata \u001b[39m=\u001b[39m {\u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfile_path}\n\u001b[1;32m 59\u001b[0m \u001b[39mreturn\u001b[39;00m [Document(page_content\u001b[39m=\u001b[39mtext, metadata\u001b[39m=\u001b[39mmetadata)]\n", + "\u001b[0;31mRuntimeError\u001b[0m: Error loading ../../../state_of_the_union.txt" + ] + } + ], "source": [ "from langchain.document_loaders import TextLoader\n", "\n", - "loader = TextLoader(\"../../../state_of_the_union.txt\")\n", + "loader = TextLoader(\"../../../extras/modules/state_of_the_union.txt\")\n", "documents = loader.load()\n", "text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\n", "docs = text_splitter.split_documents(documents)\n", @@ -57,16 +74,28 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'docs' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 6\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[39m# drop first if index already exists\u001b[39;00m\n\u001b[1;32m 4\u001b[0m Tair\u001b[39m.\u001b[39mdrop_index(tair_url\u001b[39m=\u001b[39mtair_url)\n\u001b[0;32m----> 6\u001b[0m vector_store \u001b[39m=\u001b[39m Tair\u001b[39m.\u001b[39mfrom_documents(docs, embeddings, tair_url\u001b[39m=\u001b[39mtair_url)\n", + "\u001b[0;31mNameError\u001b[0m: name 'docs' is not defined" + ] + } + ], "source": [ "tair_url = \"redis://localhost:6379\"\n", "\n", "# drop first if index already exists\n", "Tair.drop_index(tair_url=tair_url)\n", "\n", - "vector_store = Tair.from_documents(docs, embeddings, tair_url=tair_url)" + "vector_store = Tair.from_documents(docs, embeddings, tair_url=tair_url)\n" ] }, { @@ -98,12 +127,44 @@ "docs[0]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tair Hybrid Search Index build" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# drop first if index already exists\n", + "Tair.drop_index(tair_url=tair_url)\n", + "\n", + "vector_store = Tair.from_documents(docs, embeddings, tair_url=tair_url, index_params={\"lexical_algorithm\":\"bm25\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tair Hybrid Search" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "query = \"What did the president say about Ketanji Brown Jackson\"\n", + "# hybrid_ratio: 0.5 hybrid search, 0.9999 vector search, 0.0001 text search\n", + "kwargs = {\"TEXT\" : query, \"hybrid_ratio\" : 0.5}\n", + "docs = vector_store.similarity_search(query, **kwargs)\n", + "docs[0]" + ] } ], "metadata": { @@ -122,7 +183,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.8" } }, "nbformat": 4, diff --git a/libs/langchain/langchain/vectorstores/tair.py b/libs/langchain/langchain/vectorstores/tair.py index 0bda5c681..26108da59 100644 --- a/libs/langchain/langchain/vectorstores/tair.py +++ b/libs/langchain/langchain/vectorstores/tair.py @@ -86,6 +86,10 @@ class Tair(VectorStore): """Add texts data to an existing index.""" ids = [] keys = kwargs.get("keys", None) + use_hybrid_search = False + index = self.client.tvs_get_index(self.index_name) + if index is not None and index.get("lexical_algorithm") == "bm25": + use_hybrid_search = True # Write data to tair pipeline = self.client.pipeline(transaction=False) embeddings = self.embedding_function.embed_documents(list(texts)) @@ -93,16 +97,30 @@ class Tair(VectorStore): # Use provided key otherwise use default key key = keys[i] if keys else _uuid_key() metadata = metadatas[i] if metadatas else {} - pipeline.tvs_hset( - self.index_name, - key, - embeddings[i], - False, - **{ - self.content_key: text, - self.metadata_key: json.dumps(metadata), - }, - ) + if use_hybrid_search: + # tair use TEXT attr hybrid search + pipeline.tvs_hset( + self.index_name, + key, + embeddings[i], + False, + **{ + "TEXT": text, + self.content_key: text, + self.metadata_key: json.dumps(metadata), + }, + ) + else: + pipeline.tvs_hset( + self.index_name, + key, + embeddings[i], + False, + **{ + self.content_key: text, + self.metadata_key: json.dumps(metadata), + }, + ) ids.append(key) pipeline.execute() return ids @@ -166,7 +184,7 @@ class Tair(VectorStore): distance_type = tairvector.DistanceMetric.InnerProduct if "distance_type" in kwargs: - distance_type = kwargs.pop("distance_typ") + distance_type = kwargs.pop("distance_type") index_type = tairvector.IndexType.HNSW if "index_type" in kwargs: index_type = kwargs.pop("index_type") From 342087bdfa3ac31d622385d0f2d09cf5e06c8db3 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Wed, 23 Aug 2023 16:47:01 -0700 Subject: [PATCH 094/143] fix integration test imports (#9669) --- .../document_loaders/test_polars_dataframe.py | 10 +++++++++- .../integration_tests/vectorstores/test_epsilla.py | 6 ++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py b/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py index bd8e129da..b9e4727d2 100644 --- a/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py +++ b/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py @@ -1,12 +1,18 @@ -import polars as pl +from typing import TYPE_CHECKING + import pytest from langchain.document_loaders import PolarsDataFrameLoader from langchain.schema import Document +if TYPE_CHECKING: + import polars as pl + @pytest.fixture def sample_data_frame() -> pl.DataFrame: + import polars as pl + data = { "text": ["Hello", "World"], "author": ["Alice", "Bob"], @@ -26,6 +32,8 @@ def test_load_returns_list_of_documents(sample_data_frame: pl.DataFrame) -> None def test_load_converts_dataframe_columns_to_document_metadata( sample_data_frame: pl.DataFrame, ) -> None: + import polars as pl + loader = PolarsDataFrameLoader(sample_data_frame) docs = loader.load() diff --git a/libs/langchain/tests/integration_tests/vectorstores/test_epsilla.py b/libs/langchain/tests/integration_tests/vectorstores/test_epsilla.py index af40d698b..33e2e6952 100644 --- a/libs/langchain/tests/integration_tests/vectorstores/test_epsilla.py +++ b/libs/langchain/tests/integration_tests/vectorstores/test_epsilla.py @@ -1,6 +1,4 @@ """Test Epsilla functionality.""" -from pyepsilla import vectordb - from langchain.vectorstores import Epsilla from tests.integration_tests.vectorstores.fake_embeddings import ( FakeEmbeddings, @@ -9,6 +7,8 @@ from tests.integration_tests.vectorstores.fake_embeddings import ( def _test_from_texts() -> Epsilla: + from pyepsilla import vectordb + embeddings = FakeEmbeddings() client = vectordb.Client() return Epsilla.from_texts(fake_texts, embeddings, client) @@ -22,6 +22,8 @@ def test_epsilla() -> None: def test_epsilla_add_texts() -> None: + from pyepsilla import vectordb + embeddings = FakeEmbeddings() client = vectordb.Client() db = Epsilla(client, embeddings) From a8c916955f014d023c94a63292beb529c5961fe1 Mon Sep 17 00:00:00 2001 From: Lakshay Kansal <58596666+lakkn@users.noreply.github.com> Date: Wed, 23 Aug 2023 20:49:44 -0400 Subject: [PATCH 095/143] Updates to Nomic Atlas and GPT4All documentation (#9414) Description: Updates for Nomic AI Atlas and GPT4All integrations documentation. --------- Co-authored-by: Bagatur --- docs/extras/integrations/llms/gpt4all.ipynb | 56 ++++----- .../integrations/text_embedding/gpt4all.ipynb | 41 ++++++- .../integrations/vectorstores/atlas.ipynb | 106 ++++++------------ 3 files changed, 106 insertions(+), 97 deletions(-) diff --git a/docs/extras/integrations/llms/gpt4all.ipynb b/docs/extras/integrations/llms/gpt4all.ipynb index 7ebbd4e9e..a8760ceea 100644 --- a/docs/extras/integrations/llms/gpt4all.ipynb +++ b/docs/extras/integrations/llms/gpt4all.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -30,6 +31,14 @@ "%pip install gpt4all > /dev/null" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Import GPT4All" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -43,6 +52,14 @@ "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set Up Question to pass to LLM" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -59,6 +76,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -66,18 +84,14 @@ "\n", "To run locally, download a compatible ggml-formatted model. \n", " \n", - "**Download option 1**: The [gpt4all page](https://gpt4all.io/index.html) has a useful `Model Explorer` section:\n", + "The [gpt4all page](https://gpt4all.io/index.html) has a useful `Model Explorer` section:\n", "\n", "* Select a model of interest\n", "* Download using the UI and move the `.bin` to the `local_path` (noted below)\n", "\n", "For more info, visit https://github.com/nomic-ai/gpt4all.\n", "\n", - "--- \n", - "\n", - "**Download option 2**: Uncomment the below block to download a model. \n", - "\n", - "* You may want to update `url` to a new version, whih can be browsed using the [gpt4all page](https://gpt4all.io/index.html)." + "---" ] }, { @@ -88,27 +102,7 @@ "source": [ "local_path = (\n", " \"./models/ggml-gpt4all-l13b-snoozy.bin\" # replace with your desired local file path\n", - ")\n", - "\n", - "# import requests\n", - "\n", - "# from pathlib import Path\n", - "# from tqdm import tqdm\n", - "\n", - "# Path(local_path).parent.mkdir(parents=True, exist_ok=True)\n", - "\n", - "# # Example model. Check https://github.com/nomic-ai/gpt4all for the latest models.\n", - "# url = 'http://gpt4all.io/models/ggml-gpt4all-l13b-snoozy.bin'\n", - "\n", - "# # send a GET request to the URL to download the file. Stream since it's large\n", - "# response = requests.get(url, stream=True)\n", - "\n", - "# # open the file in binary mode and write the contents of the response to it in chunks\n", - "# # This is a large file, so be prepared to wait.\n", - "# with open(local_path, 'wb') as f:\n", - "# for chunk in tqdm(response.iter_content(chunk_size=8192)):\n", - "# if chunk:\n", - "# f.write(chunk)" + ")" ] }, { @@ -147,6 +141,14 @@ "\n", "llm_chain.run(question)" ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Justin Bieber was born on March 1, 1994. In 1994, The Cowboys won Super Bowl XXVIII." + ] } ], "metadata": { diff --git a/docs/extras/integrations/text_embedding/gpt4all.ipynb b/docs/extras/integrations/text_embedding/gpt4all.ipynb index d8d02ee96..67ebc9c58 100644 --- a/docs/extras/integrations/text_embedding/gpt4all.ipynb +++ b/docs/extras/integrations/text_embedding/gpt4all.ipynb @@ -1,15 +1,27 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "id": "d63d56c2", "metadata": {}, "source": [ "# GPT4All\n", "\n", + "[GPT4All](https://gpt4all.io/index.html) is a free-to-use, locally running, privacy-aware chatbot. There is no GPU or internet required. It features popular models and its own models such as GPT4All Falcon, Wizard, etc.\n", + "\n", "This notebook explains how to use [GPT4All embeddings](https://docs.gpt4all.io/gpt4all_python_embedding.html#gpt4all.gpt4all.Embed4All) with LangChain." ] }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "46b7aa85", + "metadata": {}, + "source": [ + "## Install GPT4All's Python Bindings" + ] + }, { "cell_type": "code", "execution_count": null, @@ -17,7 +29,16 @@ "metadata": {}, "outputs": [], "source": [ - "! pip install gpt4all" + "%pip install gpt4all > /dev/null" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "d80f4b92", + "metadata": {}, + "source": [ + "Note: you may need to restart the kernel to use updated packages." ] }, { @@ -72,6 +93,15 @@ "text = \"This is a test document.\"" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "eef36bde", + "metadata": {}, + "source": [ + "## Embed the Textual Data" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -82,6 +112,15 @@ "query_result = gpt4all_embd.embed_query(text)" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "12b24e69", + "metadata": {}, + "source": [ + "With embed_documents you can embed multiple pieces of text. You can also map these embeddings with [Nomic's Atlas](https://docs.nomic.ai/index.html) to see a visual representation of your data." + ] + }, { "cell_type": "code", "execution_count": 5, diff --git a/docs/extras/integrations/vectorstores/atlas.ipynb b/docs/extras/integrations/vectorstores/atlas.ipynb index fb18aab45..0f761a8dc 100644 --- a/docs/extras/integrations/vectorstores/atlas.ipynb +++ b/docs/extras/integrations/vectorstores/atlas.ipynb @@ -1,13 +1,14 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Atlas\n", "\n", "\n", - ">[Atlas](https://docs.nomic.ai/index.html) is a platform for interacting with both small and internet scale unstructured datasets by `Nomic`. \n", + ">[Atlas](https://docs.nomic.ai/index.html) is a platform by Nomic made for interacting with both small and internet scale unstructured datasets. It enables anyone to visualize, search, and share massive datasets in their browser.\n", "\n", "This notebook shows you how to use functionality related to the `AtlasDB` vectorstore." ] @@ -49,6 +50,14 @@ "!pip install nomic" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load Packages" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -78,6 +87,14 @@ "ATLAS_TEST_API_KEY = \"7xDPkYXSYDc1_ErdTPIcoAR9RNd8YDlkS3nVNXcVoIMZ6\"" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare the Data" + ] + }, { "cell_type": "code", "execution_count": 8, @@ -96,6 +113,14 @@ "texts = [e.strip() for e in texts]" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Map the Data using Nomic's Atlas" + ] + }, { "cell_type": "code", "execution_count": null, @@ -127,78 +152,21 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " test_index_1677255228.136989\n", - "
\n", - " A description for your project 508 datums inserted.\n", - "
\n", - " 1 index built.\n", - "
Projections\n", - "
    \n", - "
  • test_index_1677255228.136989_index. Status Completed. view online

\n", - "\n", - "

Projection ID: db996d77-8981-48a0-897a-ff2c22bbf541

\n", - "
\n", - "
Hide embedded project
\n", - "
\n", - " Explore on atlas.nomic.ai\n", - "
\n", - "
\n", - " \n", - " \n", - "\n", - " \n", - " \n", - " \n", - " " - ], - "text/plain": [ - "AtlasProject: <{'id': 'ee2354a3-7f9a-4c6b-af43-b0cda09d7198', 'owner': '9c29afbb-a002-4d49-958e-ecf5ae1351ac', 'project_name': 'test_index_1677255228.136989', 'creator': 'auth0|63efc4b5462246f4d9a6ecf2', 'description': 'A description for your project', 'opensearch_index_id': 'f61fb8dd-0abf-4f31-9130-41870e443902', 'is_public': True, 'project_fields': ['atlas_id', 'text'], 'unique_id_field': 'atlas_id', 'modality': 'text', 'total_datums_in_project': 508, 'created_timestamp': '2023-02-24T16:13:50.313363+00:00', 'atlas_indices': [{'id': 'b1b01833-0964-4597-a4bc-a2d60700949d', 'project_id': 'ee2354a3-7f9a-4c6b-af43-b0cda09d7198', 'index_name': 'test_index_1677255228.136989_index', 'indexed_field': 'text', 'created_timestamp': '2023-02-24T16:13:52.957101+00:00', 'updated_timestamp': '2023-02-24T16:14:03.469621+00:00', 'atoms': ['charchunk', 'document'], 'colorable_fields': [], 'embedders': [{'id': '7ec0868a-4eed-4414-a482-25cce9803e1b', 'atlas_index_id': 'b1b01833-0964-4597-a4bc-a2d60700949d', 'ready': True, 'model_name': 'NomicEmbed', 'hyperparameters': {'norm': 'both', 'batch_size': 20, 'polymerize_by': 'charchunk', 'dataset_buffer_size': 1000}}], 'nearest_neighbor_indices': [{'id': '86f8e3ff-e07c-4678-a4d7-144db4b0301d', 'index_name': 'NomicOrganize', 'ready': True, 'hyperparameters': {'dim': 384, 'space': 'l2'}, 'atom_strategies': ['document']}], 'projections': [{'id': 'db996d77-8981-48a0-897a-ff2c22bbf541', 'projection_name': 'NomicProject', 'ready': True, 'hyperparameters': {'spread': 1.0, 'n_epochs': 50, 'n_neighbors': 15}, 'atom_strategies': ['document'], 'created_timestamp': '2023-02-24T16:13:52.979561+00:00', 'updated_timestamp': '2023-02-24T16:14:03.466309+00:00'}]}], 'insert_update_delete_lock': False}>" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "db.project" ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a map with the result of this code. This map displays the texts of the State of the Union.\n", + "https://atlas.nomic.ai/map/3e4de075-89ff-486a-845c-36c23f30bb67/d8ce2284-8edb-4050-8b9b-9bb543d7f647" + ] } ], "metadata": { From a9c86774daa784f71b8daf849ae950b8ff5a5a27 Mon Sep 17 00:00:00 2001 From: Joshua Sundance Bailey <84336755+joshuasundance-swca@users.noreply.github.com> Date: Wed, 23 Aug 2023 21:23:21 -0400 Subject: [PATCH 096/143] Anthropic: Allow the use of kwargs consistent with ChatOpenAI. (#9515) - Description: ~~Creates a new root_validator in `_AnthropicCommon` that allows the use of `model_name` and `max_tokens` keyword arguments.~~ Adds pydantic field aliases to support `model_name` and `max_tokens` as keyword arguments. Ultimately, this makes `ChatAnthropic` more consistent with `ChatOpenAI`, making the two classes more interchangeable for the developer. - Issue: https://github.com/langchain-ai/langchain/issues/9510 --------- Co-authored-by: Bagatur --- libs/langchain/langchain/chat_models/anthropic.py | 6 ++++++ libs/langchain/langchain/llms/anthropic.py | 11 +++++++++-- .../chat_models/test_anthropic_2.py | 12 ++++++++++++ .../tests/integration_tests/llms/test_anthropic.py | 14 +++++++++++++- .../tests/unit_tests/chat_models/test_openai.py | 12 +++++++++--- 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/libs/langchain/langchain/chat_models/anthropic.py b/libs/langchain/langchain/chat_models/anthropic.py index ef1da6319..4d00eae4d 100644 --- a/libs/langchain/langchain/chat_models/anthropic.py +++ b/libs/langchain/langchain/chat_models/anthropic.py @@ -36,6 +36,12 @@ class ChatAnthropic(BaseChatModel, _AnthropicCommon): model = ChatAnthropic(model="", anthropic_api_key="my-api-key") """ + class Config: + """Configuration for this pydantic object.""" + + allow_population_by_field_name = True + arbitrary_types_allowed = True + @property def lc_secrets(self) -> Dict[str, str]: return {"anthropic_api_key": "ANTHROPIC_API_KEY"} diff --git a/libs/langchain/langchain/llms/anthropic.py b/libs/langchain/langchain/llms/anthropic.py index afaea04b5..63664e07a 100644 --- a/libs/langchain/langchain/llms/anthropic.py +++ b/libs/langchain/langchain/llms/anthropic.py @@ -21,10 +21,10 @@ from langchain.utils.utils import build_extra_kwargs class _AnthropicCommon(BaseLanguageModel): client: Any = None #: :meta private: async_client: Any = None #: :meta private: - model: str = "claude-2" + model: str = Field(default="claude-2", alias="model_name") """Model name to use.""" - max_tokens_to_sample: int = 256 + max_tokens_to_sample: int = Field(default=256, alias="max_tokens") """Denotes the number of tokens to predict per generation.""" temperature: Optional[float] = None @@ -144,6 +144,7 @@ class Anthropic(LLM, _AnthropicCommon): import anthropic from langchain.llms import Anthropic + model = Anthropic(model="", anthropic_api_key="my-api-key") # Simplest invocation, automatically wrapped with HUMAN_PROMPT @@ -157,6 +158,12 @@ class Anthropic(LLM, _AnthropicCommon): response = model(prompt) """ + class Config: + """Configuration for this pydantic object.""" + + allow_population_by_field_name = True + arbitrary_types_allowed = True + @root_validator() def raise_warning(cls, values: Dict) -> Dict: """Raise warning that this class is deprecated.""" diff --git a/libs/langchain/tests/integration_tests/chat_models/test_anthropic_2.py b/libs/langchain/tests/integration_tests/chat_models/test_anthropic_2.py index 7447ec03e..54b604527 100644 --- a/libs/langchain/tests/integration_tests/chat_models/test_anthropic_2.py +++ b/libs/langchain/tests/integration_tests/chat_models/test_anthropic_2.py @@ -8,6 +8,18 @@ from langchain.chat_models import ChatAnthropic os.environ["ANTHROPIC_API_KEY"] = "foo" +@pytest.mark.requires("anthropic") +def test_anthropic_model_name_param() -> None: + llm = ChatAnthropic(model_name="foo") + assert llm.model == "foo" + + +@pytest.mark.requires("anthropic") +def test_anthropic_model_param() -> None: + llm = ChatAnthropic(model="foo") + assert llm.model == "foo" + + @pytest.mark.requires("anthropic") def test_anthropic_model_kwargs() -> None: llm = ChatAnthropic(model_kwargs={"foo": "bar"}) diff --git a/libs/langchain/tests/integration_tests/llms/test_anthropic.py b/libs/langchain/tests/integration_tests/llms/test_anthropic.py index 3604f6196..f68053b2a 100644 --- a/libs/langchain/tests/integration_tests/llms/test_anthropic.py +++ b/libs/langchain/tests/integration_tests/llms/test_anthropic.py @@ -9,6 +9,18 @@ from langchain.schema import LLMResult from tests.unit_tests.callbacks.fake_callback_handler import FakeCallbackHandler +@pytest.mark.requires("anthropic") +def test_anthropic_model_name_param() -> None: + llm = Anthropic(model_name="foo") + assert llm.model == "foo" + + +@pytest.mark.requires("anthropic") +def test_anthropic_model_param() -> None: + llm = Anthropic(model="foo") + assert llm.model == "foo" + + def test_anthropic_call() -> None: """Test valid call to anthropic.""" llm = Anthropic(model="claude-instant-1") @@ -24,7 +36,7 @@ def test_anthropic_streaming() -> None: assert isinstance(generator, Generator) for token in generator: - assert isinstance(token["completion"], str) + assert isinstance(token, str) def test_anthropic_streaming_callback() -> None: diff --git a/libs/langchain/tests/unit_tests/chat_models/test_openai.py b/libs/langchain/tests/unit_tests/chat_models/test_openai.py index b417d82e9..c23372472 100644 --- a/libs/langchain/tests/unit_tests/chat_models/test_openai.py +++ b/libs/langchain/tests/unit_tests/chat_models/test_openai.py @@ -6,9 +6,7 @@ from unittest.mock import MagicMock, patch import pytest from langchain.adapters.openai import convert_dict_to_message -from langchain.chat_models.openai import ( - ChatOpenAI, -) +from langchain.chat_models.openai import ChatOpenAI from langchain.schema.messages import ( AIMessage, FunctionMessage, @@ -17,6 +15,14 @@ from langchain.schema.messages import ( ) +@pytest.mark.requires("openai") +def test_openai_model_param() -> None: + llm = ChatOpenAI(model="foo") + assert llm.model_name == "foo" + llm = ChatOpenAI(model_name="foo") + assert llm.model_name == "foo" + + def test_function_message_dict_to_function_message() -> None: content = json.dumps({"result": "Example #1"}) name = "test_function" From c215481531a8f36b6c196b213db8d4ec2f0c5306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=20=E6=96=B9=E7=91=9E?= Date: Thu, 24 Aug 2023 09:26:29 +0800 Subject: [PATCH 097/143] Update default index type and metric type for MyScale vector store (#9353) We update the default index type from `IVFFLAT` to `MSTG`, a new vector type developed by MyScale. --- libs/langchain/langchain/vectorstores/myscale.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/langchain/langchain/vectorstores/myscale.py b/libs/langchain/langchain/vectorstores/myscale.py index 7bbb20dcf..ef4db34ea 100644 --- a/libs/langchain/langchain/vectorstores/myscale.py +++ b/libs/langchain/langchain/vectorstores/myscale.py @@ -46,7 +46,7 @@ class MyScaleSettings(BaseSettings): table (str) : Table name to operate on. Defaults to 'vector_table'. metric (str) : Metric to compute distance, - supported are ('l2', 'cosine', 'ip'). Defaults to 'cosine'. + supported are ('L2', 'Cosine', 'IP'). Defaults to 'Cosine'. column_map (Dict) : Column type map to project column name onto langchain semantics. Must have keys: `text`, `id`, `vector`, must be same size to number of columns. For example: @@ -69,7 +69,7 @@ class MyScaleSettings(BaseSettings): username: Optional[str] = None password: Optional[str] = None - index_type: str = "IVFFLAT" + index_type: str = "MSTG" index_param: Optional[Dict[str, str]] = None column_map: Dict[str, str] = { @@ -81,7 +81,7 @@ class MyScaleSettings(BaseSettings): database: str = "default" table: str = "langchain" - metric: str = "cosine" + metric: str = "Cosine" def __getitem__(self, item: str) -> Any: return getattr(self, item) From b88dfcb42a52eab78ccdcd38c1f1833c2acf3caf Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Wed, 23 Aug 2023 21:41:38 -0400 Subject: [PATCH 098/143] Add indexing support (#9614) This PR introduces a persistence layer to help with indexing workflows into vectostores. The indexing code helps users to: 1. Avoid writing duplicated content into the vectostore 2. Avoid over-writing content if it's unchanged Importantly, this keeps on working even if the content being written is derived via a set of transformations from some source content (e.g., indexing children documents that were derived from parent documents by chunking.) The two main components are: 1. Persistence layer that keeps track of which keys were updated and when. Keeping track of the timestamp of updates, allows to clean up old content safely, and with minimal complexity. 2. HashedDocument which is used to hash the contents (including metadata) of the documents. We rely on the hashes for identifying duplicates. The indexing code works with **ANY** document loader. To add transformations to the documents, users for now can add a custom document loader that composes an existing loader together with document transformers. --------- Co-authored-by: Bagatur --- .../modules/data_connection/indexing.ipynb | 916 ++++++++++++++++++ libs/langchain/langchain/indexes/__init__.py | 27 +- libs/langchain/langchain/indexes/_api.py | 346 +++++++ .../langchain/indexes/_sql_record_manager.py | 265 +++++ libs/langchain/langchain/indexes/base.py | 95 ++ .../tests/unit_tests/indexes/test_api.py | 13 + .../indexes/test_hashed_document.py | 50 + .../tests/unit_tests/indexes/test_indexing.py | 474 +++++++++ .../indexes/test_sql_record_manager.py | 276 ++++++ 9 files changed, 2460 insertions(+), 2 deletions(-) create mode 100644 docs/extras/modules/data_connection/indexing.ipynb create mode 100644 libs/langchain/langchain/indexes/_api.py create mode 100644 libs/langchain/langchain/indexes/_sql_record_manager.py create mode 100644 libs/langchain/langchain/indexes/base.py create mode 100644 libs/langchain/tests/unit_tests/indexes/test_api.py create mode 100644 libs/langchain/tests/unit_tests/indexes/test_hashed_document.py create mode 100644 libs/langchain/tests/unit_tests/indexes/test_indexing.py create mode 100644 libs/langchain/tests/unit_tests/indexes/test_sql_record_manager.py diff --git a/docs/extras/modules/data_connection/indexing.ipynb b/docs/extras/modules/data_connection/indexing.ipynb new file mode 100644 index 000000000..28914efaa --- /dev/null +++ b/docs/extras/modules/data_connection/indexing.ipynb @@ -0,0 +1,916 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0fe57ac5-31c5-4dbb-b96c-78dead32e1bd", + "metadata": {}, + "source": [ + "# Indexing\n", + "\n", + "Here, we will look at a basic indexing workflow using the LangChain indexing API. \n", + "\n", + "The indexing API lets you load and keep in sync documents from any source into a vector store. Specifically, it helps:\n", + "\n", + "* Avoid writing duplicated content into the vector store\n", + "* Avoid re-writing unchanged content\n", + "* Avoid re-computing embeddings over unchanged content\n", + "\n", + "All of which should save you time and money, as well as improve your vector search results.\n", + "\n", + "Crucially, the indexing API will work even with documents that have gone through several \n", + "transformation steps (e.g., via text chunking) with respect to the original source documents.\n", + "\n", + "## How it works\n", + "\n", + "LangChain indexing makes use of a record manager (`RecordManager`) that keeps track of document writes into the vector store.\n", + "\n", + "When indexing content, hashes are computed for each document, and the following information is stored in the record manager: \n", + "\n", + "- the document hash (hash of both page content and metadata)\n", + "- write time\n", + "- the source id -- each document should include information in its metadata to allow us to determine the ultimate source of this document\n", + "\n", + "## Deletion modes\n", + "\n", + "When indexing documents into a vector store, it's possible that some existing documents in the vector store should be deleted. In certain situations you may want to remove any existing documents that are derived from the same sources as the new documents being indexed. In others you may want to delete all existing documents wholesale. The indexing API deletion modes let you pick the behavior you want:\n", + "\n", + "| Delete Mode | De-Duplicates Content | Parallelizable | Cleans Up Deleted Source Docs | Cleans Up Mutations of Source Docs and/or Derived Docs | Clean Up Timing |\n", + "|-------------|-----------------------|---------------|----------------------------------|----------------------------------------------------|---------------------|\n", + "| None | ✅ | ✅ | ❌ | ❌ | - |\n", + "| Incremental | ✅ | ✅ | ❌ | ✅ | Continuously |\n", + "| Full | ✅ | ❌ | ✅ | ✅ | At end of indexing |\n", + "\n", + "\n", + "`None` does not do any automatic clean up, allowing the user to manually do clean up of old content. \n", + "\n", + "`incremental` and `full` offer the following automated clean up:\n", + "\n", + "* If the content of source document or derived documents has **changed**, both `incremental` or `full` modes will clean up (delete) previous versions of the content.\n", + "* If the source document has been **deleted** (meaning it is not included in the documents currently being indexed), the `full` delete mode will delete it from the vector store correctly, but the `incremental` mode will not.\n", + "\n", + "When content is mutated (e.g., the source PDF file was revised) there will be a period of time during indexing when both the new and old versions may be returned to the user. This happens after the new content was written, but before the old version was deleted.\n", + "\n", + "* `incremental` indexing minimizes this period of time as it is able to do clean up continuously, as it writes.\n", + "* `full` mode does the clean up after all batches have been written.\n", + "\n", + "## Requirements\n", + "\n", + "1. Do not use with a store that has been pre-populated with content independently of the indexing API, as the record manager will not know that records have been inserted previously.\n", + "2. Only works with LangChain ``VectorStore``'s that support:\n", + " * document addition by id (`add_documents` method with `ids` argument)\n", + " * delete by id (`delete` method with)\n", + " \n", + "## Caution\n", + "\n", + "The record manager relies on a time-based mechanism to determine what content can be cleaned up (when using `full` or `incremental` delete modes).\n", + "\n", + "If two tasks run back to back, and the first task finishes before the the clock time changes, then the second task may not be able to clean up content.\n", + "\n", + "This is unlikely to be an issue in actual settings for the following reasons:\n", + "\n", + "1. The RecordManager uses higher resolutino timestamps.\n", + "2. The data would need to change between the first and the second tasks runs, which becomes unlikely if the time interval between the tasks is small.\n", + "3. Indexing tasks typically take more than a few ms." + ] + }, + { + "cell_type": "markdown", + "id": "ec2109b4-cbcc-44eb-9dac-3f7345f971dc", + "metadata": {}, + "source": [ + "## Quickstart" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "15f7263e-c82e-4914-874f-9699ea4de93e", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.embeddings import OpenAIEmbeddings\n", + "from langchain.indexes import SQLRecordManager, index\n", + "from langchain.schema import Document\n", + "from langchain.vectorstores import ElasticsearchStore" + ] + }, + { + "cell_type": "markdown", + "id": "f81201ab-d997-433c-9f18-ceea70e61cbd", + "metadata": {}, + "source": [ + "Initialize a vector store and set up the embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4ffc9659-91c0-41e0-ae4b-f7ff0d97292d", + "metadata": {}, + "outputs": [], + "source": [ + "collection_name = \"test_index\"\n", + "\n", + "embedding = OpenAIEmbeddings()\n", + "\n", + "vectorstore = ElasticsearchStore(\n", + " es_url=\"http://localhost:9200\", index_name=\"test_index\", embedding=embedding\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "b9b7564f-2334-428b-b513-13045a08b56c", + "metadata": {}, + "source": [ + "Initialize a record manager with an appropriate namespace.\n", + "\n", + "**Suggestion** Use a namespace that takes into account both the vectostore and the collection name in the vectorstore; e.g., 'redis/my_docs', 'chromadb/my_docs' or 'postgres/my_docs'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "498cc80e-c339-49ee-893b-b18d06346ef8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "namespace = f\"elasticsearch/{collection_name}\"\n", + "record_manager = SQLRecordManager(\n", + " namespace, db_url=\"sqlite:///record_manager_cache.sql\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "835c2c19-68ec-4086-9066-f7ba40877fd5", + "metadata": {}, + "source": [ + "Create a schema before using the record manager" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a4be2da3-3a5c-468a-a824-560157290f7f", + "metadata": {}, + "outputs": [], + "source": [ + "record_manager.create_schema()" + ] + }, + { + "cell_type": "markdown", + "id": "7f07c6bd-6ada-4b17-a8c5-fe5e4a5278fd", + "metadata": {}, + "source": [ + "Let's index some test documents" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "bbfdf314-14f9-4799-8fb6-d42de4d51287", + "metadata": {}, + "outputs": [], + "source": [ + "doc1 = Document(page_content=\"kitty\", metadata={\"source\": \"kitty.txt\"})\n", + "doc2 = Document(page_content=\"doggy\", metadata={\"source\": \"doggy.txt\"})" + ] + }, + { + "cell_type": "markdown", + "id": "c7d572be-a913-4511-ab64-2864a252458a", + "metadata": {}, + "source": [ + "Indexing into an empty vectorstore" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "67d2a5c8-f2bd-489a-b58e-2c7ba7fefe6f", + "metadata": {}, + "outputs": [], + "source": [ + "def _clear():\n", + " \"\"\"Hacky helper method to clear content. See the `full` mode section to to understand why it works.\"\"\"\n", + " index([], record_manager, vectorstore, delete_mode=\"full\", source_id_key=\"source\")" + ] + }, + { + "cell_type": "markdown", + "id": "e5e92e76-f23f-4a61-8a2d-f16baf288700", + "metadata": {}, + "source": [ + "### ``None`` deletion mode\n", + "\n", + "This mode does not do automatic clean up of old versions of content; however, it still takes care of content de-duplication." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e2288cee-1738-4054-af72-23b5c5be8840", + "metadata": {}, + "outputs": [], + "source": [ + "_clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b253483b-5be0-4151-b732-ca93db4457b1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 1, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 0}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " [doc1, doc1, doc1, doc1, doc1],\n", + " record_manager,\n", + " vectorstore,\n", + " delete_mode=None,\n", + " source_id_key=\"source\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7abaf351-bf5a-4d9e-95cd-4e3ecbfc1a84", + "metadata": {}, + "outputs": [], + "source": [ + "_clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "55b6873c-5907-4fa6-84ca-df6cdf1810f0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 2, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 0}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " [doc1, doc2], record_manager, vectorstore, delete_mode=None, source_id_key=\"source\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7be3e55a-5fe9-4f40-beff-577c2aa5e76a", + "metadata": {}, + "source": [ + "Second time around all content will be skipped" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "59d74ca1-2e3d-4b4c-ad88-a4907aa20081", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 0, 'num_updated': 0, 'num_skipped': 2, 'num_deleted': 0}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " [doc1, doc2], record_manager, vectorstore, delete_mode=None, source_id_key=\"source\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "237a809e-575d-4f02-870e-5906a3643f30", + "metadata": {}, + "source": [ + "### ``\"incremental\"`` deletion mode" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6bc91073-0ab4-465a-9302-e7f4bbd2285c", + "metadata": {}, + "outputs": [], + "source": [ + "_clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4a551091-6d46-4cdd-9af9-8672e5866a0a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 2, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 0}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " [doc1, doc2],\n", + " record_manager,\n", + " vectorstore,\n", + " delete_mode=\"incremental\",\n", + " source_id_key=\"source\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d0604ab8-318c-4706-959b-3907af438630", + "metadata": {}, + "source": [ + "Indexing again should result in both documents getting **skipped** -- also skipping the embedding operation!" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "81785863-391b-4578-a6f6-63b3e5285488", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 0, 'num_updated': 0, 'num_skipped': 2, 'num_deleted': 0}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " [doc1, doc2],\n", + " record_manager,\n", + " vectorstore,\n", + " delete_mode=\"incremental\",\n", + " source_id_key=\"source\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "b205c1ba-f069-4a4e-af93-dc98afd5c9e6", + "metadata": {}, + "source": [ + "If we provide no documents with incremental indexing mode, nothing will change" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "1f73ca85-7478-48ab-976c-17b00beec7bd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 0, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 0}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " [], record_manager, vectorstore, delete_mode=\"incremental\", source_id_key=\"source\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "b8c4ac96-8d60-4ade-8a94-e76ccb536442", + "metadata": {}, + "source": [ + "If we mutate a document, the new version will be written and all old versions sharing the same source will be deleted." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "27d05bcb-d96d-42eb-88a8-54b33d6cfcdc", + "metadata": {}, + "outputs": [], + "source": [ + "changed_doc_2 = Document(page_content=\"puppy\", metadata={\"source\": \"doggy.txt\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3809e379-5962-4267-add9-b10f43e24c66", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 1, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 1}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " [changed_doc_2],\n", + " record_manager,\n", + " vectorstore,\n", + " delete_mode=\"incremental\",\n", + " source_id_key=\"source\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "8bc75b9c-784a-4eb6-b5d6-688e3fbd4658", + "metadata": {}, + "source": [ + "### ``\"full\"`` deletion mode\n", + "\n", + "In `full` mode the user should pass the `full` universe of content that should be indexed into the indexing function.\n", + "\n", + "Any documents that are not passed into the indexing functino and are present in the vectorstore will be deleted!\n", + "\n", + "This behavior is useful to handle deletions of source documents." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "38a14a3d-11c7-43e2-b7f1-08e487961bb5", + "metadata": {}, + "outputs": [], + "source": [ + "_clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "46b5d7b6-ce91-47d2-a9d0-f390e77d847f", + "metadata": {}, + "outputs": [], + "source": [ + "all_docs = [doc1, doc2]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "06954765-6155-40a0-b95e-33ef87754c8d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 2, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 0}" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(all_docs, record_manager, vectorstore, delete_mode=\"full\", source_id_key=\"source\")" + ] + }, + { + "cell_type": "markdown", + "id": "887c45c6-4363-4389-ac56-9cdad682b4c8", + "metadata": {}, + "source": [ + "Say someone deleted the first doc" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "35270e4e-9b03-4486-95de-e819ca5e469f", + "metadata": {}, + "outputs": [], + "source": [ + "del all_docs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "7d835a6a-f468-4d79-9a3d-47db187edbb8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='doggy', metadata={'source': 'doggy.txt'})]" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_docs" + ] + }, + { + "cell_type": "markdown", + "id": "d940bcb4-cf6d-4c21-a565-e7f53f6dacf1", + "metadata": {}, + "source": [ + "Using full mode will clean up the deleted content as well" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1b660eae-3bed-434d-a6f5-2aec96e5f0d6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 0, 'num_updated': 0, 'num_skipped': 1, 'num_deleted': 1}" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(all_docs, record_manager, vectorstore, delete_mode=\"full\", source_id_key=\"source\")" + ] + }, + { + "cell_type": "markdown", + "id": "1a7ecdc9-df3c-4601-b2f3-50fdffc6e5f9", + "metadata": {}, + "source": [ + "## Source " + ] + }, + { + "cell_type": "markdown", + "id": "4002a4ac-02dd-4599-9b23-9b59f54237c8", + "metadata": {}, + "source": [ + "The metadata attribute contains a filed called `source`. This source should be pointing at the *ultimate* provenance associated with the given document.\n", + "\n", + "For example, if these documents are representing chunks of some parent document, the `source` for both documents should be the same and reference the parent document.\n", + "\n", + "In general, `source` should always be specified. Only use a `None`, if you **never** intend to use `incremental` mode, and for some reason can't specify the `source` field correctly." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "184d3051-7fd1-4db2-a1d5-218ac0e1e641", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.text_splitter import CharacterTextSplitter" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "11318248-ad2a-4ef0-bd9b-9d4dab97caba", + "metadata": {}, + "outputs": [], + "source": [ + "doc1 = Document(\n", + " page_content=\"kitty kitty kitty kitty kitty\", metadata={\"source\": \"kitty.txt\"}\n", + ")\n", + "doc2 = Document(page_content=\"doggy doggy the doggy\", metadata={\"source\": \"doggy.txt\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "2cbf0902-d17b-44c9-8983-e8d0e831f909", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='kitty kit', metadata={'source': 'kitty.txt'}),\n", + " Document(page_content='tty kitty ki', metadata={'source': 'kitty.txt'}),\n", + " Document(page_content='tty kitty', metadata={'source': 'kitty.txt'}),\n", + " Document(page_content='doggy doggy', metadata={'source': 'doggy.txt'}),\n", + " Document(page_content='the doggy', metadata={'source': 'doggy.txt'})]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_docs = CharacterTextSplitter(\n", + " separator=\"t\", keep_separator=True, chunk_size=12, chunk_overlap=2\n", + ").split_documents([doc1, doc2])\n", + "new_docs" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "0f9d9bc2-ea85-48ab-b4a2-351c8708b1d4", + "metadata": {}, + "outputs": [], + "source": [ + "_clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "58781d81-f273-4aeb-8df6-540236826d00", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 5, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 0}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " new_docs,\n", + " record_manager,\n", + " vectorstore,\n", + " delete_mode=\"incremental\",\n", + " source_id_key=\"source\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "11b81cb6-5f04-499b-b125-1abb22d353bf", + "metadata": {}, + "outputs": [], + "source": [ + "changed_doggy_docs = [\n", + " Document(page_content=\"woof woof\", metadata={\"source\": \"doggy.txt\"}),\n", + " Document(page_content=\"woof woof woof\", metadata={\"source\": \"doggy.txt\"}),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "ab1c0915-3f9e-42ac-bdb5-3017935c6e7f", + "metadata": {}, + "source": [ + "This should delete the old versions of documents associated with `doggy.txt` source and replace them with the new versions" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "fec71cb5-6757-4b92-a306-62509f6e867d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 0, 'num_updated': 0, 'num_skipped': 2, 'num_deleted': 2}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(\n", + " changed_doggy_docs,\n", + " record_manager,\n", + " vectorstore,\n", + " delete_mode=\"incremental\",\n", + " source_id_key=\"source\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "876f5ab6-4b25-423e-8cff-f5a7a014395b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='tty kitty', metadata={'source': 'kitty.txt'}),\n", + " Document(page_content='tty kitty ki', metadata={'source': 'kitty.txt'}),\n", + " Document(page_content='kitty kit', metadata={'source': 'kitty.txt'})]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vectorstore.similarity_search(\"dog\", k=30)" + ] + }, + { + "cell_type": "markdown", + "id": "c0af4d24-d735-4e5d-ad9b-a2e8b281f9f1", + "metadata": {}, + "source": [ + "## Using with Loaders\n", + "\n", + "Indexing can accept either an iterable of documents or else any loader.\n", + "\n", + "**Attention** The loader **MUST** set source keys correctly." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "08b68357-27c0-4f07-a51d-61c986aeb359", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders.base import BaseLoader\n", + "\n", + "\n", + "class MyCustomLoader(BaseLoader):\n", + " def lazy_load(self):\n", + " text_splitter = CharacterTextSplitter(\n", + " separator=\"t\", keep_separator=True, chunk_size=12, chunk_overlap=2\n", + " )\n", + " docs = [\n", + " Document(page_content=\"woof woof\", metadata={\"source\": \"doggy.txt\"}),\n", + " Document(page_content=\"woof woof woof\", metadata={\"source\": \"doggy.txt\"}),\n", + " ]\n", + " yield from text_splitter.split_documents(docs)\n", + "\n", + " def load(self):\n", + " return list(self.lazy_load())" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "5dae8e11-c0d6-4fc6-aa0e-68f8d92b5087", + "metadata": {}, + "outputs": [], + "source": [ + "_clear()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "d8d72f76-6d6e-4a7c-8fea-9bdec05af05b", + "metadata": {}, + "outputs": [], + "source": [ + "loader = MyCustomLoader()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "945c45cc-5a8d-4bd7-9f36-4ebd4a50e08b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='woof woof', metadata={'source': 'doggy.txt'}),\n", + " Document(page_content='woof woof woof', metadata={'source': 'doggy.txt'})]" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loader.load()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "dcb1ba71-db49-4140-ab4a-c5d64fc2578a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num_added': 2, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 0}" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index(loader, record_manager, vectorstore, delete_mode=\"full\", source_id_key=\"source\")" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "441159c1-dd84-48d7-8599-37a65c9fb589", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='woof woof', metadata={'source': 'doggy.txt'}),\n", + " Document(page_content='woof woof woof', metadata={'source': 'doggy.txt'})]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vectorstore.similarity_search(\"dog\", k=30)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/langchain/langchain/indexes/__init__.py b/libs/langchain/langchain/indexes/__init__.py index d0c878915..792cf30c8 100644 --- a/libs/langchain/langchain/indexes/__init__.py +++ b/libs/langchain/langchain/indexes/__init__.py @@ -1,5 +1,28 @@ -"""**Index** utilities.""" +"""Code to support various indexing workflows. + +Provides code to: + +* Create knowledge graphs from data. + +* Support indexing workflows from LangChain data loaders to vectorstores. + +For indexing workflows, this code is used to avoid writing duplicated content +into the vectostore and to avoid over-writing content if it's unchanged. + +Importantly, this keeps on working even if the content being written is derived +via a set of transformations from some source content (e.g., indexing children +documents that were derived from parent documents by chunking.) +""" +from langchain.indexes._api import IndexingResult, index +from langchain.indexes._sql_record_manager import SQLRecordManager from langchain.indexes.graph import GraphIndexCreator from langchain.indexes.vectorstore import VectorstoreIndexCreator -__all__ = ["GraphIndexCreator", "VectorstoreIndexCreator"] +__all__ = [ + # Keep sorted + "GraphIndexCreator", + "index", + "IndexingResult", + "SQLRecordManager", + "VectorstoreIndexCreator", +] diff --git a/libs/langchain/langchain/indexes/_api.py b/libs/langchain/langchain/indexes/_api.py new file mode 100644 index 000000000..47b9d33ea --- /dev/null +++ b/libs/langchain/langchain/indexes/_api.py @@ -0,0 +1,346 @@ +"""Module contains logic for indexing documents into vector stores.""" +from __future__ import annotations + +import hashlib +import json +import uuid +from itertools import islice +from typing import ( + Any, + Callable, + Dict, + Iterable, + Iterator, + List, + Literal, + Optional, + Sequence, + TypedDict, + TypeVar, + Union, + cast, +) + +from langchain.document_loaders.base import BaseLoader +from langchain.indexes.base import NAMESPACE_UUID, RecordManager +from langchain.pydantic_v1 import root_validator +from langchain.schema import Document +from langchain.vectorstores.base import VectorStore + +T = TypeVar("T") + + +def _hash_string_to_uuid(input_string: str) -> uuid.UUID: + """Hashes a string and returns the corresponding UUID.""" + hash_value = hashlib.sha1(input_string.encode("utf-8")).hexdigest() + return uuid.uuid5(NAMESPACE_UUID, hash_value) + + +def _hash_nested_dict_to_uuid(data: dict) -> uuid.UUID: + """Hashes a nested dictionary and returns the corresponding UUID.""" + serialized_data = json.dumps(data, sort_keys=True) + hash_value = hashlib.sha1(serialized_data.encode("utf-8")).hexdigest() + return uuid.uuid5(NAMESPACE_UUID, hash_value) + + +class _HashedDocument(Document): + """A hashed document with a unique ID.""" + + uid: str + hash_: str + """The hash of the document including content and metadata.""" + content_hash: str + """The hash of the document content.""" + metadata_hash: str + """The hash of the document metadata.""" + + @root_validator(pre=True) + def calculate_hashes(cls, values: Dict[str, Any]) -> Dict[str, Any]: + """Root validator to calculate content and metadata hash.""" + content = values.get("page_content", "") + metadata = values.get("metadata", {}) + + forbidden_keys = ("hash_", "content_hash", "metadata_hash") + + for key in forbidden_keys: + if key in metadata: + raise ValueError( + f"Metadata cannot contain key {key} as it " + f"is reserved for internal use." + ) + + content_hash = str(_hash_string_to_uuid(content)) + + try: + metadata_hash = str(_hash_nested_dict_to_uuid(metadata)) + except Exception as e: + raise ValueError( + f"Failed to hash metadata: {e}. " + f"Please use a dict that can be serialized using json." + ) + + values["content_hash"] = content_hash + values["metadata_hash"] = metadata_hash + values["hash_"] = str(_hash_string_to_uuid(content_hash + metadata_hash)) + + _uid = values.get("uid", None) + + if _uid is None: + values["uid"] = values["hash_"] + return values + + def to_document(self) -> Document: + """Return a Document object.""" + return Document( + page_content=self.page_content, + metadata=self.metadata, + ) + + @classmethod + def from_document( + cls, document: Document, *, uid: Optional[str] = None + ) -> _HashedDocument: + """Create a HashedDocument from a Document.""" + return cls( + uid=uid, + page_content=document.page_content, + metadata=document.metadata, + ) + + +def _batch(size: int, iterable: Iterable[T]) -> Iterator[List[T]]: + """Utility batching function.""" + it = iter(iterable) + while True: + chunk = list(islice(it, size)) + if not chunk: + return + yield chunk + + +def _get_source_id_assigner( + source_id_key: Union[str, Callable[[Document], str], None], +) -> Callable[[Document], Union[str, None]]: + """Get the source id from the document.""" + if source_id_key is None: + return lambda doc: None + elif isinstance(source_id_key, str): + return lambda doc: doc.metadata[source_id_key] + elif callable(source_id_key): + return source_id_key + else: + raise ValueError( + f"source_id_key should be either None, a string or a callable. " + f"Got {source_id_key} of type {type(source_id_key)}." + ) + + +def _deduplicate_in_order( + hashed_documents: Iterable[_HashedDocument], +) -> Iterator[_HashedDocument]: + """Deduplicate a list of hashed documents while preserving order.""" + seen = set() + + for hashed_doc in hashed_documents: + if hashed_doc.hash_ not in seen: + seen.add(hashed_doc.hash_) + yield hashed_doc + + +# PUBLIC API + + +class IndexingResult(TypedDict): + """Return a detailed a breakdown of the result of the indexing operation.""" + + num_added: int + """Number of added documents.""" + num_updated: int + """Number of updated documents because they were not up to date.""" + num_deleted: int + """Number of deleted documents.""" + num_skipped: int + """Number of skipped documents because they were already up to date.""" + + +def index( + docs_source: Union[BaseLoader, Iterable[Document]], + record_manager: RecordManager, + vector_store: VectorStore, + *, + batch_size: int = 100, + delete_mode: Literal["incremental", "full", None] = None, + source_id_key: Union[str, Callable[[Document], str], None] = None, +) -> IndexingResult: + """Index data from the loader into the vector store. + + Indexing functionality uses a manager to keep track of which documents + are in the vector store. + + This allows us to keep track of which documents were updated, and which + documents were deleted, which documents should be skipped. + + For the time being, documents are indexed using their hashes, and users + are not able to specify the uid of the document. + + IMPORTANT: + if auto_cleanup is set to True, the loader should be returning + the entire dataset, and not just a subset of the dataset. + Otherwise, the auto_cleanup will remove documents that it is not + supposed to. + + Args: + docs_source: Data loader or iterable of documents to index. + record_manager: Timestamped set to keep track of which documents were + updated. + vector_store: Vector store to index the documents into. + batch_size: Batch size to use when indexing. + delete_mode: How to handle clean up of documents. + - Incremental: Cleans up all documents that haven't been updated AND + that are associated with source ids that were seen + during indexing. + Clean up is done continuously during indexing helping + to minimize the probability of users seeing duplicated + content. + - Full: Delete all documents that haven to been returned by the loader. + Clean up runs after all documents have been indexed. + This means that users may see duplicated content during indexing. + - None: Do not delete any documents. + source_id_key: Optional key that helps identify the original source + of the document. + + Returns: + Indexing result which contains information about how many documents + were added, updated, deleted, or skipped. + """ + if delete_mode not in {"incremental", "full", None}: + raise ValueError( + f"delete_mode should be one of 'incremental', 'full' or None. " + f"Got {delete_mode}." + ) + + if delete_mode == "incremental" and source_id_key is None: + raise ValueError("Source id key is required when delete mode is incremental.") + + # Check that the Vectorstore has required methods implemented + methods = ["delete", "add_documents"] + + for method in methods: + if not hasattr(vector_store, method): + raise ValueError( + f"Vectorstore {vector_store} does not have required method {method}" + ) + + if type(vector_store).delete == VectorStore.delete: + # Checking if the vectorstore has overridden the default delete method + # implementation which just raises a NotImplementedError + raise ValueError("Vectorstore has not implemented the delete method") + + if isinstance(docs_source, BaseLoader): + try: + doc_iterator = docs_source.lazy_load() + except NotImplementedError: + doc_iterator = iter(docs_source.load()) + else: + doc_iterator = iter(docs_source) + + source_id_assigner = _get_source_id_assigner(source_id_key) + + # Mark when the update started. + index_start_dt = record_manager.get_time() + num_added = 0 + num_skipped = 0 + num_updated = 0 + num_deleted = 0 + + for doc_batch in _batch(batch_size, doc_iterator): + hashed_docs = list( + _deduplicate_in_order( + [_HashedDocument.from_document(doc) for doc in doc_batch] + ) + ) + + source_ids: Sequence[Optional[str]] = [ + source_id_assigner(doc) for doc in hashed_docs + ] + + if delete_mode == "incremental": + # If the delete mode is incremental, source ids are required. + for source_id, hashed_doc in zip(source_ids, hashed_docs): + if source_id is None: + raise ValueError( + "Source ids are required when delete mode is incremental. " + f"Document that starts with " + f"content: {hashed_doc.page_content[:100]} was not assigned " + f"as source id." + ) + # source ids cannot be None after for loop above. + source_ids = cast(Sequence[str], source_ids) # type: ignore[assignment] + + exists_batch = record_manager.exists([doc.uid for doc in hashed_docs]) + + # Filter out documents that already exist in the record store. + uids = [] + docs_to_index = [] + for doc, hashed_doc, doc_exists in zip(doc_batch, hashed_docs, exists_batch): + if doc_exists: + # Must be updated to refresh timestamp. + record_manager.update([hashed_doc.uid], time_at_least=index_start_dt) + num_skipped += 1 + continue + uids.append(hashed_doc.uid) + docs_to_index.append(doc) + + # Be pessimistic and assume that all vector store write will fail. + # First write to vector store + if docs_to_index: + vector_store.add_documents(docs_to_index, ids=uids) + num_added += len(docs_to_index) + + # And only then update the record store. + # Update ALL records, even if they already exist since we want to refresh + # their timestamp. + record_manager.update( + [doc.uid for doc in hashed_docs], + group_ids=source_ids, + time_at_least=index_start_dt, + ) + + # If source IDs are provided, we can do the deletion incrementally! + if delete_mode == "incremental": + # Get the uids of the documents that were not returned by the loader. + + # mypy isn't good enough to determine that source ids cannot be None + # here due to a check that's happening above, so we check again. + for source_id in source_ids: + if source_id is None: + raise AssertionError("Source ids cannot be None here.") + + _source_ids = cast(Sequence[str], source_ids) + + uids_to_delete = record_manager.list_keys( + group_ids=_source_ids, before=index_start_dt + ) + if uids_to_delete: + # Then delete from vector store. + vector_store.delete(uids_to_delete) + # First delete from record store. + record_manager.delete_keys(uids_to_delete) + num_deleted += len(uids_to_delete) + + if delete_mode == "full": + uids_to_delete = record_manager.list_keys(before=index_start_dt) + + if uids_to_delete: + # Then delete from vector store. + vector_store.delete(uids_to_delete) + # First delete from record store. + record_manager.delete_keys(uids_to_delete) + num_deleted = len(uids_to_delete) + + return { + "num_added": num_added, + "num_updated": num_updated, + "num_skipped": num_skipped, + "num_deleted": num_deleted, + } diff --git a/libs/langchain/langchain/indexes/_sql_record_manager.py b/libs/langchain/langchain/indexes/_sql_record_manager.py new file mode 100644 index 000000000..9cad02ef9 --- /dev/null +++ b/libs/langchain/langchain/indexes/_sql_record_manager.py @@ -0,0 +1,265 @@ +"""Implementation of a record management layer in SQLAlchemy. + +The management layer uses SQLAlchemy to track upserted records. + +Currently, this layer only works with SQLite; hopwever, should be adaptable +to other SQL implementations with minimal effort. + +Currently, includes an implementation that uses SQLAlchemy which should +allow it to work with a variety of SQL as a backend. + +* Each key is associated with an updated_at field. +* This filed is updated whenever the key is updated. +* Keys can be listed based on the updated at field. +* Keys can be deleted. +""" +import contextlib +import uuid +from typing import Any, Dict, Generator, List, Optional, Sequence + +from sqlalchemy import ( + Column, + Engine, + Float, + Index, + String, + UniqueConstraint, + and_, + create_engine, + text, +) +from sqlalchemy.dialects.sqlite import insert +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import Session, sessionmaker + +from langchain.indexes.base import RecordManager + +Base = declarative_base() + + +class UpsertionRecord(Base): # type: ignore[valid-type,misc] + """Table used to keep track of when a key was last updated.""" + + # ATTENTION: + # Prior to modifying this table, please determine whether + # we should create migrations for this table to make sure + # users do not experience data loss. + __tablename__ = "upsertion_record" + + uuid = Column( + String, + index=True, + default=lambda: str(uuid.uuid4()), + primary_key=True, + nullable=False, + ) + key = Column(String, index=True) + # Using a non-normalized representation to handle `namespace` attribute. + # If the need arises, this attribute can be pulled into a separate Collection + # table at some time later. + namespace = Column(String, index=True, nullable=False) + group_id = Column(String, index=True, nullable=True) + + # The timestamp associated with the last record upsertion. + updated_at = Column(Float, index=True) + + __table_args__ = ( + UniqueConstraint("key", "namespace", name="uix_key_namespace"), + Index("ix_key_namespace", "key", "namespace"), + ) + + +class SQLRecordManager(RecordManager): + """A SQL Alchemy based implementation of the record manager.""" + + def __init__( + self, + namespace: str, + *, + engine: Optional[Engine] = None, + db_url: Optional[str] = None, + engine_kwargs: Optional[Dict[str, Any]] = None, + ) -> None: + """Initialize the SQLRecordManager. + + This class serves as a manager persistence layer that uses an SQL + backend to track upserted records. You should specify either a db_url + to create an engine or provide an existing engine. + + Args: + namespace: The namespace associated with this record manager. + engine: An already existing SQL Alchemy engine. + Default is None. + db_url: A database connection string used to create + an SQL Alchemy engine. Default is None. + engine_kwargs: Additional keyword arguments + to be passed when creating the engine. Default is an empty dictionary. + + Raises: + ValueError: If both db_url and engine are provided or neither. + AssertionError: If something unexpected happens during engine configuration. + """ + super().__init__(namespace=namespace) + if db_url is None and engine is None: + raise ValueError("Must specify either db_url or engine") + if db_url is not None and engine is not None: + raise ValueError("Must specify either db_url or engine, not both") + + if db_url: + _kwargs = engine_kwargs or {} + _engine = create_engine(db_url, **_kwargs) + elif engine: + _engine = engine + else: + raise AssertionError("Something went wrong with configuration of engine.") + + self.engine = _engine + self.session_factory = sessionmaker(bind=self.engine) + + def create_schema(self) -> None: + """Create the database schema.""" + Base.metadata.create_all(self.engine) + + @contextlib.contextmanager + def _make_session(self) -> Generator[Session, None, None]: + """Create a session and close it after use.""" + session = self.session_factory() + try: + yield session + finally: + session.close() + + def get_time(self) -> float: + """Get the current server time as a timestamp. + + Please note it's critical that time is obtained from the server since + we want a monotonic clock. + """ + with self._make_session() as session: + # * SQLite specific implementation, can be changed based on dialect. + # * For SQLite, unlike unixepoch it will work with older versions of SQLite. + # ---- + # julianday('now'): Julian day number for the current date and time. + # The Julian day is a continuous count of days, starting from a + # reference date (Julian day number 0). + # 2440587.5 - constant represents the Julian day number for January 1, 1970 + # 86400.0 - constant represents the number of seconds + # in a day (24 hours * 60 minutes * 60 seconds) + query = text("SELECT (julianday('now') - 2440587.5) * 86400.0;") + dt = session.execute(query).scalar() + if not isinstance(dt, float): + raise AssertionError(f"Unexpected type for datetime: {type(dt)}") + return dt + + def update( + self, + keys: Sequence[str], + *, + group_ids: Optional[Sequence[Optional[str]]] = None, + time_at_least: Optional[float] = None, + ) -> None: + """Upsert records into the SQLite database.""" + if group_ids is None: + group_ids = [None] * len(keys) + + if len(keys) != len(group_ids): + raise ValueError( + f"Number of keys ({len(keys)}) does not match number of " + f"group_ids ({len(group_ids)})" + ) + + # Get the current time from the server. + # This makes an extra round trip to the server, should not be a big deal + # if the batch size is large enough. + # Getting the time here helps us compare it against the time_at_least + # and raise an error if there is a time sync issue. + # Here, we're just being extra careful to minimize the chance of + # data loss due to incorrectly deleting records. + update_time = self.get_time() + + if time_at_least and update_time < time_at_least: + # Safeguard against time sync issues + raise AssertionError(f"Time sync issue: {update_time} < {time_at_least}") + + records_to_upsert = [ + { + "key": key, + "namespace": self.namespace, + "updated_at": update_time, + "group_id": group_id, + } + for key, group_id in zip(keys, group_ids) + ] + + with self._make_session() as session: + # Note: uses SQLite insert to make on_conflict_do_update work. + # This code needs to be generalized a bit to work with more dialects. + insert_stmt = insert(UpsertionRecord).values(records_to_upsert) + stmt = insert_stmt.on_conflict_do_update( # type: ignore[attr-defined] + [UpsertionRecord.key, UpsertionRecord.namespace], + set_=dict( + # attr-defined type ignore + updated_at=insert_stmt.excluded.updated_at, # type: ignore + group_id=insert_stmt.excluded.group_id, # type: ignore + ), + ) + session.execute(stmt) + session.commit() + + def exists(self, keys: Sequence[str]) -> List[bool]: + """Check if the given keys exist in the SQLite database.""" + with self._make_session() as session: + records = ( + # mypy does not recognize .all() + session.query(UpsertionRecord.key) # type: ignore[attr-defined] + .filter( + and_( + UpsertionRecord.key.in_(keys), + UpsertionRecord.namespace == self.namespace, + ) + ) + .all() + ) + found_keys = set(r.key for r in records) + return [k in found_keys for k in keys] + + def list_keys( + self, + *, + before: Optional[float] = None, + after: Optional[float] = None, + group_ids: Optional[Sequence[str]] = None, + ) -> List[str]: + """List records in the SQLite database based on the provided date range.""" + with self._make_session() as session: + query = session.query(UpsertionRecord).filter( + UpsertionRecord.namespace == self.namespace + ) + + # mypy does not recognize .all() or .filter() + if after: + query = query.filter( # type: ignore[attr-defined] + UpsertionRecord.updated_at > after + ) + if before: + query = query.filter( # type: ignore[attr-defined] + UpsertionRecord.updated_at < before + ) + if group_ids: + query = query.filter( # type: ignore[attr-defined] + UpsertionRecord.group_id.in_(group_ids) + ) + records = query.all() # type: ignore[attr-defined] + return [r.key for r in records] + + def delete_keys(self, keys: Sequence[str]) -> None: + """Delete records from the SQLite database.""" + with self._make_session() as session: + # mypy does not recognize .delete() + session.query(UpsertionRecord).filter( + and_( + UpsertionRecord.key.in_(keys), + UpsertionRecord.namespace == self.namespace, + ) + ).delete() # type: ignore[attr-defined] + session.commit() diff --git a/libs/langchain/langchain/indexes/base.py b/libs/langchain/langchain/indexes/base.py new file mode 100644 index 000000000..128455253 --- /dev/null +++ b/libs/langchain/langchain/indexes/base.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import uuid +from abc import ABC, abstractmethod +from typing import List, Optional, Sequence + +NAMESPACE_UUID = uuid.UUID(int=1984) + + +class RecordManager(ABC): + """An abstract base class representing the interface for a record manager.""" + + def __init__( + self, + namespace: str, + ) -> None: + """Initialize the record manager. + + Args: + namespace (str): The namespace for the record manager. + """ + self.namespace = namespace + + @abstractmethod + def create_schema(self) -> None: + """Create the database schema for the record manager.""" + + @abstractmethod + def get_time(self) -> float: + """Get the current server time as a high resolution timestamp! + + It's important to get this from the server to ensure a monotonic clock, + otherwise there may be data loss when cleaning up old documents! + + Returns: + The current server time as a float timestamp. + """ + + @abstractmethod + def update( + self, + keys: Sequence[str], + *, + group_ids: Optional[Sequence[Optional[str]]] = None, + time_at_least: Optional[float] = None, + ) -> None: + """Upsert records into the database. + + Args: + keys: A list of record keys to upsert. + group_ids: A list of group IDs corresponding to the keys. + time_at_least: if provided, updates should only happen if the + updated_at field is at least this time. + + Raises: + ValueError: If the length of keys doesn't match the length of group_ids. + """ + + @abstractmethod + def exists(self, keys: Sequence[str]) -> List[bool]: + """Check if the provided keys exist in the database. + + Args: + keys: A list of keys to check. + + Returns: + A list of boolean values indicating the existence of each key. + """ + + @abstractmethod + def list_keys( + self, + *, + before: Optional[float] = None, + after: Optional[float] = None, + group_ids: Optional[Sequence[str]] = None, + ) -> List[str]: + """List records in the database based on the provided filters. + + Args: + before: Filter to list records updated before this time. + after: Filter to list records updated after this time. + group_ids: Filter to list records with specific group IDs. + + Returns: + A list of keys for the matching records. + """ + + @abstractmethod + def delete_keys(self, keys: Sequence[str]) -> None: + """Delete specified records from the database. + + Args: + keys: A list of keys to delete. + """ diff --git a/libs/langchain/tests/unit_tests/indexes/test_api.py b/libs/langchain/tests/unit_tests/indexes/test_api.py new file mode 100644 index 000000000..3104084d0 --- /dev/null +++ b/libs/langchain/tests/unit_tests/indexes/test_api.py @@ -0,0 +1,13 @@ +from langchain.indexes import __all__ + + +def test_all() -> None: + """Use to catch obvious breaking changes.""" + assert __all__ == sorted(__all__, key=str.lower) + assert __all__ == [ + "GraphIndexCreator", + "index", + "IndexingResult", + "SQLRecordManager", + "VectorstoreIndexCreator", + ] diff --git a/libs/langchain/tests/unit_tests/indexes/test_hashed_document.py b/libs/langchain/tests/unit_tests/indexes/test_hashed_document.py new file mode 100644 index 000000000..24bbd1152 --- /dev/null +++ b/libs/langchain/tests/unit_tests/indexes/test_hashed_document.py @@ -0,0 +1,50 @@ +import pytest + +from langchain.indexes._api import _HashedDocument +from langchain.schema import Document + + +def test_hashed_document_hashing() -> None: + hashed_document = _HashedDocument( + uid="123", page_content="Lorem ipsum dolor sit amet", metadata={"key": "value"} + ) + assert isinstance(hashed_document.hash_, str) + + +def test_hashing_with_missing_content() -> None: + """Check that ValueError is raised if page_content is missing.""" + with pytest.raises(ValueError): + _HashedDocument( + metadata={"key": "value"}, + ) + + +def test_uid_auto_assigned_to_hash() -> None: + """Test uid is auto-assigned to the hashed_document hash.""" + hashed_document = _HashedDocument( + page_content="Lorem ipsum dolor sit amet", metadata={"key": "value"} + ) + assert hashed_document.uid == hashed_document.hash_ + + +def test_to_document() -> None: + """Test to_document method.""" + hashed_document = _HashedDocument( + page_content="Lorem ipsum dolor sit amet", metadata={"key": "value"} + ) + doc = hashed_document.to_document() + assert isinstance(doc, Document) + assert doc.page_content == "Lorem ipsum dolor sit amet" + assert doc.metadata == {"key": "value"} + + +def test_from_document() -> None: + """Test from document class method.""" + document = Document( + page_content="Lorem ipsum dolor sit amet", metadata={"key": "value"} + ) + + hashed_document = _HashedDocument.from_document(document) + # hash should be deterministic + assert hashed_document.hash_ == "fd1dc827-051b-537d-a1fe-1fa043e8b276" + assert hashed_document.uid == hashed_document.hash_ diff --git a/libs/langchain/tests/unit_tests/indexes/test_indexing.py b/libs/langchain/tests/unit_tests/indexes/test_indexing.py new file mode 100644 index 000000000..70ebf4fcb --- /dev/null +++ b/libs/langchain/tests/unit_tests/indexes/test_indexing.py @@ -0,0 +1,474 @@ +from datetime import datetime +from typing import Any, Dict, Iterable, Iterator, List, Optional, Sequence, Type +from unittest.mock import patch + +import pytest + +from langchain.document_loaders.base import BaseLoader +from langchain.embeddings.base import Embeddings +from langchain.indexes import index +from langchain.indexes._sql_record_manager import SQLRecordManager +from langchain.schema import Document +from langchain.vectorstores.base import VST, VectorStore + + +class ToyLoader(BaseLoader): + """Toy loader that always returns the same documents.""" + + def __init__(self, documents: Sequence[Document]) -> None: + """Initialize with the documents to return.""" + self.documents = documents + + def lazy_load( + self, + ) -> Iterator[Document]: + yield from self.documents + + def load(self) -> List[Document]: + """Load the documents from the source.""" + return list(self.lazy_load()) + + +class InMemoryVectorStore(VectorStore): + """In-memory implementation of VectorStore using a dictionary.""" + + def __init__(self) -> None: + """Vector store interface for testing things in memory.""" + self.store: Dict[str, Document] = {} + + def delete(self, ids: Optional[Sequence[str]] = None, **kwargs: Any) -> None: + """Delete the given documents from the store using their IDs.""" + if ids: + for _id in ids: + self.store.pop(_id, None) + + def add_documents( # type: ignore + self, + documents: Sequence[Document], + *, + ids: Optional[Sequence[str]] = None, + **kwargs: Any, + ) -> None: + """Add the given documents to the store (insert behavior).""" + if ids and len(ids) != len(documents): + raise ValueError( + f"Expected {len(ids)} ids, got {len(documents)} documents." + ) + + if not ids: + raise NotImplementedError("This is not implemented yet.") + + for _id, document in zip(ids, documents): + if _id in self.store: + raise ValueError( + f"Document with uid {_id} already exists in the store." + ) + self.store[_id] = document + + def add_texts( + self, + texts: Iterable[str], + metadatas: Optional[List[dict]] = None, + **kwargs: Any, + ) -> List[str]: + """Add the given texts to the store (insert behavior).""" + raise NotImplementedError() + + @classmethod + def from_texts( + cls: Type[VST], + texts: List[str], + embedding: Embeddings, + metadatas: Optional[List[dict]] = None, + **kwargs: Any, + ) -> VST: + """Create a vector store from a list of texts.""" + raise NotImplementedError() + + def similarity_search( + self, query: str, k: int = 4, **kwargs: Any + ) -> List[Document]: + """Find the most similar documents to the given query.""" + raise NotImplementedError() + + +@pytest.fixture +def record_manager() -> SQLRecordManager: + """Timestamped set fixture.""" + record_manager = SQLRecordManager("kittens", db_url="sqlite:///:memory:") + record_manager.create_schema() + return record_manager + + +@pytest.fixture +def vector_store() -> InMemoryVectorStore: + """Vector store fixture.""" + return InMemoryVectorStore() + + +def test_indexing_same_content( + record_manager: SQLRecordManager, vector_store: InMemoryVectorStore +) -> None: + """Indexing some content to confirm it gets added only once.""" + loader = ToyLoader( + documents=[ + Document( + page_content="This is a test document.", + ), + Document( + page_content="This is another document.", + ), + ] + ) + + assert index(loader, record_manager, vector_store) == { + "num_added": 2, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } + + assert len(list(vector_store.store)) == 2 + + for _ in range(2): + # Run the indexing again + assert index(loader, record_manager, vector_store) == { + "num_added": 0, + "num_deleted": 0, + "num_skipped": 2, + "num_updated": 0, + } + + +def test_index_simple_delete_full( + record_manager: SQLRecordManager, vector_store: InMemoryVectorStore +) -> None: + """Indexing some content to confirm it gets added only once.""" + loader = ToyLoader( + documents=[ + Document( + page_content="This is a test document.", + ), + Document( + page_content="This is another document.", + ), + ] + ) + + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 1).timestamp() + ): + assert index(loader, record_manager, vector_store, delete_mode="full") == { + "num_added": 2, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } + + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 1).timestamp() + ): + assert index(loader, record_manager, vector_store, delete_mode="full") == { + "num_added": 0, + "num_deleted": 0, + "num_skipped": 2, + "num_updated": 0, + } + + loader = ToyLoader( + documents=[ + Document( + page_content="mutated document 1", + ), + Document( + page_content="This is another document.", # <-- Same as original + ), + ] + ) + + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + assert index(loader, record_manager, vector_store, delete_mode="full") == { + "num_added": 1, + "num_deleted": 1, + "num_skipped": 1, + "num_updated": 0, + } + + doc_texts = set( + # Ignoring type since doc should be in the store and not a None + vector_store.store.get(uid).page_content # type: ignore + for uid in vector_store.store + ) + assert doc_texts == {"mutated document 1", "This is another document."} + + # Attempt to index again verify that nothing changes + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + assert index(loader, record_manager, vector_store, delete_mode="full") == { + "num_added": 0, + "num_deleted": 0, + "num_skipped": 2, + "num_updated": 0, + } + + +def test_incremental_fails_with_bad_source_ids( + record_manager: SQLRecordManager, vector_store: InMemoryVectorStore +) -> None: + """Test indexing with incremental deletion strategy.""" + loader = ToyLoader( + documents=[ + Document( + page_content="This is a test document.", + metadata={"source": "1"}, + ), + Document( + page_content="This is another document.", + metadata={"source": "2"}, + ), + Document( + page_content="This is yet another document.", + metadata={"source": None}, + ), + ] + ) + + with pytest.raises(ValueError): + # Should raise an error because no source id function was specified + index(loader, record_manager, vector_store, delete_mode="incremental") + + with pytest.raises(ValueError): + # Should raise an error because no source id function was specified + index( + loader, + record_manager, + vector_store, + delete_mode="incremental", + source_id_key="source", + ) + + +def test_no_delete( + record_manager: SQLRecordManager, vector_store: InMemoryVectorStore +) -> None: + """Test indexing without a deletion strategy.""" + loader = ToyLoader( + documents=[ + Document( + page_content="This is a test document.", + metadata={"source": "1"}, + ), + Document( + page_content="This is another document.", + metadata={"source": "2"}, + ), + ] + ) + + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + assert index( + loader, + record_manager, + vector_store, + delete_mode=None, + source_id_key="source", + ) == { + "num_added": 2, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } + + # If we add the same content twice it should be skipped + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + assert index( + loader, + record_manager, + vector_store, + delete_mode=None, + source_id_key="source", + ) == { + "num_added": 0, + "num_deleted": 0, + "num_skipped": 2, + "num_updated": 0, + } + + loader = ToyLoader( + documents=[ + Document( + page_content="mutated content", + metadata={"source": "1"}, + ), + Document( + page_content="This is another document.", + metadata={"source": "2"}, + ), + ] + ) + + # Should result in no updates or deletions! + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + assert index( + loader, + record_manager, + vector_store, + delete_mode=None, + source_id_key="source", + ) == { + "num_added": 1, + "num_deleted": 0, + "num_skipped": 1, + "num_updated": 0, + } + + +def test_incremental_delete( + record_manager: SQLRecordManager, vector_store: InMemoryVectorStore +) -> None: + """Test indexing with incremental deletion strategy.""" + loader = ToyLoader( + documents=[ + Document( + page_content="This is a test document.", + metadata={"source": "1"}, + ), + Document( + page_content="This is another document.", + metadata={"source": "2"}, + ), + ] + ) + + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + assert index( + loader, + record_manager, + vector_store, + delete_mode="incremental", + source_id_key="source", + ) == { + "num_added": 2, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } + + doc_texts = set( + # Ignoring type since doc should be in the store and not a None + vector_store.store.get(uid).page_content # type: ignore + for uid in vector_store.store + ) + assert doc_texts == {"This is another document.", "This is a test document."} + + # Attempt to index again verify that nothing changes + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + assert index( + loader, + record_manager, + vector_store, + delete_mode="incremental", + source_id_key="source", + ) == { + "num_added": 0, + "num_deleted": 0, + "num_skipped": 2, + "num_updated": 0, + } + + # Create 2 documents from the same source all with mutated content + loader = ToyLoader( + documents=[ + Document( + page_content="mutated document 1", + metadata={"source": "1"}, + ), + Document( + page_content="mutated document 2", + metadata={"source": "1"}, + ), + Document( + page_content="This is another document.", # <-- Same as original + metadata={"source": "2"}, + ), + ] + ) + + # Attempt to index again verify that nothing changes + with patch.object( + record_manager, "get_time", return_value=datetime(2021, 1, 3).timestamp() + ): + assert index( + loader, + record_manager, + vector_store, + delete_mode="incremental", + source_id_key="source", + ) == { + "num_added": 2, + "num_deleted": 1, + "num_skipped": 1, + "num_updated": 0, + } + + doc_texts = set( + # Ignoring type since doc should be in the store and not a None + vector_store.store.get(uid).page_content # type: ignore + for uid in vector_store.store + ) + assert doc_texts == { + "mutated document 1", + "mutated document 2", + "This is another document.", + } + + +def test_indexing_with_no_docs( + record_manager: SQLRecordManager, vector_store: VectorStore +) -> None: + """Check edge case when loader returns no new docs.""" + loader = ToyLoader(documents=[]) + + assert index(loader, record_manager, vector_store, delete_mode="full") == { + "num_added": 0, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } + + +def test_deduplication( + record_manager: SQLRecordManager, vector_store: VectorStore +) -> None: + """Check edge case when loader returns no new docs.""" + docs = [ + Document( + page_content="This is a test document.", + metadata={"source": "1"}, + ), + Document( + page_content="This is a test document.", + metadata={"source": "1"}, + ), + ] + + # Should result in only a single document being added + assert index(docs, record_manager, vector_store, delete_mode="full") == { + "num_added": 1, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } diff --git a/libs/langchain/tests/unit_tests/indexes/test_sql_record_manager.py b/libs/langchain/tests/unit_tests/indexes/test_sql_record_manager.py new file mode 100644 index 000000000..d7d95212a --- /dev/null +++ b/libs/langchain/tests/unit_tests/indexes/test_sql_record_manager.py @@ -0,0 +1,276 @@ +from datetime import datetime +from unittest.mock import patch + +import pytest + +from langchain.indexes._sql_record_manager import SQLRecordManager, UpsertionRecord + + +@pytest.fixture() +def manager() -> SQLRecordManager: + """Initialize the test database and yield the TimestampedSet instance.""" + # Initialize and yield the TimestampedSet instance + record_manager = SQLRecordManager("kittens", db_url="sqlite:///:memory:") + record_manager.create_schema() + return record_manager + + +def test_update(manager: SQLRecordManager) -> None: + """Test updating records in the database.""" + # no keys should be present in the set + read_keys = manager.list_keys() + assert read_keys == [] + # Insert records + keys = ["key1", "key2", "key3"] + manager.update(keys) + # Retrieve the records + read_keys = manager.list_keys() + assert read_keys == ["key1", "key2", "key3"] + + +def test_update_timestamp(manager: SQLRecordManager) -> None: + """Test updating records in the database.""" + # no keys should be present in the set + with patch.object( + manager, "get_time", return_value=datetime(2021, 1, 2).timestamp() + ): + manager.update(["key1"]) + + with manager._make_session() as session: + records = ( + session.query(UpsertionRecord) + .filter(UpsertionRecord.namespace == manager.namespace) + .all() # type: ignore[attr-defined] + ) + + assert [ + { + "key": record.key, + "namespace": record.namespace, + "updated_at": record.updated_at, + "group_id": record.group_id, + } + for record in records + ] == [ + { + "group_id": None, + "key": "key1", + "namespace": "kittens", + "updated_at": datetime(2021, 1, 2, 0, 0).timestamp(), + } + ] + + with patch.object( + manager, "get_time", return_value=datetime(2023, 1, 2).timestamp() + ): + manager.update(["key1"]) + + with manager._make_session() as session: + records = ( + session.query(UpsertionRecord) + .filter(UpsertionRecord.namespace == manager.namespace) + .all() # type: ignore[attr-defined] + ) + + assert [ + { + "key": record.key, + "namespace": record.namespace, + "updated_at": record.updated_at, + "group_id": record.group_id, + } + for record in records + ] == [ + { + "group_id": None, + "key": "key1", + "namespace": "kittens", + "updated_at": datetime(2023, 1, 2, 0, 0).timestamp(), + } + ] + + with patch.object( + manager, "get_time", return_value=datetime(2023, 2, 2).timestamp() + ): + manager.update(["key1"], group_ids=["group1"]) + + with manager._make_session() as session: + records = ( + session.query(UpsertionRecord) + .filter(UpsertionRecord.namespace == manager.namespace) + .all() # type: ignore[attr-defined] + ) + + assert [ + { + "key": record.key, + "namespace": record.namespace, + "updated_at": record.updated_at, + "group_id": record.group_id, + } + for record in records + ] == [ + { + "group_id": "group1", + "key": "key1", + "namespace": "kittens", + "updated_at": datetime(2023, 2, 2, 0, 0).timestamp(), + } + ] + + +def test_update_with_group_ids(manager: SQLRecordManager) -> None: + """Test updating records in the database.""" + # no keys should be present in the set + read_keys = manager.list_keys() + assert read_keys == [] + # Insert records + keys = ["key1", "key2", "key3"] + manager.update(keys) + # Retrieve the records + read_keys = manager.list_keys() + assert read_keys == ["key1", "key2", "key3"] + + +def test_exists(manager: SQLRecordManager) -> None: + """Test checking if keys exist in the database.""" + # Insert records + keys = ["key1", "key2", "key3"] + manager.update(keys) + # Check if the keys exist in the database + exists = manager.exists(keys) + assert len(exists) == len(keys) + assert exists == [True, True, True] + + exists = manager.exists(["key1", "key4"]) + assert len(exists) == 2 + assert exists == [True, False] + + +def test_list_keys(manager: SQLRecordManager) -> None: + """Test listing keys based on the provided date range.""" + # Insert records + assert manager.list_keys() == [] + with manager._make_session() as session: + # Add some keys with explicit updated_ats + session.add( + UpsertionRecord( + key="key1", + updated_at=datetime(2021, 1, 1).timestamp(), + namespace="kittens", + ) + ) + session.add( + UpsertionRecord( + key="key2", + updated_at=datetime(2022, 1, 1).timestamp(), + namespace="kittens", + ) + ) + session.add( + UpsertionRecord( + key="key3", + updated_at=datetime(2023, 1, 1).timestamp(), + namespace="kittens", + ) + ) + session.add( + UpsertionRecord( + key="key4", + group_id="group1", + updated_at=datetime(2024, 1, 1).timestamp(), + namespace="kittens", + ) + ) + # Insert keys from a different namespace, these should not be visible! + session.add( + UpsertionRecord( + key="key1", + updated_at=datetime(2021, 1, 1).timestamp(), + namespace="puppies", + ) + ) + session.add( + UpsertionRecord( + key="key5", + updated_at=datetime(2021, 1, 1).timestamp(), + namespace="puppies", + ) + ) + session.commit() + + # Retrieve all keys + assert manager.list_keys() == ["key1", "key2", "key3", "key4"] + + # Retrieve keys updated after a certain date + assert manager.list_keys(after=datetime(2022, 2, 1).timestamp()) == ["key3", "key4"] + + # Retrieve keys updated after a certain date + assert manager.list_keys(before=datetime(2022, 2, 1).timestamp()) == [ + "key1", + "key2", + ] + + # Retrieve keys updated after a certain date + assert manager.list_keys(before=datetime(2019, 2, 1).timestamp()) == [] + + # Retrieve keys in a time range + assert manager.list_keys( + before=datetime(2022, 2, 1).timestamp(), + after=datetime(2021, 11, 1).timestamp(), + ) == ["key2"] + + assert manager.list_keys(group_ids=["group1", "group2"]) == ["key4"] + + # Test multiple filters + assert ( + manager.list_keys( + group_ids=["group1", "group2"], before=datetime(2019, 1, 1).timestamp() + ) + == [] + ) + assert manager.list_keys( + group_ids=["group1", "group2"], after=datetime(2019, 1, 1).timestamp() + ) == ["key4"] + + +def test_namespace_is_used(manager: SQLRecordManager) -> None: + """Verify that namespace is taken into account for all operations.""" + assert manager.namespace == "kittens" + with manager._make_session() as session: + # Add some keys with explicit updated_ats + session.add(UpsertionRecord(key="key1", namespace="kittens")) + session.add(UpsertionRecord(key="key2", namespace="kittens")) + session.add(UpsertionRecord(key="key1", namespace="puppies")) + session.add(UpsertionRecord(key="key3", namespace="puppies")) + session.commit() + + assert manager.list_keys() == ["key1", "key2"] + manager.delete_keys(["key1"]) + assert manager.list_keys() == ["key2"] + manager.update(["key3"], group_ids=["group3"]) + + with manager._make_session() as session: + results = session.query(UpsertionRecord).all() + + assert sorted([(r.namespace, r.key, r.group_id) for r in results]) == [ + ("kittens", "key2", None), + ("kittens", "key3", "group3"), + ("puppies", "key1", None), + ("puppies", "key3", None), + ] + + +def test_delete_keys(manager: SQLRecordManager) -> None: + """Test deleting keys from the database.""" + # Insert records + keys = ["key1", "key2", "key3"] + manager.update(keys) + + # Delete some keys + keys_to_delete = ["key1", "key2"] + manager.delete_keys(keys_to_delete) + + # Check if the deleted keys are no longer in the database + remaining_keys = manager.list_keys() + assert remaining_keys == ["key3"] From 9e1dbd4b490d423b8ed4fc699975d91cef2e7cfc Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Wed, 23 Aug 2023 22:51:49 -0400 Subject: [PATCH 099/143] x --- .../langchain/schema/runnable/_locals.py | 21 ++++++++++++++----- .../langchain/schema/runnable/config.py | 11 +++++++--- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/_locals.py b/libs/langchain/langchain/schema/runnable/_locals.py index 755a709fc..5b2f8e758 100644 --- a/libs/langchain/langchain/schema/runnable/_locals.py +++ b/libs/langchain/langchain/schema/runnable/_locals.py @@ -1,16 +1,27 @@ from __future__ import annotations -from typing import Any, AsyncIterator, Dict, Iterator, Mapping, Optional, Union - -from langchain.callbacks.manager import ( - AsyncCallbackManagerForChainRun, - CallbackManagerForChainRun, +from typing import ( + TYPE_CHECKING, + Any, + AsyncIterator, + Dict, + Iterator, + Mapping, + Optional, + Union, ) + from langchain.load.serializable import Serializable from langchain.schema.runnable.base import Input, Output, Runnable from langchain.schema.runnable.config import RunnableConfig from langchain.schema.runnable.passthrough import RunnablePassthrough +if TYPE_CHECKING: + from langchain.callbacks.manager import ( + AsyncCallbackManagerForChainRun, + CallbackManagerForChainRun, + ) + class PutLocalVar(RunnablePassthrough): key: Union[str, Mapping[str, str]] diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index ce4e11861..a431fb635 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -3,10 +3,11 @@ from __future__ import annotations from concurrent.futures import Executor, ThreadPoolExecutor from contextlib import contextmanager from copy import deepcopy -from typing import Any, Dict, Generator, List, Optional, TypedDict +from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, TypedDict -from langchain.callbacks.base import BaseCallbackManager, Callbacks -from langchain.callbacks.manager import AsyncCallbackManager, CallbackManager +if TYPE_CHECKING: + from langchain.callbacks.base import BaseCallbackManager, Callbacks + from langchain.callbacks.manager import AsyncCallbackManager, CallbackManager class RunnableConfig(TypedDict, total=False): @@ -87,6 +88,8 @@ def patch_config( def get_callback_manager_for_config(config: RunnableConfig) -> CallbackManager: + from langchain.callbacks.manager import CallbackManager + return CallbackManager.configure( inheritable_callbacks=config.get("callbacks"), inheritable_tags=config.get("tags"), @@ -97,6 +100,8 @@ def get_callback_manager_for_config(config: RunnableConfig) -> CallbackManager: def get_async_callback_manager_for_config( config: RunnableConfig, ) -> AsyncCallbackManager: + from langchain.callbacks.manager import AsyncCallbackManager + return AsyncCallbackManager.configure( inheritable_callbacks=config.get("callbacks"), inheritable_tags=config.get("tags"), From 25f2c82ae81a4b5f2bfe722ef69f9b57222c5944 Mon Sep 17 00:00:00 2001 From: seamusp Date: Wed, 23 Aug 2023 22:36:54 -0700 Subject: [PATCH 100/143] docs:misc fixes (#9671) Improve internal consistency in LangChain documentation - Change occurrences of eg and eg. to e.g. - Fix headers containing unnecessary capital letters. - Change instances of "few shot" to "few-shot". - Add periods to end of sentences where missing. - Minor spelling and grammar fixes. --- docs/api_reference/conf.py | 2 +- .../docs/get_started/quickstart.mdx | 8 ++-- .../prompt_templates/few_shot_examples.mdx | 2 +- .../prompts/prompt_templates/index.mdx | 2 +- .../prompts/prompt_templates/partial.mdx | 2 +- .../prompt_templates/prompt_composition.mdx | 4 +- .../guides/expression_language/cookbook.ipynb | 2 +- .../integrations/callbacks/promptlayer.ipynb | 2 +- .../integrations/document_loaders/git.ipynb | 2 +- .../extras/integrations/providers/datadog.mdx | 2 +- docs/extras/modules/callbacks/tags.mdx | 2 +- .../custom_example_selector.md | 2 +- .../connecting_to_a_feature_store.ipynb | 16 ++++---- .../custom_prompt_template.ipynb | 8 ++-- .../few_shot_examples_chat.ipynb | 10 ++--- .../prompt_templates/format_output.mdx | 33 ++++++++------- .../prompts/prompt_templates/formats.mdx | 2 +- .../prompt_serialization.ipynb | 16 ++++---- .../prompt_templates/prompts_pipelining.ipynb | 40 +++++-------------- .../modules/callbacks/get_started.mdx | 6 +-- .../modules/chains/popular/sqlite.mdx | 6 +-- .../document_transformers/get_started.mdx | 2 +- .../model_io/models/chat/how_to/prompts.mdx | 2 +- .../prompt_templates/few_shot_examples.mdx | 14 +++---- .../prompts/prompt_templates/partial.mdx | 4 +- 25 files changed, 85 insertions(+), 106 deletions(-) diff --git a/docs/api_reference/conf.py b/docs/api_reference/conf.py index 3f1772a6b..25d11a075 100644 --- a/docs/api_reference/conf.py +++ b/docs/api_reference/conf.py @@ -156,7 +156,7 @@ html_context = { html_static_path = ["_static"] # These paths are either relative to html_static_path -# or fully qualified paths (eg. https://...) +# or fully qualified paths (e.g. https://...) html_css_files = [ "css/custom.css", ] diff --git a/docs/docs_skeleton/docs/get_started/quickstart.mdx b/docs/docs_skeleton/docs/get_started/quickstart.mdx index 8cf778c94..0db8c03ee 100644 --- a/docs/docs_skeleton/docs/get_started/quickstart.mdx +++ b/docs/docs_skeleton/docs/get_started/quickstart.mdx @@ -107,7 +107,7 @@ import PromptTemplateChatModel from "@snippets/get_started/quickstart/prompt_tem However, the advantages of using these over raw string formatting are several. -You can "partial" out variables - eg you can format only some of the variables at a time. +You can "partial" out variables - e.g. you can format only some of the variables at a time. You can compose them together, easily combining different templates into a single prompt. For explanations of these functionalities, see the [section on prompts](/docs/modules/model_io/prompts) for more detail. @@ -121,12 +121,12 @@ Let's take a look at this below: ChatPromptTemplates can also include other things besides ChatMessageTemplates - see the [section on prompts](/docs/modules/model_io/prompts) for more detail. -## Output Parsers +## Output parsers OutputParsers convert the raw output of an LLM into a format that can be used downstream. There are few main type of OutputParsers, including: -- Convert text from LLM -> structured information (eg JSON) +- Convert text from LLM -> structured information (e.g. JSON) - Convert a ChatMessage into just a string - Convert the extra information returned from a call besides the message (like OpenAI function invocation) into a string. @@ -149,7 +149,7 @@ import LLMChain from "@snippets/get_started/quickstart/llm_chain.mdx" -## Next Steps +## Next steps This is it! We've now gone over how to create the core building block of LangChain applications - the LLMChains. diff --git a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx index 3c5dfe3ec..ad02a01b7 100644 --- a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx +++ b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx @@ -1,6 +1,6 @@ # Few-shot prompt templates -In this tutorial, we'll learn how to create a prompt template that uses few shot examples. A few shot prompt template can be constructed from either a set of examples, or from an Example Selector object. +In this tutorial, we'll learn how to create a prompt template that uses few-shot examples. A few-shot prompt template can be constructed from either a set of examples, or from an Example Selector object. import Example from "@snippets/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx" diff --git a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/index.mdx b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/index.mdx index 655577800..c64e73865 100644 --- a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/index.mdx +++ b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/index.mdx @@ -6,7 +6,7 @@ sidebar_position: 0 Prompt templates are pre-defined recipes for generating prompts for language models. -A template may include instructions, few shot examples, and specific context and +A template may include instructions, few-shot examples, and specific context and questions appropriate for a given task. LangChain provides tooling to create and work with prompt templates. diff --git a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/partial.mdx b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/partial.mdx index b76431dfc..ac2edea53 100644 --- a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/partial.mdx +++ b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/partial.mdx @@ -1,6 +1,6 @@ # Partial prompt templates -Like other methods, it can make sense to "partial" a prompt template - eg pass in a subset of the required values, as to create a new prompt template which expects only the remaining subset of values. +Like other methods, it can make sense to "partial" a prompt template - e.g. pass in a subset of the required values, as to create a new prompt template which expects only the remaining subset of values. LangChain supports this in two ways: 1. Partial formatting with string values. diff --git a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/prompt_composition.mdx b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/prompt_composition.mdx index 439e26ea3..c1b96c107 100644 --- a/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/prompt_composition.mdx +++ b/docs/docs_skeleton/docs/modules/model_io/prompts/prompt_templates/prompt_composition.mdx @@ -2,8 +2,8 @@ This notebook goes over how to compose multiple prompts together. This can be useful when you want to reuse parts of prompts. This can be done with a PipelinePrompt. A PipelinePrompt consists of two main parts: -- Final prompt: This is the final prompt that is returned -- Pipeline prompts: This is a list of tuples, consisting of a string name and a prompt template. Each prompt template will be formatted and then passed to future prompt templates as a variable with the same name. +- Final prompt: The final prompt that is returned +- Pipeline prompts: A list of tuples, consisting of a string name and a prompt template. Each prompt template will be formatted and then passed to future prompt templates as a variable with the same name. import Example from "@snippets/modules/model_io/prompts/prompt_templates/prompt_composition.mdx" diff --git a/docs/extras/guides/expression_language/cookbook.ipynb b/docs/extras/guides/expression_language/cookbook.ipynb index d7aad4291..04b74164d 100644 --- a/docs/extras/guides/expression_language/cookbook.ipynb +++ b/docs/extras/guides/expression_language/cookbook.ipynb @@ -1318,7 +1318,7 @@ "source": [ "template = \"\"\"Write some python code to solve the user's problem. \n", "\n", - "Return only python code in Markdown format, eg:\n", + "Return only python code in Markdown format, e.g.:\n", "\n", "```python\n", "....\n", diff --git a/docs/extras/integrations/callbacks/promptlayer.ipynb b/docs/extras/integrations/callbacks/promptlayer.ipynb index f6d7cd976..2f3b5b9f8 100644 --- a/docs/extras/integrations/callbacks/promptlayer.ipynb +++ b/docs/extras/integrations/callbacks/promptlayer.ipynb @@ -11,7 +11,7 @@ "\n", "[PromptLayer](https://promptlayer.com) is a an LLM observability platform that lets you visualize requests, version prompts, and track usage. In this guide we will go over how to setup the `PromptLayerCallbackHandler`. \n", "\n", - "While PromptLayer does have LLMs that integrate directly with LangChain (eg [`PromptLayerOpenAI`](https://python.langchain.com/docs/integrations/llms/promptlayer_openai)), this callback is the recommended way to integrate PromptLayer with LangChain.\n", + "While PromptLayer does have LLMs that integrate directly with LangChain (e.g. [`PromptLayerOpenAI`](https://python.langchain.com/docs/integrations/llms/promptlayer_openai)), this callback is the recommended way to integrate PromptLayer with LangChain.\n", "\n", "See [our docs](https://docs.promptlayer.com/languages/langchain) for more information." ] diff --git a/docs/extras/integrations/document_loaders/git.ipynb b/docs/extras/integrations/document_loaders/git.ipynb index 54d5df439..47382c564 100644 --- a/docs/extras/integrations/document_loaders/git.ipynb +++ b/docs/extras/integrations/document_loaders/git.ipynb @@ -173,7 +173,7 @@ "source": [ "from langchain.document_loaders import GitLoader\n", "\n", - "# eg. loading only python files\n", + "# e.g. loading only python files\n", "loader = GitLoader(\n", " repo_path=\"./example_data/test_repo1/\",\n", " file_filter=lambda file_path: file_path.endswith(\".py\"),\n", diff --git a/docs/extras/integrations/providers/datadog.mdx b/docs/extras/integrations/providers/datadog.mdx index 59bd069c5..aee4d5e24 100644 --- a/docs/extras/integrations/providers/datadog.mdx +++ b/docs/extras/integrations/providers/datadog.mdx @@ -52,7 +52,7 @@ Note that using `ddtrace-run` or `patch_all()` will also enable the `requests` a from ddtrace import config, patch # Note: be sure to configure the integration before calling ``patch()``! -# eg. config.langchain["logs_enabled"] = True +# e.g. config.langchain["logs_enabled"] = True patch(langchain=True) diff --git a/docs/extras/modules/callbacks/tags.mdx b/docs/extras/modules/callbacks/tags.mdx index f8bcc42da..87d9b7beb 100644 --- a/docs/extras/modules/callbacks/tags.mdx +++ b/docs/extras/modules/callbacks/tags.mdx @@ -1,3 +1,3 @@ # Tags -You can add tags to your callbacks by passing a `tags` argument to the `call()`/`run()`/`apply()` methods. This is useful for filtering your logs, eg. if you want to log all requests made to a specific LLMChain, you can add a tag, and then filter your logs by that tag. You can pass tags to both constructor and request callbacks, see the examples above for details. These tags are then passed to the `tags` argument of the "start" callback methods, ie. `on_llm_start`, `on_chat_model_start`, `on_chain_start`, `on_tool_start`. +You can add tags to your callbacks by passing a `tags` argument to the `call()`/`run()`/`apply()` methods. This is useful for filtering your logs, e.g. if you want to log all requests made to a specific LLMChain, you can add a tag, and then filter your logs by that tag. You can pass tags to both constructor and request callbacks, see the examples above for details. These tags are then passed to the `tags` argument of the "start" callback methods, ie. `on_llm_start`, `on_chat_model_start`, `on_chain_start`, `on_tool_start`. diff --git a/docs/extras/modules/model_io/prompts/example_selectors/custom_example_selector.md b/docs/extras/modules/model_io/prompts/example_selectors/custom_example_selector.md index 15f070a0f..d9bff1559 100644 --- a/docs/extras/modules/model_io/prompts/example_selectors/custom_example_selector.md +++ b/docs/extras/modules/model_io/prompts/example_selectors/custom_example_selector.md @@ -5,7 +5,7 @@ In this tutorial, we'll create a custom example selector that selects every alte An `ExampleSelector` must implement two methods: 1. An `add_example` method which takes in an example and adds it into the ExampleSelector -2. A `select_examples` method which takes in input variables (which are meant to be user input) and returns a list of examples to use in the few shot prompt. +2. A `select_examples` method which takes in input variables (which are meant to be user input) and returns a list of examples to use in the few-shot prompt. Let's implement a custom `ExampleSelector` that just selects two examples at random. diff --git a/docs/extras/modules/model_io/prompts/prompt_templates/connecting_to_a_feature_store.ipynb b/docs/extras/modules/model_io/prompts/prompt_templates/connecting_to_a_feature_store.ipynb index a549ce2bf..768c43e92 100644 --- a/docs/extras/modules/model_io/prompts/prompt_templates/connecting_to_a_feature_store.ipynb +++ b/docs/extras/modules/model_io/prompts/prompt_templates/connecting_to_a_feature_store.ipynb @@ -35,7 +35,7 @@ "source": [ "### Load Feast Store\n", "\n", - "Again, this should be set up according to the instructions in the Feast README" + "Again, this should be set up according to the instructions in the Feast README." ] }, { @@ -160,7 +160,7 @@ "source": [ "### Use in a chain\n", "\n", - "We can now use this in a chain, successfully creating a chain that achieves personalization backed by a feature store" + "We can now use this in a chain, successfully creating a chain that achieves personalization backed by a feature store." ] }, { @@ -243,7 +243,7 @@ "tags": [] }, "source": [ - "### Define and Load Features\n", + "### Define and load features\n", "\n", "We will use the user_transaction_counts Feature View from the [Tecton tutorial](https://docs.tecton.ai/docs/tutorials/tecton-fundamentals) as part of a Feature Service. For simplicity, we are only using a single Feature View; however, more sophisticated applications may require more feature views to retrieve the features needed for its prompt.\n", "\n", @@ -394,7 +394,7 @@ "source": [ "### Use in a chain\n", "\n", - "We can now use this in a chain, successfully creating a chain that achieves personalization backed by the Tecton Feature Platform" + "We can now use this in a chain, successfully creating a chain that achieves personalization backed by the Tecton Feature Platform." ] }, { @@ -460,7 +460,7 @@ "source": [ "## Featureform\n", "\n", - "Finally, we will use [Featureform](https://github.com/featureform/featureform) an open-source and enterprise-grade feature store to run the same example. Featureform allows you to work with your infrastructure like Spark or locally to define your feature transformations." + "Finally, we will use [Featureform](https://github.com/featureform/featureform), an open-source and enterprise-grade feature store, to run the same example. Featureform allows you to work with your infrastructure like Spark or locally to define your feature transformations." ] }, { @@ -564,7 +564,7 @@ "source": [ "### Use in a chain\n", "\n", - "We can now use this in a chain, successfully creating a chain that achieves personalization backed by the Featureform Feature Platform" + "We can now use this in a chain, successfully creating a chain that achieves personalization backed by the Featureform Feature Platform." ] }, { @@ -605,7 +605,7 @@ "source": [ "## AzureML Managed Feature Store\n", "\n", - "We will use [AzureML Managed Feature Store](https://learn.microsoft.com/en-us/azure/machine-learning/concept-what-is-managed-feature-store) to run the below example. " + "We will use [AzureML Managed Feature Store](https://learn.microsoft.com/en-us/azure/machine-learning/concept-what-is-managed-feature-store) to run the example below. " ] }, { @@ -768,7 +768,7 @@ "source": [ "### Use in a chain\n", "\n", - "We can now use this in a chain, successfully creating a chain that achieves personalization backed by the AzureML Managed Feature Store" + "We can now use this in a chain, successfully creating a chain that achieves personalization backed by the AzureML Managed Feature Store." ] }, { diff --git a/docs/extras/modules/model_io/prompts/prompt_templates/custom_prompt_template.ipynb b/docs/extras/modules/model_io/prompts/prompt_templates/custom_prompt_template.ipynb index c5044265a..7c9141a59 100644 --- a/docs/extras/modules/model_io/prompts/prompt_templates/custom_prompt_template.ipynb +++ b/docs/extras/modules/model_io/prompts/prompt_templates/custom_prompt_template.ipynb @@ -11,9 +11,7 @@ "\n", "## Why are custom prompt templates needed?\n", "\n", - "LangChain provides a set of default prompt templates that can be used to generate prompts for a variety of tasks. However, there may be cases where the default prompt templates do not meet your needs. For example, you may want to create a prompt template with specific dynamic instructions for your language model. In such cases, you can create a custom prompt template.\n", - "\n", - "Take a look at the current set of default prompt templates [here](/docs/modules/model_io/prompts/prompt_templates/)." + "LangChain provides a set of [default prompt templates](/docs/modules/model_io/prompts/prompt_templates/) that can be used to generate prompts for a variety of tasks. However, there may be cases where the default prompt templates do not meet your needs. For example, you may want to create a prompt template with specific dynamic instructions for your language model. In such cases, you can create a custom prompt template." ] }, { @@ -21,7 +19,7 @@ "id": "5d56ce86", "metadata": {}, "source": [ - "## Creating a Custom Prompt Template\n", + "## Creating a custom prompt template\n", "\n", "There are essentially two distinct prompt templates available - string prompt templates and chat prompt templates. String prompt templates provides a simple prompt in string format, while chat prompt templates produces a more structured prompt to be used with a chat API.\n", "\n", @@ -29,7 +27,7 @@ "\n", "To create a custom string prompt template, there are two requirements:\n", "1. It has an input_variables attribute that exposes what input variables the prompt template expects.\n", - "2. It exposes a format method that takes in keyword arguments corresponding to the expected input_variables and returns the formatted prompt.\n", + "2. It defines a format method that takes in keyword arguments corresponding to the expected input_variables and returns the formatted prompt.\n", "\n", "We will create a custom prompt template that takes in the function name as input and formats the prompt to provide the source code of the function. To achieve this, let's first create a function that will return the source code of a function given its name." ] diff --git a/docs/extras/modules/model_io/prompts/prompt_templates/few_shot_examples_chat.ipynb b/docs/extras/modules/model_io/prompts/prompt_templates/few_shot_examples_chat.ipynb index 6e88c0157..c6050f326 100644 --- a/docs/extras/modules/model_io/prompts/prompt_templates/few_shot_examples_chat.ipynb +++ b/docs/extras/modules/model_io/prompts/prompt_templates/few_shot_examples_chat.ipynb @@ -5,9 +5,9 @@ "id": "bb0735c0", "metadata": {}, "source": [ - "# Few shot examples for chat models\n", + "# Few-shot examples for chat models\n", "\n", - "This notebook covers how to use few shot examples in chat models. There does not appear to be solid consensus on how best to do few shot prompting, and the optimal prompt compilation will likely vary by model. Because of this, we provide few-shot prompt templates like the [FewShotChatMessagePromptTemplate](https://api.python.langchain.com/en/latest/prompts/langchain.prompts.few_shot.FewShotChatMessagePromptTemplate.html) as a flexible starting point, and you can modify or replace them as you see fit.\n", + "This notebook covers how to use few-shot examples in chat models. There does not appear to be solid consensus on how best to do few-shot prompting, and the optimal prompt compilation will likely vary by model. Because of this, we provide few-shot prompt templates like the [FewShotChatMessagePromptTemplate](https://api.python.langchain.com/en/latest/prompts/langchain.prompts.few_shot.FewShotChatMessagePromptTemplate.html) as a flexible starting point, and you can modify or replace them as you see fit.\n", "\n", "The goal of few-shot prompt templates are to dynamically select examples based on an input, and then format the examples in a final prompt to provide for the model.\n", "\n", @@ -133,7 +133,7 @@ "source": [ "final_prompt = ChatPromptTemplate.from_messages(\n", " [\n", - " (\"system\", \"You are wonderous wizard of math.\"),\n", + " (\"system\", \"You are a wondrous wizard of math.\"),\n", " few_shot_prompt,\n", " (\"human\", \"{input}\"),\n", " ]\n", @@ -172,7 +172,7 @@ "id": "70ab7114-f07f-46be-8874-3705a25aba5f", "metadata": {}, "source": [ - "## Dynamic Few-shot Prompting\n", + "## Dynamic few-shot prompting\n", "\n", "Sometimes you may want to condition which examples are shown based on the input. For this, you can replace the `examples` with an `example_selector`. The other components remain the same as above! To review, the dynamic few-shot prompt template would look like:\n", "\n", @@ -357,7 +357,7 @@ "source": [ "final_prompt = ChatPromptTemplate.from_messages(\n", " [\n", - " (\"system\", \"You are wonderous wizard of math.\"),\n", + " (\"system\", \"You are a wondrous wizard of math.\"),\n", " few_shot_prompt,\n", " (\"human\", \"{input}\"),\n", " ]\n", diff --git a/docs/extras/modules/model_io/prompts/prompt_templates/format_output.mdx b/docs/extras/modules/model_io/prompts/prompt_templates/format_output.mdx index 1be52b93c..38904076e 100644 --- a/docs/extras/modules/model_io/prompts/prompt_templates/format_output.mdx +++ b/docs/extras/modules/model_io/prompts/prompt_templates/format_output.mdx @@ -1,6 +1,6 @@ # Format template output -The output of the format method is available as string, list of messages and `ChatPromptValue` +The output of the format method is available as a string, list of messages and `ChatPromptValue` As string: @@ -26,22 +26,7 @@ output_2 = chat_prompt.format_prompt(input_language="English", output_language=" assert output == output_2 ``` -As `ChatPromptValue` - - -```python -chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.") -``` - - - -``` - ChatPromptValue(messages=[SystemMessage(content='You are a helpful assistant that translates English to French.', additional_kwargs={}), HumanMessage(content='I love programming.', additional_kwargs={})]) -``` - - - -As list of Message objects +As list of Message objects: ```python @@ -57,3 +42,17 @@ chat_prompt.format_prompt(input_language="English", output_language="French", te +As `ChatPromptValue`: + + +```python +chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.") +``` + + + +``` + ChatPromptValue(messages=[SystemMessage(content='You are a helpful assistant that translates English to French.', additional_kwargs={}), HumanMessage(content='I love programming.', additional_kwargs={})]) +``` + + diff --git a/docs/extras/modules/model_io/prompts/prompt_templates/formats.mdx b/docs/extras/modules/model_io/prompts/prompt_templates/formats.mdx index 6abe8cbca..05ab55eae 100644 --- a/docs/extras/modules/model_io/prompts/prompt_templates/formats.mdx +++ b/docs/extras/modules/model_io/prompts/prompt_templates/formats.mdx @@ -1,4 +1,4 @@ -# Template Formats +# Template formats `PromptTemplate` by default uses Python f-string as its template format. However, it can also use other formats like `jinja2`, specified through the `template_format` argument. diff --git a/docs/extras/modules/model_io/prompts/prompt_templates/prompt_serialization.ipynb b/docs/extras/modules/model_io/prompts/prompt_templates/prompt_serialization.ipynb index 5317fe1c2..28bc342fe 100644 --- a/docs/extras/modules/model_io/prompts/prompt_templates/prompt_serialization.ipynb +++ b/docs/extras/modules/model_io/prompts/prompt_templates/prompt_serialization.ipynb @@ -11,7 +11,7 @@ "\n", "At a high level, the following design principles are applied to serialization:\n", "\n", - "1. Both JSON and YAML are supported. We want to support serialization methods that are human readable on disk, and YAML and JSON are two of the most popular methods for that. Note that this rule applies to prompts. For other assets, like Examples, different serialization methods may be supported.\n", + "1. Both JSON and YAML are supported. We want to support serialization methods that are human readable on disk, and YAML and JSON are two of the most popular methods for that. Note that this rule applies to prompts. For other assets, like examples, different serialization methods may be supported.\n", "\n", "2. We support specifying everything in one file, or storing different components (templates, examples, etc) in different files and referencing them. For some cases, storing everything in file makes the most sense, but for others it is preferrable to split up some of the assets (long templates, large examples, reusable components). LangChain supports both.\n", "\n", @@ -144,7 +144,7 @@ "id": "d788a83c", "metadata": {}, "source": [ - "### Loading Template from a File\n", + "### Loading template from a file\n", "This shows an example of storing the template in a separate file and then referencing it in the config. Notice that the key changes from `template` to `template_path`." ] }, @@ -214,7 +214,7 @@ "source": [ "## FewShotPromptTemplate\n", "\n", - "This section covers examples for loading few shot prompt templates." + "This section covers examples for loading few-shot prompt templates." ] }, { @@ -282,7 +282,7 @@ "metadata": {}, "source": [ "### Loading from YAML\n", - "This shows an example of loading a few shot example from YAML." + "This shows an example of loading a few-shot example from YAML." ] }, { @@ -419,7 +419,7 @@ "metadata": {}, "source": [ "### Loading from JSON\n", - "This shows an example of loading a few shot example from JSON." + "This shows an example of loading a few-shot example from JSON." ] }, { @@ -484,7 +484,7 @@ "id": "9d23faf4", "metadata": {}, "source": [ - "### Examples in the Config\n", + "### Examples in the config\n", "This shows an example of referencing the examples directly in the config." ] }, @@ -553,7 +553,7 @@ "id": "2e86139e", "metadata": {}, "source": [ - "### Example Prompt from a File\n", + "### Example prompt from a file\n", "This shows an example of loading the PromptTemplate that is used to format the examples from a separate file. Note that the key changes from `example_prompt` to `example_prompt_path`." ] }, @@ -637,7 +637,7 @@ "id": "c6e3f9fe", "metadata": {}, "source": [ - "## PromptTempalte with OutputParser\n", + "## PromptTemplate with OutputParser\n", "This shows an example of loading a prompt along with an OutputParser from a file." ] }, diff --git a/docs/extras/modules/model_io/prompts/prompt_templates/prompts_pipelining.ipynb b/docs/extras/modules/model_io/prompts/prompt_templates/prompts_pipelining.ipynb index 594a404e5..74316f704 100644 --- a/docs/extras/modules/model_io/prompts/prompt_templates/prompts_pipelining.ipynb +++ b/docs/extras/modules/model_io/prompts/prompt_templates/prompts_pipelining.ipynb @@ -5,9 +5,9 @@ "id": "4de4e022", "metadata": {}, "source": [ - "# Prompt Pipelining\n", + "# Prompt pipelining\n", "\n", - "The idea behind prompt pipelining is to expose a user friendly interface for composing different parts of prompts together. You can do this with either string prompts or chat prompts. Constructing prompts this way allows for easy reuse of components." + "The idea behind prompt pipelining is to provide a user friendly interface for composing different parts of prompts together. You can do this with either string prompts or chat prompts. Constructing prompts this way allows for easy reuse of components." ] }, { @@ -15,26 +15,17 @@ "id": "c3190650", "metadata": {}, "source": [ - "## String Prompt Pipelining\n", + "## String prompt pipelining\n", "\n", "When working with string prompts, each template is joined togther. You can work with either prompts directly or strings (the first element in the list needs to be a prompt)." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "69b17f05", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/harrisonchase/.pyenv/versions/3.9.1/envs/langchain/lib/python3.9/site-packages/deeplake/util/check_latest_version.py:32: UserWarning: A newer version of deeplake (3.6.12) is available. It's recommended that you update to the latest version using `pip install -U deeplake`.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "from langchain.prompts import PromptTemplate" ] @@ -160,7 +151,7 @@ "id": "4e4f6a8a", "metadata": {}, "source": [ - "## Chat Prompt Pipelining" + "## Chat prompt pipelining" ] }, { @@ -173,19 +164,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "2a180f75", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/harrisonchase/.pyenv/versions/3.9.1/envs/langchain/lib/python3.9/site-packages/deeplake/util/check_latest_version.py:32: UserWarning: A newer version of deeplake (3.6.10) is available. It's recommended that you update to the latest version using `pip install -U deeplake`.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate\n", "from langchain.schema import HumanMessage, AIMessage, SystemMessage" @@ -214,8 +196,8 @@ "id": "30656ef8", "metadata": {}, "source": [ - "You can then easily create a pipeline combining it with other messages OR message templates.\n", - "Use a `Message` when there is no variables to be formatted, use a `MessageTemplate` when there are variables to be formatted. You can also use just a string -> note that this will automatically get inferred as a HumanMessagePromptTemplate." + "You can then easily create a pipeline combining it with other messages *or* message templates.\n", + "Use a `Message` when there is no variables to be formatted, use a `MessageTemplate` when there are variables to be formatted. You can also use just a string (note: this will automatically get inferred as a HumanMessagePromptTemplate.)" ] }, { @@ -270,7 +252,7 @@ "id": "850357c0", "metadata": {}, "source": [ - "You can also use it in an LLMChain, just like before" + "You can also use it in an LLMChain, just like before." ] }, { diff --git a/docs/snippets/modules/callbacks/get_started.mdx b/docs/snippets/modules/callbacks/get_started.mdx index 7e4974da9..9596e2a37 100644 --- a/docs/snippets/modules/callbacks/get_started.mdx +++ b/docs/snippets/modules/callbacks/get_started.mdx @@ -130,10 +130,10 @@ chain.run(number=2, callbacks=[handler]) The `callbacks` argument is available on most objects throughout the API (Chains, Models, Tools, Agents, etc.) in two different places: -- **Constructor callbacks**: defined in the constructor, eg. `LLMChain(callbacks=[handler], tags=['a-tag'])`, which will be used for all calls made on that object, and will be scoped to that object only, eg. if you pass a handler to the `LLMChain` constructor, it will not be used by the Model attached to that chain. -- **Request callbacks**: defined in the `run()`/`apply()` methods used for issuing a request, eg. `chain.run(input, callbacks=[handler])`, which will be used for that specific request only, and all sub-requests that it contains (eg. a call to an LLMChain triggers a call to a Model, which uses the same handler passed in the `call()` method). +- **Constructor callbacks**: defined in the constructor, e.g. `LLMChain(callbacks=[handler], tags=['a-tag'])`, which will be used for all calls made on that object, and will be scoped to that object only, e.g. if you pass a handler to the `LLMChain` constructor, it will not be used by the Model attached to that chain. +- **Request callbacks**: defined in the `run()`/`apply()` methods used for issuing a request, e.g. `chain.run(input, callbacks=[handler])`, which will be used for that specific request only, and all sub-requests that it contains (e.g. a call to an LLMChain triggers a call to a Model, which uses the same handler passed in the `call()` method). -The `verbose` argument is available on most objects throughout the API (Chains, Models, Tools, Agents, etc.) as a constructor argument, eg. `LLMChain(verbose=True)`, and it is equivalent to passing a `ConsoleCallbackHandler` to the `callbacks` argument of that object and all child objects. This is useful for debugging, as it will log all events to the console. +The `verbose` argument is available on most objects throughout the API (Chains, Models, Tools, Agents, etc.) as a constructor argument, e.g. `LLMChain(verbose=True)`, and it is equivalent to passing a `ConsoleCallbackHandler` to the `callbacks` argument of that object and all child objects. This is useful for debugging, as it will log all events to the console. ### When do you want to use each of these? diff --git a/docs/snippets/modules/chains/popular/sqlite.mdx b/docs/snippets/modules/chains/popular/sqlite.mdx index 01024a5e4..a709328d1 100644 --- a/docs/snippets/modules/chains/popular/sqlite.mdx +++ b/docs/snippets/modules/chains/popular/sqlite.mdx @@ -628,7 +628,7 @@ local_chain("How many customers are there?") -Even this relatively large model will most likely fail to generate more complicated SQL by itself. However, you can log its inputs and outputs so that you can hand-correct them and use the corrected examples for few shot prompt examples later. In practice, you could log any executions of your chain that raise exceptions (as shown in the example below) or get direct user feedback in cases where the results are incorrect (but did not raise an exception). +Even this relatively large model will most likely fail to generate more complicated SQL by itself. However, you can log its inputs and outputs so that you can hand-correct them and use the corrected examples for few-shot prompt examples later. In practice, you could log any executions of your chain that raise exceptions (as shown in the example below) or get direct user feedback in cases where the results are incorrect (but did not raise an exception). ```bash @@ -878,7 +878,7 @@ YAML_EXAMPLES = """ """ ``` -Now that you have some examples (with manually corrected output SQL), you can do few shot prompt seeding the usual way: +Now that you have some examples (with manually corrected output SQL), you can do few-shot prompt seeding the usual way: ```python @@ -925,7 +925,7 @@ few_shot_prompt = FewShotPromptTemplate( -The model should do better now with this few shot prompt, especially for inputs similar to the examples you have seeded it with. +The model should do better now with this few-shot prompt, especially for inputs similar to the examples you have seeded it with. ```python diff --git a/docs/snippets/modules/data_connection/document_transformers/get_started.mdx b/docs/snippets/modules/data_connection/document_transformers/get_started.mdx index faafa4500..266aa29e5 100644 --- a/docs/snippets/modules/data_connection/document_transformers/get_started.mdx +++ b/docs/snippets/modules/data_connection/document_transformers/get_started.mdx @@ -4,7 +4,7 @@ In addition to controlling which characters you can split on, you can also contr - `length_function`: how the length of chunks is calculated. Defaults to just counting number of characters, but it's pretty common to pass a token counter here. - `chunk_size`: the maximum size of your chunks (as measured by the length function). -- `chunk_overlap`: the maximum overlap between chunks. It can be nice to have some overlap to maintain some continuity between chunks (eg do a sliding window). +- `chunk_overlap`: the maximum overlap between chunks. It can be nice to have some overlap to maintain some continuity between chunks (e.g. do a sliding window). - `add_start_index`: whether to include the starting position of each chunk within the original document in the metadata. diff --git a/docs/snippets/modules/model_io/models/chat/how_to/prompts.mdx b/docs/snippets/modules/model_io/models/chat/how_to/prompts.mdx index b29643512..a02c7b4e2 100644 --- a/docs/snippets/modules/model_io/models/chat/how_to/prompts.mdx +++ b/docs/snippets/modules/model_io/models/chat/how_to/prompts.mdx @@ -34,7 +34,7 @@ chat(chat_prompt.format_prompt(input_language="English", output_language="French -If you wanted to construct the MessagePromptTemplate more directly, you could create a PromptTemplate outside and then pass it in, eg: +If you wanted to construct the MessagePromptTemplate more directly, you could create a PromptTemplate outside and then pass it in, e.g.: ```python diff --git a/docs/snippets/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx b/docs/snippets/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx index e14aafd2f..4e20db3e3 100644 --- a/docs/snippets/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx +++ b/docs/snippets/modules/model_io/prompts/prompt_templates/few_shot_examples.mdx @@ -1,13 +1,13 @@ ### Use Case -In this tutorial, we'll configure few shot examples for self-ask with search. +In this tutorial, we'll configure few-shot examples for self-ask with search. ## Using an example set ### Create the example set -To get started, create a list of few shot examples. Each example should be a dictionary with the keys being the input variables and the values being the values for those input variables. +To get started, create a list of few-shot examples. Each example should be a dictionary with the keys being the input variables and the values being the values for those input variables. ```python from langchain.prompts.few_shot import FewShotPromptTemplate @@ -69,9 +69,9 @@ So the final answer is: No ] ``` -### Create a formatter for the few shot examples +### Create a formatter for the few-shot examples -Configure a formatter that will format the few shot examples into a string. This formatter should be a `PromptTemplate` object. +Configure a formatter that will format the few-shot examples into a string. This formatter should be a `PromptTemplate` object. ```python @@ -98,7 +98,7 @@ print(example_prompt.format(**examples[0])) ### Feed examples and formatter to `FewShotPromptTemplate` -Finally, create a `FewShotPromptTemplate` object. This object takes in the few shot examples and the formatter for the few shot examples. +Finally, create a `FewShotPromptTemplate` object. This object takes in the few-shot examples and the formatter for the few-shot examples. ```python @@ -171,7 +171,7 @@ print(prompt.format(input="Who was the father of Mary Ball Washington?")) We will reuse the example set and the formatter from the previous section. However, instead of feeding the examples directly into the `FewShotPromptTemplate` object, we will feed them into an `ExampleSelector` object. -In this tutorial, we will use the `SemanticSimilarityExampleSelector` class. This class selects few shot examples based on their similarity to the input. It uses an embedding model to compute the similarity between the input and the few shot examples, as well as a vector store to perform the nearest neighbor search. +In this tutorial, we will use the `SemanticSimilarityExampleSelector` class. This class selects few-shot examples based on their similarity to the input. It uses an embedding model to compute the similarity between the input and the few-shot examples, as well as a vector store to perform the nearest neighbor search. ```python @@ -224,7 +224,7 @@ for example in selected_examples: ### Feed example selector into `FewShotPromptTemplate` -Finally, create a `FewShotPromptTemplate` object. This object takes in the example selector and the formatter for the few shot examples. +Finally, create a `FewShotPromptTemplate` object. This object takes in the example selector and the formatter for the few-shot examples. ```python diff --git a/docs/snippets/modules/model_io/prompts/prompt_templates/partial.mdx b/docs/snippets/modules/model_io/prompts/prompt_templates/partial.mdx index b791a220f..120340f37 100644 --- a/docs/snippets/modules/model_io/prompts/prompt_templates/partial.mdx +++ b/docs/snippets/modules/model_io/prompts/prompt_templates/partial.mdx @@ -1,4 +1,4 @@ -## Partial With Strings +## Partial with strings One common use case for wanting to partial a prompt template is if you get some of the variables before others. For example, suppose you have a prompt template that requires two variables, `foo` and `baz`. If you get the `foo` value early on in the chain, but the `baz` value later, it can be annoying to wait until you have both variables in the same place to pass them to the prompt template. Instead, you can partial the prompt template with the `foo` value, and then pass the partialed prompt template along and just use that. Below is an example of doing this: @@ -40,7 +40,7 @@ print(prompt.format(bar="baz")) -## Partial With Functions +## Partial with functions The other common use is to partial with a function. The use case for this is when you have a variable you know that you always want to fetch in a common way. A prime example of this is with date or time. Imagine you have a prompt which you always want to have the current date. You can't hard code it in the prompt, and passing it along with the other input variables is a bit annoying. In this case, it's very handy to be able to partial the prompt with a function that always returns the current date. From 5990651070d82a1f09b6856a54ac6c2540dc48c3 Mon Sep 17 00:00:00 2001 From: Patrick Loeber <50772274+patrickloeber@users.noreply.github.com> Date: Thu, 24 Aug 2023 07:51:19 +0200 Subject: [PATCH 101/143] Add new document_loader: AssemblyAIAudioTranscriptLoader (#9667) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds a new document loader `AssemblyAIAudioTranscriptLoader` that allows to transcribe audio files with the [AssemblyAI API](https://www.assemblyai.com) and loads the transcribed text into documents. - Add new document_loader with class `AssemblyAIAudioTranscriptLoader` - Add optional dependency `assemblyai` - Add unit tests (using a Mock client) - Add docs notebook This is the equivalent to the JS integration already available in LangChain.js. See the [LangChain JS docs AssemblyAI page](https://js.langchain.com/docs/modules/data_connection/document_loaders/integrations/web_loaders/assemblyai_audio_transcription). At its simplest, you can use the loader to get a transcript back from an audio file like this: ```python from langchain.document_loaders.assemblyai import AssemblyAIAudioTranscriptLoader loader = AssemblyAIAudioTranscriptLoader(file_path="./testfile.mp3") docs = loader.load() ``` To use it, it needs the `assemblyai` python package installed, and the environment variable `ASSEMBLYAI_API_KEY` set with your API key. Alternatively, the API key can also be passed as an argument. Twitter handles to shout out if so kindly 🙇 [@AssemblyAI](https://twitter.com/AssemblyAI) and [@patloeber](https://twitter.com/patloeber) --------- Co-authored-by: Bagatur <22008038+baskaryan@users.noreply.github.com> Co-authored-by: Eugene Yurtsev --- .../document_loaders/assemblyai.ipynb | 224 ++++++++++++++++++ .../langchain/document_loaders/__init__.py | 2 + .../langchain/document_loaders/assemblyai.py | 111 +++++++++ libs/langchain/poetry.lock | 104 +++++++- libs/langchain/pyproject.toml | 2 + .../document_loaders/test_assemblyai.py | 50 ++++ 6 files changed, 491 insertions(+), 2 deletions(-) create mode 100644 docs/extras/integrations/document_loaders/assemblyai.ipynb create mode 100644 libs/langchain/langchain/document_loaders/assemblyai.py create mode 100644 libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py diff --git a/docs/extras/integrations/document_loaders/assemblyai.ipynb b/docs/extras/integrations/document_loaders/assemblyai.ipynb new file mode 100644 index 000000000..33fdef929 --- /dev/null +++ b/docs/extras/integrations/document_loaders/assemblyai.ipynb @@ -0,0 +1,224 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AssemblyAI Audio Transcripts\n", + "\n", + "The `AssemblyAIAudioTranscriptLoader` allows to transcribe audio files with the [AssemblyAI API](https://www.assemblyai.com) and loads the transcribed text into documents.\n", + "\n", + "To use it, you should have the `assemblyai` python package installed, and the\n", + "environment variable `ASSEMBLYAI_API_KEY` set with your API key. Alternatively, the API key can also be passed as an argument.\n", + "\n", + "More info about AssemblyAI:\n", + "\n", + "- [Website](https://www.assemblyai.com/)\n", + "- [Get a Free API key](https://www.assemblyai.com/dashboard/signup)\n", + "- [AssemblyAI API Docs](https://www.assemblyai.com/docs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Installation\n", + "\n", + "First, you need to install the `assemblyai` python package.\n", + "\n", + "You can find more info about it inside the [assemblyai-python-sdk GitHub repo](https://github.com/AssemblyAI/assemblyai-python-sdk)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#!pip install assemblyai" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example\n", + "\n", + "The `AssemblyAIAudioTranscriptLoader` needs at least the `file_path` argument. Audio files can be specified as an URL or a local file path." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders.assemblyai import AssemblyAIAudioTranscriptLoader\n", + "\n", + "audio_file = \"https://storage.googleapis.com/aai-docs-samples/nbc.mp3\"\n", + "# or a local file path: audio_file = \"./nbc.mp3\"\n", + "\n", + "loader = AssemblyAIAudioTranscriptLoader(file_path=audio_file)\n", + "\n", + "docs = loader.load()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: Calling `loader.load()` blocks until the transcription is finished." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The transcribed text is available in the `page_content`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "docs[0].page_content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "\"Load time, a new president and new congressional makeup. Same old ...\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `metadata` contains the full JSON response with more meta information:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "docs[0].metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "{'language_code': ,\n", + " 'audio_url': 'https://storage.googleapis.com/aai-docs-samples/nbc.mp3',\n", + " 'punctuate': True,\n", + " 'format_text': True,\n", + " ...\n", + "}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Transcript Formats\n", + "\n", + "You can specify the `transcript_format` argument for different formats.\n", + "\n", + "Depending on the format, one or more documents are returned. These are the different `TranscriptFormat` options:\n", + "\n", + "- `TEXT`: One document with the transcription text\n", + "- `SENTENCES`: Multiple documents, splits the transcription by each sentence\n", + "- `PARAGRAPHS`: Multiple documents, splits the transcription by each paragraph\n", + "- `SUBTITLES_SRT`: One document with the transcript exported in SRT subtitles format\n", + "- `SUBTITLES_VTT`: One document with the transcript exported in VTT subtitles format" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders.assemblyai import (\n", + " AssemblyAIAudioTranscriptLoader,\n", + " TranscriptFormat,\n", + ")\n", + "\n", + "loader = AssemblyAIAudioTranscriptLoader(\n", + " file_path=\"./your_file.mp3\",\n", + " transcript_format=TranscriptFormat.SENTENCES,\n", + ")\n", + "\n", + "docs = loader.load()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Transcription Config\n", + "\n", + "You can also specify the `config` argument to use different audio intelligence models.\n", + "\n", + "Visit the [AssemblyAI API Documentation](https://www.assemblyai.com/docs) to get an overview of all available models!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import assemblyai as aai\n", + "\n", + "config = aai.TranscriptionConfig(speaker_labels=True,\n", + " auto_chapters=True,\n", + " entity_detection=True\n", + ")\n", + "\n", + "loader = AssemblyAIAudioTranscriptLoader(\n", + " file_path=\"./your_file.mp3\",\n", + " config=config\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pass the API Key as argument\n", + "\n", + "Next to setting the API key as environment variable `ASSEMBLYAI_API_KEY`, it is also possible to pass it as argument." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "loader = AssemblyAIAudioTranscriptLoader(\n", + " file_path=\"./your_file.mp3\",\n", + " api_key=\"YOUR_KEY\"\n", + ")" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/libs/langchain/langchain/document_loaders/__init__.py b/libs/langchain/langchain/document_loaders/__init__.py index 30f69659c..ab9d37191 100644 --- a/libs/langchain/langchain/document_loaders/__init__.py +++ b/libs/langchain/langchain/document_loaders/__init__.py @@ -31,6 +31,7 @@ from langchain.document_loaders.airtable import AirtableLoader from langchain.document_loaders.apify_dataset import ApifyDatasetLoader from langchain.document_loaders.arcgis_loader import ArcGISLoader from langchain.document_loaders.arxiv import ArxivLoader +from langchain.document_loaders.assemblyai import AssemblyAIAudioTranscriptLoader from langchain.document_loaders.async_html import AsyncHtmlLoader from langchain.document_loaders.azlyrics import AZLyricsLoader from langchain.document_loaders.azure_blob_storage_container import ( @@ -219,6 +220,7 @@ __all__ = [ "ApifyDatasetLoader", "ArcGISLoader", "ArxivLoader", + "AssemblyAIAudioTranscriptLoader", "AsyncHtmlLoader", "AzureBlobStorageContainerLoader", "AzureBlobStorageFileLoader", diff --git a/libs/langchain/langchain/document_loaders/assemblyai.py b/libs/langchain/langchain/document_loaders/assemblyai.py new file mode 100644 index 000000000..d7b7ecb9b --- /dev/null +++ b/libs/langchain/langchain/document_loaders/assemblyai.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +from enum import Enum +from typing import TYPE_CHECKING, List, Optional + +from langchain.docstore.document import Document +from langchain.document_loaders.base import BaseLoader + +if TYPE_CHECKING: + import assemblyai + + +class TranscriptFormat(Enum): + """Transcript format to use for the document loader.""" + + TEXT = "text" + """One document with the transcription text""" + SENTENCES = "sentences" + """Multiple documents, splits the transcription by each sentence""" + PARAGRAPHS = "paragraphs" + """Multiple documents, splits the transcription by each paragraph""" + SUBTITLES_SRT = "subtitles_srt" + """One document with the transcript exported in SRT subtitles format""" + SUBTITLES_VTT = "subtitles_vtt" + """One document with the transcript exported in VTT subtitles format""" + + +class AssemblyAIAudioTranscriptLoader(BaseLoader): + """ + Loader for AssemblyAI audio transcripts. + + It uses the AssemblyAI API to transcribe audio files + and loads the transcribed text into one or more Documents, + depending on the specified format. + + To use, you should have the ``assemblyai`` python package installed, and the + environment variable ``ASSEMBLYAI_API_KEY`` set with your API key. + Alternatively, the API key can also be passed as an argument. + + Audio files can be specified via an URL or a local file path. + """ + + def __init__( + self, + file_path: str, + *, + transcript_format: TranscriptFormat = TranscriptFormat.TEXT, + config: Optional[assemblyai.TranscriptionConfig] = None, + api_key: Optional[str] = None, + ): + """ + Initializes the AssemblyAI AudioTranscriptLoader. + + Args: + file_path: An URL or a local file path. + transcript_format: Transcript format to use. + See class ``TranscriptFormat`` for more info. + config: Transcription options and features. If ``None`` is given, + the Transcriber's default configuration will be used. + api_key: AssemblyAI API key. + """ + try: + import assemblyai + except ImportError: + raise ImportError( + "Could not import assemblyai python package. " + "Please install it with `pip install assemblyai`." + ) + if api_key is not None: + assemblyai.settings.api_key = api_key + + self.file_path = file_path + self.transcript_format = transcript_format + self.transcriber = assemblyai.Transcriber(config=config) + + def load(self) -> List[Document]: + """Transcribes the audio file and loads the transcript into documents. + + It uses the AssemblyAI API to transcribe the audio file and blocks until + the transcription is finished. + """ + transcript = self.transcriber.transcribe(self.file_path) + # This will raise a ValueError if no API key is set. + + if transcript.error: + raise ValueError(f"Could not transcribe file: {transcript.error}") + + if self.transcript_format == TranscriptFormat.TEXT: + return [ + Document( + page_content=transcript.text, metadata=transcript.json_response + ) + ] + elif self.transcript_format == TranscriptFormat.SENTENCES: + sentences = transcript.get_sentences() + return [ + Document(page_content=s.text, metadata=s.dict(exclude={"text"})) + for s in sentences + ] + elif self.transcript_format == TranscriptFormat.PARAGRAPHS: + paragraphs = transcript.get_paragraphs() + return [ + Document(page_content=p.text, metadata=p.dict(exclude={"text"})) + for p in paragraphs + ] + elif self.transcript_format == TranscriptFormat.SUBTITLES_SRT: + return [Document(page_content=transcript.export_subtitles_srt())] + elif self.transcript_format == TranscriptFormat.SUBTITLES_VTT: + return [Document(page_content=transcript.export_subtitles_vtt())] + else: + raise ValueError("Unknown transcript format.") diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index 3ea9c4734..5b10733d9 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -436,6 +436,26 @@ files = [ [package.dependencies] feedparser = "*" +[[package]] +name = "assemblyai" +version = "0.17.0" +description = "AssemblyAI Python SDK" +optional = true +python-versions = ">=3.8" +files = [ + {file = "assemblyai-0.17.0-py3-none-any.whl", hash = "sha256:3bad8cc7545b5b831f243f1b2f01bc4cc0e8aad78babf44c8008f2293c540e36"}, + {file = "assemblyai-0.17.0.tar.gz", hash = "sha256:6d5bbfbbaa626ed021c3d3dec0ca52b3ebf6e6ef277ac76a7a6aed52182d531e"}, +] + +[package.dependencies] +httpx = ">=0.19.0" +pydantic = ">=1.7.0,<1.10.7 || >1.10.7" +typing-extensions = ">=3.7" +websockets = ">=11.0" + +[package.extras] +extras = ["pyaudio (>=0.2.13)"] + [[package]] name = "asttokens" version = "2.2.1" @@ -3522,6 +3542,7 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] @@ -9857,6 +9878,85 @@ docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = true +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + [[package]] name = "werkzeug" version = "2.3.7" @@ -10338,7 +10438,7 @@ clarifai = ["clarifai"] cohere = ["cohere"] docarray = ["docarray"] embeddings = ["sentence-transformers"] -extended-testing = ["amazon-textract-caller", "atlassian-python-api", "beautifulsoup4", "bibtexparser", "cassio", "chardet", "esprima", "faiss-cpu", "feedparser", "geopandas", "gitpython", "gql", "html2text", "jinja2", "jq", "lxml", "markdownify", "mwparserfromhell", "mwxml", "newspaper3k", "openai", "openai", "openapi-schema-pydantic", "pandas", "pdfminer-six", "pgvector", "psychicapi", "py-trello", "pymupdf", "pypdf", "pypdfium2", "pyspark", "rank-bm25", "rapidfuzz", "requests-toolbelt", "scikit-learn", "streamlit", "sympy", "telethon", "tqdm", "xata", "xmltodict"] +extended-testing = ["amazon-textract-caller", "assemblyai", "atlassian-python-api", "beautifulsoup4", "bibtexparser", "cassio", "chardet", "esprima", "faiss-cpu", "feedparser", "geopandas", "gitpython", "gql", "html2text", "jinja2", "jq", "lxml", "markdownify", "mwparserfromhell", "mwxml", "newspaper3k", "openai", "openai", "openapi-schema-pydantic", "pandas", "pdfminer-six", "pgvector", "psychicapi", "py-trello", "pymupdf", "pypdf", "pypdfium2", "pyspark", "rank-bm25", "rapidfuzz", "requests-toolbelt", "scikit-learn", "streamlit", "sympy", "telethon", "tqdm", "xata", "xmltodict"] javascript = ["esprima"] llms = ["clarifai", "cohere", "huggingface_hub", "manifest-ml", "nlpcloud", "openai", "openlm", "torch", "transformers"] openai = ["openai", "tiktoken"] @@ -10348,4 +10448,4 @@ text-helpers = ["chardet"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "83280a03c352011c2a51081a29aca67bb5c4c23054ad1b7be94f89d6ce52460b" +content-hash = "fd56d0cf338f6efea449244f3e9e719ca6872dd4b3e136ccd67fd82912912cc2" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 296cbae35..60d8afb5a 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -127,6 +127,7 @@ xata = {version = "^1.0.0a7", optional = true} xmltodict = {version = "^0.13.0", optional = true} google-api-core = {version = "^2.11.1", optional = true} markdownify = {version = "^0.11.6", optional = true} +assemblyai = {version = "^0.17.0", optional = true} [tool.poetry.group.test.dependencies] @@ -299,6 +300,7 @@ all = [ # merge-conflicts extended_testing = [ "amazon-textract-caller", + "assemblyai", "beautifulsoup4", "bibtexparser", "cassio", diff --git a/libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py b/libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py new file mode 100644 index 000000000..a9b6112e7 --- /dev/null +++ b/libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py @@ -0,0 +1,50 @@ +import pytest +from pytest_mock import MockerFixture + +from langchain.document_loaders.assemblyai import ( + AssemblyAIAudioTranscriptLoader, + TranscriptFormat, +) + + +@pytest.mark.requires("assemblyai") +def test_initialization() -> None: + loader = AssemblyAIAudioTranscriptLoader( + file_path="./testfile.mp3", api_key="api_key" + ) + assert loader.file_path == "./testfile.mp3" + assert loader.transcript_format == TranscriptFormat.TEXT + + +@pytest.mark.requires("assemblyai") +def test_load(mocker: MockerFixture) -> None: + mocker.patch( + "assemblyai.Transcriber.transcribe", + return_value=mocker.MagicMock( + text="Test transcription text", json_response={"id": "1"}, error=None + ), + ) + + loader = AssemblyAIAudioTranscriptLoader( + file_path="./testfile.mp3", api_key="api_key" + ) + docs = loader.load() + assert len(docs) == 1 + assert docs[0].page_content == "Test transcription text" + assert docs[0].metadata == {"id": "1"} + + +@pytest.mark.requires("assemblyai") +def test_transcription_error(mocker: MockerFixture) -> None: + mocker.patch( + "assemblyai.Transcriber.transcribe", + return_value=mocker.MagicMock(error="Test error"), + ) + + loader = AssemblyAIAudioTranscriptLoader( + file_path="./testfile.mp3", api_key="api_key" + ) + + expected_error = "Could not transcribe file: Test error" + with pytest.raises(ValueError, match=expected_error): + loader.load() From d0ff0db69829bb2324e4cf067b10a98bce5acf64 Mon Sep 17 00:00:00 2001 From: Kim Minjong Date: Thu, 24 Aug 2023 14:58:14 +0900 Subject: [PATCH 102/143] Update ChatOpenAI._stream to respect finish_reason (#9672) Currently, ChatOpenAI._stream does not reflect finish_reason to generation_info. Change it to reflect that. Same patch as https://github.com/langchain-ai/langchain/pull/9431 , but also applies to _stream. --- libs/langchain/langchain/chat_models/openai.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libs/langchain/langchain/chat_models/openai.py b/libs/langchain/langchain/chat_models/openai.py index c2c7880ed..7cb1947cf 100644 --- a/libs/langchain/langchain/chat_models/openai.py +++ b/libs/langchain/langchain/chat_models/openai.py @@ -307,10 +307,16 @@ class ChatOpenAI(BaseChatModel): ): if len(chunk["choices"]) == 0: continue - delta = chunk["choices"][0]["delta"] - chunk = _convert_delta_to_message_chunk(delta, default_chunk_class) + choice = chunk["choices"][0] + chunk = _convert_delta_to_message_chunk( + choice["delta"], default_chunk_class + ) + finish_reason = choice.get("finish_reason") + generation_info = ( + dict(finish_reason=finish_reason) if finish_reason is not None else None + ) default_chunk_class = chunk.__class__ - yield ChatGenerationChunk(message=chunk) + yield ChatGenerationChunk(message=chunk, generation_info=generation_info) if run_manager: run_manager.on_llm_new_token(chunk.content) From c19888c12c826a2e966a5138284821fab27e1586 Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Wed, 23 Aug 2023 23:17:05 -0700 Subject: [PATCH 103/143] :hourglass_flowing_sand: docstrings: `vectorstores` consistency (#9349) :hourglass_flowing_sand: - updated the top-level descriptions to a consistent format; - changed several `ValueError` to `ImportError` in the import cases; - changed the format of several internal functions from "name" to "_name". So, these functions are not shown in the Top-level API Reference page (with lists of classes/functions) --- .../langchain/vectorstores/__init__.py | 28 +++++++++---------- .../vectorstores/_pgvector_data_models.py | 4 +++ .../vectorstores/alibabacloud_opensearch.py | 6 ++-- .../langchain/vectorstores/analyticdb.py | 3 +- .../langchain/langchain/vectorstores/annoy.py | 5 ++-- .../langchain/langchain/vectorstores/atlas.py | 7 +++-- .../langchain/langchain/vectorstores/awadb.py | 5 ++-- .../langchain/vectorstores/azuresearch.py | 5 ++-- .../langchain/vectorstores/bageldb.py | 5 ++-- libs/langchain/langchain/vectorstores/base.py | 6 ++-- .../langchain/vectorstores/cassandra.py | 4 +-- .../langchain/vectorstores/chroma.py | 7 ++--- .../langchain/vectorstores/clarifai.py | 4 +-- .../langchain/vectorstores/clickhouse.py | 8 ++---- .../langchain/vectorstores/dashvector.py | 3 +- .../langchain/vectorstores/deeplake.py | 9 +++--- .../langchain/langchain/vectorstores/dingo.py | 3 +- .../langchain/vectorstores/docarray/base.py | 4 ++- .../langchain/vectorstores/docarray/hnsw.py | 3 +- .../vectorstores/docarray/in_memory.py | 2 +- .../vectorstores/elastic_vector_search.py | 11 ++++---- .../langchain/vectorstores/elasticsearch.py | 13 ++++++--- .../langchain/langchain/vectorstores/faiss.py | 3 +- .../langchain/vectorstores/hologres.py | 5 ++-- .../langchain/vectorstores/lancedb.py | 5 ++-- .../langchain/langchain/vectorstores/marqo.py | 3 +- .../langchain/vectorstores/matching_engine.py | 3 +- .../langchain/vectorstores/meilisearch.py | 3 +- .../langchain/vectorstores/milvus.py | 10 +++---- .../langchain/vectorstores/mongodb_atlas.py | 2 +- .../langchain/vectorstores/myscale.py | 11 ++++---- .../vectorstores/opensearch_vector_search.py | 11 ++++---- .../langchain/vectorstores/pgembedding.py | 12 +++++--- .../langchain/vectorstores/pgvector.py | 5 ++-- .../langchain/vectorstores/pinecone.py | 3 +- .../langchain/vectorstores/qdrant.py | 7 ++--- .../langchain/langchain/vectorstores/redis.py | 8 ++---- .../langchain/vectorstores/rocksetdb.py | 3 +- .../langchain/langchain/vectorstores/scann.py | 5 ++-- .../langchain/vectorstores/singlestoredb.py | 5 +--- .../langchain/vectorstores/sklearn.py | 10 +++---- .../langchain/vectorstores/starrocks.py | 6 ++-- .../langchain/vectorstores/supabase.py | 6 ++-- libs/langchain/langchain/vectorstores/tair.py | 3 +- .../langchain/vectorstores/tigris.py | 6 ++-- .../langchain/vectorstores/typesense.py | 5 ++-- .../langchain/vectorstores/usearch.py | 4 +-- .../langchain/vectorstores/vectara.py | 5 ++-- .../langchain/vectorstores/weaviate.py | 5 ++-- libs/langchain/langchain/vectorstores/xata.py | 8 +++--- libs/langchain/langchain/vectorstores/zep.py | 9 +++--- .../langchain/vectorstores/zilliz.py | 4 +-- 52 files changed, 150 insertions(+), 170 deletions(-) diff --git a/libs/langchain/langchain/vectorstores/__init__.py b/libs/langchain/langchain/vectorstores/__init__.py index d815c5a65..d8e3664e0 100644 --- a/libs/langchain/langchain/vectorstores/__init__.py +++ b/libs/langchain/langchain/vectorstores/__init__.py @@ -78,60 +78,60 @@ __all__ = [ "AlibabaCloudOpenSearchSettings", "AnalyticDB", "Annoy", + "Annoy", + "AtlasDB", "AtlasDB", "AwaDB", "AzureSearch", "Bagel", "Cassandra", "Chroma", + "Chroma", + "Clarifai", "Clickhouse", "ClickhouseSettings", "DashVector", "DeepLake", + "DeepLake", "Dingo", "DocArrayHnswSearch", "DocArrayInMemorySearch", - "ElasticVectorSearch", "ElasticKnnSearch", + "ElasticVectorSearch", "ElasticsearchStore", "Epsilla", "FAISS", - "PGEmbedding", "Hologres", "LanceDB", - "MatchingEngine", "Marqo", + "MatchingEngine", "Meilisearch", "Milvus", - "Zilliz", - "SingleStoreDB", - "Chroma", - "Clarifai", - "OpenSearchVectorSearch", - "AtlasDB", - "DeepLake", - "Annoy", "MongoDBAtlasVectorSearch", "MyScale", "MyScaleSettings", "OpenSearchVectorSearch", + "OpenSearchVectorSearch", + "PGEmbedding", + "PGVector", "Pinecone", "Qdrant", "Redis", "Rockset", - "ScaNN", "SKLearnVectorStore", + "ScaNN", + "SingleStoreDB", "SingleStoreDB", "StarRocks", "SupabaseVectorStore", "Tair", "Tigris", "Typesense", + "USearch", "Vectara", "VectorStore", "Weaviate", "ZepVectorStore", "Zilliz", - "PGVector", - "USearch", + "Zilliz", ] diff --git a/libs/langchain/langchain/vectorstores/_pgvector_data_models.py b/libs/langchain/langchain/vectorstores/_pgvector_data_models.py index f44bd2e35..1a4b60776 100644 --- a/libs/langchain/langchain/vectorstores/_pgvector_data_models.py +++ b/libs/langchain/langchain/vectorstores/_pgvector_data_models.py @@ -9,6 +9,8 @@ from langchain.vectorstores.pgvector import BaseModel class CollectionStore(BaseModel): + """Collection store.""" + __tablename__ = "langchain_pg_collection" name = sqlalchemy.Column(sqlalchemy.String) @@ -48,6 +50,8 @@ class CollectionStore(BaseModel): class EmbeddingStore(BaseModel): + """Embedding store.""" + __tablename__ = "langchain_pg_embedding" collection_id = sqlalchemy.Column( diff --git a/libs/langchain/langchain/vectorstores/alibabacloud_opensearch.py b/libs/langchain/langchain/vectorstores/alibabacloud_opensearch.py index f8cf664cc..672994bc3 100644 --- a/libs/langchain/langchain/vectorstores/alibabacloud_opensearch.py +++ b/libs/langchain/langchain/vectorstores/alibabacloud_opensearch.py @@ -12,7 +12,7 @@ logger = logging.getLogger() class AlibabaCloudOpenSearchSettings: - """Alibaba Cloud Opensearch Client Configuration. + """`Alibaba Cloud Opensearch` client configuration. Attribute: endpoint (str) : The endpoint of opensearch instance, You can find it @@ -90,7 +90,7 @@ def create_metadata(fields: Dict[str, Any]) -> Dict[str, Any]: class AlibabaCloudOpenSearch(VectorStore): - """Alibaba Cloud OpenSearch Vector Store""" + """`Alibaba Cloud OpenSearch` vector store.""" def __init__( self, @@ -102,7 +102,7 @@ class AlibabaCloudOpenSearch(VectorStore): from alibabacloud_ha3engine import client, models from alibabacloud_tea_util import models as util_models except ImportError: - raise ValueError( + raise ImportError( "Could not import alibaba cloud opensearch python package. " "Please install it with `pip install alibabacloud-ha3engine`." ) diff --git a/libs/langchain/langchain/vectorstores/analyticdb.py b/libs/langchain/langchain/vectorstores/analyticdb.py index b565a65a2..22e8dd18a 100644 --- a/libs/langchain/langchain/vectorstores/analyticdb.py +++ b/libs/langchain/langchain/vectorstores/analyticdb.py @@ -1,4 +1,3 @@ -"""VectorStore wrapper around a Postgres/PGVector database.""" from __future__ import annotations import logging @@ -25,7 +24,7 @@ Base = declarative_base() # type: Any class AnalyticDB(VectorStore): - """VectorStore implementation using AnalyticDB. + """`AnalyticDB` (distributed PostgreSQL) vector store. AnalyticDB is a distributed full postgresql syntax cloud-native database. - `connection_string` is a postgres connection string. diff --git a/libs/langchain/langchain/vectorstores/annoy.py b/libs/langchain/langchain/vectorstores/annoy.py index f4b7cecf0..22c569781 100644 --- a/libs/langchain/langchain/vectorstores/annoy.py +++ b/libs/langchain/langchain/vectorstores/annoy.py @@ -1,4 +1,3 @@ -"""Wrapper around Annoy vector database.""" from __future__ import annotations import os @@ -26,7 +25,7 @@ def dependable_annoy_import() -> Any: try: import annoy except ImportError: - raise ValueError( + raise ImportError( "Could not import annoy python package. " "Please install it with `pip install --user annoy` " ) @@ -34,7 +33,7 @@ def dependable_annoy_import() -> Any: class Annoy(VectorStore): - """Wrapper around Annoy vector database. + """`Annoy` vector store. To use, you should have the ``annoy`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/atlas.py b/libs/langchain/langchain/vectorstores/atlas.py index 31bccb6b4..bdc86e17e 100644 --- a/libs/langchain/langchain/vectorstores/atlas.py +++ b/libs/langchain/langchain/vectorstores/atlas.py @@ -1,4 +1,3 @@ -"""Wrapper around Atlas by Nomic.""" from __future__ import annotations import logging @@ -15,7 +14,9 @@ logger = logging.getLogger(__name__) class AtlasDB(VectorStore): - """Wrapper around Atlas: Nomic's neural database and rhizomatic instrument. + """`Atlas` vector store. + + Atlas is the `Nomic's` neural database and `rhizomatic` instrument. To use, you should have the ``nomic`` python package installed. @@ -61,7 +62,7 @@ class AtlasDB(VectorStore): import nomic from nomic import AtlasProject except ImportError: - raise ValueError( + raise ImportError( "Could not import nomic python package. " "Please install it with `pip install nomic`." ) diff --git a/libs/langchain/langchain/vectorstores/awadb.py b/libs/langchain/langchain/vectorstores/awadb.py index 44317b937..7f5daf171 100644 --- a/libs/langchain/langchain/vectorstores/awadb.py +++ b/libs/langchain/langchain/vectorstores/awadb.py @@ -1,4 +1,3 @@ -"""Wrapper around AwaDB for embedding vectors""" from __future__ import annotations import logging @@ -20,7 +19,7 @@ DEFAULT_TOPN = 4 class AwaDB(VectorStore): - """Interface implemented by AwaDB vector stores.""" + """`AwaDB` vector store.""" _DEFAULT_TABLE_NAME = "langchain_awadb" @@ -50,7 +49,7 @@ class AwaDB(VectorStore): try: import awadb except ImportError: - raise ValueError( + raise ImportError( "Could not import awadb python package. " "Please install it with `pip install awadb`." ) diff --git a/libs/langchain/langchain/vectorstores/azuresearch.py b/libs/langchain/langchain/vectorstores/azuresearch.py index 5f2a45e93..32b6d03f1 100644 --- a/libs/langchain/langchain/vectorstores/azuresearch.py +++ b/libs/langchain/langchain/vectorstores/azuresearch.py @@ -1,4 +1,3 @@ -"""Wrapper around Azure Cognitive Search.""" from __future__ import annotations import base64 @@ -177,7 +176,7 @@ def _get_search_client( class AzureSearch(VectorStore): - """Azure Cognitive Search vector store.""" + """`Azure Cognitive Search` vector store.""" def __init__( self, @@ -526,7 +525,7 @@ class AzureSearch(VectorStore): class AzureSearchVectorStoreRetriever(BaseRetriever): - """Retriever that uses Azure Search to find similar documents.""" + """Retriever that uses `Azure Cognitive Search`.""" vectorstore: AzureSearch """Azure Search instance used to find similar documents.""" diff --git a/libs/langchain/langchain/vectorstores/bageldb.py b/libs/langchain/langchain/vectorstores/bageldb.py index ab0e7868c..5b4590933 100644 --- a/libs/langchain/langchain/vectorstores/bageldb.py +++ b/libs/langchain/langchain/vectorstores/bageldb.py @@ -1,4 +1,3 @@ -"""BagelDB integration""" from __future__ import annotations import uuid @@ -43,7 +42,7 @@ def _results_to_docs_and_scores(results: Any) -> List[Tuple[Document, float]]: class Bagel(VectorStore): - """Wrapper around BagelDB.ai vector store. + """``BagelDB.ai`` vector store. To use, you should have the ``betabageldb`` python package installed. @@ -70,7 +69,7 @@ class Bagel(VectorStore): import bagel import bagel.config except ImportError: - raise ValueError("Please install bagel `pip install betabageldb`.") + raise ImportError("Please install bagel `pip install betabageldb`.") if client is not None: self._client_settings = client_settings self._client = client diff --git a/libs/langchain/langchain/vectorstores/base.py b/libs/langchain/langchain/vectorstores/base.py index 5bc624add..2c9ce74ee 100644 --- a/libs/langchain/langchain/vectorstores/base.py +++ b/libs/langchain/langchain/vectorstores/base.py @@ -1,5 +1,3 @@ -"""Interface for vector stores.""" - from __future__ import annotations import asyncio @@ -37,7 +35,7 @@ VST = TypeVar("VST", bound="VectorStore") class VectorStore(ABC): - """Interface for vector stores.""" + """Interface for vector store.""" @abstractmethod def add_texts( @@ -520,7 +518,7 @@ class VectorStore(ABC): class VectorStoreRetriever(BaseRetriever): - """Retriever class for VectorStore.""" + """Base Retriever class for VectorStore.""" vectorstore: VectorStore """VectorStore to use for retrieval.""" diff --git a/libs/langchain/langchain/vectorstores/cassandra.py b/libs/langchain/langchain/vectorstores/cassandra.py index d844a89e1..cc6541b5f 100644 --- a/libs/langchain/langchain/vectorstores/cassandra.py +++ b/libs/langchain/langchain/vectorstores/cassandra.py @@ -1,4 +1,3 @@ -"""Wrapper around Cassandra vector-store capabilities, based on cassIO.""" from __future__ import annotations import typing @@ -19,8 +18,9 @@ CVST = TypeVar("CVST", bound="Cassandra") class Cassandra(VectorStore): - """Wrapper around Cassandra embeddings platform. + """`Cassandra` vector store. + It based on the Cassandra vector-store capabilities, based on cassIO. There is no notion of a default table name, since each embedding function implies its own vector dimension, which is part of the schema. diff --git a/libs/langchain/langchain/vectorstores/chroma.py b/libs/langchain/langchain/vectorstores/chroma.py index 9457419c5..76469357a 100644 --- a/libs/langchain/langchain/vectorstores/chroma.py +++ b/libs/langchain/langchain/vectorstores/chroma.py @@ -1,4 +1,3 @@ -"""Wrapper around ChromaDB embeddings platform.""" from __future__ import annotations import logging @@ -50,7 +49,7 @@ def _results_to_docs_and_scores(results: Any) -> List[Tuple[Document, float]]: class Chroma(VectorStore): - """Wrapper around ChromaDB embeddings platform. + """`ChromaDB` vector store. To use, you should have the ``chromadb`` python package installed. @@ -76,12 +75,12 @@ class Chroma(VectorStore): client: Optional[chromadb.Client] = None, relevance_score_fn: Optional[Callable[[float], float]] = None, ) -> None: - """Initialize with Chroma client.""" + """Initialize with a Chroma client.""" try: import chromadb import chromadb.config except ImportError: - raise ValueError( + raise ImportError( "Could not import chromadb python package. " "Please install it with `pip install chromadb`." ) diff --git a/libs/langchain/langchain/vectorstores/clarifai.py b/libs/langchain/langchain/vectorstores/clarifai.py index 9db4408b2..51d01118f 100644 --- a/libs/langchain/langchain/vectorstores/clarifai.py +++ b/libs/langchain/langchain/vectorstores/clarifai.py @@ -16,7 +16,7 @@ logger = logging.getLogger(__name__) class Clarifai(VectorStore): - """Wrapper around Clarifai AI platform's vector store. + """`Clarifai AI` vector store. To use, you should have the ``clarifai`` python package installed. @@ -55,7 +55,7 @@ class Clarifai(VectorStore): from clarifai.auth.helper import DEFAULT_BASE, ClarifaiAuthHelper from clarifai.client import create_stub except ImportError: - raise ValueError( + raise ImportError( "Could not import clarifai python package. " "Please install it with `pip install clarifai`." ) diff --git a/libs/langchain/langchain/vectorstores/clickhouse.py b/libs/langchain/langchain/vectorstores/clickhouse.py index c0916ec44..68de42963 100644 --- a/libs/langchain/langchain/vectorstores/clickhouse.py +++ b/libs/langchain/langchain/vectorstores/clickhouse.py @@ -1,5 +1,3 @@ -"""Wrapper around open source ClickHouse VectorSearch capability.""" - from __future__ import annotations import json @@ -33,7 +31,7 @@ def has_mul_sub_str(s: str, *args: Any) -> bool: class ClickhouseSettings(BaseSettings): - """ClickHouse Client Configuration + """`ClickHouse` client configuration. Attribute: clickhouse_host (str) : An URL to connect to MyScale backend. @@ -101,7 +99,7 @@ class ClickhouseSettings(BaseSettings): class Clickhouse(VectorStore): - """Wrapper around ClickHouse vector database + """`ClickHouse VectorSearch` vector store. You need a `clickhouse-connect` python package, and a valid account to connect to ClickHouse. @@ -130,7 +128,7 @@ class Clickhouse(VectorStore): try: from clickhouse_connect import get_client except ImportError: - raise ValueError( + raise ImportError( "Could not import clickhouse connect python package. " "Please install it with `pip install clickhouse-connect`." ) diff --git a/libs/langchain/langchain/vectorstores/dashvector.py b/libs/langchain/langchain/vectorstores/dashvector.py index 714c76c00..f3559384a 100644 --- a/libs/langchain/langchain/vectorstores/dashvector.py +++ b/libs/langchain/langchain/vectorstores/dashvector.py @@ -1,4 +1,3 @@ -"""Wrapper around DashVector vector database.""" from __future__ import annotations import logging @@ -23,7 +22,7 @@ logger = logging.getLogger(__name__) class DashVector(VectorStore): - """Wrapper around DashVector vector database. + """`DashVector` vector store. To use, you should have the ``dashvector`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/deeplake.py b/libs/langchain/langchain/vectorstores/deeplake.py index c04d71ace..ed7601832 100644 --- a/libs/langchain/langchain/vectorstores/deeplake.py +++ b/libs/langchain/langchain/vectorstores/deeplake.py @@ -1,4 +1,3 @@ -"""Wrapper around Activeloop Deep Lake.""" from __future__ import annotations import logging @@ -24,9 +23,9 @@ logger = logging.getLogger(__name__) class DeepLake(VectorStore): - """Wrapper around Deep Lake, a data lake for deep learning applications. + """`Activeloop Deep Lake` vector store. - We integrated deeplake's similarity search and filtering for fast prototyping, + We integrated deeplake's similarity search and filtering for fast prototyping. Now, it supports Tensor Query Language (TQL) for production use cases over billion rows. @@ -126,7 +125,7 @@ class DeepLake(VectorStore): self.verbose = verbose if _DEEPLAKE_INSTALLED is False: - raise ValueError( + raise ImportError( "Could not import deeplake python package. " "Please install it with `pip install deeplake[enterprise]`." ) @@ -135,7 +134,7 @@ class DeepLake(VectorStore): kwargs.get("runtime") == {"tensor_db": True} and version_compare(deeplake.__version__, "3.6.7") == -1 ): - raise ValueError( + raise ImportError( "To use tensor_db option you need to update deeplake to `3.6.7`. " f"Currently installed deeplake version is {deeplake.__version__}. " ) diff --git a/libs/langchain/langchain/vectorstores/dingo.py b/libs/langchain/langchain/vectorstores/dingo.py index 44765cdd3..e6d3419c7 100644 --- a/libs/langchain/langchain/vectorstores/dingo.py +++ b/libs/langchain/langchain/vectorstores/dingo.py @@ -1,4 +1,3 @@ -"""Wrapper around the Dingo vector database.""" from __future__ import annotations import logging @@ -16,7 +15,7 @@ logger = logging.getLogger(__name__) class Dingo(VectorStore): - """Wrapper around Dingo vector database. + """`Dingo` vector store. To use, you should have the ``dingodb`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/docarray/base.py b/libs/langchain/langchain/vectorstores/docarray/base.py index 2e693bcde..d3b048610 100644 --- a/libs/langchain/langchain/vectorstores/docarray/base.py +++ b/libs/langchain/langchain/vectorstores/docarray/base.py @@ -33,6 +33,8 @@ def _check_docarray_import() -> None: class DocArrayIndex(VectorStore, ABC): + """Base class for `DocArray` based vector stores.""" + def __init__( self, doc_index: "BaseDocIndex", @@ -67,7 +69,7 @@ class DocArrayIndex(VectorStore, ABC): metadatas: Optional[List[dict]] = None, **kwargs: Any, ) -> List[str]: - """Run more texts through the embeddings and add to the vectorstore. + """Embed texts and add to the vector store. Args: texts: Iterable of strings to add to the vectorstore. diff --git a/libs/langchain/langchain/vectorstores/docarray/hnsw.py b/libs/langchain/langchain/vectorstores/docarray/hnsw.py index 26ed4afac..e1fdc6f07 100644 --- a/libs/langchain/langchain/vectorstores/docarray/hnsw.py +++ b/libs/langchain/langchain/vectorstores/docarray/hnsw.py @@ -1,4 +1,3 @@ -"""Wrapper around Hnswlib store.""" from __future__ import annotations from typing import Any, List, Literal, Optional @@ -11,7 +10,7 @@ from langchain.vectorstores.docarray.base import ( class DocArrayHnswSearch(DocArrayIndex): - """Wrapper around HnswLib storage. + """`HnswLib` storage using `DocArray` package. To use it, you should have the ``docarray`` package with version >=0.32.0 installed. You can install it with `pip install "langchain[docarray]"`. diff --git a/libs/langchain/langchain/vectorstores/docarray/in_memory.py b/libs/langchain/langchain/vectorstores/docarray/in_memory.py index 77570c0b0..9c3b3dcf3 100644 --- a/libs/langchain/langchain/vectorstores/docarray/in_memory.py +++ b/libs/langchain/langchain/vectorstores/docarray/in_memory.py @@ -11,7 +11,7 @@ from langchain.vectorstores.docarray.base import ( class DocArrayInMemorySearch(DocArrayIndex): - """Wrapper around in-memory storage for exact search. + """In-memory `DocArray` storage for exact search. To use it, you should have the ``docarray`` package with version >=0.32.0 installed. You can install it with `pip install "langchain[docarray]"`. diff --git a/libs/langchain/langchain/vectorstores/elastic_vector_search.py b/libs/langchain/langchain/vectorstores/elastic_vector_search.py index f3b8c37e0..978da1d5c 100644 --- a/libs/langchain/langchain/vectorstores/elastic_vector_search.py +++ b/libs/langchain/langchain/vectorstores/elastic_vector_search.py @@ -53,9 +53,9 @@ def _default_script_query(query_vector: List[float], filter: Optional[dict]) -> @deprecated("0.0.265", alternative="ElasticsearchStore class.", pending=True) class ElasticVectorSearch(VectorStore): - """Wrapper around Elasticsearch as a vector database. + """[DEPRECATED] `Elasticsearch` vector store. - To connect to an Elasticsearch instance that does not require + To connect to an `Elasticsearch` instance that does not require login credentials, pass the Elasticsearch URL and index name along with the embedding object to the constructor. @@ -340,11 +340,10 @@ class ElasticVectorSearch(VectorStore): class ElasticKnnSearch(VectorStore): - """ - ElasticKnnSearch is a class for performing k-nearest neighbor - (k-NN) searches on text data using Elasticsearch. + """[DEPRECATED] `Elasticsearch` with k-nearest neighbor search + (`k-NN`) vector store. - This class is used to create an Elasticsearch index of text data that + It creates an Elasticsearch index of text data that can be searched using k-NN search. The text data is transformed into vector embeddings using a provided embedding model, and these embeddings are stored in the Elasticsearch index. diff --git a/libs/langchain/langchain/vectorstores/elasticsearch.py b/libs/langchain/langchain/vectorstores/elasticsearch.py index 27f0ef307..d2dd7f768 100644 --- a/libs/langchain/langchain/vectorstores/elasticsearch.py +++ b/libs/langchain/langchain/vectorstores/elasticsearch.py @@ -1,5 +1,3 @@ -"""Wrapper around Elasticsearch vector database.""" - import logging import uuid from abc import ABC, abstractmethod @@ -28,6 +26,8 @@ logger = logging.getLogger(__name__) class BaseRetrievalStrategy(ABC): + """Base class for `Elasticsearch` retrieval strategies.""" + @abstractmethod def query( self, @@ -109,6 +109,8 @@ class BaseRetrievalStrategy(ABC): class ApproxRetrievalStrategy(BaseRetrievalStrategy): + """Approximate retrieval strategy using the `HNSW` algorithm.""" + def __init__( self, query_model_id: Optional[str] = None, @@ -211,6 +213,8 @@ class ApproxRetrievalStrategy(BaseRetrievalStrategy): class ExactRetrievalStrategy(BaseRetrievalStrategy): + """Exact retrieval strategy using the `script_score` query.""" + def query( self, query_vector: Union[List[float], None], @@ -276,6 +280,8 @@ class ExactRetrievalStrategy(BaseRetrievalStrategy): class SparseRetrievalStrategy(BaseRetrievalStrategy): + """Sparse retrieval strategy using the `text_expansion` processor.""" + def __init__(self, model_id: Optional[str] = None): self.model_id = model_id or ".elser_model_1" @@ -355,8 +361,7 @@ class SparseRetrievalStrategy(BaseRetrievalStrategy): class ElasticsearchStore(VectorStore): - - """Wrapper around Elasticsearch search database. + """`Elasticsearch` vector store. Example: .. code-block:: python diff --git a/libs/langchain/langchain/vectorstores/faiss.py b/libs/langchain/langchain/vectorstores/faiss.py index 7e9cb109e..a8c835e5c 100644 --- a/libs/langchain/langchain/vectorstores/faiss.py +++ b/libs/langchain/langchain/vectorstores/faiss.py @@ -1,4 +1,3 @@ -"""Wrapper around FAISS vector database.""" from __future__ import annotations import operator @@ -65,7 +64,7 @@ def _len_check_if_sized(x: Any, y: Any, x_name: str, y_name: str) -> None: class FAISS(VectorStore): - """Wrapper around FAISS vector database. + """`Meta Faiss` vector store. To use, you must have the ``faiss`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/hologres.py b/libs/langchain/langchain/vectorstores/hologres.py index 092dc24c3..ce816e8f9 100644 --- a/libs/langchain/langchain/vectorstores/hologres.py +++ b/libs/langchain/langchain/vectorstores/hologres.py @@ -1,4 +1,3 @@ -"""VectorStore wrapper around a Hologres database.""" from __future__ import annotations import json @@ -16,7 +15,7 @@ _LANGCHAIN_DEFAULT_TABLE_NAME = "langchain_pg_embedding" class HologresWrapper: - """Wrapper around Hologres service.""" + """`Hologres API` wrapper.""" def __init__(self, connection_string: str, ndims: int, table_name: str) -> None: """Initialize the wrapper. @@ -114,7 +113,7 @@ document text);""" class Hologres(VectorStore): - """VectorStore implementation using Hologres. + """`Hologres API` vector store. - `connection_string` is a hologres connection string. - `embedding_function` any embedding function implementing diff --git a/libs/langchain/langchain/vectorstores/lancedb.py b/libs/langchain/langchain/vectorstores/lancedb.py index 2b29f92c7..1a166d4e1 100644 --- a/libs/langchain/langchain/vectorstores/lancedb.py +++ b/libs/langchain/langchain/vectorstores/lancedb.py @@ -1,4 +1,3 @@ -"""Wrapper around LanceDB vector database""" from __future__ import annotations import uuid @@ -10,7 +9,7 @@ from langchain.vectorstores.base import VectorStore class LanceDB(VectorStore): - """Wrapper around LanceDB vector database. + """`LanceDB` vector store. To use, you should have ``lancedb`` python package installed. @@ -36,7 +35,7 @@ class LanceDB(VectorStore): try: import lancedb except ImportError: - raise ValueError( + raise ImportError( "Could not import lancedb python package. " "Please install it with `pip install lancedb`." ) diff --git a/libs/langchain/langchain/vectorstores/marqo.py b/libs/langchain/langchain/vectorstores/marqo.py index 0d1dfe048..b18731e08 100644 --- a/libs/langchain/langchain/vectorstores/marqo.py +++ b/libs/langchain/langchain/vectorstores/marqo.py @@ -1,4 +1,3 @@ -"""Wrapper around weaviate vector database.""" from __future__ import annotations import json @@ -25,7 +24,7 @@ if TYPE_CHECKING: class Marqo(VectorStore): - """Wrapper around Marqo database. + """`Marqo` vector store. Marqo indexes have their own models associated with them to generate your embeddings. This means that you can selected from a range of different models diff --git a/libs/langchain/langchain/vectorstores/matching_engine.py b/libs/langchain/langchain/vectorstores/matching_engine.py index 9d8c55ed4..2bf27af64 100644 --- a/libs/langchain/langchain/vectorstores/matching_engine.py +++ b/libs/langchain/langchain/vectorstores/matching_engine.py @@ -1,4 +1,3 @@ -"""Vertex Matching Engine implementation of the vector store.""" from __future__ import annotations import json @@ -21,7 +20,7 @@ logger = logging.getLogger() class MatchingEngine(VectorStore): - """Vertex Matching Engine implementation of the vector store. + """`Google Vertex AI Matching Engine` vector store. While the embeddings are stored in the Matching Engine, the embedded documents will be stored in GCS. diff --git a/libs/langchain/langchain/vectorstores/meilisearch.py b/libs/langchain/langchain/vectorstores/meilisearch.py index 313ae6816..05ffb9700 100644 --- a/libs/langchain/langchain/vectorstores/meilisearch.py +++ b/libs/langchain/langchain/vectorstores/meilisearch.py @@ -1,4 +1,3 @@ -"""Wrapper around Meilisearch vector database.""" from __future__ import annotations import uuid @@ -45,7 +44,7 @@ def _create_client( class Meilisearch(VectorStore): - """Initialize wrapper around Meilisearch vector database. + """`Meilisearch` vector store. To use this, you need to have `meilisearch` python package installed, and a running Meilisearch instance. diff --git a/libs/langchain/langchain/vectorstores/milvus.py b/libs/langchain/langchain/vectorstores/milvus.py index c6a5301ff..e5ee2a015 100644 --- a/libs/langchain/langchain/vectorstores/milvus.py +++ b/libs/langchain/langchain/vectorstores/milvus.py @@ -1,4 +1,3 @@ -"""Wrapper around the Milvus vector database.""" from __future__ import annotations import logging @@ -24,19 +23,18 @@ DEFAULT_MILVUS_CONNECTION = { class Milvus(VectorStore): - """Initialize wrapper around the milvus vector database. + """`Milvus` vector store. - In order to use this you need to have `pymilvus` installed and a - running Milvus + You need to install `pymilvus` and run Milvus. See the following documentation for how to run a Milvus instance: https://milvus.io/docs/install_standalone-docker.md If looking for a hosted Milvus, take a look at this documentation: https://zilliz.com/cloud and make use of the Zilliz vectorstore found in - this project, + this project. - IF USING L2/IP metric IT IS HIGHLY SUGGESTED TO NORMALIZE YOUR DATA. + IF USING L2/IP metric, IT IS HIGHLY SUGGESTED TO NORMALIZE YOUR DATA. Args: embedding_function (Embeddings): Function used to embed the text. diff --git a/libs/langchain/langchain/vectorstores/mongodb_atlas.py b/libs/langchain/langchain/vectorstores/mongodb_atlas.py index b7cd5136d..3476c0eb5 100644 --- a/libs/langchain/langchain/vectorstores/mongodb_atlas.py +++ b/libs/langchain/langchain/vectorstores/mongodb_atlas.py @@ -32,7 +32,7 @@ DEFAULT_INSERT_BATCH_SIZE = 100 class MongoDBAtlasVectorSearch(VectorStore): - """Wrapper around MongoDB Atlas Vector Search. + """`MongoDB Atlas Vector Search` vector store. To use, you should have both: - the ``pymongo`` python package installed diff --git a/libs/langchain/langchain/vectorstores/myscale.py b/libs/langchain/langchain/vectorstores/myscale.py index ef4db34ea..3c4361fcd 100644 --- a/libs/langchain/langchain/vectorstores/myscale.py +++ b/libs/langchain/langchain/vectorstores/myscale.py @@ -1,4 +1,3 @@ -"""Wrapper around MyScale vector database.""" from __future__ import annotations import json @@ -32,7 +31,7 @@ def has_mul_sub_str(s: str, *args: Any) -> bool: class MyScaleSettings(BaseSettings): - """MyScale Client Configuration + """MyScale client configuration. Attribute: myscale_host (str) : An URL to connect to MyScale backend. @@ -93,13 +92,13 @@ class MyScaleSettings(BaseSettings): class MyScale(VectorStore): - """Wrapper around MyScale vector database + """`MyScale` vector store. You need a `clickhouse-connect` python package, and a valid account to connect to MyScale. - MyScale can not only search with simple vector indexes, - it also supports complex query with multiple conditions, + MyScale can not only search with simple vector indexes. + It also supports a complex query with multiple conditions, constraints and even sub-queries. For more information, please visit @@ -122,7 +121,7 @@ class MyScale(VectorStore): try: from clickhouse_connect import get_client except ImportError: - raise ValueError( + raise ImportError( "Could not import clickhouse connect python package. " "Please install it with `pip install clickhouse-connect`." ) diff --git a/libs/langchain/langchain/vectorstores/opensearch_vector_search.py b/libs/langchain/langchain/vectorstores/opensearch_vector_search.py index 8e84835df..ddc2e72ac 100644 --- a/libs/langchain/langchain/vectorstores/opensearch_vector_search.py +++ b/libs/langchain/langchain/vectorstores/opensearch_vector_search.py @@ -1,4 +1,3 @@ -"""Wrapper around OpenSearch vector database.""" from __future__ import annotations import uuid @@ -26,7 +25,7 @@ def _import_opensearch() -> Any: try: from opensearchpy import OpenSearch except ImportError: - raise ValueError(IMPORT_OPENSEARCH_PY_ERROR) + raise ImportError(IMPORT_OPENSEARCH_PY_ERROR) return OpenSearch @@ -35,7 +34,7 @@ def _import_bulk() -> Any: try: from opensearchpy.helpers import bulk except ImportError: - raise ValueError(IMPORT_OPENSEARCH_PY_ERROR) + raise ImportError(IMPORT_OPENSEARCH_PY_ERROR) return bulk @@ -44,7 +43,7 @@ def _import_not_found_error() -> Any: try: from opensearchpy.exceptions import NotFoundError except ImportError: - raise ValueError(IMPORT_OPENSEARCH_PY_ERROR) + raise ImportError(IMPORT_OPENSEARCH_PY_ERROR) return NotFoundError @@ -54,7 +53,7 @@ def _get_opensearch_client(opensearch_url: str, **kwargs: Any) -> Any: opensearch = _import_opensearch() client = opensearch(opensearch_url, **kwargs) except ValueError as e: - raise ValueError( + raise ImportError( f"OpenSearch client string provided is not in proper format. " f"Got error: {e} " ) @@ -315,7 +314,7 @@ def _get_kwargs_value(kwargs: Any, key: str, default_value: Any) -> Any: class OpenSearchVectorSearch(VectorStore): - """Wrapper around OpenSearch as a vector database. + """`Amazon OpenSearch Vector Engine` vector store. Example: .. code-block:: python diff --git a/libs/langchain/langchain/vectorstores/pgembedding.py b/libs/langchain/langchain/vectorstores/pgembedding.py index 4c820636c..ecdb20a8f 100644 --- a/libs/langchain/langchain/vectorstores/pgembedding.py +++ b/libs/langchain/langchain/vectorstores/pgembedding.py @@ -1,4 +1,3 @@ -"""VectorStore wrapper around a Postgres database.""" from __future__ import annotations import logging @@ -23,11 +22,15 @@ _LANGCHAIN_DEFAULT_COLLECTION_NAME = "langchain" class BaseModel(Base): + """Base model for all SQL stores.""" + __abstract__ = True uuid = sqlalchemy.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) class CollectionStore(BaseModel): + """Collection store.""" + __tablename__ = "langchain_pg_collection" name = sqlalchemy.Column(sqlalchemy.String) @@ -67,6 +70,8 @@ class CollectionStore(BaseModel): class EmbeddingStore(BaseModel): + """Embedding store.""" + __tablename__ = "langchain_pg_embedding" collection_id = sqlalchemy.Column( @@ -87,15 +92,14 @@ class EmbeddingStore(BaseModel): class QueryResult: - """QueryResult is a result from a query.""" + """Result from a query.""" EmbeddingStore: EmbeddingStore distance: float class PGEmbedding(VectorStore): - """ - VectorStore implementation using Postgres and the pg_embedding extension. + """`Postgres` with the `pg_embedding` extension as a vector store. pg_embedding uses sequential scan by default. but you can create a HNSW index using the create_hnsw_index method. diff --git a/libs/langchain/langchain/vectorstores/pgvector.py b/libs/langchain/langchain/vectorstores/pgvector.py index 9581bdc3b..a86a88cb1 100644 --- a/libs/langchain/langchain/vectorstores/pgvector.py +++ b/libs/langchain/langchain/vectorstores/pgvector.py @@ -1,4 +1,3 @@ -"""VectorStore wrapper around a Postgres/PGVector database.""" from __future__ import annotations import enum @@ -46,12 +45,14 @@ _LANGCHAIN_DEFAULT_COLLECTION_NAME = "langchain" class BaseModel(Base): + """Base model for the SQL stores.""" + __abstract__ = True uuid = sqlalchemy.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) class PGVector(VectorStore): - """VectorStore implementation using Postgres and pgvector. + """`Postgres`/`PGVector` vector store. To use, you should have the ``pgvector`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/pinecone.py b/libs/langchain/langchain/vectorstores/pinecone.py index 6ecf0b291..c6793b4de 100644 --- a/libs/langchain/langchain/vectorstores/pinecone.py +++ b/libs/langchain/langchain/vectorstores/pinecone.py @@ -1,4 +1,3 @@ -"""Wrapper around Pinecone vector database.""" from __future__ import annotations import logging @@ -17,7 +16,7 @@ logger = logging.getLogger(__name__) class Pinecone(VectorStore): - """Wrapper around Pinecone vector database. + """`Pinecone` vector store. To use, you should have the ``pinecone-client`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/qdrant.py b/libs/langchain/langchain/vectorstores/qdrant.py index f18b2cc91..7b9d9869c 100644 --- a/libs/langchain/langchain/vectorstores/qdrant.py +++ b/libs/langchain/langchain/vectorstores/qdrant.py @@ -1,4 +1,3 @@ -"""Wrapper around Qdrant vector database.""" from __future__ import annotations import asyncio @@ -40,7 +39,7 @@ if TYPE_CHECKING: class QdrantException(Exception): - """Base class for all the Qdrant related exceptions""" + """`Qdrant` related exceptions.""" def sync_call_fallback(method: Callable) -> Callable: @@ -68,7 +67,7 @@ def sync_call_fallback(method: Callable) -> Callable: class Qdrant(VectorStore): - """Wrapper around Qdrant vector database. + """`Qdrant` vector store. To use you should have the ``qdrant-client`` package installed. @@ -102,7 +101,7 @@ class Qdrant(VectorStore): try: import qdrant_client except ImportError: - raise ValueError( + raise ImportError( "Could not import qdrant-client python package. " "Please install it with `pip install qdrant-client`." ) diff --git a/libs/langchain/langchain/vectorstores/redis.py b/libs/langchain/langchain/vectorstores/redis.py index 198e5d706..56429bea8 100644 --- a/libs/langchain/langchain/vectorstores/redis.py +++ b/libs/langchain/langchain/vectorstores/redis.py @@ -1,5 +1,3 @@ -"""Wrapper around Redis vector database.""" - from __future__ import annotations import json @@ -96,7 +94,7 @@ def _default_relevance_score(val: float) -> float: class Redis(VectorStore): - """Wrapper around Redis vector database. + """`Redis` vector store. To use, you should have the ``redis`` python package installed. @@ -184,7 +182,7 @@ class Redis(VectorStore): from redis.commands.search.field import TextField, VectorField from redis.commands.search.indexDefinition import IndexDefinition, IndexType except ImportError: - raise ValueError( + raise ImportError( "Could not import redis python package. " "Please install it with `pip install redis`." ) @@ -612,7 +610,7 @@ class Redis(VectorStore): class RedisVectorStoreRetriever(VectorStoreRetriever): - """Retriever for Redis VectorStore.""" + """Retriever for `Redis` vector store.""" vectorstore: Redis """Redis VectorStore.""" diff --git a/libs/langchain/langchain/vectorstores/rocksetdb.py b/libs/langchain/langchain/vectorstores/rocksetdb.py index 5b2fc234a..674473774 100644 --- a/libs/langchain/langchain/vectorstores/rocksetdb.py +++ b/libs/langchain/langchain/vectorstores/rocksetdb.py @@ -1,4 +1,3 @@ -"""Wrapper around Rockset vector database.""" from __future__ import annotations import logging @@ -13,7 +12,7 @@ logger = logging.getLogger(__name__) class Rockset(VectorStore): - """Wrapper arpund Rockset vector database. + """`Rockset` vector store. To use, you should have the `rockset` python package installed. Note that to use this, the collection being used must already exist in your Rockset instance. diff --git a/libs/langchain/langchain/vectorstores/scann.py b/libs/langchain/langchain/vectorstores/scann.py index a1ce4af48..434080e7e 100644 --- a/libs/langchain/langchain/vectorstores/scann.py +++ b/libs/langchain/langchain/vectorstores/scann.py @@ -1,4 +1,3 @@ -"""Wrapper around ScaNN vector database.""" from __future__ import annotations import operator @@ -25,7 +24,7 @@ def normalize(x: np.ndarray) -> np.ndarray: def dependable_scann_import() -> Any: """ - Import scann if available, otherwise raise error. + Import `scann` if available, otherwise raise error. """ try: import scann @@ -38,7 +37,7 @@ def dependable_scann_import() -> Any: class ScaNN(VectorStore): - """Wrapper around ScaNN vector database. + """`ScaNN` vector store. To use, you should have the ``scann`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/singlestoredb.py b/libs/langchain/langchain/vectorstores/singlestoredb.py index 7c05778c8..983f3f7f0 100644 --- a/libs/langchain/langchain/vectorstores/singlestoredb.py +++ b/libs/langchain/langchain/vectorstores/singlestoredb.py @@ -1,5 +1,3 @@ -"""Wrapper around SingleStore DB.""" - from __future__ import annotations import json @@ -35,8 +33,7 @@ ORDERING_DIRECTIVE: dict = { class SingleStoreDB(VectorStore): - """ - This class serves as a Pythonic interface to the SingleStore DB database. + """`SingleStore DB` vector store. The prerequisite for using this class is the installation of the ``singlestoredb`` Python package. diff --git a/libs/langchain/langchain/vectorstores/sklearn.py b/libs/langchain/langchain/vectorstores/sklearn.py index dcc6237c2..d4f49c965 100644 --- a/libs/langchain/langchain/vectorstores/sklearn.py +++ b/libs/langchain/langchain/vectorstores/sklearn.py @@ -21,7 +21,7 @@ DEFAULT_FETCH_K = 20 # Number of Documents to initially fetch during MMR search class BaseSerializer(ABC): - """Abstract base class for saving and loading data.""" + """Base class for serializing data.""" def __init__(self, persist_path: str) -> None: self.persist_path = persist_path @@ -57,7 +57,7 @@ class JsonSerializer(BaseSerializer): class BsonSerializer(BaseSerializer): - """Serializes data in binary json using the bson python package.""" + """Serializes data in binary json using the `bson` python package.""" def __init__(self, persist_path: str) -> None: super().__init__(persist_path) @@ -77,7 +77,7 @@ class BsonSerializer(BaseSerializer): class ParquetSerializer(BaseSerializer): - """Serializes data in Apache Parquet format using the pyarrow package.""" + """Serializes data in `Apache Parquet` format using the `pyarrow` package.""" def __init__(self, persist_path: str) -> None: super().__init__(persist_path) @@ -125,8 +125,8 @@ class SKLearnVectorStoreException(RuntimeError): class SKLearnVectorStore(VectorStore): - """A simple in-memory vector store based on the scikit-learn library - NearestNeighbors implementation.""" + """Simple in-memory vector store based on the `scikit-learn` library + `NearestNeighbors` implementation.""" def __init__( self, diff --git a/libs/langchain/langchain/vectorstores/starrocks.py b/libs/langchain/langchain/vectorstores/starrocks.py index d6abc40af..a172d1bbb 100644 --- a/libs/langchain/langchain/vectorstores/starrocks.py +++ b/libs/langchain/langchain/vectorstores/starrocks.py @@ -1,5 +1,3 @@ -"""Wrapper around open source StarRocks VectorSearch capability.""" - from __future__ import annotations import json @@ -69,7 +67,7 @@ def get_named_result(connection: Any, query: str) -> List[dict[str, Any]]: class StarRocksSettings(BaseSettings): - """StarRocks Client Configuration + """StarRocks client configuration. Attribute: StarRocks_host (str) : An URL to connect to MyScale backend. @@ -121,7 +119,7 @@ class StarRocksSettings(BaseSettings): class StarRocks(VectorStore): - """Wrapper around StarRocks vector database + """`StarRocks` vector store. You need a `pymysql` python package, and a valid account to connect to StarRocks. diff --git a/libs/langchain/langchain/vectorstores/supabase.py b/libs/langchain/langchain/vectorstores/supabase.py index a0f918309..d91196534 100644 --- a/libs/langchain/langchain/vectorstores/supabase.py +++ b/libs/langchain/langchain/vectorstores/supabase.py @@ -26,7 +26,9 @@ if TYPE_CHECKING: class SupabaseVectorStore(VectorStore): - """VectorStore for a Supabase postgres database. Assumes you have the `pgvector` + """`Supabase Postgres` vector store. + + It assumes you have the `pgvector` extension installed and a `match_documents` (or similar) function. For more details: https://integrations.langchain.com/vectorstores?integration_name=SupabaseVectorStore @@ -92,7 +94,7 @@ class SupabaseVectorStore(VectorStore): try: import supabase # noqa: F401 except ImportError: - raise ValueError( + raise ImportError( "Could not import supabase python package. " "Please install it with `pip install supabase`." ) diff --git a/libs/langchain/langchain/vectorstores/tair.py b/libs/langchain/langchain/vectorstores/tair.py index 26108da59..e55ea4283 100644 --- a/libs/langchain/langchain/vectorstores/tair.py +++ b/libs/langchain/langchain/vectorstores/tair.py @@ -1,4 +1,3 @@ -"""Wrapper around Tair Vector.""" from __future__ import annotations import json @@ -19,7 +18,7 @@ def _uuid_key() -> str: class Tair(VectorStore): - """Wrapper around Tair Vector store.""" + """`Tair` vector store.""" def __init__( self, diff --git a/libs/langchain/langchain/vectorstores/tigris.py b/libs/langchain/langchain/vectorstores/tigris.py index 036103999..6abbfe676 100644 --- a/libs/langchain/langchain/vectorstores/tigris.py +++ b/libs/langchain/langchain/vectorstores/tigris.py @@ -15,12 +15,14 @@ if TYPE_CHECKING: class Tigris(VectorStore): + """`Tigris` vector store.""" + def __init__(self, client: TigrisClient, embeddings: Embeddings, index_name: str): - """Initialize Tigris vector store""" + """Initialize Tigris vector store.""" try: import tigrisdb # noqa: F401 except ImportError: - raise ValueError( + raise ImportError( "Could not import tigrisdb python package. " "Please install it with `pip install tigrisdb`" ) diff --git a/libs/langchain/langchain/vectorstores/typesense.py b/libs/langchain/langchain/vectorstores/typesense.py index a35b2cf0c..cdaaa5155 100644 --- a/libs/langchain/langchain/vectorstores/typesense.py +++ b/libs/langchain/langchain/vectorstores/typesense.py @@ -1,4 +1,3 @@ -"""Wrapper around Typesense vector search""" from __future__ import annotations import uuid @@ -15,7 +14,7 @@ if TYPE_CHECKING: class Typesense(VectorStore): - """Wrapper around Typesense vector search. + """`Typesense` vector store. To use, you should have the ``typesense`` python package installed. @@ -61,7 +60,7 @@ class Typesense(VectorStore): try: from typesense import Client except ImportError: - raise ValueError( + raise ImportError( "Could not import typesense python package. " "Please install it with `pip install typesense`." ) diff --git a/libs/langchain/langchain/vectorstores/usearch.py b/libs/langchain/langchain/vectorstores/usearch.py index 1d0e754e1..cb4e8c6eb 100644 --- a/libs/langchain/langchain/vectorstores/usearch.py +++ b/libs/langchain/langchain/vectorstores/usearch.py @@ -1,4 +1,3 @@ -"""Wrapper around USearch vector database.""" from __future__ import annotations from typing import Any, Dict, Iterable, List, Optional, Tuple @@ -27,7 +26,8 @@ def dependable_usearch_import() -> Any: class USearch(VectorStore): - """Wrapper around USearch vector database. + """`USearch` vector store. + To use, you should have the ``usearch`` python package installed. """ diff --git a/libs/langchain/langchain/vectorstores/vectara.py b/libs/langchain/langchain/vectorstores/vectara.py index cd8ee9c9f..eee2f1abe 100644 --- a/libs/langchain/langchain/vectorstores/vectara.py +++ b/libs/langchain/langchain/vectorstores/vectara.py @@ -1,4 +1,3 @@ -"""Wrapper around Vectara vector database.""" from __future__ import annotations import json @@ -18,7 +17,7 @@ logger = logging.getLogger(__name__) class Vectara(VectorStore): - """Implementation of Vector Store using Vectara. + """`Vectara API` vector store. See (https://vectara.com). @@ -426,7 +425,7 @@ class Vectara(VectorStore): class VectaraRetriever(VectorStoreRetriever): - """Retriever class for Vectara.""" + """Retriever class for `Vectara`.""" vectorstore: Vectara """Vectara vectorstore.""" diff --git a/libs/langchain/langchain/vectorstores/weaviate.py b/libs/langchain/langchain/vectorstores/weaviate.py index 0f54801f9..5f09a785d 100644 --- a/libs/langchain/langchain/vectorstores/weaviate.py +++ b/libs/langchain/langchain/vectorstores/weaviate.py @@ -1,4 +1,3 @@ -"""Wrapper around weaviate vector database.""" from __future__ import annotations import datetime @@ -44,7 +43,7 @@ def _create_weaviate_client(**kwargs: Any) -> Any: try: import weaviate except ImportError: - raise ValueError( + raise ImportError( "Could not import weaviate python package. " "Please install it with `pip install weaviate-client`" ) @@ -70,7 +69,7 @@ def _json_serializable(value: Any) -> Any: class Weaviate(VectorStore): - """Wrapper around Weaviate vector database. + """`Weaviate` vector store. To use, you should have the ``weaviate-client`` python package installed. diff --git a/libs/langchain/langchain/vectorstores/xata.py b/libs/langchain/langchain/vectorstores/xata.py index ef25bc1a6..441fee825 100644 --- a/libs/langchain/langchain/vectorstores/xata.py +++ b/libs/langchain/langchain/vectorstores/xata.py @@ -1,5 +1,3 @@ -"""Wrapper around Xata as a vector database.""" - from __future__ import annotations import time @@ -12,7 +10,9 @@ from langchain.vectorstores.base import VectorStore class XataVectorStore(VectorStore): - """VectorStore for a Xata database. Assumes you have a Xata database + """`Xata` vector store. + + It assumes you have a Xata database created with the right schema. See the guide at: https://integrations.langchain.com/vectorstores?integration_name=XataVectorStore @@ -29,7 +29,7 @@ class XataVectorStore(VectorStore): try: from xata.client import XataClient # noqa: F401 except ImportError: - raise ValueError( + raise ImportError( "Could not import xata python package. " "Please install it with `pip install xata`." ) diff --git a/libs/langchain/langchain/vectorstores/zep.py b/libs/langchain/langchain/vectorstores/zep.py index faf04a139..98593ec91 100644 --- a/libs/langchain/langchain/vectorstores/zep.py +++ b/libs/langchain/langchain/vectorstores/zep.py @@ -22,8 +22,7 @@ logger = logging.getLogger() @dataclass class CollectionConfig: - """ - A configuration class for a Zep Collection. + """Configuration for a `Zep Collection`. If the collection does not exist, it will be created. @@ -46,9 +45,9 @@ class CollectionConfig: class ZepVectorStore(VectorStore): - """ - ZepVectorStore is a VectorStore implementation that uses the Zep long-term memory - store as a backend. It provides methods for adding texts or documents to the store, + """`Zep` vector store. + + It provides methods for adding texts or documents to the store, searching for similar documents, and deleting documents. Search scores are calculated using cosine similarity normalized to [0, 1]. diff --git a/libs/langchain/langchain/vectorstores/zilliz.py b/libs/langchain/langchain/vectorstores/zilliz.py index 835a03a74..8a571aca3 100644 --- a/libs/langchain/langchain/vectorstores/zilliz.py +++ b/libs/langchain/langchain/vectorstores/zilliz.py @@ -10,9 +10,9 @@ logger = logging.getLogger(__name__) class Zilliz(Milvus): - """Initialize wrapper around the Zilliz vector database. + """`Zilliz` vector store. - In order to use this you need to have `pymilvus` installed and a + You need to have `pymilvus` installed and a running Zilliz database. See the following documentation for how to run a Zilliz instance: From b048236c1a01d2bbcdb5c5c689246a69f13e51a9 Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Wed, 23 Aug 2023 23:17:47 -0700 Subject: [PATCH 104/143] =?UTF-8?q?=F0=9F=93=96=20docs:=20`integrations/ag?= =?UTF-8?q?ent=5Ftoolkits`=20=20(#9333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: There are no changes in the file names! - The group name on the main navbar changed: `Agent toolkits` -> `Agents & Toolkits`. Examples here are the mix of the Agent and Toolkit examples because Agents and Toolkits in examples are always used together. - Titles changed: removed "Agent" and "Toolkit" suffixes. The reason is the same. - Formatting: mostly cleaning the header structure, so it could be better on the right-side navbar. Main navbar is looking much cleaner now. --- .../integrations/toolkits/amadeus.ipynb | 9 +- .../toolkits/azure_cognitive_services.ipynb | 8 +- docs/extras/integrations/toolkits/csv.ipynb | 28 ++-- .../document_comparison_toolkit.ipynb | 26 +--- .../extras/integrations/toolkits/github.ipynb | 26 ++-- docs/extras/integrations/toolkits/gmail.ipynb | 6 +- docs/extras/integrations/toolkits/index.mdx | 5 +- docs/extras/integrations/toolkits/jira.ipynb | 74 +++++---- docs/extras/integrations/toolkits/json.ipynb | 7 +- .../integrations/toolkits/multion.ipynb | 10 +- .../integrations/toolkits/office365.ipynb | 9 +- .../integrations/toolkits/openapi.ipynb | 14 +- .../integrations/toolkits/openapi_nla.ipynb | 8 +- .../extras/integrations/toolkits/pandas.ipynb | 14 +- .../integrations/toolkits/playwright.ipynb | 22 +-- .../integrations/toolkits/powerbi.ipynb | 146 +++++++++--------- .../extras/integrations/toolkits/python.ipynb | 12 +- docs/extras/integrations/toolkits/spark.ipynb | 19 ++- .../integrations/toolkits/spark_sql.ipynb | 31 ++-- .../integrations/toolkits/sql_database.ipynb | 21 +-- .../integrations/toolkits/vectorstore.ipynb | 12 +- .../integrations/toolkits/xorbits.ipynb | 8 +- 22 files changed, 248 insertions(+), 267 deletions(-) diff --git a/docs/extras/integrations/toolkits/amadeus.ipynb b/docs/extras/integrations/toolkits/amadeus.ipynb index afcaaccfb..baa9288dc 100644 --- a/docs/extras/integrations/toolkits/amadeus.ipynb +++ b/docs/extras/integrations/toolkits/amadeus.ipynb @@ -1,13 +1,12 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Amadeus Toolkit\n", + "# Amadeus\n", "\n", - "This notebook walks you through connecting LangChain to the Amadeus travel information API\n", + "This notebook walks you through connecting LangChain to the `Amadeus` travel information API\n", "\n", "To use this toolkit, you will need to set up your credentials explained in the [Amadeus for developers getting started overview](https://developers.amadeus.com/get-started/get-started-with-self-service-apis-335). Once you've received a AMADEUS_CLIENT_ID and AMADEUS_CLIENT_SECRET, you can input them as environmental variables below." ] @@ -22,7 +21,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -46,7 +44,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -234,7 +231,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/azure_cognitive_services.ipynb b/docs/extras/integrations/toolkits/azure_cognitive_services.ipynb index 669519ba2..609cc2e4e 100644 --- a/docs/extras/integrations/toolkits/azure_cognitive_services.ipynb +++ b/docs/extras/integrations/toolkits/azure_cognitive_services.ipynb @@ -4,9 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Azure Cognitive Services Toolkit\n", + "# Azure Cognitive Services\n", "\n", - "This toolkit is used to interact with the Azure Cognitive Services API to achieve some multimodal capabilities.\n", + "This toolkit is used to interact with the `Azure Cognitive Services API` to achieve some multimodal capabilities.\n", "\n", "Currently There are four tools bundled in this toolkit:\n", "- AzureCogsImageAnalysisTool: used to extract caption, objects, tags, and text from images. (Note: this tool is not available on Mac OS yet, due to the dependency on `azure-ai-vision` package, which is only supported on Windows and Linux currently.)\n", @@ -264,9 +264,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/extras/integrations/toolkits/csv.ipynb b/docs/extras/integrations/toolkits/csv.ipynb index 5a0ff426a..d64484d8e 100644 --- a/docs/extras/integrations/toolkits/csv.ipynb +++ b/docs/extras/integrations/toolkits/csv.ipynb @@ -5,24 +5,14 @@ "id": "7094e328", "metadata": {}, "source": [ - "# CSV Agent\n", + "# CSV\n", "\n", - "This notebook shows how to use agents to interact with a csv. It is mostly optimized for question answering.\n", + "This notebook shows how to use agents to interact with data in `CSV` format. It is mostly optimized for question answering.\n", "\n", "**NOTE: this agent calls the Pandas DataFrame agent under the hood, which in turn calls the Python agent, which executes LLM generated Python code - this can be bad if the LLM generated Python code is harmful. Use cautiously.**\n", "\n" ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "827982c7", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.agents import create_csv_agent" - ] - }, { "cell_type": "code", "execution_count": 2, @@ -32,7 +22,9 @@ "source": [ "from langchain.llms import OpenAI\n", "from langchain.chat_models import ChatOpenAI\n", - "from langchain.agents.agent_types import AgentType" + "from langchain.agents.agent_types import AgentType\n", + "\n", + "from langchain.agents import create_csv_agent" ] }, { @@ -40,9 +32,9 @@ "id": "bd806175", "metadata": {}, "source": [ - "## Using ZERO_SHOT_REACT_DESCRIPTION\n", + "## Using `ZERO_SHOT_REACT_DESCRIPTION`\n", "\n", - "This shows how to initialize the agent using the ZERO_SHOT_REACT_DESCRIPTION agent type. Note that this is an alternative to the above." + "This shows how to initialize the agent using the `ZERO_SHOT_REACT_DESCRIPTION` agent type. Note that this is an alternative to the above." ] }, { @@ -130,9 +122,7 @@ "cell_type": "code", "execution_count": 5, "id": "a96309be", - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stderr", @@ -305,7 +295,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/document_comparison_toolkit.ipynb b/docs/extras/integrations/toolkits/document_comparison_toolkit.ipynb index 5dbe07551..7e79d0c36 100644 --- a/docs/extras/integrations/toolkits/document_comparison_toolkit.ipynb +++ b/docs/extras/integrations/toolkits/document_comparison_toolkit.ipynb @@ -91,9 +91,7 @@ "cell_type": "code", "execution_count": 4, "id": "c4d56c25", - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -169,9 +167,7 @@ "cell_type": "code", "execution_count": 6, "id": "6db4c853", - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -235,13 +231,7 @@ " \"prompts\": [\n", " \"System: Use the following pieces of context to answer the users question. \\nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\\n----------------\\nAlphabet Inc.\\nCONSOLIDATED STATEMENTS OF INCOME\\n(In millions, except per share amounts, unaudited)\\nQuarter Ended March 31,\\n2022 2023\\nRevenues $ 68,011 $ 69,787 \\nCosts and expenses:\\nCost of revenues 29,599 30,612 \\nResearch and development 9,119 11,468 \\nSales and marketing 5,825 6,533 \\nGeneral and administrative 3,374 3,759 \\nTotal costs and expenses 47,917 52,372 \\nIncome from operations 20,094 17,415 \\nOther income (expense), net (1,160) 790 \\nIncome before income taxes 18,934 18,205 \\nProvision for income taxes 2,498 3,154 \\nNet income $ 16,436 $ 15,051 \\nBasic earnings per share of Class A, Class B, and Class C stock $ 1.24 $ 1.18 \\nDiluted earnings per share of Class A, Class B, and Class C stock $ 1.23 $ 1.17 \\nNumber of shares used in basic earnings per share calculation 13,203 12,781 \\nNumber of shares used in diluted earnings per share calculation 13,351 12,823 \\n6\\n\\nAlphabet Announces First Quarter 2023 Results\\nMOUNTAIN VIEW, Calif. – April 25, 2023 – Alphabet Inc. (NASDAQ: GOOG, GOOGL) today announced financial \\nresults for the quarter ended March 31, 2023 .\\nSundar Pichai, CEO of Alphabet and Google, said: “We are pleased with our business performance in the first \\nquarter, with Search performing well and momentum in Cloud. We introduced important product updates anchored \\nin deep computer science and AI. Our North Star is providing the most helpful answers for our users, and we see \\nhuge opportunities ahead, continuing our long track record of innovation.”\\nRuth Porat, CFO of Alphabet and Google, said: “Resilience in Search and momentum in Cloud resulted in Q1 \\nconsolidated revenues of $69.8 billion, up 3% year over year, or up 6% in constant currency. We remain committed \\nto delivering long-term growth and creating capacity to invest in our most compelling growth areas by re-engineering \\nour cost base.”\\nQ1 2023 financial highlights (unaudited)\\nOur first quarter 2023 results reflect:\\ni.$2.6 billion in charges related to reductions in our workforce and office space; \\nii.a $988 million reduction in depreciation expense from the change in estimated useful life of our servers and \\ncertain network equipment; and\\niii.a shift in the timing of our annual employee stock-based compensation awards resulting in relatively less \\nstock-based compensation expense recognized in the first quarter compared to the remaining quarters of \\nthe ye ar. The shift in timing itself will not affect the amount of stock-based compensation expense over the \\nfull fiscal year 2023.\\nFor further information, please refer to our blog post also filed with the SEC via Form 8-K on April 20, 2023.\\nThe following table summarizes our consolidated financial results for the quarters ended March 31, 2022 and 2023 \\n(in millions, except for per share information and percentages). \\nQuarter Ended March 31,\\n2022 2023\\nRevenues $ 68,011 $ 69,787 \\nChange in revenues year over year 23 % 3 %\\nChange in constant currency revenues year over year(1) 26 % 6 %\\nOperating income $ 20,094 $ 17,415 \\nOperating margin 30 % 25 %\\nOther income (expense), net $ (1,160) $ 790 \\nNet income $ 16,436 $ 15,051 \\nDiluted EPS $ 1.23 $ 1.17 \\n(1) Non-GAAP measure. See the table captioned “Reconciliation from GAAP revenues to non-GAAP constant currency \\nrevenues and GAAP percentage change in revenues to non-GAAP percentage change in constant currency revenues” for \\nmore details.\\n\\nQ1 2023 supplemental information (in millions, except for number of employees; unaudited)\\nRevenues, T raffic Acquisition Costs (TAC), and number of employees\\nQuarter Ended March 31,\\n2022 2023\\nGoogle Search & other $ 39,618 $ 40,359 \\nYouTube ads 6,869 6,693 \\nGoogle Network 8,174 7,496 \\nGoogle advertising 54,661 54,548 \\nGoogle other 6,811 7,413 \\nGoogle Services total 61,472 61,961 \\nGoogle Cloud 5,821 7,454 \\nOther Bets 440 288 \\nHedging gains (losses) 278 84 \\nTotal revenues $ 68,011 $ 69,787 \\nTotal TAC $ 11,990 $ 11,721 \\nNumber of employees(1) 163,906 190,711 \\n(1) As of March 31, 2023, the number of employees includes almost all of the employees affected by the reduction of our \\nworkforce. We expect most of those affected will no longer be reflected in our headcount by the end of the second quarter \\nof 2023, subject to local law and consultation requirements.\\nSegment Operating Results\\nReflecting DeepMind’s increasing collaboration with Google Services, Google Cloud, and Other Bets, beginning in \\nthe first quarter of 2023 DeepMind is reported as part of Alphabet’s unallocated corporate costs instead of within \\nOther Bets. Additionally, beginning in the first quarter of 2023, we updated and simplified our cost allocation \\nmethodologies to provide our business leaders with increased transparency for decision-making . Prior periods have \\nbeen recast to reflect the revised presentation and are shown in Recast Historical Segment Results below .\\nAs announced on April 20, 2023 , we are bringing together part of Google Research (the Brain Team) and DeepMind \\nto significantly accelerate our progress in AI. This change does not affect first quarter reporting. The group, called \\nGoogle DeepMind, will be reported within Alphabet's unallocated corporate costs beginning in the second quarter of \\n2023.\\nQuarter Ended March 31,\\n2022 2023\\n(recast)\\nOperating income (loss):\\nGoogle Services $ 21,973 $ 21,737 \\nGoogle Cloud (706) 191 \\nOther Bets (835) (1,225) \\nCorporate costs, unallocated(1) (338) (3,288) \\nTotal income from operations $ 20,094 $ 17,415 \\n(1)Hedging gains (losses) related to revenue included in unallocated corporate costs were $278 million and $84 million for the \\nthree months ended March 31, 2022 and 2023 , respectively. For the three months ended March 31, 2023, unallocated \\ncorporate costs include charges related to the reductions in our workforce and office space totaling $2.5 billion . \\n2\\n\\nSegment results\\nThe following table presents our segment revenues and operating income (loss) (in millions; unaudited):\\nQuarter Ended March 31,\\n2022 2023\\n(recast)\\nRevenues:\\nGoogle Services $ 61,472 $ 61,961 \\nGoogle Cloud 5,821 7,454 \\nOther Bets 440 288 \\nHedging gains (losses) 278 84 \\nTotal revenues $ 68,011 $ 69,787 \\nOperating income (loss):\\nGoogle Services $ 21,973 $ 21,737 \\nGoogle Cloud (706) 191 \\nOther Bets (835) (1,225) \\nCorporate costs, unallocated (338) (3,288) \\nTotal income from operations $ 20,094 $ 17,415 \\nWe report our segment results as Google Services, Google Cloud, and Other Bets:\\n•Google Services includes products and services such as ads, Android, Chrome, hardware, Google Maps, \\nGoogle Play, Search, and YouTube. Google Services generates revenues primarily from advertising; sales \\nof apps and in-app purchases, and hardware; and fees received for subscription-based products such as \\nYouTube Premium and YouTube TV.\\n•Google Cloud includes infrastructure and platform services, collaboration tools, and other services for \\nenterprise customers. Google Cloud generates revenues from fees received for Google Cloud Platform \\nservices, Google Workspace communication and collaboration tools, and other enterprise services.\\n•Other Bets is a combination of multiple operating segments that are not individually material. Revenues \\nfrom Other Bets are generated primarily from the sale of health technology and internet services.\\nAfter the segment reporting changes discussed above, unallocated corporate costs primarily include AI-focused \\nshared R&D activities; corporate initiatives such as our philanthropic activities; and corporate shared costs such as \\nfinance, certain human resource costs, and legal, including certain fines and settlements. In the first quarter of 2023, \\nunallocated corporate costs also include charges associated with reductions in our workforce and office space. \\nAdditionally, hedging gains (losses) related to revenue are included in unallocated corporate costs.\\nRecast Historical Segment Results\\nRecast historical segment results are as follows (in millions; unaudited):\\nQuarter Fiscal Year\\nRecast Historical Results\\nQ1 2022 Q2 2022 Q3 2022 Q4 2022 2021 2022\\nOperating income (loss):\\nGoogle Services $ 21,973 $ 21,621 $ 18,883 $ 20,222 $ 88,132 $ 82,699 \\nGoogle Cloud (706) (590) (440) (186) (2,282) (1,922) \\nOther Bets (835) (1,339) (1,225) (1,237) (4,051) (4,636) \\nCorporate costs, unallocated(1) (338) (239) (83) (639) (3,085) (1,299) \\nTotal income from operations $ 20,094 $ 19,453 $ 17,135 $ 18,160 $ 78,714 $ 74,842 \\n(1)Includes hedging gains (losses); in fiscal years 2021 and 2022 hedging gains of $149 million and $2.0 billion, respectively.\\n8\\nHuman: What was Alphabet's revenue?\"\n", " ]\n", - "}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "}\n", "\u001b[36;1m\u001b[1;3m[llm/end]\u001b[0m \u001b[1m[1:chain:AgentExecutor > 3:tool:alphabet-earnings > 4:chain:RetrievalQA > 5:chain:StuffDocumentsChain > 6:chain:LLMChain > 7:llm:ChatOpenAI] [1.61s] Exiting LLM run with output:\n", "\u001b[0m{\n", " \"generations\": [\n", @@ -299,13 +289,7 @@ " \"prompts\": [\n", " \"System: Use the following pieces of context to answer the users question. \\nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\\n----------------\\nS U M M A R Y H I G H L I G H T S \\n(1) Excludes SBC (stock -based compensation).\\n(2) Free cash flow = operating cash flow less capex.\\n(3) Includes cash, cash equivalents and investments.Profitability 11.4% operating margin in Q1\\n$2.7B GAAP operating income in Q1\\n$2.5B GAAP net income in Q1\\n$2.9B non -GAAP net income1in Q1In the current macroeconomic environment, we see this year as a unique \\nopportunity for Tesla. As many carmakers are working through challenges with the \\nunit economics of their EV programs, we aim to leverage our position as a cost \\nleader. We are focused on rapidly growing production, investments in autonomy \\nand vehicle software, and remaining on track with our growth investments.\\nOur near -term pricing strategy considers a long -term view on per vehicle \\nprofitability given the potential lifetime value of a Tesla vehicle through autonomy, \\nsupercharging, connectivity and service. We expect that our product pricing will \\ncontinue to evolve, upwards or downwards, depending on a number of factors.\\nAlthough we implemented price reductions on many vehicle models across regions \\nin the first quarter, our operating margins reduced at a manageable rate. We \\nexpect ongoing cost reduction of our vehicles, including improved production \\nefficiency at our newest factories and lower logistics costs, and remain focused on \\noperating leverage as we scale.\\nWe are rapidly growing energy storage production capacity at our Megafactory in \\nLathrop and we recently announced a new Megafactory in Shanghai. We are also \\ncontinuing to execute on our product roadmap, including Cybertruck, our next \\ngeneration vehicle platform, autonomy and other AI enabled products. \\nOur balance sheet and net income enable us to continue to make these capital \\nexpenditures in line with our future growth. In this environment, we believe it \\nmakes sense to push forward to ensure we lay a proper foundation for the best \\npossible future.Cash Operating cash flow of $2.5B\\nFree cash flow2of $0.4B in Q1\\n$0.2B increase in our cash and investments3in Q1 to $22.4B\\nOperations Cybertruck factory tooling on track; producing Alpha versions\\nModel Y was the best -selling vehicle in Europe in Q1\\nModel Y was the best -selling vehicle in the US in Q1 (ex -pickups)\\n\\n01234O T H E R H I G H L I G H T S\\n9Services & Other gross margin\\nEnergy Storage deployments (GWh)Energy Storage\\nEnergy storage deployments increased by 360% YoY in Q1 to 3.9 GWh, the highest \\nlevel of deployments we have achieved due to ongoing Megafactory ramp. The ramp of our 40 GWh Megapack factory in Lathrop, California has been successful with still more room to reach full capacity. This Megapack factory will be the first of many. We recently announced our second 40 GWh Megafactory, this time in Shanghai, with construction starting later this year. \\nSolar\\nSolar deployments increased by 40% YoY in Q1 to 67 MW, but declined sequentially in \\nthe quarter, predominantly due to volatile weather and other factors. In addition, the solar industry has been impacted by supply chain challenges.\\nServices and Other\\nBoth revenue and gross profit from Services and Other reached an all -time high in Q1 \\n2023. Within this business division, growth of used vehicle sales remained strong YoY and had healthy margins. Supercharging, while still a relatively small part of the business, continued to grow as we gradually open up the network to non- Tesla \\nvehicles. \\n-4%-2%0%2%4%6%8%\\nQ3'21 Q4'21 Q1'22 Q2'22 Q3'22 Q4'22 Q1'23\\n\\nIn millions of USD or shares as applicable, except per share data Q1-2022 Q2-2022 Q3-2022 Q4-2022 Q1-2023\\nREVENUES\\nAutomotive sales 15,514 13,670 17,785 20,241 18,878 \\nAutomotive regulatory credits 679 344 286 467 521 \\nAutomotive leasing 668 588 621 599 564 \\nTotal automotive revenues 16,861 14,602 18,692 21,307 19,963 \\nEnergy generation and storage 616 866 1,117 1,310 1,529 \\nServices and other 1,279 1,466 1,645 1,701 1,837 \\nTotal revenues 18,756 16,934 21,454 24,318 23,329 \\nCOST OF REVENUES\\nAutomotive sales 10,914 10,153 13,099 15,433 15,422 \\nAutomotive leasing 408 368 381 352 333 \\nTotal automotive cost of revenues 11,322 10,521 13,480 15,785 15,755 \\nEnergy generation and storage 688 769 1,013 1,151 1,361 \\nServices and other 1,286 1,410 1,579 1,605 1,702 \\nTotal cost of revenues 13,296 12,700 16,072 18,541 18,818 \\nGross profit 5,460 4,234 5,382 5,777 4,511 \\nOPERATING EXPENSES\\nResearch and development 865 667 733 810 771 \\nSelling, general and administrative 992 961 961 1,032 1,076 \\nRestructuring and other — 142 — 34 —\\nTotal operating expenses 1,857 1,770 1,694 1,876 1,847 \\nINCOME FROM OPERATIONS 3,603 2,464 3,688 3,901 2,664 \\nInterest income 28 26 86 157 213 \\nInterest expense (61) (44) (53) (33) (29)\\nOther income (expense), net 56 28 (85) (42) (48)\\nINCOME BEFORE INCOME TAXES 3,626 2,474 3,636 3,983 2,800 \\nProvision for income taxes 346 205 305 276 261 \\nNET INCOME 3,280 2,269 3,331 3,707 2,539 \\nNet (loss) income attributable to noncontrolling interests and redeemable noncontrolling interests in \\nsubsidiaries(38) 10 39 20 26 \\nNET INCOME ATTRIBUTABLE TO COMMON STOCKHOLDERS 3,318 2,259 3,292 3,687 2,513 \\nNet income per share of common stock attributable to common stockholders(1)\\nBasic $ 1.07 $ 0.73 $ 1.05 $ 1.18 $ 0.80 \\nDiluted $ 0.95 $ 0.65 $ 0.95 $ 1.07 $ 0.73 \\nWeighted average shares used in computing net income per share of common stock(1)\\nBasic 3,103 3,111 3,146 3,160 3,166\\nDiluted 3,472 3,464 3,468 3,471 3,468\\nS T A T E M E N T O F O P E R A T I O N S\\n(Unaudited)\\n23 (1) Prior period results have been retroactively adjusted to reflect the three -for-one stock split effected in the form of a stock d ividend in August 2022.\\n\\nQ1-2022 Q2-2022 Q3-2022 Q4-2022 Q1-2023 YoY\\nModel S/X production 14,218 16,411 19,935 20,613 19,437 37%\\nModel 3/Y production 291,189 242,169 345,988 419,088 421,371 45%\\nTotal production 305,407 258,580 365,923 439,701 440,808 44%\\nModel S/X deliveries 14,724 16,162 18,672 17,147 10,695 -27%\\nModel 3/Y deliveries 295,324 238,533 325,158 388,131 412,180 40%\\nTotal deliveries 310,048 254,695 343,830 405,278 422,875 36%\\nof which subject to operating lease accounting 12,167 9,227 11,004 15,184 22,357 84%\\nTotal end of quarter operating lease vehicle count 128,402 131,756 135,054 140,667 153,988 20%\\nGlobal vehicle inventory (days of supply )(1)3 4 8 13 15 400%\\nSolar deployed (MW) 48 106 94 100 67 40%\\nStorage deployed (MWh) 846 1,133 2,100 2,462 3,889 360%\\nTesla locations(2)787 831 903 963 1,000 27%\\nMobile service fleet 1,372 1,453 1,532 1,584 1,692 23%\\nSupercharger stations 3,724 3,971 4,283 4,678 4,947 33%\\nSupercharger connectors 33,657 36,165 38,883 42,419 45,169 34%\\n(1)Days of supply is calculated by dividing new car ending inventory by the relevant quarter’s deliveries and using 75 trading days (aligned with Automotive News definition).\\n(2)Starting in Q1 -2023, we revised our methodology for reporting Tesla’s physical footprint. This count now includes all sales, del ivery, body shop and service locations globally. O P E R A T I O N A L S U M MA R Y\\n(Unaudited)\\n6\\nHuman: What was Tesla's revenue?\"\n", " ]\n", - "}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "}\n", "\u001b[36;1m\u001b[1;3m[llm/end]\u001b[0m \u001b[1m[1:chain:AgentExecutor > 8:tool:tesla-earnings > 9:chain:RetrievalQA > 10:chain:StuffDocumentsChain > 11:chain:LLMChain > 12:llm:ChatOpenAI] [1.17s] Exiting LLM run with output:\n", "\u001b[0m{\n", " \"generations\": [\n", @@ -427,7 +411,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/github.ipynb b/docs/extras/integrations/toolkits/github.ipynb index bcaa5abd4..36d13cb7f 100644 --- a/docs/extras/integrations/toolkits/github.ipynb +++ b/docs/extras/integrations/toolkits/github.ipynb @@ -4,9 +4,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Github Toolkit\n", + "# Github\n", "\n", - "The Github toolkit contains tools that enable an LLM agent to interact with a github repository. The tools are a wrapper for the [PyGitHub](https://github.com/PyGithub/PyGithub) library. \n", + "The `Github` toolkit contains tools that enable an LLM agent to interact with a github repository. \n", + "The tool is a wrapper for the [PyGitHub](https://github.com/PyGithub/PyGithub) library. \n", "\n", "## Quickstart\n", "1. Install the pygithub library\n", @@ -38,7 +39,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 1. Install the pygithub library" + "## Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Install the `pygithub` library " ] }, { @@ -58,7 +66,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2. Create a Github App\n", + "### 2. Create a Github App\n", "\n", "[Follow the instructions here](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app) to create and register a Github app. Make sure your app has the following [repository permissions:](https://docs.github.com/en/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28)\n", "* Commit statuses (read only)\n", @@ -71,7 +79,7 @@ "\n", "Once the app has been registered, add it to the repository you wish the bot to act upon.\n", "\n", - "## 3. Set Environmental Variables\n", + "### 3. Set Environmental Variables\n", "\n", "Before initializing your agent, the following environmental variables need to be set:\n", "\n", @@ -86,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Example Usage- Simple Agent" + "## Example: Simple Agent" ] }, { @@ -212,7 +220,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Example Usage- Advanced Agent\n", + "## Example: Advanced Agent\n", "\n", "If your agent does not need to use all 8 tools, you can build tools individually to use. For this example, we'll make an agent that does not use the create_file, delete_file or create_pull_request tools, but can also use duckduckgo-search." ] @@ -375,9 +383,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.16" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/extras/integrations/toolkits/gmail.ipynb b/docs/extras/integrations/toolkits/gmail.ipynb index e2d6fee59..d24ded1f3 100644 --- a/docs/extras/integrations/toolkits/gmail.ipynb +++ b/docs/extras/integrations/toolkits/gmail.ipynb @@ -4,9 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Gmail Toolkit\n", + "# Gmail\n", "\n", - "This notebook walks through connecting a LangChain email to the Gmail API.\n", + "This notebook walks through connecting a LangChain email to the `Gmail API`.\n", "\n", "To use this toolkit, you will need to set up your credentials explained in the [Gmail API docs](https://developers.google.com/gmail/api/quickstart/python#authorize_credentials_for_a_desktop_application). Once you've downloaded the `credentials.json` file, you can start using the Gmail API. Once this is done, we'll install the required libraries." ] @@ -226,7 +226,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/index.mdx b/docs/extras/integrations/toolkits/index.mdx index 164addc70..65f3854d3 100644 --- a/docs/extras/integrations/toolkits/index.mdx +++ b/docs/extras/integrations/toolkits/index.mdx @@ -2,7 +2,10 @@ sidebar_position: 0 --- -# Agent toolkits +# Agents & Toolkits + +Agents and Toolkits are placed in the same directory because they are always used together. + import DocCardList from "@theme/DocCardList"; diff --git a/docs/extras/integrations/toolkits/jira.ipynb b/docs/extras/integrations/toolkits/jira.ipynb index 9d32bab37..39480eeb5 100644 --- a/docs/extras/integrations/toolkits/jira.ipynb +++ b/docs/extras/integrations/toolkits/jira.ipynb @@ -1,15 +1,15 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "245a954a", "metadata": {}, "source": [ "# Jira\n", "\n", - "This notebook goes over how to use the Jira tool.\n", - "The Jira tool allows agents to interact with a given Jira instance, performing actions such as searching for issues and creating issues, the tool wraps the atlassian-python-api library, for more see: https://atlassian-python-api.readthedocs.io/jira.html\n", + "This notebook goes over how to use the `Jira` toolkit.\n", + "\n", + "The `Jira` toolkit allows agents to interact with a given Jira instance, performing actions such as searching for issues and creating issues, the tool wraps the atlassian-python-api library, for more see: https://atlassian-python-api.readthedocs.io/jira.html\n", "\n", "To use this tool, you must first set as environment variables:\n", " JIRA_API_TOKEN\n", @@ -22,12 +22,12 @@ "execution_count": null, "id": "961b3689", "metadata": { + "ExecuteTime": { + "end_time": "2023-04-17T10:21:20.168639Z", + "start_time": "2023-04-17T10:21:18.698672Z" + }, "vscode": { "languageId": "shellscript" - }, - "ExecuteTime": { - "start_time": "2023-04-17T10:21:18.698672Z", - "end_time": "2023-04-17T10:21:20.168639Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "34bb5968", "metadata": { "ExecuteTime": { - "start_time": "2023-04-17T10:21:22.911233Z", - "end_time": "2023-04-17T10:21:23.730922Z" + "end_time": "2023-04-17T10:21:23.730922Z", + "start_time": "2023-04-17T10:21:22.911233Z" } }, "outputs": [], @@ -58,21 +58,24 @@ { "cell_type": "code", "execution_count": 4, + "id": "b3050b55", + "metadata": { + "ExecuteTime": { + "end_time": "2023-04-17T10:22:42.505412Z", + "start_time": "2023-04-17T10:22:42.499447Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [], "source": [ "os.environ[\"JIRA_API_TOKEN\"] = \"abc\"\n", "os.environ[\"JIRA_USERNAME\"] = \"123\"\n", "os.environ[\"JIRA_INSTANCE_URL\"] = \"https://jira.atlassian.com\"\n", "os.environ[\"OPENAI_API_KEY\"] = \"xyz\"" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "start_time": "2023-04-17T10:22:42.499447Z", - "end_time": "2023-04-17T10:22:42.505412Z" - } - }, - "id": "b3050b55" + ] }, { "cell_type": "code", @@ -80,8 +83,8 @@ "id": "ac4910f8", "metadata": { "ExecuteTime": { - "start_time": "2023-04-17T10:22:44.664481Z", - "end_time": "2023-04-17T10:22:44.720538Z" + "end_time": "2023-04-17T10:22:44.720538Z", + "start_time": "2023-04-17T10:22:44.664481Z" } }, "outputs": [], @@ -97,6 +100,17 @@ { "cell_type": "code", "execution_count": 9, + "id": "d5461370", + "metadata": { + "ExecuteTime": { + "end_time": "2023-04-17T10:23:38.121883Z", + "start_time": "2023-04-17T10:23:33.662454Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "name": "stdout", @@ -117,7 +131,9 @@ }, { "data": { - "text/plain": "'A new issue has been created in project PW with the summary \"Make more fried rice\" and description \"Reminder to make more fried rice\".'" + "text/plain": [ + "'A new issue has been created in project PW with the summary \"Make more fried rice\" and description \"Reminder to make more fried rice\".'" + ] }, "execution_count": 9, "metadata": {}, @@ -126,20 +142,12 @@ ], "source": [ "agent.run(\"make a new issue in project PW to remind me to make more fried rice\")" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "start_time": "2023-04-17T10:23:33.662454Z", - "end_time": "2023-04-17T10:23:38.121883Z" - } - }, - "id": "d5461370" + ] } ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -153,7 +161,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.10.12" }, "vscode": { "interpreter": { @@ -163,4 +171,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/docs/extras/integrations/toolkits/json.ipynb b/docs/extras/integrations/toolkits/json.ipynb index ec34583dd..896141013 100644 --- a/docs/extras/integrations/toolkits/json.ipynb +++ b/docs/extras/integrations/toolkits/json.ipynb @@ -5,9 +5,10 @@ "id": "85fb2c03-ab88-4c8c-97e3-a7f2954555ab", "metadata": {}, "source": [ - "# JSON Agent\n", + "# JSON\n", "\n", - "This notebook showcases an agent designed to interact with large JSON/dict objects. This is useful when you want to answer questions about a JSON blob that's too large to fit in the context window of an LLM. The agent is able to iteratively explore the blob to find what it needs to answer the user's question.\n", + "This notebook showcases an agent interacting with large `JSON/dict` objects. \n", + "This is useful when you want to answer questions about a JSON blob that's too large to fit in the context window of an LLM. The agent is able to iteratively explore the blob to find what it needs to answer the user's question.\n", "\n", "In the below example, we are using the OpenAPI spec for the OpenAI API, which you can find [here](https://github.com/openai/openai-openapi/blob/master/openapi.yaml).\n", "\n", @@ -179,7 +180,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/multion.ipynb b/docs/extras/integrations/toolkits/multion.ipynb index 3382af621..5502d3e70 100644 --- a/docs/extras/integrations/toolkits/multion.ipynb +++ b/docs/extras/integrations/toolkits/multion.ipynb @@ -1,15 +1,14 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# MultiOn Toolkit\n", + "# MultiOn\n", "\n", - "This notebook walks you through connecting LangChain to the MultiOn Client in your browser\n", + "This notebook walks you through connecting LangChain to the `MultiOn` Client in your browser\n", "\n", - "To use this toolkit, you will need to add MultiOn Extension to your browser as explained in the [MultiOn for Chrome](https://multion.notion.site/Download-MultiOn-ddddcfe719f94ab182107ca2612c07a5)." + "To use this toolkit, you will need to add `MultiOn Extension` to your browser as explained in the [MultiOn for Chrome](https://multion.notion.site/Download-MultiOn-ddddcfe719f94ab182107ca2612c07a5)." ] }, { @@ -47,7 +46,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -127,7 +125,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/office365.ipynb b/docs/extras/integrations/toolkits/office365.ipynb index 704ceec4e..350bcc049 100644 --- a/docs/extras/integrations/toolkits/office365.ipynb +++ b/docs/extras/integrations/toolkits/office365.ipynb @@ -1,13 +1,12 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Office365 Toolkit\n", + "# Office365\n", "\n", - "This notebook walks through connecting LangChain to Office365 email and calendar.\n", + "This notebook walks through connecting LangChain to `Office365` email and calendar.\n", "\n", "To use this toolkit, you will need to set up your credentials explained in the [Microsoft Graph authentication and authorization overview](https://learn.microsoft.com/en-us/graph/auth/). Once you've received a CLIENT_ID and CLIENT_SECRET, you can input them as environmental variables below." ] @@ -23,7 +22,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -42,7 +40,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -238,7 +235,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/openapi.ipynb b/docs/extras/integrations/toolkits/openapi.ipynb index 3e5e4d136..f97532e36 100644 --- a/docs/extras/integrations/toolkits/openapi.ipynb +++ b/docs/extras/integrations/toolkits/openapi.ipynb @@ -5,9 +5,9 @@ "id": "85fb2c03-ab88-4c8c-97e3-a7f2954555ab", "metadata": {}, "source": [ - "# OpenAPI agents\n", + "# OpenAPI\n", "\n", - "We can construct agents to consume arbitrary APIs, here APIs conformant to the OpenAPI/Swagger specification." + "We can construct agents to consume arbitrary APIs, here APIs conformant to the `OpenAPI`/`Swagger` specification." ] }, { @@ -271,9 +271,7 @@ "cell_type": "code", "execution_count": 9, "id": "38762cc0", - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -449,9 +447,7 @@ "cell_type": "code", "execution_count": 28, "id": "3a9cc939", - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -773,7 +769,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/openapi_nla.ipynb b/docs/extras/integrations/toolkits/openapi_nla.ipynb index c2f3b90e4..a731e282d 100644 --- a/docs/extras/integrations/toolkits/openapi_nla.ipynb +++ b/docs/extras/integrations/toolkits/openapi_nla.ipynb @@ -7,7 +7,9 @@ "source": [ "# Natural Language APIs\n", "\n", - "Natural Language API Toolkits (NLAToolkits) permit LangChain Agents to efficiently plan and combine calls across endpoints. This notebook demonstrates a sample composition of the Speak, Klarna, and Spoonacluar APIs.\n", + "`Natural Language API` Toolkits (`NLAToolkits`) permit LangChain Agents to efficiently plan and combine calls across endpoints. \n", + "\n", + "This notebook demonstrates a sample composition of the `Speak`, `Klarna`, and `Spoonacluar` APIs.\n", "\n", "For a detailed walkthrough of the OpenAPI chains wrapped within the NLAToolkit, see the [OpenAPI Operation Chain](/docs/use_cases/apis/openapi.html) notebook.\n", "\n", @@ -182,7 +184,7 @@ "id": "c61d92a8", "metadata": {}, "source": [ - "### Using Auth + Adding more Endpoints\n", + "### Use Auth and add more Endpoints\n", "\n", "Some endpoints may require user authentication via things like access tokens. Here we show how to pass in the authentication information via the `Requests` wrapper object.\n", "\n", @@ -420,7 +422,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/pandas.ipynb b/docs/extras/integrations/toolkits/pandas.ipynb index b54b0076c..000eaa0dc 100644 --- a/docs/extras/integrations/toolkits/pandas.ipynb +++ b/docs/extras/integrations/toolkits/pandas.ipynb @@ -5,11 +5,11 @@ "id": "c81da886", "metadata": {}, "source": [ - "# Pandas Dataframe Agent\n", + "# Pandas Dataframe\n", "\n", - "This notebook shows how to use agents to interact with a pandas dataframe. It is mostly optimized for question answering.\n", + "This notebook shows how to use agents to interact with a `Pandas DataFrame`. It is mostly optimized for question answering.\n", "\n", - "**NOTE: this agent calls the Python agent under the hood, which executes LLM generated Python code - this can be bad if the LLM generated Python code is harmful. Use cautiously.**" + "**NOTE: this agent calls the `Python` agent under the hood, which executes LLM generated Python code - this can be bad if the LLM generated Python code is harmful. Use cautiously.**" ] }, { @@ -42,9 +42,9 @@ "id": "a62858e2", "metadata": {}, "source": [ - "## Using ZERO_SHOT_REACT_DESCRIPTION\n", + "## Using `ZERO_SHOT_REACT_DESCRIPTION`\n", "\n", - "This shows how to initialize the agent using the ZERO_SHOT_REACT_DESCRIPTION agent type. Note that this is an alternative to the above." + "This shows how to initialize the agent using the `ZERO_SHOT_REACT_DESCRIPTION` agent type. Note that this is an alternative to the above." ] }, { @@ -212,7 +212,7 @@ "id": "c4bc0584", "metadata": {}, "source": [ - "### Multi DataFrame Example\n", + "## Multi DataFrame Example\n", "\n", "This next part shows how the agent can interact with multiple dataframes passed in as a list." ] @@ -292,7 +292,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/playwright.ipynb b/docs/extras/integrations/toolkits/playwright.ipynb index 50d2825da..ccf569506 100644 --- a/docs/extras/integrations/toolkits/playwright.ipynb +++ b/docs/extras/integrations/toolkits/playwright.ipynb @@ -4,17 +4,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# PlayWright Browser Toolkit\n", + "# PlayWright Browser\n", "\n", - "This toolkit is used to interact with the browser. While other tools (like the Requests tools) are fine for static sites, Browser toolkits let your agent navigate the web and interact with dynamically rendered sites. Some tools bundled within the Browser toolkit include:\n", + "This toolkit is used to interact with the browser. While other tools (like the `Requests` tools) are fine for static sites, `PlayWright Browser` toolkits let your agent navigate the web and interact with dynamically rendered sites. \n", "\n", - "- NavigateTool (navigate_browser) - navigate to a URL\n", - "- NavigateBackTool (previous_page) - wait for an element to appear\n", - "- ClickTool (click_element) - click on an element (specified by selector)\n", - "- ExtractTextTool (extract_text) - use beautiful soup to extract text from the current web page\n", - "- ExtractHyperlinksTool (extract_hyperlinks) - use beautiful soup to extract hyperlinks from the current web page\n", - "- GetElementsTool (get_elements) - select elements by CSS selector\n", - "- CurrentPageTool (current_page) - get the current page URL\n" + "Some tools bundled within the `PlayWright Browser` toolkit include:\n", + "\n", + "- `NavigateTool` (navigate_browser) - navigate to a URL\n", + "- `NavigateBackTool` (previous_page) - wait for an element to appear\n", + "- `ClickTool` (click_element) - click on an element (specified by selector)\n", + "- `ExtractTextTool` (extract_text) - use beautiful soup to extract text from the current web page\n", + "- `ExtractHyperlinksTool` (extract_hyperlinks) - use beautiful soup to extract hyperlinks from the current web page\n", + "- `GetElementsTool` (get_elements) - select elements by CSS selector\n", + "- `CurrentPageTool` (current_page) - get the current page URL\n" ] }, { @@ -327,7 +329,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/powerbi.ipynb b/docs/extras/integrations/toolkits/powerbi.ipynb index 8ca60a965..475e66e61 100644 --- a/docs/extras/integrations/toolkits/powerbi.ipynb +++ b/docs/extras/integrations/toolkits/powerbi.ipynb @@ -2,36 +2,40 @@ "cells": [ { "cell_type": "markdown", + "id": "9363398d", + "metadata": {}, "source": [ - "# PowerBI Dataset Agent\n", + "# PowerBI Dataset\n", "\n", - "This notebook showcases an agent designed to interact with a Power BI Dataset. The agent is designed to answer more general questions about a dataset, as well as recover from errors.\n", + "This notebook showcases an agent interacting with a `Power BI Dataset`. The agent is answering more general questions about a dataset, as well as recover from errors.\n", "\n", "Note that, as this agent is in active development, all answers might not be correct. It runs against the [executequery endpoint](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/execute-queries), which does not allow deletes.\n", "\n", - "### Some notes\n", + "### Notes:\n", "- It relies on authentication with the azure.identity package, which can be installed with `pip install azure-identity`. Alternatively you can create the powerbi dataset with a token as a string without supplying the credentials.\n", "- You can also supply a username to impersonate for use with datasets that have RLS enabled. \n", "- The toolkit uses a LLM to create the query from the question, the agent uses the LLM for the overall execution.\n", "- Testing was done mostly with a `text-davinci-003` model, codex models did not seem to perform ver well." - ], - "metadata": {}, - "attachments": {}, - "id": "9363398d" + ] }, { "cell_type": "markdown", - "source": [ - "## Initialization" - ], + "id": "0725445e", "metadata": { "tags": [] }, - "id": "0725445e" + "source": [ + "## Initialization" + ] }, { "cell_type": "code", "execution_count": null, + "id": "c82f33e9", + "metadata": { + "tags": [] + }, + "outputs": [], "source": [ "from langchain.agents.agent_toolkits import create_pbi_agent\n", "from langchain.agents.agent_toolkits import PowerBIToolkit\n", @@ -39,16 +43,16 @@ "from langchain.chat_models import ChatOpenAI\n", "from langchain.agents import AgentExecutor\n", "from azure.identity import DefaultAzureCredential" - ], - "outputs": [], - "metadata": { - "tags": [] - }, - "id": "c82f33e9" + ] }, { "cell_type": "code", "execution_count": null, + "id": "0b2c5853", + "metadata": { + "tags": [] + }, + "outputs": [], "source": [ "fast_llm = ChatOpenAI(\n", " temperature=0.5, max_tokens=1000, model_name=\"gpt-3.5-turbo\", verbose=True\n", @@ -69,99 +73,95 @@ " toolkit=toolkit,\n", " verbose=True,\n", ")" - ], - "outputs": [], - "metadata": { - "tags": [] - }, - "id": "0b2c5853" + ] }, { "cell_type": "markdown", + "id": "80c92be3", + "metadata": {}, "source": [ "## Example: describing a table" - ], - "metadata": {}, - "id": "80c92be3" + ] }, { "cell_type": "code", "execution_count": null, - "source": [ - "agent_executor.run(\"Describe table1\")" - ], - "outputs": [], + "id": "90f236cb", "metadata": { "tags": [] }, - "id": "90f236cb" + "outputs": [], + "source": [ + "agent_executor.run(\"Describe table1\")" + ] }, { "cell_type": "markdown", + "id": "b464930f", + "metadata": {}, "source": [ "## Example: simple query on a table\n", "In this example, the agent actually figures out the correct query to get a row count of the table." - ], - "metadata": {}, - "attachments": {}, - "id": "b464930f" + ] }, { "cell_type": "code", "execution_count": null, + "id": "b668c907", + "metadata": { + "tags": [] + }, + "outputs": [], "source": [ "agent_executor.run(\"How many records are in table1?\")" - ], - "outputs": [], - "metadata": { - "tags": [] - }, - "id": "b668c907" + ] }, { "cell_type": "markdown", + "id": "f2229a2f", + "metadata": {}, "source": [ "## Example: running queries" - ], - "metadata": {}, - "id": "f2229a2f" + ] }, { "cell_type": "code", "execution_count": null, + "id": "865a420f", + "metadata": { + "tags": [] + }, + "outputs": [], "source": [ "agent_executor.run(\"How many records are there by dimension1 in table2?\")" - ], - "outputs": [], - "metadata": { - "tags": [] - }, - "id": "865a420f" + ] }, { "cell_type": "code", "execution_count": null, - "source": [ - "agent_executor.run(\"What unique values are there for dimensions2 in table2\")" - ], - "outputs": [], + "id": "120cd49a", "metadata": { "tags": [] }, - "id": "120cd49a" + "outputs": [], + "source": [ + "agent_executor.run(\"What unique values are there for dimensions2 in table2\")" + ] }, { "cell_type": "markdown", + "id": "ac584fb2", + "metadata": {}, "source": [ "## Example: add your own few-shot prompts" - ], - "metadata": {}, - "attachments": {}, - "id": "ac584fb2" + ] }, { "cell_type": "code", "execution_count": null, + "id": "ffa66827", + "metadata": {}, + "outputs": [], "source": [ "# fictional example\n", "few_shots = \"\"\"\n", @@ -189,26 +189,27 @@ " toolkit=toolkit,\n", " verbose=True,\n", ")" - ], - "outputs": [], - "metadata": {}, - "id": "ffa66827" + ] }, { "cell_type": "code", "execution_count": null, + "id": "3be44685", + "metadata": {}, + "outputs": [], "source": [ "agent_executor.run(\"What was the maximum of value in revenue in dollars in 2022?\")" - ], - "outputs": [], - "metadata": {}, - "id": "3be44685" + ] } ], "metadata": { + "interpreter": { + "hash": "397704579725e15f5c7cb49fe5f0341eb7531c82d19f2c29d197e8b64ab5776b" + }, "kernelspec": { - "name": "python3", - "display_name": "Python 3.9.16 64-bit" + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -220,12 +221,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" - }, - "interpreter": { - "hash": "397704579725e15f5c7cb49fe5f0341eb7531c82d19f2c29d197e8b64ab5776b" + "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/docs/extras/integrations/toolkits/python.ipynb b/docs/extras/integrations/toolkits/python.ipynb index 41faeff3f..3c1f6b50c 100644 --- a/docs/extras/integrations/toolkits/python.ipynb +++ b/docs/extras/integrations/toolkits/python.ipynb @@ -5,9 +5,9 @@ "id": "82a4c2cc-20ea-4b20-a565-63e905dee8ff", "metadata": {}, "source": [ - "# Python Agent\n", + "# Python\n", "\n", - "This notebook showcases an agent designed to write and execute python code to answer a question." + "This notebook showcases an agent designed to write and execute `Python` code to answer a question." ] }, { @@ -32,7 +32,7 @@ "id": "ca30d64c", "metadata": {}, "source": [ - "## Using ZERO_SHOT_REACT_DESCRIPTION\n", + "## Using `ZERO_SHOT_REACT_DESCRIPTION`\n", "\n", "This shows how to initialize the agent using the ZERO_SHOT_REACT_DESCRIPTION agent type." ] @@ -149,9 +149,7 @@ "cell_type": "code", "execution_count": 5, "id": "4b9f60e7-eb6a-4f14-8604-498d863d4482", - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -271,7 +269,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/spark.ipynb b/docs/extras/integrations/toolkits/spark.ipynb index 7cab26251..d55075c2b 100644 --- a/docs/extras/integrations/toolkits/spark.ipynb +++ b/docs/extras/integrations/toolkits/spark.ipynb @@ -1,13 +1,12 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Spark Dataframe Agent\n", + "# Spark Dataframe\n", "\n", - "This notebook shows how to use agents to interact with a Spark dataframe and Spark Connect. It is mostly optimized for question answering.\n", + "This notebook shows how to use agents to interact with a `Spark DataFrame` and `Spark Connect`. It is mostly optimized for question answering.\n", "\n", "**NOTE: this agent calls the Python agent under the hood, which executes LLM generated Python code - this can be bad if the LLM generated Python code is harmful. Use cautiously.**" ] @@ -23,6 +22,13 @@ "os.environ[\"OPENAI_API_KEY\"] = \"...input your openai api key here...\"" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `Spark DataFrame` example" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -225,11 +231,10 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## Spark Connect Example" + "## `Spark Connect` example" ] }, { @@ -405,9 +410,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/extras/integrations/toolkits/spark_sql.ipynb b/docs/extras/integrations/toolkits/spark_sql.ipynb index c29f6841c..7ed93552c 100644 --- a/docs/extras/integrations/toolkits/spark_sql.ipynb +++ b/docs/extras/integrations/toolkits/spark_sql.ipynb @@ -4,9 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Spark SQL Agent\n", + "# Spark SQL\n", "\n", - "This notebook shows how to use agents to interact with a Spark SQL. Similar to [SQL Database Agent](https://python.langchain.com/docs/integrations/toolkits/sql_database), it is designed to address general inquiries about Spark SQL and facilitate error recovery.\n", + "This notebook shows how to use agents to interact with `Spark SQL`. Similar to [SQL Database Agent](https://python.langchain.com/docs/integrations/toolkits/sql_database), it is designed to address general inquiries about `Spark SQL` and facilitate error recovery.\n", "\n", "**NOTE: Note that, as this agent is in active development, all answers might not be correct. Additionally, it is not guaranteed that the agent won't perform DML statements on your Spark cluster given certain questions. Be careful running it on sensitive data!**" ] @@ -163,7 +163,9 @@ }, { "data": { - "text/plain": "'The titanic table has the following columns: PassengerId (INT), Survived (INT), Pclass (INT), Name (STRING), Sex (STRING), Age (DOUBLE), SibSp (INT), Parch (INT), Ticket (STRING), Fare (DOUBLE), Cabin (STRING), and Embarked (STRING). Here are some sample rows from the table: \\n\\n1. PassengerId: 1, Survived: 0, Pclass: 3, Name: Braund, Mr. Owen Harris, Sex: male, Age: 22.0, SibSp: 1, Parch: 0, Ticket: A/5 21171, Fare: 7.25, Cabin: None, Embarked: S\\n2. PassengerId: 2, Survived: 1, Pclass: 1, Name: Cumings, Mrs. John Bradley (Florence Briggs Thayer), Sex: female, Age: 38.0, SibSp: 1, Parch: 0, Ticket: PC 17599, Fare: 71.2833, Cabin: C85, Embarked: C\\n3. PassengerId: 3, Survived: 1, Pclass: 3, Name: Heikkinen, Miss. Laina, Sex: female, Age: 26.0, SibSp: 0, Parch: 0, Ticket: STON/O2. 3101282, Fare: 7.925, Cabin: None, Embarked: S'" + "text/plain": [ + "'The titanic table has the following columns: PassengerId (INT), Survived (INT), Pclass (INT), Name (STRING), Sex (STRING), Age (DOUBLE), SibSp (INT), Parch (INT), Ticket (STRING), Fare (DOUBLE), Cabin (STRING), and Embarked (STRING). Here are some sample rows from the table: \\n\\n1. PassengerId: 1, Survived: 0, Pclass: 3, Name: Braund, Mr. Owen Harris, Sex: male, Age: 22.0, SibSp: 1, Parch: 0, Ticket: A/5 21171, Fare: 7.25, Cabin: None, Embarked: S\\n2. PassengerId: 2, Survived: 1, Pclass: 1, Name: Cumings, Mrs. John Bradley (Florence Briggs Thayer), Sex: female, Age: 38.0, SibSp: 1, Parch: 0, Ticket: PC 17599, Fare: 71.2833, Cabin: C85, Embarked: C\\n3. PassengerId: 3, Survived: 1, Pclass: 3, Name: Heikkinen, Miss. Laina, Sex: female, Age: 26.0, SibSp: 0, Parch: 0, Ticket: STON/O2. 3101282, Fare: 7.925, Cabin: None, Embarked: S'" + ] }, "execution_count": 4, "metadata": {}, @@ -239,7 +241,9 @@ }, { "data": { - "text/plain": "'The square root of the average age is approximately 5.45.'" + "text/plain": [ + "'The square root of the average age is approximately 5.45.'" + ] }, "execution_count": 5, "metadata": {}, @@ -253,6 +257,12 @@ { "cell_type": "code", "execution_count": 6, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "name": "stdout", @@ -305,7 +315,9 @@ }, { "data": { - "text/plain": "'The oldest survived passenger is Barkworth, Mr. Algernon Henry Wilson, who was 80 years old.'" + "text/plain": [ + "'The oldest survived passenger is Barkworth, Mr. Algernon Henry Wilson, who was 80 years old.'" + ] }, "execution_count": 6, "metadata": {}, @@ -314,10 +326,7 @@ ], "source": [ "agent_executor.run(\"What's the name of the oldest survived passenger?\")" - ], - "metadata": { - "collapsed": false - } + ] } ], "metadata": { @@ -336,9 +345,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/extras/integrations/toolkits/sql_database.ipynb b/docs/extras/integrations/toolkits/sql_database.ipynb index 9fbc31da2..eae793da1 100644 --- a/docs/extras/integrations/toolkits/sql_database.ipynb +++ b/docs/extras/integrations/toolkits/sql_database.ipynb @@ -1,22 +1,21 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "0e499e90-7a6d-4fab-8aab-31a4df417601", "metadata": {}, "source": [ - "# SQL Database Agent\n", + "# SQL Database\n", "\n", - "This notebook showcases an agent designed to interact with a sql databases. The agent builds off of [SQLDatabaseChain](https://python.langchain.com/docs/use_cases/tabular/sqlite) and is designed to answer more general questions about a database, as well as recover from errors.\n", + "This notebook showcases an agent designed to interact with a `SQL` databases. \n", + "The agent builds off of [SQLDatabaseChain](https://python.langchain.com/docs/use_cases/tabular/sqlite) and is designed to answer more general questions about a database, as well as recover from errors.\n", "\n", "Note that, as this agent is in active development, all answers might not be correct. Additionally, it is not guaranteed that the agent won't perform DML statements on your database given certain questions. Be careful running it on sensitive data!\n", "\n", - "This uses the example Chinook database. To set it up follow the instructions on https://database.guide/2-sample-databases-sqlite/, placing the .db file in a notebooks folder at the root of this repository." + "This uses the example `Chinook` database. To set it up follow the instructions on https://database.guide/2-sample-databases-sqlite/, placing the .db file in a notebooks folder at the root of this repository." ] }, { - "attachments": {}, "cell_type": "markdown", "id": "ec927ac6-9b2a-4e8a-9a6e-3e429191875c", "metadata": { @@ -56,12 +55,11 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "f74d1792", "metadata": {}, "source": [ - "## Using ZERO_SHOT_REACT_DESCRIPTION\n", + "## Using `ZERO_SHOT_REACT_DESCRIPTION`\n", "\n", "This shows how to initialize the agent using the ZERO_SHOT_REACT_DESCRIPTION agent type." ] @@ -84,7 +82,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "971cc455", "metadata": {}, @@ -110,7 +107,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "54c01168", "metadata": {}, @@ -136,7 +132,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "5a4a9455", "metadata": {}, @@ -147,7 +142,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "36ae48c7-cb08-4fef-977e-c7d4b96a464b", "metadata": {}, @@ -237,7 +231,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "9abcfe8e-1868-42a4-8345-ad2d9b44c681", "metadata": {}, @@ -312,7 +305,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "6fbc26af-97e4-4a21-82aa-48bdc992da26", "metadata": {}, @@ -495,7 +487,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "7c7503b5-d9d9-4faa-b064-29fcdb5ff213", "metadata": {}, @@ -639,7 +630,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/vectorstore.ipynb b/docs/extras/integrations/toolkits/vectorstore.ipynb index 69ac05bd5..db388fdb0 100644 --- a/docs/extras/integrations/toolkits/vectorstore.ipynb +++ b/docs/extras/integrations/toolkits/vectorstore.ipynb @@ -1,23 +1,21 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "id": "18ada398-dce6-4049-9b56-fc0ede63da9c", "metadata": {}, "source": [ - "# Vectorstore Agent\n", + "# Vectorstore\n", "\n", "This notebook showcases an agent designed to retrieve information from one or more vectorstores, either with or without sources." ] }, { - "attachments": {}, "cell_type": "markdown", "id": "eecb683b-3a46-4b9d-81a3-7caefbfec1a1", "metadata": {}, "source": [ - "## Create the Vectorstores" + "## Create Vectorstores" ] }, { @@ -95,7 +93,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "f4814175-964d-42f1-aa9d-22801ce1e912", "metadata": {}, @@ -128,7 +125,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "8a38ad10", "metadata": {}, @@ -217,7 +213,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "7ca07707", "metadata": {}, @@ -263,7 +258,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "71680984-edaf-4a63-90f5-94edbd263550", "metadata": {}, @@ -422,7 +416,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/extras/integrations/toolkits/xorbits.ipynb b/docs/extras/integrations/toolkits/xorbits.ipynb index dd3e6a108..c97ca83b6 100644 --- a/docs/extras/integrations/toolkits/xorbits.ipynb +++ b/docs/extras/integrations/toolkits/xorbits.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Xorbits Agent" + "# Xorbits" ] }, { @@ -13,7 +13,7 @@ "source": [ "This notebook shows how to use agents to interact with [Xorbits Pandas](https://doc.xorbits.io/en/latest/reference/pandas/index.html) dataframe and [Xorbits Numpy](https://doc.xorbits.io/en/latest/reference/numpy/index.html) ndarray. It is mostly optimized for question answering.\n", "\n", - "**NOTE: this agent calls the Python agent under the hood, which executes LLM generated Python code - this can be bad if the LLM generated Python code is harmful. Use cautiously.**" + "**NOTE: this agent calls the `Python` agent under the hood, which executes LLM generated Python code - this can be bad if the LLM generated Python code is harmful. Use cautiously.**" ] }, { @@ -734,9 +734,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 9963b32e5965e908d2deef798ba4ab4e336474a5 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Thu, 24 Aug 2023 06:42:42 -0700 Subject: [PATCH 105/143] Harrison/multi vector (#9700) --- .../retrievers/multi_vector.ipynb | 366 ++++++++++++++++++ .../parent_document_retriever.ipynb | 3 +- .../langchain/retrievers/__init__.py | 2 + .../langchain/retrievers/multi_vector.py | 39 ++ .../retrievers/parent_document_retriever.py | 36 +- 5 files changed, 411 insertions(+), 35 deletions(-) create mode 100644 docs/extras/modules/data_connection/retrievers/multi_vector.ipynb create mode 100644 libs/langchain/langchain/retrievers/multi_vector.py diff --git a/docs/extras/modules/data_connection/retrievers/multi_vector.ipynb b/docs/extras/modules/data_connection/retrievers/multi_vector.ipynb new file mode 100644 index 000000000..4a7587562 --- /dev/null +++ b/docs/extras/modules/data_connection/retrievers/multi_vector.ipynb @@ -0,0 +1,366 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d9172545", + "metadata": {}, + "source": [ + "# MultiVector Retriever\n", + "\n", + "It can often be beneficial to store multiple vectors per document. There are multiple use cases where this is beneficial. LangChain has a base `MultiVectorRetriever` which makes querying this type of setup easy. A lot of the complexity lies in how to create the multiple vectors per document. This notebook covers some of the common ways to create those vectors and use the `MultiVectorRetriever`.\n", + "\n", + "The methods to create multiple vectors per document include:\n", + "\n", + "- smaller chunks: split a document into smaller chunks, and embed those (this is ParentDocumentRetriever)\n", + "- summary: create a summary for each document, embed that along with (or instead of) the document\n", + "- hypothetical questions: create hypothetical questions that each document would be appropriate to answer, embed those along with (or instead of) the document" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "eed469be", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.retrievers.multi_vector import MultiVectorRetriever" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "18c1421a", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.vectorstores import Chroma\n", + "from langchain.embeddings import OpenAIEmbeddings\n", + "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", + "from langchain.storage import InMemoryStore\n", + "from langchain.document_loaders import TextLoader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6d869496", + "metadata": {}, + "outputs": [], + "source": [ + "loaders = [\n", + " TextLoader('../../paul_graham_essay.txt'),\n", + " TextLoader('../../state_of_the_union.txt'),\n", + "]\n", + "docs = []\n", + "for l in loaders:\n", + " docs.extend(l.load())\n", + "text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000)\n", + "docs = text_splitter.split_documents(docs)" + ] + }, + { + "cell_type": "markdown", + "id": "fa17beda", + "metadata": {}, + "source": [ + "## Smaller chunks\n", + "\n", + "Often times it can be useful to retrieve larger chunks of information, but embed smaller chunks. This allows for embeddings to capture the semantic meaning as closely as possible, but for as much context as possible to be passed downstream. NOTE: this is what the ParentDocumentRetriever does. Here we show what is going on under the hood." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0e7b6b45", + "metadata": {}, + "outputs": [], + "source": [ + "# The vectorstore to use to index the child chunks\n", + "vectorstore = Chroma(\n", + " collection_name=\"full_documents\",\n", + " embedding_function=OpenAIEmbeddings()\n", + ")\n", + "# The storage layer for the parent documents\n", + "store = InMemoryStore()\n", + "id_key = \"doc_id\"\n", + "# The retriever (empty to start)\n", + "retriever = MultiVectorRetriever(\n", + " vectorstore=vectorstore, \n", + " docstore=store, \n", + " id_key=id_key,\n", + ")\n", + "import uuid\n", + "doc_ids = [str(uuid.uuid4()) for _ in docs]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "72a36491", + "metadata": {}, + "outputs": [], + "source": [ + "# The splitter to use to create smaller chunks\n", + "child_text_splitter = RecursiveCharacterTextSplitter(chunk_size=400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d23247d", + "metadata": {}, + "outputs": [], + "source": [ + "sub_docs = []\n", + "for i, doc in enumerate(docs):\n", + " _id = doc_ids[i]\n", + " _sub_docs = child_text_splitter.split_documents([doc])\n", + " for _doc in _sub_docs:\n", + " _doc.metadata[id_key] = _id\n", + " sub_docs.extend(_sub_docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "92ed5861", + "metadata": {}, + "outputs": [], + "source": [ + "retriever.vectorstore.add_documents(sub_docs)\n", + "retriever.docstore.mset(list(zip(doc_ids, docs)))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8afed60c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Document(page_content='Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. \\n\\nOne of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.', metadata={'doc_id': 'b4ca7817-e3fe-4103-ac81-574fb41439ef', 'source': '../../state_of_the_union.txt'})" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Vectorstore alone retrieves the small chunks\n", + "retriever.vectorstore.similarity_search(\"justice breyer\")[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "3c9017f1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9874" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Retriever returns larger chunks\n", + "len(retriever.get_relevant_documents(\"justice breyer\")[0].page_content)" + ] + }, + { + "cell_type": "markdown", + "id": "d6a7ae0d", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Oftentimes a summary may be able to distill more accurately what a chunk is about, leading to better retrieval. Here we show how to create summaries, and then embed those." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "1433dff4", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "from langchain.prompts import ChatPromptTemplate\n", + "from langchain.schema.output_parser import StrOutputParser\n", + "import uuid\n", + "from langchain.schema.document import Document" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "35b30390", + "metadata": {}, + "outputs": [], + "source": [ + "chain = (\n", + " {\"doc\": lambda x: x.page_content}\n", + " | ChatPromptTemplate.from_template(\"Summarize the following document:\\n\\n{doc}\")\n", + " | ChatOpenAI(max_retries=0)\n", + " | StrOutputParser()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "41a2a738", + "metadata": {}, + "outputs": [], + "source": [ + "summaries = [chain.invoke(d) for d in docs]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "7ac5e4b1", + "metadata": {}, + "outputs": [], + "source": [ + "# The vectorstore to use to index the child chunks\n", + "vectorstore = Chroma(\n", + " collection_name=\"summaries\",\n", + " embedding_function=OpenAIEmbeddings()\n", + ")\n", + "# The storage layer for the parent documents\n", + "store = InMemoryStore()\n", + "id_key = \"doc_id\"\n", + "# The retriever (empty to start)\n", + "retriever = MultiVectorRetriever(\n", + " vectorstore=vectorstore, \n", + " docstore=store, \n", + " id_key=id_key,\n", + ")\n", + "doc_ids = [str(uuid.uuid4()) for _ in docs]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "0d93309f", + "metadata": {}, + "outputs": [], + "source": [ + "summary_docs = [Document(page_content=s,metadata={id_key: doc_ids[i]}) for i, s in enumerate(summaries)]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6d5edf0d", + "metadata": {}, + "outputs": [], + "source": [ + "retriever.vectorstore.add_documents(summary_docs)\n", + "retriever.docstore.mset(list(zip(doc_ids, docs)))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "299232d6", + "metadata": {}, + "outputs": [], + "source": [ + "sub_docs = vectorstore.similarity_search(\"justice breyer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "10e404c0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Document(page_content='The document discusses various topics and proposals put forth by the President in a State of the Union address. These include the nomination of a judge for the Supreme Court, securing the border and fixing the immigration system, advancing liberty and justice for women and LGBTQ+ individuals, passing bipartisan legislation, addressing the opioid epidemic and mental health issues, supporting veterans, and ending cancer. The President expresses optimism about the future of the country and emphasizes the strength of the American people.', metadata={'doc_id': '8c7a707d-615d-42d5-919d-bc5178dd1ae4'})" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sub_docs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "e4cce5c2", + "metadata": {}, + "outputs": [], + "source": [ + "retrieved_docs = retriever.get_relevant_documents(\"justice breyer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "c8570dbb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9194" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(retrieved_docs[0].page_content)" + ] + }, + { + "cell_type": "markdown", + "id": "097a5396", + "metadata": {}, + "source": [ + "## Hypothetical Queries\n", + "\n", + "An LLM can also be used to generate a list of hypothetical questions that could be asked of a particular document. These questions can then be embedded" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.10.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/extras/modules/data_connection/retrievers/parent_document_retriever.ipynb b/docs/extras/modules/data_connection/retrievers/parent_document_retriever.ipynb index 4b166bc14..206ecbfba 100644 --- a/docs/extras/modules/data_connection/retrievers/parent_document_retriever.ipynb +++ b/docs/extras/modules/data_connection/retrievers/parent_document_retriever.ipynb @@ -83,7 +83,6 @@ "outputs": [], "source": [ "# This text splitter is used to create the child documents\n", - "\n", "child_splitter = RecursiveCharacterTextSplitter(chunk_size=400)\n", "# The vectorstore to use to index the child chunks\n", "vectorstore = Chroma(\n", @@ -432,7 +431,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.10.1" } }, "nbformat": 4, diff --git a/libs/langchain/langchain/retrievers/__init__.py b/libs/langchain/langchain/retrievers/__init__.py index 1e5497c93..c666d9103 100644 --- a/libs/langchain/langchain/retrievers/__init__.py +++ b/libs/langchain/langchain/retrievers/__init__.py @@ -40,6 +40,7 @@ from langchain.retrievers.merger_retriever import MergerRetriever from langchain.retrievers.metal import MetalRetriever from langchain.retrievers.milvus import MilvusRetriever from langchain.retrievers.multi_query import MultiQueryRetriever +from langchain.retrievers.multi_vector import MultiVectorRetriever from langchain.retrievers.parent_document_retriever import ParentDocumentRetriever from langchain.retrievers.pinecone_hybrid_search import PineconeHybridSearchRetriever from langchain.retrievers.pubmed import PubMedRetriever @@ -92,4 +93,5 @@ __all__ = [ "WebResearchRetriever", "EnsembleRetriever", "ParentDocumentRetriever", + "MultiVectorRetriever", ] diff --git a/libs/langchain/langchain/retrievers/multi_vector.py b/libs/langchain/langchain/retrievers/multi_vector.py new file mode 100644 index 000000000..92d537189 --- /dev/null +++ b/libs/langchain/langchain/retrievers/multi_vector.py @@ -0,0 +1,39 @@ +from typing import List + +from pydantic import Field + +from langchain.callbacks.manager import CallbackManagerForRetrieverRun +from langchain.schema import BaseRetriever, BaseStore, Document +from langchain.vectorstores import VectorStore + + +class MultiVectorRetriever(BaseRetriever): + """Retrieve from a set of multiple embeddings for the same document.""" + + vectorstore: VectorStore + """The underlying vectorstore to use to store small chunks + and their embedding vectors""" + docstore: BaseStore[str, Document] + """The storage layer for the parent documents""" + id_key: str = "doc_id" + search_kwargs: dict = Field(default_factory=dict) + """Keyword arguments to pass to the search function.""" + + def _get_relevant_documents( + self, query: str, *, run_manager: CallbackManagerForRetrieverRun + ) -> List[Document]: + """Get documents relevant to a query. + Args: + query: String to find relevant documents for + run_manager: The callbacks handler to use + Returns: + List of relevant documents + """ + sub_docs = self.vectorstore.similarity_search(query, **self.search_kwargs) + # We do this to maintain the order of the ids that are returned + ids = [] + for d in sub_docs: + if d.metadata[self.id_key] not in ids: + ids.append(d.metadata[self.id_key]) + docs = self.docstore.mget(ids) + return [d for d in docs if d is not None] diff --git a/libs/langchain/langchain/retrievers/parent_document_retriever.py b/libs/langchain/langchain/retrievers/parent_document_retriever.py index 6757ba3dd..dd5aa7206 100644 --- a/libs/langchain/langchain/retrievers/parent_document_retriever.py +++ b/libs/langchain/langchain/retrievers/parent_document_retriever.py @@ -1,16 +1,12 @@ import uuid from typing import List, Optional -from langchain.callbacks.manager import CallbackManagerForRetrieverRun -from langchain.pydantic_v1 import Field +from langchain.retrievers import MultiVectorRetriever from langchain.schema.document import Document -from langchain.schema.retriever import BaseRetriever -from langchain.schema.storage import BaseStore from langchain.text_splitter import TextSplitter -from langchain.vectorstores.base import VectorStore -class ParentDocumentRetriever(BaseRetriever): +class ParentDocumentRetriever(MultiVectorRetriever): """Retrieve small chunks then retrieve their parent documents. When splitting documents for retrieval, there are often conflicting desires: @@ -59,40 +55,14 @@ class ParentDocumentRetriever(BaseRetriever): ) """ - vectorstore: VectorStore - """The underlying vectorstore to use to store small chunks - and their embedding vectors""" - docstore: BaseStore[str, Document] - """The storage layer for the parent documents""" child_splitter: TextSplitter """The text splitter to use to create child documents.""" - id_key: str = "doc_id" + """The key to use to track the parent id. This will be stored in the metadata of child documents.""" parent_splitter: Optional[TextSplitter] = None """The text splitter to use to create parent documents. If none, then the parent documents will be the raw documents passed in.""" - search_kwargs: dict = Field(default_factory=dict) - """Keyword arguments to pass to the search function.""" - - def _get_relevant_documents( - self, query: str, *, run_manager: CallbackManagerForRetrieverRun - ) -> List[Document]: - """Get documents relevant to a query. - Args: - query: String to find relevant documents for - run_manager: The callbacks handler to use - Returns: - List of relevant documents - """ - sub_docs = self.vectorstore.similarity_search(query, **self.search_kwargs) - # We do this to maintain the order of the ids that are returned - ids = [] - for d in sub_docs: - if d.metadata[self.id_key] not in ids: - ids.append(d.metadata[self.id_key]) - docs = self.docstore.mget(ids) - return [d for d in docs if d is not None] def add_documents( self, From 20d2c0571ccffd305794a69e533d296a91cb2938 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Thu, 24 Aug 2023 16:05:10 +0200 Subject: [PATCH 106/143] Do not share executors between parent and child tasks --- .../langchain/schema/runnable/base.py | 34 ++++++------------- .../langchain/schema/runnable/config.py | 16 ++------- .../runnable/__snapshots__/test_runnable.ambr | 3 +- 3 files changed, 15 insertions(+), 38 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index a130dc62b..bdbd7fc69 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -117,13 +117,7 @@ class Runnable(Generic[Input, Output], ABC): return [self.invoke(inputs[0], configs[0], **kwargs)] with get_executor_for_config(configs[0]) as executor: - return list( - executor.map( - partial(self.invoke, **kwargs), - inputs, - (patch_config(c, executor=executor) for c in configs), - ) - ) + return list(executor.map(partial(self.invoke, **kwargs), inputs, configs)) async def abatch( self, @@ -852,18 +846,15 @@ class RunnableSequence(Serializable, Runnable[Input, Output]): # invoke try: - with get_executor_for_config(configs[0]) as executor: - for step in self.steps: - inputs = step.batch( - inputs, - [ - # each step a child run of the corresponding root run - patch_config( - config, callbacks=rm.get_child(), executor=executor - ) - for rm, config in zip(run_managers, configs) - ], - ) + for step in self.steps: + inputs = step.batch( + inputs, + [ + # each step a child run of the corresponding root run + patch_config(config, callbacks=rm.get_child()) + for rm, config in zip(run_managers, configs) + ], + ) # finish the root runs except (KeyboardInterrupt, Exception) as e: for rm in run_managers: @@ -1152,7 +1143,6 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): config, deep_copy_locals=True, callbacks=run_manager.get_child(), - executor=executor, ), ) for step in steps.values() @@ -1219,9 +1209,7 @@ class RunnableMap(Serializable, Runnable[Input, Dict[str, Any]]): name, step.transform( input_copies.pop(), - patch_config( - config, callbacks=run_manager.get_child(), executor=executor - ), + patch_config(config, callbacks=run_manager.get_child()), ), ) for name, step in steps.items() diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index a431fb635..b97d90441 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -42,12 +42,6 @@ class RunnableConfig(TypedDict, total=False): ThreadPoolExecutor's default. This is ignored if an executor is provided. """ - executor: Executor - """ - Externally-managed executor to use for parallel calls. If not provided, a new - ThreadPoolExecutor will be created. - """ - recursion_limit: int """ Maximum number of times a call can recurse. If not provided, defaults to 10. @@ -72,7 +66,6 @@ def patch_config( *, deep_copy_locals: bool = False, callbacks: Optional[BaseCallbackManager] = None, - executor: Optional[Executor] = None, recursion_limit: Optional[int] = None, ) -> RunnableConfig: config = ensure_config(config) @@ -80,8 +73,6 @@ def patch_config( config["_locals"] = deepcopy(config["_locals"]) if callbacks is not None: config["callbacks"] = callbacks - if executor is not None: - config["executor"] = executor if recursion_limit is not None: config["recursion_limit"] = recursion_limit return config @@ -111,8 +102,5 @@ def get_async_callback_manager_for_config( @contextmanager def get_executor_for_config(config: RunnableConfig) -> Generator[Executor, None, None]: - if config.get("executor"): - yield config["executor"] - else: - with ThreadPoolExecutor(max_workers=config.get("max_concurrency")) as executor: - yield executor + with ThreadPoolExecutor(max_workers=config.get("max_concurrency")) as executor: + yield executor diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index c48d4edbd..fcb621fe8 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -2081,7 +2081,8 @@ "stop": [ "Thought:" ] - } + }, + "config": {} } }, "llm": { From 78ffcdd9a9a85782e1677e324bc28a477d30e245 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Thu, 24 Aug 2023 16:09:38 +0200 Subject: [PATCH 107/143] Lint --- .../schema/runnable/__snapshots__/test_runnable.ambr | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr index fcb621fe8..c48d4edbd 100644 --- a/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr +++ b/libs/langchain/tests/unit_tests/schema/runnable/__snapshots__/test_runnable.ambr @@ -2081,8 +2081,7 @@ "stop": [ "Thought:" ] - }, - "config": {} + } } }, "llm": { From 7cf5c582d27d35d60efb2aefe964cce21ccf11b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=86=E7=A9=BA?= <568250549@qq.com> Date: Thu, 24 Aug 2023 22:23:48 +0800 Subject: [PATCH 108/143] Added a link to the dependencies document (#9703) --- docs/extras/ecosystem/dependents.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/extras/ecosystem/dependents.mdx b/docs/extras/ecosystem/dependents.mdx index b21895910..2de471678 100644 --- a/docs/extras/ecosystem/dependents.mdx +++ b/docs/extras/ecosystem/dependents.mdx @@ -51,6 +51,7 @@ Dependents stats for `langchain-ai/langchain` |[e2b-dev/e2b](https://github.com/e2b-dev/e2b) | 5365 | |[mage-ai/mage-ai](https://github.com/mage-ai/mage-ai) | 5352 | |[wenda-LLM/wenda](https://github.com/wenda-LLM/wenda) | 5192 | +|[LangChain-Chinese-Getting-Started-Guide](https://github.com/liaokongVFX/LangChain-Chinese-Getting-Started-Guide) | 5129 | |[zilliztech/GPTCache](https://github.com/zilliztech/GPTCache) | 4993 | |[GreyDGL/PentestGPT](https://github.com/GreyDGL/PentestGPT) | 4831 | |[zauberzeug/nicegui](https://github.com/zauberzeug/nicegui) | 4824 | From 6bedfdf25aed14c87e18daebcc4dee4ccb7f777c Mon Sep 17 00:00:00 2001 From: Patrick Loeber <50772274+patrickloeber@users.noreply.github.com> Date: Thu, 24 Aug 2023 16:24:53 +0200 Subject: [PATCH 109/143] Fix docs for AssemblyAIAudioTranscriptLoader (shorter import path) (#9687) Uses the shorter import path `from langchain.document_loaders import` instead of the full path `from langchain.document_loaders.assemblyai` Applies those changes to the docs and the unit test. See #9667 that adds this new loader. --- docs/extras/integrations/document_loaders/assemblyai.ipynb | 7 ++----- .../tests/unit_tests/document_loaders/test_assemblyai.py | 6 ++---- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/docs/extras/integrations/document_loaders/assemblyai.ipynb b/docs/extras/integrations/document_loaders/assemblyai.ipynb index 33fdef929..80d60df48 100644 --- a/docs/extras/integrations/document_loaders/assemblyai.ipynb +++ b/docs/extras/integrations/document_loaders/assemblyai.ipynb @@ -53,7 +53,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.document_loaders.assemblyai import AssemblyAIAudioTranscriptLoader\n", + "from langchain.document_loaders import AssemblyAIAudioTranscriptLoader\n", "\n", "audio_file = \"https://storage.googleapis.com/aai-docs-samples/nbc.mp3\"\n", "# or a local file path: audio_file = \"./nbc.mp3\"\n", @@ -148,10 +148,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.document_loaders.assemblyai import (\n", - " AssemblyAIAudioTranscriptLoader,\n", - " TranscriptFormat,\n", - ")\n", + "from langchain.document_loaders.assemblyai import TranscriptFormat\n", "\n", "loader = AssemblyAIAudioTranscriptLoader(\n", " file_path=\"./your_file.mp3\",\n", diff --git a/libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py b/libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py index a9b6112e7..550a2c0d1 100644 --- a/libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py +++ b/libs/langchain/tests/unit_tests/document_loaders/test_assemblyai.py @@ -1,10 +1,8 @@ import pytest from pytest_mock import MockerFixture -from langchain.document_loaders.assemblyai import ( - AssemblyAIAudioTranscriptLoader, - TranscriptFormat, -) +from langchain.document_loaders import AssemblyAIAudioTranscriptLoader +from langchain.document_loaders.assemblyai import TranscriptFormat @pytest.mark.requires("assemblyai") From f5ea72579674f0b1e5cbfecacf67dc7d78b87c81 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 24 Aug 2023 07:46:15 -0700 Subject: [PATCH 110/143] bump 272 (#9704) --- libs/langchain/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 60d8afb5a..a35570213 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain" -version = "0.0.271" +version = "0.0.272" description = "Building applications with LLMs through composability" authors = [] license = "MIT" From cf792891f1fc4643dc47001e1002bb6c68e9b7a0 Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Thu, 24 Aug 2023 09:01:52 -0700 Subject: [PATCH 111/143] =?UTF-8?q?=F0=9F=93=96=20docs:=20compact=20api=20?= =?UTF-8?q?reference=20(#8651)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated design of the "API Reference" text Here is an example of the current format: ![image](https://github.com/langchain-ai/langchain/assets/2256422/8727f2ba-1b69-497f-aa07-07f939b6da3b) It changed to `langchain.retrievers.ElasticSearchBM25Retriever` format. The same format as it is in the API Reference Toc. It also resembles code: `from langchain.retrievers import ElasticSearchBM25Retriever` (namespace THEN class_name) Current format is `ElasticSearchBM25Retriever from langchain.retrievers` (class_name THEN namespace) This change is in line with other formats and improves readability. @baskaryan --- docs/docs_skeleton/src/theme/CodeBlock/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/docs_skeleton/src/theme/CodeBlock/index.js b/docs/docs_skeleton/src/theme/CodeBlock/index.js index e97503cd8..84da0b86e 100644 --- a/docs/docs_skeleton/src/theme/CodeBlock/index.js +++ b/docs/docs_skeleton/src/theme/CodeBlock/index.js @@ -24,8 +24,7 @@ function Imports({ imports }) {
  • {imported} - {" "} - from {source} +
  • ))} From c37be7f5fb13b84bcb05091649a7e21cb8f16977 Mon Sep 17 00:00:00 2001 From: Lance Martin <122662504+rlancemartin@users.noreply.github.com> Date: Thu, 24 Aug 2023 11:03:35 -0700 Subject: [PATCH 112/143] Add Code LLaMA to code QA use case (#9713) Use [Ollama integration](https://ollama.ai/blog/run-code-llama-locally). --- .../extras/use_cases/code_understanding.ipynb | 94 ++++++++++++++++--- 1 file changed, 81 insertions(+), 13 deletions(-) diff --git a/docs/extras/use_cases/code_understanding.ipynb b/docs/extras/use_cases/code_understanding.ipynb index a649d7409..ffd14b502 100644 --- a/docs/extras/use_cases/code_understanding.ipynb +++ b/docs/extras/use_cases/code_understanding.ipynb @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -78,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -109,7 +109,7 @@ "1293" ] }, - "execution_count": 14, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -148,7 +148,7 @@ "3748" ] }, - "execution_count": 17, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -187,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -195,7 +195,7 @@ "from langchain.embeddings.openai import OpenAIEmbeddings\n", "db = Chroma.from_documents(texts, OpenAIEmbeddings(disallowed_special=()))\n", "retriever = db.as_retriever(\n", - " search_type=\"mmr\", # Also test \"similarity\"\n", + " search_type=\"mmr\", # Also test \"similarity\"\n", " search_kwargs={\"k\": 8},\n", ")" ] @@ -217,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -231,22 +231,22 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'To load a source code as documents for a QA over code, you can use the `CodeLoader` class. This class allows you to load source code files and split them into classes and functions.\\n\\nHere is an example of how to use the `CodeLoader` class:\\n\\n```python\\nfrom langchain.document_loaders.code import CodeLoader\\n\\n# Specify the path to the source code file\\ncode_file_path = \"path/to/code/file.py\"\\n\\n# Create an instance of the CodeLoader class\\ncode_loader = CodeLoader(code_file_path)\\n\\n# Load the code as documents\\ndocuments = code_loader.load()\\n\\n# Iterate over the documents\\nfor document in documents:\\n # Access the class or function name\\n name = document.metadata[\"name\"]\\n \\n # Access the code content\\n code = document.page_content\\n \\n # Process the code as needed\\n # ...\\n```\\n\\nIn the example above, `code_file_path` should be replaced with the actual path to your source code file. The `load()` method of the `CodeLoader` class will return a list of `Document` objects, where each document represents a class or function in the source code. You can access the class or function name using the `metadata[\"name\"]` attribute, and the code content using the `page_content` attribute of each `Document` object.\\n\\nYou can then process the code as needed for your QA task.'" + "'To initialize a ReAct agent, you need to follow these steps:\\n\\n1. Initialize a language model `llm` of type `BaseLanguageModel`.\\n\\n2. Initialize a document store `docstore` of type `Docstore`.\\n\\n3. Create a `DocstoreExplorer` with the initialized `docstore`. The `DocstoreExplorer` is used to search for and look up terms in the document store.\\n\\n4. Create an array of `Tool` objects. The `Tool` objects represent the actions that the agent can perform. In the case of `ReActDocstoreAgent`, the tools must be \"Search\" and \"Lookup\" with their corresponding functions from the `DocstoreExplorer`.\\n\\n5. Initialize the `ReActDocstoreAgent` using the `from_llm_and_tools` method with the `llm` (language model) and `tools` as parameters.\\n\\n6. Initialize the `ReActChain` (which is the `AgentExecutor`) using the `ReActDocstoreAgent` and `tools` as parameters.\\n\\nHere is an example of how to do this:\\n\\n```python\\nfrom langchain import ReActChain, OpenAI\\nfrom langchain.docstore.base import Docstore\\nfrom langchain.docstore.document import Document\\nfrom langchain.tools.base import BaseTool\\n\\n# Initialize the LLM and a docstore\\nllm = OpenAI()\\ndocstore = Docstore()\\n\\ndocstore_explorer = DocstoreExplorer(docstore)\\ntools = [\\n Tool(\\n name=\"Search\",\\n func=docstore_explorer.search,\\n description=\"Search for a term in the docstore.\",\\n ),\\n Tool(\\n name=\"Lookup\",\\n func=docstore_explorer.lookup,\\n description=\"Lookup a term in the docstore.\",\\n ),\\n]\\nagent = ReActDocstoreAgent.from_llm_and_tools(llm, tools)\\nreact = ReActChain(agent=agent, tools=tools)\\n```\\n\\nKeep in mind that this is a simplified example and you might need to adapt it to your specific needs.'" ] }, - "execution_count": 30, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "question = \"How can I load a source code as documents, for a QA over code, spliting the code in classes and functions?\"\n", + "question = \"How can I initialize a ReAct agent?\"\n", "result = qa(question)\n", "result['answer']" ] @@ -328,6 +328,74 @@ "\n", "![Image description](/img/code_retrieval.png)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Private chat\n", + "\n", + "We can use [Code LLaMA](https://about.fb.com/news/2023/08/code-llama-ai-for-coding/) via the Ollama integration.\n", + "\n", + "`ollama pull codellama:7b-instruct`" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.llms import Ollama\n", + "from langchain.callbacks.manager import CallbackManager\n", + "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler \n", + "llm = Ollama(model=\"codellama:7b-instruct\", \n", + " callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]))\n", + "memory = ConversationSummaryMemory(llm=llm,memory_key=\"chat_history\",return_messages=True)\n", + "qa_llama=ConversationalRetrievalChain.from_llm(llm, retriever=retriever, memory=memory)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \"How can I initialize a ReAct agent?\" To initialize a ReAct agent, you can use the `ReActAgent.from_llm_and_tools()` class method. This method takes two arguments: the LLM and a list of tools.\n", + "Here is an example of how to initialize a ReAct agent with the OpenAI language model and the \"Search\" tool:\n", + "from langchain.agents.mrkl.base import ZeroShotAgent\n", + "\n", + "agent = ReActDocstoreAgent.from_llm_and_tools(OpenAIFunctionsAgent(), [Tool(\"Search\")]])\n", + "\n", + " The human asks what the AI thinks of artificial intelligence. The AI thinks artificial intelligence is a force for good because it will help humans reach their full potential." + ] + }, + { + "data": { + "text/plain": [ + "' To initialize a ReAct agent, you can use the `ReActAgent.from_llm_and_tools()` class method. This method takes two arguments: the LLM and a list of tools.\\nHere is an example of how to initialize a ReAct agent with the OpenAI language model and the \"Search\" tool:\\nfrom langchain.agents.mrkl.base import ZeroShotAgent\\n\\nagent = ReActDocstoreAgent.from_llm_and_tools(OpenAIFunctionsAgent(), [Tool(\"Search\")]])\\n\\n'" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "question = \"How can I initialize a ReAct agent?\"\n", + "result = qa_llama(question)\n", + "result['answer']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can view the [LangSmith trace](https://smith.langchain.com/public/fd24c734-e365-4a09-b883-cdbc7dcfa582/r) to sanity check the result relative to what was retrieved." + ] } ], "metadata": { From dacf96895a7504db1bcacd2c1f4c823f529c52bc Mon Sep 17 00:00:00 2001 From: Tomaz Bratanic Date: Thu, 24 Aug 2023 20:50:38 +0200 Subject: [PATCH 113/143] Add the option to use separate LLMs for GraphCypherQA chain (#9689) The Graph Chains are different in the way that it uses two LLMChains instead of one like the retrievalQA chains. Therefore, sometimes you want to use different LLM to generate the database query and to generate the final answer. This feature would make it more convenient to use different LLMs in the same chain. I have also renamed the Graph DB QA Chain to Neo4j DB QA Chain in the documentation only as it is used only for Neo4j. The naming was ambigious as it was the first graphQA chain added and wasn't sure how do you want to spin it. --- docs/api_reference/guide_imports.json | 6 +- .../more/graph/graph_cypher_qa.ipynb | 167 ++++++++++++++++-- .../langchain/chains/graph_qa/cypher.py | 19 +- 3 files changed, 174 insertions(+), 18 deletions(-) diff --git a/docs/api_reference/guide_imports.json b/docs/api_reference/guide_imports.json index 832c03f99..176c686e5 100644 --- a/docs/api_reference/guide_imports.json +++ b/docs/api_reference/guide_imports.json @@ -341,7 +341,7 @@ "HugeGraph QA Chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_hugegraph_qa", "GraphSparqlQAChain": "https://python.langchain.com/docs/use_cases/more/graph/graph_sparql_qa", "ArangoDB QA chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_arangodb_qa", - "Graph DB QA chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_cypher_qa", + "Neo4j DB QA chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_cypher_qa", "How to use a SmartLLMChain": "https://python.langchain.com/docs/use_cases/more/self_check/smart_llm", "Multi-Agent Simulated Environment: Petting Zoo": "https://python.langchain.com/docs/use_cases/agent_simulations/petting_zoo", "Multi-agent decentralized speaker selection": "https://python.langchain.com/docs/use_cases/agent_simulations/multiagent_bidding", @@ -3202,10 +3202,10 @@ "Graph QA": "https://python.langchain.com/docs/use_cases/more/graph/graph_qa" }, "GraphCypherQAChain": { - "Graph DB QA chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_cypher_qa" + "Neo4j DB QA chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_cypher_qa" }, "Neo4jGraph": { - "Graph DB QA chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_cypher_qa" + "Neo4j DB QA chain": "https://python.langchain.com/docs/use_cases/more/graph/graph_cypher_qa" }, "LLMBashChain": { "Bash chain": "https://python.langchain.com/docs/use_cases/more/code_writing/llm_bash" diff --git a/docs/extras/use_cases/more/graph/graph_cypher_qa.ipynb b/docs/extras/use_cases/more/graph/graph_cypher_qa.ipynb index f6f9ca818..84adde72b 100644 --- a/docs/extras/use_cases/more/graph/graph_cypher_qa.ipynb +++ b/docs/extras/use_cases/more/graph/graph_cypher_qa.ipynb @@ -5,7 +5,7 @@ "id": "c94240f5", "metadata": {}, "source": [ - "# Graph DB QA chain\n", + "# Neo4j DB QA chain\n", "\n", "This notebook shows how to use LLMs to provide a natural language interface to a graph database you can query with the Cypher query language." ] @@ -177,7 +177,7 @@ "\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n", "RETURN a.name\u001b[0m\n", "Full Context:\n", - "\u001b[32;1m\u001b[1;3m[{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}, {'a.name': 'Tom Cruise'}]\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m[{'a.name': 'Tom Cruise'}, {'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}]\u001b[0m\n", "\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] @@ -185,7 +185,7 @@ { "data": { "text/plain": [ - "'Val Kilmer, Anthony Edwards, Meg Ryan, and Tom Cruise played in Top Gun.'" + "'Tom Cruise, Val Kilmer, Anthony Edwards, and Meg Ryan played in Top Gun.'" ] }, "execution_count": 7, @@ -236,7 +236,7 @@ "\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n", "RETURN a.name\u001b[0m\n", "Full Context:\n", - "\u001b[32;1m\u001b[1;3m[{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}]\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m[{'a.name': 'Tom Cruise'}, {'a.name': 'Val Kilmer'}]\u001b[0m\n", "\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] @@ -244,7 +244,7 @@ { "data": { "text/plain": [ - "'Val Kilmer and Anthony Edwards played in Top Gun.'" + "'Tom Cruise and Val Kilmer played in Top Gun.'" ] }, "execution_count": 9, @@ -294,11 +294,11 @@ "\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n", "RETURN a.name\u001b[0m\n", "Full Context:\n", - "\u001b[32;1m\u001b[1;3m[{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}, {'a.name': 'Tom Cruise'}]\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m[{'a.name': 'Tom Cruise'}, {'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}]\u001b[0m\n", "\n", "\u001b[1m> Finished chain.\u001b[0m\n", - "Intermediate steps: [{'query': \"MATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\\nRETURN a.name\"}, {'context': [{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}, {'a.name': 'Tom Cruise'}]}]\n", - "Final answer: Val Kilmer, Anthony Edwards, Meg Ryan, and Tom Cruise played in Top Gun.\n" + "Intermediate steps: [{'query': \"MATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\\nRETURN a.name\"}, {'context': [{'a.name': 'Tom Cruise'}, {'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}]}]\n", + "Final answer: Tom Cruise, Val Kilmer, Anthony Edwards, and Meg Ryan played in Top Gun.\n" ] } ], @@ -352,10 +352,10 @@ { "data": { "text/plain": [ - "[{'a.name': 'Val Kilmer'},\n", + "[{'a.name': 'Tom Cruise'},\n", + " {'a.name': 'Val Kilmer'},\n", " {'a.name': 'Anthony Edwards'},\n", - " {'a.name': 'Meg Ryan'},\n", - " {'a.name': 'Tom Cruise'}]" + " {'a.name': 'Meg Ryan'}]" ] }, "execution_count": 13, @@ -367,10 +367,153 @@ "chain.run(\"Who played in Top Gun?\")" ] }, + { + "cell_type": "markdown", + "id": "f01dfb72-24ec-4ae7-883a-ee6646889b59", + "metadata": {}, + "source": [ + "## Add examples in the Cypher generation prompt\n", + "You can define the Cypher statement you want the LLM to generate for particular questions" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "59baeb88-adfa-4c26-8334-fcbff3a98efb", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.prompts.prompt import PromptTemplate\n", + "\n", + "\n", + "CYPHER_GENERATION_TEMPLATE = \"\"\"Task:Generate Cypher statement to query a graph database.\n", + "Instructions:\n", + "Use only the provided relationship types and properties in the schema.\n", + "Do not use any other relationship types or properties that are not provided.\n", + "Schema:\n", + "{schema}\n", + "Note: Do not include any explanations or apologies in your responses.\n", + "Do not respond to any questions that might ask anything else than for you to construct a Cypher statement.\n", + "Do not include any text except the generated Cypher statement.\n", + "Examples: Here are a few examples of generated Cypher statements for particular questions:\n", + "# How many people played in Top Gun?\n", + "MATCH (m:Movie {{title:\"Top Gun\"}})<-[:ACTED_IN]-()\n", + "RETURN count(*) AS numberOfActors\n", + "\n", + "The question is:\n", + "{question}\"\"\"\n", + "\n", + "CYPHER_GENERATION_PROMPT = PromptTemplate(\n", + " input_variables=[\"schema\", \"question\"], template=CYPHER_GENERATION_TEMPLATE\n", + ")\n", + "\n", + "chain = GraphCypherQAChain.from_llm(\n", + " ChatOpenAI(temperature=0), graph=graph, verbose=True, cypher_prompt=CYPHER_GENERATION_PROMPT\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "47c64027-cf42-493a-9c76-2d10ba753728", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\n", + "Generated Cypher:\n", + "\u001b[32;1m\u001b[1;3mMATCH (m:Movie {name:\"Top Gun\"})<-[:ACTED_IN]-(:Actor)\n", + "RETURN count(*) AS numberOfActors\u001b[0m\n", + "Full Context:\n", + "\u001b[32;1m\u001b[1;3m[{'numberOfActors': 4}]\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "'Four people played in Top Gun.'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chain.run(\"How many people played in Top Gun?\")" + ] + }, + { + "cell_type": "markdown", + "id": "3e721cad-aa87-4526-9231-2dfc0e365939", + "metadata": {}, + "source": [ + "## Use separate LLMs for Cypher and answer generation\n", + "You can use the `cypher_llm` and `qa_llm` parameters to define different llms" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "6f9becc2-f579-45bf-9b50-2ce02bde92da", + "metadata": {}, + "outputs": [], + "source": [ + "chain = GraphCypherQAChain.from_llm(\n", + " graph=graph,\n", + " cypher_llm=ChatOpenAI(temperature=0, model=\"gpt-3.5-turbo\"),\n", + " qa_llm=ChatOpenAI(temperature=0, model=\"gpt-3.5-turbo-16k\"),\n", + " verbose=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ff18e3e3-3402-4683-aec4-a19898f23ca1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\n", + "Generated Cypher:\n", + "\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n", + "RETURN a.name\u001b[0m\n", + "Full Context:\n", + "\u001b[32;1m\u001b[1;3m[{'a.name': 'Tom Cruise'}, {'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}]\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "'Tom Cruise, Val Kilmer, Anthony Edwards, and Meg Ryan played in Top Gun.'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chain.run(\"Who played in Top Gun?\")" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "74d0a36f", + "id": "48ff7cf8-18a3-43d7-8cb1-c1b91744608d", "metadata": {}, "outputs": [], "source": [] diff --git a/libs/langchain/langchain/chains/graph_qa/cypher.py b/libs/langchain/langchain/chains/graph_qa/cypher.py index 015ff5f47..82c85ef1c 100644 --- a/libs/langchain/langchain/chains/graph_qa/cypher.py +++ b/libs/langchain/langchain/chains/graph_qa/cypher.py @@ -73,15 +73,28 @@ class GraphCypherQAChain(Chain): @classmethod def from_llm( cls, - llm: BaseLanguageModel, + llm: Optional[BaseLanguageModel] = None, *, qa_prompt: BasePromptTemplate = CYPHER_QA_PROMPT, cypher_prompt: BasePromptTemplate = CYPHER_GENERATION_PROMPT, + cypher_llm: Optional[BaseLanguageModel] = None, + qa_llm: Optional[BaseLanguageModel] = None, **kwargs: Any, ) -> GraphCypherQAChain: """Initialize from LLM.""" - qa_chain = LLMChain(llm=llm, prompt=qa_prompt) - cypher_generation_chain = LLMChain(llm=llm, prompt=cypher_prompt) + + if not cypher_llm and not llm: + raise ValueError("Either `llm` or `cypher_llm` parameters must be provided") + if not qa_llm and not llm: + raise ValueError("Either `llm` or `qa_llm` parameters must be provided") + if cypher_llm and qa_llm and llm: + raise ValueError( + "You can specify up to two of 'cypher_llm', 'qa_llm'" + ", and 'llm', but not all three simultaneously." + ) + + qa_chain = LLMChain(llm=qa_llm or llm, prompt=qa_prompt) + cypher_generation_chain = LLMChain(llm=cypher_llm or llm, prompt=cypher_prompt) return cls( qa_chain=qa_chain, From 22b6549a34b6b0b4b55afa2df6510e49428d0f55 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 24 Aug 2023 13:53:50 -0700 Subject: [PATCH 114/143] sort api classes (#9710) --- docs/api_reference/create_api_rst.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api_reference/create_api_rst.py b/docs/api_reference/create_api_rst.py index 23fa327af..ee32f0d4c 100644 --- a/docs/api_reference/create_api_rst.py +++ b/docs/api_reference/create_api_rst.py @@ -228,7 +228,7 @@ Classes :toctree: {module} """ - for class_ in classes: + for class_ in sorted(classes, key=lambda c: c["qualified_name"]): if not class_["is_public"]: continue From 2bcf581a2302693e5df9d185ab64e62bf0bd9bc5 Mon Sep 17 00:00:00 2001 From: Andrew White Date: Thu, 24 Aug 2023 17:11:30 -0400 Subject: [PATCH 115/143] Added search parameters to qdrant max_marginal_relevance_search (#7745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the qdrant search filter/params to the `max_marginal_relevance_search` method, which is present on others. I did not add `offset` for pagination, because it's behavior would be ambiguous in this setting (since we fetch extra and down-select). --------- Co-authored-by: Bagatur Co-authored-by: Kacper Łukawski --- .../langchain/vectorstores/qdrant.py | 306 +++++++++++++++--- .../qdrant/test_max_marginal_relevance.py | 19 ++ 2 files changed, 277 insertions(+), 48 deletions(-) diff --git a/libs/langchain/langchain/vectorstores/qdrant.py b/libs/langchain/langchain/vectorstores/qdrant.py index 7b9d9869c..cdc5bea8e 100644 --- a/libs/langchain/langchain/vectorstores/qdrant.py +++ b/libs/langchain/langchain/vectorstores/qdrant.py @@ -265,6 +265,8 @@ class Qdrant(VectorStore): - 'quorum' - query the majority of replicas, return values present in all of them - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to QdrantClient.search() Returns: List of Documents most similar to the query. @@ -339,6 +341,8 @@ class Qdrant(VectorStore): - 'quorum' - query the majority of replicas, return values present in all of them - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to QdrantClient.search() Returns: List of documents most similar to the query text and distance for each. @@ -394,6 +398,9 @@ class Qdrant(VectorStore): - 'quorum' - query the majority of replicas, return values present in all of them - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to + QdrantClient.async_grpc_points.Search(). Returns: List of documents most similar to the query text and distance for each. @@ -448,6 +455,8 @@ class Qdrant(VectorStore): - 'quorum' - query the majority of replicas, return values present in all of them - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to QdrantClient.search() Returns: List of Documents most similar to the query. @@ -504,6 +513,9 @@ class Qdrant(VectorStore): - 'quorum' - query the majority of replicas, return values present in all of them - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to + QdrantClient.async_grpc_points.Search(). Returns: List of Documents most similar to the query. @@ -559,6 +571,8 @@ class Qdrant(VectorStore): - 'quorum' - query the majority of replicas, return values present in all of them - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to QdrantClient.search() Returns: List of documents most similar to the query text and distance for each. @@ -601,6 +615,56 @@ class Qdrant(VectorStore): for result in results ] + async def _asearch_with_score_by_vector( + self, + embedding: List[float], + *, + k: int = 4, + filter: Optional[MetadataFilter] = None, + search_params: Optional[common_types.SearchParams] = None, + offset: int = 0, + score_threshold: Optional[float] = None, + consistency: Optional[common_types.ReadConsistency] = None, + with_vectors: bool = False, + **kwargs: Any, + ) -> Any: + """Return results most similar to embedding vector.""" + from qdrant_client import grpc # noqa + from qdrant_client.conversions.conversion import RestToGrpc + from qdrant_client.http import models as rest + + if filter is not None and isinstance(filter, dict): + warnings.warn( + "Using dict as a `filter` is deprecated. Please use qdrant-client " + "filters directly: " + "https://qdrant.tech/documentation/concepts/filtering/", + DeprecationWarning, + ) + qdrant_filter = self._qdrant_filter_from_dict(filter) + else: + qdrant_filter = filter + + if qdrant_filter is not None and isinstance(qdrant_filter, rest.Filter): + qdrant_filter = RestToGrpc.convert_filter(qdrant_filter) + + response = await self.client.async_grpc_points.Search( + grpc.SearchPoints( + collection_name=self.collection_name, + vector_name=self.vector_name, + vector=embedding, + filter=qdrant_filter, + params=search_params, + limit=k, + offset=offset, + with_payload=grpc.WithPayloadSelector(enable=True), + with_vectors=grpc.WithVectorsSelector(enable=with_vectors), + score_threshold=score_threshold, + read_consistency=consistency, + **kwargs, + ) + ) + return response + @sync_call_fallback async def asimilarity_search_with_score_by_vector( self, @@ -641,43 +705,22 @@ class Qdrant(VectorStore): - 'quorum' - query the majority of replicas, return values present in all of them - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to + QdrantClient.async_grpc_points.Search(). Returns: List of documents most similar to the query text and distance for each. """ - from qdrant_client import grpc # noqa - from qdrant_client.conversions.conversion import RestToGrpc - from qdrant_client.http import models as rest - - if filter is not None and isinstance(filter, dict): - warnings.warn( - "Using dict as a `filter` is deprecated. Please use qdrant-client " - "filters directly: " - "https://qdrant.tech/documentation/concepts/filtering/", - DeprecationWarning, - ) - qdrant_filter = self._qdrant_filter_from_dict(filter) - else: - qdrant_filter = filter - - if qdrant_filter is not None and isinstance(qdrant_filter, rest.Filter): - qdrant_filter = RestToGrpc.convert_filter(qdrant_filter) - - response = await self.client.async_grpc_points.Search( - grpc.SearchPoints( - collection_name=self.collection_name, - vector_name=self.vector_name, - vector=embedding, - filter=qdrant_filter, - params=search_params, - limit=k, - offset=offset, - with_payload=grpc.WithPayloadSelector(enable=True), - with_vectors=grpc.WithVectorsSelector(enable=False), - score_threshold=score_threshold, - read_consistency=consistency, - **kwargs, - ) + response = await self._asearch_with_score_by_vector( + embedding, + k=k, + filter=filter, + search_params=search_params, + offset=offset, + score_threshold=score_threshold, + consistency=consistency, + **kwargs, ) return [ @@ -696,6 +739,10 @@ class Qdrant(VectorStore): k: int = 4, fetch_k: int = 20, lambda_mult: float = 0.5, + filter: Optional[MetadataFilter] = None, + search_params: Optional[common_types.SearchParams] = None, + score_threshold: Optional[float] = None, + consistency: Optional[common_types.ReadConsistency] = None, **kwargs: Any, ) -> List[Document]: """Return docs selected using the maximal marginal relevance. @@ -712,12 +759,41 @@ class Qdrant(VectorStore): of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5. + filter: Filter by metadata. Defaults to None. + search_params: Additional search params + score_threshold: + Define a minimal score threshold for the result. + If defined, less similar results will not be returned. + Score of the returned result might be higher or smaller than the + threshold depending on the Distance function used. + E.g. for cosine similarity only higher scores will be returned. + consistency: + Read consistency of the search. Defines how many replicas should be + queried before returning the result. + Values: + - int - number of replicas to query, values should present in all + queried replicas + - 'majority' - query all replicas, but return values present in the + majority of replicas + - 'quorum' - query the majority of replicas, return values present in + all of them + - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to QdrantClient.search() Returns: List of Documents selected by maximal marginal relevance. """ query_embedding = self._embed_query(query) return self.max_marginal_relevance_search_by_vector( - query_embedding, k, fetch_k, lambda_mult, **kwargs + query_embedding, + k=k, + fetch_k=fetch_k, + lambda_mult=lambda_mult, + filter=filter, + search_params=search_params, + score_threshold=score_threshold, + consistency=consistency, + **kwargs, ) @sync_call_fallback @@ -727,6 +803,10 @@ class Qdrant(VectorStore): k: int = 4, fetch_k: int = 20, lambda_mult: float = 0.5, + filter: Optional[MetadataFilter] = None, + search_params: Optional[common_types.SearchParams] = None, + score_threshold: Optional[float] = None, + consistency: Optional[common_types.ReadConsistency] = None, **kwargs: Any, ) -> List[Document]: """Return docs selected using the maximal marginal relevance. @@ -743,12 +823,42 @@ class Qdrant(VectorStore): of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5. + filter: Filter by metadata. Defaults to None. + search_params: Additional search params + score_threshold: + Define a minimal score threshold for the result. + If defined, less similar results will not be returned. + Score of the returned result might be higher or smaller than the + threshold depending on the Distance function used. + E.g. for cosine similarity only higher scores will be returned. + consistency: + Read consistency of the search. Defines how many replicas should be + queried before returning the result. + Values: + - int - number of replicas to query, values should present in all + queried replicas + - 'majority' - query all replicas, but return values present in the + majority of replicas + - 'quorum' - query the majority of replicas, return values present in + all of them + - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to + QdrantClient.async_grpc_points.Search(). Returns: List of Documents selected by maximal marginal relevance. """ query_embedding = self._embed_query(query) return await self.amax_marginal_relevance_search_by_vector( - query_embedding, k, fetch_k, lambda_mult, **kwargs + query_embedding, + k=k, + fetch_k=fetch_k, + lambda_mult=lambda_mult, + filter=filter, + search_params=search_params, + score_threshold=score_threshold, + consistency=consistency, + **kwargs, ) def max_marginal_relevance_search_by_vector( @@ -757,6 +867,10 @@ class Qdrant(VectorStore): k: int = 4, fetch_k: int = 20, lambda_mult: float = 0.5, + filter: Optional[MetadataFilter] = None, + search_params: Optional[common_types.SearchParams] = None, + score_threshold: Optional[float] = None, + consistency: Optional[common_types.ReadConsistency] = None, **kwargs: Any, ) -> List[Document]: """Return docs selected using the maximal marginal relevance. @@ -772,11 +886,40 @@ class Qdrant(VectorStore): of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5. + filter: Filter by metadata. Defaults to None. + search_params: Additional search params + score_threshold: + Define a minimal score threshold for the result. + If defined, less similar results will not be returned. + Score of the returned result might be higher or smaller than the + threshold depending on the Distance function used. + E.g. for cosine similarity only higher scores will be returned. + consistency: + Read consistency of the search. Defines how many replicas should be + queried before returning the result. + Values: + - int - number of replicas to query, values should present in all + queried replicas + - 'majority' - query all replicas, but return values present in the + majority of replicas + - 'quorum' - query the majority of replicas, return values present in + all of them + - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to QdrantClient.search() Returns: List of Documents selected by maximal marginal relevance. """ results = self.max_marginal_relevance_search_with_score_by_vector( - embedding=embedding, k=k, fetch_k=fetch_k, lambda_mult=lambda_mult, **kwargs + embedding, + k=k, + fetch_k=fetch_k, + lambda_mult=lambda_mult, + filter=filter, + search_params=search_params, + score_threshold=score_threshold, + consistency=consistency, + **kwargs, ) return list(map(itemgetter(0), results)) @@ -787,6 +930,10 @@ class Qdrant(VectorStore): k: int = 4, fetch_k: int = 20, lambda_mult: float = 0.5, + filter: Optional[MetadataFilter] = None, + search_params: Optional[common_types.SearchParams] = None, + score_threshold: Optional[float] = None, + consistency: Optional[common_types.ReadConsistency] = None, **kwargs: Any, ) -> List[Document]: """Return docs selected using the maximal marginal relevance. @@ -801,12 +948,42 @@ class Qdrant(VectorStore): of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5. + filter: Filter by metadata. Defaults to None. + search_params: Additional search params + score_threshold: + Define a minimal score threshold for the result. + If defined, less similar results will not be returned. + Score of the returned result might be higher or smaller than the + threshold depending on the Distance function used. + E.g. for cosine similarity only higher scores will be returned. + consistency: + Read consistency of the search. Defines how many replicas should be + queried before returning the result. + Values: + - int - number of replicas to query, values should present in all + queried replicas + - 'majority' - query all replicas, but return values present in the + majority of replicas + - 'quorum' - query the majority of replicas, return values present in + all of them + - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to + QdrantClient.async_grpc_points.Search(). Returns: List of Documents selected by maximal marginal relevance and distance for each. """ results = await self.amax_marginal_relevance_search_with_score_by_vector( - embedding, k, fetch_k, lambda_mult, **kwargs + embedding, + k=k, + fetch_k=fetch_k, + lambda_mult=lambda_mult, + filter=filter, + search_params=search_params, + score_threshold=score_threshold, + consistency=consistency, + **kwargs, ) return list(map(itemgetter(0), results)) @@ -816,6 +993,10 @@ class Qdrant(VectorStore): k: int = 4, fetch_k: int = 20, lambda_mult: float = 0.5, + filter: Optional[MetadataFilter] = None, + search_params: Optional[common_types.SearchParams] = None, + score_threshold: Optional[float] = None, + consistency: Optional[common_types.ReadConsistency] = None, **kwargs: Any, ) -> List[Tuple[Document, float]]: """Return docs selected using the maximal marginal relevance. @@ -830,6 +1011,27 @@ class Qdrant(VectorStore): of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5. + filter: Filter by metadata. Defaults to None. + search_params: Additional search params + score_threshold: + Define a minimal score threshold for the result. + If defined, less similar results will not be returned. + Score of the returned result might be higher or smaller than the + threshold depending on the Distance function used. + E.g. for cosine similarity only higher scores will be returned. + consistency: + Read consistency of the search. Defines how many replicas should be + queried before returning the result. + Values: + - int - number of replicas to query, values should present in all + queried replicas + - 'majority' - query all replicas, but return values present in the + majority of replicas + - 'quorum' - query the majority of replicas, return values present in + all of them + - 'all' - query all replicas, and return values present in all replicas + **kwargs: + Any other named arguments to pass through to QdrantClient.search() Returns: List of Documents selected by maximal marginal relevance and distance for each. @@ -841,9 +1043,14 @@ class Qdrant(VectorStore): results = self.client.search( collection_name=self.collection_name, query_vector=query_vector, + query_filter=filter, + search_params=search_params, + limit=fetch_k, with_payload=True, with_vectors=True, - limit=fetch_k, + score_threshold=score_threshold, + consistency=consistency, + **kwargs, ) embeddings = [ result.vector.get(self.vector_name) # type: ignore[index, union-attr] @@ -871,6 +1078,10 @@ class Qdrant(VectorStore): k: int = 4, fetch_k: int = 20, lambda_mult: float = 0.5, + filter: Optional[MetadataFilter] = None, + search_params: Optional[common_types.SearchParams] = None, + score_threshold: Optional[float] = None, + consistency: Optional[common_types.ReadConsistency] = None, **kwargs: Any, ) -> List[Tuple[Document, float]]: """Return docs selected using the maximal marginal relevance. @@ -889,18 +1100,17 @@ class Qdrant(VectorStore): List of Documents selected by maximal marginal relevance and distance for each. """ - from qdrant_client import grpc # noqa from qdrant_client.conversions.conversion import GrpcToRest - response = await self.client.async_grpc_points.Search( - grpc.SearchPoints( - collection_name=self.collection_name, - vector_name=self.vector_name, - vector=embedding, - with_payload=grpc.WithPayloadSelector(enable=True), - with_vectors=grpc.WithVectorsSelector(enable=True), - limit=fetch_k, - ) + response = await self._asearch_with_score_by_vector( + embedding, + k=fetch_k, + filter=filter, + search_params=search_params, + score_threshold=score_threshold, + consistency=consistency, + with_vectors=True, + **kwargs, ) results = [ GrpcToRest.convert_vectors(result.vectors) for result in response.result diff --git a/libs/langchain/tests/integration_tests/vectorstores/qdrant/test_max_marginal_relevance.py b/libs/langchain/tests/integration_tests/vectorstores/qdrant/test_max_marginal_relevance.py index 5a383b36c..71d1643b7 100644 --- a/libs/langchain/tests/integration_tests/vectorstores/qdrant/test_max_marginal_relevance.py +++ b/libs/langchain/tests/integration_tests/vectorstores/qdrant/test_max_marginal_relevance.py @@ -1,6 +1,7 @@ from typing import Optional import pytest +from qdrant_client import models from langchain.schema import Document from langchain.vectorstores import Qdrant @@ -20,6 +21,17 @@ def test_qdrant_max_marginal_relevance_search( vector_name: Optional[str], ) -> None: """Test end to end construction and MRR search.""" + filter = models.Filter( + must=[ + models.FieldCondition( + key=f"{metadata_payload_key}.page", + match=models.MatchValue( + value=2, + ), + ), + ], + ) + texts = ["foo", "bar", "baz"] metadatas = [{"page": i} for i in range(len(texts))] docsearch = Qdrant.from_texts( @@ -40,3 +52,10 @@ def test_qdrant_max_marginal_relevance_search( Document(page_content="foo", metadata={"page": 0}), Document(page_content="baz", metadata={"page": 2}), ] + + output = docsearch.max_marginal_relevance_search( + "foo", k=2, fetch_k=3, lambda_mult=0.0, filter=filter + ) + assert output == [ + Document(page_content="baz", metadata={"page": 2}), + ] From a0800c9f159bdb746ef34a4868f1a5efbbd1c3c1 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 24 Aug 2023 14:20:58 -0700 Subject: [PATCH 116/143] rm google api core and add more dependency testing (#9721) --- libs/langchain/poetry.lock | 3 +-- libs/langchain/pyproject.toml | 7 +++---- .../tests/unit_tests/test_dependencies.py | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index 5b10733d9..badf9ec89 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -3542,7 +3542,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] @@ -10448,4 +10447,4 @@ text-helpers = ["chardet"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "fd56d0cf338f6efea449244f3e9e719ca6872dd4b3e136ccd67fd82912912cc2" +content-hash = "88e479307b19d991105360780f67ed3258ef1a0151f70b9e91c86c8153751e83" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index a35570213..bc626b415 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -125,7 +125,6 @@ newspaper3k = {version = "^0.2.8", optional = true} amazon-textract-caller = {version = "<2", optional = true} xata = {version = "^1.0.0a7", optional = true} xmltodict = {version = "^0.13.0", optional = true} -google-api-core = {version = "^2.11.1", optional = true} markdownify = {version = "^0.11.6", optional = true} assemblyai = {version = "^0.17.0", optional = true} @@ -307,7 +306,7 @@ extended_testing = [ "chardet", "esprima", "jq", - "pdfminer.six", + "pdfminer-six", "pgvector", "pypdf", "pymupdf", @@ -321,7 +320,7 @@ extended_testing = [ "telethon", "psychicapi", "gql", - "requests_toolbelt", + "requests-toolbelt", "html2text", "py-trello", "scikit-learn", @@ -331,7 +330,7 @@ extended_testing = [ "sympy", "rapidfuzz", "openai", - "rank_bm25", + "rank-bm25", "geopandas", "jinja2", "gitpython", diff --git a/libs/langchain/tests/unit_tests/test_dependencies.py b/libs/langchain/tests/unit_tests/test_dependencies.py index e446485ca..2e40a7ab4 100644 --- a/libs/langchain/tests/unit_tests/test_dependencies.py +++ b/libs/langchain/tests/unit_tests/test_dependencies.py @@ -26,10 +26,13 @@ def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None: # Get the dependencies from the [tool.poetry.dependencies] section dependencies = poetry_conf["dependencies"] - required_dependencies = [ - package_name + is_required = { + package_name: isinstance(requirements, str) + or not requirements.get("optional", False) for package_name, requirements in dependencies.items() - if isinstance(requirements, str) or not requirements.get("optional", False) + } + required_dependencies = [ + package_name for package_name, required in is_required.items() if required ] assert sorted(required_dependencies) == [ @@ -47,6 +50,12 @@ def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None: "tenacity", ] + unrequired_dependencies = [ + package_name for package_name, required in is_required.items() if not required + ] + in_extras = [dep for group in poetry_conf["extras"].values() for dep in group] + assert set(unrequired_dependencies) == set(in_extras) + def test_test_group_dependencies(poetry_conf: Mapping[str, Any]) -> None: """Check if someone is attempting to add additional test dependencies. From 0f48e6c36eb23a5c5fdcd3c15ec31fa0c4dfd5f5 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 24 Aug 2023 15:06:53 -0700 Subject: [PATCH 117/143] fix integration deps (#9722) --- .../integration_tests/document_loaders/test_polars_dataframe.py | 2 ++ .../tests/integration_tests/vectorstores/test_elasticsearch.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py b/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py index b9e4727d2..03f507012 100644 --- a/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py +++ b/libs/langchain/tests/integration_tests/document_loaders/test_polars_dataframe.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING import pytest diff --git a/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py b/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py index f2e451ee7..dafba4b1f 100644 --- a/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py +++ b/libs/langchain/tests/integration_tests/vectorstores/test_elasticsearch.py @@ -5,7 +5,6 @@ import uuid from typing import Generator, List, Union import pytest -from elasticsearch.helpers import BulkIndexError from langchain.docstore.document import Document from langchain.vectorstores.elasticsearch import ElasticsearchStore @@ -585,6 +584,7 @@ class TestElasticsearch: caplog: pytest.LogCaptureFixture, ) -> None: """Test bulk exception logging is giving better hints.""" + from elasticsearch.helpers import BulkIndexError docsearch = ElasticsearchStore( embedding=ConsistentFakeEmbeddings(), From dff00ea91ec2101c2886da8d06eeb14b37eca65b Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Thu, 24 Aug 2023 17:23:27 -0700 Subject: [PATCH 118/143] Chat Loaders (#9708) Still working out interface/notebooks + need discord data dump to test out things other than copy+paste Update: - Going to remove the 'user_id' arg in the loaders themselves and just standardize on putting the "sender" arg in the extra kwargs. Then can provide a utility function to map these to ai and human messages - Going to move the discord one into just a notebook since I don't have a good dump to test on and copy+paste maybe isn't the greatest thing to support in v0 - Need to do more testing on slack since it seems the dump only includes channels and NOT 1 on 1 convos - --------- Co-authored-by: Harrison Chase --- .../integrations/chat_loaders/discord.ipynb | 325 ++++++++++ .../integrations/chat_loaders/facebook.ipynb | 579 ++++++++++++++++++ .../integrations/chat_loaders/index.mdx | 188 ++++++ .../integrations/chat_loaders/slack.ipynb | 163 +++++ .../integrations/chat_loaders/telegram.ipynb | 206 +++++++ .../integrations/chat_loaders/whatsapp.ipynb | 204 ++++++ libs/langchain/langchain/adapters/openai.py | 17 + .../langchain/chat_loaders/__init__.py | 6 + libs/langchain/langchain/chat_loaders/base.py | 31 + .../chat_loaders/facebook_messenger.py | 77 +++ .../langchain/langchain/chat_loaders/slack.py | 84 +++ .../langchain/chat_loaders/telegram.py | 152 +++++ .../langchain/langchain/chat_loaders/utils.py | 86 +++ .../langchain/chat_loaders/whatsapp.py | 116 ++++ .../tests/unit_tests/chat_loaders/__init__.py | 0 .../data/telegram_chat_html/messages.html | 166 +++++ .../data/telegram_chat_json/result.json | 67 ++ .../chat_loaders/data/whatsapp_chat.txt | 12 + .../unit_tests/chat_loaders/test_slack.py | 24 + .../unit_tests/chat_loaders/test_telegram.py | 97 +++ .../unit_tests/chat_loaders/test_whatsapp.py | 20 + 21 files changed, 2620 insertions(+) create mode 100644 docs/extras/integrations/chat_loaders/discord.ipynb create mode 100644 docs/extras/integrations/chat_loaders/facebook.ipynb create mode 100644 docs/extras/integrations/chat_loaders/index.mdx create mode 100644 docs/extras/integrations/chat_loaders/slack.ipynb create mode 100644 docs/extras/integrations/chat_loaders/telegram.ipynb create mode 100644 docs/extras/integrations/chat_loaders/whatsapp.ipynb create mode 100644 libs/langchain/langchain/chat_loaders/__init__.py create mode 100644 libs/langchain/langchain/chat_loaders/base.py create mode 100644 libs/langchain/langchain/chat_loaders/facebook_messenger.py create mode 100644 libs/langchain/langchain/chat_loaders/slack.py create mode 100644 libs/langchain/langchain/chat_loaders/telegram.py create mode 100644 libs/langchain/langchain/chat_loaders/utils.py create mode 100644 libs/langchain/langchain/chat_loaders/whatsapp.py create mode 100644 libs/langchain/tests/unit_tests/chat_loaders/__init__.py create mode 100644 libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_html/messages.html create mode 100644 libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_json/result.json create mode 100644 libs/langchain/tests/unit_tests/chat_loaders/data/whatsapp_chat.txt create mode 100644 libs/langchain/tests/unit_tests/chat_loaders/test_slack.py create mode 100644 libs/langchain/tests/unit_tests/chat_loaders/test_telegram.py create mode 100644 libs/langchain/tests/unit_tests/chat_loaders/test_whatsapp.py diff --git a/docs/extras/integrations/chat_loaders/discord.ipynb b/docs/extras/integrations/chat_loaders/discord.ipynb new file mode 100644 index 000000000..973b59640 --- /dev/null +++ b/docs/extras/integrations/chat_loaders/discord.ipynb @@ -0,0 +1,325 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c4ff9336-1cf3-459e-bd70-d1314c1da6a0", + "metadata": {}, + "source": [ + "# Discord\n", + "\n", + "This notebook shows how to create your own chat loader that works on copy-pasted messages (from dms) to a list of LangChain messages.\n", + "\n", + "The process has four steps:\n", + "1. Create the chat .txt file by copying chats from the Discord app and pasting them in a file on your local computer\n", + "2. Copy the chat loader definition from below to a local file.\n", + "3. Initialize the `DiscordChatLoader` with the file path pointed to the text file.\n", + "4. Call `loader.load()` (or `loader.lazy_load()`) to perform the conversion.\n", + "\n", + "## 1. Creat message dump\n", + "\n", + "Currently (2023/08/23) this loader only supports .txt files in the format generated by copying messages in the app to your clipboard and pasting in a file. Below is an example." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e4ccfdfa-6869-4d67-90a0-ab99f01b7553", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting discord_chats.txt\n" + ] + } + ], + "source": [ + "%%writefile discord_chats.txt\n", + "talkingtower — 08/15/2023 11:10 AM\n", + "Love music! Do you like jazz?\n", + "reporterbob — 08/15/2023 9:27 PM\n", + "Yes! Jazz is fantastic. Ever heard this one?\n", + "Website\n", + "Listen to classic jazz track...\n", + "\n", + "talkingtower — Yesterday at 5:03 AM\n", + "Indeed! Great choice. 🎷\n", + "reporterbob — Yesterday at 5:23 AM\n", + "Thanks! How about some virtual sightseeing?\n", + "Website\n", + "Virtual tour of famous landmarks...\n", + "\n", + "talkingtower — Today at 2:38 PM\n", + "Sounds fun! Let's explore.\n", + "reporterbob — Today at 2:56 PM\n", + "Enjoy the tour! See you around.\n", + "talkingtower — Today at 3:00 PM\n", + "Thank you! Goodbye! 👋\n", + "reporterbob — Today at 3:02 PM\n", + "Farewell! Happy exploring." + ] + }, + { + "cell_type": "markdown", + "id": "359565a7-dad3-403c-a73c-6414b1295127", + "metadata": {}, + "source": [ + "## 2. Define chat loader\n", + "\n", + "LangChain currently does not support " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a429e0c4-4d7d-45f8-bbbb-c7fc5229f6af", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import re\n", + "from typing import Iterator, List\n", + "\n", + "from langchain import schema\n", + "from langchain.chat_loaders import base as chat_loaders\n", + "\n", + "logger = logging.getLogger()\n", + "\n", + "\n", + "class DiscordChatLoader(chat_loaders.BaseChatLoader):\n", + " \n", + " def __init__(self, path: str):\n", + " \"\"\"\n", + " Initialize the Discord chat loader.\n", + "\n", + " Args:\n", + " path: Path to the exported Discord chat text file.\n", + " \"\"\"\n", + " self.path = path\n", + " self._message_line_regex = re.compile(\n", + " r\"(.+?) — (\\w{3,9} \\d{1,2}(?:st|nd|rd|th)?(?:, \\d{4})? \\d{1,2}:\\d{2} (?:AM|PM)|Today at \\d{1,2}:\\d{2} (?:AM|PM)|Yesterday at \\d{1,2}:\\d{2} (?:AM|PM))\", # noqa\n", + " flags=re.DOTALL,\n", + " )\n", + "\n", + " def _load_single_chat_session_from_txt(\n", + " self, file_path: str\n", + " ) -> chat_loaders.ChatSession:\n", + " \"\"\"\n", + " Load a single chat session from a text file.\n", + "\n", + " Args:\n", + " file_path: Path to the text file containing the chat messages.\n", + "\n", + " Returns:\n", + " A `ChatSession` object containing the loaded chat messages.\n", + " \"\"\"\n", + " with open(file_path, \"r\", encoding=\"utf-8\") as file:\n", + " lines = file.readlines()\n", + "\n", + " results: List[schema.BaseMessage] = []\n", + " current_sender = None\n", + " current_timestamp = None\n", + " current_content = []\n", + " for line in lines:\n", + " if re.match(\n", + " r\".+? — (\\d{2}/\\d{2}/\\d{4} \\d{1,2}:\\d{2} (?:AM|PM)|Today at \\d{1,2}:\\d{2} (?:AM|PM)|Yesterday at \\d{1,2}:\\d{2} (?:AM|PM))\", # noqa\n", + " line,\n", + " ):\n", + " if current_sender and current_content:\n", + " results.append(\n", + " schema.HumanMessage(\n", + " content=\"\".join(current_content).strip(),\n", + " additional_kwargs={\n", + " \"sender\": current_sender,\n", + " \"events\": [{\"message_time\": current_timestamp}],\n", + " },\n", + " )\n", + " )\n", + " current_sender, current_timestamp = line.split(\" — \")[:2]\n", + " current_content = [\n", + " line[len(current_sender) + len(current_timestamp) + 4 :].strip()\n", + " ]\n", + " elif re.match(r\"\\[\\d{1,2}:\\d{2} (?:AM|PM)\\]\", line.strip()):\n", + " results.append(\n", + " schema.HumanMessage(\n", + " content=\"\".join(current_content).strip(),\n", + " additional_kwargs={\n", + " \"sender\": current_sender,\n", + " \"events\": [{\"message_time\": current_timestamp}],\n", + " },\n", + " )\n", + " )\n", + " current_timestamp = line.strip()[1:-1]\n", + " current_content = []\n", + " else:\n", + " current_content.append(\"\\n\" + line.strip())\n", + "\n", + " if current_sender and current_content:\n", + " results.append(\n", + " schema.HumanMessage(\n", + " content=\"\".join(current_content).strip(),\n", + " additional_kwargs={\n", + " \"sender\": current_sender,\n", + " \"events\": [{\"message_time\": current_timestamp}],\n", + " },\n", + " )\n", + " )\n", + "\n", + " return chat_loaders.ChatSession(messages=results)\n", + "\n", + " def lazy_load(self) -> Iterator[chat_loaders.ChatSession]:\n", + " \"\"\"\n", + " Lazy load the messages from the chat file and yield them in the required format.\n", + "\n", + " Yields:\n", + " A `ChatSession` object containing the loaded chat messages.\n", + " \"\"\"\n", + " yield self._load_single_chat_session_from_txt(self.path)\n" + ] + }, + { + "cell_type": "markdown", + "id": "c8240393-48be-44d2-b0d6-52c215cd8ac2", + "metadata": {}, + "source": [ + "## 2. Create loader\n", + "\n", + "We will point to the file we just wrote to disk." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1268de40-b0e5-445d-9cd8-54856cd0293a", + "metadata": {}, + "outputs": [], + "source": [ + "loader = DiscordChatLoader(\n", + " path=\"./discord_chats.txt\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "4928df4b-ae31-48a7-bd76-be3ecee1f3e0", + "metadata": {}, + "source": [ + "## 3. Load Messages\n", + "\n", + "Assuming the format is correct, the loader will convert the chats to langchain messages." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c8a0836d-4a22-4790-bfe9-97f2145bb0d6", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "from langchain.chat_loaders.base import ChatSession\n", + "from langchain.chat_loaders.utils import (\n", + " map_ai_messages,\n", + " merge_chat_runs,\n", + ")\n", + "\n", + "raw_messages = loader.lazy_load()\n", + "# Merge consecutive messages from the same sender into a single message\n", + "merged_messages = merge_chat_runs(raw_messages)\n", + "# Convert messages from \"talkingtower\" to AI messages\n", + "messages: List[ChatSession] = list(map_ai_messages(merged_messages, sender=\"talkingtower\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1913963b-c44e-4f7a-aba7-0423c9b8bd59", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'messages': [AIMessage(content='Love music! Do you like jazz?', additional_kwargs={'sender': 'talkingtower', 'events': [{'message_time': '08/15/2023 11:10 AM\\n'}]}, example=False),\n", + " HumanMessage(content='Yes! Jazz is fantastic. Ever heard this one?\\nWebsite\\nListen to classic jazz track...', additional_kwargs={'sender': 'reporterbob', 'events': [{'message_time': '08/15/2023 9:27 PM\\n'}]}, example=False),\n", + " AIMessage(content='Indeed! Great choice. 🎷', additional_kwargs={'sender': 'talkingtower', 'events': [{'message_time': 'Yesterday at 5:03 AM\\n'}]}, example=False),\n", + " HumanMessage(content='Thanks! How about some virtual sightseeing?\\nWebsite\\nVirtual tour of famous landmarks...', additional_kwargs={'sender': 'reporterbob', 'events': [{'message_time': 'Yesterday at 5:23 AM\\n'}]}, example=False),\n", + " AIMessage(content=\"Sounds fun! Let's explore.\", additional_kwargs={'sender': 'talkingtower', 'events': [{'message_time': 'Today at 2:38 PM\\n'}]}, example=False),\n", + " HumanMessage(content='Enjoy the tour! See you around.', additional_kwargs={'sender': 'reporterbob', 'events': [{'message_time': 'Today at 2:56 PM\\n'}]}, example=False),\n", + " AIMessage(content='Thank you! Goodbye! 👋', additional_kwargs={'sender': 'talkingtower', 'events': [{'message_time': 'Today at 3:00 PM\\n'}]}, example=False),\n", + " HumanMessage(content='Farewell! Happy exploring.', additional_kwargs={'sender': 'reporterbob', 'events': [{'message_time': 'Today at 3:02 PM\\n'}]}, example=False)]}]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "messages" + ] + }, + { + "cell_type": "markdown", + "id": "8595a518-5c89-44aa-94a7-ca51e7e2a5fa", + "metadata": {}, + "source": [ + "### Next Steps\n", + "\n", + "You can then use these messages how you see fit, such as finetuning a model, few-shot example selection, or directly make predictions for the next message " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "08ff0a1e-fca0-4da3-aacd-d7401f99d946", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thank you! Have a wonderful day! 🌟" + ] + } + ], + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "\n", + "llm = ChatOpenAI()\n", + "\n", + "for chunk in llm.stream(messages[0]['messages']):\n", + " print(chunk.content, end=\"\", flush=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50a5251f-074a-4a3c-a2b0-b1de85e0ac6a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/extras/integrations/chat_loaders/facebook.ipynb b/docs/extras/integrations/chat_loaders/facebook.ipynb new file mode 100644 index 000000000..ca4ddce0e --- /dev/null +++ b/docs/extras/integrations/chat_loaders/facebook.ipynb @@ -0,0 +1,579 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e4bd269b", + "metadata": {}, + "source": [ + "# Facebook Messenger\n", + "\n", + "This notebook shows how to load data from Facebook in a format you can finetune on. The overall steps are:\n", + "\n", + "1. Download your messenger data to disk.\n", + "2. Create the Chat Loader and call `loader.load()` (or `loader.lazy_load()`) to perform the conversion.\n", + "3. Optionally use `merge_chat_runs` to combine message from the same sender in sequence, and/or `map_ai_messages` to convert messages from the specified sender to the \"AIMessage\" class. Once you've done this, call `convert_messages_for_finetuning` to prepare your data for fine-tuning.\n", + "\n", + "\n", + "Once this has been done, you can fine-tune your model. To do so you would complete the following steps:\n", + "\n", + "4. Upload your messages to OpenAI and run a fine-tuning job.\n", + "6. Use the resulting model in your LangChain app!\n", + "\n", + "\n", + "Let's begin.\n", + "\n", + "\n", + "## 1. Download Data\n", + "\n", + "To download your own messenger data, following instructions [here](https://www.zapptales.com/en/download-facebook-messenger-chat-history-how-to/). IMPORTANT - make sure to download them in JSON format (not HTML).\n", + "\n", + "We are hosting an example dump at [this google drive link](https://drive.google.com/file/d/1rh1s1o2i7B-Sk1v9o8KNgivLVGwJ-osV/view?usp=sharing) that we will use in this walkthrough." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "647f2158-a42e-4634-b283-b8492caf542a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File file.zip downloaded.\n", + "File file.zip has been unzipped.\n" + ] + } + ], + "source": [ + "# This uses some example data\n", + "import requests\n", + "import zipfile\n", + "\n", + "def download_and_unzip(url: str, output_path: str = 'file.zip') -> None:\n", + " file_id = url.split('/')[-2]\n", + " download_url = f'https://drive.google.com/uc?export=download&id={file_id}'\n", + "\n", + " response = requests.get(download_url)\n", + " if response.status_code != 200:\n", + " print('Failed to download the file.')\n", + " return\n", + "\n", + " with open(output_path, 'wb') as file:\n", + " file.write(response.content)\n", + " print(f'File {output_path} downloaded.')\n", + "\n", + " with zipfile.ZipFile(output_path, 'r') as zip_ref:\n", + " zip_ref.extractall()\n", + " print(f'File {output_path} has been unzipped.')\n", + "\n", + "# URL of the file to download\n", + "url = 'https://drive.google.com/file/d/1rh1s1o2i7B-Sk1v9o8KNgivLVGwJ-osV/view?usp=sharing'\n", + "\n", + "# Download and unzip\n", + "download_and_unzip(url)\n" + ] + }, + { + "cell_type": "markdown", + "id": "48ef8bb1-fc28-453c-835a-94a552f05a91", + "metadata": {}, + "source": [ + "## 2. Create Chat Loader\n", + "\n", + "We have 2 different `FacebookMessengerChatLoader` classes, one for an entire directory of chats, and one to load individual files. We" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a0869bc6", + "metadata": {}, + "outputs": [], + "source": [ + "directory_path = \"./hogwarts\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0460bf25", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_loaders.facebook_messenger import (\n", + " SingleFileFacebookMessengerChatLoader,\n", + " FolderFacebookMessengerChatLoader,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f61ee277", + "metadata": {}, + "outputs": [], + "source": [ + "loader = SingleFileFacebookMessengerChatLoader(\n", + " path=\"./hogwarts/inbox/HermioneGranger/messages_Hermione_Granger.json\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ec466ad7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[HumanMessage(content=\"Hi Hermione! How's your summer going so far?\", additional_kwargs={'sender': 'Harry Potter'}, example=False),\n", + " HumanMessage(content=\"Harry! Lovely to hear from you. My summer is going well, though I do miss everyone. I'm spending most of my time going through my books and researching fascinating new topics. How about you?\", additional_kwargs={'sender': 'Hermione Granger'}, example=False),\n", + " HumanMessage(content=\"I miss you all too. The Dursleys are being their usual unpleasant selves but I'm getting by. At least I can practice some spells in my room without them knowing. Let me know if you find anything good in your researching!\", additional_kwargs={'sender': 'Harry Potter'}, example=False)]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chat_session = loader.load()[0]\n", + "chat_session[\"messages\"][:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8a3ee473", + "metadata": {}, + "outputs": [], + "source": [ + "loader = FolderFacebookMessengerChatLoader(\n", + " path=\"./hogwarts\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "9f41e122", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chat_sessions = loader.load()\n", + "len(chat_sessions)" + ] + }, + { + "cell_type": "markdown", + "id": "d4aa3580-adc1-4b48-9bba-0e8e8d9f44ce", + "metadata": {}, + "source": [ + "## 3. Prepare for fine-tuning\n", + "\n", + "Calling `load()` returns all the chat messages we could extract as human messages. When conversing with chat bots, conversations typically follow a more strict alternating dialogue pattern relative to real conversations. \n", + "\n", + "You can choose to merge message \"runs\" (consecutive messages from the same sender) and select a sender to represent the \"AI\". The fine-tuned LLM will learn to generate these AI messages." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5a78030d-b757-4bbe-8a6c-841056f46df7", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_loaders.utils import (\n", + " merge_chat_runs,\n", + " map_ai_messages,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ff35b028-78bf-4c5b-9ec6-939fe67de7f7", + "metadata": {}, + "outputs": [], + "source": [ + "merged_sessions = merge_chat_runs(chat_sessions)\n", + "alternating_sessions = list(map_ai_messages(merged_sessions, \"Harry Potter\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "4b11906e-a496-4d01-9f0d-1938c14147bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[AIMessage(content=\"Professor Snape, I was hoping I could speak with you for a moment about something that's been concerning me lately.\", additional_kwargs={'sender': 'Harry Potter'}, example=False),\n", + " HumanMessage(content=\"What is it, Potter? I'm quite busy at the moment.\", additional_kwargs={'sender': 'Severus Snape'}, example=False),\n", + " AIMessage(content=\"I apologize for the interruption, sir. I'll be brief. I've noticed some strange activity around the school grounds at night. I saw a cloaked figure lurking near the Forbidden Forest last night. I'm worried someone may be plotting something sinister.\", additional_kwargs={'sender': 'Harry Potter'}, example=False)]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Now all of Harry Potter's messages will take the AI message class\n", + "# which maps to the 'assistant' role in OpenAI's training format\n", + "alternating_sessions[0]['messages'][:3]" + ] + }, + { + "cell_type": "markdown", + "id": "d985478d-062e-47b9-ae9a-102f59be07c0", + "metadata": {}, + "source": [ + "#### Now we can convert to OpenAI format dictionaries" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "21372331", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.adapters.openai import convert_messages_for_finetuning" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "92c5ae7a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Prepared 9 dialogues for training\n" + ] + } + ], + "source": [ + "training_data = convert_messages_for_finetuning(alternating_sessions)\n", + "print(f\"Prepared {len(training_data)} dialogues for training\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "dfcbd181", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'role': 'assistant',\n", + " 'content': \"Professor Snape, I was hoping I could speak with you for a moment about something that's been concerning me lately.\"},\n", + " {'role': 'user',\n", + " 'content': \"What is it, Potter? I'm quite busy at the moment.\"},\n", + " {'role': 'assistant',\n", + " 'content': \"I apologize for the interruption, sir. I'll be brief. I've noticed some strange activity around the school grounds at night. I saw a cloaked figure lurking near the Forbidden Forest last night. I'm worried someone may be plotting something sinister.\"}]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "training_data[0][:3]" + ] + }, + { + "cell_type": "markdown", + "id": "f1a9fd64-4f9f-42d3-b5dc-2a340e51e9e7", + "metadata": {}, + "source": [ + "OpenAI currently requires at least 10 training examples for a fine-tuning job, though they recommend between 50-100 for most tasks. Since we only have 9 chat sessions, we can subdivide them (optionally with some overlap) so that each training example is comprised of a portion of a whole conversation.\n", + "\n", + "Facebook chat sessions (1 per person) often span multiple days and conversations,\n", + "so the long-range dependencies may not be that important to model anyhow." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "13cd290a-b1e9-4686-bb5e-d99de8b8612b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "100" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Our chat is alternating, we will make each datapoint a group of 8 messages,\n", + "# with 2 messages overlapping\n", + "chunk_size = 8\n", + "overlap = 2\n", + "\n", + "training_examples = [\n", + " conversation_messages[i: i + chunk_size] \n", + " for conversation_messages in training_data\n", + " for i in range(\n", + " 0, len(conversation_messages) - chunk_size + 1, \n", + " chunk_size - overlap)\n", + "]\n", + "\n", + "len(training_examples)" + ] + }, + { + "cell_type": "markdown", + "id": "cc8baf41-ff07-4492-96bd-b2472ee7cef9", + "metadata": {}, + "source": [ + "## 4. Fine-tune the model\n", + "\n", + "It's time to fine-tune the model. Make sure you have `openai` installed\n", + "and have set your `OPENAI_API_KEY` appropriately" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "95ce3f63-3c80-44b2-9060-534ad74e16fa", + "metadata": {}, + "outputs": [], + "source": [ + "# %pip install -U openai --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "ab9e28eb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File file-zCyNBeg4snpbBL7VkvsuhCz8 ready afer 30.55 seconds.\n" + ] + } + ], + "source": [ + "import json\n", + "from io import BytesIO\n", + "import time\n", + "\n", + "import openai\n", + "\n", + "# We will write the jsonl file in memory\n", + "my_file = BytesIO()\n", + "for m in training_examples:\n", + " my_file.write((json.dumps({\"messages\": m}) + \"\\n\").encode('utf-8'))\n", + "\n", + "my_file.seek(0)\n", + "training_file = openai.File.create(\n", + " file=my_file,\n", + " purpose='fine-tune'\n", + ")\n", + "\n", + "# OpenAI audits each training file for compliance reasons.\n", + "# This make take a few minutes\n", + "status = openai.File.retrieve(training_file.id).status\n", + "start_time = time.time()\n", + "while status != \"processed\":\n", + " print(f\"Status=[{status}]... {time.time() - start_time:.2f}s\", end=\"\\r\", flush=True)\n", + " time.sleep(5)\n", + " status = openai.File.retrieve(training_file.id).status\n", + "print(f\"File {training_file.id} ready after {time.time() - start_time:.2f} seconds.\")" + ] + }, + { + "cell_type": "markdown", + "id": "759a7f51-fde9-4b75-aaa9-e600e6537bd1", + "metadata": {}, + "source": [ + "With the file ready, it's time to kick off a training job." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "3f451425", + "metadata": {}, + "outputs": [], + "source": [ + "job = openai.FineTuningJob.create(\n", + " training_file=training_file.id,\n", + " model=\"gpt-3.5-turbo\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "489b23ef-5e14-42a9-bafb-44220ec6960b", + "metadata": {}, + "source": [ + "Grab a cup of tea while your model is being prepared. This may take some time!" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "bac1637a-c087-4523-ade1-c47f9bf4c6f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Status=[running]... 908.87s\r" + ] + } + ], + "source": [ + "status = openai.FineTuningJob.retrieve(job.id).status\n", + "start_time = time.time()\n", + "while status != \"succeeded\":\n", + " print(f\"Status=[{status}]... {time.time() - start_time:.2f}s\", end=\"\\r\", flush=True)\n", + " time.sleep(5)\n", + " job = openai.FineTuningJob.retrieve(job.id)\n", + " status = job.status" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "535895e1-bc69-40e5-82ed-e24ed2baeeee", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ft:gpt-3.5-turbo-0613:personal::7rDwkaOq\n" + ] + } + ], + "source": [ + "print(job.fine_tuned_model)" + ] + }, + { + "cell_type": "markdown", + "id": "502ff73b-f9e9-49ce-ba45-401811e57946", + "metadata": {}, + "source": [ + "## 5. Use in LangChain\n", + "\n", + "You can use the resulting model ID directly the `ChatOpenAI` model class." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "3925d60d", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "\n", + "model = ChatOpenAI(\n", + " model=job.fine_tuned_model,\n", + " temperature=1,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "7190cf2e-ab34-4ceb-bdad-45f24f069c29", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.prompts import ChatPromptTemplate\n", + "from langchain.schema.output_parser import StrOutputParser\n", + "\n", + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"human\", \"{input}\"),\n", + " ]\n", + ")\n", + "\n", + "chain = prompt | model | StrOutputParser()" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "f02057e9-f914-40b1-9c9d-9432ff594b98", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The usual - Potions, Transfiguration, Defense Against the Dark Arts. What about you?" + ] + } + ], + "source": [ + "for tok in chain.stream({\"input\": \"What classes are you taking?\"}):\n", + " print(tok, end=\"\", flush=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35331503-3cc6-4d64-955e-64afe6b5fef3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/extras/integrations/chat_loaders/index.mdx b/docs/extras/integrations/chat_loaders/index.mdx new file mode 100644 index 000000000..be3f38ff5 --- /dev/null +++ b/docs/extras/integrations/chat_loaders/index.mdx @@ -0,0 +1,188 @@ +--- +sidebar_position: 0 +--- + +# Chat loaders + +Like document loaders, chat loaders are utilities designed to help load conversations from popular communication platforms such as Facebook, Slack, Discord, etc. These are loaded into memory as LangChain chat message objects. Such utilities facilitate tasks such as fine-tuning a language model to match your personal style or voice. + +This brief guide will illustrate the process using [OpenAI's fine-tuning API](https://platform.openai.com/docs/guides/fine-tuning) comprised of six steps: + +1. Export your Facebook Messenger chat data in a compatible format for your intended chat loader. +2. Load the chat data into memory as LangChain chat message objects. (_this is what is covered in each integration notebook in this section of the documentation_). + - Assign a person to the "AI" role and optionally filter, group, and merge messages. +3. Export these acquired messages in a format expected by the fine-tuning API. +4. Upload this data to OpenAI. +5. Fine-tune your model. +6. Implement the fine-tuned model in LangChain. + +This guide is not wholly comprehensive but is designed to take you through the fundamentals of going from raw data to fine-tuned model. + +We will demonstrate the procedure through an example of fine-tuning a `gpt-3.5-turbo` model on Facebook Messenger data. + +### 1. Export your chat data + +To export your Facebook messenger data, you can follow the [instructions here](https://www.zapptales.com/en/download-facebook-messenger-chat-history-how-to/). + +:::important JSON format +You must select "JSON format" (instead of HTML) when exporting your data to be compatible with the current loader. +::: + +OpenAI requires at least 10 examples to fine-tune your model, but they recommend between 50-100 for more optimal results. +You can use the example data stored at [this google drive link](https://drive.google.com/file/d/1rh1s1o2i7B-Sk1v9o8KNgivLVGwJ-osV/view?usp=sharing) to test the process. + +### 2. Load the chat + +Once you've obtained your chat data, you can load it into memory as LangChain chat message objects. Here’s an example of loading data using the Python code: + +```python +from langchain.chat_loaders.facebook_messenger import FolderFacebookMessengerChatLoader + +loader = FolderFacebookMessengerChatLoader( + path="./facebook_messenger_chats", +) + +chat_sessions = loader.load() +``` + +In this snippet, we point the loader to a directory of Facebook chat dumps which are then loaded as multiple "sessions" of messages, one session per conversation file. + +Once you've loaded the messages, you should decide which person you want to fine-tune the model to (usually yourself). You can also decide to merge consecutive messages from the same sender into a single chat message. +For both of these tasks, you can use the chat_loaders utilities to do so: + +``` +from langchain.chat_loaders.utils import ( + merge_chat_runs, + map_ai_messages, +) + +merged_sessions = merge_chat_runs(chat_sessions) +alternating_sessions = list(map_ai_messages(merged_sessions, "My Name")) +``` + +### 3. Export messages to OpenAI format + +Convert the chat messages to dictionaries using the `convert_messages_for_finetuning` function. Then, group the data into chunks for better context modeling and overlap management. + +```python +from langchain.adapters.openai import convert_messages_for_finetuning + +openai_messages = convert_messages_for_finetuning(chat_sessions) +``` + +At this point, the data is ready for upload to OpenAI. You can choose to split up conversations into smaller chunks for training if you +do not have enough conversations to train on. Feel free to play around with different chunk sizes or with adding system messages to the fine-tuning data. + +```python +chunk_size = 8 +overlap = 2 + +message_groups = [ + conversation_messages[i: i + chunk_size] + for conversation_messages in openai_messages + for i in range( + 0, len(conversation_messages) - chunk_size + 1, + chunk_size - overlap) +] + +len(message_groups) +# 9 +``` + +### 4. Upload the data to OpenAI + +Ensure you have set your OpenAI API key by following these [instructions](https://platform.openai.com/account/api-keys), then upload the training file. +An audit is performed to ensure data compliance, so you may have to wait a few minutes for the dataset to become ready for use. + +```python +import time +import json +import io + +import openai + +my_file = io.BytesIO() +for group in message_groups: + my_file.write((json.dumps({"messages": group}) + "\n").encode('utf-8')) + +my_file.seek(0) +training_file = openai.File.create( + file=my_file, + purpose='fine-tune' +) + +# Wait while the file is processed +status = openai.File.retrieve(training_file.id).status +start_time = time.time() +while status != "processed": + print(f"Status=[{status}]... {time.time() - start_time:.2f}s", end="\r", flush=True) + time.sleep(5) + status = openai.File.retrieve(training_file.id).status +print(f"File {training_file.id} ready after {time.time() - start_time:.2f} seconds.") +``` + +Once this is done, you can proceed to the model training! + +### 5. Fine-tune the model + +Start the fine-tuning job with your chosen base model. + +```python +job = openai.FineTuningJob.create( + training_file=training_file.id, + model="gpt-3.5-turbo", +) +``` + +This might take a while. Check the status with `openai.FineTuningJob.retrieve(job.id).status` and wait for it to report `succeeded`. + +```python +# It may take 10-20+ minutes to complete training. +status = openai.FineTuningJob.retrieve(job.id).status +start_time = time.time() +while status != "succeeded": + print(f"Status=[{status}]... {time.time() - start_time:.2f}s", end="\r", flush=True) + time.sleep(5) + job = openai.FineTuningJob.retrieve(job.id) + status = job.status +``` + +### 6. Use the model in LangChain + +You're almost there! Use the fine-tuned model in LangChain. + +```python +from langchain import chat_models + +model_name = job.fine_tuned_model +# Example: ft:gpt-3.5-turbo-0613:personal::5mty86jblapsed +model = chat_models.ChatOpenAI(model=model_name) +``` + +```python +from langchain.prompts import ChatPromptTemplate +from langchain.schema.output_parser import StrOutputParser + +prompt = ChatPromptTemplate.from_messages( + [ + ("human", "{input}"), + ] +) + +chain = prompt | model | StrOutputParser() + +for tok in chain.stream({"input": "What classes are you taking?"}): + print(tok, end="", flush=True) + +# The usual - Potions, Transfiguration, Defense Against the Dark Arts. What about you? +``` + +And that's it! You've successfully fine-tuned a model and used it in LangChain. + +## Supported Chat Loaders + +LangChain currently supports the following chat loaders. Feel free to contribute more! + +import DocCardList from "@theme/DocCardList"; + + \ No newline at end of file diff --git a/docs/extras/integrations/chat_loaders/slack.ipynb b/docs/extras/integrations/chat_loaders/slack.ipynb new file mode 100644 index 000000000..f63cd7cdf --- /dev/null +++ b/docs/extras/integrations/chat_loaders/slack.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "01fcfa2f-33a9-48f3-835a-b1956c394d6b", + "metadata": {}, + "source": [ + "# Slack\n", + "\n", + "This notebook shows how to use the Slack chat loader. This class helps map exported slack conversations to LangChain chat messages.\n", + "\n", + "The process has three steps:\n", + "1. Export the desired conversation thread by following the [instructions here](https://slack.com/help/articles/1500001548241-Request-to-export-all-conversations).\n", + "2. Create the `SlackChatLoader` with the file path pointed to the json file or directory of JSON files\n", + "3. Call `loader.load()` (or `loader.lazy_load()`) to perform the conversion. Optionally use `merge_chat_runs` to combine message from the same sender in sequence, and/or `map_ai_messages` to convert messages from the specified sender to the \"AIMessage\" class.\n", + "\n", + "## 1. Creat message dump\n", + "\n", + "Currently (2023/08/23) this loader best supports a zip directory of files in the format generated by exporting your a direct message converstion from Slack. Follow up-to-date instructions from slack on how to do so.\n", + "\n", + "We have an example in the LangChain repo." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a79d35bf-5f21-4063-84bf-a60845c1c51f", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "permalink = \"https://raw.githubusercontent.com/langchain-ai/langchain/342087bdfa3ac31d622385d0f2d09cf5e06c8db3/libs/langchain/tests/integration_tests/examples/slack_export.zip\"\n", + "response = requests.get(permalink)\n", + "with open(\"slack_dump.zip\", \"wb\") as f:\n", + " f.write(response.content)" + ] + }, + { + "cell_type": "markdown", + "id": "cf60f703-76f1-4602-a723-02c59535c1af", + "metadata": {}, + "source": [ + "## 2. Create the Chat Loader\n", + "\n", + "Provide the loader with the file path to the zip directory. You can optionally specify the user id that maps to an ai message as well an configure whether to merge message runs." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4b8b432a-d2bc-49e1-b35f-761730a8fd6d", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_loaders.slack import SlackChatLoader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8ec6661b-0aca-48ae-9e2b-6412856c287b", + "metadata": {}, + "outputs": [], + "source": [ + "loader = SlackChatLoader(\n", + " path=\"slack_dump.zip\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "8805a7c5-84b4-49f5-8989-0022f2054ace", + "metadata": {}, + "source": [ + "## 3. Load messages\n", + "\n", + "The `load()` (or `lazy_load`) methods return a list of \"ChatSessions\" that currently just contain a list of messages per loaded conversation." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "fcd69b3e-020d-4a15-8a0d-61c2d34e1ee1", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "from langchain.chat_loaders.base import ChatSession\n", + "from langchain.chat_loaders.utils import (\n", + " map_ai_messages,\n", + " merge_chat_runs,\n", + ")\n", + "\n", + "raw_messages = loader.lazy_load()\n", + "# Merge consecutive messages from the same sender into a single message\n", + "merged_messages = merge_chat_runs(raw_messages)\n", + "# Convert messages from \"U0500003428\" to AI messages\n", + "messages: List[ChatSession] = list(map_ai_messages(merged_messages, sender=\"U0500003428\"))" + ] + }, + { + "cell_type": "markdown", + "id": "7d033f87-cd0c-4f44-a753-41b871c1e919", + "metadata": {}, + "source": [ + "### Next Steps\n", + "\n", + "You can then use these messages how you see fit, such as finetuning a model, few-shot example selection, or directly make predictions for the next message. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7d8a1629-5d9e-49b3-b978-3add57027d59", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi, \n", + "\n", + "I hope you're doing well. I wanted to reach out and ask if you'd be available to meet up for coffee sometime next week. I'd love to catch up and hear about what's been going on in your life. Let me know if you're interested and we can find a time that works for both of us. \n", + "\n", + "Looking forward to hearing from you!\n", + "\n", + "Best, [Your Name]" + ] + } + ], + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "\n", + "llm = ChatOpenAI()\n", + "\n", + "for chunk in llm.stream(messages[1]['messages']):\n", + " print(chunk.content, end=\"\", flush=True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/extras/integrations/chat_loaders/telegram.ipynb b/docs/extras/integrations/chat_loaders/telegram.ipynb new file mode 100644 index 000000000..156472691 --- /dev/null +++ b/docs/extras/integrations/chat_loaders/telegram.ipynb @@ -0,0 +1,206 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "735455a6-f82e-4252-b545-27385ef883f4", + "metadata": {}, + "source": [ + "# Telegram\n", + "\n", + "This notebook shows how to use the Telegram chat loader. This class helps map exported Telegram conversations to LangChain chat messages.\n", + "\n", + "The process has three steps:\n", + "1. Export the chat .txt file by copying chats from the Discord app and pasting them in a file on your local computer\n", + "2. Create the `TelegramChatLoader` with the file path pointed to the json file or directory of JSON files\n", + "3. Call `loader.load()` (or `loader.lazy_load()`) to perform the conversion. Optionally use `merge_chat_runs` to combine message from the same sender in sequence, and/or `map_ai_messages` to convert messages from the specified sender to the \"AIMessage\" class.\n", + "\n", + "## 1. Creat message dump\n", + "\n", + "Currently (2023/08/23) this loader best supports json files in the format generated by exporting your chat history from the [Telegram Desktop App](https://desktop.telegram.org/).\n", + "\n", + "**Important:** There are 'lite' versions of telegram such as \"Telegram for MacOS\" that lack the export functionality. Please make sure you use the correct app to export the file.\n", + "\n", + "To make the export:\n", + "1. Download and open telegram desktop\n", + "2. Select a conversation\n", + "3. Navigate to the conversation settings (currently the three dots in the top right corner)\n", + "4. Click \"Export Chat History\"\n", + "5. Unselect photos and other media. Select \"Machine-readable JSON\" format to export.\n", + "\n", + "An example is below: " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "285f2044-0f58-4b92-addb-9f8569076734", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting telegram_conversation.json\n" + ] + } + ], + "source": [ + "%%writefile telegram_conversation.json\n", + "{\n", + " \"name\": \"Jiminy\",\n", + " \"type\": \"personal_chat\",\n", + " \"id\": 5965280513,\n", + " \"messages\": [\n", + " {\n", + " \"id\": 1,\n", + " \"type\": \"message\",\n", + " \"date\": \"2023-08-23T13:11:23\",\n", + " \"date_unixtime\": \"1692821483\",\n", + " \"from\": \"Jiminy Cricket\",\n", + " \"from_id\": \"user123450513\",\n", + " \"text\": \"You better trust your conscience\",\n", + " \"text_entities\": [\n", + " {\n", + " \"type\": \"plain\",\n", + " \"text\": \"You better trust your conscience\"\n", + " }\n", + " ]\n", + " },\n", + " {\n", + " \"id\": 2,\n", + " \"type\": \"message\",\n", + " \"date\": \"2023-08-23T13:13:20\",\n", + " \"date_unixtime\": \"1692821600\",\n", + " \"from\": \"Batman & Robin\",\n", + " \"from_id\": \"user6565661032\",\n", + " \"text\": \"What did you just say?\",\n", + " \"text_entities\": [\n", + " {\n", + " \"type\": \"plain\",\n", + " \"text\": \"What did you just say?\"\n", + " }\n", + " ]\n", + " }\n", + " ]\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "7cc109f4-4c92-4cd3-8143-c322776c3f03", + "metadata": {}, + "source": [ + "## 2. Create the Chat Loader\n", + "\n", + "All that's required is the file path. You can optionally specify the user name that maps to an ai message as well an configure whether to merge message runs." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "111f7767-573c-42d4-86f0-bd766bbaa071", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_loaders.telegram import TelegramChatLoader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a4226efa-2640-4990-a20c-6861d1887329", + "metadata": {}, + "outputs": [], + "source": [ + "loader = TelegramChatLoader(\n", + " path=\"./telegram_conversation.json\", \n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "71699fb7-7815-4c89-8d96-30e8fada6923", + "metadata": {}, + "source": [ + "## 3. Load messages\n", + "\n", + "The `load()` (or `lazy_load`) methods return a list of \"ChatSessions\" that currently just contain a list of messages per loaded conversation." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "81121efb-c875-4a77-ad1e-fe26b3d7e812", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "from langchain.chat_loaders.base import ChatSession\n", + "from langchain.chat_loaders.utils import (\n", + " map_ai_messages,\n", + " merge_chat_runs,\n", + ")\n", + "\n", + "raw_messages = loader.lazy_load()\n", + "# Merge consecutive messages from the same sender into a single message\n", + "merged_messages = merge_chat_runs(raw_messages)\n", + "# Convert messages from \"Jiminy Cricket\" to AI messages\n", + "messages: List[ChatSession] = list(map_ai_messages(merged_messages, sender=\"Jiminy Cricket\"))" + ] + }, + { + "cell_type": "markdown", + "id": "b9089c05-7375-41ca-a2f9-672a845314e4", + "metadata": {}, + "source": [ + "### Next Steps\n", + "\n", + "You can then use these messages how you see fit, such as finetuning a model, few-shot example selection, or directly make predictions for the next message " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "637a6f5d-6944-4722-9361-a76ef5e9dd2a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I said, \"You better trust your conscience.\"" + ] + } + ], + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "\n", + "llm = ChatOpenAI()\n", + "\n", + "for chunk in llm.stream(messages[0]['messages']):\n", + " print(chunk.content, end=\"\", flush=True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/extras/integrations/chat_loaders/whatsapp.ipynb b/docs/extras/integrations/chat_loaders/whatsapp.ipynb new file mode 100644 index 000000000..a08155843 --- /dev/null +++ b/docs/extras/integrations/chat_loaders/whatsapp.ipynb @@ -0,0 +1,204 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "735455a6-f82e-4252-b545-27385ef883f4", + "metadata": {}, + "source": [ + "# WhatsApp\n", + "\n", + "This notebook shows how to use the WhatsApp chat loader. This class helps map exported Telegram conversations to LangChain chat messages.\n", + "\n", + "The process has three steps:\n", + "1. Export the chat conversations to computer\n", + "2. Create the `WhatsAppChatLoader` with the file path pointed to the json file or directory of JSON files\n", + "3. Call `loader.load()` (or `loader.lazy_load()`) to perform the conversion.\n", + "\n", + "## 1. Creat message dump\n", + "\n", + "To make the export of your WhatsApp conversation(s), complete the following steps:\n", + "\n", + "1. Open the target conversation\n", + "2. Click the three dots in the top right corner and select \"More\".\n", + "3. Then select \"Export chat\" and choose \"Without media\".\n", + "\n", + "An example of the data format for each converation is below: " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "285f2044-0f58-4b92-addb-9f8569076734", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Writing whatsapp_chat.txt\n" + ] + } + ], + "source": [ + "%%writefile whatsapp_chat.txt\n", + "[8/15/23, 9:12:33 AM] Dr. Feather: ‎Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them.\n", + "[8/15/23, 9:12:43 AM] Dr. Feather: I spotted a rare Hyacinth Macaw yesterday in the Amazon Rainforest. Such a magnificent creature!\n", + "‎[8/15/23, 9:12:48 AM] Dr. Feather: ‎image omitted\n", + "[8/15/23, 9:13:15 AM] Jungle Jane: That's stunning! Were you able to observe its behavior?\n", + "‎[8/15/23, 9:13:23 AM] Dr. Feather: ‎image omitted\n", + "[8/15/23, 9:14:02 AM] Dr. Feather: Yes, it seemed quite social with other macaws. They're known for their playful nature.\n", + "[8/15/23, 9:14:15 AM] Jungle Jane: How's the research going on parrot communication?\n", + "‎[8/15/23, 9:14:30 AM] Dr. Feather: ‎image omitted\n", + "[8/15/23, 9:14:50 AM] Dr. Feather: It's progressing well. We're learning so much about how they use sound and color to communicate.\n", + "[8/15/23, 9:15:10 AM] Jungle Jane: That's fascinating! Can't wait to read your paper on it.\n", + "[8/15/23, 9:15:20 AM] Dr. Feather: Thank you! I'll send you a draft soon.\n", + "[8/15/23, 9:25:16 PM] Jungle Jane: Looking forward to it! Keep up the great work." + ] + }, + { + "cell_type": "markdown", + "id": "7cc109f4-4c92-4cd3-8143-c322776c3f03", + "metadata": {}, + "source": [ + "## 2. Create the Chat Loader\n", + "\n", + "The WhatsAppChatLoader accepts the resulting zip file, unzipped directory, or the path to any of the chat `.txt` files therein.\n", + "\n", + "Provide that as well as the user name you want to take on the role of \"AI\" when finetuning." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "111f7767-573c-42d4-86f0-bd766bbaa071", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_loaders.whatsapp import WhatsAppChatLoader" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "a4226efa-2640-4990-a20c-6861d1887329", + "metadata": {}, + "outputs": [], + "source": [ + "loader = WhatsAppChatLoader(\n", + " path=\"./whatsapp_chat.txt\", \n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "71699fb7-7815-4c89-8d96-30e8fada6923", + "metadata": {}, + "source": [ + "## 3. Load messages\n", + "\n", + "The `load()` (or `lazy_load`) methods return a list of \"ChatSessions\" that currently store the list of messages per loaded conversation." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "81121efb-c875-4a77-ad1e-fe26b3d7e812", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'messages': [AIMessage(content='I spotted a rare Hyacinth Macaw yesterday in the Amazon Rainforest. Such a magnificent creature!', additional_kwargs={'sender': 'Dr. Feather', 'events': [{'message_time': '8/15/23, 9:12:43 AM'}]}, example=False),\n", + " HumanMessage(content=\"That's stunning! Were you able to observe its behavior?\", additional_kwargs={'sender': 'Jungle Jane', 'events': [{'message_time': '8/15/23, 9:13:15 AM'}]}, example=False),\n", + " AIMessage(content=\"Yes, it seemed quite social with other macaws. They're known for their playful nature.\", additional_kwargs={'sender': 'Dr. Feather', 'events': [{'message_time': '8/15/23, 9:14:02 AM'}]}, example=False),\n", + " HumanMessage(content=\"How's the research going on parrot communication?\", additional_kwargs={'sender': 'Jungle Jane', 'events': [{'message_time': '8/15/23, 9:14:15 AM'}]}, example=False),\n", + " AIMessage(content=\"It's progressing well. We're learning so much about how they use sound and color to communicate.\", additional_kwargs={'sender': 'Dr. Feather', 'events': [{'message_time': '8/15/23, 9:14:50 AM'}]}, example=False),\n", + " HumanMessage(content=\"That's fascinating! Can't wait to read your paper on it.\", additional_kwargs={'sender': 'Jungle Jane', 'events': [{'message_time': '8/15/23, 9:15:10 AM'}]}, example=False),\n", + " AIMessage(content=\"Thank you! I'll send you a draft soon.\", additional_kwargs={'sender': 'Dr. Feather', 'events': [{'message_time': '8/15/23, 9:15:20 AM'}]}, example=False),\n", + " HumanMessage(content='Looking forward to it! Keep up the great work.', additional_kwargs={'sender': 'Jungle Jane', 'events': [{'message_time': '8/15/23, 9:25:16 PM'}]}, example=False)]}]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from typing import List\n", + "from langchain.chat_loaders.base import ChatSession\n", + "from langchain.chat_loaders.utils import (\n", + " map_ai_messages,\n", + " merge_chat_runs,\n", + ")\n", + "\n", + "raw_messages = loader.lazy_load()\n", + "# Merge consecutive messages from the same sender into a single message\n", + "merged_messages = merge_chat_runs(raw_messages)\n", + "# Convert messages from \"Dr. Feather\" to AI messages\n", + "messages: List[ChatSession] = list(map_ai_messages(merged_messages, sender=\"Dr. Feather\"))" + ] + }, + { + "cell_type": "markdown", + "id": "b9089c05-7375-41ca-a2f9-672a845314e4", + "metadata": {}, + "source": [ + "### Next Steps\n", + "\n", + "You can then use these messages how you see fit, such as finetuning a model, few-shot example selection, or directly make predictions for the next message." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "637a6f5d-6944-4722-9361-a76ef5e9dd2a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thank you for the encouragement! I'll do my best to continue studying and sharing fascinating insights about parrot communication." + ] + } + ], + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "\n", + "llm = ChatOpenAI()\n", + "\n", + "for chunk in llm.stream(messages[0]['messages']):\n", + " print(chunk.content, end=\"\", flush=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16156643-cfbd-444f-b4ae-198eb44f0267", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/langchain/langchain/adapters/openai.py b/libs/langchain/langchain/adapters/openai.py index e9f18408c..b846d4f46 100644 --- a/libs/langchain/langchain/adapters/openai.py +++ b/libs/langchain/langchain/adapters/openai.py @@ -15,6 +15,7 @@ from typing import ( from typing_extensions import Literal +from langchain.chat_loaders.base import ChatSession from langchain.schema.messages import ( AIMessage, AIMessageChunk, @@ -206,3 +207,19 @@ class ChatCompletion: _convert_message_chunk_to_delta(c, i) async for i, c in aenumerate(model_config.astream(converted_messages)) ) + + +def _has_assistant_message(session: ChatSession) -> bool: + """Check if chat session has an assistant message.""" + return any([isinstance(m, AIMessage) for m in session["messages"]]) + + +def convert_messages_for_finetuning( + sessions: Iterable[ChatSession], +) -> List[List[dict]]: + """Convert messages to a list of lists of dictionaries for fine-tuning.""" + return [ + [convert_message_to_dict(s) for s in session["messages"]] + for session in sessions + if _has_assistant_message(session) + ] diff --git a/libs/langchain/langchain/chat_loaders/__init__.py b/libs/langchain/langchain/chat_loaders/__init__.py new file mode 100644 index 000000000..594d87344 --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/__init__.py @@ -0,0 +1,6 @@ +"""Load chat messages from common communications platforms for finetuning. + +This module provides functions to load chat messages from various +communications platforms such as Facebook Messenger, Telegram, and +WhatsApp. The loaded chat messages can be used for finetuning models. +""" diff --git a/libs/langchain/langchain/chat_loaders/base.py b/libs/langchain/langchain/chat_loaders/base.py new file mode 100644 index 000000000..418ba15d2 --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/base.py @@ -0,0 +1,31 @@ +"""Base definitions for chat loaders. + +A chat loader is a class that loads chat messages from an external +source such as a file or a database. The chat messages can then be +used for finetuning. +""" + +from abc import ABC, abstractmethod +from typing import Iterator, List, Sequence, TypedDict + +from langchain.schema.messages import BaseMessage + + +class ChatSession(TypedDict): + """A chat session represents a single + conversation, channel, or other group of messages.""" + + messages: Sequence[BaseMessage] + """The LangChain chat messages loaded from the source.""" + + +class BaseChatLoader(ABC): + """Base class for chat loaders.""" + + @abstractmethod + def lazy_load(self) -> Iterator[ChatSession]: + """Lazy load the chat sessions.""" + + def load(self) -> List[ChatSession]: + """Eagerly load the chat sessions into memory.""" + return list(self.lazy_load()) diff --git a/libs/langchain/langchain/chat_loaders/facebook_messenger.py b/libs/langchain/langchain/chat_loaders/facebook_messenger.py new file mode 100644 index 000000000..5864c3274 --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/facebook_messenger.py @@ -0,0 +1,77 @@ +import json +import logging +from pathlib import Path +from typing import Iterator, Union + +from langchain.chat_loaders.base import BaseChatLoader, ChatSession +from langchain.schema.messages import HumanMessage + +logger = logging.getLogger(__file__) + + +class SingleFileFacebookMessengerChatLoader(BaseChatLoader): + """A chat loader for loading Facebook Messenger chat data from a single file. + + Args: + path (Union[Path, str]): The path to the chat file. + + Attributes: + path (Path): The path to the chat file. + + """ + + def __init__(self, path: Union[Path, str]) -> None: + super().__init__() + self.file_path = path if isinstance(path, Path) else Path(path) + + def lazy_load(self) -> Iterator[ChatSession]: + """Lazy loads the chat data from the file. + + Yields: + ChatSession: A chat session containing the loaded messages. + + """ + with open(self.file_path) as f: + data = json.load(f) + sorted_data = sorted(data["messages"], key=lambda x: x["timestamp_ms"]) + messages = [] + for m in sorted_data: + messages.append( + HumanMessage( + content=m["content"], additional_kwargs={"sender": m["sender_name"]} + ) + ) + yield ChatSession(messages=messages) + + +class FolderFacebookMessengerChatLoader(BaseChatLoader): + """A chat loader for loading Facebook Messenger chat data from a folder. + + Args: + path (Union[str, Path]): The path to the directory + containing the chat files. + + Attributes: + path (Path): The path to the directory containing the chat files. + + """ + + def __init__(self, path: Union[str, Path]) -> None: + super().__init__() + self.directory_path = Path(path) if isinstance(path, str) else path + + def lazy_load(self) -> Iterator[ChatSession]: + """Lazy loads the chat data from the folder. + + Yields: + ChatSession: A chat session containing the loaded messages. + + """ + inbox_path = self.directory_path / "inbox" + for _dir in inbox_path.iterdir(): + if _dir.is_dir(): + for _file in _dir.iterdir(): + if _file.suffix.lower() == ".json": + file_loader = SingleFileFacebookMessengerChatLoader(path=_file) + for result in file_loader.lazy_load(): + yield result diff --git a/libs/langchain/langchain/chat_loaders/slack.py b/libs/langchain/langchain/chat_loaders/slack.py new file mode 100644 index 000000000..261289bb4 --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/slack.py @@ -0,0 +1,84 @@ +import json +import logging +import re +import zipfile +from pathlib import Path +from typing import Dict, Iterator, List, Union + +from langchain import schema +from langchain.chat_loaders import base as chat_loaders + +logger = logging.getLogger(__name__) + + +class SlackChatLoader(chat_loaders.BaseChatLoader): + def __init__( + self, + path: Union[str, Path], + ): + """ + Initialize the chat loader with the path to the exported Slack dump zip file. + + :param path: Path to the exported Slack dump zip file. + """ + self.zip_path = path if isinstance(path, Path) else Path(path) + if not self.zip_path.exists(): + raise FileNotFoundError(f"File {self.zip_path} not found") + + def _load_single_chat_session( + self, messages: List[Dict] + ) -> chat_loaders.ChatSession: + results: List[Union[schema.AIMessage, schema.HumanMessage]] = [] + previous_sender = None + for message in messages: + if not isinstance(message, dict): + continue + text = message.get("text", "") + timestamp = message.get("ts", "") + sender = message.get("user", "") + if not sender: + continue + skip_pattern = re.compile( + r"<@U\d+> has joined the channel", flags=re.IGNORECASE + ) + if skip_pattern.match(text): + continue + if sender == previous_sender: + results[-1].content += "\n\n" + text + results[-1].additional_kwargs["events"].append( + {"message_time": timestamp} + ) + else: + results.append( + schema.HumanMessage( + role=sender, + content=text, + additional_kwargs={ + "sender": sender, + "events": [{"message_time": timestamp}], + }, + ) + ) + previous_sender = sender + return chat_loaders.ChatSession(messages=results) + + def _read_json(self, zip_file: zipfile.ZipFile, file_path: str) -> List[dict]: + """Read JSON data from a zip subfile.""" + with zip_file.open(file_path, "r") as f: + data = json.load(f) + if not isinstance(data, list): + raise ValueError(f"Expected list of dictionaries, got {type(data)}") + return data + + def lazy_load(self) -> Iterator[chat_loaders.ChatSession]: + """ + Lazy load the chat sessions from the Slack dump file and yield them + in the required format. + + :return: Iterator of chat sessions containing messages. + """ + with zipfile.ZipFile(str(self.zip_path), "r") as zip_file: + for file_path in zip_file.namelist(): + if file_path.endswith(".json"): + messages = self._read_json(zip_file, file_path) + yield self._load_single_chat_session(messages) diff --git a/libs/langchain/langchain/chat_loaders/telegram.py b/libs/langchain/langchain/chat_loaders/telegram.py new file mode 100644 index 000000000..786dad727 --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/telegram.py @@ -0,0 +1,152 @@ +import json +import logging +import os +import zipfile +from pathlib import Path +from typing import Iterator, List, Union + +from langchain import schema +from langchain.chat_loaders import base as chat_loaders + +logger = logging.getLogger(__name__) + + +class TelegramChatLoader(chat_loaders.BaseChatLoader): + """A loading utility for converting telegram conversations + to LangChain chat messages. + + To export, use the Telegram Desktop app from + https://desktop.telegram.org/, select a conversation, click the three dots + in the top right corner, and select "Export chat history". Then select + "Machine-readable JSON" (preferred) to export. Note: the 'lite' versions of + the desktop app (like "Telegram for MacOS") do not support exporting chat + history. + """ + + def __init__( + self, + path: Union[str, Path], + ): + """Initialize the TelegramChatLoader. + + Args: + path (Union[str, Path]): Path to the exported Telegram chat zip, + directory, json, or HTML file. + """ + self.path = path if isinstance(path, str) else str(path) + + def _load_single_chat_session_html( + self, file_path: str + ) -> chat_loaders.ChatSession: + """Load a single chat session from an HTML file. + + Args: + file_path (str): Path to the HTML file. + + Returns: + chat_loaders.ChatSession: The loaded chat session. + """ + try: + from bs4 import BeautifulSoup + except ImportError: + raise ImportError( + "Please install the 'beautifulsoup4' package to load" + " Telegram HTML files. You can do this by running" + "'pip install beautifulsoup4' in your terminal." + ) + with open(file_path, "r", encoding="utf-8") as file: + soup = BeautifulSoup(file, "html.parser") + + results: List[Union[schema.HumanMessage, schema.AIMessage]] = [] + previous_sender = None + for message in soup.select(".message.default"): + timestamp = message.select_one(".pull_right.date.details")["title"] + from_name_element = message.select_one(".from_name") + if from_name_element is None and previous_sender is None: + logger.debug("from_name not found in message") + continue + elif from_name_element is None: + from_name = previous_sender + else: + from_name = from_name_element.text.strip() + text = message.select_one(".text").text.strip() + results.append( + schema.HumanMessage( + content=text, + additional_kwargs={ + "sender": from_name, + "events": [{"message_time": timestamp}], + }, + ) + ) + previous_sender = from_name + + return chat_loaders.ChatSession(messages=results) + + def _load_single_chat_session_json( + self, file_path: str + ) -> chat_loaders.ChatSession: + """Load a single chat session from a JSON file. + + Args: + file_path (str): Path to the JSON file. + + Returns: + chat_loaders.ChatSession: The loaded chat session. + """ + with open(file_path, "r", encoding="utf-8") as file: + data = json.load(file) + + messages = data.get("messages", []) + results: List[schema.BaseMessage] = [] + for message in messages: + text = message.get("text", "") + timestamp = message.get("date", "") + from_name = message.get("from", "") + + results.append( + schema.HumanMessage( + content=text, + additional_kwargs={ + "sender": from_name, + "events": [{"message_time": timestamp}], + }, + ) + ) + + return chat_loaders.ChatSession(messages=results) + + def _iterate_files(self, path: str) -> Iterator[str]: + """Iterate over files in a directory or zip file. + + Args: + path (str): Path to the directory or zip file. + + Yields: + str: Path to each file. + """ + if os.path.isfile(path) and path.endswith((".html", ".json")): + yield path + elif os.path.isdir(path): + for root, _, files in os.walk(path): + for file in files: + if file.endswith((".html", ".json")): + yield os.path.join(root, file) + elif zipfile.is_zipfile(path): + with zipfile.ZipFile(path) as zip_file: + for file in zip_file.namelist(): + if file.endswith((".html", ".json")): + yield zip_file.extract(file) + + def lazy_load(self) -> Iterator[chat_loaders.ChatSession]: + """Lazy load the messages from the chat file and yield them + in as chat sessions. + + Yields: + chat_loaders.ChatSession: The loaded chat session. + """ + for file_path in self._iterate_files(self.path): + if file_path.endswith(".html"): + yield self._load_single_chat_session_html(file_path) + elif file_path.endswith(".json"): + yield self._load_single_chat_session_json(file_path) diff --git a/libs/langchain/langchain/chat_loaders/utils.py b/libs/langchain/langchain/chat_loaders/utils.py new file mode 100644 index 000000000..da41cfd23 --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/utils.py @@ -0,0 +1,86 @@ +"""Utilities for chat loaders.""" +from copy import deepcopy +from typing import Iterable, Iterator, List + +from langchain import schema +from langchain.chat_loaders.base import ChatSession +from langchain.schema.messages import BaseMessage + + +def merge_chat_runs_in_session( + chat_session: ChatSession, delimiter: str = "\n\n" +) -> ChatSession: + """Merge chat runs together in a chat session. + + A chat run is a sequence of messages from the same sender. + + Args: + chat_session: A chat session. + + Returns: + A chat session with merged chat runs. + """ + messages: List[BaseMessage] = [] + for message in chat_session["messages"]: + if not messages: + messages.append(deepcopy(message)) + elif ( + isinstance(message, type(messages[-1])) + and messages[-1].additional_kwargs.get("sender") is not None + and messages[-1].additional_kwargs["sender"] + == message.additional_kwargs.get("sender") + ): + messages[-1].content = ( + messages[-1].content + delimiter + message.content + ).strip() + messages[-1].additional_kwargs.get("events", []).extend( + message.additional_kwargs.get("events") or [] + ) + else: + messages.append(deepcopy(message)) + return ChatSession(messages=messages) + + +def merge_chat_runs(chat_sessions: Iterable[ChatSession]) -> Iterator[ChatSession]: + """Merge chat runs together. + + A chat run is a sequence of messages from the same sender. + + Args: + chat_sessions: A list of chat sessions. + + Returns: + A list of chat sessions with merged chat runs. + """ + for chat_session in chat_sessions: + yield merge_chat_runs_in_session(chat_session) + + +def map_ai_messages_in_session(chat_sessions: ChatSession, sender: str) -> ChatSession: + """Convert messages from the specified 'sender' to AI messages. + + This is useful for fine-tuning the AI to adapt to your voice. + """ + messages = [] + num_converted = 0 + for message in chat_sessions["messages"]: + if message.additional_kwargs.get("sender") == sender: + message = schema.AIMessage( + content=message.content, + additional_kwargs=message.additional_kwargs.copy(), + example=getattr(message, "example", None), + ) + num_converted += 1 + messages.append(message) + return ChatSession(messages=messages) + + +def map_ai_messages( + chat_sessions: Iterable[ChatSession], sender: str +) -> Iterator[ChatSession]: + """Convert messages from the specified 'sender' to AI messages. + + This is useful for fine-tuning the AI to adapt to your voice. + """ + for chat_session in chat_sessions: + yield map_ai_messages_in_session(chat_session, sender) diff --git a/libs/langchain/langchain/chat_loaders/whatsapp.py b/libs/langchain/langchain/chat_loaders/whatsapp.py new file mode 100644 index 000000000..c911e262c --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/whatsapp.py @@ -0,0 +1,116 @@ +import logging +import os +import re +import zipfile +from typing import Iterator, List, Union + +from langchain import schema +from langchain.chat_loaders import base as chat_loaders +from langchain.schema import messages + +logger = logging.getLogger(__name__) + + +class WhatsAppChatLoader(chat_loaders.BaseChatLoader): + def __init__(self, path: str): + """Initialize the WhatsAppChatLoader. + + Args: + path (str): Path to the exported WhatsApp chat + zip directory, folder, or file. + + To generate the dump, open the chat, click the three dots in the top + right corner, and select "More". Then select "Export chat" and + choose "Without media". + """ + self.path = path + ignore_lines = [ + "This message was deleted", + "", + "image omitted", + "Messages and calls are end-to-end encrypted. No one outside of this chat," + " not even WhatsApp, can read or listen to them.", + ] + self._ignore_lines = re.compile( + r"(" + "|".join([r"\u200E*" + line for line in ignore_lines]) + r")", + flags=re.IGNORECASE, + ) + self._message_line_regex = re.compile( + r"\u200E*\[?(\d{1,2}/\d{1,2}/\d{2,4}, \d{1,2}:\d{2}:\d{2} (?:AM|PM))\]?[ \u200E]*([^:]+): (.+)", # noqa + flags=re.IGNORECASE, + ) + + def _load_single_chat_session(self, file_path: str) -> chat_loaders.ChatSession: + """Load a single chat session from a file. + + Args: + file_path (str): Path to the chat file. + + Returns: + ChatSession: The loaded chat session. + """ + with open(file_path, "r", encoding="utf-8") as file: + txt = file.read() + + # Split messages by newlines, but keep multi-line messages grouped + chat_lines: List[str] = [] + current_message = "" + for line in txt.split("\n"): + if self._message_line_regex.match(line): + if current_message: + chat_lines.append(current_message) + current_message = line + else: + current_message += " " + line.strip() + if current_message: + chat_lines.append(current_message) + results: List[Union[messages.HumanMessage, messages.AIMessage]] = [] + for line in chat_lines: + result = self._message_line_regex.match(line.strip()) + if result: + timestamp, sender, text = result.groups() + if not self._ignore_lines.match(text.strip()): + results.append( + schema.HumanMessage( + role=sender, + content=text, + additional_kwargs={ + "sender": sender, + "events": [{"message_time": timestamp}], + }, + ) + ) + else: + logger.debug(f"Could not parse line: {line}") + return chat_loaders.ChatSession(messages=results) + + def _iterate_files(self, path: str) -> Iterator[str]: + """Iterate over the files in a directory or zip file. + + Args: + path (str): Path to the directory or zip file. + + Yields: + str: The path to each file. + """ + if os.path.isfile(path): + yield path + elif os.path.isdir(path): + for root, _, files in os.walk(path): + for file in files: + if file.endswith(".txt"): + yield os.path.join(root, file) + elif zipfile.is_zipfile(path): + with zipfile.ZipFile(path) as zip_file: + for file in zip_file.namelist(): + if file.endswith(".txt"): + yield zip_file.extract(file) + + def lazy_load(self) -> Iterator[chat_loaders.ChatSession]: + """Lazy load the messages from the chat file and yield + them as chat sessions. + + Yields: + Iterator[ChatSession]: The loaded chat sessions. + """ + yield self._load_single_chat_session(self.path) diff --git a/libs/langchain/tests/unit_tests/chat_loaders/__init__.py b/libs/langchain/tests/unit_tests/chat_loaders/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_html/messages.html b/libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_html/messages.html new file mode 100644 index 000000000..a90ba5449 --- /dev/null +++ b/libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_html/messages.html @@ -0,0 +1,166 @@ + + + + + + +Exported Data + + + + + + + + + + +
    + + + +
    + +
    + +
    + +
    +23 August 2023 +
    + +
    + +
    + +
    + +
    + +
    +bA +
    + +
    + +
    + +
    + +
    +13:11 +
    + +
    +Jimmeny Marvelton +
    + +
    +i refuse to converse with you +
    + +
    + +
    + +
    + +
    + +
    + +
    +WF +
    + +
    + +
    + +
    + +
    +13:13 +
    + +
    + Batman & Robin +
    + +
    +Hi nemesis +
    + +
    + +
    + +
    + +
    + +
    + +
    +bA +
    + +
    + +
    + +
    + +
    +13:15 +
    + +
    +Jimmeny Marvelton +
    + +
    +we meet again +
    + +
    + +
    + +
    + +
    + +
    +13:15 +
    + +
    +you will not trick me this time +
    + +
    + +
    + +
    + +
    + +
    + + + + diff --git a/libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_json/result.json b/libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_json/result.json new file mode 100644 index 000000000..e40d6a1f4 --- /dev/null +++ b/libs/langchain/tests/unit_tests/chat_loaders/data/telegram_chat_json/result.json @@ -0,0 +1,67 @@ +{ + "name": "Jimmeny", + "type": "personal_chat", + "id": 5965280513, + "messages": [ + { + "id": 1, + "type": "message", + "date": "2023-08-23T13:11:23", + "date_unixtime": "1692821483", + "from": "Jimmeny Marvelton", + "from_id": "user123450513", + "text": "i refuse to converse with you", + "text_entities": [ + { + "type": "plain", + "text": "i refuse to converse with you" + } + ] + }, + { + "id": 2, + "type": "message", + "date": "2023-08-23T13:13:20", + "date_unixtime": "1692821600", + "from": "Batman & Robin", + "from_id": "user6565661032", + "text": "Hi nemesis", + "text_entities": [ + { + "type": "plain", + "text": "Hi nemesis" + } + ] + }, + { + "id": 3, + "type": "message", + "date": "2023-08-23T13:15:35", + "date_unixtime": "1692821735", + "from": "Jimmeny Marvelton", + "from_id": "user123450513", + "text": "we meet again", + "text_entities": [ + { + "type": "plain", + "text": "we meet again" + } + ] + }, + { + "id": 4, + "type": "message", + "date": "2023-08-23T13:15:53", + "date_unixtime": "1692821753", + "from": "Jimmeny Marvelton", + "from_id": "user123450513", + "text": "you will not trick me this time", + "text_entities": [ + { + "type": "plain", + "text": "you will not trick me this time" + } + ] + } + ] +} \ No newline at end of file diff --git a/libs/langchain/tests/unit_tests/chat_loaders/data/whatsapp_chat.txt b/libs/langchain/tests/unit_tests/chat_loaders/data/whatsapp_chat.txt new file mode 100644 index 000000000..54056c435 --- /dev/null +++ b/libs/langchain/tests/unit_tests/chat_loaders/data/whatsapp_chat.txt @@ -0,0 +1,12 @@ +[8/15/23, 9:12:33 AM] Dr. Feather: ‎Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. +[8/15/23, 9:12:43 AM] Dr. Feather: I spotted a rare Hyacinth Macaw yesterday in the Amazon Rainforest. Such a magnificent creature! +‎[8/15/23, 9:12:48 AM] Dr. Feather: ‎image omitted +[8/15/23, 9:13:15 AM] Jungle Jane: That's stunning! Were you able to observe its behavior? +‎[8/15/23, 9:13:23 AM] Dr. Feather: ‎image omitted +[8/15/23, 9:14:02 AM] Dr. Feather: Yes, it seemed quite social with other macaws. They're known for their playful nature. +[8/15/23, 9:14:15 AM] Jungle Jane: How's the research going on parrot communication? +‎[8/15/23, 9:14:30 AM] Dr. Feather: ‎image omitted +[8/15/23, 9:14:50 AM] Dr. Feather: It's progressing well. We're learning so much about how they use sound and color to communicate. +[8/15/23, 9:15:10 AM] Jungle Jane: That's fascinating! Can't wait to read your paper on it. +[8/15/23, 9:15:20 AM] Dr. Feather: Thank you! I'll send you a draft soon. +[8/15/23, 9:25:16 PM] Jungle Jane: Looking forward to it! Keep up the great work. diff --git a/libs/langchain/tests/unit_tests/chat_loaders/test_slack.py b/libs/langchain/tests/unit_tests/chat_loaders/test_slack.py new file mode 100644 index 000000000..cdf569d60 --- /dev/null +++ b/libs/langchain/tests/unit_tests/chat_loaders/test_slack.py @@ -0,0 +1,24 @@ +import pathlib + +from langchain.chat_loaders import slack, utils + + +def test_slack_chat_loader() -> None: + chat_path = ( + pathlib.Path(__file__).parents[2] + / "integration_tests" + / "examples" + / "slack_export.zip" + ) + loader = slack.SlackChatLoader(str(chat_path)) + + chat_sessions = list( + utils.map_ai_messages(loader.lazy_load(), sender="U0500003428") + ) + assert chat_sessions, "Chat sessions should not be empty" + + assert chat_sessions[1]["messages"], "Chat messages should not be empty" + + assert ( + "Example message" in chat_sessions[1]["messages"][0].content + ), "Chat content mismatch" diff --git a/libs/langchain/tests/unit_tests/chat_loaders/test_telegram.py b/libs/langchain/tests/unit_tests/chat_loaders/test_telegram.py new file mode 100644 index 000000000..7984adc19 --- /dev/null +++ b/libs/langchain/tests/unit_tests/chat_loaders/test_telegram.py @@ -0,0 +1,97 @@ +"""Test the telegram chat loader.""" +import pathlib +import tempfile +import zipfile +from typing import Sequence + +import pytest + +from langchain import schema +from langchain.chat_loaders import telegram, utils + + +def _assert_messages_are_equal( + actual_messages: Sequence[schema.BaseMessage], + expected_messages: Sequence[schema.BaseMessage], +) -> None: + assert len(actual_messages) == len(expected_messages) + for actual, expected in zip(actual_messages, expected_messages): + assert actual.content == expected.content + assert ( + actual.additional_kwargs["sender"] == expected.additional_kwargs["sender"] + ) + + +def _check_telegram_chat_loader(path: str) -> None: + _data_dir = pathlib.Path(__file__).parent / "data" + source_path = _data_dir / path + # Create a zip file from the directory in a temp directory + with tempfile.TemporaryDirectory() as temp_dir_: + temp_dir = pathlib.Path(temp_dir_) + if path.endswith(".zip"): + # Make a new zip file + zip_path = temp_dir / "telegram_chat.zip" + with zipfile.ZipFile(zip_path, "w") as zip_file: + original_path = _data_dir / path.replace(".zip", "") + for file_path in original_path.iterdir(): + zip_file.write(file_path, arcname=file_path.name) + source_path = zip_path + loader = telegram.TelegramChatLoader(str(source_path)) + chat_sessions_ = loader.lazy_load() + chat_sessions_ = utils.merge_chat_runs(chat_sessions_) + chat_sessions = list( + utils.map_ai_messages(chat_sessions_, sender="Batman & Robin") + ) + assert len(chat_sessions) == 1 + session = chat_sessions[0] + assert len(session["messages"]) > 0 + assert session["messages"][0].content == "i refuse to converse with you" + expected_content = [ + schema.HumanMessage( + content="i refuse to converse with you", + additional_kwargs={ + "sender": "Jimmeny Marvelton", + "events": [{"message_time": "23.08.2023 13:11:23 UTC-08:00"}], + }, + ), + schema.AIMessage( + content="Hi nemesis", + additional_kwargs={ + "sender": "Batman & Robin", + "events": [{"message_time": "23.08.2023 13:13:20 UTC-08:00"}], + }, + ), + schema.HumanMessage( + content="we meet again\n\nyou will not trick me this time", + additional_kwargs={ + "sender": "Jimmeny Marvelton", + "events": [{"message_time": "23.08.2023 13:15:35 UTC-08:00"}], + }, + ), + ] + _assert_messages_are_equal(session["messages"], expected_content) + + +@pytest.mark.parametrize( + "path", + [ + "telegram_chat_json", + "telegram_chat_json.zip", + "telegram_chat_json/result.json", + ], +) +def test_telegram_chat_loader(path: str) -> None: + _check_telegram_chat_loader(path) + + +@pytest.mark.skip(reason="requires bs4 but marking it as such doesn't seem to work") +@pytest.mark.parametrize( + "path", + [ + "telegram_chat_json", + "telegram_chat_json.zip", + "telegram_chat_json/result.json", + ], +) +def test_telegram_chat_loader_html(path: str) -> None: + _check_telegram_chat_loader(path) diff --git a/libs/langchain/tests/unit_tests/chat_loaders/test_whatsapp.py b/libs/langchain/tests/unit_tests/chat_loaders/test_whatsapp.py new file mode 100644 index 000000000..9263a80b1 --- /dev/null +++ b/libs/langchain/tests/unit_tests/chat_loaders/test_whatsapp.py @@ -0,0 +1,20 @@ +import pathlib + +from langchain.chat_loaders import utils, whatsapp + + +def test_whatsapp_chat_loader() -> None: + chat_path = pathlib.Path(__file__).parent / "data" / "whatsapp_chat.txt" + loader = whatsapp.WhatsAppChatLoader(str(chat_path)) + + chat_sessions = list( + utils.map_ai_messages(loader.lazy_load(), sender="Dr. Feather") + ) + assert chat_sessions, "Chat sessions should not be empty" + + assert chat_sessions[0]["messages"], "Chat messages should not be empty" + + assert ( + "I spotted a rare Hyacinth Macaw yesterday in the Amazon Rainforest." + " Such a magnificent creature!" in chat_sessions[0]["messages"][0].content + ), "Chat content mismatch" From dc30edf51ca7f53d8786276326907597880674cd Mon Sep 17 00:00:00 2001 From: Tudor Golubenco Date: Fri, 25 Aug 2023 01:37:46 +0100 Subject: [PATCH 119/143] Xata as a chat message memory store (#9719) This adds Xata as a memory store also to the python version of LangChain, similar to the [one for LangChain.js](https://github.com/hwchase17/langchainjs/pull/2217). I have added a Jupyter Notebook with a simple and a more complex example using an agent. To run the integration test, you need to execute something like: ``` XATA_API_KEY='xau_...' XATA_DB_URL="https://demo-uni3q8.eu-west-1.xata.sh/db/langchain" poetry run pytest tests/integration_tests/memory/test_xata.py ``` Where `langchain` is the database you create in Xata. --- .../memory/xata_chat_message_history.ipynb | 326 ++++++++++++++++++ libs/langchain/langchain/memory/__init__.py | 2 + .../memory/chat_message_histories/__init__.py | 2 + .../memory/chat_message_histories/xata.py | 132 +++++++ .../integration_tests/memory/test_xata.py | 41 +++ 5 files changed, 503 insertions(+) create mode 100644 docs/extras/integrations/memory/xata_chat_message_history.ipynb create mode 100644 libs/langchain/langchain/memory/chat_message_histories/xata.py create mode 100644 libs/langchain/tests/integration_tests/memory/test_xata.py diff --git a/docs/extras/integrations/memory/xata_chat_message_history.ipynb b/docs/extras/integrations/memory/xata_chat_message_history.ipynb new file mode 100644 index 000000000..938f6c44b --- /dev/null +++ b/docs/extras/integrations/memory/xata_chat_message_history.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Xata chat memory\n", + "\n", + "[Xata](https://xata.io) is a serverless data platform, based on PostgreSQL and Elasticsearch. It provides a Python SDK for interacting with your database, and a UI for managing your data. With the `XataChatMessageHistory` class, you can use Xata databases for longer-term persistence of chat sessions.\n", + "\n", + "This notebook covers:\n", + "\n", + "* A simple example showing what `XataChatMessageHistory` does.\n", + "* A more complex example using a REACT agent that answer questions based on a knowledge based or documentation (stored in Xata as a vector store) and also having a long-term searchable history of its past messages (stored in Xata as a memory store)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "### Create a database\n", + "\n", + "In the [Xata UI](https://app.xata.io) create a new database. You can name it whatever you want, in this notepad we'll use `langchain`. The Langchain integration can auto-create the table used for storying the memory, and this is what we'll use in this example. If you want to pre-create the table, ensure it has the right schema and set `create_table` to `False` when creating the class. Pre-creating the table saves one round-trip to the database during each session initialization." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first install our dependencies:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install xata==1.0.0rc0 openai langchain" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we need to get the environment variables for Xata. You can create a new API key by visiting your [account settings](https://app.xata.io/settings). To find the database URL, go to the Settings page of the database that you have created. The database URL should look something like this: `https://demo-uni3q8.eu-west-1.xata.sh/db/langchain`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "\n", + "api_key = getpass.getpass(\"Xata API key: \")\n", + "db_url = input(\"Xata database URL (copy it from your DB settings):\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a simple memory store\n", + "\n", + "To test the memory store functionality in isolation, let's use the following code snippet:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.memory import XataChatMessageHistory\n", + "\n", + "history = XataChatMessageHistory(\n", + " session_id=\"session-1\",\n", + " api_key=api_key,\n", + " db_url=db_url,\n", + " table_name=\"memory\"\n", + ")\n", + "\n", + "history.add_user_message(\"hi!\")\n", + "\n", + "history.add_ai_message(\"whats up?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code creates a session with the ID `session-1` and stores two messages in it. After running the above, if you visit the Xata UI, you should see a table named `memory` and the two messages added to it.\n", + "\n", + "You can retrieve the message history for a particular session with the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "history.messages" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conversational Q&A chain on your data with memory\n", + "\n", + "Let's now see a more complex example in which we combine OpenAI, the Xata Vector Store integration, and the Xata memory store integration to create a Q&A chat bot on your data, with follow-up questions and history." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We're going to need to access the OpenAI API, so let's configure the API key:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key:\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To store the documents that the chatbot will search for answers, add a table named `docs` to your `langchain` database using the Xata UI, and add the following columns:\n", + "\n", + "* `content` of type \"Text\". This is used to store the `Document.pageContent` values.\n", + "* `embedding` of type \"Vector\". Use the dimension used by the model you plan to use. In this notebook we use OpenAI embeddings, which have 1536 dimensions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's create the vector store and add some sample docs to it:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.embeddings.openai import OpenAIEmbeddings\n", + "from langchain.vectorstores.xata import XataVectorStore\n", + "\n", + "embeddings = OpenAIEmbeddings()\n", + "\n", + "texts = [\n", + " \"Xata is a Serverless Data platform based on PostgreSQL\",\n", + " \"Xata offers a built-in vector type that can be used to store and query vectors\",\n", + " \"Xata includes similarity search\"\n", + "]\n", + "\n", + "vector_store = XataVectorStore.from_texts(texts, embeddings, api_key=api_key, db_url=db_url, table_name=\"docs\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After running the above command, if you go to the Xata UI, you should see the documents loaded together with their embeddings in the `docs` table." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's now create a ConversationBufferMemory to store the chat messages from both the user and the AI." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.memory import ConversationBufferMemory\n", + "from uuid import uuid4\n", + "\n", + "chat_memory = XataChatMessageHistory(\n", + " session_id=str(uuid4()), # needs to be unique per user session\n", + " api_key=api_key,\n", + " db_url=db_url,\n", + " table_name=\"memory\"\n", + ")\n", + "memory = ConversationBufferMemory(memory_key=\"chat_history\", chat_memory=chat_memory, return_messages=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now it's time to create an Agent to use both the vector store and the chat memory together." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.agents import initialize_agent, AgentType\n", + "from langchain.agents.agent_toolkits import create_retriever_tool\n", + "from langchain.chat_models import ChatOpenAI\n", + "\n", + "tool = create_retriever_tool(\n", + " vector_store.as_retriever(), \n", + " \"search_docs\",\n", + " \"Searches and returns documents from the Xata manual. Useful when you need to answer questions about Xata.\"\n", + ")\n", + "tools = [tool]\n", + "\n", + "llm = ChatOpenAI(temperature=0)\n", + "\n", + "agent = initialize_agent(\n", + " tools,\n", + " llm,\n", + " agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,\n", + " verbose=True,\n", + " memory=memory)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To test, let's tell the agent our name:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "agent.run(input=\"My name is bob\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's now ask the agent some questions about Xata:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "agent.run(input=\"What is xata?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that it answers based on the data stored in the document store. And now, let's ask a follow up question:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "agent.run(input=\"Does it support similarity search?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now let's test its memory:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "agent.run(input=\"Did I tell you my name? What is it?\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/libs/langchain/langchain/memory/__init__.py b/libs/langchain/langchain/memory/__init__.py index e0ac6371f..f2a61ef2f 100644 --- a/libs/langchain/langchain/memory/__init__.py +++ b/libs/langchain/langchain/memory/__init__.py @@ -43,6 +43,7 @@ from langchain.memory.chat_message_histories import ( RedisChatMessageHistory, SQLChatMessageHistory, StreamlitChatMessageHistory, + XataChatMessageHistory, ZepChatMessageHistory, ) from langchain.memory.combined import CombinedMemory @@ -90,6 +91,7 @@ __all__ = [ "SimpleMemory", "StreamlitChatMessageHistory", "VectorStoreRetrieverMemory", + "XataChatMessageHistory", "ZepChatMessageHistory", "ZepMemory", ] diff --git a/libs/langchain/langchain/memory/chat_message_histories/__init__.py b/libs/langchain/langchain/memory/chat_message_histories/__init__.py index 02241675b..ddd23de4f 100644 --- a/libs/langchain/langchain/memory/chat_message_histories/__init__.py +++ b/libs/langchain/langchain/memory/chat_message_histories/__init__.py @@ -17,6 +17,7 @@ from langchain.memory.chat_message_histories.sql import SQLChatMessageHistory from langchain.memory.chat_message_histories.streamlit import ( StreamlitChatMessageHistory, ) +from langchain.memory.chat_message_histories.xata import XataChatMessageHistory from langchain.memory.chat_message_histories.zep import ZepChatMessageHistory __all__ = [ @@ -33,5 +34,6 @@ __all__ = [ "RocksetChatMessageHistory", "SQLChatMessageHistory", "StreamlitChatMessageHistory", + "XataChatMessageHistory", "ZepChatMessageHistory", ] diff --git a/libs/langchain/langchain/memory/chat_message_histories/xata.py b/libs/langchain/langchain/memory/chat_message_histories/xata.py new file mode 100644 index 000000000..de358888a --- /dev/null +++ b/libs/langchain/langchain/memory/chat_message_histories/xata.py @@ -0,0 +1,132 @@ +import json +from typing import List + +from langchain.schema import ( + BaseChatMessageHistory, +) +from langchain.schema.messages import BaseMessage, _message_to_dict, messages_from_dict + + +class XataChatMessageHistory(BaseChatMessageHistory): + """Chat message history stored in a Xata database.""" + + def __init__( + self, + session_id: str, + db_url: str, + api_key: str, + branch_name: str = "main", + table_name: str = "messages", + create_table: bool = True, + ) -> None: + """Initialize with Xata client.""" + try: + from xata.client import XataClient # noqa: F401 + except ImportError: + raise ValueError( + "Could not import xata python package. " + "Please install it with `pip install xata`." + ) + self._client = XataClient( + api_key=api_key, db_url=db_url, branch_name=branch_name + ) + self._table_name = table_name + self._session_id = session_id + + if create_table: + self._create_table_if_not_exists() + + def _create_table_if_not_exists(self) -> None: + r = self._client.table().get_schema(self._table_name) + if r.status_code <= 299: + return + if r.status_code != 404: + raise Exception( + f"Error checking if table exists in Xata: {r.status_code} {r}" + ) + r = self._client.table().create(self._table_name) + if r.status_code > 299: + raise Exception(f"Error creating table in Xata: {r.status_code} {r}") + r = self._client.table().set_schema( + self._table_name, + payload={ + "columns": [ + {"name": "sessionId", "type": "string"}, + {"name": "type", "type": "string"}, + {"name": "role", "type": "string"}, + {"name": "content", "type": "text"}, + {"name": "name", "type": "string"}, + {"name": "additionalKwargs", "type": "text"}, + ] + }, + ) + if r.status_code > 299: + raise Exception(f"Error setting table schema in Xata: {r.status_code} {r}") + + def add_message(self, message: BaseMessage) -> None: + """Append the message to the Xata table""" + msg = _message_to_dict(message) + r = self._client.records().insert( + self._table_name, + { + "sessionId": self._session_id, + "type": msg["type"], + "content": message.content, + "additionalKwargs": json.dumps(message.additional_kwargs), + "role": msg["data"].get("role"), + "name": msg["data"].get("name"), + }, + ) + if r.status_code > 299: + raise Exception(f"Error adding message to Xata: {r.status_code} {r}") + + @property + def messages(self) -> List[BaseMessage]: # type: ignore + r = self._client.data().query( + self._table_name, + payload={ + "filter": { + "sessionId": self._session_id, + }, + "sort": {"xata.createdAt": "asc"}, + }, + ) + if r.status_code != 200: + raise Exception(f"Error running query: {r.status_code} {r}") + msgs = messages_from_dict( + [ + { + "type": m["type"], + "data": { + "content": m["content"], + "role": m.get("role"), + "name": m.get("name"), + "additionalKwargs": json.loads(m["additionalKwargs"]), + }, + } + for m in r["records"] + ] + ) + return msgs + + def clear(self) -> None: + """Delete session from Xata table.""" + while True: + r = self._client.data().query( + self._table_name, + payload={ + "columns": ["id"], + "filter": { + "sessionId": self._session_id, + }, + }, + ) + if r.status_code != 200: + raise Exception(f"Error running query: {r.status_code} {r}") + ids = [rec["id"] for rec in r["records"]] + if len(ids) == 0: + break + operations = [ + {"delete": {"table": self._table_name, "id": id}} for id in ids + ] + self._client.records().transaction(payload={"operations": operations}) diff --git a/libs/langchain/tests/integration_tests/memory/test_xata.py b/libs/langchain/tests/integration_tests/memory/test_xata.py new file mode 100644 index 000000000..88bd158a2 --- /dev/null +++ b/libs/langchain/tests/integration_tests/memory/test_xata.py @@ -0,0 +1,41 @@ +"""Test Xata chat memory store functionality. + +Before running this test, please create a Xata database. +""" + +import json +import os + +from langchain.memory import ConversationBufferMemory +from langchain.memory.chat_message_histories import XataChatMessageHistory +from langchain.schema.messages import _message_to_dict + + +class TestXata: + @classmethod + def setup_class(cls) -> None: + assert os.getenv("XATA_API_KEY"), "XATA_API_KEY environment variable is not set" + assert os.getenv("XATA_DB_URL"), "XATA_DB_URL environment variable is not set" + + def test_xata_chat_memory(self) -> None: + message_history = XataChatMessageHistory( + api_key=os.getenv("XATA_API_KEY", ""), + db_url=os.getenv("XATA_DB_URL", ""), + session_id="integration-test-session", + ) + memory = ConversationBufferMemory( + memory_key="baz", chat_memory=message_history, return_messages=True + ) + # add some messages + memory.chat_memory.add_ai_message("This is me, the AI") + memory.chat_memory.add_user_message("This is me, the human") + + # get the message history from the memory store and turn it into a json + messages = memory.chat_memory.messages + messages_json = json.dumps([_message_to_dict(msg) for msg in messages]) + + assert "This is me, the AI" in messages_json + assert "This is me, the human" in messages_json + + # remove the record from Redis, so the next test run won't pick it up + memory.chat_memory.clear() From 3e5cda3405ec1aa369fe90253d88f3e26a03db10 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Thu, 24 Aug 2023 17:41:54 -0700 Subject: [PATCH 120/143] Hub Push Ergonomics (#9731) Improves the hub pushing experience, returning a url instead of just a commit hash. Requires hub sdk 0.1.8 --- libs/langchain/langchain/hub.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libs/langchain/langchain/hub.py b/libs/langchain/langchain/hub.py index 21e7348ea..0c0d2d0fe 100644 --- a/libs/langchain/langchain/hub.py +++ b/libs/langchain/langchain/hub.py @@ -34,7 +34,7 @@ def push( new_repo_description: str = "", ) -> str: """ - Pushes an object to the hub and returns the new commit hash. + Pushes an object to the hub and returns the URL it can be viewed at in a browser. :param repo_full_name: The full name of the repo to push to in the format of `owner/repo`. @@ -51,15 +51,14 @@ def push( """ client = _get_client(api_url=api_url, api_key=api_key) manifest_json = dumps(object) - resp = client.push( + message = client.push( repo_full_name, manifest_json, parent_commit_hash=parent_commit_hash, new_repo_is_public=new_repo_is_public, new_repo_description=new_repo_description, ) - commit_hash: str = resp["commit"]["commit_hash"] - return commit_hash + return message def pull( From adb21782b8e881ed6e3b5d1388e5af710c4b70d1 Mon Sep 17 00:00:00 2001 From: Naama Magami <58214719+NaamaMagami@users.noreply.github.com> Date: Fri, 25 Aug 2023 07:09:30 +0300 Subject: [PATCH 121/143] Add del vector pgvector + adding modification time to confluence and google drive docs (#9604) Description: - adding implementation of delete for pgvector - adding modification time in docs metadata for confluence and google drive. Issue: https://github.com/langchain-ai/langchain/issues/9312 Tag maintainer: @baskaryan, @eyurtsev, @hwchase17, @rlancemartin. --------- Co-authored-by: Eugene Yurtsev --- .../langchain/document_loaders/confluence.py | 19 ++++++++---- .../langchain/document_loaders/googledrive.py | 7 ++++- .../langchain/vectorstores/pgvector.py | 30 +++++++++++++++++++ .../vectorstores/test_pgvector.py | 28 +++++++++++++++++ 4 files changed, 77 insertions(+), 7 deletions(-) diff --git a/libs/langchain/langchain/document_loaders/confluence.py b/libs/langchain/langchain/document_loaders/confluence.py index 739f52f48..5a12e8984 100644 --- a/libs/langchain/langchain/document_loaders/confluence.py +++ b/libs/langchain/langchain/document_loaders/confluence.py @@ -338,7 +338,9 @@ class ConfluenceLoader(BaseLoader): ), before_sleep=before_sleep_log(logger, logging.WARNING), )(self.confluence.get_page_by_id) - page = get_page(page_id=page_id, expand=content_format.value) + page = get_page( + page_id=page_id, expand=f"{content_format.value},version" + ) if not include_restricted_content and not self.is_public_page(page): continue doc = self.process_page( @@ -505,13 +507,18 @@ class ConfluenceLoader(BaseLoader): ] text = text + "".join(comment_texts) + metadata = { + "title": page["title"], + "id": page["id"], + "source": self.base_url.strip("/") + page["_links"]["webui"], + } + + if "version" in page and "when" in page["version"]: + metadata["when"] = page["version"]["when"] + return Document( page_content=text, - metadata={ - "title": page["title"], - "id": page["id"], - "source": self.base_url.strip("/") + page["_links"]["webui"], - }, + metadata=metadata, ) def process_attachment( diff --git a/libs/langchain/langchain/document_loaders/googledrive.py b/libs/langchain/langchain/document_loaders/googledrive.py index 881bafbd5..513f9bba7 100644 --- a/libs/langchain/langchain/document_loaders/googledrive.py +++ b/libs/langchain/langchain/document_loaders/googledrive.py @@ -200,7 +200,11 @@ class GoogleDriveLoader(BaseLoader, BaseModel): creds = self._load_credentials() service = build("drive", "v3", credentials=creds) - file = service.files().get(fileId=id, supportsAllDrives=True).execute() + file = ( + service.files() + .get(fileId=id, supportsAllDrives=True, fields="modifiedTime,name") + .execute() + ) request = service.files().export_media(fileId=id, mimeType="text/plain") fh = BytesIO() downloader = MediaIoBaseDownload(fh, request) @@ -219,6 +223,7 @@ class GoogleDriveLoader(BaseLoader, BaseModel): metadata = { "source": f"https://docs.google.com/document/d/{id}/edit", "title": f"{file.get('name')}", + "when": f"{file.get('modifiedTime')}", } return Document(page_content=text, metadata=metadata) diff --git a/libs/langchain/langchain/vectorstores/pgvector.py b/libs/langchain/langchain/vectorstores/pgvector.py index a86a88cb1..6b02fc19c 100644 --- a/libs/langchain/langchain/vectorstores/pgvector.py +++ b/libs/langchain/langchain/vectorstores/pgvector.py @@ -1,5 +1,6 @@ from __future__ import annotations +import contextlib import enum import logging import uuid @@ -8,6 +9,7 @@ from typing import ( Any, Callable, Dict, + Generator, Iterable, List, Optional, @@ -16,6 +18,7 @@ from typing import ( ) import sqlalchemy +from sqlalchemy import delete from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Session, declarative_base @@ -170,6 +173,33 @@ class PGVector(VectorStore): session.delete(collection) session.commit() + @contextlib.contextmanager + def _make_session(self) -> Generator[Session, None, None]: + """Create a context manager for the session, bind to _conn string.""" + yield Session(self._conn) + + def delete( + self, + ids: Optional[List[str]] = None, + **kwargs: Any, + ) -> None: + """Delete vectors by ids or uuids. + + Args: + ids: List of ids to delete. + """ + with Session(self._conn) as session: + if ids is not None: + self.logger.debug( + "Trying to delete vectors by ids (represented by the model " + "using the custom ids field)" + ) + stmt = delete(self.EmbeddingStore).where( + self.EmbeddingStore.custom_id.in_(ids) + ) + session.execute(stmt) + session.commit() + def get_collection(self, session: Session) -> Optional["CollectionStore"]: return self.CollectionStore.get_by_name(session, self.collection_name) diff --git a/libs/langchain/tests/integration_tests/vectorstores/test_pgvector.py b/libs/langchain/tests/integration_tests/vectorstores/test_pgvector.py index 46c8f11e1..6d6028497 100644 --- a/libs/langchain/tests/integration_tests/vectorstores/test_pgvector.py +++ b/libs/langchain/tests/integration_tests/vectorstores/test_pgvector.py @@ -186,6 +186,34 @@ def test_pgvector_with_filter_in_set() -> None: ] +def test_pgvector_delete_docs() -> None: + """Add and delete documents.""" + texts = ["foo", "bar", "baz"] + metadatas = [{"page": str(i)} for i in range(len(texts))] + docsearch = PGVector.from_texts( + texts=texts, + collection_name="test_collection_filter", + embedding=FakeEmbeddingsWithAdaDimension(), + metadatas=metadatas, + ids=["1", "2", "3"], + connection_string=CONNECTION_STRING, + pre_delete_collection=True, + ) + docsearch.delete(["1", "2"]) + with docsearch._make_session() as session: + records = list(session.query(docsearch.EmbeddingStore).all()) + # ignoring type error since mypy cannot determine whether + # the list is sortable + assert sorted(record.custom_id for record in records) == ["3"] # type: ignore + + docsearch.delete(["2", "3"]) # Should not raise on missing ids + with docsearch._make_session() as session: + records = list(session.query(docsearch.EmbeddingStore).all()) + # ignoring type error since mypy cannot determine whether + # the list is sortable + assert sorted(record.custom_id for record in records) == [] # type: ignore + + def test_pgvector_relevance_score() -> None: """Test to make sure the relevance score is scaled to 0-1.""" texts = ["foo", "bar", "baz"] From 87da56fb1e11f6102ae1ffd3a8878afee2958248 Mon Sep 17 00:00:00 2001 From: Leonid Kuligin Date: Fri, 25 Aug 2023 06:44:49 +0200 Subject: [PATCH 122/143] Added a pdf parser based on DocAI (#9579) #9578 --------- Co-authored-by: Leonid Kuligin Co-authored-by: Eugene Yurtsev --- .../document_transformers/docai.ipynb | 283 +++++++++++++++++ .../document_loaders/parsers/__init__.py | 2 + .../document_loaders/parsers/docai.py | 292 ++++++++++++++++++ .../parsers/test_public_api.py | 1 + 4 files changed, 578 insertions(+) create mode 100644 docs/extras/integrations/document_transformers/docai.ipynb create mode 100644 libs/langchain/langchain/document_loaders/parsers/docai.py diff --git a/docs/extras/integrations/document_transformers/docai.ipynb b/docs/extras/integrations/document_transformers/docai.ipynb new file mode 100644 index 000000000..8cf81ff67 --- /dev/null +++ b/docs/extras/integrations/document_transformers/docai.ipynb @@ -0,0 +1,283 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "48438efb-9f0d-473b-a91c-9f1e29c2539d", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders.blob_loaders import Blob\n", + "from langchain.document_loaders.parsers import DocAIParser" + ] + }, + { + "cell_type": "markdown", + "id": "f95ac25b-f025-40c3-95b8-77919fc4da7f", + "metadata": {}, + "source": [ + "DocAI is a Google Cloud platform to transform unstructured data from documents into structured data, making it easier to understand, analyze, and consume. You can read more about it: https://cloud.google.com/document-ai/docs/overview " + ] + }, + { + "cell_type": "markdown", + "id": "51946817-798c-4d11-abd6-db2ae53a0270", + "metadata": {}, + "source": [ + "First, you need to set up a GCS bucket and create your own OCR processor as described here: https://cloud.google.com/document-ai/docs/create-processor\n", + "The GCS_OUTPUT_PATH should be a path to a folder on GCS (starting with `gs://`) and a processor name should look like `projects/PROJECT_NUMBER/locations/LOCATION/processors/PROCESSOR_ID`. You can get it either programmatically or copy from the `Prediction endpoint` section of the `Processor details` tab in the Google Cloud Console." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ac85f7f3-3ef6-41d5-920a-b55f2939c202", + "metadata": {}, + "outputs": [], + "source": [ + "PROJECT = \"PUT_SOMETHING_HERE\"\n", + "GCS_OUTPUT_PATH = \"PUT_SOMETHING_HERE\"\n", + "PROCESSOR_NAME = \"PUT_SOMETHING_HERE\"" + ] + }, + { + "cell_type": "markdown", + "id": "fad2bcca-1c0e-4888-b82d-15823ba57e60", + "metadata": {}, + "source": [ + "Now, let's create a parser:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "dcc0c65a-86c5-448d-8b21-2e564b1903b7", + "metadata": {}, + "outputs": [], + "source": [ + "parser = DocAIParser(location=\"us\", processor_name=PROCESSOR_NAME, gcs_output_path=GCS_OUTPUT_PATH)" + ] + }, + { + "cell_type": "markdown", + "id": "b8b5a3ff-650a-4ad3-a73a-395f86e4c9e1", + "metadata": {}, + "source": [ + "Let's go and parse an Alphabet's take from here: https://abc.xyz/assets/a7/5b/9e5ae0364b12b4c883f3cf748226/goog-exhibit-99-1-q1-2023-19.pdf. Copy it to your GCS bucket first, and adjust the path below." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "373cc18e-a311-4c8d-8180-47e4ade1d2ad", + "metadata": {}, + "outputs": [], + "source": [ + "blob = Blob(path=\"gs://vertex-pgt/examples/goog-exhibit-99-1-q1-2023-19.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6ef84fad-2981-456d-a6b4-3a6a1a46d511", + "metadata": {}, + "outputs": [], + "source": [ + "docs = list(parser.lazy_parse(blob))" + ] + }, + { + "cell_type": "markdown", + "id": "3f8e4ee1-e07d-4c29-a120-4d56aae91859", + "metadata": {}, + "source": [ + "We'll get one document per page, 11 in total:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "343919f5-35d2-47fb-9790-de464649ebdf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11\n" + ] + } + ], + "source": [ + "print(len(docs))" + ] + }, + { + "cell_type": "markdown", + "id": "b104ae56-011b-4abe-ac07-e999c69494c5", + "metadata": {}, + "source": [ + "You can run end-to-end parsing of a blob one-by-one. If you have many documents, it might be a better approach to batch them together and maybe even detach parsing from handling the results of parsing." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9ecc1b99-5cef-47b0-a125-dbb2c41d2224", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['projects/543079149601/locations/us/operations/16447136779727347991']\n" + ] + } + ], + "source": [ + "operations = parser.docai_parse([blob])\n", + "print([op.operation.name for op in operations])" + ] + }, + { + "cell_type": "markdown", + "id": "a2d24d63-c2c7-454c-9df3-2a9cf51309a6", + "metadata": {}, + "source": [ + "You can check whether operations are finished:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ab11efb0-e514-4f44-9ba5-3d638a59c9e6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parser.is_running(operations)" + ] + }, + { + "cell_type": "markdown", + "id": "602ca0bc-080a-4a4e-a413-0e705aeab189", + "metadata": {}, + "source": [ + "And when they're finished, you can parse the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ec1e6041-bc10-47d4-ba64-d09055c14f27", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parser.is_running(operations)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "95d89da4-1c8a-413d-8473-ddd4a39375a5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DocAIParsingResults(source_path='gs://vertex-pgt/examples/goog-exhibit-99-1-q1-2023-19.pdf', parsed_path='gs://vertex-pgt/test/run1/16447136779727347991/0')\n" + ] + } + ], + "source": [ + "results = parser.get_results(operations)\n", + "print(results[0])" + ] + }, + { + "cell_type": "markdown", + "id": "87e5b606-1679-46c7-9577-4cf9bc93a752", + "metadata": {}, + "source": [ + "And now we can finally generate Documents from parsed results:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "08e8878d-889b-41ad-9500-2f772d38782f", + "metadata": {}, + "outputs": [], + "source": [ + "docs = list(parser.parse_from_results(results))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c59525fb-448d-444b-8f12-c4aea791e19b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11\n" + ] + } + ], + "source": [ + "print(len(docs))" + ] + } + ], + "metadata": { + "environment": { + "kernel": "python3", + "name": "common-cpu.m109", + "type": "gcloud", + "uri": "gcr.io/deeplearning-platform-release/base-cpu:m109" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/langchain/langchain/document_loaders/parsers/__init__.py b/libs/langchain/langchain/document_loaders/parsers/__init__.py index 5d4843e9a..e2233e5cc 100644 --- a/libs/langchain/langchain/document_loaders/parsers/__init__.py +++ b/libs/langchain/langchain/document_loaders/parsers/__init__.py @@ -1,4 +1,5 @@ from langchain.document_loaders.parsers.audio import OpenAIWhisperParser +from langchain.document_loaders.parsers.docai import DocAIParser from langchain.document_loaders.parsers.grobid import GrobidParser from langchain.document_loaders.parsers.html import BS4HTMLParser from langchain.document_loaders.parsers.language import LanguageParser @@ -12,6 +13,7 @@ from langchain.document_loaders.parsers.pdf import ( __all__ = [ "BS4HTMLParser", + "DocAIParser", "GrobidParser", "LanguageParser", "OpenAIWhisperParser", diff --git a/libs/langchain/langchain/document_loaders/parsers/docai.py b/libs/langchain/langchain/document_loaders/parsers/docai.py new file mode 100644 index 000000000..dd6913ac6 --- /dev/null +++ b/libs/langchain/langchain/document_loaders/parsers/docai.py @@ -0,0 +1,292 @@ +"""Module contains a PDF parser based on DocAI from Google Cloud. + +You need to install two libraries to use this parser: +pip install google-cloud-documentai +pip install google-cloud-documentai-toolbox +""" +import logging +import time +from dataclasses import dataclass +from typing import TYPE_CHECKING, Iterator, List, Optional, Sequence + +from langchain.docstore.document import Document +from langchain.document_loaders.base import BaseBlobParser +from langchain.document_loaders.blob_loaders import Blob +from langchain.utils.iter import batch_iterate + +if TYPE_CHECKING: + from google.api_core.operation import Operation + from google.cloud.documentai import DocumentProcessorServiceClient + + +logger = logging.getLogger(__name__) + + +@dataclass +class DocAIParsingResults: + """A dataclass to store DocAI parsing results.""" + + source_path: str + parsed_path: str + + +class DocAIParser(BaseBlobParser): + def __init__( + self, + *, + client: Optional["DocumentProcessorServiceClient"] = None, + location: Optional[str] = None, + gcs_output_path: Optional[str] = None, + processor_name: Optional[str] = None, + ): + """Initializes the parser. + + Args: + client: a DocumentProcessorServiceClient to use + location: a GCP location where a DOcAI parser is located + gcs_output_path: a path on GCS to store parsing results + processor_name: name of a processor + + You should provide either a client or location (and then a client + would be instantiated). + """ + if client and location: + raise ValueError( + "You should provide either a client or a location but not both " + "of them." + ) + if not client and not location: + raise ValueError( + "You must specify either a client or a location to instantiate " + "a client." + ) + + self._gcs_output_path = gcs_output_path + self._processor_name = processor_name + if client: + self._client = client + else: + try: + from google.api_core.client_options import ClientOptions + from google.cloud.documentai import DocumentProcessorServiceClient + except ImportError: + raise ImportError( + "documentai package not found, please install it with" + " `pip install google-cloud-documentai`" + ) + options = ClientOptions( + api_endpoint=f"{location}-documentai.googleapis.com" + ) + self._client = DocumentProcessorServiceClient(client_options=options) + + def lazy_parse(self, blob: Blob) -> Iterator[Document]: + """Parses a blob lazily. + + Args: + blobs: a Blob to parse + + This is a long-running operations! A recommended way is to batch + documents together and use `batch_parse` method. + """ + yield from self.batch_parse([blob], gcs_output_path=self._gcs_output_path) + + def batch_parse( + self, + blobs: Sequence[Blob], + gcs_output_path: Optional[str] = None, + timeout_sec: int = 3600, + check_in_interval_sec: int = 60, + ) -> Iterator[Document]: + """Parses a list of blobs lazily. + + Args: + blobs: a list of blobs to parse + gcs_output_path: a path on GCS to store parsing results + timeout_sec: a timeout to wait for DocAI to complete, in seconds + check_in_interval_sec: an interval to wait until next check + whether parsing operations have been completed, in seconds + This is a long-running operations! A recommended way is to decouple + parsing from creating Langchain Documents: + >>> operations = parser.docai_parse(blobs, gcs_path) + >>> parser.is_running(operations) + You can get operations names and save them: + >>> names = [op.operation.name for op in operations] + And when all operations are finished, you can use their results: + >>> operations = parser.operations_from_names(operation_names) + >>> results = parser.get_results(operations) + >>> docs = parser.parse_from_results(results) + """ + output_path = gcs_output_path if gcs_output_path else self._gcs_output_path + if output_path is None: + raise ValueError("An output path on GCS should be provided!") + operations = self.docai_parse(blobs, gcs_output_path=output_path) + operation_names = [op.operation.name for op in operations] + logger.debug( + f"Started parsing with DocAI, submitted operations {operation_names}" + ) + is_running, time_elapsed = True, 0 + while is_running: + is_running = self.is_running(operations) + if not is_running: + break + time.sleep(check_in_interval_sec) + time_elapsed += check_in_interval_sec + if time_elapsed > timeout_sec: + raise ValueError( + "Timeout exceeded! Check operations " f"{operation_names} later!" + ) + logger.debug(".") + + results = self.get_results(operations=operations) + yield from self.parse_from_results(results) + + def parse_from_results( + self, results: List[DocAIParsingResults] + ) -> Iterator[Document]: + try: + from google.cloud.documentai_toolbox.wrappers.document import _get_shards + from google.cloud.documentai_toolbox.wrappers.page import _text_from_layout + except ImportError: + raise ImportError( + "documentai_toolbox package not found, please install it with" + " `pip install google-cloud-documentai-toolbox`" + ) + for result in results: + output_gcs = result.parsed_path.split("/") + gcs_bucket_name = output_gcs[2] + gcs_prefix = "/".join(output_gcs[3:]) + "/" + shards = _get_shards(gcs_bucket_name, gcs_prefix) + docs, page_number = [], 1 + for shard in shards: + for page in shard.pages: + docs.append( + Document( + page_content=_text_from_layout(page.layout, shard.text), + metadata={ + "page": page_number, + "source": result.source_path, + }, + ) + ) + page_number += 1 + yield from docs + + def operations_from_names(self, operation_names: List[str]) -> List["Operation"]: + """Initializes Long-Running Operations from their names.""" + try: + from google.longrunning.operations_pb2 import ( + GetOperationRequest, # type: ignore + ) + except ImportError: + raise ImportError( + "documentai package not found, please install it with" + " `pip install gapic-google-longrunning`" + ) + + operations = [] + for name in operation_names: + request = GetOperationRequest(name=name) + operations.append(self._client.get_operation(request=request)) + return operations + + def is_running(self, operations: List["Operation"]) -> bool: + for op in operations: + if not op.done(): + return True + return False + + def docai_parse( + self, + blobs: Sequence[Blob], + *, + gcs_output_path: Optional[str] = None, + batch_size: int = 4000, + enable_native_pdf_parsing: bool = True, + ) -> List["Operation"]: + """Runs Google DocAI PDF parser on a list of blobs. + + Args: + blobs: a list of blobs to be parsed + gcs_output_path: a path (folder) on GCS to store results + batch_size: amount of documents per batch + enable_native_pdf_parsing: a config option for the parser + + DocAI has a limit on the amount of documents per batch, that's why split a + batch into mini-batches. Parsing is an async long-running operation + on Google Cloud and results are stored in a output GCS bucket. + """ + try: + from google.cloud import documentai + from google.cloud.documentai_v1.types import OcrConfig, ProcessOptions + except ImportError: + raise ImportError( + "documentai package not found, please install it with" + " `pip install google-cloud-documentai`" + ) + + if not self._processor_name: + raise ValueError("Processor name is not defined, aborting!") + output_path = gcs_output_path if gcs_output_path else self._gcs_output_path + if output_path is None: + raise ValueError("An output path on GCS should be provided!") + + operations = [] + for batch in batch_iterate(size=batch_size, iterable=blobs): + documents = [] + for blob in batch: + gcs_document = documentai.GcsDocument( + gcs_uri=blob.path, mime_type="application/pdf" + ) + documents.append(gcs_document) + gcs_documents = documentai.GcsDocuments(documents=documents) + + input_config = documentai.BatchDocumentsInputConfig( + gcs_documents=gcs_documents + ) + + gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig( + gcs_uri=output_path, field_mask=None + ) + output_config = documentai.DocumentOutputConfig( + gcs_output_config=gcs_output_config + ) + + if enable_native_pdf_parsing: + process_options = ProcessOptions( + ocr_config=OcrConfig( + enable_native_pdf_parsing=enable_native_pdf_parsing + ) + ) + else: + process_options = ProcessOptions() + request = documentai.BatchProcessRequest( + name=self._processor_name, + input_documents=input_config, + document_output_config=output_config, + process_options=process_options, + ) + operations.append(self._client.batch_process_documents(request)) + return operations + + def get_results(self, operations: List["Operation"]) -> List[DocAIParsingResults]: + try: + from google.cloud.documentai_v1 import BatchProcessMetadata + except ImportError: + raise ImportError( + "documentai package not found, please install it with" + " `pip install google-cloud-documentai`" + ) + + results = [] + for op in operations: + if isinstance(op.metadata, BatchProcessMetadata): + metadata = op.metadata + else: + metadata = BatchProcessMetadata.deserialize(op.metadata.value) + for status in metadata.individual_process_statuses: + source = status.input_gcs_source + output = status.output_gcs_destination + results.append( + DocAIParsingResults(source_path=source, parsed_path=output) + ) + return results diff --git a/libs/langchain/tests/unit_tests/document_loaders/parsers/test_public_api.py b/libs/langchain/tests/unit_tests/document_loaders/parsers/test_public_api.py index 84f2db36b..f1037064b 100644 --- a/libs/langchain/tests/unit_tests/document_loaders/parsers/test_public_api.py +++ b/libs/langchain/tests/unit_tests/document_loaders/parsers/test_public_api.py @@ -5,6 +5,7 @@ def test_parsers_public_api_correct() -> None: """Test public API of parsers for breaking changes.""" assert set(__all__) == { "BS4HTMLParser", + "DocAIParser", "GrobidParser", "LanguageParser", "OpenAIWhisperParser", From ade482c17e07782daf43ad9f0e72a65065578374 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Thu, 24 Aug 2023 21:55:22 -0700 Subject: [PATCH 123/143] add twitter chat loader doc (#9737) --- ...itter-scraper_2023-08-23_22-13-19-740.json | 2635 +++++++++++++++++ .../integrations/chat_loaders/twitter.ipynb | 77 + 2 files changed, 2712 insertions(+) create mode 100644 docs/extras/integrations/chat_loaders/example_data/dataset_twitter-scraper_2023-08-23_22-13-19-740.json create mode 100644 docs/extras/integrations/chat_loaders/twitter.ipynb diff --git a/docs/extras/integrations/chat_loaders/example_data/dataset_twitter-scraper_2023-08-23_22-13-19-740.json b/docs/extras/integrations/chat_loaders/example_data/dataset_twitter-scraper_2023-08-23_22-13-19-740.json new file mode 100644 index 000000000..9d7ce57b5 --- /dev/null +++ b/docs/extras/integrations/chat_loaders/example_data/dataset_twitter-scraper_2023-08-23_22-13-19-740.json @@ -0,0 +1,2635 @@ +[{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519480761749016577", + "conversation_id": "1519480761749016577", + "full_text": "Next I’m buying Coca-Cola to put the cocaine back in", + "reply_count": 187291, + "retweet_count": 648962, + "favorite_count": 4596262, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1519480761749016577", + "created_at": "2022-04-28T00:56:58.000Z", + "quote_count": 171980, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1518623997054918657", + "conversation_id": "1518623997054918657", + "full_text": "I hope that even my worst critics remain on Twitter, because that is what free speech means", + "reply_count": 174468, + "retweet_count": 351409, + "favorite_count": 3105543, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1518623997054918657", + "created_at": "2022-04-25T16:12:30.000Z", + "quote_count": 70717, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519495072802390016", + "conversation_id": "1519495072802390016", + "full_text": "Let’s make Twitter maximum fun!", + "reply_count": 110542, + "retweet_count": 184310, + "favorite_count": 2542681, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1519495072802390016", + "created_at": "2022-04-28T01:53:50.000Z", + "quote_count": 34654, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1518677066325053441", + "conversation_id": "1518677066325053441", + "full_text": "🚀💫♥️ Yesss!!! ♥️💫🚀 https://t.co/0T9HzUHuh6", + "reply_count": 145150, + "retweet_count": 330889, + "favorite_count": 2505986, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FRNsuSFWUAUW6aP.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1518677066325053441", + "created_at": "2022-04-25T19:43:22.000Z", + "quote_count": 61362, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519495982723084290", + "conversation_id": "1519495982723084290", + "full_text": "Listen, I can’t do miracles ok https://t.co/z7dvLMUXy8", + "reply_count": 74894, + "retweet_count": 202182, + "favorite_count": 2473727, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FRZViwWX0AMsqQ1.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1519495982723084290", + "created_at": "2022-04-28T01:57:27.000Z", + "quote_count": 25525, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1585841080431321088", + "conversation_id": "1585841080431321088", + "full_text": "the bird is freed", + "reply_count": 137792, + "retweet_count": 330476, + "favorite_count": 2370568, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1585841080431321088", + "created_at": "2022-10-28T03:49:11.000Z", + "quote_count": 52481, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1586104694421659648", + "conversation_id": "1586104694421659648", + "full_text": "Comedy is now legal on Twitter", + "reply_count": 87869, + "retweet_count": 236840, + "favorite_count": 2274201, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1586104694421659648", + "created_at": "2022-10-28T21:16:42.000Z", + "quote_count": 39559, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1593459801966538755", + "conversation_id": "1593459801966538755", + "full_text": "https://t.co/rbwbsLA1ZG", + "reply_count": 67716, + "retweet_count": 218714, + "favorite_count": 2030318, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fh0bPd7VQAAU31D.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1593459801966538755", + "created_at": "2022-11-18T04:23:16.000Z", + "quote_count": 165205, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1523465632502906880", + "conversation_id": "1523465632502906880", + "full_text": "If I die under mysterious circumstances, it’s been nice knowin ya", + "reply_count": 142816, + "retweet_count": 164576, + "favorite_count": 1814691, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1523465632502906880", + "created_at": "2022-05-09T00:51:26.000Z", + "quote_count": 40125, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1587894226695884800", + "conversation_id": "1587894226695884800", + "full_text": "https://t.co/kGncG7Hs3M", + "reply_count": 71915, + "retweet_count": 167091, + "favorite_count": 1796047, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FglVYVmXkAIWB5w.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1587894226695884800", + "created_at": "2022-11-02T19:47:39.000Z", + "quote_count": 63550, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1236029449042198528", + "conversation_id": "1236029449042198528", + "full_text": "The coronavirus panic is dumb", + "reply_count": 39483, + "retweet_count": 267574, + "favorite_count": 1453833, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1236029449042198528", + "created_at": "2020-03-06T20:42:39.000Z", + "quote_count": 38185, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519020176884305920", + "conversation_id": "1519020176884305920", + "full_text": "The extreme antibody reaction from those who fear free speech says it all", + "reply_count": 76483, + "retweet_count": 182948, + "favorite_count": 1586156, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1519020176884305920", + "created_at": "2022-04-26T18:26:46.000Z", + "quote_count": 17843, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1685096284275802112", + "conversation_id": "1685096284275802112", + "full_text": "https://t.co/XEydRiST9D", + "reply_count": 129650, + "retweet_count": 100921, + "favorite_count": 1672309, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F2KqI_ZXUAAGRCD.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1685096284275802112", + "created_at": "2023-07-29T01:13:56.000Z", + "view_count": 153952239, + "quote_count": 65149, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519735033950470144", + "conversation_id": "1519735033950470144", + "full_text": "https://t.co/Q9OjlJhi7f", + "reply_count": 88482, + "retweet_count": 199755, + "favorite_count": 1498481, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FRcu9TeXEAMjvTM.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1519735033950470144", + "created_at": "2022-04-28T17:47:22.000Z", + "quote_count": 43234, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519415674111672325", + "conversation_id": "1519415674111672325", + "full_text": "For Twitter to deserve public trust, it must be politically neutral, which effectively means upsetting the far right and the far left equally", + "reply_count": 77096, + "retweet_count": 137275, + "favorite_count": 1489409, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1519415674111672325", + "created_at": "2022-04-27T20:38:20.000Z", + "quote_count": 28306, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1479236333516165121", + "conversation_id": "1479236333516165121", + "full_text": "Starlinks with “lasers” deployed to orbit https://t.co/Y1eg9gl7sJ", + "reply_count": 12544, + "retweet_count": 9849, + "favorite_count": 915843, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FIdNmXtVkAEF0Ss.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1479236333516165121", + "created_at": "2022-01-06T23:39:59.000Z", + "quote_count": 1185, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1670234980776132608", + "conversation_id": "1670234980776132608", + "full_text": "Oh hi lol https://t.co/pLxkLDu0Qs", + "reply_count": 56500, + "retweet_count": 125873, + "favorite_count": 1546285, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fy3d3Q4XsAAPSAN.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1670234980776132608", + "created_at": "2023-06-18T01:00:25.000Z", + "view_count": 80352350, + "quote_count": 9952, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519469891455234048", + "conversation_id": "1519469891455234048", + "full_text": "Twitter DMs should have end to end encryption like Signal, so no one can spy on or hack your messages", + "reply_count": 40662, + "retweet_count": 101908, + "favorite_count": 1403300, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1519469891455234048", + "created_at": "2022-04-28T00:13:47.000Z", + "quote_count": 16661, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1625368108461613057", + "conversation_id": "1625368108461613057", + "full_text": "https://t.co/iZUukCVrl5", + "reply_count": 46125, + "retweet_count": 80611, + "favorite_count": 1436396, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fo53ramacAAigCq.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1625368108461613057", + "created_at": "2023-02-14T05:35:29.000Z", + "view_count": 177548664, + "quote_count": 20288, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1517707521343082496", + "conversation_id": "1517707521343082496", + "full_text": "in case u need to lose a boner fast https://t.co/fcHiaXKCJi", + "reply_count": 68690, + "retweet_count": 128285, + "favorite_count": 1353674, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FQ_68lnWQAIuYMM.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1517707521343082496", + "created_at": "2022-04-23T03:30:45.000Z", + "quote_count": 30414, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1531647849599057921", + "conversation_id": "1531647849599057921", + "full_text": "https://t.co/G83vCrHHJf", + "reply_count": 44573, + "retweet_count": 128520, + "favorite_count": 1349498, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FUGBmevWYAM-V_M.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1531647849599057921", + "created_at": "2022-05-31T14:44:38.000Z", + "quote_count": 21742, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1594191387519373313", + "conversation_id": "1594191387519373313", + "full_text": "Twitter is ALIVE", + "reply_count": 86483, + "retweet_count": 106216, + "favorite_count": 1377837, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1594191387519373313", + "created_at": "2022-11-20T04:50:20.000Z", + "quote_count": 21561, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1667289678612156416", + "conversation_id": "1667289678612156416", + "full_text": "https://t.co/g9gS4MUIVL", + "reply_count": 37176, + "retweet_count": 178234, + "favorite_count": 1383503, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FyNnICoaUAEE9Xv.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1667289678612156416", + "created_at": "2023-06-09T21:56:50.000Z", + "view_count": 87691832, + "quote_count": 13850, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1585341984679469056", + "conversation_id": "1585341984679469056", + "full_text": "Entering Twitter HQ – let that sink in! https://t.co/D68z4K2wq7", + "reply_count": 65658, + "retweet_count": 172649, + "favorite_count": 1331840, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/ext_tw_video_thumb/1585341912877146112/pu/img/DwJ7wlGIe9iryk6N.jpg", + "type": "video", + "video_url": "https://video.twimg.com/ext_tw_video/1585341912877146112/pu/vid/1920x1080/aeoVUvTgj4wHShhN.mp4?tag=14" + } + ], + "url": "https://twitter.com/elonmusk/status/1585341984679469056", + "created_at": "2022-10-26T18:45:58.000Z", + "view_count": 48607062, + "quote_count": 42432, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1521202951230046210", + "conversation_id": "1521202951230046210", + "full_text": "As I was saying … https://t.co/tsGz6fCWuW", + "reply_count": 52348, + "retweet_count": 97069, + "favorite_count": 1273109, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FRxmBNeXwAMVTOg.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1521202951230046210", + "created_at": "2022-05-02T19:00:20.000Z", + "quote_count": 9562, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1588750686006947840", + "conversation_id": "1588750686006947840", + "full_text": "Trash me all day, but it’ll cost $8", + "reply_count": 104121, + "retweet_count": 89130, + "favorite_count": 1300597, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1588750686006947840", + "created_at": "2022-11-05T04:30:55.000Z", + "quote_count": 28347, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1053390822991790083", + "conversation_id": "1053390822991790083", + "full_text": "Had to been done ur welcome https://t.co/7jT0f9lqIS", + "reply_count": 15864, + "retweet_count": 322101, + "favorite_count": 1102018, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Dp5lXiYUUAAngKq.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1053390822991790083", + "created_at": "2018-10-19T21:01:57.000Z", + "quote_count": 24554, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1590755506112823296", + "conversation_id": "1590755506112823296", + "full_text": "I love when people complain about Twitter … on Twitter 🤣🤣", + "reply_count": 78232, + "retweet_count": 101956, + "favorite_count": 1268496, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1590755506112823296", + "created_at": "2022-11-10T17:17:22.000Z", + "quote_count": 28192, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1601894132573605888", + "conversation_id": "1601894132573605888", + "full_text": "My pronouns are Prosecute/Fauci", + "reply_count": 110524, + "retweet_count": 180237, + "favorite_count": 1231419, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1601894132573605888", + "created_at": "2022-12-11T10:58:17.000Z", + "quote_count": 34573, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1625695877326340102", + "conversation_id": "1625695877326340102", + "full_text": "The new CEO of Twitter is amazing https://t.co/yBqWFUDIQH", + "reply_count": 42614, + "retweet_count": 87988, + "favorite_count": 1240934, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fo-hx39aIAABMKW.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1625695877326340102", + "created_at": "2023-02-15T03:17:55.000Z", + "view_count": 140213026, + "quote_count": 14042, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1601624795585486848", + "conversation_id": "1601624795585486848", + "full_text": "🇲🇦🇲🇦 Congrats Morocco!! 🇲🇦🇲🇦", + "reply_count": 32666, + "retweet_count": 132562, + "favorite_count": 1219545, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1601624795585486848", + "created_at": "2022-12-10T17:08:02.000Z", + "quote_count": 12875, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1607997591870124032", + "conversation_id": "1607997591870124032", + "full_text": "I’m not brainwashed!! https://t.co/4kx61uu4yy", + "reply_count": 71411, + "retweet_count": 151179, + "favorite_count": 1188252, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FlDBSYAXgAAlX8i.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1607997591870124032", + "created_at": "2022-12-28T07:11:15.000Z", + "view_count": 130353016, + "quote_count": 39375, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1503287788652871680", + "conversation_id": "1503287788652871680", + "full_text": "https://t.co/Gw6xaw1u0N", + "reply_count": 30439, + "retweet_count": 137446, + "favorite_count": 1141043, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FNzARriXsAMoSur.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1503287788652871680", + "created_at": "2022-03-14T08:31:53.000Z", + "quote_count": 24278, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1514720245113577473", + "conversation_id": "1514720245113577473", + "full_text": "i♥️u", + "reply_count": 84542, + "retweet_count": 79423, + "favorite_count": 1139093, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1514720245113577473", + "created_at": "2022-04-14T21:40:23.000Z", + "quote_count": 15750, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1520017094007476224", + "conversation_id": "1520017094007476224", + "full_text": "The far left hates everyone, themselves included!", + "reply_count": 59438, + "retweet_count": 114302, + "favorite_count": 1128704, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1520017094007476224", + "created_at": "2022-04-29T12:28:10.000Z", + "quote_count": 16725, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1530380264966434823", + "conversation_id": "1530380264966434823", + "full_text": "https://t.co/USLO967YsJ", + "reply_count": 35224, + "retweet_count": 92904, + "favorite_count": 1146612, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FT0AuTZWAAEgQHU.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1530380264966434823", + "created_at": "2022-05-28T02:47:42.000Z", + "quote_count": 8393, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1523658010241155073", + "conversation_id": "1523658010241155073", + "full_text": "Chocolate milk is insanely good. Just had some.", + "reply_count": 68723, + "retweet_count": 71066, + "favorite_count": 1090118, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1523658010241155073", + "created_at": "2022-05-09T13:35:52.000Z", + "quote_count": 14543, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1511982702819520512", + "conversation_id": "1511982702819520512", + "full_text": "https://t.co/TW2lLQakE5", + "reply_count": 31984, + "retweet_count": 103366, + "favorite_count": 1088637, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FPukQSkXEAAtaQb.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1511982702819520512", + "created_at": "2022-04-07T08:22:22.000Z", + "quote_count": 11547, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1688485935816581120", + "conversation_id": "1688485935816581120", + "full_text": "https://t.co/hDSTKPdQnG", + "reply_count": 29410, + "retweet_count": 67082, + "favorite_count": 1176975, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F261AH-WUAAuyrT.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1688485935816581120", + "created_at": "2023-08-07T09:43:12.000Z", + "view_count": 66638614, + "quote_count": 4715, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1546344529460174849", + "conversation_id": "1546344529460174849", + "full_text": "https://t.co/JcLMee61wj", + "reply_count": 36837, + "retweet_count": 120770, + "favorite_count": 1088822, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FXW4J4xXgAAXFKs.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1546344529460174849", + "created_at": "2022-07-11T04:04:00.000Z", + "quote_count": 16457, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1686050455468621831", + "conversation_id": "1686050455468621831", + "full_text": "I ♥️ Canada https://t.co/95321VIi8r", + "reply_count": 73993, + "retweet_count": 102243, + "favorite_count": 1156524, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F2YN81pXMAAjF1e.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1686050455468621831", + "created_at": "2023-07-31T16:25:28.000Z", + "view_count": 130861294, + "quote_count": 51439, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1520650036865949696", + "conversation_id": "1520650036865949696", + "full_text": "Since I’ve been asked a lot:\n\nBuy stock in several companies that make products & services that *you* believe in.\n\nOnly sell if you think their products & services are trending worse. Don’t panic when the market does.\n\nThis will serve you well in the long-term.", + "reply_count": 42044, + "retweet_count": 104025, + "favorite_count": 1056890, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1520650036865949696", + "created_at": "2022-05-01T06:23:15.000Z", + "quote_count": 9050, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1587297137099931649", + "conversation_id": "1587297137099931649", + "full_text": "Halloween with my Mom https://t.co/xOAgNeeiNN", + "reply_count": 36632, + "retweet_count": 44968, + "favorite_count": 1073096, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fgc2U1AXkAA99Ay.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1587297137099931649", + "created_at": "2022-11-01T04:15:02.000Z", + "quote_count": 6724, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1388693126206918658", + "conversation_id": "1388693126206918658", + "full_text": "I love Art Deco", + "reply_count": 25352, + "retweet_count": 11784, + "favorite_count": 758325, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1388693126206918658", + "created_at": "2021-05-02T03:13:36.000Z", + "quote_count": 3020, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1685384125836849153", + "conversation_id": "1685384125836849153", + "full_text": "https://t.co/5YdlVQifRn", + "reply_count": 38306, + "retweet_count": 56775, + "favorite_count": 1120840, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F2Ov7dOWcAAylqk.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1685384125836849153", + "created_at": "2023-07-29T20:17:43.000Z", + "view_count": 77682952, + "quote_count": 10273, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1524883482836623373", + "conversation_id": "1524883482836623373", + "full_text": "Biden’s mistake is that he thinks he was elected to transform the country, but actually everyone just wanted less drama", + "reply_count": 58436, + "retweet_count": 88667, + "favorite_count": 1035375, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1524883482836623373", + "created_at": "2022-05-12T22:45:27.000Z", + "quote_count": 13152, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1587627120355934208", + "conversation_id": "1587627120355934208", + "full_text": "To all complainers, please continue complaining, but it will cost $8", + "reply_count": 77567, + "retweet_count": 80134, + "favorite_count": 1051207, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1587627120355934208", + "created_at": "2022-11-02T02:06:16.000Z", + "quote_count": 29667, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1594500655724609536", + "conversation_id": "1594500655724609536", + "full_text": "And lead us not into temptation … https://t.co/8qNOXzwXS9", + "reply_count": 67690, + "retweet_count": 86645, + "favorite_count": 1041472, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FiDN441XEAEq5lc.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1594500655724609536", + "created_at": "2022-11-21T01:19:15.000Z", + "quote_count": 26030, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1587911540770222081", + "conversation_id": "1587647032457449473", + "full_text": "@AOC Your feedback is appreciated, now pay $8", + "reply_count": 43326, + "retweet_count": 75097, + "favorite_count": 1028618, + "hashtags": [], + "symbols": [], + "user_mentions": [ + { + "id_str": "138203134", + "name": "Alexandria Ocasio-Cortez", + "screen_name": "AOC", + "profile": "https://twitter.com/AOC" + } + ], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1587911540770222081", + "created_at": "2022-11-02T20:56:27.000Z", + "quote_count": 17086, + "is_quote_tweet": false, + "replying_to_tweet": "https://twitter.com/AOC/status/1587647032457449473", + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1625377144137461761", + "conversation_id": "1625377144137461761", + "full_text": "There are no coincidences https://t.co/92Ny452J9B", + "reply_count": 25034, + "retweet_count": 87106, + "favorite_count": 1034478, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fo5_5eWaMAMEPaf.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1625377144137461761", + "created_at": "2023-02-14T06:11:23.000Z", + "view_count": 115414305, + "quote_count": 11381, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1608828315581976576", + "conversation_id": "1608828315581976576", + "full_text": "https://t.co/v1rrSsdwdg", + "reply_count": 56860, + "retweet_count": 137588, + "favorite_count": 984592, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FlO00p-aYAE5h8J.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1608828315581976576", + "created_at": "2022-12-30T14:12:15.000Z", + "view_count": 88845731, + "quote_count": 15482, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1587297730631696384", + "conversation_id": "1587297730631696384", + "full_text": "😉 https://t.co/eaIYaDRBnu", + "reply_count": 33970, + "retweet_count": 67582, + "favorite_count": 969459, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fgc23kFXkAEJOas.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1587297730631696384", + "created_at": "2022-11-01T04:17:24.000Z", + "quote_count": 7822, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1357236825589432322", + "conversation_id": "1357236825589432322", + "full_text": "ur welcome https://t.co/e2KF57KLxb", + "reply_count": 21387, + "retweet_count": 129294, + "favorite_count": 906408, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/EtXfpgGWYAEIa7y.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1357236825589432322", + "created_at": "2021-02-04T07:57:30.000Z", + "quote_count": 18283, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1595207476936413187", + "conversation_id": "1595207476936413187", + "full_text": "Wasn’t Twitter supposed to die by now or something … ?", + "reply_count": 65614, + "retweet_count": 64613, + "favorite_count": 932862, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1595207476936413187", + "created_at": "2022-11-23T00:07:54.000Z", + "quote_count": 12541, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1585966869122457600", + "conversation_id": "1585966869122457600", + "full_text": "🎶 let the good times roll 🎶", + "reply_count": 44899, + "retweet_count": 82648, + "favorite_count": 942793, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1585966869122457600", + "created_at": "2022-10-28T12:09:02.000Z", + "quote_count": 7638, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1604650028999405568", + "conversation_id": "1604650028999405568", + "full_text": "Those who want power are the ones who least deserve it", + "reply_count": 89824, + "retweet_count": 92573, + "favorite_count": 945701, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1604650028999405568", + "created_at": "2022-12-19T01:29:14.000Z", + "view_count": 103726233, + "quote_count": 26405, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1594131768298315777", + "conversation_id": "1594131768298315777", + "full_text": "The people have spoken. \n\nTrump will be reinstated.\n\nVox Populi, Vox Dei.", + "reply_count": 128348, + "retweet_count": 118481, + "favorite_count": 913495, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1594131768298315777", + "created_at": "2022-11-20T00:53:25.000Z", + "quote_count": 39411, + "is_quote_tweet": true, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "quoted_tweet": { + "username": "elonmusk", + "user_id": "44196397", + "id": "1593767953706921985", + "conversation_id": "1593767953706921985", + "full_text": "Reinstate former President Trump", + "reply_count": 210109, + "retweet_count": 213875, + "favorite_count": 794653, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1593767953706921985", + "created_at": "2022-11-19T00:47:45.000Z", + "#sort_index": "1694472769204387754", + "quote_count": 75130, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false + }, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1593767953706921985", + "conversation_id": "1593767953706921985", + "full_text": "Reinstate former President Trump", + "reply_count": 210109, + "retweet_count": 213875, + "favorite_count": 794653, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1593767953706921985", + "created_at": "2022-11-19T00:47:45.000Z", + "quote_count": 75130, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1587129795732770824", + "conversation_id": "1587129795732770824", + "full_text": "If I had a dollar for every time someone asked me if Trump is coming back on this platform, Twitter would be minting money!", + "reply_count": 69021, + "retweet_count": 55275, + "favorite_count": 907907, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1587129795732770824", + "created_at": "2022-10-31T17:10:05.000Z", + "quote_count": 6873, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1511011921495011328", + "conversation_id": "1511011921495011328", + "full_text": "Oh hi lol", + "reply_count": 64749, + "retweet_count": 50654, + "favorite_count": 884878, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1511011921495011328", + "created_at": "2022-04-04T16:04:49.000Z", + "quote_count": 10090, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1683378289031761920", + "conversation_id": "1683378289031761920", + "full_text": "Our headquarters tonight https://t.co/GO6yY8R7fO", + "reply_count": 48576, + "retweet_count": 74788, + "favorite_count": 943571, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F1yPk5VXoAA3rGZ.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1683378289031761920", + "created_at": "2023-07-24T07:27:14.000Z", + "view_count": 110928423, + "quote_count": 20062, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1347978218494513152", + "conversation_id": "1347978218494513152", + "full_text": "My 14-year-old son, Saxon, said he feels like 2021 will be a good year. I agree. Let us all make it so.", + "reply_count": 26148, + "retweet_count": 57425, + "favorite_count": 841624, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1347978218494513152", + "created_at": "2021-01-09T18:47:06.000Z", + "quote_count": 10610, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1641858340752875535", + "conversation_id": "1641858340752875535", + "full_text": "https://t.co/qviPxhX7n8", + "reply_count": 49591, + "retweet_count": 41093, + "favorite_count": 918203, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FskNdX5WYAkmETe.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1641858340752875535", + "created_at": "2023-03-31T17:41:47.000Z", + "view_count": 77587609, + "quote_count": 10737, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1514564966564651008", + "conversation_id": "1514564966564651008", + "full_text": "I made an offer \nhttps://t.co/VvreuPMeLu", + "reply_count": 75744, + "retweet_count": 101232, + "favorite_count": 864685, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [ + { + "url": "https://t.co/VvreuPMeLu", + "expanded_url": "https://www.sec.gov/Archives/edgar/data/0001418091/000110465922045641/tm2212748d1_sc13da.htm", + "display_url": "sec.gov/Archives/edgar…" + } + ], + "media": [], + "url": "https://twitter.com/elonmusk/status/1514564966564651008", + "created_at": "2022-04-14T11:23:21.000Z", + "quote_count": 30137, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1597405399040217088", + "conversation_id": "1597405399040217088", + "full_text": "This is a battle for the future of civilization. If free speech is lost even in America, tyranny is all that lies ahead.", + "reply_count": 82874, + "retweet_count": 136750, + "favorite_count": 878560, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1597405399040217088", + "created_at": "2022-11-29T01:41:40.000Z", + "quote_count": 16765, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1609254628113420290", + "conversation_id": "1609254628113420290", + "full_text": "Sometimes it’s just better to make pizza at home", + "reply_count": 51068, + "retweet_count": 42308, + "favorite_count": 804635, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1609254628113420290", + "created_at": "2022-12-31T18:26:16.000Z", + "view_count": 81906590, + "quote_count": 7397, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1349286488618491904", + "conversation_id": "1349286488618491904", + "full_text": "Legalize comedy", + "reply_count": 16426, + "retweet_count": 75729, + "favorite_count": 804936, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1349286488618491904", + "created_at": "2021-01-13T09:25:42.000Z", + "quote_count": 8341, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1618371072486936578", + "conversation_id": "1618371072486936578", + "full_text": "Changed my name to Mr. Tweet, now Twitter won’t let me change it back 🤣", + "reply_count": 61260, + "retweet_count": 53130, + "favorite_count": 882792, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1618371072486936578", + "created_at": "2023-01-25T22:11:46.000Z", + "view_count": 82457457, + "quote_count": 11770, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1642962756906418176", + "conversation_id": "1642962756906418176", + "full_text": "https://t.co/wmN5WxUhfQ", + "reply_count": 31801, + "retweet_count": 80651, + "favorite_count": 887233, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fsz562paMAAB_nP.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1642962756906418176", + "created_at": "2023-04-03T18:50:20.000Z", + "view_count": 76577794, + "quote_count": 16600, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1680423042873278465", + "conversation_id": "1680423042873278465", + "full_text": "https://t.co/LCXD4QPsNW", + "reply_count": 21342, + "retweet_count": 79920, + "favorite_count": 901835, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F1IP2Z9WYAA-AR0.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1680423042873278465", + "created_at": "2023-07-16T03:44:08.000Z", + "view_count": 95252197, + "quote_count": 8094, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1374617643446063105", + "conversation_id": "1374617643446063105", + "full_text": "You can now buy a Tesla with Bitcoin", + "reply_count": 32923, + "retweet_count": 100977, + "favorite_count": 816205, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1374617643446063105", + "created_at": "2021-03-24T07:02:40.000Z", + "quote_count": 21989, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1666964082363371520", + "conversation_id": "1666964082363371520", + "full_text": "https://t.co/kf7VYDgOra", + "reply_count": 21723, + "retweet_count": 102762, + "favorite_count": 874592, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FyI-_vraEAEfW6O.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1666964082363371520", + "created_at": "2023-06-09T00:23:02.000Z", + "view_count": 75132462, + "quote_count": 8403, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1266811094527508481", + "conversation_id": "1266811094527508481", + "full_text": "5 mins to T-0", + "reply_count": 15420, + "retweet_count": 44012, + "favorite_count": 766204, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1266811094527508481", + "created_at": "2020-05-30T19:17:55.000Z", + "quote_count": 3961, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1597165510595989504", + "conversation_id": "1597165510595989504", + "full_text": "My bedside table https://t.co/sIdRYJcLTK", + "reply_count": 85849, + "retweet_count": 53759, + "favorite_count": 851738, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FipFkIsVsAAM0O_.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1597165510595989504", + "created_at": "2022-11-28T09:48:26.000Z", + "quote_count": 28524, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1517215066550116354", + "conversation_id": "1517215066550116354", + "full_text": "If our twitter bid succeeds, we will defeat the spam bots or die trying!", + "reply_count": 32433, + "retweet_count": 69710, + "favorite_count": 833196, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1517215066550116354", + "created_at": "2022-04-21T18:53:55.000Z", + "quote_count": 12602, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1276396101872922625", + "conversation_id": "1276396101872922625", + "full_text": "https://t.co/e9dPKVSjjl", + "reply_count": 5811, + "retweet_count": 116826, + "favorite_count": 777176, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/EbarfO6U4AA-7c5.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1276396101872922625", + "created_at": "2020-06-26T06:05:19.000Z", + "quote_count": 7287, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1559691922725281800", + "conversation_id": "1559690651687608321", + "full_text": "Also, I’m buying Manchester United ur welcome", + "reply_count": 54593, + "retweet_count": 112817, + "favorite_count": 847886, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1559691922725281800", + "created_at": "2022-08-17T00:01:46.000Z", + "quote_count": 52581, + "is_quote_tweet": false, + "replying_to_tweet": "https://twitter.com/elonmusk/status/1559690651687608321", + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1519036983137509376", + "conversation_id": "1519020176884305920", + "full_text": "By “free speech”, I simply mean that which matches the law. \n\nI am against censorship that goes far beyond the law. \n\nIf people want less free speech, they will ask government to pass laws to that effect.\n\nTherefore, going beyond the law is contrary to the will of the people.", + "reply_count": 58411, + "retweet_count": 85586, + "favorite_count": 804143, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1519036983137509376", + "created_at": "2022-04-26T19:33:33.000Z", + "quote_count": 16481, + "is_quote_tweet": false, + "replying_to_tweet": "https://twitter.com/elonmusk/status/1519020176884305920", + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1526997132858822658", + "conversation_id": "1526997132858822658", + "full_text": "In the past I voted Democrat, because they were (mostly) the kindness party.\n\nBut they have become the party of division & hate, so I can no longer support them and will vote Republican.\n\nNow, watch their dirty tricks campaign against me unfold … 🍿", + "reply_count": 106371, + "retweet_count": 119882, + "favorite_count": 804876, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1526997132858822658", + "created_at": "2022-05-18T18:44:21.000Z", + "quote_count": 32796, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1688022163574439937", + "conversation_id": "1688022163574439937", + "full_text": "If you were unfairly treated by your employer due to posting or liking something on this platform, we will fund your legal bill.\n\nNo limit. \n\nPlease let us know.", + "reply_count": 46614, + "retweet_count": 142357, + "favorite_count": 867887, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1688022163574439937", + "created_at": "2023-08-06T03:00:20.000Z", + "view_count": 137457648, + "quote_count": 27757, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1432818021836357634", + "conversation_id": "1432818021836357634", + "full_text": "https://t.co/YUt6Ltz2B6", + "reply_count": 6742, + "retweet_count": 13738, + "favorite_count": 515958, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/E-JkZaKVIAcbTdW.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1432818021836357634", + "created_at": "2021-08-31T21:30:11.000Z", + "quote_count": 788, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1649052609590992901", + "conversation_id": "1649052609590992901", + "full_text": "https://t.co/vX3M7B3J1G", + "reply_count": 40115, + "retweet_count": 74183, + "favorite_count": 838276, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/ext_tw_video_thumb/1649047801446400000/pu/img/e2X_U3_Ti1mhf0fD.jpg", + "type": "video", + "video_url": "https://video.twimg.com/ext_tw_video/1649047801446400000/pu/vid/540x634/iek2j2lOnDvsuctV.mp4?tag=12" + } + ], + "url": "https://twitter.com/elonmusk/status/1649052609590992901", + "created_at": "2023-04-20T14:09:14.000Z", + "view_count": 95752230, + "quote_count": 9531, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1597336812732575744", + "conversation_id": "1597336812732575744", + "full_text": "The Twitter Files on free speech suppression soon to be published on Twitter itself. The public deserves to know what really happened …", + "reply_count": 45806, + "retweet_count": 122369, + "favorite_count": 810965, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1597336812732575744", + "created_at": "2022-11-28T21:09:07.000Z", + "quote_count": 14868, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1361252063926251521", + "conversation_id": "1361252063926251521", + "full_text": "https://t.co/w11m1IAG0z", + "reply_count": 10498, + "retweet_count": 68594, + "favorite_count": 756594, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/EuQjiWeXAAEYUts.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1361252063926251521", + "created_at": "2021-02-15T09:52:37.000Z", + "quote_count": 5088, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1672582593638957056", + "conversation_id": "1672582593638957056", + "full_text": "Don’t even trust nobody https://t.co/VHa1zVGI71", + "reply_count": 22047, + "retweet_count": 72713, + "favorite_count": 832630, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FzY0_SvaIAAb9Xr.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1672582593638957056", + "created_at": "2023-06-24T12:29:00.000Z", + "view_count": 69581275, + "quote_count": 4599, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1686058966705487875", + "conversation_id": "1686058966705487875", + "full_text": "Wow, I’m glad so many people love Canada too 🤗 https://t.co/5oOL05zawB", + "reply_count": 35449, + "retweet_count": 44669, + "favorite_count": 846460, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F2YVsVIXwBMdxRO.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1686058966705487875", + "created_at": "2023-07-31T16:59:17.000Z", + "view_count": 65689425, + "quote_count": 8190, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1662654838398697472", + "conversation_id": "1662654838398697472", + "full_text": "Sorry this app takes up so much space https://t.co/bCCfcOhNJt", + "reply_count": 48357, + "retweet_count": 63774, + "favorite_count": 825999, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FxLvvm1XoAEkCaK.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1662654838398697472", + "created_at": "2023-05-28T02:59:38.000Z", + "view_count": 104719593, + "quote_count": 14271, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1525305145239781377", + "conversation_id": "1525305145239781377", + "full_text": "The bots are angry at being counted 🤣", + "reply_count": 33782, + "retweet_count": 52651, + "favorite_count": 778264, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1525305145239781377", + "created_at": "2022-05-14T02:41:00.000Z", + "quote_count": 5713, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1520021098934554624", + "conversation_id": "1520017094007476224", + "full_text": "But I’m no fan of the far right either. \n\nLet’s have less hate and more love.", + "reply_count": 40853, + "retweet_count": 44229, + "favorite_count": 771649, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1520021098934554624", + "created_at": "2022-04-29T12:44:05.000Z", + "quote_count": 6144, + "is_quote_tweet": false, + "replying_to_tweet": "https://twitter.com/elonmusk/status/1520017094007476224", + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1607590239874211847", + "conversation_id": "1607590239874211847", + "full_text": "Some nights … https://t.co/BLAUsJr4wb", + "reply_count": 41223, + "retweet_count": 47150, + "favorite_count": 777302, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fk9Oy_iWIAEx8Qd.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1607590239874211847", + "created_at": "2022-12-27T04:12:35.000Z", + "view_count": 74451033, + "quote_count": 10569, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1518614732839735304", + "conversation_id": "1518614732839735304", + "full_text": "And be my love in the rain", + "reply_count": 38409, + "retweet_count": 49713, + "favorite_count": 766115, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1518614732839735304", + "created_at": "2022-04-25T15:35:41.000Z", + "quote_count": 6798, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1497701484003213317", + "conversation_id": "1497543633293266944", + "full_text": "@FedorovMykhailo Starlink service is now active in Ukraine. More terminals en route.", + "reply_count": 26104, + "retweet_count": 127689, + "favorite_count": 769963, + "hashtags": [], + "symbols": [], + "user_mentions": [ + { + "id_str": "1331528215899344896", + "name": "Mykhailo Fedorov", + "screen_name": "FedorovMykhailo", + "profile": "https://twitter.com/FedorovMykhailo" + } + ], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1497701484003213317", + "created_at": "2022-02-26T22:33:54.000Z", + "quote_count": 23725, + "is_quote_tweet": false, + "replying_to_tweet": "https://twitter.com/FedorovMykhailo/status/1497543633293266944", + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1505100708256825347", + "conversation_id": "1505100708256825347", + "full_text": "https://t.co/qZSX2up9W0", + "reply_count": 25006, + "retweet_count": 63264, + "favorite_count": 752723, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FOMxHZwXEAIreox.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1505100708256825347", + "created_at": "2022-03-19T08:35:46.000Z", + "quote_count": 4722, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1658960642445910017", + "conversation_id": "1658960642445910017", + "full_text": "https://t.co/FxOptt5Rgb", + "reply_count": 30576, + "retweet_count": 54781, + "favorite_count": 792357, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/FwXP5iKWcAEecKA.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1658960642445910017", + "created_at": "2023-05-17T22:20:13.000Z", + "view_count": 66684167, + "quote_count": 5027, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1358319935978496001", + "conversation_id": "1358319935978496001", + "full_text": "So … it’s finally come to this … https://t.co/Gf0Rg2QOaF", + "reply_count": 27511, + "retweet_count": 83980, + "favorite_count": 720596, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Etm4yFZUcAAoN5u.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1358319935978496001", + "created_at": "2021-02-07T07:41:23.000Z", + "quote_count": 7616, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1129274835173908481", + "conversation_id": "1129274835173908481", + "full_text": "And I am forever grateful https://t.co/kU1pT8t0yv", + "reply_count": 2904, + "retweet_count": 117714, + "favorite_count": 667576, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/D6v9ed6UwAAoKg2.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1129274835173908481", + "created_at": "2019-05-17T06:37:56.000Z", + "quote_count": 3819, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1647629006089461761", + "conversation_id": "1647629006089461761", + "full_text": "Launch attempt tomorrow https://t.co/czFsQ53Xsa", + "reply_count": 26620, + "retweet_count": 51862, + "favorite_count": 783936, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Ft2N2IxX0AkIbLf.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1647629006089461761", + "created_at": "2023-04-16T15:52:21.000Z", + "view_count": 75845428, + "quote_count": 4885, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1375033483148451842", + "conversation_id": "1375033483148451842", + "full_text": "If there’s ever a scandal about me, *please* call it Elongate", + "reply_count": 20973, + "retweet_count": 53774, + "favorite_count": 723756, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [], + "url": "https://twitter.com/elonmusk/status/1375033483148451842", + "created_at": "2021-03-25T10:35:03.000Z", + "quote_count": 8794, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1677470862436450308", + "conversation_id": "1677470862436450308", + "full_text": "Just drove Cybertruck around Austin! https://t.co/QN19Agqa7R", + "reply_count": 49034, + "retweet_count": 48651, + "favorite_count": 792030, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/F0eS2dyXgAAIqng.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1677470862436450308", + "created_at": "2023-07-08T00:13:14.000Z", + "view_count": 75117791, + "quote_count": 7125, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}, +{ + "username": "elonmusk", + "user_id": "44196397", + "id": "1629598417159692288", + "conversation_id": "1629598417159692288", + "full_text": "https://t.co/5wIbOXFs1e", + "reply_count": 14937, + "retweet_count": 67980, + "favorite_count": 774099, + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [], + "media": [ + { + "media_url": "https://pbs.twimg.com/media/Fp1_H34WwAI3n1j.jpg", + "type": "photo" + } + ], + "url": "https://twitter.com/elonmusk/status/1629598417159692288", + "created_at": "2023-02-25T21:45:13.000Z", + "view_count": 96013117, + "quote_count": 6278, + "is_quote_tweet": false, + "is_retweet": false, + "is_pinned": false, + "is_truncated": false, + "startUrl": "https://twitter.com/elonmusk/with_replies" +}] \ No newline at end of file diff --git a/docs/extras/integrations/chat_loaders/twitter.ipynb b/docs/extras/integrations/chat_loaders/twitter.ipynb new file mode 100644 index 000000000..61dc650b8 --- /dev/null +++ b/docs/extras/integrations/chat_loaders/twitter.ipynb @@ -0,0 +1,77 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d86853d2", + "metadata": {}, + "source": [ + "# Twitter (via Apify)\n", + "\n", + "This notebook shows how to load chat messages from Twitter to finetune on. We do this by utilizing Apify. \n", + "\n", + "First, use Apify to export tweets. An example" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e5034b4e", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "from langchain.schema import AIMessage\n", + "from langchain.adapters.openai import convert_message_to_dict" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8bf0fb93", + "metadata": {}, + "outputs": [], + "source": [ + "with open('example_data/dataset_twitter-scraper_2023-08-23_22-13-19-740.json') as f:\n", + " data = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "468124fa", + "metadata": {}, + "outputs": [], + "source": [ + "# Filter out tweets that reference other tweets, because it's a bit weird\n", + "tweets = [d[\"full_text\"] for d in data if \"t.co\" not in d['full_text']]\n", + "# Create them as AI messages\n", + "messages = [AIMessage(content=t) for t in tweets]\n", + "# Add in a system message at the start\n", + "# TODO: we could try to extract the subject from the tweets, and put that in the system message.\n", + "system_message = {\"role\": \"system\", \"content\": \"write a tweet\"}\n", + "data = [[system_message, convert_message_to_dict(m)] for m in messages]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.10.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 30151c99c72903320d7d865a9d5bf49237a4f267 Mon Sep 17 00:00:00 2001 From: Margaret Qian Date: Thu, 24 Aug 2023 22:13:17 -0700 Subject: [PATCH 124/143] Update Mosaic endpoint input/output api (#7391) As noted in prior PRs (https://github.com/hwchase17/langchain/pull/6060, https://github.com/hwchase17/langchain/pull/7348), the input/output format has changed a few times as we've stabilized our inference API. This PR updates the API to the latest stable version as indicated in our docs: https://docs.mosaicml.com/en/latest/inference.html The input format looks like this: `{"inputs": []} ` The output format looks like this: ` {"outputs": []} ` --------- Co-authored-by: Bagatur --- docs/extras/integrations/llms/mosaicml.ipynb | 2 +- .../langchain/embeddings/mosaicml.py | 37 ++++++------------- libs/langchain/langchain/llms/mosaicml.py | 32 +++++----------- .../embeddings/test_mosaicml.py | 4 +- .../integration_tests/llms/test_mosaicml.py | 20 ++++++---- 5 files changed, 36 insertions(+), 59 deletions(-) diff --git a/docs/extras/integrations/llms/mosaicml.ipynb b/docs/extras/integrations/llms/mosaicml.ipynb index 596ee2d7b..cd9be156f 100644 --- a/docs/extras/integrations/llms/mosaicml.ipynb +++ b/docs/extras/integrations/llms/mosaicml.ipynb @@ -63,7 +63,7 @@ "metadata": {}, "outputs": [], "source": [ - "llm = MosaicML(inject_instruction_format=True, model_kwargs={\"do_sample\": False})" + "llm = MosaicML(inject_instruction_format=True, model_kwargs={\"max_new_tokens\": 128})" ] }, { diff --git a/libs/langchain/langchain/embeddings/mosaicml.py b/libs/langchain/langchain/embeddings/mosaicml.py index 8346bf7cf..6a3c3e11c 100644 --- a/libs/langchain/langchain/embeddings/mosaicml.py +++ b/libs/langchain/langchain/embeddings/mosaicml.py @@ -79,14 +79,8 @@ class MosaicMLInstructorEmbeddings(BaseModel, Embeddings): raise ValueError(f"Error raised by inference endpoint: {e}") try: - parsed_response = response.json() - - if "error" in parsed_response: - # if we get rate limited, try sleeping for 1 second - if ( - not is_retry - and "rate limit exceeded" in parsed_response["error"].lower() - ): + if response.status_code == 429: + if not is_retry: import time time.sleep(self.retry_sleep) @@ -94,16 +88,20 @@ class MosaicMLInstructorEmbeddings(BaseModel, Embeddings): return self._embed(input, is_retry=True) raise ValueError( - f"Error raised by inference API: {parsed_response['error']}" + f"Error raised by inference API: rate limit exceeded.\nResponse: " + f"{response.text}" ) + parsed_response = response.json() + # The inference API has changed a couple of times, so we add some handling # to be robust to multiple response formats. if isinstance(parsed_response, dict): - if "data" in parsed_response: - output_item = parsed_response["data"] - elif "output" in parsed_response: - output_item = parsed_response["output"] + output_keys = ["data", "output", "outputs"] + for key in output_keys: + if key in parsed_response: + output_item = parsed_response[key] + break else: raise ValueError( f"No key data or output in response: {parsed_response}" @@ -113,19 +111,6 @@ class MosaicMLInstructorEmbeddings(BaseModel, Embeddings): embeddings = output_item else: embeddings = [output_item] - elif isinstance(parsed_response, list): - first_item = parsed_response[0] - if isinstance(first_item, list): - embeddings = parsed_response - elif isinstance(first_item, dict): - if "output" in first_item: - embeddings = [item["output"] for item in parsed_response] - else: - raise ValueError( - f"No key data or output in response: {parsed_response}" - ) - else: - raise ValueError(f"Unexpected response format: {parsed_response}") else: raise ValueError(f"Unexpected response type: {parsed_response}") diff --git a/libs/langchain/langchain/llms/mosaicml.py b/libs/langchain/langchain/llms/mosaicml.py index 780e7a8b4..718466178 100644 --- a/libs/langchain/langchain/llms/mosaicml.py +++ b/libs/langchain/langchain/llms/mosaicml.py @@ -138,14 +138,8 @@ class MosaicML(LLM): raise ValueError(f"Error raised by inference endpoint: {e}") try: - parsed_response = response.json() - - if "error" in parsed_response: - # if we get rate limited, try sleeping for 1 second - if ( - not is_retry - and "rate limit exceeded" in parsed_response["error"].lower() - ): + if response.status_code == 429: + if not is_retry: import time time.sleep(self.retry_sleep) @@ -153,9 +147,12 @@ class MosaicML(LLM): return self._call(prompt, stop, run_manager, is_retry=True) raise ValueError( - f"Error raised by inference API: {parsed_response['error']}" + f"Error raised by inference API: rate limit exceeded.\nResponse: " + f"{response.text}" ) + parsed_response = response.json() + # The inference API has changed a couple of times, so we add some handling # to be robust to multiple response formats. if isinstance(parsed_response, dict): @@ -173,23 +170,12 @@ class MosaicML(LLM): text = output_item[0] else: text = output_item - elif isinstance(parsed_response, list): - first_item = parsed_response[0] - if isinstance(first_item, str): - text = first_item - elif isinstance(first_item, dict): - if "output" in parsed_response: - text = first_item["output"] - else: - raise ValueError( - f"No key data or output in response: {parsed_response}" - ) - else: - raise ValueError(f"Unexpected response format: {parsed_response}") else: raise ValueError(f"Unexpected response type: {parsed_response}") - text = text[len(prompt) :] + # Older versions of the API include the input in the output response + if text.startswith(prompt): + text = text[len(prompt) :] except requests.exceptions.JSONDecodeError as e: raise ValueError( diff --git a/libs/langchain/tests/integration_tests/embeddings/test_mosaicml.py b/libs/langchain/tests/integration_tests/embeddings/test_mosaicml.py index a04c6f2c1..ae0bec3dd 100644 --- a/libs/langchain/tests/integration_tests/embeddings/test_mosaicml.py +++ b/libs/langchain/tests/integration_tests/embeddings/test_mosaicml.py @@ -34,7 +34,9 @@ def test_mosaicml_embedding_endpoint() -> None: """Test MosaicML embeddings with a different endpoint""" documents = ["foo bar"] embedding = MosaicMLInstructorEmbeddings( - endpoint_url="https://models.hosted-on.mosaicml.hosting/instructor-xl/v1/predict" + endpoint_url=( + "https://models.hosted-on.mosaicml.hosting/instructor-xl/v1/predict" + ) ) output = embedding.embed_documents(documents) assert len(output) == 1 diff --git a/libs/langchain/tests/integration_tests/llms/test_mosaicml.py b/libs/langchain/tests/integration_tests/llms/test_mosaicml.py index 2b532ab66..e15fce0fe 100644 --- a/libs/langchain/tests/integration_tests/llms/test_mosaicml.py +++ b/libs/langchain/tests/integration_tests/llms/test_mosaicml.py @@ -1,4 +1,6 @@ """Test MosaicML API wrapper.""" +import re + import pytest from langchain.llms.mosaicml import PROMPT_FOR_GENERATION_FORMAT, MosaicML @@ -13,7 +15,7 @@ def test_mosaicml_llm_call() -> None: def test_mosaicml_endpoint_change() -> None: """Test valid call to MosaicML.""" - new_url = "https://models.hosted-on.mosaicml.hosting/dolly-12b/v1/predict" + new_url = "https://models.hosted-on.mosaicml.hosting/mpt-30b-instruct/v1/predict" llm = MosaicML(endpoint_url=new_url) assert llm.endpoint_url == new_url output = llm("Say foo:") @@ -34,7 +36,7 @@ def test_mosaicml_extra_kwargs() -> None: def test_instruct_prompt() -> None: """Test instruct prompt.""" - llm = MosaicML(inject_instruction_format=True, model_kwargs={"do_sample": False}) + llm = MosaicML(inject_instruction_format=True, model_kwargs={"max_new_tokens": 10}) instruction = "Repeat the word foo" prompt = llm._transform_prompt(instruction) expected_prompt = PROMPT_FOR_GENERATION_FORMAT.format(instruction=instruction) @@ -45,7 +47,7 @@ def test_instruct_prompt() -> None: def test_retry_logic() -> None: """Tests that two queries (which would usually exceed the rate limit) works""" - llm = MosaicML(inject_instruction_format=True, model_kwargs={"do_sample": False}) + llm = MosaicML(inject_instruction_format=True, model_kwargs={"max_new_tokens": 10}) instruction = "Repeat the word foo" prompt = llm._transform_prompt(instruction) expected_prompt = PROMPT_FOR_GENERATION_FORMAT.format(instruction=instruction) @@ -70,9 +72,11 @@ def test_short_retry_does_not_loop() -> None: with pytest.raises( ValueError, - match="Error raised by inference API: Rate limit exceeded: 1 per 1 second", + match=re.escape( + "Error raised by inference API: rate limit exceeded.\nResponse: You have " + "reached maximum request limit.\n" + ), ): - output = llm(prompt) - assert isinstance(output, str) - output = llm(prompt) - assert isinstance(output, str) + for _ in range(10): + output = llm(prompt) + assert isinstance(output, str) From d04fe0d3ea55fb8cac418050da1bf3e205a2ac18 Mon Sep 17 00:00:00 2001 From: Jurik-001 <123458520+Jurik-001@users.noreply.github.com> Date: Fri, 25 Aug 2023 07:18:55 +0200 Subject: [PATCH 125/143] =?UTF-8?q?remove=20Value=20error=20"pyspark=20is?= =?UTF-8?q?=20not=20installed.=20Please=20install=20it=20with=20`pip=20i?= =?UTF-8?q?=E2=80=A6=20(#9723)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description: You cannot execute spark_sql with versions prior to 3.4 due to the introduction of pyspark.errors in version 3.4. And if you are below you get 3.4 "pyspark is not installed. Please install it with pip nstall pyspark" which is not helpful. Also if you not have pyspark installed you get already the error in init. I would return all errors. But if you have a different idea feel free to comment. Issue: None Dependencies: None Maintainer: --------- Co-authored-by: Bagatur --- libs/langchain/langchain/utilities/spark_sql.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/libs/langchain/langchain/utilities/spark_sql.py b/libs/langchain/langchain/utilities/spark_sql.py index ffecbe511..20c1e8e5b 100644 --- a/libs/langchain/langchain/utilities/spark_sql.py +++ b/libs/langchain/langchain/utilities/spark_sql.py @@ -179,14 +179,8 @@ class SparkSQL: If the statement throws an error, the error message is returned. """ - try: - from pyspark.errors import PySparkException - except ImportError: - raise ValueError( - "pyspark is not installed. Please install it with `pip install pyspark`" - ) try: return self.run(command, fetch) - except PySparkException as e: + except Exception as e: """Format the error message""" return f"Error: {e}" From 135cb862152068a8efb8dc61af740012b1be8940 Mon Sep 17 00:00:00 2001 From: Sergey Kozlov Date: Fri, 25 Aug 2023 14:47:17 +0600 Subject: [PATCH 126/143] Fix QuestionListOutputParser (#9738) This PR fixes `QuestionListOutputParser` text splitting. `QuestionListOutputParser` incorrectly splits numbered list text into lines. If text doesn't end with `\n` , the regex doesn't capture the last item. So it always returns `n - 1` items, and `WebResearchRetriever.llm_chain` generates less queries than requested in the search prompt. How to reproduce: ```python from langchain.retrievers.web_research import QuestionListOutputParser parser = QuestionListOutputParser() good = parser.parse( """1. This is line one. 2. This is line two. """ # <-- ! ) bad = parser.parse( """1. This is line one. 2. This is line two.""" # <-- No new line. ) assert good.lines == ['1. This is line one.\n', '2. This is line two.\n'], good.lines assert bad.lines == ['1. This is line one.\n', '2. This is line two.'], bad.lines ``` NOTE: Last item will not contain a line break but this seems ok because the items are stripped in the `WebResearchRetriever.clean_search_query()`. --- .../langchain/retrievers/web_research.py | 2 +- .../retrievers/test_web_research.py | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 libs/langchain/tests/unit_tests/retrievers/test_web_research.py diff --git a/libs/langchain/langchain/retrievers/web_research.py b/libs/langchain/langchain/retrievers/web_research.py index f51dbe8b8..30d9c04cb 100644 --- a/libs/langchain/langchain/retrievers/web_research.py +++ b/libs/langchain/langchain/retrievers/web_research.py @@ -61,7 +61,7 @@ class QuestionListOutputParser(PydanticOutputParser): super().__init__(pydantic_object=LineList) def parse(self, text: str) -> LineList: - lines = re.findall(r"\d+\..*?\n", text) + lines = re.findall(r"\d+\..*?(?:\n|$)", text) return LineList(lines=lines) diff --git a/libs/langchain/tests/unit_tests/retrievers/test_web_research.py b/libs/langchain/tests/unit_tests/retrievers/test_web_research.py new file mode 100644 index 000000000..a052e59b7 --- /dev/null +++ b/libs/langchain/tests/unit_tests/retrievers/test_web_research.py @@ -0,0 +1,36 @@ +from typing import List + +import pytest + +from langchain.retrievers.web_research import QuestionListOutputParser + + +@pytest.mark.parametrize( + "text,expected", + ( + ( + "1. Line one.\n", + ["1. Line one.\n"], + ), + ( + "1. Line one.", + ["1. Line one."], + ), + ( + "1. Line one.\n2. Line two.\n", + ["1. Line one.\n", "2. Line two.\n"], + ), + ( + "1. Line one.\n2. Line two.", + ["1. Line one.\n", "2. Line two."], + ), + ( + "1. Line one.\n2. Line two.\n3. Line three.", + ["1. Line one.\n", "2. Line two.\n", "3. Line three."], + ), + ), +) +def test_list_output_parser(text: str, expected: List[str]) -> None: + parser = QuestionListOutputParser() + result = parser.parse(text) + assert result.lines == expected From cacaf487c38785520b40c9efc53a556ddb6dc3d0 Mon Sep 17 00:00:00 2001 From: Fabrizio Ruocco Date: Fri, 25 Aug 2023 11:34:09 +0200 Subject: [PATCH 127/143] Azure Cognitive Search - update sdk b8, mod user agent, search with scores (#9191) Description: Update Azure Cognitive Search SDK to version b8 (breaking change) Customizable User Agent. Implemented Similarity search with scores @baskaryan --------- Co-authored-by: Bagatur --- .../vectorstores/azuresearch.ipynb | 71 ++++++++++++++----- .../langchain/vectorstores/azuresearch.py | 66 +++++++++++++---- libs/langchain/poetry.lock | 8 +-- libs/langchain/pyproject.toml | 2 +- 4 files changed, 111 insertions(+), 36 deletions(-) diff --git a/docs/extras/integrations/vectorstores/azuresearch.ipynb b/docs/extras/integrations/vectorstores/azuresearch.ipynb index fe6462136..fc9bb75b5 100644 --- a/docs/extras/integrations/vectorstores/azuresearch.ipynb +++ b/docs/extras/integrations/vectorstores/azuresearch.ipynb @@ -6,7 +6,9 @@ "source": [ "# Azure Cognitive Search\n", "\n", - "[Azure Cognitive Search](https://learn.microsoft.com/azure/search/search-what-is-azure-search) (formerly known as `Azure Search`) is a cloud search service that gives developers infrastructure, APIs, and tools for building a rich search experience over private, heterogeneous content in web, mobile, and enterprise applications.\n" + "[Azure Cognitive Search](https://learn.microsoft.com/azure/search/search-what-is-azure-search) (formerly known as `Azure Search`) is a cloud search service that gives developers infrastructure, APIs, and tools for building a rich search experience over private, heterogeneous content in web, mobile, and enterprise applications.\n", + "\n", + "Vector search is currently in public preview. It's available through the Azure portal, preview REST API and beta client libraries. [More info](https://learn.microsoft.com/en-us/azure/search/vector-search-overview) Beta client libraries are subject to potential breaking changes, please be sure to use the SDK package version identified below. azure-search-documents==11.4.0b8" ] }, { @@ -22,7 +24,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install azure-search-documents==11.4.0b6\n", + "!pip install azure-search-documents==11.4.0b8\n", "!pip install azure-identity" ] }, @@ -36,13 +38,13 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import openai\n", "import os\n", - "from langchain.embeddings.openai import OpenAIEmbeddings\n", + "from langchain.embeddings import OpenAIEmbeddings\n", "from langchain.vectorstores.azuresearch import AzureSearch" ] }, @@ -57,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -79,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -151,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -178,6 +180,41 @@ "print(docs[0].page_content)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Perform a vector similarity search with relevance scores\n", + " \n", + "Execute a pure vector similarity search using the similarity_search_with_relevance_scores() method:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(Document(page_content='Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. \\n\\nTonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. \\n\\nOne of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. \\n\\nAnd I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.', metadata={'source': 'C:\\\\repos\\\\langchain-fruocco-acs\\\\langchain\\\\docs\\\\extras\\\\modules\\\\state_of_the_union.txt'}),\n", + " 0.8441472),\n", + " (Document(page_content='Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. \\n\\nTonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. \\n\\nOne of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. \\n\\nAnd I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.', metadata={'source': 'C:\\\\repos\\\\langchain-fruocco-acs\\\\langchain\\\\docs\\\\extras\\\\modules\\\\state_of_the_union.txt'}),\n", + " 0.8441472),\n", + " (Document(page_content='A former top litigator in private practice. A former federal public defender. And from a family of public school educators and police officers. A consensus builder. Since she’s been nominated, she’s received a broad range of support—from the Fraternal Order of Police to former judges appointed by Democrats and Republicans. \\n\\nAnd if we are to advance liberty and justice, we need to secure the Border and fix the immigration system. \\n\\nWe can do both. At our border, we’ve installed new technology like cutting-edge scanners to better detect drug smuggling. \\n\\nWe’ve set up joint patrols with Mexico and Guatemala to catch more human traffickers. \\n\\nWe’re putting in place dedicated immigration judges so families fleeing persecution and violence can have their cases heard faster. \\n\\nWe’re securing commitments and supporting partners in South and Central America to host more refugees and secure their own borders.', metadata={'source': 'C:\\\\repos\\\\langchain-fruocco-acs\\\\langchain\\\\docs\\\\extras\\\\modules\\\\state_of_the_union.txt'}),\n", + " 0.82153815),\n", + " (Document(page_content='A former top litigator in private practice. A former federal public defender. And from a family of public school educators and police officers. A consensus builder. Since she’s been nominated, she’s received a broad range of support—from the Fraternal Order of Police to former judges appointed by Democrats and Republicans. \\n\\nAnd if we are to advance liberty and justice, we need to secure the Border and fix the immigration system. \\n\\nWe can do both. At our border, we’ve installed new technology like cutting-edge scanners to better detect drug smuggling. \\n\\nWe’ve set up joint patrols with Mexico and Guatemala to catch more human traffickers. \\n\\nWe’re putting in place dedicated immigration judges so families fleeing persecution and violence can have their cases heard faster. \\n\\nWe’re securing commitments and supporting partners in South and Central America to host more refugees and secure their own borders.', metadata={'source': 'C:\\\\repos\\\\langchain-fruocco-acs\\\\langchain\\\\docs\\\\extras\\\\modules\\\\state_of_the_union.txt'}),\n", + " 0.82153815)]\n" + ] + } + ], + "source": [ + "docs_and_scores = vector_store.similarity_search_with_relevance_scores(query=\"What did the president say about Ketanji Brown Jackson\", k=4, score_threshold=0.80)\n", + "from pprint import pprint\n", + "pprint(docs_and_scores)" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -190,7 +227,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -219,7 +256,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -254,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -328,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -348,7 +385,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -371,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -400,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -494,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -530,7 +567,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": {}, "outputs": [ { diff --git a/libs/langchain/langchain/vectorstores/azuresearch.py b/libs/langchain/langchain/vectorstores/azuresearch.py index 32b6d03f1..2fad466ad 100644 --- a/libs/langchain/langchain/vectorstores/azuresearch.py +++ b/libs/langchain/langchain/vectorstores/azuresearch.py @@ -73,6 +73,7 @@ def _get_search_client( scoring_profiles: Optional[List[ScoringProfile]] = None, default_scoring_profile: Optional[str] = None, default_fields: Optional[List[SearchField]] = None, + user_agent: Optional[str] = "langchain", ) -> SearchClient: from azure.core.credentials import AzureKeyCredential from azure.core.exceptions import ResourceNotFoundError @@ -80,13 +81,13 @@ def _get_search_client( from azure.search.documents import SearchClient from azure.search.documents.indexes import SearchIndexClient from azure.search.documents.indexes.models import ( + HnswVectorSearchAlgorithmConfiguration, PrioritizedFields, SearchIndex, SemanticConfiguration, SemanticField, SemanticSettings, VectorSearch, - VectorSearchAlgorithmConfiguration, ) default_fields = default_fields or [] @@ -95,7 +96,7 @@ def _get_search_client( else: credential = AzureKeyCredential(key) index_client: SearchIndexClient = SearchIndexClient( - endpoint=endpoint, credential=credential, user_agent="langchain" + endpoint=endpoint, credential=credential, user_agent=user_agent ) try: index_client.get_index(name=index_name) @@ -130,10 +131,10 @@ def _get_search_client( if vector_search is None: vector_search = VectorSearch( algorithm_configurations=[ - VectorSearchAlgorithmConfiguration( + HnswVectorSearchAlgorithmConfiguration( name="default", kind="hnsw", - hnsw_parameters={ # type: ignore + parameters={ # type: ignore "m": 4, "efConstruction": 400, "efSearch": 500, @@ -171,7 +172,7 @@ def _get_search_client( endpoint=endpoint, index_name=index_name, credential=credential, - user_agent="langchain", + user_agent=user_agent, ) @@ -227,6 +228,9 @@ class AzureSearch(VectorStore): type=SearchFieldDataType.String, ), ] + user_agent = "langchain" + if "user_agent" in kwargs and kwargs["user_agent"]: + user_agent += " " + kwargs["user_agent"] self.client = _get_search_client( azure_search_endpoint, azure_search_key, @@ -238,6 +242,7 @@ class AzureSearch(VectorStore): scoring_profiles=scoring_profiles, default_scoring_profile=default_scoring_profile, default_fields=default_fields, + user_agent=user_agent, ) self.search_type = search_type self.semantic_configuration_name = semantic_configuration_name @@ -321,6 +326,17 @@ class AzureSearch(VectorStore): raise ValueError(f"search_type of {search_type} not allowed.") return docs + def similarity_search_with_relevance_scores( + self, query: str, k: int = 4, **kwargs: Any + ) -> List[Tuple[Document, float]]: + score_threshold = kwargs.pop("score_threshold", None) + result = self.vector_search_with_score(query, k=k, **kwargs) + return ( + result + if score_threshold is None + else [r for r in result if r[1] >= score_threshold] + ) + def vector_search(self, query: str, k: int = 4, **kwargs: Any) -> List[Document]: """ Returns the most similar indexed documents to the query text. @@ -349,12 +365,19 @@ class AzureSearch(VectorStore): Returns: List of Documents most similar to the query and score for each """ + from azure.search.documents.models import Vector results = self.client.search( search_text="", - vector=np.array(self.embedding_function(query), dtype=np.float32).tolist(), - top_k=k, - vector_fields=FIELDS_CONTENT_VECTOR, + vectors=[ + Vector( + value=np.array( + self.embedding_function(query), dtype=np.float32 + ).tolist(), + k=k, + fields=FIELDS_CONTENT_VECTOR, + ) + ], select=[FIELDS_ID, FIELDS_CONTENT, FIELDS_METADATA], filter=filters, ) @@ -399,12 +422,19 @@ class AzureSearch(VectorStore): Returns: List of Documents most similar to the query and score for each """ + from azure.search.documents.models import Vector results = self.client.search( search_text=query, - vector=np.array(self.embedding_function(query), dtype=np.float32).tolist(), - top_k=k, - vector_fields=FIELDS_CONTENT_VECTOR, + vectors=[ + Vector( + value=np.array( + self.embedding_function(query), dtype=np.float32 + ).tolist(), + k=k, + fields=FIELDS_CONTENT_VECTOR, + ) + ], select=[FIELDS_ID, FIELDS_CONTENT, FIELDS_METADATA], filter=filters, top=k, @@ -452,11 +482,19 @@ class AzureSearch(VectorStore): Returns: List of Documents most similar to the query and score for each """ + from azure.search.documents.models import Vector + results = self.client.search( search_text=query, - vector=np.array(self.embedding_function(query), dtype=np.float32).tolist(), - top_k=50, # Hardcoded value to maximize L2 retrieval - vector_fields=FIELDS_CONTENT_VECTOR, + vectors=[ + Vector( + value=np.array( + self.embedding_function(query), dtype=np.float32 + ).tolist(), + k=50, + fields=FIELDS_CONTENT_VECTOR, + ) + ], select=[FIELDS_ID, FIELDS_CONTENT, FIELDS_METADATA], filter=filters, query_type="semantic", diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index badf9ec89..e21acf426 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -719,13 +719,13 @@ msal-extensions = ">=0.3.0,<2.0.0" [[package]] name = "azure-search-documents" -version = "11.4.0b6" +version = "11.4.0b8" description = "Microsoft Azure Cognitive Search Client Library for Python" optional = true python-versions = ">=3.7" files = [ - {file = "azure-search-documents-11.4.0b6.zip", hash = "sha256:c9ebd7d99d3c7b879f48acad66141e1f50eae4468cfb8389a4b25d4c620e8df1"}, - {file = "azure_search_documents-11.4.0b6-py3-none-any.whl", hash = "sha256:24ff85bf2680c36b38d8092bcbbe2d90699aac7c4a228b0839c0ce595a41628c"}, + {file = "azure-search-documents-11.4.0b8.zip", hash = "sha256:b178ff52918590191a9cb7f411a9ab3cb517663666a501a3e84b715d19b0d93b"}, + {file = "azure_search_documents-11.4.0b8-py3-none-any.whl", hash = "sha256:4137daa2db75bff9484d394c16c0604822a51281cad2f50e11d7c48dd8d4b4cf"}, ] [package.dependencies] @@ -10447,4 +10447,4 @@ text-helpers = ["chardet"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "88e479307b19d991105360780f67ed3258ef1a0151f70b9e91c86c8153751e83" +content-hash = "43a6bd42efc0baf917418087f788aaf3b1bc793cb4aa81de99c52ed6a7d54d26" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index bc626b415..bab5c36c1 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -105,7 +105,7 @@ nebula3-python = {version = "^3.4.0", optional = true} mwparserfromhell = {version = "^0.6.4", optional = true} mwxml = {version = "^0.3.3", optional = true} awadb = {version = "^0.3.9", optional = true} -azure-search-documents = {version = "11.4.0b6", optional = true} +azure-search-documents = {version = "11.4.0b8", optional = true} esprima = {version = "^4.0.1", optional = true} streamlit = {version = "^1.18.0", optional = true, python = ">=3.8.1,<3.9.7 || >3.9.7,<4.0"} psychicapi = {version = "^0.8.0", optional = true} From 9731ce5a406d5a7bb1878a54b265a6f7c728effc Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 25 Aug 2023 03:05:04 -0700 Subject: [PATCH 128/143] bump 273 (#9751) --- libs/experimental/pyproject.toml | 2 +- libs/langchain/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/experimental/pyproject.toml b/libs/experimental/pyproject.toml index 461aceedf..a90522199 100644 --- a/libs/experimental/pyproject.toml +++ b/libs/experimental/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain-experimental" -version = "0.0.10" +version = "0.0.11" description = "Building applications with LLMs through composability" authors = [] license = "MIT" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index bab5c36c1..63597a4be 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain" -version = "0.0.272" +version = "0.0.273" description = "Building applications with LLMs through composability" authors = [] license = "MIT" From 709a67d9bfcff475356924d8461140052dd418f7 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Fri, 25 Aug 2023 07:07:27 -0700 Subject: [PATCH 129/143] multivector notebook (#9740) --- .../retrievers/multi_vector.ipynb | 257 ++++++++++++++++-- 1 file changed, 235 insertions(+), 22 deletions(-) diff --git a/docs/extras/modules/data_connection/retrievers/multi_vector.ipynb b/docs/extras/modules/data_connection/retrievers/multi_vector.ipynb index 4a7587562..9197b5168 100644 --- a/docs/extras/modules/data_connection/retrievers/multi_vector.ipynb +++ b/docs/extras/modules/data_connection/retrievers/multi_vector.ipynb @@ -13,7 +13,10 @@ "\n", "- smaller chunks: split a document into smaller chunks, and embed those (this is ParentDocumentRetriever)\n", "- summary: create a summary for each document, embed that along with (or instead of) the document\n", - "- hypothetical questions: create hypothetical questions that each document would be appropriate to answer, embed those along with (or instead of) the document" + "- hypothetical questions: create hypothetical questions that each document would be appropriate to answer, embed those along with (or instead of) the document\n", + "\n", + "\n", + "Note that this also enables another method of adding embeddings - manually. This is great because you can explicitly add questions or queries that should lead to a document being recovered, giving you more control" ] }, { @@ -106,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "5d23247d", "metadata": {}, "outputs": [], @@ -122,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "92ed5861", "metadata": {}, "outputs": [], @@ -133,17 +136,17 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "8afed60c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Document(page_content='Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. \\n\\nOne of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.', metadata={'doc_id': 'b4ca7817-e3fe-4103-ac81-574fb41439ef', 'source': '../../state_of_the_union.txt'})" + "Document(page_content='Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. \\n\\nOne of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.', metadata={'doc_id': '10e9cbc0-4ba5-4d79-a09b-c033d1ba7b01', 'source': '../../state_of_the_union.txt'})" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -155,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "3c9017f1", "metadata": {}, "outputs": [ @@ -165,7 +168,7 @@ "9874" ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -187,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 10, "id": "1433dff4", "metadata": {}, "outputs": [], @@ -201,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "35b30390", "metadata": {}, "outputs": [], @@ -216,17 +219,17 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "41a2a738", "metadata": {}, "outputs": [], "source": [ - "summaries = [chain.invoke(d) for d in docs]" + "summaries = chain.batch(docs, {\"max_concurrency\": 5})" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "7ac5e4b1", "metadata": {}, "outputs": [], @@ -250,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "0d93309f", "metadata": {}, "outputs": [], @@ -260,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "6d5edf0d", "metadata": {}, "outputs": [], @@ -271,7 +274,20 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, + "id": "862ae920", + "metadata": {}, + "outputs": [], + "source": [ + "# # We can also add the original chunks to the vectorstore if we so want\n", + "# for i, doc in enumerate(docs):\n", + "# doc.metadata[id_key] = doc_ids[i]\n", + "# retriever.vectorstore.add_documents(docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, "id": "299232d6", "metadata": {}, "outputs": [], @@ -281,17 +297,17 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "10e404c0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Document(page_content='The document discusses various topics and proposals put forth by the President in a State of the Union address. These include the nomination of a judge for the Supreme Court, securing the border and fixing the immigration system, advancing liberty and justice for women and LGBTQ+ individuals, passing bipartisan legislation, addressing the opioid epidemic and mental health issues, supporting veterans, and ending cancer. The President expresses optimism about the future of the country and emphasizes the strength of the American people.', metadata={'doc_id': '8c7a707d-615d-42d5-919d-bc5178dd1ae4'})" + "Document(page_content=\"The document is a transcript of a speech given by the President of the United States. The President discusses several important issues and initiatives, including the nomination of a Supreme Court Justice, border security and immigration reform, protecting women's rights, advancing LGBTQ+ equality, bipartisan legislation, addressing the opioid epidemic and mental health, supporting veterans, investigating the health effects of burn pits on military personnel, ending cancer, and the strength and resilience of the American people.\", metadata={'doc_id': '79fa2e9f-28d9-4372-8af3-2caf4f1de312'})" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -302,7 +318,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "e4cce5c2", "metadata": {}, "outputs": [], @@ -312,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 21, "id": "c8570dbb", "metadata": {}, "outputs": [ @@ -322,7 +338,7 @@ "9194" ] }, - "execution_count": 24, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -340,6 +356,203 @@ "\n", "An LLM can also be used to generate a list of hypothetical questions that could be asked of a particular document. These questions can then be embedded" ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "5219b085", + "metadata": {}, + "outputs": [], + "source": [ + "functions = [\n", + " {\n", + " \"name\": \"hypothetical_questions\",\n", + " \"description\": \"Generate hypothetical questions\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"questions\": {\n", + " \"type\": \"array\",\n", + " \"items\": {\n", + " \"type\": \"string\"\n", + " },\n", + " },\n", + " },\n", + " \"required\": [\"questions\"]\n", + " }\n", + " }\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "523deb92", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.output_parsers.openai_functions import JsonKeyOutputFunctionsParser\n", + "chain = (\n", + " {\"doc\": lambda x: x.page_content}\n", + " # Only asking for 3 hypothetical questions, but this could be adjusted\n", + " | ChatPromptTemplate.from_template(\"Generate a list of 3 hypothetical questions that the below document could be used to answer:\\n\\n{doc}\")\n", + " | ChatOpenAI(max_retries=0, model=\"gpt-4\").bind(functions=functions, function_call={\"name\": \"hypothetical_questions\"})\n", + " | JsonKeyOutputFunctionsParser(key_name=\"questions\")\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "11d30554", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\"What was the author's initial impression of philosophy as a field of study, and how did it change when they got to college?\",\n", + " 'Why did the author decide to switch their focus to Artificial Intelligence (AI)?',\n", + " \"What led to the author's disillusionment with the field of AI as it was practiced at the time?\"]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chain.invoke(docs[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "3eb2e48c", + "metadata": {}, + "outputs": [], + "source": [ + "hypothetical_questions = chain.batch(docs, {\"max_concurrency\": 5})" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "b2cd6e75", + "metadata": {}, + "outputs": [], + "source": [ + "# The vectorstore to use to index the child chunks\n", + "vectorstore = Chroma(\n", + " collection_name=\"hypo-questions\",\n", + " embedding_function=OpenAIEmbeddings()\n", + ")\n", + "# The storage layer for the parent documents\n", + "store = InMemoryStore()\n", + "id_key = \"doc_id\"\n", + "# The retriever (empty to start)\n", + "retriever = MultiVectorRetriever(\n", + " vectorstore=vectorstore, \n", + " docstore=store, \n", + " id_key=id_key,\n", + ")\n", + "doc_ids = [str(uuid.uuid4()) for _ in docs]" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "18831b3b", + "metadata": {}, + "outputs": [], + "source": [ + "question_docs = []\n", + "for i, question_list in enumerate(hypothetical_questions):\n", + " question_docs.extend([Document(page_content=s,metadata={id_key: doc_ids[i]}) for s in question_list])" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "224b24c5", + "metadata": {}, + "outputs": [], + "source": [ + "retriever.vectorstore.add_documents(question_docs)\n", + "retriever.docstore.mset(list(zip(doc_ids, docs)))" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "7b442b90", + "metadata": {}, + "outputs": [], + "source": [ + "sub_docs = vectorstore.similarity_search(\"justice breyer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "089b5ad0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content=\"What is the President's stance on immigration reform?\", metadata={'doc_id': '505d73e3-8350-46ec-a58e-3af032f04ab3'}),\n", + " Document(page_content=\"What is the President's stance on immigration reform?\", metadata={'doc_id': '1c9618f0-7660-4b4f-a37c-509cbbbf6dba'}),\n", + " Document(page_content=\"What is the President's stance on immigration reform?\", metadata={'doc_id': '82c08209-b904-46a8-9532-edd2380950b7'}),\n", + " Document(page_content='What measures is the President proposing to protect the rights of LGBTQ+ Americans?', metadata={'doc_id': '82c08209-b904-46a8-9532-edd2380950b7'})]" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sub_docs" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "7594b24e", + "metadata": {}, + "outputs": [], + "source": [ + "retrieved_docs = retriever.get_relevant_documents(\"justice breyer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "4c120c65", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9194" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(retrieved_docs[0].page_content)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "616cfeeb", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 985873c49715d3b03eeede245f25eec500470339 Mon Sep 17 00:00:00 2001 From: Lance Martin <122662504+rlancemartin@users.noreply.github.com> Date: Fri, 25 Aug 2023 11:27:27 -0700 Subject: [PATCH 130/143] Update RAG use case (move to ntbk) (#9340) --- .../how_to/local_retrieval_qa.ipynb | 7 +- .../use_cases/question_answering/index.mdx | 342 --------- .../question_answering.ipynb | 686 ++++++++++++++++++ 3 files changed, 689 insertions(+), 346 deletions(-) delete mode 100644 docs/extras/use_cases/question_answering/index.mdx create mode 100644 docs/extras/use_cases/question_answering/question_answering.ipynb diff --git a/docs/extras/use_cases/question_answering/how_to/local_retrieval_qa.ipynb b/docs/extras/use_cases/question_answering/how_to/local_retrieval_qa.ipynb index 9eea135a6..d01b0bb3e 100644 --- a/docs/extras/use_cases/question_answering/how_to/local_retrieval_qa.ipynb +++ b/docs/extras/use_cases/question_answering/how_to/local_retrieval_qa.ipynb @@ -25,8 +25,7 @@ "metadata": {}, "outputs": [], "source": [ - "! pip install gpt4all\n", - "! pip install chromadb" + "pip install gpt4all chromadb" ] }, { @@ -157,7 +156,7 @@ "metadata": {}, "outputs": [], "source": [ - "! pip install llama-cpp-python" + "pip install llama-cpp-python" ] }, { @@ -736,7 +735,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/extras/use_cases/question_answering/index.mdx b/docs/extras/use_cases/question_answering/index.mdx deleted file mode 100644 index a9d98d264..000000000 --- a/docs/extras/use_cases/question_answering/index.mdx +++ /dev/null @@ -1,342 +0,0 @@ ---- -sidebar_position: -1 ---- - -# QA over Documents - -## Use case -Suppose you have some text documents (PDF, blog, Notion pages, etc.) and want to ask questions related to the contents of those documents. LLMs, given their proficiency in understanding text, are a great tool for this. - -In this walkthrough we'll go over how to build a question-answering over documents application using LLMs. Two very related use cases which we cover elsewhere are: -- [QA over structured data](/docs/use_cases/tabular) (e.g., SQL) -- [QA over code](/docs/use_cases/code) (e.g., Python) - -![intro.png](/img/qa_intro.png) - -## Overview -The pipeline for converting raw unstructured data into a QA chain looks like this: -1. `Loading`: First we need to load our data. Unstructured data can be loaded from many sources. Use the [LangChain integration hub](https://integrations.langchain.com/) to browse the full set of loaders. -Each loader returns data as a LangChain [`Document`](https://docs.langchain.com/docs/components/schema/document). -2. `Splitting`: [Text splitters](/docs/modules/data_connection/document_transformers/) break `Documents` into splits of specified size -3. `Storage`: Storage (e.g., often a [vectorstore](/docs/modules/data_connection/vectorstores/)) will house [and often embed](https://www.pinecone.io/learn/vector-embeddings/) the splits -4. `Retrieval`: The app retrieves splits from storage (e.g., often [with similar embeddings](https://www.pinecone.io/learn/k-nearest-neighbor/) to the input question) -5. `Generation`: An [LLM](/docs/modules/model_io/models/llms/) produces an answer using a prompt that includes the question and the retrieved data -6. `Conversation` (Extension): Hold a multi-turn conversation by adding [Memory](/docs/modules/memory/) to your QA chain. - -![flow.jpeg](/img/qa_flow.jpeg) - -## Quickstart -To give you a sneak preview, the above pipeline can be all be wrapped in a single object: `VectorstoreIndexCreator`. Suppose we want a QA app over this [blog post](https://lilianweng.github.io/posts/2023-06-23-agent/). We can create this in a few lines of code: - -First set environment variables and install packages: -```bash -pip install openai chromadb -export OPENAI_API_KEY="..." -``` - -Then run: -```python -from langchain.document_loaders import WebBaseLoader -from langchain.indexes import VectorstoreIndexCreator - -loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/") -index = VectorstoreIndexCreator().from_loaders([loader]) -``` - -And now ask your questions: -```python -index.query("What is Task Decomposition?") -``` - - ' Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. It can be done using LLM with simple prompting, task-specific instructions, or human inputs. Tree of Thoughts (Yao et al. 2023) is an example of a task decomposition technique that explores multiple reasoning possibilities at each step and generates multiple thoughts per step, creating a tree structure.' - -Ok, but what's going on under the hood, and how could we customize this for our specific use case? For that, let's take a look at how we can construct this pipeline piece by piece. - -## Step 1. Load - -Specify a `DocumentLoader` to load in your unstructured data as `Documents`. A `Document` is a piece of text (the `page_content`) and associated metadata. - -```python -from langchain.document_loaders import WebBaseLoader - -loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/") -data = loader.load() -``` - -### Go deeper -- Browse the > 120 data loader integrations [here](https://integrations.langchain.com/). -- See further documentation on loaders [here](/docs/modules/data_connection/document_loaders/). - -## Step 2. Split - -Split the `Document` into chunks for embedding and vector storage. - -```python -from langchain.text_splitter import RecursiveCharacterTextSplitter - -text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500, chunk_overlap = 0) -all_splits = text_splitter.split_documents(data) -``` - -### Go deeper - -- `DocumentSplitters` are just one type of the more generic `DocumentTransformers`, which can all be useful in this preprocessing step. -- See further documentation on transformers [here](/docs/modules/data_connection/document_transformers/). -- `Context-aware splitters` keep the location ("context") of each split in the original `Document`: - - [Markdown files](/docs/use_cases/question_answering/document-context-aware-QA) - - [Code (py or js)](/docs/modules/data_connection/document_loaders/integrations/source_code) - - [Documents](/docs/modules/data_connection/document_loaders/integrations/grobid) - -## Step 3. Store - -To be able to look up our document splits, we first need to store them where we can later look them up. -The most common way to do this is to embed the contents of each document then store the embedding and document in a vector store, with the embedding being used to index the document. - -```python -from langchain.embeddings import OpenAIEmbeddings -from langchain.vectorstores import Chroma - -vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings()) -``` - -### Go deeper -- Browse the > 40 vectorstores integrations [here](https://integrations.langchain.com/). -- See further documentation on vectorstores [here](/docs/modules/data_connection/vectorstores/). -- Browse the > 30 text embedding integrations [here](https://integrations.langchain.com/). -- See further documentation on embedding models [here](/docs/modules/data_connection/text_embedding/). - - Here are Steps 1-3: - -![lc.png](/img/qa_data_load.png) - -## Step 4. Retrieve - -Retrieve relevant splits for any question using [similarity search](https://www.pinecone.io/learn/what-is-similarity-search/). - -```python -question = "What are the approaches to Task Decomposition?" -docs = vectorstore.similarity_search(question) -len(docs) -``` - - 4 - -### Go deeper - -Vectorstores are commonly used for retrieval, but they are not the only option. For example, SVMs (see thread [here](https://twitter.com/karpathy/status/1647025230546886658?s=20)) can also be used. - -LangChain [has many retrievers](/docs/modules/data_connection/retrievers/) including, but not limited to, vectorstores. All retrievers implement a common method `get_relevant_documents()` (and its asynchronous variant `aget_relevant_documents()`). - -```python -from langchain.retrievers import SVMRetriever - -svm_retriever = SVMRetriever.from_documents(all_splits,OpenAIEmbeddings()) -docs_svm=svm_retriever.get_relevant_documents(question) -len(docs_svm) -``` - - 4 - -Some common ways to improve on vector similarity search include: -- `MultiQueryRetriever` [generates variants of the input question](/docs/modules/data_connection/retrievers/MultiQueryRetriever) to improve retrieval. -- `Max marginal relevance` selects for [relevance and diversity](https://www.cs.cmu.edu/~jgc/publication/The_Use_MMR_Diversity_Based_LTMIR_1998.pdf) among the retrieved documents. -- Documents can be filtered during retrieval using [`metadata` filters](/docs/use_cases/question_answering/how_to/document-context-aware-QA). - - -```python -import logging - -from langchain.chat_models import ChatOpenAI -from langchain.retrievers.multi_query import MultiQueryRetriever - -logging.basicConfig() -logging.getLogger('langchain.retrievers.multi_query').setLevel(logging.INFO) - -retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), - llm=ChatOpenAI(temperature=0)) -unique_docs = retriever_from_llm.get_relevant_documents(query=question) -len(unique_docs) -``` - - INFO:langchain.retrievers.multi_query:Generated queries: ['1. How can Task Decomposition be approached?', '2. What are the different methods for Task Decomposition?', '3. What are the various approaches to decomposing tasks?'] - 5 - -## Step 5. Generate - -Distill the retrieved documents into an answer using an LLM/Chat model (e.g., `gpt-3.5-turbo`) with `RetrievalQA` chain. - -```python -from langchain.chains import RetrievalQA -from langchain.chat_models import ChatOpenAI - -llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0) -qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever()) -qa_chain({"query": question}) -``` - - { - 'query': 'What are the approaches to Task Decomposition?', - 'result': 'The approaches to task decomposition include:\n\n1. Simple prompting: This approach involves using simple prompts or questions to guide the agent in breaking down a task into smaller subgoals. For example, the agent can be prompted with "Steps for XYZ" and asked to list the subgoals for achieving XYZ.\n\n2. Task-specific instructions: In this approach, task-specific instructions are provided to the agent to guide the decomposition process. For example, if the task is to write a novel, the agent can be instructed to "Write a story outline" as a subgoal.\n\n3. Human inputs: This approach involves incorporating human inputs in the task decomposition process. Humans can provide guidance, feedback, and suggestions to help the agent break down complex tasks into manageable subgoals.\n\nThese approaches aim to enable efficient handling of complex tasks by breaking them down into smaller, more manageable parts.' - } - -Note, you can pass in an `LLM` or a `ChatModel` (like we did here) to the `RetrievalQA` chain. - -### Go deeper - -#### Choosing LLMs -- Browse the > 55 LLM and chat model integrations [here](https://integrations.langchain.com/). -- See further documentation on LLMs and chat models [here](/docs/modules/model_io/models/). -- Use local LLMS: The popularity of [PrivateGPT](https://github.com/imartinez/privateGPT) and [GPT4All](https://github.com/nomic-ai/gpt4all) underscore the importance of running LLMs locally. -Using `GPT4All` is as simple as [downloading the binary]((/docs/integrations/llms/gpt4all)) and then: - - from langchain.llms import GPT4All - from langchain.chains import RetrievalQA - - llm = GPT4All(model="/Users/rlm/Desktop/Code/gpt4all/models/nous-hermes-13b.ggmlv3.q4_0.bin",max_tokens=2048) - qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever()) - -#### Customizing the prompt - -The prompt in `RetrievalQA` chain can be easily customized. - -```python -from langchain.chains import RetrievalQA -from langchain.prompts import PromptTemplate - -template = """Use the following pieces of context to answer the question at the end. -If you don't know the answer, just say that you don't know, don't try to make up an answer. -Use three sentences maximum and keep the answer as concise as possible. -Always say "thanks for asking!" at the end of the answer. -{context} -Question: {question} -Helpful Answer:""" -QA_CHAIN_PROMPT = PromptTemplate.from_template(template) - -llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0) -qa_chain = RetrievalQA.from_chain_type( - llm, - retriever=vectorstore.as_retriever(), - chain_type_kwargs={"prompt": QA_CHAIN_PROMPT} -) -result = qa_chain({"query": question}) -result["result"] -``` - - 'The approaches to Task Decomposition are (1) using simple prompting by LLM, (2) using task-specific instructions, and (3) with human inputs. Thanks for asking!' - - -#### Return source documents - -The full set of retrieved documents used for answer distillation can be returned using `return_source_documents=True`. - -```python -from langchain.chains import RetrievalQA - -qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever(), - return_source_documents=True) -result = qa_chain({"query": question}) -print(len(result['source_documents'])) -result['source_documents'][0] -``` - - 4 - Document(page_content='Task decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'title': "LLM Powered Autonomous Agents | Lil'Log", 'description': 'Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.\nAgent System Overview In a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:', 'language': 'en'}) - - - -#### Return citations - -Answer citations can be returned using `RetrievalQAWithSourcesChain`. - - -```python -from langchain.chains import RetrievalQAWithSourcesChain - -qa_chain = RetrievalQAWithSourcesChain.from_chain_type(llm,retriever=vectorstore.as_retriever()) - -result = qa_chain({"question": question}) -result -``` - - { - 'question': 'What are the approaches to Task Decomposition?', - 'answer': 'The approaches to Task Decomposition include (1) using LLM with simple prompting, (2) using task-specific instructions, and (3) incorporating human inputs.\n', - 'sources': 'https://lilianweng.github.io/posts/2023-06-23-agent/' - } - -#### Customizing retrieved document processing - -Retrieved documents can be fed to an LLM for answer distillation in a few different ways. - -`stuff`, `refine`, `map-reduce`, and `map-rerank` chains for passing documents to an LLM prompt are well summarized [here](/docs/modules/chains/document/). - -`stuff` is commonly used because it simply "stuffs" all retrieved documents into the prompt. - -The [load_qa_chain](/docs/use_cases/question_answering/how_to/question_answering.html) is an easy way to pass documents to an LLM using these various approaches (e.g., see `chain_type`). - - -```python -from langchain.chains.question_answering import load_qa_chain - -chain = load_qa_chain(llm, chain_type="stuff") -chain({"input_documents": unique_docs, "question": question},return_only_outputs=True) -``` - - {'output_text': 'The approaches to task decomposition include (1) using simple prompting to break down tasks into subgoals, (2) providing task-specific instructions to guide the decomposition process, and (3) incorporating human inputs for task decomposition.'} - -We can also pass the `chain_type` to `RetrievalQA`. - - -```python -qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever(), - chain_type="stuff") -result = qa_chain({"query": question}) -``` - -In summary, the user can choose the desired level of abstraction for QA: - -![summary_chains.png](/img/summary_chains.png) - -## Step 6. Converse (Extension) - -To hold a conversation, a chain needs to be able to refer to past interactions. Chain `Memory` allows us to do this. To keep chat history, we can specify a Memory buffer to track the conversation inputs / outputs. - -```python -from langchain.memory import ConversationBufferMemory - -memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) -``` - -The `ConversationalRetrievalChain` uses chat in the `Memory buffer`. - -```python -from langchain.chains import ConversationalRetrievalChain - -retriever = vectorstore.as_retriever() -chat = ConversationalRetrievalChain.from_llm(llm, retriever=retriever, memory=memory) -``` - -```python -result = chat({"question": "What are some of the main ideas in self-reflection?"}) -result['answer'] -``` - - "Some of the main ideas in self-reflection include:\n1. Iterative improvement: Self-reflection allows autonomous agents to improve by refining past action decisions and correcting mistakes.\n2. Trial and error: Self-reflection is crucial in real-world tasks where trial and error are inevitable.\n3. Two-shot examples: Self-reflection is created by showing pairs of failed trajectories and ideal reflections for guiding future changes in the plan.\n4. Working memory: Reflections are added to the agent's working memory, up to three, to be used as context for querying.\n5. Performance evaluation: Self-reflection involves continuously reviewing and analyzing actions, self-criticizing behavior, and reflecting on past decisions and strategies to refine approaches.\n6. Efficiency: Self-reflection encourages being smart and efficient, aiming to complete tasks in the least number of steps." - -The Memory buffer has context to resolve `"it"` ("self-reflection") in the below question. - -```python -result = chat({"question": "How does the Reflexion paper handle it?"}) -result['answer'] -``` - - "The Reflexion paper handles self-reflection by showing two-shot examples to the Learning Language Model (LLM). Each example consists of a failed trajectory and an ideal reflection that guides future changes in the agent's plan. These reflections are then added to the agent's working memory, up to a maximum of three, to be used as context for querying the LLM. This allows the agent to iteratively improve its reasoning skills by refining past action decisions and correcting previous mistakes." - -### Go deeper - -The [documentation](/docs/use_cases/question_answering/how_to/chat_vector_db) on `ConversationalRetrievalChain` offers a few extensions, such as streaming and source documents. - - -## Further reading -- Check out the [How to](/docs/use_cases/question_answer/how_to/) section for all the variations of chains that can be used for QA over docs in different settings. -- Check out the [Integrations-specific](/docs/use_cases/question_answer/integrations/) section for chains that use specific integrations. diff --git a/docs/extras/use_cases/question_answering/question_answering.ipynb b/docs/extras/use_cases/question_answering/question_answering.ipynb new file mode 100644 index 000000000..035ea5e2b --- /dev/null +++ b/docs/extras/use_cases/question_answering/question_answering.ipynb @@ -0,0 +1,686 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5151afed", + "metadata": {}, + "source": [ + "# Question Answering\n", + "\n", + "[![Open In Collab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/extras/use_cases/question_answering/qa.ipynb)\n", + "\n", + "## Use case\n", + "Suppose you have some text documents (PDF, blog, Notion pages, etc.) and want to ask questions related to the contents of those documents. LLMs, given their proficiency in understanding text, are a great tool for this.\n", + "\n", + "In this walkthrough we'll go over how to build a question-answering over documents application using LLMs. Two very related use cases which we cover elsewhere are:\n", + "- [QA over structured data](/docs/use_cases/sql) (e.g., SQL)\n", + "- [QA over code](/docs/use_cases/code) (e.g., Python)\n", + "\n", + "![intro.png](/img/qa_intro.png)\n", + "\n", + "## Overview\n", + "The pipeline for converting raw unstructured data into a QA chain looks like this:\n", + "1. `Loading`: First we need to load our data. Unstructured data can be loaded from many sources. Use the [LangChain integration hub](https://integrations.langchain.com/) to browse the full set of loaders.\n", + "Each loader returns data as a LangChain [`Document`](/docs/components/schema/document).\n", + "2. `Splitting`: [Text splitters](/docs/modules/data_connection/document_transformers/) break `Documents` into splits of specified size\n", + "3. `Storage`: Storage (e.g., often a [vectorstore](/docs/modules/data_connection/vectorstores/)) will house [and often embed](https://www.pinecone.io/learn/vector-embeddings/) the splits\n", + "4. `Retrieval`: The app retrieves splits from storage (e.g., often [with similar embeddings](https://www.pinecone.io/learn/k-nearest-neighbor/) to the input question)\n", + "5. `Generation`: An [LLM](/docs/modules/model_io/models/llms/) produces an answer using a prompt that includes the question and the retrieved data\n", + "6. `Conversation` (Extension): Hold a multi-turn conversation by adding [Memory](/docs/modules/memory/) to your QA chain.\n", + "\n", + "![flow.jpeg](/img/qa_flow.jpeg)\n", + "\n", + "## Quickstart\n", + "\n", + "To give you a sneak preview, the above pipeline can be all be wrapped in a single object: `VectorstoreIndexCreator`. Suppose we want a QA app over this [blog post](https://lilianweng.github.io/posts/2023-06-23-agent/). We can create this in a few lines of code. First set environment variables and install packages:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e14b744b", + "metadata": {}, + "outputs": [], + "source": [ + "pip install openai chromadb\n", + "\n", + "# Set env var OPENAI_API_KEY or load from a .env file\n", + "# import dotenv\n", + "\n", + "# dotenv.load_env()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "046cefc0", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders import WebBaseLoader\n", + "from langchain.indexes import VectorstoreIndexCreator\n", + "\n", + "loader = WebBaseLoader(\"https://lilianweng.github.io/posts/2023-06-23-agent/\")\n", + "index = VectorstoreIndexCreator().from_loaders([loader])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f4bf8740", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. It can be done using LLM with simple prompting, task-specific instructions, or with human inputs. Tree of Thoughts (Yao et al. 2023) is an extension of Chain of Thought (Wei et al. 2022) which explores multiple reasoning possibilities at each step.'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index.query(\"What is Task Decomposition?\")" + ] + }, + { + "cell_type": "markdown", + "id": "8224aad6", + "metadata": {}, + "source": [ + "Ok, but what's going on under the hood, and how could we customize this for our specific use case? For that, let's take a look at how we can construct this pipeline piece by piece." + ] + }, + { + "cell_type": "markdown", + "id": "ba5daed6", + "metadata": {}, + "source": [ + "## Step 1. Load\n", + "\n", + "Specify a `DocumentLoader` to load in your unstructured data as `Documents`. A `Document` is a piece of text (the `page_content`) and associated metadata." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cf4d5c72", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders import WebBaseLoader\n", + "\n", + "loader = WebBaseLoader(\"https://lilianweng.github.io/posts/2023-06-23-agent/\")\n", + "data = loader.load()" + ] + }, + { + "cell_type": "markdown", + "id": "fd2cc9a7", + "metadata": {}, + "source": [ + "### Go deeper\n", + "- Browse the > 120 data loader integrations [here](https://integrations.langchain.com/).\n", + "- See further documentation on loaders [here](/docs/modules/data_connection/document_loaders/).\n", + "\n", + "## Step 2. Split\n", + "\n", + "Split the `Document` into chunks for embedding and vector storage." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4b11c01d", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", + "\n", + "text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500, chunk_overlap = 0)\n", + "all_splits = text_splitter.split_documents(data)" + ] + }, + { + "cell_type": "markdown", + "id": "0a33bd4d", + "metadata": {}, + "source": [ + "### Go deeper\n", + "\n", + "- `DocumentSplitters` are just one type of the more generic `DocumentTransformers`, which can all be useful in this preprocessing step.\n", + "- See further documentation on transformers [here](/docs/modules/data_connection/document_transformers/).\n", + "- `Context-aware splitters` keep the location (\"context\") of each split in the original `Document`:\n", + " - [Markdown files](/docs/use_cases/question_answering/how_to/document-context-aware-QA)\n", + " - [Code (py or js)](docs/integrations/document_loaders/source_code)\n", + " - [Documents](/docs/integrations/document_loaders/grobid)\n", + "\n", + "## Step 3. Store\n", + "\n", + "To be able to look up our document splits, we first need to store them where we can later look them up.\n", + "The most common way to do this is to embed the contents of each document then store the embedding and document in a vector store, with the embedding being used to index the document." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e9c302c8", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.embeddings import OpenAIEmbeddings\n", + "from langchain.vectorstores import Chroma\n", + "\n", + "vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())" + ] + }, + { + "cell_type": "markdown", + "id": "dc6f22b0", + "metadata": {}, + "source": [ + "### Go deeper\n", + "- Browse the > 40 vectorstores integrations [here](https://integrations.langchain.com/).\n", + "- See further documentation on vectorstores [here](/docs/modules/data_connection/vectorstores/).\n", + "- Browse the > 30 text embedding integrations [here](https://integrations.langchain.com/).\n", + "- See further documentation on embedding models [here](/docs/modules/data_connection/text_embedding/).\n", + "\n", + " Here are Steps 1-3:\n", + "\n", + "![lc.png](/img/qa_data_load.png)\n", + "\n", + "## Step 4. Retrieve\n", + "\n", + "Retrieve relevant splits for any question using [similarity search](https://www.pinecone.io/learn/what-is-similarity-search/)." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e2c26b7d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "question = \"What are the approaches to Task Decomposition?\"\n", + "docs = vectorstore.similarity_search(question)\n", + "len(docs)" + ] + }, + { + "cell_type": "markdown", + "id": "5d5a113b", + "metadata": {}, + "source": [ + "### Go deeper\n", + "\n", + "Vectorstores are commonly used for retrieval, but they are not the only option. For example, SVMs (see thread [here](https://twitter.com/karpathy/status/1647025230546886658?s=20)) can also be used.\n", + "\n", + "LangChain [has many retrievers](/docs/modules/data_connection/retrievers/) including, but not limited to, vectorstores. All retrievers implement a common method `get_relevant_documents()` (and its asynchronous variant `aget_relevant_documents()`)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c901eaee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.retrievers import SVMRetriever\n", + "\n", + "svm_retriever = SVMRetriever.from_documents(all_splits,OpenAIEmbeddings())\n", + "docs_svm=svm_retriever.get_relevant_documents(question)\n", + "len(docs_svm)" + ] + }, + { + "cell_type": "markdown", + "id": "69de3d54", + "metadata": {}, + "source": [ + "Some common ways to improve on vector similarity search include:\n", + "- `MultiQueryRetriever` [generates variants of the input question](/docs/modules/data_connection/retrievers/MultiQueryRetriever) to improve retrieval.\n", + "- `Max marginal relevance` selects for [relevance and diversity](https://www.cs.cmu.edu/~jgc/publication/The_Use_MMR_Diversity_Based_LTMIR_1998.pdf) among the retrieved documents.\n", + "- Documents can be filtered during retrieval using [`metadata` filters](/docs/use_cases/question_answering/how_to/document-context-aware-QA)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c690f01a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:langchain.retrievers.multi_query:Generated queries: ['1. How can Task Decomposition be approached?', '2. What are the different methods for Task Decomposition?', '3. What are the various approaches to decomposing tasks?']\n" + ] + }, + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import logging\n", + "\n", + "from langchain.chat_models import ChatOpenAI\n", + "from langchain.retrievers.multi_query import MultiQueryRetriever\n", + "\n", + "logging.basicConfig()\n", + "logging.getLogger('langchain.retrievers.multi_query').setLevel(logging.INFO)\n", + "\n", + "retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(),\n", + " llm=ChatOpenAI(temperature=0))\n", + "unique_docs = retriever_from_llm.get_relevant_documents(query=question)\n", + "len(unique_docs)" + ] + }, + { + "cell_type": "markdown", + "id": "415d6824", + "metadata": {}, + "source": [ + "## Step 5. Generate\n", + "\n", + "Distill the retrieved documents into an answer using an LLM/Chat model (e.g., `gpt-3.5-turbo`) with `RetrievalQA` chain.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "99fa1aec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'query': 'What are the approaches to Task Decomposition?',\n", + " 'result': 'There are three approaches to task decomposition:\\n\\n1. Using Language Model with simple prompting: This approach involves using a Language Model (LLM) with simple prompts like \"Steps for XYZ\" or \"What are the subgoals for achieving XYZ?\" to guide the task decomposition process.\\n\\n2. Using task-specific instructions: In this approach, task-specific instructions are provided to guide the task decomposition. For example, for the task of writing a novel, an instruction like \"Write a story outline\" can be given to help decompose the task into smaller subtasks.\\n\\n3. Human inputs: Task decomposition can also be done with the help of human inputs. This involves getting input and guidance from humans to break down a complex task into smaller, more manageable subtasks.'}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.chains import RetrievalQA\n", + "from langchain.chat_models import ChatOpenAI\n", + "\n", + "llm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n", + "qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever())\n", + "qa_chain({\"query\": question})" + ] + }, + { + "cell_type": "markdown", + "id": "f7d52c84", + "metadata": {}, + "source": [ + "Note, you can pass in an `LLM` or a `ChatModel` (like we did here) to the `RetrievalQA` chain.\n", + "\n", + "### Go deeper\n", + "\n", + "#### Choosing LLMs\n", + "- Browse the > 55 LLM and chat model integrations [here](https://integrations.langchain.com/).\n", + "- See further documentation on LLMs and chat models [here](/docs/modules/model_io/models/).\n", + "- Use local LLMS: The popularity of [PrivateGPT](https://github.com/imartinez/privateGPT) and [GPT4All](https://github.com/nomic-ai/gpt4all) underscore the importance of running LLMs locally.\n", + "Using `GPT4All` is as simple as [downloading the binary]((/docs/integrations/llms/gpt4all)) and then:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "02d6c9dc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found model file at /Users/rlm/Desktop/Code/gpt4all/models/nous-hermes-13b.ggmlv3.q4_0.bin\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "objc[61331]: Class GGMLMetalClass is implemented in both /Users/rlm/miniforge3/envs/llama/lib/python3.9/site-packages/gpt4all/llmodel_DO_NOT_MODIFY/build/libreplit-mainline-metal.dylib (0x2e3384208) and /Users/rlm/miniforge3/envs/llama/lib/python3.9/site-packages/gpt4all/llmodel_DO_NOT_MODIFY/build/libllamamodel-mainline-metal.dylib (0x2e37b0208). One of the two will be used. Which one is undefined.\n", + "llama.cpp: using Metal\n", + "llama.cpp: loading model from /Users/rlm/Desktop/Code/gpt4all/models/nous-hermes-13b.ggmlv3.q4_0.bin\n", + "llama_model_load_internal: format = ggjt v3 (latest)\n", + "llama_model_load_internal: n_vocab = 32001\n", + "llama_model_load_internal: n_ctx = 2048\n", + "llama_model_load_internal: n_embd = 5120\n", + "llama_model_load_internal: n_mult = 256\n", + "llama_model_load_internal: n_head = 40\n", + "llama_model_load_internal: n_layer = 40\n", + "llama_model_load_internal: n_rot = 128\n", + "llama_model_load_internal: ftype = 2 (mostly Q4_0)\n", + "llama_model_load_internal: n_ff = 13824\n", + "llama_model_load_internal: n_parts = 1\n", + "llama_model_load_internal: model size = 13B\n", + "llama_model_load_internal: ggml ctx size = 0.09 MB\n", + "llama_model_load_internal: mem required = 9031.71 MB (+ 1608.00 MB per state)\n", + "llama_new_context_with_model: kv self size = 1600.00 MB\n", + "ggml_metal_init: allocating\n", + "ggml_metal_init: using MPS\n", + "ggml_metal_init: loading '/Users/rlm/miniforge3/envs/llama/lib/python3.9/site-packages/gpt4all/llmodel_DO_NOT_MODIFY/build/ggml-metal.metal'\n", + "ggml_metal_init: loaded kernel_add 0x2bbbbc2f0\n", + "ggml_metal_init: loaded kernel_mul 0x2bbbba840\n", + "ggml_metal_init: loaded kernel_mul_row 0x2bb917dd0\n", + "ggml_metal_init: loaded kernel_scale 0x2bb918150\n", + "ggml_metal_init: loaded kernel_silu 0x2bb9184d0\n", + "ggml_metal_init: loaded kernel_relu 0x2bb918850\n", + "ggml_metal_init: loaded kernel_gelu 0x2bbbc3f10\n", + "ggml_metal_init: loaded kernel_soft_max 0x2bbbc5840\n", + "ggml_metal_init: loaded kernel_diag_mask_inf 0x2bbbc4c70\n", + "ggml_metal_init: loaded kernel_get_rows_f16 0x2bbbc5fc0\n", + "ggml_metal_init: loaded kernel_get_rows_q4_0 0x2bbbc6720\n", + "ggml_metal_init: loaded kernel_get_rows_q4_1 0x2bb918c10\n", + "ggml_metal_init: loaded kernel_get_rows_q2_k 0x2bbbc51b0\n", + "ggml_metal_init: loaded kernel_get_rows_q3_k 0x2bbbc7630\n", + "ggml_metal_init: loaded kernel_get_rows_q4_k 0x2d4394e30\n", + "ggml_metal_init: loaded kernel_get_rows_q5_k 0x2bbbc7890\n", + "ggml_metal_init: loaded kernel_get_rows_q6_k 0x2d4395210\n", + "ggml_metal_init: loaded kernel_rms_norm 0x2bbbc8740\n", + "ggml_metal_init: loaded kernel_norm 0x2bbbc8b30\n", + "ggml_metal_init: loaded kernel_mul_mat_f16_f32 0x2d4395470\n", + "ggml_metal_init: loaded kernel_mul_mat_q4_0_f32 0x2d4395a70\n", + "ggml_metal_init: loaded kernel_mul_mat_q4_1_f32 0x1242b1a00\n", + "ggml_metal_init: loaded kernel_mul_mat_q2_k_f32 0x29f17d1c0\n", + "ggml_metal_init: loaded kernel_mul_mat_q3_k_f32 0x2d4396050\n", + "ggml_metal_init: loaded kernel_mul_mat_q4_k_f32 0x2bbbc98a0\n", + "ggml_metal_init: loaded kernel_mul_mat_q5_k_f32 0x2bbbca4a0\n", + "ggml_metal_init: loaded kernel_mul_mat_q6_k_f32 0x2bbbcae90\n", + "ggml_metal_init: loaded kernel_rope 0x2bbbca700\n", + "ggml_metal_init: loaded kernel_alibi_f32 0x2bbbcc6e0\n", + "ggml_metal_init: loaded kernel_cpy_f32_f16 0x2bbbccf90\n", + "ggml_metal_init: loaded kernel_cpy_f32_f32 0x2bbbcd900\n", + "ggml_metal_init: loaded kernel_cpy_f16_f16 0x2bbbce1f0\n", + "ggml_metal_init: recommendedMaxWorkingSetSize = 21845.34 MB\n", + "ggml_metal_init: hasUnifiedMemory = true\n", + "ggml_metal_init: maxTransferRate = built-in GPU\n", + "ggml_metal_add_buffer: allocated 'data ' buffer, size = 6984.06 MB, ( 6984.45 / 21845.34)\n", + "ggml_metal_add_buffer: allocated 'eval ' buffer, size = 1024.00 MB, ( 8008.45 / 21845.34)\n", + "ggml_metal_add_buffer: allocated 'kv ' buffer, size = 1602.00 MB, ( 9610.45 / 21845.34)\n", + "ggml_metal_add_buffer: allocated 'scr0 ' buffer, size = 512.00 MB, (10122.45 / 21845.34)\n", + "ggml_metal_add_buffer: allocated 'scr1 ' buffer, size = 512.00 MB, (10634.45 / 21845.34)\n" + ] + } + ], + "source": [ + "from langchain.llms import GPT4All\n", + "from langchain.chains import RetrievalQA\n", + "\n", + "llm = GPT4All(model=\"/Users/rlm/Desktop/Code/gpt4all/models/nous-hermes-13b.ggmlv3.q4_0.bin\",max_tokens=2048)\n", + "qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever())" + ] + }, + { + "cell_type": "markdown", + "id": "fa82f437", + "metadata": {}, + "source": [ + "#### Customizing the prompt\n", + "\n", + "The prompt in `RetrievalQA` chain can be easily customized." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e4fee704", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ggml_metal_free: deallocating\n" + ] + }, + { + "data": { + "text/plain": [ + "'The approaches to task decomposition include using LLM with simple prompting, task-specific instructions, or human inputs. Thanks for asking!'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.chains import RetrievalQA\n", + "from langchain.prompts import PromptTemplate\n", + "\n", + "template = \"\"\"Use the following pieces of context to answer the question at the end. \n", + "If you don't know the answer, just say that you don't know, don't try to make up an answer. \n", + "Use three sentences maximum and keep the answer as concise as possible. \n", + "Always say \"thanks for asking!\" at the end of the answer. \n", + "{context}\n", + "Question: {question}\n", + "Helpful Answer:\"\"\"\n", + "QA_CHAIN_PROMPT = PromptTemplate.from_template(template)\n", + "\n", + "llm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n", + "qa_chain = RetrievalQA.from_chain_type(\n", + " llm,\n", + " retriever=vectorstore.as_retriever(),\n", + " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT}\n", + ")\n", + "result = qa_chain({\"query\": question})\n", + "result[\"result\"]" + ] + }, + { + "cell_type": "markdown", + "id": "ff40e8db", + "metadata": {}, + "source": [ + "#### Return source documents\n", + "\n", + "The full set of retrieved documents used for answer distillation can be returned using `return_source_documents=True`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "60004293", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + }, + { + "data": { + "text/plain": [ + "Document(page_content='Task decomposition can be done (1) by LLM with simple prompting like \"Steps for XYZ.\\\\n1.\", \"What are the subgoals for achieving XYZ?\", (2) by using task-specific instructions; e.g. \"Write a story outline.\" for writing a novel, or (3) with human inputs.', metadata={'description': 'Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.\\nAgent System Overview In a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:', 'language': 'en', 'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'title': \"LLM Powered Autonomous Agents | Lil'Log\"})" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.chains import RetrievalQA\n", + "\n", + "qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever(),\n", + " return_source_documents=True)\n", + "result = qa_chain({\"query\": question})\n", + "print(len(result['source_documents']))\n", + "result['source_documents'][0]" + ] + }, + { + "cell_type": "markdown", + "id": "1b600236", + "metadata": {}, + "source": [ + "#### Return citations\n", + "\n", + "Answer citations can be returned using `RetrievalQAWithSourcesChain`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "948f6d19", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'question': 'What are the approaches to Task Decomposition?',\n", + " 'answer': 'The approaches to Task Decomposition include:\\n1. Using LLM with simple prompting, such as providing steps or subgoals for achieving a task.\\n2. Using task-specific instructions, such as providing a specific instruction like \"Write a story outline\" for writing a novel.\\n3. Using human inputs to decompose the task.\\nAnother approach is the Tree of Thoughts, which extends the Chain of Thought (CoT) technique by exploring multiple reasoning possibilities at each step and generating multiple thoughts per step, creating a tree structure. The search process can be BFS or DFS, and each state can be evaluated by a classifier or majority vote.\\nSources: https://lilianweng.github.io/posts/2023-06-23-agent/',\n", + " 'sources': ''}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.chains import RetrievalQAWithSourcesChain\n", + "\n", + "qa_chain = RetrievalQAWithSourcesChain.from_chain_type(llm,retriever=vectorstore.as_retriever())\n", + "\n", + "result = qa_chain({\"question\": question})\n", + "result" + ] + }, + { + "cell_type": "markdown", + "id": "73d0b138", + "metadata": {}, + "source": [ + "#### Customizing retrieved document processing\n", + "\n", + "Retrieved documents can be fed to an LLM for answer distillation in a few different ways.\n", + "\n", + "`stuff`, `refine`, `map-reduce`, and `map-rerank` chains for passing documents to an LLM prompt are well summarized [here](/docs/modules/chains/document/).\n", + " \n", + "`stuff` is commonly used because it simply \"stuffs\" all retrieved documents into the prompt.\n", + "\n", + "The [load_qa_chain](/docs/use_cases/question_answering/how_to/question_answering.html) is an easy way to pass documents to an LLM using these various approaches (e.g., see `chain_type`)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "29aa139f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'output_text': 'The approaches to task decomposition mentioned in the provided context are:\\n\\n1. Chain of thought (CoT): This approach involves instructing the language model to \"think step by step\" and decompose complex tasks into smaller and simpler steps. It enhances model performance on complex tasks by utilizing more test-time computation.\\n\\n2. Tree of Thoughts: This approach extends CoT by exploring multiple reasoning possibilities at each step. It decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS or DFS, and each state is evaluated by a classifier or majority vote.\\n\\n3. LLM with simple prompting: This approach involves using a language model with simple prompts like \"Steps for XYZ\" or \"What are the subgoals for achieving XYZ?\" to perform task decomposition.\\n\\n4. Task-specific instructions: This approach involves providing task-specific instructions to guide the language model in decomposing the task. For example, providing the instruction \"Write a story outline\" for the task of writing a novel.\\n\\n5. Human inputs: Task decomposition can also be done with human inputs, where humans provide guidance and input to break down the task into smaller subtasks.'}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.chains.question_answering import load_qa_chain\n", + "\n", + "chain = load_qa_chain(llm, chain_type=\"stuff\")\n", + "chain({\"input_documents\": unique_docs, \"question\": question},return_only_outputs=True)" + ] + }, + { + "cell_type": "markdown", + "id": "a8cb8cd1", + "metadata": {}, + "source": [ + "We can also pass the `chain_type` to `RetrievalQA`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "f68574bd", + "metadata": {}, + "outputs": [], + "source": [ + "qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever(),\n", + " chain_type=\"stuff\")\n", + "result = qa_chain({\"query\": question})" + ] + }, + { + "cell_type": "markdown", + "id": "b33aeb5f", + "metadata": {}, + "source": [ + "In summary, the user can choose the desired level of abstraction for QA:\n", + "\n", + "![summary_chains.png](/img/summary_chains.png)\n", + "\n", + "## Step 6. Chat\n", + "\n", + "See our [use-case on chat](/docs/use_cases/chatbots) for detail on this!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2ab04a4e32d857d221f012a96b40b5549bdeadf1 Mon Sep 17 00:00:00 2001 From: Lance Martin <122662504+rlancemartin@users.noreply.github.com> Date: Fri, 25 Aug 2023 11:28:55 -0700 Subject: [PATCH 131/143] Update agent docs, move to use-case sub-directory (#9344) Re-structure and add new agent page --- docs/docs_skeleton/static/img/ReAct.png | Bin 0 -> 42674 bytes .../static/img/agents_use_case_1.png | Bin 0 -> 241979 bytes .../static/img/agents_use_case_trace_1.png | Bin 0 -> 75923 bytes .../static/img/agents_use_case_trace_2.png | Bin 0 -> 169721 bytes .../static/img/agents_vs_chains.png | Bin 0 -> 42731 bytes .../static/img/oai_function_agent.png | Bin 0 -> 181119 bytes docs/extras/use_cases/agents/baby_agi.ipynb | 565 -------------- .../agents/baby_agi_with_agent.ipynb | 647 ---------------- .../camel_role_playing.ipynb | 0 .../agent_simulations/characters.ipynb | 0 .../agents}/agent_simulations/gymnasium.ipynb | 0 .../agents}/agent_simulations/index.mdx | 0 .../agent_simulations/multi_player_dnd.ipynb | 0 .../multiagent_authoritarian.ipynb | 0 .../multiagent_bidding.ipynb | 0 .../agent_simulations/petting_zoo.ipynb | 0 .../two_agent_debate_tools.ipynb | 0 .../agent_simulations/two_player_dnd.ipynb | 0 .../extras/use_cases/more/agents/agents.ipynb | 718 ++++++++++++++++++ .../agents}/agents/camel_role_playing.ipynb | 0 .../custom_agent_with_plugin_retrieval.ipynb | 0 ...ith_plugin_retrieval_using_plugnplai.ipynb | 0 .../{ => more/agents}/agents/index.mdx | 0 .../agents/multi_modal_output_agent.ipynb | 298 ++++++++ .../agents/sales_agent_with_context.ipynb | 0 .../agents}/agents/wikibase_agent.ipynb | 0 .../agents}/autonomous_agents/autogpt.ipynb | 0 .../agents}/autonomous_agents/baby_agi.ipynb | 2 +- .../baby_agi_with_agent.ipynb | 0 .../autonomous_agents/hugginggpt.ipynb | 0 .../agents}/autonomous_agents/index.mdx | 0 .../autonomous_agents/marathon_times.ipynb | 0 .../autonomous_agents/meta_prompt.ipynb | 0 .../agents}/multi_modal/_category_.yml | 0 .../_image_agent_files}/output_10_1.png | Bin .../output_10_1.png | Bin .../output_15_1.png | Bin .../agents}/multi_modal/image_agent.ipynb | 2 +- .../multi_modal_output_agent.ipynb | 0 39 files changed, 1018 insertions(+), 1214 deletions(-) create mode 100644 docs/docs_skeleton/static/img/ReAct.png create mode 100644 docs/docs_skeleton/static/img/agents_use_case_1.png create mode 100644 docs/docs_skeleton/static/img/agents_use_case_trace_1.png create mode 100644 docs/docs_skeleton/static/img/agents_use_case_trace_2.png create mode 100644 docs/docs_skeleton/static/img/agents_vs_chains.png create mode 100644 docs/docs_skeleton/static/img/oai_function_agent.png delete mode 100644 docs/extras/use_cases/agents/baby_agi.ipynb delete mode 100644 docs/extras/use_cases/agents/baby_agi_with_agent.ipynb rename docs/extras/use_cases/{ => more/agents}/agent_simulations/camel_role_playing.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/characters.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/gymnasium.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/index.mdx (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/multi_player_dnd.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/multiagent_authoritarian.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/multiagent_bidding.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/petting_zoo.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/two_agent_debate_tools.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agent_simulations/two_player_dnd.ipynb (100%) create mode 100644 docs/extras/use_cases/more/agents/agents.ipynb rename docs/extras/use_cases/{ => more/agents}/agents/camel_role_playing.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agents/custom_agent_with_plugin_retrieval.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agents/custom_agent_with_plugin_retrieval_using_plugnplai.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agents/index.mdx (100%) create mode 100644 docs/extras/use_cases/more/agents/agents/multi_modal_output_agent.ipynb rename docs/extras/use_cases/{ => more/agents}/agents/sales_agent_with_context.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/agents/wikibase_agent.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/autonomous_agents/autogpt.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/autonomous_agents/baby_agi.ipynb (99%) rename docs/extras/use_cases/{ => more/agents}/autonomous_agents/baby_agi_with_agent.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/autonomous_agents/hugginggpt.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/autonomous_agents/index.mdx (100%) rename docs/extras/use_cases/{ => more/agents}/autonomous_agents/marathon_times.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/autonomous_agents/meta_prompt.ipynb (100%) rename docs/extras/use_cases/{ => more/agents}/multi_modal/_category_.yml (100%) rename docs/extras/use_cases/{agents/_multi_modal_output_agent_files => more/agents/multi_modal/_image_agent_files}/output_10_1.png (100%) rename docs/extras/use_cases/{multi_modal/_image_agent_files => more/agents/multi_modal/_multi_modal_output_agent_files}/output_10_1.png (100%) rename docs/extras/use_cases/{agents => more/agents/multi_modal}/_multi_modal_output_agent_files/output_15_1.png (100%) rename docs/extras/use_cases/{ => more/agents}/multi_modal/image_agent.ipynb (99%) rename docs/extras/use_cases/{agents => more/agents/multi_modal}/multi_modal_output_agent.ipynb (100%) diff --git a/docs/docs_skeleton/static/img/ReAct.png b/docs/docs_skeleton/static/img/ReAct.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e4260a8435bfd4ea771250f97e62ff7c9d17d2 GIT binary patch literal 42674 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

    $heI{44WXM;V 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%0A9VlBG#+9cu%as;;dvT;9X(+7Y7AsLc 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 literal 0 HcmV?d00001 diff --git a/docs/docs_skeleton/static/img/agents_use_case_trace_1.png b/docs/docs_skeleton/static/img/agents_use_case_trace_1.png new file mode 100644 index 0000000000000000000000000000000000000000..26c6d8c20b9d1d111ef97243778ac3fc47866340 GIT binary patch literal 75923 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

    g9Ikdt*dKZ{`ve9X513^ilz}I7xap6^d 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 Kxb&gz%l`)riQ8QO literal 0 HcmV?d00001 diff --git a/docs/docs_skeleton/static/img/agents_vs_chains.png b/docs/docs_skeleton/static/img/agents_vs_chains.png new file mode 100644 index 0000000000000000000000000000000000000000..78ada289a830cd8f55f93f2bda411d43c2d23e5e GIT binary patch literal 42731 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 literal 0 HcmV?d00001 diff --git a/docs/docs_skeleton/static/img/oai_function_agent.png b/docs/docs_skeleton/static/img/oai_function_agent.png new file mode 100644 index 0000000000000000000000000000000000000000..a492f1c15ab6ccbc0282fcb4279f4a19c8b1e395 GIT binary patch literal 181119 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 V)30dS9svH`zpH(x^dFW_{|}K=C8_`b literal 0 HcmV?d00001 diff --git a/docs/extras/use_cases/agents/baby_agi.ipynb b/docs/extras/use_cases/agents/baby_agi.ipynb deleted file mode 100644 index 49e2fa35f..000000000 --- a/docs/extras/use_cases/agents/baby_agi.ipynb +++ /dev/null @@ -1,565 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "517a9fd4", - "metadata": {}, - "source": [ - "# BabyAGI User Guide\n", - "\n", - "This notebook demonstrates how to implement [BabyAGI](https://github.com/yoheinakajima/babyagi/tree/main) by [Yohei Nakajima](https://twitter.com/yoheinakajima). BabyAGI is an AI agent that can generate and pretend to execute tasks based on a given objective.\n", - "\n", - "This guide will help you understand the components to create your own recursive agents.\n", - "\n", - "Although BabyAGI uses specific vectorstores/model providers (Pinecone, OpenAI), one of the benefits of implementing it with LangChain is that you can easily swap those out for different options. In this implementation we use a FAISS vectorstore (because it runs locally and is free)." - ] - }, - { - "cell_type": "markdown", - "id": "556af556", - "metadata": {}, - "source": [ - "## Install and Import Required Modules" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "id": "c8a354b6", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from collections import deque\n", - "from typing import Dict, List, Optional, Any\n", - "\n", - "from langchain import LLMChain, OpenAI, PromptTemplate\n", - "from langchain.embeddings import OpenAIEmbeddings\n", - "from langchain.llms import BaseLLM\n", - "from langchain.vectorstores.base import VectorStore\n", - "from pydantic import BaseModel, Field\n", - "from langchain.chains.base import Chain" - ] - }, - { - "cell_type": "markdown", - "id": "09f70772", - "metadata": {}, - "source": [ - "## Connect to the Vector Store\n", - "\n", - "Depending on what vectorstore you use, this step may look different." - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "794045d4", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.vectorstores import FAISS\n", - "from langchain.docstore import InMemoryDocstore" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "6e0305eb", - "metadata": {}, - "outputs": [], - "source": [ - "# Define your embedding model\n", - "embeddings_model = OpenAIEmbeddings()\n", - "# Initialize the vectorstore as empty\n", - "import faiss\n", - "\n", - "embedding_size = 1536\n", - "index = faiss.IndexFlatL2(embedding_size)\n", - "vectorstore = FAISS(embeddings_model.embed_query, index, InMemoryDocstore({}), {})" - ] - }, - { - "cell_type": "markdown", - "id": "0f3b72bf", - "metadata": {}, - "source": [ - "## Define the Chains\n", - "\n", - "BabyAGI relies on three LLM chains:\n", - "- Task creation chain to select new tasks to add to the list\n", - "- Task prioritization chain to re-prioritize tasks\n", - "- Execution Chain to execute the tasks" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "bf4bd5cd", - "metadata": {}, - "outputs": [], - "source": [ - "class TaskCreationChain(LLMChain):\n", - " \"\"\"Chain to generates tasks.\"\"\"\n", - "\n", - " @classmethod\n", - " def from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:\n", - " \"\"\"Get the response parser.\"\"\"\n", - " task_creation_template = (\n", - " \"You are a task creation AI that uses the result of an execution agent\"\n", - " \" to create new tasks with the following objective: {objective},\"\n", - " \" The last completed task has the result: {result}.\"\n", - " \" This result was based on this task description: {task_description}.\"\n", - " \" These are incomplete tasks: {incomplete_tasks}.\"\n", - " \" Based on the result, create new tasks to be completed\"\n", - " \" by the AI system that do not overlap with incomplete tasks.\"\n", - " \" Return the tasks as an array.\"\n", - " )\n", - " prompt = PromptTemplate(\n", - " template=task_creation_template,\n", - " input_variables=[\n", - " \"result\",\n", - " \"task_description\",\n", - " \"incomplete_tasks\",\n", - " \"objective\",\n", - " ],\n", - " )\n", - " return cls(prompt=prompt, llm=llm, verbose=verbose)" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "b6488ffe", - "metadata": {}, - "outputs": [], - "source": [ - "class TaskPrioritizationChain(LLMChain):\n", - " \"\"\"Chain to prioritize tasks.\"\"\"\n", - "\n", - " @classmethod\n", - " def from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:\n", - " \"\"\"Get the response parser.\"\"\"\n", - " task_prioritization_template = (\n", - " \"You are a task prioritization AI tasked with cleaning the formatting of and reprioritizing\"\n", - " \" the following tasks: {task_names}.\"\n", - " \" Consider the ultimate objective of your team: {objective}.\"\n", - " \" Do not remove any tasks. Return the result as a numbered list, like:\"\n", - " \" #. First task\"\n", - " \" #. Second task\"\n", - " \" Start the task list with number {next_task_id}.\"\n", - " )\n", - " prompt = PromptTemplate(\n", - " template=task_prioritization_template,\n", - " input_variables=[\"task_names\", \"next_task_id\", \"objective\"],\n", - " )\n", - " return cls(prompt=prompt, llm=llm, verbose=verbose)" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "b43cd580", - "metadata": {}, - "outputs": [], - "source": [ - "class ExecutionChain(LLMChain):\n", - " \"\"\"Chain to execute tasks.\"\"\"\n", - "\n", - " @classmethod\n", - " def from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:\n", - " \"\"\"Get the response parser.\"\"\"\n", - " execution_template = (\n", - " \"You are an AI who performs one task based on the following objective: {objective}.\"\n", - " \" Take into account these previously completed tasks: {context}.\"\n", - " \" Your task: {task}.\"\n", - " \" Response:\"\n", - " )\n", - " prompt = PromptTemplate(\n", - " template=execution_template,\n", - " input_variables=[\"objective\", \"context\", \"task\"],\n", - " )\n", - " return cls(prompt=prompt, llm=llm, verbose=verbose)" - ] - }, - { - "cell_type": "markdown", - "id": "3ad996c5", - "metadata": {}, - "source": [ - "### Define the BabyAGI Controller\n", - "\n", - "BabyAGI composes the chains defined above in a (potentially-)infinite loop." - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "id": "0ada0636", - "metadata": {}, - "outputs": [], - "source": [ - "def get_next_task(\n", - " task_creation_chain: LLMChain,\n", - " result: Dict,\n", - " task_description: str,\n", - " task_list: List[str],\n", - " objective: str,\n", - ") -> List[Dict]:\n", - " \"\"\"Get the next task.\"\"\"\n", - " incomplete_tasks = \", \".join(task_list)\n", - " response = task_creation_chain.run(\n", - " result=result,\n", - " task_description=task_description,\n", - " incomplete_tasks=incomplete_tasks,\n", - " objective=objective,\n", - " )\n", - " new_tasks = response.split(\"\\n\")\n", - " return [{\"task_name\": task_name} for task_name in new_tasks if task_name.strip()]" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "id": "d35250ad", - "metadata": {}, - "outputs": [], - "source": [ - "def prioritize_tasks(\n", - " task_prioritization_chain: LLMChain,\n", - " this_task_id: int,\n", - " task_list: List[Dict],\n", - " objective: str,\n", - ") -> List[Dict]:\n", - " \"\"\"Prioritize tasks.\"\"\"\n", - " task_names = [t[\"task_name\"] for t in task_list]\n", - " next_task_id = int(this_task_id) + 1\n", - " response = task_prioritization_chain.run(\n", - " task_names=task_names, next_task_id=next_task_id, objective=objective\n", - " )\n", - " new_tasks = response.split(\"\\n\")\n", - " prioritized_task_list = []\n", - " for task_string in new_tasks:\n", - " if not task_string.strip():\n", - " continue\n", - " task_parts = task_string.strip().split(\".\", 1)\n", - " if len(task_parts) == 2:\n", - " task_id = task_parts[0].strip()\n", - " task_name = task_parts[1].strip()\n", - " prioritized_task_list.append({\"task_id\": task_id, \"task_name\": task_name})\n", - " return prioritized_task_list" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "id": "e3f1840c", - "metadata": {}, - "outputs": [], - "source": [ - "def _get_top_tasks(vectorstore, query: str, k: int) -> List[str]:\n", - " \"\"\"Get the top k tasks based on the query.\"\"\"\n", - " results = vectorstore.similarity_search_with_score(query, k=k)\n", - " if not results:\n", - " return []\n", - " sorted_results, _ = zip(*sorted(results, key=lambda x: x[1], reverse=True))\n", - " return [str(item.metadata[\"task\"]) for item in sorted_results]\n", - "\n", - "\n", - "def execute_task(\n", - " vectorstore, execution_chain: LLMChain, objective: str, task: str, k: int = 5\n", - ") -> str:\n", - " \"\"\"Execute a task.\"\"\"\n", - " context = _get_top_tasks(vectorstore, query=objective, k=k)\n", - " return execution_chain.run(objective=objective, context=context, task=task)" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "id": "1e978938", - "metadata": {}, - "outputs": [], - "source": [ - "class BabyAGI(Chain, BaseModel):\n", - " \"\"\"Controller model for the BabyAGI agent.\"\"\"\n", - "\n", - " task_list: deque = Field(default_factory=deque)\n", - " task_creation_chain: TaskCreationChain = Field(...)\n", - " task_prioritization_chain: TaskPrioritizationChain = Field(...)\n", - " execution_chain: ExecutionChain = Field(...)\n", - " task_id_counter: int = Field(1)\n", - " vectorstore: VectorStore = Field(init=False)\n", - " max_iterations: Optional[int] = None\n", - "\n", - " class Config:\n", - " \"\"\"Configuration for this pydantic object.\"\"\"\n", - "\n", - " arbitrary_types_allowed = True\n", - "\n", - " def add_task(self, task: Dict):\n", - " self.task_list.append(task)\n", - "\n", - " def print_task_list(self):\n", - " print(\"\\033[95m\\033[1m\" + \"\\n*****TASK LIST*****\\n\" + \"\\033[0m\\033[0m\")\n", - " for t in self.task_list:\n", - " print(str(t[\"task_id\"]) + \": \" + t[\"task_name\"])\n", - "\n", - " def print_next_task(self, task: Dict):\n", - " print(\"\\033[92m\\033[1m\" + \"\\n*****NEXT TASK*****\\n\" + \"\\033[0m\\033[0m\")\n", - " print(str(task[\"task_id\"]) + \": \" + task[\"task_name\"])\n", - "\n", - " def print_task_result(self, result: str):\n", - " print(\"\\033[93m\\033[1m\" + \"\\n*****TASK RESULT*****\\n\" + \"\\033[0m\\033[0m\")\n", - " print(result)\n", - "\n", - " @property\n", - " def input_keys(self) -> List[str]:\n", - " return [\"objective\"]\n", - "\n", - " @property\n", - " def output_keys(self) -> List[str]:\n", - " return []\n", - "\n", - " def _call(self, inputs: Dict[str, Any]) -> Dict[str, Any]:\n", - " \"\"\"Run the agent.\"\"\"\n", - " objective = inputs[\"objective\"]\n", - " first_task = inputs.get(\"first_task\", \"Make a todo list\")\n", - " self.add_task({\"task_id\": 1, \"task_name\": first_task})\n", - " num_iters = 0\n", - " while True:\n", - " if self.task_list:\n", - " self.print_task_list()\n", - "\n", - " # Step 1: Pull the first task\n", - " task = self.task_list.popleft()\n", - " self.print_next_task(task)\n", - "\n", - " # Step 2: Execute the task\n", - " result = execute_task(\n", - " self.vectorstore, self.execution_chain, objective, task[\"task_name\"]\n", - " )\n", - " this_task_id = int(task[\"task_id\"])\n", - " self.print_task_result(result)\n", - "\n", - " # Step 3: Store the result in Pinecone\n", - " result_id = f\"result_{task['task_id']}_{num_iters}\"\n", - " self.vectorstore.add_texts(\n", - " texts=[result],\n", - " metadatas=[{\"task\": task[\"task_name\"]}],\n", - " ids=[result_id],\n", - " )\n", - "\n", - " # Step 4: Create new tasks and reprioritize task list\n", - " new_tasks = get_next_task(\n", - " self.task_creation_chain,\n", - " result,\n", - " task[\"task_name\"],\n", - " [t[\"task_name\"] for t in self.task_list],\n", - " objective,\n", - " )\n", - " for new_task in new_tasks:\n", - " self.task_id_counter += 1\n", - " new_task.update({\"task_id\": self.task_id_counter})\n", - " self.add_task(new_task)\n", - " self.task_list = deque(\n", - " prioritize_tasks(\n", - " self.task_prioritization_chain,\n", - " this_task_id,\n", - " list(self.task_list),\n", - " objective,\n", - " )\n", - " )\n", - " num_iters += 1\n", - " if self.max_iterations is not None and num_iters == self.max_iterations:\n", - " print(\n", - " \"\\033[91m\\033[1m\" + \"\\n*****TASK ENDING*****\\n\" + \"\\033[0m\\033[0m\"\n", - " )\n", - " break\n", - " return {}\n", - "\n", - " @classmethod\n", - " def from_llm(\n", - " cls, llm: BaseLLM, vectorstore: VectorStore, verbose: bool = False, **kwargs\n", - " ) -> \"BabyAGI\":\n", - " \"\"\"Initialize the BabyAGI Controller.\"\"\"\n", - " task_creation_chain = TaskCreationChain.from_llm(llm, verbose=verbose)\n", - " task_prioritization_chain = TaskPrioritizationChain.from_llm(\n", - " llm, verbose=verbose\n", - " )\n", - " execution_chain = ExecutionChain.from_llm(llm, verbose=verbose)\n", - " return cls(\n", - " task_creation_chain=task_creation_chain,\n", - " task_prioritization_chain=task_prioritization_chain,\n", - " execution_chain=execution_chain,\n", - " vectorstore=vectorstore,\n", - " **kwargs,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "05ba762e", - "metadata": {}, - "source": [ - "### Run the BabyAGI\n", - "\n", - "Now it's time to create the BabyAGI controller and watch it try to accomplish your objective." - ] - }, - { - "cell_type": "code", - "execution_count": 138, - "id": "3d220b69", - "metadata": {}, - "outputs": [], - "source": [ - "OBJECTIVE = \"Write a weather report for SF today\"" - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "id": "8a8e5543", - "metadata": {}, - "outputs": [], - "source": [ - "llm = OpenAI(temperature=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 140, - "id": "3d69899b", - "metadata": {}, - "outputs": [], - "source": [ - "# Logging of LLMChains\n", - "verbose = False\n", - "# If None, will keep on going forever\n", - "max_iterations: Optional[int] = 3\n", - "baby_agi = BabyAGI.from_llm(\n", - " llm=llm, vectorstore=vectorstore, verbose=verbose, max_iterations=max_iterations\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "id": "f7957b51", - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[95m\u001b[1m\n", - "*****TASK LIST*****\n", - "\u001b[0m\u001b[0m\n", - "1: Make a todo list\n", - "\u001b[92m\u001b[1m\n", - "*****NEXT TASK*****\n", - "\u001b[0m\u001b[0m\n", - "1: Make a todo list\n", - "\u001b[93m\u001b[1m\n", - "*****TASK RESULT*****\n", - "\u001b[0m\u001b[0m\n", - "\n", - "\n", - "1. Check the temperature range for the day.\n", - "2. Gather temperature data for SF today.\n", - "3. Analyze the temperature data and create a weather report.\n", - "4. Publish the weather report.\n", - "\u001b[95m\u001b[1m\n", - "*****TASK LIST*****\n", - "\u001b[0m\u001b[0m\n", - "2: Gather data on the expected temperature range for the day.\n", - "3: Collect data on the expected precipitation for the day.\n", - "4: Analyze the data and create a weather report.\n", - "5: Check the current weather conditions in SF.\n", - "6: Publish the weather report.\n", - "\u001b[92m\u001b[1m\n", - "*****NEXT TASK*****\n", - "\u001b[0m\u001b[0m\n", - "2: Gather data on the expected temperature range for the day.\n", - "\u001b[93m\u001b[1m\n", - "*****TASK RESULT*****\n", - "\u001b[0m\u001b[0m\n", - "\n", - "\n", - "I have gathered data on the expected temperature range for the day in San Francisco. The forecast is for temperatures to range from a low of 55 degrees Fahrenheit to a high of 68 degrees Fahrenheit.\n", - "\u001b[95m\u001b[1m\n", - "*****TASK LIST*****\n", - "\u001b[0m\u001b[0m\n", - "3: Check the current weather conditions in SF.\n", - "4: Calculate the average temperature for the day in San Francisco.\n", - "5: Determine the probability of precipitation for the day in San Francisco.\n", - "6: Identify any potential weather warnings or advisories for the day in San Francisco.\n", - "7: Research any historical weather patterns for the day in San Francisco.\n", - "8: Compare the expected temperature range to the historical average for the day in San Francisco.\n", - "9: Collect data on the expected precipitation for the day.\n", - "10: Analyze the data and create a weather report.\n", - "11: Publish the weather report.\n", - "\u001b[92m\u001b[1m\n", - "*****NEXT TASK*****\n", - "\u001b[0m\u001b[0m\n", - "3: Check the current weather conditions in SF.\n", - "\u001b[93m\u001b[1m\n", - "*****TASK RESULT*****\n", - "\u001b[0m\u001b[0m\n", - "\n", - "\n", - "I am checking the current weather conditions in SF. According to the data I have gathered, the temperature in SF today is currently around 65 degrees Fahrenheit with clear skies. The temperature range for the day is expected to be between 60 and 70 degrees Fahrenheit.\n", - "\u001b[91m\u001b[1m\n", - "*****TASK ENDING*****\n", - "\u001b[0m\u001b[0m\n" - ] - }, - { - "data": { - "text/plain": [ - "{'objective': 'Write a weather report for SF today'}" - ] - }, - "execution_count": 141, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "baby_agi({\"objective\": OBJECTIVE})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "898a210b", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "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.9.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/extras/use_cases/agents/baby_agi_with_agent.ipynb b/docs/extras/use_cases/agents/baby_agi_with_agent.ipynb deleted file mode 100644 index 7f492b510..000000000 --- a/docs/extras/use_cases/agents/baby_agi_with_agent.ipynb +++ /dev/null @@ -1,647 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "517a9fd4", - "metadata": {}, - "source": [ - "# BabyAGI with Tools\n", - "\n", - "This notebook builds on top of [baby agi](baby_agi.html), but shows how you can swap out the execution chain. The previous execution chain was just an LLM which made stuff up. By swapping it out with an agent that has access to tools, we can hopefully get real reliable information" - ] - }, - { - "cell_type": "markdown", - "id": "556af556", - "metadata": {}, - "source": [ - "## Install and Import Required Modules" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c8a354b6", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from collections import deque\n", - "from typing import Dict, List, Optional, Any\n", - "\n", - "from langchain import LLMChain, OpenAI, PromptTemplate\n", - "from langchain.embeddings import OpenAIEmbeddings\n", - "from langchain.llms import BaseLLM\n", - "from langchain.vectorstores.base import VectorStore\n", - "from pydantic import BaseModel, Field\n", - "from langchain.chains.base import Chain" - ] - }, - { - "cell_type": "markdown", - "id": "09f70772", - "metadata": {}, - "source": [ - "## Connect to the Vector Store\n", - "\n", - "Depending on what vectorstore you use, this step may look different." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "794045d4", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install faiss-cpu > /dev/null\n", - "%pip install google-search-results > /dev/null\n", - "from langchain.vectorstores import FAISS\n", - "from langchain.docstore import InMemoryDocstore" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "6e0305eb", - "metadata": {}, - "outputs": [], - "source": [ - "# Define your embedding model\n", - "embeddings_model = OpenAIEmbeddings()\n", - "# Initialize the vectorstore as empty\n", - "import faiss\n", - "\n", - "embedding_size = 1536\n", - "index = faiss.IndexFlatL2(embedding_size)\n", - "vectorstore = FAISS(embeddings_model.embed_query, index, InMemoryDocstore({}), {})" - ] - }, - { - "cell_type": "markdown", - "id": "0f3b72bf", - "metadata": {}, - "source": [ - "## Define the Chains\n", - "\n", - "BabyAGI relies on three LLM chains:\n", - "- Task creation chain to select new tasks to add to the list\n", - "- Task prioritization chain to re-prioritize tasks\n", - "- Execution Chain to execute the tasks\n", - "\n", - "\n", - "NOTE: in this notebook, the Execution chain will now be an agent." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "bf4bd5cd", - "metadata": {}, - "outputs": [], - "source": [ - "class TaskCreationChain(LLMChain):\n", - " \"\"\"Chain to generates tasks.\"\"\"\n", - "\n", - " @classmethod\n", - " def from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:\n", - " \"\"\"Get the response parser.\"\"\"\n", - " task_creation_template = (\n", - " \"You are an task creation AI that uses the result of an execution agent\"\n", - " \" to create new tasks with the following objective: {objective},\"\n", - " \" The last completed task has the result: {result}.\"\n", - " \" This result was based on this task description: {task_description}.\"\n", - " \" These are incomplete tasks: {incomplete_tasks}.\"\n", - " \" Based on the result, create new tasks to be completed\"\n", - " \" by the AI system that do not overlap with incomplete tasks.\"\n", - " \" Return the tasks as an array.\"\n", - " )\n", - " prompt = PromptTemplate(\n", - " template=task_creation_template,\n", - " input_variables=[\n", - " \"result\",\n", - " \"task_description\",\n", - " \"incomplete_tasks\",\n", - " \"objective\",\n", - " ],\n", - " )\n", - " return cls(prompt=prompt, llm=llm, verbose=verbose)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "b6488ffe", - "metadata": {}, - "outputs": [], - "source": [ - "class TaskPrioritizationChain(LLMChain):\n", - " \"\"\"Chain to prioritize tasks.\"\"\"\n", - "\n", - " @classmethod\n", - " def from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:\n", - " \"\"\"Get the response parser.\"\"\"\n", - " task_prioritization_template = (\n", - " \"You are an task prioritization AI tasked with cleaning the formatting of and reprioritizing\"\n", - " \" the following tasks: {task_names}.\"\n", - " \" Consider the ultimate objective of your team: {objective}.\"\n", - " \" Do not remove any tasks. Return the result as a numbered list, like:\"\n", - " \" #. First task\"\n", - " \" #. Second task\"\n", - " \" Start the task list with number {next_task_id}.\"\n", - " )\n", - " prompt = PromptTemplate(\n", - " template=task_prioritization_template,\n", - " input_variables=[\"task_names\", \"next_task_id\", \"objective\"],\n", - " )\n", - " return cls(prompt=prompt, llm=llm, verbose=verbose)" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "b43cd580", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.agents import ZeroShotAgent, Tool, AgentExecutor\n", - "from langchain import OpenAI, SerpAPIWrapper, LLMChain\n", - "\n", - "todo_prompt = PromptTemplate.from_template(\n", - " \"You are a planner who is an expert at coming up with a todo list for a given objective. Come up with a todo list for this objective: {objective}\"\n", - ")\n", - "todo_chain = LLMChain(llm=OpenAI(temperature=0), prompt=todo_prompt)\n", - "search = SerpAPIWrapper()\n", - "tools = [\n", - " Tool(\n", - " name=\"Search\",\n", - " func=search.run,\n", - " description=\"useful for when you need to answer questions about current events\",\n", - " ),\n", - " Tool(\n", - " name=\"TODO\",\n", - " func=todo_chain.run,\n", - " description=\"useful for when you need to come up with todo lists. Input: an objective to create a todo list for. Output: a todo list for that objective. Please be very clear what the objective is!\",\n", - " ),\n", - "]\n", - "\n", - "\n", - "prefix = \"\"\"You are an AI who performs one task based on the following objective: {objective}. Take into account these previously completed tasks: {context}.\"\"\"\n", - "suffix = \"\"\"Question: {task}\n", - "{agent_scratchpad}\"\"\"\n", - "prompt = ZeroShotAgent.create_prompt(\n", - " tools,\n", - " prefix=prefix,\n", - " suffix=suffix,\n", - " input_variables=[\"objective\", \"task\", \"context\", \"agent_scratchpad\"],\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "3ad996c5", - "metadata": {}, - "source": [ - "### Define the BabyAGI Controller\n", - "\n", - "BabyAGI composes the chains defined above in a (potentially-)infinite loop." - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "0ada0636", - "metadata": {}, - "outputs": [], - "source": [ - "def get_next_task(\n", - " task_creation_chain: LLMChain,\n", - " result: Dict,\n", - " task_description: str,\n", - " task_list: List[str],\n", - " objective: str,\n", - ") -> List[Dict]:\n", - " \"\"\"Get the next task.\"\"\"\n", - " incomplete_tasks = \", \".join(task_list)\n", - " response = task_creation_chain.run(\n", - " result=result,\n", - " task_description=task_description,\n", - " incomplete_tasks=incomplete_tasks,\n", - " objective=objective,\n", - " )\n", - " new_tasks = response.split(\"\\n\")\n", - " return [{\"task_name\": task_name} for task_name in new_tasks if task_name.strip()]" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "d35250ad", - "metadata": {}, - "outputs": [], - "source": [ - "def prioritize_tasks(\n", - " task_prioritization_chain: LLMChain,\n", - " this_task_id: int,\n", - " task_list: List[Dict],\n", - " objective: str,\n", - ") -> List[Dict]:\n", - " \"\"\"Prioritize tasks.\"\"\"\n", - " task_names = [t[\"task_name\"] for t in task_list]\n", - " next_task_id = int(this_task_id) + 1\n", - " response = task_prioritization_chain.run(\n", - " task_names=task_names, next_task_id=next_task_id, objective=objective\n", - " )\n", - " new_tasks = response.split(\"\\n\")\n", - " prioritized_task_list = []\n", - " for task_string in new_tasks:\n", - " if not task_string.strip():\n", - " continue\n", - " task_parts = task_string.strip().split(\".\", 1)\n", - " if len(task_parts) == 2:\n", - " task_id = task_parts[0].strip()\n", - " task_name = task_parts[1].strip()\n", - " prioritized_task_list.append({\"task_id\": task_id, \"task_name\": task_name})\n", - " return prioritized_task_list" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "e3f1840c", - "metadata": {}, - "outputs": [], - "source": [ - "def _get_top_tasks(vectorstore, query: str, k: int) -> List[str]:\n", - " \"\"\"Get the top k tasks based on the query.\"\"\"\n", - " results = vectorstore.similarity_search_with_score(query, k=k)\n", - " if not results:\n", - " return []\n", - " sorted_results, _ = zip(*sorted(results, key=lambda x: x[1], reverse=True))\n", - " return [str(item.metadata[\"task\"]) for item in sorted_results]\n", - "\n", - "\n", - "def execute_task(\n", - " vectorstore, execution_chain: LLMChain, objective: str, task: str, k: int = 5\n", - ") -> str:\n", - " \"\"\"Execute a task.\"\"\"\n", - " context = _get_top_tasks(vectorstore, query=objective, k=k)\n", - " return execution_chain.run(objective=objective, context=context, task=task)" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "1e978938", - "metadata": {}, - "outputs": [], - "source": [ - "class BabyAGI(Chain, BaseModel):\n", - " \"\"\"Controller model for the BabyAGI agent.\"\"\"\n", - "\n", - " task_list: deque = Field(default_factory=deque)\n", - " task_creation_chain: TaskCreationChain = Field(...)\n", - " task_prioritization_chain: TaskPrioritizationChain = Field(...)\n", - " execution_chain: AgentExecutor = Field(...)\n", - " task_id_counter: int = Field(1)\n", - " vectorstore: VectorStore = Field(init=False)\n", - " max_iterations: Optional[int] = None\n", - "\n", - " class Config:\n", - " \"\"\"Configuration for this pydantic object.\"\"\"\n", - "\n", - " arbitrary_types_allowed = True\n", - "\n", - " def add_task(self, task: Dict):\n", - " self.task_list.append(task)\n", - "\n", - " def print_task_list(self):\n", - " print(\"\\033[95m\\033[1m\" + \"\\n*****TASK LIST*****\\n\" + \"\\033[0m\\033[0m\")\n", - " for t in self.task_list:\n", - " print(str(t[\"task_id\"]) + \": \" + t[\"task_name\"])\n", - "\n", - " def print_next_task(self, task: Dict):\n", - " print(\"\\033[92m\\033[1m\" + \"\\n*****NEXT TASK*****\\n\" + \"\\033[0m\\033[0m\")\n", - " print(str(task[\"task_id\"]) + \": \" + task[\"task_name\"])\n", - "\n", - " def print_task_result(self, result: str):\n", - " print(\"\\033[93m\\033[1m\" + \"\\n*****TASK RESULT*****\\n\" + \"\\033[0m\\033[0m\")\n", - " print(result)\n", - "\n", - " @property\n", - " def input_keys(self) -> List[str]:\n", - " return [\"objective\"]\n", - "\n", - " @property\n", - " def output_keys(self) -> List[str]:\n", - " return []\n", - "\n", - " def _call(self, inputs: Dict[str, Any]) -> Dict[str, Any]:\n", - " \"\"\"Run the agent.\"\"\"\n", - " objective = inputs[\"objective\"]\n", - " first_task = inputs.get(\"first_task\", \"Make a todo list\")\n", - " self.add_task({\"task_id\": 1, \"task_name\": first_task})\n", - " num_iters = 0\n", - " while True:\n", - " if self.task_list:\n", - " self.print_task_list()\n", - "\n", - " # Step 1: Pull the first task\n", - " task = self.task_list.popleft()\n", - " self.print_next_task(task)\n", - "\n", - " # Step 2: Execute the task\n", - " result = execute_task(\n", - " self.vectorstore, self.execution_chain, objective, task[\"task_name\"]\n", - " )\n", - " this_task_id = int(task[\"task_id\"])\n", - " self.print_task_result(result)\n", - "\n", - " # Step 3: Store the result in Pinecone\n", - " result_id = f\"result_{task['task_id']}_{num_iters}\"\n", - " self.vectorstore.add_texts(\n", - " texts=[result],\n", - " metadatas=[{\"task\": task[\"task_name\"]}],\n", - " ids=[result_id],\n", - " )\n", - "\n", - " # Step 4: Create new tasks and reprioritize task list\n", - " new_tasks = get_next_task(\n", - " self.task_creation_chain,\n", - " result,\n", - " task[\"task_name\"],\n", - " [t[\"task_name\"] for t in self.task_list],\n", - " objective,\n", - " )\n", - " for new_task in new_tasks:\n", - " self.task_id_counter += 1\n", - " new_task.update({\"task_id\": self.task_id_counter})\n", - " self.add_task(new_task)\n", - " self.task_list = deque(\n", - " prioritize_tasks(\n", - " self.task_prioritization_chain,\n", - " this_task_id,\n", - " list(self.task_list),\n", - " objective,\n", - " )\n", - " )\n", - " num_iters += 1\n", - " if self.max_iterations is not None and num_iters == self.max_iterations:\n", - " print(\n", - " \"\\033[91m\\033[1m\" + \"\\n*****TASK ENDING*****\\n\" + \"\\033[0m\\033[0m\"\n", - " )\n", - " break\n", - " return {}\n", - "\n", - " @classmethod\n", - " def from_llm(\n", - " cls, llm: BaseLLM, vectorstore: VectorStore, verbose: bool = False, **kwargs\n", - " ) -> \"BabyAGI\":\n", - " \"\"\"Initialize the BabyAGI Controller.\"\"\"\n", - " task_creation_chain = TaskCreationChain.from_llm(llm, verbose=verbose)\n", - " task_prioritization_chain = TaskPrioritizationChain.from_llm(\n", - " llm, verbose=verbose\n", - " )\n", - " llm_chain = LLMChain(llm=llm, prompt=prompt)\n", - " tool_names = [tool.name for tool in tools]\n", - " agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names)\n", - " agent_executor = AgentExecutor.from_agent_and_tools(\n", - " agent=agent, tools=tools, verbose=True\n", - " )\n", - " return cls(\n", - " task_creation_chain=task_creation_chain,\n", - " task_prioritization_chain=task_prioritization_chain,\n", - " execution_chain=agent_executor,\n", - " vectorstore=vectorstore,\n", - " **kwargs,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "05ba762e", - "metadata": {}, - "source": [ - "### Run the BabyAGI\n", - "\n", - "Now it's time to create the BabyAGI controller and watch it try to accomplish your objective." - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "3d220b69", - "metadata": {}, - "outputs": [], - "source": [ - "OBJECTIVE = \"Write a weather report for SF today\"" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "8a8e5543", - "metadata": {}, - "outputs": [], - "source": [ - "llm = OpenAI(temperature=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "3d69899b", - "metadata": {}, - "outputs": [], - "source": [ - "# Logging of LLMChains\n", - "verbose = False\n", - "# If None, will keep on going forever\n", - "max_iterations: Optional[int] = 3\n", - "baby_agi = BabyAGI.from_llm(\n", - " llm=llm, vectorstore=vectorstore, verbose=verbose, max_iterations=max_iterations\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "f7957b51", - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[95m\u001b[1m\n", - "*****TASK LIST*****\n", - "\u001b[0m\u001b[0m\n", - "1: Make a todo list\n", - "\u001b[92m\u001b[1m\n", - "*****NEXT TASK*****\n", - "\u001b[0m\u001b[0m\n", - "1: Make a todo list\n", - "\n", - "\n", - "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", - "\u001b[32;1m\u001b[1;3mThought: I need to gather data on the current weather conditions in SF\n", - "Action: Search\n", - "Action Input: Current weather conditions in SF\u001b[0m\n", - "Observation: \u001b[36;1m\u001b[1;3mHigh 67F. Winds WNW at 10 to 15 mph. Clear to partly cloudy.\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3m I need to make a todo list\n", - "Action: TODO\n", - "Action Input: Write a weather report for SF today\u001b[0m\n", - "Observation: \u001b[33;1m\u001b[1;3m\n", - "\n", - "1. Research current weather conditions in San Francisco\n", - "2. Gather data on temperature, humidity, wind speed, and other relevant weather conditions\n", - "3. Analyze data to determine current weather trends\n", - "4. Write a brief introduction to the weather report\n", - "5. Describe current weather conditions in San Francisco\n", - "6. Discuss any upcoming weather changes\n", - "7. Summarize the weather report\n", - "8. Proofread and edit the report\n", - "9. Submit the report\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", - "Final Answer: A weather report for SF today should include research on current weather conditions in San Francisco, gathering data on temperature, humidity, wind speed, and other relevant weather conditions, analyzing data to determine current weather trends, writing a brief introduction to the weather report, describing current weather conditions in San Francisco, discussing any upcoming weather changes, summarizing the weather report, proofreading and editing the report, and submitting the report.\u001b[0m\n", - "\n", - "\u001b[1m> Finished chain.\u001b[0m\n", - "\u001b[93m\u001b[1m\n", - "*****TASK RESULT*****\n", - "\u001b[0m\u001b[0m\n", - "A weather report for SF today should include research on current weather conditions in San Francisco, gathering data on temperature, humidity, wind speed, and other relevant weather conditions, analyzing data to determine current weather trends, writing a brief introduction to the weather report, describing current weather conditions in San Francisco, discussing any upcoming weather changes, summarizing the weather report, proofreading and editing the report, and submitting the report.\n", - "\u001b[95m\u001b[1m\n", - "*****TASK LIST*****\n", - "\u001b[0m\u001b[0m\n", - "2: Gather data on temperature, humidity, wind speed, and other relevant weather conditions\n", - "3: Analyze data to determine current weather trends\n", - "4: Write a brief introduction to the weather report\n", - "5: Describe current weather conditions in San Francisco\n", - "6: Discuss any upcoming weather changes\n", - "7: Summarize the weather report\n", - "8: Proofread and edit the report\n", - "9: Submit the report\n", - "1: Research current weather conditions in San Francisco\n", - "\u001b[92m\u001b[1m\n", - "*****NEXT TASK*****\n", - "\u001b[0m\u001b[0m\n", - "2: Gather data on temperature, humidity, wind speed, and other relevant weather conditions\n", - "\n", - "\n", - "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", - "\u001b[32;1m\u001b[1;3mThought: I need to search for the current weather conditions in SF\n", - "Action: Search\n", - "Action Input: Current weather conditions in SF\u001b[0m\n", - "Observation: \u001b[36;1m\u001b[1;3mHigh 67F. Winds WNW at 10 to 15 mph. Clear to partly cloudy.\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3m I need to make a todo list\n", - "Action: TODO\n", - "Action Input: Create a weather report for SF today\u001b[0m\n", - "Observation: \u001b[33;1m\u001b[1;3m\n", - "\n", - "1. Gather current weather data for SF, including temperature, wind speed, humidity, and precipitation.\n", - "2. Research historical weather data for SF to compare current conditions.\n", - "3. Analyze current and historical data to determine any trends or patterns.\n", - "4. Create a visual representation of the data, such as a graph or chart.\n", - "5. Write a summary of the weather report, including key findings and any relevant information.\n", - "6. Publish the weather report on a website or other platform.\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", - "Final Answer: Today in San Francisco, the temperature is 67F with winds WNW at 10 to 15 mph. The sky is clear to partly cloudy.\u001b[0m\n", - "\n", - "\u001b[1m> Finished chain.\u001b[0m\n", - "\u001b[93m\u001b[1m\n", - "*****TASK RESULT*****\n", - "\u001b[0m\u001b[0m\n", - "Today in San Francisco, the temperature is 67F with winds WNW at 10 to 15 mph. The sky is clear to partly cloudy.\n", - "\u001b[95m\u001b[1m\n", - "*****TASK LIST*****\n", - "\u001b[0m\u001b[0m\n", - "3: Research current weather conditions in San Francisco\n", - "4: Compare the current weather conditions in San Francisco to the average for this time of year.\n", - "5: Identify any potential weather-related hazards in the area.\n", - "6: Research any historical weather patterns in San Francisco.\n", - "7: Analyze data to determine current weather trends\n", - "8: Include any relevant data from nearby cities in the report.\n", - "9: Include any relevant data from the National Weather Service in the report.\n", - "10: Include any relevant data from local news sources in the report.\n", - "11: Include any relevant data from online weather sources in the report.\n", - "12: Include any relevant data from local meteorologists in the report.\n", - "13: Include any relevant data from local weather stations in the report.\n", - "14: Include any relevant data from satellite images in the report.\n", - "15: Describe current weather conditions in San Francisco\n", - "16: Discuss any upcoming weather changes\n", - "17: Write a brief introduction to the weather report\n", - "18: Summarize the weather report\n", - "19: Proofread and edit the report\n", - "20: Submit the report\n", - "\u001b[92m\u001b[1m\n", - "*****NEXT TASK*****\n", - "\u001b[0m\u001b[0m\n", - "3: Research current weather conditions in San Francisco\n", - "\n", - "\n", - "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", - "\u001b[32;1m\u001b[1;3mThought: I need to search for current weather conditions in San Francisco\n", - "Action: Search\n", - "Action Input: Current weather conditions in San Francisco\u001b[0m\n", - "Observation: \u001b[36;1m\u001b[1;3mTodaySun 04/09 High 67 · 1% Precip. ; TonightSun 04/09 Low 49 · 9% Precip. ; TomorrowMon 04/10 High 64 · 11% Precip.\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", - "Final Answer: Today in San Francisco, the high temperature is 67 degrees with 1% chance of precipitation. The low temperature tonight is 49 degrees with 9% chance of precipitation. Tomorrow's high temperature is 64 degrees with 11% chance of precipitation.\u001b[0m\n", - "\n", - "\u001b[1m> Finished chain.\u001b[0m\n", - "\u001b[93m\u001b[1m\n", - "*****TASK RESULT*****\n", - "\u001b[0m\u001b[0m\n", - "Today in San Francisco, the high temperature is 67 degrees with 1% chance of precipitation. The low temperature tonight is 49 degrees with 9% chance of precipitation. Tomorrow's high temperature is 64 degrees with 11% chance of precipitation.\n", - "\u001b[91m\u001b[1m\n", - "*****TASK ENDING*****\n", - "\u001b[0m\u001b[0m\n" - ] - }, - { - "data": { - "text/plain": [ - "{'objective': 'Write a weather report for SF today'}" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "baby_agi({\"objective\": OBJECTIVE})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "898a210b", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "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.9.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/extras/use_cases/agent_simulations/camel_role_playing.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/camel_role_playing.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/camel_role_playing.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/camel_role_playing.ipynb diff --git a/docs/extras/use_cases/agent_simulations/characters.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/characters.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/characters.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/characters.ipynb diff --git a/docs/extras/use_cases/agent_simulations/gymnasium.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/gymnasium.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/gymnasium.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/gymnasium.ipynb diff --git a/docs/extras/use_cases/agent_simulations/index.mdx b/docs/extras/use_cases/more/agents/agent_simulations/index.mdx similarity index 100% rename from docs/extras/use_cases/agent_simulations/index.mdx rename to docs/extras/use_cases/more/agents/agent_simulations/index.mdx diff --git a/docs/extras/use_cases/agent_simulations/multi_player_dnd.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/multi_player_dnd.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/multi_player_dnd.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/multi_player_dnd.ipynb diff --git a/docs/extras/use_cases/agent_simulations/multiagent_authoritarian.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/multiagent_authoritarian.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/multiagent_authoritarian.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/multiagent_authoritarian.ipynb diff --git a/docs/extras/use_cases/agent_simulations/multiagent_bidding.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/multiagent_bidding.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/multiagent_bidding.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/multiagent_bidding.ipynb diff --git a/docs/extras/use_cases/agent_simulations/petting_zoo.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/petting_zoo.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/petting_zoo.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/petting_zoo.ipynb diff --git a/docs/extras/use_cases/agent_simulations/two_agent_debate_tools.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/two_agent_debate_tools.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/two_agent_debate_tools.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/two_agent_debate_tools.ipynb diff --git a/docs/extras/use_cases/agent_simulations/two_player_dnd.ipynb b/docs/extras/use_cases/more/agents/agent_simulations/two_player_dnd.ipynb similarity index 100% rename from docs/extras/use_cases/agent_simulations/two_player_dnd.ipynb rename to docs/extras/use_cases/more/agents/agent_simulations/two_player_dnd.ipynb diff --git a/docs/extras/use_cases/more/agents/agents.ipynb b/docs/extras/use_cases/more/agents/agents.ipynb new file mode 100644 index 000000000..e3b187d0e --- /dev/null +++ b/docs/extras/use_cases/more/agents/agents.ipynb @@ -0,0 +1,718 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "842dd272", + "metadata": {}, + "source": [ + "# Agents\n", + "\n", + "[![Open In Collab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/extras/use_cases/more/agents/agents.ipynb)\n", + "\n", + "## Use case \n", + "\n", + "LLM-based agents are powerful general problem solvers.\n", + "\n", + "The [primary LLM agent components](https://lilianweng.github.io/posts/2023-06-23-agent/) include at least 3 things:\n", + "\n", + "* `Planning`: The ability to break down tasks into smaller sub-goals\n", + "* `Memory`: The ability to retain and recall information\n", + "* `Tools`: The ability to get information from external sources (e.g., APIs)\n", + "\n", + "Unlike LLMs simply connected to [APIs](/docs/use_cases/apis/apis), agents [can](https://www.youtube.com/watch?v=DWUdGhRrv2c):\n", + "\n", + "* Self-correct\n", + "* Handle multi-hop tasks (several intermediate \"hops\" or steps to arrive at a conclusion)\n", + "* Tackle long time horizon tasks (that require access to long-term memory)\n", + "\n", + "![Image description](/img/agents_use_case_1.png)\n", + "\n", + "## Overview \n", + "\n", + "LangChain has [many agent types](/docs/modules/agents/agent_types/).\n", + "\n", + "Nearly all agents will use the following components:\n", + " \n", + "**Planning**\n", + " \n", + "* `Prompt`: Can given the LLM [personality](https://arxiv.org/pdf/2304.03442.pdf), context (e.g, via retrieval from memory), or strategies for learninng (e.g., [chain-of-thought](https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/#chain-of-thought-cot)).\n", + "* `Agent` Responsible for deciding what step to take next using an LLM with the `Prompt`\n", + "\n", + "**Memory**\n", + "\n", + "* This can be short or long-term, allowing the agent to persist information.\n", + "\n", + "**Tools**\n", + "\n", + "* Tools are functions that an agent can call.\n", + "\n", + "But, there are some taxonomic differences:\n", + "\n", + "* `Action agents`: Designed to decide the sequence of actions (tool use) (e.g., OpenAI functions agents, ReAct agents).\n", + "* `Simulation agents`: Designed for role-play often in simulated enviorment (e.g., Generative Agents, CAMEL).\n", + "* `Autonomous agents`: Designed for indepdent execution towards long term goals (e.g., BabyAGI, Auto-GPT).\n", + "\n", + "This will focus on `Action agents`.\n", + "\n", + "\n", + "## Quickstart " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a704c7a", + "metadata": {}, + "outputs": [], + "source": [ + "! pip install langchain openai google-search-results\n", + "\n", + "# Set env var OPENAI_API_KEY and SERPAPI_API_KEY or load from a .env file\n", + "# import dotenv\n", + "\n", + "# dotenv.load_env()" + ] + }, + { + "cell_type": "markdown", + "id": "639d41ad", + "metadata": {}, + "source": [ + "`Tools`\n", + "\n", + "LangChain has [many tools](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/agents/load_tools.py) for Agents that we can load easily.\n", + "\n", + "Let's load search and a calcultor." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c60001c9", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool\n", + "from langchain.agents import load_tools\n", + "from langchain.chat_models import ChatOpenAI\n", + "llm = ChatOpenAI(temperature=0)\n", + "tools = load_tools([\"serpapi\", \"llm-math\"], llm=llm)" + ] + }, + { + "cell_type": "markdown", + "id": "431ba30b", + "metadata": {}, + "source": [ + "`Agent`\n", + "\n", + "The [`OPENAI_FUNCTIONS` agent](/docs/modules/agents/agent_types/openai_functions_agent) is a good action agent to start with.\n", + "\n", + "OpenAI models have been fine-tuned to recognize when function should be called." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d636395f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'As of 2023, the estimated population of Canada is approximately 39,858,480 people.'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Prompt\n", + "from langchain.agents import AgentExecutor\n", + "from langchain.schema import SystemMessage\n", + "from langchain.agents import OpenAIFunctionsAgent\n", + "system_message = SystemMessage(content=\"You are a search assistant.\")\n", + "prompt = OpenAIFunctionsAgent.create_prompt(system_message=system_message)\n", + "\n", + "# Agent\n", + "search_agent = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=prompt)\n", + "agent_executor = AgentExecutor(agent=search_agent, tools=tools, verbose=False)\n", + "\n", + "# Run\n", + "agent_executor.run(\"How many people live in canada as of 2023?\")" + ] + }, + { + "cell_type": "markdown", + "id": "27842380", + "metadata": {}, + "source": [ + "Great, we have created a simple search agent with a tool!\n", + "\n", + "Note that we use an agent executor, which is the runtime for an agent. \n", + "\n", + "This is what calls the agent and executes the actions it chooses. \n", + "\n", + "Pseudocode for this runtime is below:\n", + "```\n", + "next_action = agent.get_action(...)\n", + "while next_action != AgentFinish:\n", + " observation = run(next_action)\n", + " next_action = agent.get_action(..., next_action, observation)\n", + "return next_action\n", + "```\n", + "\n", + "While this may seem simple, there are several complexities this runtime handles for you, including:\n", + "\n", + "* Handling cases where the agent selects a non-existent tool\n", + "* Handling cases where the tool errors\n", + "* Handling cases where the agent produces output that cannot be parsed into a tool invocation\n", + "* Logging and observability at all levels (agent decisions, tool calls) either to stdout or LangSmith.\n" + ] + }, + { + "cell_type": "markdown", + "id": "0b93c7d0", + "metadata": {}, + "source": [ + "## Memory \n", + "\n", + "### Short-term memory\n", + "\n", + "Of course, `memory` is needed to enable conversation / persistence of information.\n", + "\n", + "LangChain has many options for [short-term memory](/docs/modules/memory/types/), which are frequently used in [chat](/docs/modules/memory/adding_memory.html). \n", + "\n", + "They can be [employed with agents](/docs/modules/memory/agent_with_memory) too.\n", + "\n", + "`ConversationBufferMemory` is a popular choice for short-term memory.\n", + "\n", + "We set `MEMORY_KEY`, which can be referenced by the prompt later.\n", + "\n", + "Now, let's add memory to our agent." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1d291015", + "metadata": {}, + "outputs": [], + "source": [ + "# Memory \n", + "from langchain.memory import ConversationBufferMemory\n", + "MEMORY_KEY = \"chat_history\"\n", + "memory = ConversationBufferMemory(memory_key=MEMORY_KEY, return_messages=True)\n", + "\n", + "# Prompt w/ placeholder for memory\n", + "from langchain.schema import SystemMessage\n", + "from langchain.agents import OpenAIFunctionsAgent\n", + "from langchain.prompts import MessagesPlaceholder\n", + "system_message = SystemMessage(content=\"You are a search assistant tasked with using Serpapi to answer questions.\")\n", + "prompt = OpenAIFunctionsAgent.create_prompt(\n", + " system_message=system_message,\n", + " extra_prompt_messages=[MessagesPlaceholder(variable_name=MEMORY_KEY)]\n", + ")\n", + "\n", + "# Agent\n", + "search_agent_memory = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=prompt, memory=memory)\n", + "agent_executor_memory = AgentExecutor(agent=search_agent_memory, tools=tools, memory=memory, verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b4b2249a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'As of August 2023, the estimated population of Canada is approximately 38,781,291 people.'" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agent_executor_memory.run(\"How many people live in Canada as of August, 2023?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "4d31b0cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'As of August 2023, the largest province in Canada is Ontario, with a population of over 15 million people.'" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agent_executor_memory.run(\"What is the population of its largest provence as of August, 2023?\")" + ] + }, + { + "cell_type": "markdown", + "id": "3606c32a", + "metadata": {}, + "source": [ + "Looking at the [trace](https://smith.langchain.com/public/4425a131-ec90-4aaa-acd8-5b880c7452a3/r), we can what is happening:\n", + "\n", + "* The chat history is passed to the LLMs\n", + "* This gives context to `its` in `What is the population of its largest provence as of August, 2023?`\n", + "* The LLM generates a function call to the search tool\n", + "\n", + "```\n", + "function_call:\n", + " name: Search\n", + " arguments: |-\n", + " {\n", + " \"query\": \"population of largest province in Canada as of August 2023\"\n", + " }\n", + "```\n", + "\n", + "* The search is executed\n", + "* The results frum search are passed back to the LLM for synthesis into an answer\n", + "\n", + "![Image description](/img/oai_function_agent.png)" + ] + }, + { + "cell_type": "markdown", + "id": "384e37f8", + "metadata": {}, + "source": [ + "### Long-term memory \n", + "\n", + "Vectorstores are great options for long-term memory." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "1489746c", + "metadata": {}, + "outputs": [], + "source": [ + "import faiss\n", + "from langchain.vectorstores import FAISS\n", + "from langchain.docstore import InMemoryDocstore\n", + "from langchain.embeddings import OpenAIEmbeddings\n", + "embedding_size = 1536\n", + "embeddings_model = OpenAIEmbeddings()\n", + "index = faiss.IndexFlatL2(embedding_size)\n", + "vectorstore = FAISS(embeddings_model.embed_query, index, InMemoryDocstore({}), {})" + ] + }, + { + "cell_type": "markdown", + "id": "9668ef5d", + "metadata": {}, + "source": [ + "### Going deeper \n", + "\n", + "* Explore projects using long-term memory, such as [autonomous agents](/docs/use_cases/autonomous_agents/autonomous_agents)." + ] + }, + { + "cell_type": "markdown", + "id": "43fe2bb3", + "metadata": {}, + "source": [ + "## Tools \n", + "\n", + "As mentioned above, LangChain has [many tools](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/agents/load_tools.py) for Agents that we can load easily.\n", + "\n", + "We can also define [custom tools](/docs/modules/agents/tools/custom_tools). For example, here is a search tool.\n", + "\n", + "* The `Tool` dataclass wraps functions that accept a single string input and returns a string output.\n", + "* `return_direct` determines whether to return the tool's output directly. \n", + "* Setting this to `True` means that after the tool is called, the `AgentExecutor` will stop looping." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "7357e496", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.agents import Tool, tool\n", + "from langchain.utilities import GoogleSearchAPIWrapper\n", + "search = GoogleSearchAPIWrapper()\n", + "search_tool = [\n", + " Tool(\n", + " name=\"Search\",\n", + " func=search.run,\n", + " description=\"useful for when you need to answer questions about current events\",\n", + " return_direct=True,\n", + " )\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "c6ef5bfa", + "metadata": {}, + "source": [ + "To make it easier to define custom tools, a `@tool` decorator is provided. \n", + "\n", + "This decorator can be used to quickly create a Tool from a simple function." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "b6308c69", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool\n", + "@tool\n", + "def get_word_length(word: str) -> int:\n", + " \"\"\"Returns the length of a word.\"\"\"\n", + " return len(word)\n", + "word_length_tool = [get_word_length]" + ] + }, + { + "cell_type": "markdown", + "id": "83c104d7", + "metadata": {}, + "source": [ + "### Going deeper\n", + "\n", + "**Toolkits**\n", + "\n", + "* Toolkits are groups of tools needed to accomplish specific objectives.\n", + "* [Here](/docs/integrations/toolkits/) are > 15 different agent toolkits (e.g., Gmail, Pandas, etc). \n", + "\n", + "Here is a simple way to think about agents vs the various chains covered in other docs:\n", + "\n", + "![Image description](/img/agents_vs_chains.png)" + ] + }, + { + "cell_type": "markdown", + "id": "5eefe4a0", + "metadata": {}, + "source": [ + "## Agents\n", + "\n", + "There's a number of [action agent types](docs/modules/agents/agent_types/) available in LangChain.\n", + "\n", + "* [ReAct](/docs/modules/agents/agent_types/react.html): This is the most general purpose action agent using the [ReAct framework](https://arxiv.org/pdf/2205.00445.pdf), which can work with [Docstores](/docs/modules/agents/agent_types/react_docstore.html) or [Multi-tool Inputs](/docs/modules/agents/agent_types/structured_chat.html).\n", + "* [OpenAI functions](/docs/modules/agents/agent_types/openai_functions_agent.html): Designed to work with OpenAI function-calling models.\n", + "* [Conversational](/docs/modules/agents/agent_types/chat_conversation_agent.html): This agent is designed to be used in conversational settings\n", + "* [Self-ask with search](/docs/modules/agents/agent_types/self_ask_with_search.html): Designed to lookup factual answers to questions\n", + "\n", + "### OpenAI Functions agent\n", + "\n", + "As shown in Quickstart, let's continue with [`OpenAI functions` agent](/docs/modules/agents/agent_types/).\n", + "\n", + "This uses OpenAI models, which are fine-tuned to detect when a function should to be called.\n", + "\n", + "They will respond with the inputs that should be passed to the function.\n", + "\n", + "But, we can unpack it, first with a custom prompt:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "1c2deb4a", + "metadata": {}, + "outputs": [], + "source": [ + "# Memory\n", + "MEMORY_KEY = \"chat_history\"\n", + "memory = ConversationBufferMemory(memory_key=MEMORY_KEY, return_messages=True)\n", + "\n", + "# Prompt\n", + "from langchain.schema import SystemMessage\n", + "from langchain.agents import OpenAIFunctionsAgent\n", + "system_message = SystemMessage(content=\"You are very powerful assistant, but bad at calculating lengths of words.\")\n", + "prompt = OpenAIFunctionsAgent.create_prompt(\n", + " system_message=system_message,\n", + " extra_prompt_messages=[MessagesPlaceholder(variable_name=MEMORY_KEY)]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ee317a45", + "metadata": {}, + "source": [ + "Define agent:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "460dab9b", + "metadata": {}, + "outputs": [], + "source": [ + "# Agent \n", + "from langchain.agents import OpenAIFunctionsAgent\n", + "agent = OpenAIFunctionsAgent(llm=llm, tools=word_length_tool, prompt=prompt)" + ] + }, + { + "cell_type": "markdown", + "id": "184e6c23", + "metadata": {}, + "source": [ + "Run agent:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "f4f27d37", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'There are 5 letters in the word \"educa\".'" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run the executer, including short-term memory we created\n", + "agent_executor = AgentExecutor(agent=agent, tools=word_length_tool, memory=memory, verbose=False)\n", + "agent_executor.run(\"how many letters in the word educa?\")" + ] + }, + { + "cell_type": "markdown", + "id": "e4d9217e", + "metadata": {}, + "source": [ + "### ReAct agent\n", + "\n", + "[ReAct](https://arxiv.org/abs/2210.03629) agents are another popular framework.\n", + "\n", + "There has been lots of work on [LLM reasoning](https://ai.googleblog.com/2022/05/language-models-perform-reasoning-via.html), such as chain-of-thought prompting.\n", + "\n", + "There also has been work on LLM action-taking to generate obervations, such as [Say-Can](https://say-can.github.io/).\n", + "\n", + "ReAct marries these two ideas:\n", + "\n", + "![Image description](/img/ReAct.png)\n", + " \n", + "It uses a charecteristic `Thought`, `Action`, `Observation` [pattern in the output](https://lilianweng.github.io/posts/2023-06-23-agent/).\n", + " \n", + "We can use `initialize_agent` to create the ReAct agent from a list of available types [here](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/agents/types.py):\n", + "\n", + "```\n", + "* AgentType.ZERO_SHOT_REACT_DESCRIPTION: ZeroShotAgent\n", + "* AgentType.REACT_DOCSTORE: ReActDocstoreAgent\n", + "* AgentType.SELF_ASK_WITH_SEARCH: SelfAskWithSearchAgent\n", + "* AgentType.CONVERSATIONAL_REACT_DESCRIPTION: ConversationalAgent\n", + "* AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION: ChatAgent\n", + "* AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION: ConversationalChatAgent\n", + "* AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION: StructuredChatAgent\n", + "* AgentType.OPENAI_FUNCTIONS: OpenAIFunctionsAgent\n", + "* AgentType.OPENAI_MULTI_FUNCTIONS: OpenAIMultiFunctionsAgent\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "85f033d3", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.agents import AgentType\n", + "from langchain.agents import initialize_agent\n", + "MEMORY_KEY = \"chat_history\"\n", + "memory = ConversationBufferMemory(memory_key=MEMORY_KEY, return_messages=True)\n", + "react_agent = initialize_agent(search_tool, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=False, memory=memory)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d05a26c", + "metadata": {}, + "outputs": [], + "source": [ + "react_agent(\"How many people live in Canada as of August, 2023?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b626dc5", + "metadata": {}, + "outputs": [], + "source": [ + "react_agent(\"What is the population of its largest provence as of August, 2023?\")" + ] + }, + { + "cell_type": "markdown", + "id": "d4df0638", + "metadata": {}, + "source": [ + "LangSmith can help us run diagnostics on the ReAct agent:\n", + "\n", + "The [ReAct agent](https://smith.langchain.com/public/3d8d0a15-d73f-44f3-9f81-037f7031c592/r) fails to pass chat history to LLM, gets wrong answer.\n", + " \n", + "The OAI functions agent does and [gets right answer](https://smith.langchain.com/public/4425a131-ec90-4aaa-acd8-5b880c7452a3/r), as shown above.\n", + " \n", + "Also the search tool result for [ReAct](https://smith.langchain.com/public/6473e608-fc9d-47c9-a8a4-2ef7f2801d82/r) is worse than [OAI](https://smith.langchain.com/public/4425a131-ec90-4aaa-acd8-5b880c7452a3/r/26b85fa9-e33a-4028-8650-1714f8b3db96).\n", + "\n", + "Collectivly, this tells us: carefully inspect Agent traces and tool outputs. \n", + "\n", + "As we saw with the [SQL use case](/docs/use_cases/sql), `ReAct agents` can be work very well for specific problems. \n", + "\n", + "But, as shown here, the result is degraded relative to what we see with the OpenAI agent." + ] + }, + { + "cell_type": "markdown", + "id": "5cde8f9a", + "metadata": {}, + "source": [ + "### Custom\n", + "\n", + "Let's peel it back even further to define our own action agent.\n", + "\n", + "We can [create a custom agent](/docs/modules/agents/how_to/custom_agent.html) to unpack the central pieces:\n", + "\n", + "* `Tools`: The tools the agent has available to use\n", + "* `Agent`: decides which action to take" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "3313f5cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"The current population of Canada is 38,808,843 as of Tuesday, August 1, 2023, based on Worldometer elaboration of the latest United Nations data 1. Canada 2023\\xa0... Mar 22, 2023 ... Record-high population growth in the year 2022. Canada's population was estimated at 39,566,248 on January 1, 2023, after a record population\\xa0... Jun 19, 2023 ... As of June 16, 2023, there are now 40 million Canadians! This is a historic milestone for Canada and certainly cause for celebration. It is also\\xa0... Jun 28, 2023 ... Canada's population was estimated at 39,858,480 on April 1, 2023, an increase of 292,232 people (+0.7%) from January 1, 2023. The main driver of population growth is immigration, and to a lesser extent, natural growth. Demographics of Canada · Population pyramid of Canada in 2023. May 2, 2023 ... On January 1, 2023, Canada's population was estimated to be 39,566,248, following an unprecedented increase of 1,050,110 people between January\\xa0... Canada ranks 37th by population among countries of the world, comprising about 0.5% of the world's total, with over 40.0 million Canadians as of 2023. The current population of Canada in 2023 is 38,781,291, a 0.85% increase from 2022. The population of Canada in 2022 was 38,454,327, a 0.78% increase from 2021. Whether a given sub-nation is a province or a territory depends upon how its power and authority are derived. Provinces were given their power by the\\xa0... Jun 28, 2023 ... Index to the latest information from the Census of Population. ... 2023. Census in Brief: Multilingualism of Canadian households\\xa0...\"" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from typing import List, Tuple, Any, Union\n", + "from langchain.schema import AgentAction, AgentFinish\n", + "from langchain.agents import Tool, AgentExecutor, BaseSingleActionAgent\n", + "\n", + "class FakeAgent(BaseSingleActionAgent):\n", + " \"\"\"Fake Custom Agent.\"\"\"\n", + "\n", + " @property\n", + " def input_keys(self):\n", + " return [\"input\"]\n", + "\n", + " def plan(\n", + " self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs: Any\n", + " ) -> Union[AgentAction, AgentFinish]:\n", + " \"\"\"Given input, decided what to do.\n", + "\n", + " Args:\n", + " intermediate_steps: Steps the LLM has taken to date,\n", + " along with observations\n", + " **kwargs: User inputs.\n", + "\n", + " Returns:\n", + " Action specifying what tool to use.\n", + " \"\"\"\n", + " return AgentAction(tool=\"Search\", tool_input=kwargs[\"input\"], log=\"\")\n", + "\n", + " async def aplan(\n", + " self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs: Any\n", + " ) -> Union[AgentAction, AgentFinish]:\n", + " \"\"\"Given input, decided what to do.\n", + "\n", + " Args:\n", + " intermediate_steps: Steps the LLM has taken to date,\n", + " along with observations\n", + " **kwargs: User inputs.\n", + "\n", + " Returns:\n", + " Action specifying what tool to use.\n", + " \"\"\"\n", + " return AgentAction(tool=\"Search\", tool_input=kwargs[\"input\"], log=\"\")\n", + " \n", + "fake_agent = FakeAgent()\n", + "fake_agent_executor = AgentExecutor.from_agent_and_tools(agent=fake_agent, \n", + " tools=search_tool, \n", + " verbose=False)\n", + "\n", + "fake_agent_executor.run(\"How many people live in canada as of 2023?\")" + ] + }, + { + "cell_type": "markdown", + "id": "1335f0c6", + "metadata": {}, + "source": [ + "## Runtime\n", + "\n", + "The `AgentExecutor` class is the main agent runtime supported by LangChain. \n", + "\n", + "However, there are other, more experimental runtimes for `autonomous_agents`:\n", + " \n", + "* Plan-and-execute Agent\n", + "* Baby AGI\n", + "* Auto GPT\n", + "\n", + "Explore more about:\n", + "\n", + "* [`Simulation agents`](/docs/modules/agents/agent_use_cases/agent_simulations): Designed for role-play often in simulated enviorment (e.g., Generative Agents, CAMEL).\n", + "* [`Autonomous agents`](/docs/modules/agents/agent_use_cases/autonomous_agents): Designed for indepdent execution towards long term goals (e.g., BabyAGI, Auto-GPT).\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/extras/use_cases/agents/camel_role_playing.ipynb b/docs/extras/use_cases/more/agents/agents/camel_role_playing.ipynb similarity index 100% rename from docs/extras/use_cases/agents/camel_role_playing.ipynb rename to docs/extras/use_cases/more/agents/agents/camel_role_playing.ipynb diff --git a/docs/extras/use_cases/agents/custom_agent_with_plugin_retrieval.ipynb b/docs/extras/use_cases/more/agents/agents/custom_agent_with_plugin_retrieval.ipynb similarity index 100% rename from docs/extras/use_cases/agents/custom_agent_with_plugin_retrieval.ipynb rename to docs/extras/use_cases/more/agents/agents/custom_agent_with_plugin_retrieval.ipynb diff --git a/docs/extras/use_cases/agents/custom_agent_with_plugin_retrieval_using_plugnplai.ipynb b/docs/extras/use_cases/more/agents/agents/custom_agent_with_plugin_retrieval_using_plugnplai.ipynb similarity index 100% rename from docs/extras/use_cases/agents/custom_agent_with_plugin_retrieval_using_plugnplai.ipynb rename to docs/extras/use_cases/more/agents/agents/custom_agent_with_plugin_retrieval_using_plugnplai.ipynb diff --git a/docs/extras/use_cases/agents/index.mdx b/docs/extras/use_cases/more/agents/agents/index.mdx similarity index 100% rename from docs/extras/use_cases/agents/index.mdx rename to docs/extras/use_cases/more/agents/agents/index.mdx diff --git a/docs/extras/use_cases/more/agents/agents/multi_modal_output_agent.ipynb b/docs/extras/use_cases/more/agents/agents/multi_modal_output_agent.ipynb new file mode 100644 index 000000000..de67f1f43 --- /dev/null +++ b/docs/extras/use_cases/more/agents/agents/multi_modal_output_agent.ipynb @@ -0,0 +1,298 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cd835d40", + "metadata": {}, + "source": [ + "# Multi-modal outputs: Image & Text" + ] + }, + { + "cell_type": "markdown", + "id": "fa88e03a", + "metadata": {}, + "source": [ + "This notebook shows how non-text producing tools can be used to create multi-modal agents.\n", + "\n", + "This example is limited to text and image outputs and uses UUIDs to transfer content across tools and agents. \n", + "\n", + "This example uses Steamship to generate and store generated images. Generated are auth protected by default. \n", + "\n", + "You can get your Steamship api key here: https://steamship.com/account/api" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0653da01", + "metadata": {}, + "outputs": [], + "source": [ + "from steamship import Block, Steamship\n", + "import re\n", + "from IPython.display import Image" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f6933033", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain import OpenAI\n", + "from langchain.agents import initialize_agent\n", + "from langchain.agents import AgentType\n", + "from langchain.tools import SteamshipImageGenerationTool" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "71e51e53", + "metadata": {}, + "outputs": [], + "source": [ + "llm = OpenAI(temperature=0)" + ] + }, + { + "cell_type": "markdown", + "id": "a9fc769d", + "metadata": {}, + "source": [ + "## Dall-E " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cd177dfe", + "metadata": {}, + "outputs": [], + "source": [ + "tools = [SteamshipImageGenerationTool(model_name=\"dall-e\")]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c71b1e46", + "metadata": {}, + "outputs": [], + "source": [ + "mrkl = initialize_agent(\n", + " tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "603aeb9a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to generate an image of a parrot playing soccer.\n", + "Action: GenerateImage\n", + "Action Input: A parrot wearing a soccer uniform, kicking a soccer ball.\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3mE28BE7C7-D105-41E0-8A5B-2CE21424DFEC\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now have the UUID of the generated image.\n", + "Final Answer: The UUID of the generated image is E28BE7C7-D105-41E0-8A5B-2CE21424DFEC.\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n" + ] + } + ], + "source": [ + "output = mrkl.run(\"How would you visualize a parot playing soccer?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "25eb4efe", + "metadata": {}, + "outputs": [], + "source": [ + "def show_output(output):\n", + " \"\"\"Display the multi-modal output from the agent.\"\"\"\n", + " UUID_PATTERN = re.compile(\n", + " r\"([0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12})\"\n", + " )\n", + "\n", + " outputs = UUID_PATTERN.split(output)\n", + " outputs = [\n", + " re.sub(r\"^\\W+\", \"\", el) for el in outputs\n", + " ] # Clean trailing and leading non-word characters\n", + "\n", + " for output in outputs:\n", + " maybe_block_id = UUID_PATTERN.search(output)\n", + " if maybe_block_id:\n", + " display(Image(Block.get(Steamship(), _id=maybe_block_id.group()).raw()))\n", + " else:\n", + " print(output, end=\"\\n\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "082792a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The UUID of the generated image is \n", + "\n" + ] + }, + { + "data": { + "image/png": "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AQEB/wAA/wEAAf8AAAEAAQD//wD/AQEAAAAAAAEAAAABAgD/AAEAAAABAQAA/wD/AAEAAAEA//8A/wEBAf8BAf8BAAEAAP8BAAEAAAABAAAAAf//AQAAAAEAAAD/AQAB/wEBAf8A//8AAAD/AQEBAQEAAQD/AAABAAD/Af8A/wD/AAEBAQIA/wEBAP8AAAABAAD/AAAAAAABAQIBAQEAAQABAAEAAP/+/v8A////AAAAAP8B//8A/wH/AQD//wABAAABAf//AQAB/////wD/AAABAQD/AQAAAAEBAQEBAAD//wAAAP8BAAABAQD//wD//wD/AAH/AAD//wD+AAAA/wD/AAEA/wABAAECAP8AAAABAgEAAQAAAAH//gD/AAEBAP8B/wEBAP8AAAABAAD//wD/AP//AAEAAQEBAgECAP8AAP8AAAD/AAD/AAAA//8BAAIBAQAAAgEBAAEB/wEBAAD/AAD//wH//wD/AAAA/wH//wD///8BAP7+/wD///8AAAAA////AAEB/wD//gD/AP8A////AAAAAP8AAf8AAAEBAQEAAAAAAQD//wD/AP7/Af8A////AAEBAQEAAAH/AAD/AP///wD//wH/AP8B/wEB/wAAAf8BAAAA/wEA/wH//wAB/wEBAQEA//8AAAABAAD/AQAAAAABAAD/AP8AAP8BAQAA/wEAAAD+AAEAAAAAAf8AAAD/AQAAAP///wAA/wAAAQD/AAD//wAAAAAAAAD//wD+AAABAAEB//8BAAAAAAAAAAABAAABAAAAAAD+AP8BAP///////gAAAP//AQAAAQABAP8AAAEAAAAA/wAB//8AAAH/AAAAAAEAAQIAAP8B/wEAAAEA/wABAAEA//4BAAD/AP///wABAQAAAgEBAQEAAAAAAQEAAAH/AAEAAAD/AP///wEAAQIAAAEAAAEBAAEBAAD/AQD/AAECAP///wEAAQAA/wEAAAEAAAAB////AQAAAAEAAAEAAP8AAAABAAAAAAD/AAAAAAD//wAB/wEAAAEB//8BAAACAQD/AP///gABAf8AAAAA/wEBAAH/AAH/AAAB/wAAAAAAAAAC/wEAAAEAAAEBAP8A/wAAAAEAAAEB/wEAAAEBAAEBAAIAAAD/AAECAAEBAgABAAABAP8CAAAB/wAAAP8BAQD/AP8AAP8AAAD/AAAAAAD//gAAAAAA/wEA/wEB/gAAAAH/AQAAAP//AAAAAQEAAAEAAAH/AQEAAAIAAAAAAAEAAQAAAAAA/wD+/wD//gAAAAAAAQACAf8BAQIA/wAA/wAAAP8AAQD/AAD/Af//AAAAAP8A/wEAAAEBAf8AAAAAAAAAAQIBAAIAAP///wEAAAIBAAEAAAAA/wH//wAB/wD+AP8AAAEAAP//AAAA//////8A/wD//gD/AP4AAP8BAAEBAAABAAAAAAD/AAAAAP8BAP8AAAAAAQEA//8AAAAAAAH/AQAAAAAA/wABAAAAAgAAAQEB/wH/AAD//wAAAAEBAP//AAAAAAAAAP8AAAD/AQEBAQEBAAEBAAEA/wABAQEAAAABAQAAAP8AAQAAAAAAAAAAAQEAAQEAAf8BAAEAAAD/Af8AAAD/AAAA/wABAAAAAQAC/wEAAAEAAQAA//8BAAAAAP8BAAABAP//AQABAAABAbKztPj19QAAAQAAAAAA/hIJAFQxAgD/AP8BAQD///8AAP8A//8AAAD1BAD5APf5+/r//f//AAAA/v8A/gEGBQEAAQEAAQH/AP8BAAABAAAAAAL/AAD/AQAAAAH/AAEBAv8AAQABAQAAAAEAAQEBAP/+AAABAAAAAAEBAAAAAf8BAQAAAAAA/wAAAP8AAAAB/wABAAEAAAAAAP8AAQABAAEA//8BAAAA////AQAAAQAAAAAAAAAAAAAAAAH/AAIAAQAA/wABAAH/AP//AAD/AAH+AP8AAf8AAP//AP8B/wEAAP8BAgEAAAL/AAACAQD//v8AAQAAAAEA/v4AAP8AAP8AAAAAAAABAQAAAP4BAQEAAAEAAAD/AAEAAQAA//8BAf8AAAEBAAAA/wAAAP//AP4AAf8AAf8AAAAAAAAAAAAAAP8AAQD/AgEBAAAAAQABAAEAAQD/AAAAAAD+/wAB/wAAAAEAAAAA/wD/AAD//wD//wEAAf8AAAAAAQAAAQAAAAD///4AAQEBAAEAAQAAAAAAAAAAAAAA//8BAP8AAAD/AQD/////AQEAAAAAAQABAQAAAP8AAQABAP/+AAAA//8C//8AAv//AQAAAAAAAf//AAABAQEAAAEAAP8AAf8C/gD/AAAAAQD//wAAAQAAAAABAP//AP8AAAH/AP///v//AQEAAAAAAP8A//7/AQABAAAA////AQAAAAL/AAABAAIAAAH/AP8BAP///v8BAf8A/wAAAP8AAAD/AAEBAAD//wAA/wH///4B/wABAAEAAQEAAQAAAgD/Af8A//8A/wACAQEAAAEAAAABAQEAAgEAAQH///4BAP8A/wD9AAD//wAAAQAAAgEBAQEAAQD/AAAAAQEAAQAAAQEAAQEAAQEBAAEBAAEAAgD//wD/AQAAAf8A/wABAQEA//8AAAAAAf8A//8AAAAAAP8A/wAAAv4BAP8BAP8CAAEAAAAAAAAAAQAAAQABAQH/AQD/AAABAP8AAAAAAP8A/wAAAAD/AAD/AQAA/wH/AP//AAEAAAEAAAAAAAD+/wAAAP8BAgAAAAAAAP8AAQEAAP8B/wH/AP7/AAAAAf8AAgD/AAAAAQEAAAAA////Af//AAAA//8AAf8AAQABAQAAAP//Af////8AAAAAAAD///////8AAQAAAQAAAAAA/wABAQEA/wEBAf//Af//AP8AAAD//wAAAAAA/wABAAD/Af//AP8AAAD+AAAAAAH/AAIAAQIAAQD/AAEBAP8AAQAAAQAA//4AAP4A/wH/AAAA/wD///8AAAEAAQIBAQH/AgD/AAD/AP8AAf8AAAD/AAEBAAAAAP8AAAAAAQD//wAAAAAAAAAAAP//AAACAgEAAAEA/wD/AAAA/wAAAAAB//8AAP8A//8AAQEAAAH/AAD//wAA/v8A/wAAAQAAAAABAf8BAAD//wH//wAAAf//AAAAAAAAAP8AAP8A/v//AP8AAAAA/wAAAAEAAQAAAAEAAAIAAAEA/wEA/gD/AgD/AAAA/wAA/wAAAAH/AP8A/v///gD/AAEAAP8AAgAAAQABAP//Af8AAAD/AQIAAQABAQH/AQH/AAL/AAAAAQAAAAAAAf//AAD//wEAAAAAAf//AAD/AQABAgEAAf8AAQAAAAH/AgAAAQD//wABAAD///8A/wAAAQH/AAL/AAAA/wAAAAAAAQAAAf8AAAEBAAAAAAAAAf8BAAD/AAAAAf//AQAAAAEBAAEAAAD/AQAAAQH/AAAAAAAAAAEAAf8B/wIAAP8BAQABAQABAv8BAAABAgIAAAABAP8BAAD//v//AAAAAAABAQABAQAAAQAB/wD/AQD/AAAAAAAAAP/+Af8AAf//AAAA/wAA//8BAQD+AAAAAQEAAAAAAQAA//8AAQAAAAAA/wAAAAEAAP8AAQAA////AP//AAEA//8AAP4BAAAA/wABAQD/AQAAAQAA///+///+//8BAAD/AQAA////AAAAAQAAAAAA/wAB//8A/wAAAAD/AAAAAAAA////AP8BAAAAAAABAAAAAQDo6OmnpqcAAP8AAP8AAAAAAAFmOwYsGP0BAv0CAP8BAf8BAgABAQH/AP//9QMA/wHv+Pzx/QAAAAAAAgMAAAEJBwoAAP8BAP8BAQAAAf8B/wAA/wD/AAD///4AAAAAAAD+//4BAP//AP//AP7/AP//AAEAAf8A/v8AAQD//wEAAQAB//8BAQAAAAABAAEBAAH/AAAAAQD/AP8BAAEBAAAA//8AAAEA/wAAAAEBAP8AAf8AAAABAQAAAAAAAAAAAQACAP8BAAD/AP8BAAEBAAAAAQD/AgEAAP8BAAIAAQAB//8AAP8B//8AAAD/AQAA/wABAQEB/gD/AQAAAwECAAABAAAAAQAA/gD/AAAAAQAAAAABAAAAAAH/AAAAAAAAAAEAAAD/AP//AAAAAAAAAAAB/wEA/wAAAQAAAQAB//8AAAAA//8A////AAD//wAA//8AAQAAAP4AAQEAAP8AAgEAAQAAAP8AAP8AAQD/AAD/AQEAAQH/AQABAQEAAP8AAQH/AP//AQIBAAAB/wD/AAAAAAAAAAEAAAAAAAEA/wEAAQEBAAAAAQEAAAAAAQAAAQAA////AP8A//8A/wABAP8AAAEA/gAB/v4BAQAAAAAAAP8BAAAB//4AAP///wH/AP8B/wEAAv8AAAD/AQD/AAAAAAH//wABAAABAQD+AP8BAQEBAAAAAP8AAf8BAQEBAgAB/wIBAQIAAP8AAAD/AQAB/wD/AAEA/gAA/wABAQEAAAAAAAAAAAABAAAAAAAA/wH/AQAAAgIBAAAB/wH/AAD/AQAAAAAAAP4AAf8A/wEA//8A//8BAQD/AQAA/wD/AP//Af8A/wAAAAEBAAEAAgABAQEAAf8AAP///v//AP8AAAABAAAAAAAAAf7/AAH/AAAAAP///wD/Af8BAAEAAQABAAABAAAAAP8AAAAAAAAAAQAAAAEAAAD//wAA/wAAAAAB/wAAAAEB/gH/AAAA/wAB/wD/AAEAAAD/AP8AAAD//wEBAP8BAQEBAAEBAP//AQD/AAD/AAH/AAACAf//AAD/AQAAAAAAAAH+AQAA//4AAAD/AP8A//8AAAACAAL/AQACAf//AP8B/////wL/AP8AAQAAAAEBAAAAAgICAAEAAAACAAAB/wH/AAABAf8AAQABAQABAAABAP8AAAABAAAAAP8AAAH/AQEC//8AAQAAAP8AAQABAQABAQIAAQEB/wAA/wAA/wD/AQABAQABAAEAAQD/AAAAAAH/////Af8AAQAA//8AAAAAAf8BAQEBAAAB/wD+AP8AAAH/AAIA/wD/AAD/AP7/AQD/AAEAAAAC//8B//8AAAAA/wD//wEAAP8AAgAAAQD/AAABAAAAAAABAQAAAP//AQAAAAIAAQAAAf8AAAD//wAAAQEB/wEAAP8AAAAAAAAAAAEBAAEC/wEAAAD/AQAAAP8A/wD/AQIAAQIC/wABAAAAAAAAAAEAAQEAAAEBAQAC//8A/wAAAQAAAAAB///+/wD//////wD//wEAAP8AAQAAAAEA/wAAAAD/AQACAAECAQEAAf/+AQAAAP8A////AAACAQACAP//AQH/AAABAAD//wAAAQAAAAAB/wEAAAEBAAABAP8AAAH/AAAA//8BAAABAP8AAAD/AP8BAAAA/wEAAQAAAQEBAQH//wAAAQABAQAAAP8AAQD/AAEAAQABAAD/AQD/Af8BAQEAAAEA/wD//wABAAAAAQH/AP8A//8BAAD/AAAAAAAAAQAA////AAD/AQEBAP8AAAEB/wEAAAABAQEAAAAAAAABAQD/AP//AAD/AAABAAEAAQIBAQEAAQAAAAAA/wAAAQAB/wIAAAAAAQABAQAAAQAAAgAB//8AAgEAAAAA/wAAAf8BAQABAP8A/wEBAf8A/wABAAABAAAB/wEAAAEAAAAAAP8AAAAAAf8BAAABAQEAAQEB/wAAAAEAAAD/AP8B/wABAAEBAQEBAAABAP8AAP8AAAEBAQAAAP8AAAEAAAAA/wEAAAEB/wH/AAAAAAAAAAEAAAAAAAD/AAABAAAAAAAAkZWW4uHfAP//AAD/AAD/GQ8DZDcA/wL9AAAB/gIA/gABAAAA/wD/AQEC/fIEAQEA6/8C9wAAAAABAP7+AAD/ERERAQAB/v8A/wABAf8B/wAAAAEA/gAAAgECAAAA/wAAAQABAAABAQAAAAEBAAEBAP8AAQECAAEBAf8BAAD/Af8BAQAAAAAAAAAB////AAEAAAAAAP8AAQEAAAEAAQD/AAEBAQEAAQEBAAD/AAAAAQAAAAEAAP8AAAEA/wAAAP8AAgAB/wABAQAA/////wD/AP8AAf//AgAAAP//Af8AAAAAAAAA//8AAP8A////AAD//wEAAAEAAAAAAP8BAAAAAAAA//8A/wEAAQAAAQAAAAAA/gAAAAEAAf///wD/AAD/Af8AAf8BAAAAAP8BAAEA/wH/AAEAAf8A//8B/gABAQAAAAEAAAEAAAH//wEAAAEAAP8A//8BAAAAAQEAAAAA//8A/wH/AAABAP4AAQH/AQAAAAAAAP///wAAAAABAP7+//8A/wD//wD//gH/AAEA////AP8BAP//AAH/AAAAAP8AAAEAAAH/AAAA/wAAAf8A/wH/AQAAAQEA/wAAAAAAAP//AAAA/wAB////AQECAQABAAAA/wAAAAEBAAD/AAACAAAA//8AAAH/Af8AAQD/AQAAAQD/AAEBAP8AAQAAAAAB/wEA/wAAAP8CAAD/Af8AAAD/AAAAAAEBAAABAQEBAAD//wAAAAEAAQH/AP8AAQAA/wEBAAAA/wEAAAAAAAAAAf8BAf///wABAQEAAgD/Af8AAAAAAP8AAAAAAAAAAAABAP8A////AQEB/wH/AAD/AAAAAAEAAf/+AAD//wEA/wAAAAAAAAEBAAEBAAEAAAAAAP8A/wEAAAABAAH/AP////4AAAAAAAD//wEAAP7/AAAA/wACAAAC/wEBAQEB/wAAAf//AAAAAQH/AQEBAQD/AAD/Af/+/wH///8AAAEAAAEAAQAB/wAAAQEAAAAAAAH/AAAA////AAAA/wEBAf8AAQAAAQEAAAAA//8AAAAAAP8AAAAAAAIAAgABAQAB/wEAAAAAAQIBAAAA////Af4A//8AAAEB/wIAAQL+AAABAAAAAgABAAEAAf/+/gAAAAEA/gEBAAD/AQEAAP8AAQABAAAA/wAA/wEAAAEA/wH//wEB/wH/Af///QAAAP8A//8A///+AP8AAAD/AP///wEAAAD/AAAAAP8AAAD//wAAAP8AAQAAAAD/AAAAAP//AP8A/wAAAQH//wAB////AAAA/wAAAAAB/wH/AQAAAgAAAf8AAAABAAAAAQH/AAAA/wEAAAABAAAAAAAAAQIAAv8AAP8AAgAAAf8A//8BAP///wAAAAAAAAAA////AAD/AAAC/wEA/wAAAQD/AAEAAf8B/wH/AAEAAAH//wEAAAEA/wEAAf8AAQEAAAEAAf8AAQD/AAAAAQAAAQAAAAAAAf8AAAEBAP8B/wEBAAAA/gABAQH//wEBAQAAAAEBAQEAAAABAAEAAQABAAAAAAEA/wIBAQEAAAAB//8BAQABAgAAAQEBAQEAAf8A/wD//gABAQD/AAD///8AAAH//v8A/wEA/wH/AAD//wH/AAABAAABAAAAAQD/AAEAAAAAAAD/AQAA////AAAA////AQD/AP8BAgEBAAAB/////wAA//8AAAEAAAAA/wABAv////8B/////////wEAAAD//wAAAP//AP8BAAEA//8AAAAAAAAAAQD+AAABAQD/Af///wEBAP8AAAEA/wAB//7/AAAAAAD/Af8BAQAAAAEAAQEBAf//AP//AAD/AQAAAf//AAH/AQAA/wD/AAAA/wAA/wAAAAAAAQAA/wEBAQD/AAAAAAEBAP8B/wAAAQACAAEA//8AAQAA/wD//wAB/gEBAf//AAABAf8AAAAAAQAAAf8B////AAAAAQD//wD/AP8AAQEAAAH/AAD//wD/AAABAP8BAAABAQEA/wAA/wEBAAD/AQAAAAAAAAD/AAD/AQEAAAABAQAAAQH/AQD/AQAAAP8B/87Q0JeVmAD+/gAAAAAAAgEBAWg5BCES+wEA/wAC/wEAAQEAAQD/AQAAAQH7AwHvAwL7/9j4/foA/wAA/wAA/gAAAAUFA////wEBAAAAAP8BAAABAP//AAIAAP8B////AAABAP8B/wAAAAAB/wD/AAD//wAAAP//AAABAAAAAAAAAAAAAP8AAAAAAQAA/wEBAQH//wL/AQEBAAD//wH//v4BAAAA//8A/wD//wAAAAABAf4AAAD/Af8BAQD//wEAAAAAAAL/AAD/AAH/AQAAAAEAAQAAAP8AAP8AAP8AAP8BAAAAAf8A/wEBAAACAAEAAQD/AAAAAQD/AAABAAEA/v8A/wEAAQEAAAEAAAAAAP//AAAAAAEAAAAAAP8BAQEAAQAAAQAAAP8AAAD/AQABAQAA/wEBAAEAAQAAAAAA/wEBAf7/AQD/AgD//wEA/wEAAAAAAQAA/wEBAf8AAP4AAQAAAAEAAAEAAQABAf8B/wEBAgD+AQH/AP8AAQEA/gAAAQABAQAAAAMAAAEBAQEAAAD/AP8BAAAA//8BAAAAAQEAAAAAAP8AAP/+AQAB/wEAAP8B/wD/AQABAQAAAQH/AP8BAQABAAEBAQAAAAABAAD//wAAAP8A//8AAAAAAAEAAQH//gD//wAAAAD/Af8BAAEAAQD//wABAAD//wAAAP8BAQD/AAEAAAEAAQAA/wEAAf///wABAP4AAAD/AAH/AAAA/wAAAf8AAAAAAQAAAQABAP///wL/AP///wD+AAAAAAEAAAAB//8AAP8B/wD/AP7/Af8AAP8BAP8BAf//AAAB//8BAP8B//8BAAD+/wD/AAABAQD/AAAAAP8AAf8AAQD/AAAAAAD/AQAAAAAAAAD/AQABAQABAAABAAH/AP8AAQEBAQACAQEA/wD/AAH/AAEBAP8A/wAB/wEA/wH+/wAA/wL/AAAAAQH/AAD/AP//AP//AQAAAf8AAAD/AQEBAAD/AP4A/wAB/wEBAP//AQAAAAH/AAEA//8BAAABAAD///8BAP8BAAD/AAAAAAABAgEAAAAA/wABAQD/AAAA/wAA/wH//wAAAQD//wD/AAAAAf8CAAEBAP8A/wH//wAAAQAAAAD///4A/gAAAP8BAQABAAH//wH//wAAAf//AP8BAQEAAAD/AP8AAAD/AQAAAAD/AgH/AAD/AP8AAQMAAQABAAABAAEBAQABAAEAAAAAAAD//wABAQEBAAABAAAAAgL/AAAAAAEBAAABAAACAAABAQABAAEAAAD/AQH/AAIAAf8AAAAAAAIA/wEAAP8B/gAAAAAB/wD/AP8A////AAABAP8BAP////8AAAAAAAD+AP8AAP8A//8AAAABAAAA/gABAAD/AAD/AAAAAAEAAP8BAgEAAAH//wIAAAH//wD+/wABAAEAAAD/AAD/AAEAAAD//wAAAP8AAAD+AP8AAQAAAP8AAP4AAP8BAP8A/wAB//8B/wEA/gAA/wAAAQABAAEA/wD/AQH/AP8BAAAAAf7/AAEA/wD/AAAA/wD/AAAAAAD+////Af8A/wAB//7/AP4AAf8A/wD/AP8BAAAAAQEAAAAAAQAAAQAAAAEBAQEBAP//AAAAAAEAAP//AQAA//8A/wAAAAAAAf//AP//AP8AAP/+/wABAf8BAAAA//7/AAAA/wD/AAEA/wEAAQH//wABAAAAAAEAAAECAQABAQAAAAABAgABAAIAAAAAAAD/AQAAAAAA/wD///8BAAD/AAD///8AAQEB/wABAQD/AQAAAQEB/wH/AAD//gEAAP//AAH/AP///wD//wD/AAAA/wAAAAABAAAAAAAAAf8BAP8AAP8A/wAB/wABAQAAAAEA/wEAAP8AAAH/AAABAAAAAQEAAAEA/wD/AAAA/wAA/gAAAAABAAIBAAAA/wIB//8AAP////8AAf8AAf4BAf8A/wAAAAAAAAD/AQD/AQAB//8AAP8AAf//AAD+Af8B//8AAAD/AAD/AQEA/wH/AAABAP8AAAABAAEAAAAAAQD/AQAA/wABAAD///8AAP//AAD//v+Oj5Hy8O0AAAAAAAEAAAAmFQRmOvwAAf8AAAH//gD/AP8AAf8AAQD/AAH/8gYC8QX+/f7q+f4A/wEAAAEAAAAAAP8ZGRn/AAABAQAA//8BAP8A/wABAQH/AQAAAAEBAQAB/wEBAAEAAAEAAAIAAAAAAQH/AP8BAf//AP//Af4AAAD/AP8AAQD/Af8BAQEAAf//AQD/Af/+////AQL//wEAAAAA/wAAAAEAAQABAQEA//8A//8AAP4AAAD/AAEAAAAAAQACAQAAAf/+AAABAQAAAP//AP8AAAAAAAABAQAAAQAAAAAB/wEAAAAA/wAAAAAAAAAAAAABAf8B////AAABAAH///8BAQD/AQEAAAEAAQEAAAH/AAAA/wAB/wAAAP8AAAEAAAAAAQABAP8BAP//AAD//wD/AP8AAQEB/wEAAP8CAP8AAP4AAAEAAAEB/wEA/////wEA/wABAQABAAABAQEA////AP8A//8CAQD//v8AAf8AAQAAAQAAAAAAAP4AAAAAAAD/AAAA/gAA/wD/AAAB/wAAAf8C/wD/////AP//AAAB/wAAAf8A/wD/Af//AAEAAQD/AQEAAQAAAf8A//8A/wEA//8AAf8B/wAAAAD/AP8BAAH/AAH//wAAAQAAAAH/AQAAAQH/AQAA/wH/AQABAAAA/wAAAQD/AAAAAP8AAAD///8A/wAAAAD+//8AAQH/AAABAAABAAD/Af///wEAAQECAf//AQAAAAH//wAAAAH/Af4BAgABAv8AAAAAAQAAAAABAP8B/wEAAQAB//8A/wAA//8AAAABAP///wEBAP8BAAAA/wD//wAAAAEBAP8AAP8A/wEAAQAA/wABAAAA/wAA/wD/AAD/AAAAAAD//wD///8A/v8AAQABAP8AAP8BAAD/AAEAAQEAAf8BAAEBAQEAAP8A/wAAAQEA/wD/AQD/Af///wAAAQEAAf8AAQACAQAAAQEAAAD/AAABAQABAAH/AP8AAAAAAQAAAAH/AAH//wD//wEA/wD/AQEB/wAAAAD/AAAAAQAAAP4AAAAAAAL/AP8AAQAA////AAEAAAECAP8BAP8AAQD/AP8B//8AAQEBAAAAAQEAAAACAf8AAAEBAQAA//8A/gABAAD/AQD/AAD/AQEBAAABAP//AP//AP8AAf8BAQABAAABAP7/AAAB/wAAAgH/AP8A/wABAP8A/wD////+AP//AQEAAAEA/wAAAP8A/wAA////AP8AAP/+/wAA/wAA/wAB//8A/wH/AAEAAAAAAQD+AP8BAAABAAD/AAIAAAEB/wH+AgEAAAD/AQEAAAACAQABAAAB/v8AAAAB/wEA/wAAAAD/AAAA/wH///8AAAACAQEBAAIBAAABAAD//wAAAQEB///+AP8AAQH/AAH/AAIAAQAA/wABAAH/AAAAAQH////+AQABAAABAP//AAAB//8AAf8BAAEBAQAB/wEAAQD//wEAAAD//wH/AAH//////wAA/wD/AP//Af8B/wD///8BAAD/AAD/AQD/AAABAP8AAAEA/wAA//8AAP8AAAECAQAC//8AAAD+AQAB/wAAAAAAAQAAAP8AAP8AAAH/AP8BAAABAAABAAAA/wABAAAAAAEAAAAA/wAAAAAAAAAAAAAB//8AAwAAAQABAP8AAQEBAAD/AAD+Af//AAEAAAAAAAEA/wAAAQH//wD//v/+/wAAAQABAP8B/wD//wAAAAD/AP8AAQEAAQAAAQIBAQEBAQAAAAEA/wD/AAEAAAAAAf//////AAD+AAAAAAEAAQABAQD/AQAAAQEBAAEAAQAAAQD/AAABAAAAAAH/AQAAAAABAAAAAAAA/wL///8A/wAAAAH+AAAAAQH/AQD//wEAAP7/AP//AAAAAQD//wAA/wABAAAAAAAA/gAAAAAA/wABAQAAAQAAAAAA/wAB/v8BAQAB/wAA////AP8BAgAAAAABAAAA//8AAAAAAv8B/wEAAP8AAQD/AQD/AAEAAP4A/wEAAAD/AAD/AAEAAAD/AAAAAAD//wAAAAEBAAEBAAAAs7S2qamrAAABAAABAAAAAQAAckEBFw7/Av8AAAD/AQAAAf8AAP8B//8AAP//AO4GAPz/AP//5/r+AQABAAEAAAACAAABGBgYAQAA//8AAAEA/wABAQAA//7/AP8BAP8AAQAA/wD/AAAAAAD/AP8A/wEBAQD/AAAA//8BAAACAP4B/wAAAAABAP8AAf8A/////wAA//4AAAAAAAABAf//AAEAAf8B/wEBAAAA/wAA/gAAAAABAQABAAABAAD/AQAAAAEAAP8AAgEAAQABAQH//wAA/wAAAQEBAQEAAAAAAAD/Af8AAAD/AAEAAf8AAAD/AAH/AAEAAf/+/wEB/wABAAABAAAAAQD//wAAAQD+AAAAAQD/Av//Af//AAAAAAEAAQAA/wD/AAEAAf8A/wEAAAD/Af8BAQEBAf8A//8A/wD/AP8A/gEAAQABAAD/AAAAAAEAAAEAAAD/AAH/AP//AAAA//8AAQEBAQAB/wD//wABAAEAAAEA/wABAf8AAf8AAP//AAD/AQEBAAD/AAEAAAEBAQEAAAEBAAAB/wEBAQAAAQEBAQD//wAAAQAAAAABAP8AAAAAAf////7//wAA/wEBAQAAAAEAAAAAAf8A/wABAAEAAP8A/wH+AQD/AP//AAAAAAH/AP4A////AP7/AAEAAf7//gABAAAA//8AAQAAAP8A/wD/AAAA/wH/AAD/AQEBAAEAAf//AAD/////AQAAAQEAAP//AP4AAQAAAAD/AAD/AAD/AQAA//8B/wAAAAD/AP8A//8AAAAAAAEAAf8AAAIAAAIAAAABAQAA/wEBAQD/AP8AAAABAQECAAIBAf///wABAAAB/wD+AAD/AAAA/wAAAQEA/wEAAAAAAgAAAQEAAQEAAQABAAEBAP4A//8A/wAAAAAAAAAAAQAAAP8B/wD///8AAAAB/wAA/wH//wEAAAABAf8BAQIAAAAAAQACAAAA//8AAf//AQEAAP8A//8AAAABAf8AAP8BAP8AAAAAAQD//wAAAgAAAAAAAP8A/wEAAf8AAQABAAAAAAAB/wD/AAD/Af////8AAf8BAQD//wD//gEB/wEBAP8AAQEBAAEBAAD/AP8A//8AAP8A/QAA/wAA/wAA/wECAQIAAP8AAAACAAAAAP/+AAD/AP8AAAABAgAAAf8BAAAAAAAA//8BAQABAQEBAP//AAABAAAA//8B/wAAAAEBAAABAP7/AAAA/wH/AP8BAAEA/wEA/wAAAAACAQAAAQD/AP////8BAAH/AQABAAABAP8AAQEBAAAAAAD//wH////+/wABAP///wAAAQAAAv8A//8A/v4A/wABAQAA///+/wABAAABAQEAAgD/AQEBAAAA/wABAAAAAAEA/wEBAf//AAD+AAAAAP4AAP//AQH//wH//wIBAAD//gD/Af8A///+/wABAv8A/v8AAAABAgEA/wAAAAAA////AAAA/wD/////AQAAAP8BAQEBAQD/AQAAAQAAAQEAAAAAAP8AAAABAAEB/wEAAAEAAf//AAAAAAEBAQD+AAEAAAEAAQEAAP//AP8A/wEBAAAAAf8AAAAAAAABAP4AAQABAAAAAQD/AAAAAAAAAAAA//8AAAEBAAABAQAAAP//AAAA/gEAAQEBAAABAAEBAP8BAP///wAAAAAAAAAAAQAAAQAAAP///wEAAQEAAAEAAP//AAEBAAAAAQEBAf8A//8A/wAAAAEAAQEAAgEAAAAAAf8AAP//AP7+//8A/wEAAAABAf8A/gAAAP4AAQEAAP//AQH/AAEAAP8AAAEAAP8AAQD//wEAAQABAP4AAQEA/wAAAQAAAf//AP8B//8A/wAAAAD/AQEAAQEA/wD/Af8A//8AAAD/Af//AAACAAAAAQAAAAABAAAA/wAAAAAAAAD//wIAAQAB//8AAP8BAAABAQEAAAEAAQEAAAAA/wABAAAAAAEA////AAAA/wABAAEBAAEAAAAAAAH/AAAAAQAAAf8AAQAAAAACAAEAAQAAAf//AQD/AAAAAQD/AAEAAQEA/wEBAP8AAO7u74KFh/z5+QAAAAAAAAAAAUQnBVkz/gEA/wABAAEAAQEBAv8AAP7///7//wABAAHvAwH+AAD6/uj7/AAA/wH/AAAAAAQGBxMREQAAAf8B/wD/AAD/AP8BAAEBAAAB/wAAAP4BAQAAAAD/AP8A/wAA/gEA/wD/AAAAAAEA/gIA/gEB/wAAAAEBAAD/AP8AAP8AAAH/AAECAAAAAAH/AAAAAAD//wD//gH/AAH/AAEAAAD+/wAA/wAAAQABAAEAAf8A/wD/AAABAAL/AAAAAAAAAQAA/wAAAAD//wH/AAAAAP8BAQAAAAD/AQAAAP4BAQAAAQAAAQAAAP8BAAD+AAH/AAAAAAAA//8AAQAAAAD/AQAA/wAAAP8BAAAAAQABAAD/AP//AAH//wAAAP4BAQD/AAAAAQABAQABAP8B/wEB/wIBAAAA/wD/AAABAQECAQAAAf8A/wAA/wEAAQD/AAAA////AP///v7/AAAAAAEAAv8AAQAA/wAA/wAA/gABAP4AAQAAAf8BAAAA/wD/AQAAAP//AAD//wD/AAD/AP////4AAQAA//8AAAAA////Af8BAAH/AAEAAf8BAQECAAEAAAH///8AAP//AP8AAP8BAAEBAAD+AAEAAAAAAQEBAAECAQD///8AAQABAAEAAQEBAAD///8BAQAAAP8AAAEAAAAAAQAAAAEAAQAAAAAAAQAAAP8AAAAAAAABAQH/AAEBAAD/AP////8B/wACAAAAAP///wEBAAEBAgAAAAAAAAAAAQABAv8BAAEAAQABAQD///4AAAAAAQAA/wAAAAAAAAD//wABAAAAAQAAAAAA/wH/AP8AAAD/AQEB/wAAAQH/AQEA/wAAAAAAAAEA/wD/AP//AAAAAf//AP8AAAD/AQABAAAAAAEAAP8A/wAA//7/Af8B//8AAQACAAH//wABAAAAAQD/AAD///8BAAD//wAAAP///wD//gAAAP8AAf///wAAAAABAAAA/wAAAf8A/wAAAP8A//8B/wAAAf8AAP8BAAAA/wD+AQAAAQAB/wAA/wAAAQEAAQEAAAAAAAAAAP8BAAABAQEBAAH/AQD///8AAAAAAAD/AP//Af8BAQEA//8AAAEAAAABAQH/AQAA//////8B/wEAAAEBAAAAAQABAQABAP8BAP8AAAAA/wD/AAAB/wACAAAB//8B/wH/AAAAAAAAAQEAAAIBAAH/AAEA/wEC/wABAAEAAf8B/wD/AAH/AAEAAAAB/wAAAQAAAQAAAQAB/wEAAQAB/wD/AAAAAAAA/wD/AAAAAQD/AQEAAgAB/gAAAAD/AP8A//8BAf8BAAECAAEBAP8BAAECAQEB/wAA////Af8B////AAD/AP///v///wH/AAD///8BAQAAAv//AAEBAP8AAAD/AAD/AQH///8AAAAAAAAC/wEAAQEAAf8BAAEBAAAAAf4AAAEAAP//AQABAP8AAf8AAAEAAQEAAAABAP///gAAAQAAAAD/AAAAAP8BAAEBAQAC/wEAAAH/AP//AAAAAQAAAAAA/wAAAQEAAAAAAP8AAQECAP8B/wD//wH/AAAA//8AAP8A/wABAP///wAAAP8AAQD/Af//AQAAAAABAP8A/gAB/wABAAEAAQABAAIAAP8A/wAB/wAAAAAAAAEAAAEAAAD/AP8CAP8BAAAAAAABAQD/AP8AAAEAAAAAAAAA/wABAAH//wABAP8AAAABAf//Af//AP///wAA/wABAAEB/wEBAAABAAEAAQAA//8B/wEBAAEB/wAAAQAAAQD/Af8AAAAB/wD/AAEBAQD/AQAAAAD//wABAP8AAAD/AQAA//8AAAAB/wIAAQEAAAECAAAB//7/AAD/AQEAAQL//wEAAP8AAAEAAAH/Af//AAAA/wABAQEBAf8AAAAAAQAAAf8AAAABAP8A/wEAAAD//wH/AP8AAP8AAAEB/wAAAAEA/wH/AQD/AAAA/wEA/v8AAAEAAf8AAAD/AP8A/wAA/wAA/wAAAAD+//8AAQAAAQAAAP8A/wABAAD/AQD//wAAAAAAAP6EhYfOyssAAP8AAAAAAAELCAJ6Rf4MBv/+/wAA/wD/AAH/AP8AAAABAAEBAQAA/AMB7QUA/wL+/gPk9/wAAAAAAAAAAAAmJCcdHh4AAQAAAAEAAQAAAQAA/wAAAQAB/wH/AAEBAP8AAAEAAAAAAAL/AQEAAAD/AQAAAQAAAQEAAAIAAQIAAQD/AAAAAQABAf8BAAD/AQAAAAEAAAEAAQABAQAAAgH/AQEAAP//AP8A/wABAgH/AAAAAP8A/wD///4AAQEAAAAA/wACAAAAAAAAAAD/AAEAAAD/AAD/AAAAAf8BAAD/AAD/AAD/AAABAAABAP8BAP8AAAAAAAEAAAAAAQEAAAAAAAAAAAD/AP8AAQAA//8AAQAAAAEBAAAAAAD/AQD/AQD/AQIA/wAB//8AAQAA/gD//////wACAAAB/wD/AAEBAQECAQD///8A/gAA//8AAQAAAAIAAAAAAQD/AAEBAAABAAEAAQAAAf8AAP8AAP//AAABAAAAAAEA/wABAP8AAQECAAL//wD/AQD/AAEBAf8AAQEAAP8AAP8AAAABAQH/AAAAAAIBAQEBAAAB////AAL///8B/wAB/wAB/wABAQEBAQAAAgABAAEB/wEAAP//Af///wAB/wEAAAEAAP//AAAB//8AAAEA////AAAAAAAAAAAAAAAAAQEAAAH/Af8BAAEAAgABAQAA/wEAAAABAP8AAAD//wD/AQH/AQEAAAAAAQEAAAD//wEAAAAAAQD/AAEAAP8AAAEB//8AAP8AAP4B//8AAAAAAP8AAAEAAQAAAP8BAAEBAP///wABAAD/AAH/AAD/AAD///8AAgACAQEAAP///wABAgAAAAEAAAABAAEA/wAAAQEAAAABAf8AAP4BAQACAgAAAP//AAAAAQH/AAEAAAEAAQECAf4A/wEAAQAB/wAAAQEB/wAA//8AAAD//wAA/wAAAAEA//8A////AAH/AQABAQABAAAAAQAA/gAAAAAA//8BAAD/AAAAAAAA/wD/AAAAAAAB/wAAAAEBAQD/AP//AAD//wH/AP//AQD/AAAAAQABAAAAAf//AAAAAAABAP//AAEBAP8AAAAAAQAAAQAA//8AAQEBAf8BAAEB//8AAQAB/wABAAEAAQIA////AAAAAAAA/wAAAAAB/wAAAAAAAQEAAQEB/wEAAP8AAAAA/wD/AQD/AAH/AAABAAD/AAABAgEAAAEAAAH///8A//8AAAEAAQAAAQEAAAEA/wAAAP7/AAAAAQAAAQH+AP///wH/Af8AAAAA/wD/AQAAAQABAf//Af8B/wEB/wAAAQEB//8AAP4B/wAAAP8AAP8BAAAA//8AAAAAAAAAAf8AAAIBAAABAQABAAEBAQD/AAABAAABAQH/AP8BAQAAAAAAAQAAAQABAP8A/gEBAf8BAAAAAAEA/wD/AP8A/wAA/wAAAP8BAAAAAf8BAAAA/wABAAABAQAAAQAAAP4B/wAAAAEAAP7//wAAAgEAAAAB/wD/Af8A/wAAAAAAAQABAf8AAQAB/wAA/wD+/wH/AgAB//8AAAH//f8AAAIBAQD/AQAAAAEBAQABAAABAAAAAAH//wD/AP8AAP8AAP8BAQAAAP8BAAIAAAAA/wH/AP8AAAAAAAAAAAAAAAAAAf8BAAD/AAD//wAAAAEB/wEBAAAB/wAAAAAAAAAAAAAA/wD/AAAAAAAB/wD+AQAAAAABAAD/AP8BAf//AQD/AAEB//8A/wH/AAH//wEA/wAB/v8AAQD//wD//wD+AQEBAAABAQEAAP8BAP8A/wEAAAAAAf//Af8A/wAAAQABAAAAAAD/Af7/AAD/AQAAAAAAAf8BAAD//gD//gEAAQABAAD/AP//AQD//wABAQH/////AP8AAQAAAAAAAP///wAAAAAAAAAAAAAAAP8BAAEBAQD/AP/+AQAAAf8AAAAB/wD+/wAB/wD/AAEAAP8AAQEB/wH/AAIAAAEAAP//AAAAAQEAAAH/AAD/AAD/AP8AAQEBAP8AAAD/AAEAAQEA/wEAAf//AAEB//8As7O2lZWXAAD/AAAAAAAAAQAAdkIDPyX/AQD+AgEA/wIAAP//AP//AAAAAAH/AAABAOsHAO4EAP3/1fT62/j9AAAA/wAAAAAAHh8eBgYE////AQABAQAB/wAAAAEAAAAAAP//AAD/AAAAAAD//wEAAQH/AAAA//8AAAABAAD/AAAAAP////7+AQAAAf8AAAEA//8B/wAAAf8AAAAAAAH//wAA/wAAAP8AAAAAAAEA/wAA/wAA/wD/AQAB/wAAAAABAAECAP8AAAAAAAAAAgAA/wAAAAD/Af8AAAAAAgAB/wH/AP8BAP7/AP8AAAEAAAAA/wD//gEB/v8BAAAAAAAAAQAA/wD/AAAAAAABAAAAAP8BAAAAAAEBAP4AAP///gEA/wD/Af8AAP8BAQD+AAD/AAD/Af8AAAEAAgAAAAD//wAB/wAAAAD//wD//wAAAAEA/wEA/wEAAP8AAAAA/wEA/wD/AAD//wEAAAAAAQABAP4A//8BAAAAAQAAAAAB//8AAAH//wEAAQAA/gD+AQEBAP8BAQD+AP8BAP///wABAAACAAAAAAD/AP8BAAD+////AP8AAAABAAL/AQD//wAA/wAA/wAA/v////8AAP8AAAAAAAEAAAD/AAEBAQEB/wD//wAA//8AAQAAAAAAAQH/AgEBAQABAAEAAf//AAAAAAAAAQD/Af8AAAD///8AAP8AAQD//wEBAQABAAAAAQD/AAAAAv///wEAAf8AAAABAAAAAAD/AP8A//8A/wAAAAAA/wABAf8AAP8CAAEB/wAA//8BAAH/AAAAAP8A/wD/AAABAAD//wABAf//AAAAAAAAAQEBAP8A/wAAAQEAAAABAP4AAAD/AAABAAD+AAEAAP8AAQAAAAEB/wABAAAA/v4AAAAAAAAAAv//AAAAAAD/AAEA//8BAQABAAAA/wD/AAD//wD/AAEBAAD/AAEAAQEAAAAA/wEBAQEBAgAAAf8A//8A/wAAAQABAAEA//8BAAEA/wAAAAAAAQECAgAAAQAAAQD//wAAAQEAAAAAAQH/AP8BAQEAAQAAAQAAAAABAAAC/wD///8BAP8AAP8B/gAAAQD/AAABAAD/AAD/AP8AAAEB/wEAAf8BAP8AAP8AAP8A/wAA/wAAAv7/AAAAAQD/AQEAAAD/AP8AAAAAAAECAAAB/wD//gD/Af8B/wAAAAH/AP//AQH/AQH//wEAAAEA////AAABAP8AAQEBAAABAf8AAf8AAP//AAD//wAAAAEBAQD/AAD/AP4AAQAAAQD/AAAA/wEBAAAAAQD/AAAAAAABAQAAAAAAAAEAAQD+AAIBAP4BAAEAAP8AAP8BAQABAQABAP8AAQEAAf8AAP/+AAEA/gAAAAEBAQAAAAD//wAA////Af8AAP8B/wAAAP8A//8AAAAA/wH/AP8B//8A//8A/wIBAQAAAAAAAAAAAP8A//4A//8B/wEA/wAAAP///wAAAQAA/wAC/gAAAAAAAAABAQIAAP/+//8AAAAA//8AAQAA/wH/AAAAAAABAf8A/wAA/wAAAQH+AP8B/wEBAAD//wEBAP//AAABAAAAAAAB/wABAAAA/wAAAQH/AQAAAQEA/wEAAAEA/wAA//8B/gD/AP8A/wD/AAABAAAA/gAAAAAAAQAAAQAA/wD//wH/AAEAAQD/AP//AP8A/gEAAAAAAQAAAQEBAQEAAQAAAAAB/wEAAf8AAAAAAAAAAQAAAAAAAf8AAAAA/wAC/wH/AP4AAAEAAAAA/wIBAAABAQEAAQABAQAA/wAA/wD//wEB/wAB/wEBAAAB//8BAP8A/wAA//8A/wD/AAABAQABAQAAAv//AP8A//8A/wAAAAEAAQABAQABAAAAAAEAAAAAAAAA////AAEAAAH/AP8BAAAAAQAA/wEAAAAA//8AAAEAAAH//wEA/wAAAAD/AQAA/wAAAQEA/wABAQEBAAAAAQAA/wAAAAH//wL/AQAAAQAAAAAAAgAAAQAAAAAAAQD/Af8BAQD//wD/AAAB/wEAAQAAAf8AAAAAAAABAf8AANLU1G9wdfv5+AAAAAAAAAAAADcgBGs9/AH//wAAAv8A/wAA/wD/AAD/AAD/AAD/AQD/AQLoBf/8AgD+Adr1/fQAAP8AAQAAAAAAADQ0MgAAAgEBAP///v8A/wH/AQD/Af8AAAAC/wAAAf//AAAAAAH/AQAAAAAAAAEBAAH//wEAAQD/AAAB/wACAgAAAP8B/wD/AQEAAAEBAAABAAD//wD/AAIAAAAA/wABAQABAP8AAAAAAQEB/wD/AAEAAAD/AAAA/wEA/wEAAAAAAQAAAAIA/wABAAABAAAB/wAAAP8AAAD/Af8AAQABAQEAAAEAAQAAAAEBAAH//wIBAP8B//8A//8A/wD/AAD/AAH///8BAQECAAD/AAAAAf8AAQABAAEAAAD/AP8AAAEAAAD/AQAAAAEAAAEAAP8B//8BAAAAAgAAAP8AAAD/AAD/AQD///8A//8BAAH/AAAAAAH//wH/AAEBAQEAAQEAAP8BAP8AAAABAQEB/wH/////Af8AAAEA/wAAAQH/Af8AAAD/AAD/AAEB/f8BAQAAAQABAQEAAP8A/wABAQAAAAEB/wEAAQEAAf8B/wAAAAD/AAD/AAACAAH/AP8B/wH/AQABAAEA/wAA/wD///8AAgEBAAABAAAAAQEAAAEAAf8AAQABAQD/Af4A//8AAP//AP8BAQAA/wAAAP4AAQAAAAAAAQD/AP8AAf8B/wH/AP8A/wD/AAABAAH///4BAQEAAQAB/wAAAAAAAf//AQEBAQEBAAD/AAD/AAEB/wABAQAA/gD//wEAAAECAAD/AQEAAP8BAAD/AP8B/wABAQAA//8BAP8BAAABAAD//wD/AAAA//8AAAABAAAAAAAAAQAAAP8AAP8AAAEAAP8AAAAA/wH//wD///8A/wAAAAAAAP8BAAEAAAD/AQD/AAAA/wAA/gEA/wAAAf4AAQEBAQAAAAECAAH/AAAAAAAAAQD//wABAAAA//8BAAABAAEBAf8AAAAB/wAA/wABAQH//wABAP///v4AAQAAAAAAAQEBAP//AP8A///+AQEB////AQD/AP8A/wAB/v8A/gABAQEBAAAAAQABAQEBAP8AAQAAAQH/AQH/AgABAQH/AAH9AP8B/wAB//8C/wABAAEBAAEBAQAAAAAAAP//AQH/AQABAQABAAAAAAAAAAAA/wH+AAABAv8AAQAAAP8AAQEBAgEAAAD+//8AAAD/AAAAAAAAAAABAAAAAAABAAAAAAAAAP8A/wABAQAAAf//AP8BAgH/AAAAAAAAAAAAAAEAAQEA/wAAAP8AAAD/AQAAAP//AQD/AAD/AAAAAQD+AAABAf8A/wABAgABAf8AAP8BAP//////AP8A/wAAAQD/AAEBAP8AAP//AAAAAAAAAAEAAAAAAQAA/wABAAABAAEBAP8A/wAAAAABAQEA/wAAAAH/AAAAAf8AAP8AAP8BAQEBAAEAAAH+/wEBAAAAAQH/AQAA/////wAB/wAAAQAAAQEA/wEAAQEBAAAAAAD/AAD/AQH+AAAAAAD+AP8B/wAAAAAA/wAAAQAA/wD/AP8AAAH/AP8AAP8A/wAAAAEB/wH//gD/Af8AAf4A/wABAAAAAAIAAAAB/wAA/wEAAAH/AP8BAAACAQAAAAAAAAEAAAAAAAD/AP//AQAAAgH/AQD///8BAAAAAAAB/wH/AAAA//8BAP/+//8AAQAAAQABAAAA/wAAAAABAAABAAAAAAH/AAAA/wABAQAA/wIAAQABAAD/AAAAAAD/AP8A/wAAAAAA/wAAAAD/AAAAAAD//wEA/wABAAEA/wD//wABAAEBAAAAAf8AAQAB/wABAAAAAf//AgABAAEBAAAAAAD/AQAB/wEA//8BAAAAAAEAAAABAAEBAAD/AP//Af8AAAD///8AAAEAAQEAAAAB/wD//wD+AQD//wD/AQD/AQD+Af/+Af7/AAABAAAA//8BAf8AAAABAQH/AAD/Af///wEAAAAAAAD/AAD//gAA/wABAgAB//8AAQAAAf8BAAEAAAAA//8AAP8BAP8AAP/08vN1dHbg3toAAAAAAP8AAAAJBQF6SP8SCQD+AP////8AAAAB/wEBAf8BAQEAAQEBAAAB8QQB5AkBAAAAAADZ+vwAAP4BAP8AAAAAAAApKSkBAQAAAAECAAEA////Af8AAQAB/wD//wEBAP8BAQEAAP8AAAD//wEA/wAAAAAAAAD/AAEAAQEA/wEBAP8A/wAB//8AAP8AAQAA/wAA/wD/AAEAAQD/AAAA/wEAAAAAAAAAAAAAAP///wEBAQD+AP8AAgH/AAAAAAD/AAAAAP8BAAACAAAAAAAA/gEAAAEAAP8AAAAB/wAAAP8AAP8AAQAAAP8A/gD+/wAA/wH+/wAA/wAAAAAAAQAAAf//AQD/AQEBAP8A/wAAAf8A//8BAP8A//8A/wACAAEAAP//AAAAAAAAAAAAAAH/AAABAAEA/wAAAP8AAQAAAAD/AP8AAAAAAAEAAAEB//8AAQAAAP//AQEAAAD//gD//wD/AAAAAAAAAP7/AP8AAP//AAEBAP8A/wAAAAEAAAAAAAAA/wAAAQEAAAAAAAIBAAD/Af7//wAAAP8AAAAA/wAB/wAAAAH/AQD/AAABAQH/AAABAP8AAQEB/wAAAf8BAAH+AQAB/wH//wH/AAH/AAAA/wD//wD/AP8BAQAA/wD///8AAQD+AAD/AAABAAAAAQAAAQEAAAAAAP8A//8BAQAAAAAAAAABAP8BAP8B/wEA/wAAAAEAAAD/AAH/AQEA/wD/AAH/AAEB//8AAAAAAAH//wABAAEBAQD/AAAA/wEAAAABAAEAAAEAAAAA/gD/AAAA/wAB/wAB/wAAAAEBAAABAQEBAAECAAAAAAH/AAD/AQD/AQAAAP8AAAAAAAAAAf7/AQABAAEAAAD+AAEAAAD//wAAAAH/AQEBAAEBAAAAAP///wD+//8AAf8A/wAAAAEAAQEA/gABAP8C/wAA//8BAP///gH+AgAAAQD/Af4BAQAAAAD/AQEAAAAAAAD/AAAAAAAA/wEBAAD//v/+AQAA/wABAAEBAP4BAAAAAQAA//8AAAABAAEBAf8AAP8BAf8AAf8BAAD/AAAB/wL/AAD/AP8AAP//AP//AAAAAQD/AP/+AQD+Af8B//4AAQEBAQAA/wH/AAAB/wH/AAAA/gAA//8AAQAAAAABAAD/AP///wD//wD/AAD/AAD/AQD/AQAAAP8BAP8CAAEBAP8AAP////8AAwEBAAAAAAH/AAH/AP8A/wAA/wAAAAAAAQD/AQAAAAD//wABAf8A/wD/////AQABAgAA/wAAAf8A//7/AAH/AQAAAAEAAP7+AP8AAf8AAQD/AP8AAP8BAAAAAP4AAAEA//8A/wAAAP8B/wEAAgEAAQABAQH/AAD/AP///wAB//8A/wD/AAD/AAAAAAEAAf8AAAEB/wABAAD///8AAQEAAv//AP7/AQIBAQAAAf//AP8BAQABAQAAAP8AAQAAAAEAAQAB//8AAP8AAgD/AAAAAgEAAAAAAf8AAf7/AAD/AAAB/wAAAAAB////Af8AAf8B/wAAAgAAAAIAAQAAAAEA/wAAAAEAAf8C////Af8BAP//AAABAAD/AAAAAQEAAP8CAP8C/wEAAAAAAAD/AAAA/wAAAAEAAQABAQABAAAB/v8AAf8BAAAAAAAAAAD/Af8AAAAAAP8A/wAAAQIAAAD/AAAAAAEAAQAAAAAAAQAAAQAAAAAAAP8A////AAEAAQD//wAAAP//AAH+AQEAAAECAP8AAQH/AP8BAQAAAQEAAQAAAf8B/wAAAAH//wEAAAD/Af//AAAAAQEAAAEA////AAAAAgAAAAAA/wH/Af4BAAAA/wD//wD///8AAAAAAAH/AQEAAAABAf8A////AAAAAAAB/wD+AAAAAAEA/wABAQAAAP8BAP8BAQIAAQEAAP//AAEA/wL//wAAAAD/AAAAAQAAAQAAAv8BAgABAQEAAAAAAAH///8AAQAAAP//AQEAAAAAAgAAAP//AQAAAQD/AQEBAAAA/v8A/wAAAAAB//8A/wD///8AAQEAAAAB/wAA//8Al5eZu7q5AAABAAAAAAACAAABaj0CSyf8AQD/AQABAQEAAP8B/wEA/wEB/wAAAP4A//4AAOUHAO8F/wAC/Pz/wvH3AQAB/wAAAAAADg8QMTIw/wD/AAAA/wAB/wACAf8B/wD/AAAAAAEA/wAAAP//AAAB/wH/AQH/AQAAAAAAAAEAAP8AAAAAAAD/AAAB/wEAAAEC/wAA/wAAAAAB/wAAAAH/AP8AAAEBAAAB/wD/Af8AAQABAQAAAQEAAAAAAAAAAAD/AQEAAAAAAAEAAAAA/wABAgAB//8AAAEAAAAAAAACAAAA/wAAAQEAAAAAAAAAAAAAAgIAAgAAAAAAAgAAAQABAgABAP8BAP8BAQAAAAAAAAAAAP8BAAAAAQABAAD//wEBAAEA/wAAAQABAQD//wD/AAAAAAEAAAEAAP8A/wEBAQD/AP8AAAAAAAABAAAA/wEAAP///wAA/wAAAAABAP///wEAAQEAAQAAAAEAAQAAAf8AAP8BAAAAAAAAAAAAAP8A/wH/AAD/////AAEAAf8AAAAA/wAAAP8AAQABAQH//wABAAEAAQH//wH/////AAD/AQAAAAABAf8A//8BAAAAAAAA/wAB//8AAQH//wEAAAAAAf///wAAAAD/AP8A//8B/wAAAAH/AQIBAf8AAgEAAAAA/wABAP//Af//AAD/AQEBAQEAAP//AAEA/wAAAAAAAAAAAAEAAAL/////AAAAAAAAAf8AAAAAAP/+Af///wEAAP/+AAD/AQEBAf8AAP8AAQAA/wAA/wAA////AAEAAAEA/wEAAAAA/wEAAAAAAAIBAf8AAAH/AP8BAAAAAP//AP/+AAAAAf8AAQAAAf8B/wAAAAEA/wAAAQAAAAH/AAAAAQH/Af8AAAECAP4AAP//AQAA////AQABAgABAgEBAf8BAAEAAQEB/wAB/gIBAP8B/wD//wEB/wABAAEAAf8A//7///8BAAABAAAAAQAAAP8AAQAAAQAAAQD/AAD//gAAAQEBAQABAAEA/wEAAAAB/wEAAP8A/wEAAgEAAAD//wEAAAABAAABAAAA/wABAQABAAL+AQAAAQABAQEAAf8AAAAAAAAAAAH/AAAAAQAA/wEA////AAEAAAEAAP8CAAH/AQAAAAEAAAABAAAA/wAAAP///wAAAgAAAQAAAQAAAf//AP4AAQAAAf8BAAEA////AP8CAAAAAQAA//4B/wAAAP//AAD/AQAAAAAB/wEA//8BAAD/AAEAAQACAAH///8AAQEBAQEAAQAB//8AAAEBAP8B/wEAAQD/Av//AQAA/wEBAv8AAAAAAAAAAQEBAAAB/wD/AAAA/wAAAAAAAAH///8A/gEAAQAA/wD/AAAAAQEAAQABAgAAAAABAAIAAgAAAQABAAD/AQAAAAAAAAEBAP8AAQAAAAD/AP8BAf4AAAD/AP8AAAAAAQAAAAD///8BAAEAAAAAAAD/AAD//wAAAAAAAP//AP8BAP//Af8A/wAAAP8C/wABAAEAAAD/AQEAAAEAAP8AAAAB/wAAAAABAAAA/wAAAAEAAAEAAP//AAAB/wEBAQEBAAEBAf4A/wAAAQAAAAAA/wEAAP8A/gAAAQABAAAAAP8AAP8BAP8A//8A/wABAAAA/gAA/wAB/v8BAP8A/wAAAAABAAD/AAAAAAIBAQAAAf//AQD/AAD/AP8AAAAAAP8AAP8BAAAAAf8AAP8AAQABAP8AAAAAAAAAAgD/AgAAAAEA/wAAAP8AAP///v8AAP////8AAAABAAEBAAD/AQH/AQAAAP8AAf8AAAEAAAAAAAABAf8AAAABAAAAAQH/AQAC/wABAAEAAQAAAAAAAAH/AQD/AP//AP8A//8AAAEBAAAAAAAA/wEAAgAAAAAA/wAB/wAAAQAB/wEA/wEAAP//AAABAP8AAAH/AgEBAAIAAQABAQAAAAABAAABAAAAAf//AAAAAP//AQIAAP8BAAAAAQAAAAD/Af8B/wAAAP8B/wD/AAAB/wABAAEB/wEAAAAAAAEBAQAAAQABAAD/AAAAAAH/Ab6/v4iKiwAAAQAAAAABAQABAT8jBHxF/gIDAv8AAAAAAQAAAAAA/wD//wAAAQAAAAEBAAH7AgHhCgD+AQEAAOT5/NT6/P4AAAAAAAAAATc1NicmJgIAAQD//wAA/wEAAP8BAAD+/wABAAH/AQEAAAAAAQAAAAH/AAAAAQABAAD/AP8AAAAB/wAA/wEAAQAA/wEAAP///wAAAAEAAAAA/wEAAAH/AP8AAAD/AAABAAIAAP8AAAD//wABAAD/AQAAAAEAAQEAAAAAAAAAAAEAAAAAAAAA/gIAAAD/AP8AAQEB//8B/wAA/wEBAAD/AAAAAQEBAAAAAf//AQEAAAAAAP4CAP8AAP4A/wAB/wIBAAAA/wAAAAAAAP8B//8AAf8AAAAAAQEAAAAAAAAAAAABAP8BAAABAQABAQAAAAD/AAAA/wH//v8AAgAAAAEAAAEAAAEAAAD/AAEBAgEAAQH/Af8AAQAAAQIAAQAAAAABAAH/AP8AAAABAQEAAP//AAEA/wABAQACAQH/AQD/AQECAQD/AAAAAP8AAAEAAP8AAAAAAP8AAgEAAAAAAP8AAAH/AQEBAQEAAP8B/////gABAAEBAAAB/wAA/wH/AAABAAD/AQD//wEBAAACAQIBAQAAAAAB/wH/AAAA//8AAAAA//8A///+/wAAAAEA/wEAAgAAAAAAAP8AAQAAAAAAAf//Af8A/wABAQAAAP//AAD/AAEAAAEAAQEAAP8BAAEA/wAAAQAAAgD/AgECAQEB///+/v8AAAABAAAA/wAAAAD//wACAgD///7/AAH/AAABAAH/AAAAAQD/AP8BAf//Af8A/wAA//8BAAEAAgABAQABAAAAAP8BAAEA////AP//AQAAAQAAAQEA//8BAP8B/wAA//8CAAEBAAAB/wABAQABAP8B/wAAAP8BAAH/AP4A/wH//wEA/wABAAIBAQEAAAAAAAAA/wEBAQEBAQIAAAEAAP//AP8AAAEA/wAAAP8AAP8AAP8BAAEA/wAAAAABAAD/AAEA/wAAAQIAAAABAAAAAf8A/wABAQH/Af8A/wH//gD/AQEA//4AAAAAAQAAAAD/AAAA//8BAAH/AAEAAAEAAQAAAP8AAAAAAQEA//4AAAAA/wAB/wAAAAD/AAAAAAEA//8AAQEA/wABAQEAAP4AAP8AAQABAQABAQEBAAABAAABAAD/AAAAAAEB/wEAAP8BAQABAAEA/wAAAAEAAAAAAP8B/wEAAAAB//4BAQH/AP8B/wEA/wEBAf8A//////8AAAEAAAD//gAAAAIAAAEAAP4BAv8BAAEAAAAA/wH/AAAAAQAAAf//AP8AAAAAAQEA//8BAAD/AAAAAAH/AAD/AAEAAQAAAAD/AP8AAP8AAAABAAAAAP8BAQABAAAAAP8AAAAB/////wD///8BAQH/AQD/AAADAgH/Af8BAAD///8AAP//AgEB/wEAAAAAAQEB//8AAQABAQACAf/+/wEBAAAB/wABAQH/AAAB/wEAAf8AAP4BAf8AAAAAAQAAAAD/AAABAAAA/gD+/wH/AAD/AAD/AQAAAAAAAAEAAAEAAQAAAP8BAP//AAD/AAD//wEAAAABAAEB//4AAAD/AAABAAAAAf8CAQEBAQAA/wAAAAAB/wAAAAEB/wAAAAEBAAAAAAAAAAH/AAD+//////8BAQABAAAAAQABAAD/AAAAAAABAAEA//8AAAD/AAD//v8AAQAAAAD/Af//////AAEAAAH/AAAA/gABAQEBAAABAAECAQD/AAABAAEAAAH/Af8BAAEAAAABAQEAAQAAAAAA//8BAAD+/wD/AAAAAAAA/wEA/wD/AAD/AAAA////AP//AAAAAQEB/wEAAAD/AAAAAAAAAQAAAAAAAAD/AAEBAAAAAQEA/wAAAQD+AAAAAQEA/wAA/gD/AP8BAAD/AP//////AAD//wEA/wEB////AQH///8AAQD/AAAA/wAAAf///wAAAP8BAAAAAAAAAAAAAgAAAAAA/wAA/wEAAAEAAAAB/wAA/wABAAD/AAAAAADR09NoaW7w7u4AAAAAAAEA/wAYDgCHTPwPCf////4BAAAAAQD/AP8A/wAAAAAA//4AAP8AAP7/6wYA8QMAAv7//f/D8/jr/v4AAQABAAABAP86PDsBAAD///8AAQEAAQAAAAD///4BAgL/AAH///8AAAH/AQABAQAAAAEB/wD//wD//wAB/wAAAAAA/wD+AQAA/wAAAAACAAABAAAAAAAAAAD/AAD/AQEBAAAAAP//AP///wEBAAD/AQAA/wAAAAD//wD///8AAAAB/wEA/wEBAAAAAAAAAAICAAABAQAA///+/wAB/wEAAAEB//8AAP8AAAD//wABAP//Af7+AP8AAQAB//8BAAAB/wEBAAEAAAAA/wH/AAD/AAABAP8BAAAAAf8AAQABAAAAAAAAAQAAAAECAAEBAAAA/wD//wABAQAAAAEAAAEB//8A//8AAAAAAAD/AAABAP//////AAD/Af8CAP8AAf////8AAAAAAAAAAAEBAQAB/wAAAAABAQH/AQH/AP//AAD/AQAAAQEA/wD/AAD/AQABAQD/AAABAAD/AAEA////AAAAAQABAAD/AP//AAD//gEA/wEBAAH/AQAAAAD//wEAAQEBAQAB////AAABAAH//wD//gD///8AAAAAAAEAAQABAAIA/wAAAAEAAAAAAQABAAD/AgIAAAAAAQEAAQEB/wH//wD/Af8AAP8BAAD///8AAAEBAQAAAgEAAQH/AP7/AAAAAAD/AAEBAAD/Af8AAP7//wD//wAAAQEBAQAA/wD/AQEA/wAAAAEBAP4AAQABAP//AAAAAAAAAQAAAAAAAQEAAP8AAAAAAAD//wAAAAH/AP8B/wD+/wAAAAAB/wAB/gAAAP8AAAD/AAAAAAAAAAEB/wABAQEB/wAAAf8AAAAA/wAAAAAAAP8AAP8A/wAAAAAAAAABAAD/Af8A/wL//wD+/wD/AAEAAP8BAAL/AQD/////AQD//wAAAAAA//8AAQEAAAAA/wAB/wEB/wEAAQEAAAD/AP8AAAD/AAEAAAD+AAAA/wAAAAD//wL//wAAAQAA/wH/AAEAAQD//wICAAD//wAB/wH/AAD/AAEBAQAAAQAAAQD/AAAAAAABAAABAAD/AQEAAAAA//8BAAAB/gH/Af8AAQD/AQD/AP8AAQH/AP8AAP8BAQABAf8AAAD/AP8A/wD/AAAA////AAD/AQD//wD//wAAAAAB//4AAAEAAAD/AQH/AAABAAEAAAAAAAEC/wEAAAAAAAD/AAIA//8AAQEBAAEA////AQAAAAEAAP/+/wH/AAAB//8B/wAAAAAAAQEAAQEBAf8A//8BAAABAQH/AAAA/wEB/wD/AAABAAAA/wAAAQD/AP8A//8AAAABAAH///8AAAAAAf8A/wAA//8AAQAAAAEA/wABAP//AQEBAAEAAAABAAAA//4BAP4BAAD/AQABAQEBAP//AAAA/wH//wD/AAEBAAAAAAEA/gABAQEA/wABAAEA//8AAQEAAAAAAP8BAAAC/wD/AAEAAAABAf8AAQAA/wAA/wH/Av8A/wAAAf8AAP8AAAAA/wH+AAD/AP8AAP8BAQABAAD/AAAAAQAAAAAAAAABAAECAP8BAQEAAQAAAP8A/v8A//8AAAAAAAEBAAEBAP8B/wAAAQAB/gABAP8AAAD/AQABAf8AAQAAAAABAAEA//8AAAAAAf8AAQEA///+AAEAAQAAAQD/AAEBAf4B/wAAAQAAAQABAf8AAAEAAP8BAAAAAAD/AQAAAQAA/v8AAP8B////AP//Af4B/wAAAAAB//8A/v8B/wABAQAAAAAAAQABAQAAAAEAAAABAAAA/wAAAQEAAQECAQEAAQEBAP8AAAH/AQEAAQAAAAD///8AAAH/AAAAAP//AAAAAAAAAQEA/wAAAgAA////AAEBAgEAAgAB//8BAAEBAQAAAP8AAQD/AAD+/wABAP//AQABAgABAAEAAAEAAP4BAAABAAAA////AQEAAQABAP8AAP8AAAAAAAEAAAEAAAH/AAH/AAH//wD//wEA7e7sbW5y3NraAAABAAABAAAABwYAjU4BNyAAAf//AP8A/wABAP//AP8BAAEAAAEBAAABAAAB/vkEANgMAfoBAP4BAP//v/b4/wAB/v8A/wAABgkKTExKAQEBAAEA/v8AAAAA/wEAAgECAAD/Af/+AQIB/wH/////AAAA/wEA/wH/AAAAAAIA/wAAAP8A/wEAAf8AAAEA//8A/wEAAAAAAP8AAAABAQEAAf//AAEAAAAAAQAAAAD/AAAAAQAA/wEBAAH/AAAAAQEA/wAA/wD+AQH//wABAQEB/wH/AgD//wAAAQEAAQABAP//AAAAAAABAf8AAAAAAAAA/v8AAP8AAP8BAAAAAAABAQAAAAEA/v///gAAAQIBAQAAAAAA//8BAP8A/wAAAP8B//8AAAAAAAAAAP////8AAP8A/wABAQD/////AAEBAAEBAAAAAAEBAP//AAEAAAH//wEBAQAAAQAAAP8A/gAAAAAAAQEAAQAB/wAAAAD/AP8B/gEA/wEAAP8AAQABAf8BAf//AAD/AAAAAAD/AAABAAD//wABAP8AAAEAAf//AAAAAQAAAP4A/wABAQABAQAAAQEAAQEA/wH/Af/////+AAEAAP////8A/wABAQAAAAH/AQEAAAEAAAEBAQABAAAAAAH/////AAAA//8AAQEBAQAB/wEAAf/+AAAAAQAAAP///wD/AQEBAAAAAQAAAAEBAQAB/wAAAP8A//7//v//AAACAP8AAQAAAQAA/wAAAP8BAAAA/wEAAQACAQD/////AAH///8AAAIAAAAAAP8BAAABAAABAAEAAAAA/wAAAAEA/wD/Af8AAQAAAAEAAQAAAAD/AQD/AAEAAgAA/wEC/wEA/wEAAQAAAQEAAf//AP8A/wABAAAAAAD/AAAAAv8AAAABAAABAgAAAP8BAP4A/wD/AP//AAH/AP8AAP8CAQD+AQEAAAEAAQAAAP8B////AP//AQEBAf8AAAEBAQAAAAAA/wD/AAAAAQEAAAH//wAAAAAB/wEAAP8BAQAAAQAA/wEAAAD//wABAQAAAAH/AQABAP8AAAAAAAAA/wAAAAH/AAAAAAAAAAH/AAEAAQAAAP8BAAAAAAAAAf8AAQAB//8B/wAAAAAAAf8AAAAC/wAA/wIAAP8B//8BAP8AAf8AAP8AAgABAAAA//8AAAAAAAD/Af///wD/AP8AAAAAAQAAAf8AAAEAAQEA//8AAAEB/wAA/wAAAf7/Af8AAAD/AP8AAf//////AP8AAQAAAQD/AAAAAAD/AAAAAAABAf///wD//wEBAQEAAP8BAAEAAAH/AAAAAP///wD//wAAAAEAAQAAAP8BAAEAAQEAAAAAAf8AAAAAAAIAAAAAAAABAQIC/wAAAAEAAQABAAD///4BAAH//wAA/wAAAf//AAD/AAEAAAAAAAD/AAAAAAEAAQABAAEAAAD/AQABAP//AAAAAP8AAAH/Af//AAABAAEBAAD//wH/AAEA/wAAAP8AAQEAAAEAAP8A/wAAAAABAAAAAQAAAQEA//4BAP8AAAAA/wEAAQABAAIAAAAAAAH/AAEBAQH/AQEAAAD/AAABAAAAAAEAAAEAAP8BAf////8A//8A/wAA/wD+AP4B/wABAQH/AAEB/wAAAP////8AAf8CAAAAAf8A/gAA/wEAAP8AAAAAAP8AAAD/AP8A/wAAAQEBAf8BAf8BAf//AQEAAQD/AAAAAAABAQH/AP8BAAAAAP//AAAAAAAA/wD/AAEB/wABAQAAAv8AAP8AAQEAAAH///8BAAABAAACAAABAAAAAAEAAAABAAEAAP8AAP8AAAAAAAAA/wD/AP8A//8AAQEAAP//AAAA/wEAAAD//wAA//8AAP8AAAABAf8AAgEAAAD/AAAAAQEAAQD//wD/////AQEAAP/+/wEBAP/+//8AAf8A//8A/wD/AAAAAAEAAAAAAAH/AQEB/wEAAP8AAP///wD/AAEAAQAB/wD//wAAAAAAAf7/AP//AAABAQAAAAAAAAEA/wAAAAAAAQD/AQD/AP//APz8/Xd2e8PCwgAAAAAA/wAAAQAAAGg5AVkx/AEA/gABAAAAAAD//wEAAAEBAAEAAf//AP//////AALcCwLoBQAAAQD/AOP5+7ny9/8AAAAAAQAA/zc2ODIzMf8A/wD/AQIB/v8AAAH/////AAAAAQAAAQD//wD/AAIBAAD/AAH///8AAAEAAAEAAAEA/wAAAAAAAAAAAP8AAAH/AQD/AP8AAAABAf8B/wD//wH/Af8AAAABAAD/Af8A/wAAAf//AAAA/wAAAAEAAQEAAQH/AQEBAf//AAD//wD/AAEAAQL/AQAAAAAAAQEAAP8CAAAAAP8BAP8BAAAAAQAAAAABAAACAQEBAAAAAAAAAAD/AAABAAEAAQIAAP///wEAAQAAAAEAAP8BAAH/AAABAAAAAAAAAAAAAAAB/wABAf8CAAAB//4BAf8AAQD//////v8B////AAABAgD/AP//AAH/AAAA/////wAB/wH//wH/AAAAAP8A/wAAAAAAAP8A/wD/AAD///8BAAD///8BAP8BAAEAAQAA//8BAQEBAP8AAAAAAAEAAAAA/wABAAABAAABAAAAAAAA//8AAAH+//8AAP///wD/AQABAQEBAgEAAAAAAAAB/wAAAAACAAD/Af8A/wEAAAEAAP8A/wAA/wD/AQEBAAEAAQAAAP8AAP8A/wEAAAD/AP4A/v8AAAEBAAEBAP8AAP//AP8AAAEAAQAAAAIAAP8AAAABAAEAAQAB/gABAP8AAAABAAEBAAEA/wABAQIA//8B/v8AAQAA/wD/AAEB/wEAAAH/AAAAAAAA/wD/AAD//wD/AAAAAP///wAA//8BAAAAAAD///8AAQAAAQAAAf//AAABAAH//gD/AAABAQABAAEAAAEAAP8BAAD//wAAAP8AAf8A//8AAAEAAAAAAP8AAAD/AAACAQEBAQEAAQD/AP//AAAB////AP///wD///8A/wAAAQAB/wEAAP/+Af8AAAAAAAAAAAEBAQEAAQAAAAH/AAAAAQABAAD//wH//wIAAP8A//8AAQEAAAH/AQIB/wD/AAD/AAAB//8BAAAB//8BAAH/AAEAAQH//wH/AAAAAAEA/wD/AAD//gAA////AAAAAAD//wEB/wD/AAEAAAEBAAABAAEAAAD/AQAAAAAA//8BAAD/AP8AAP8AAP4BAAEAAAAAAAAAAAABAQIBAQEAAAAAAAAAAAAAAAAAAAAAAAACAAD/AAEAAAEC/wABAP8BAAAAAAAAAP8BAAABAQAAAQD/AP8AAAAAAAAA//8AAAAAAP8BAQEAAQAAAAAAAP8A/wAAAAAAAQD/AAABAQEA/wABAQAAAf8BAAAB/wH/AP//AQABAAAB/wABAAEA/wAAAAAAAP///wAAAP////8BAAD/AAAAAP8AAQEBAQAAAf8AAf8AAAD/AAIBAAH/AAABAAD/AP8AAP//Af//Af//AAEBAAAAAAAAAAD/AAACAAD//wAAAAAAAAL/AAAAAAEBAAAAAP//AAH/AAABAAH/AAD//wAAAP8A////AQACAf8BAQABAAD/AP8AAP//AAD/AgD/AgAB/v//AAD/AQD/AQAAAQEBAAAAAQD/AQAAAP8AAQAAAAACAAAAAf//AgAA/wIB/wAAAQD//gEAAQAA/wEAAAABAAABAQABAAEAAAD+AQABAQD/AAAAAQD/Af8BAAAAAP//Af8AAAABAQAAAAAAAQD/AAAAAAAC/wH/AQABAQABAAAAAf/+Af4AAAAAAP8AAQAA//4AAP8AAAAAAQAAAQH/AAAB/gEAAf8B//8A/gABAP7+AAEA//8A//4AAAAAAAAA//8AAQABAAECAAAB//8AAAABAAAAAQD/AAEBAQD//wAA//8BAAAAAP8BAP//AAH/AQH/AP8A//8AAAIAAQEBAAEA////AQEA/wEAAQAAAP8BAAABAAAAAAEAAAEAAAAAAAH/AQH/AAH/AAEBAAEAAAEAAQD+AP8AAQH/AQEAAAH/AAEBAQAAAP8AAAD/AAEAAAD//wABAP8A/wD/Af8AAAEBAAGOjpCfnqAA//0AAAAAAAAAAP5SLgJ8Rf0AAf4BAAD//wAA/wEB/wD///8A/wD/AgEBAAAAAQEB8AYB3QoA/wP//wH+///G8ffo/v/+AAEAAQAAAAJAQD0BAAAAAAABAf8A/wIA//8AAAAAAP////8AAQD/AAABAQD//wAAAQAAAQAB/wH/AAD///8AAAEBAAAA////AAABAP//Af4BAAABAQEAAP8BAAAAAAH/AQABAAH/AP//AP8BAQH/AP8BAQAAAAEA/wAAAf//AAAAAf//AAAAAAD/AQH/AQAA//4CAAABAQAAAP////8B/wAAAQAA/wD//wAAAP4AAAAB/wEB/gD//wAAAP8BAAD/AQD//wD/AAH//wAAAP//AP8BAAAAAAABAAAAAQAAAP8AAAAAAP8A/wAA/wAA//4A/gABAP8CAAACAf8AAAABAAAA/wEAAQAAAf8AAQABAAH/AAD/AQAAAAEB/wD/AQH+AP/+//8AAAAA/wD//wAAAAAAAAAAAQIBAAH/AAAB/////wD/AAAAAAABAAAAAP4CAAAB////AAEAAAAAAAABAP8AAP//AQAB/wAB////AQEBAP8AAQABAAD/AP8AAP8B////AAEBAAABAQAA/gD/AAAB/wD/AP//AP8BAQAA/wABAP8A/wD/AAAAAQAAAAEBAAH/AAD/AQEBAAEBAAD/AAD//wAA/wABAQEAAAEBAP4AAAD/AAAAAAAA/wIBAQAB/wD///8AAAAA/wAA/wAAAQAA/wD//wAA/wEBAf//AQH/AQEBAAH/////AQEAAAD//wEAAQABAQEBAQABAAAAAQEA/wEB/v//AP8BAQAAAP8BAAAAAAABAAAAAAAA/wABAQAAAP8A/wH//wD/AQAA//8AAAAA/wAA/wAAAQD/AAH/AAD/AP8AAP//AQD//wD//wAAAf//AQABAgEAAAAAAQECAQABAQEB/wAAAP8BAAL///8AAf//AQD/AP4AAAEA////AAD/AAD+AAH/Af8BAAAAAgD/AQEAAAABAQEBAP8A//8AAP//AAD/AP8AAQD/AAABAAAAAAEA/wH/AAAAAP3+AAEAAf8AAP8B/wH/AQABAQD/AAIBAAAAAAD/AAAAAP8BAAD/AAAAAP8AAAAAAAAAAf8BAAABAf8BAAEAAf8BAP8AAQAC/wH/Af8B////AP8A///+//8AAAEAAAAAAP8AAQAA/wD+AAEC/wAA//8AAAAB/gIAAAEBAAAA/wD/AAAA/wAA//8BAP8AAP8BAAAAAAAA/wEAAQD//wD//wH/AQAB/wAA//8BAAABAAAAAAAAAQAAAP//AQEA/////wAAAAAAAAAAAAAAAf//AAEAAAEA/wD//wAAAAEB/wAA/wEAAAEBAQEBAAEAAP8AAQABAAD///8B/wAAAAABAAIAAAH/AAEAAAAA/wAAAQEA/wAAAAD/AQAAAf//AAAAAAABAAAAAAAA/gD/AQAA/wD/AAEAAAAA/wD+Af8AAQAAAAD///4AAAEAAQAAAAH+AAEA/wEAAf8AAP8B//4AAAABAQABAAABAAAAAP8AAP8A/wEAAQD/AAAAAQABAP7//wAAAf4AAf8AAAABAf8AAQEA/wAAAAABAQAAAAH/AAEB/wAAAQEAAP8AAQIAAf///wAA//8AAAEAAAD/AQAB/wD/AQD/AQAAAQAC/wAA//8AAP//Af/////+/wD///8AAAEAAAAB/gEAAAAAAAAAAAD/AQAAAQABAAAAAQEB/wAAAAEBAAAAAAEA////////AgIAAAIAAP8B/v8AAAEAAAABAgD/AAAAAAIBAAAAAQABAAAAAAAA/gD//wAAAAL//wAA/wAAAf8BAP8AAP8AAQEAAQEC//8BAP8AAQEAAQH/AAD/AQEAAQAAAAD+AAD/AAD/AAABAQABAAH/AAAAAAAA/wEB/wAAAAH//wH/AAAA/wD/AAEA//8AAQD/AAD/AQD///8AAf8AAQAAAQEAAAD/AQD/////AAEAAP//AQD/AAEAAAAB/wABAAEAAf8BAP//qamrgoKF///+AAABAAD+AAD/RyYEm1n8Egr/AAAAAAAAAQEAAAH//wEAAAAB//8AAP7//wAAAP0BANcLAO8EAAAAAQAAAf3/t/X3AAABAAAAAP8AAAAAREVD/wAAAAAA/v8A/wH/AQAC/wEBAQAAAAEA//8AAQEAAP4AAQABAP8A//8BAAD+AQAAAQAB/gAAAAAAAAABAQAB//8BAf8C/v8B/wD/AP8AAAAAAAEBAAH/AAAAAf8CAQAAAAABAQEAAP8AAP//AAAAAP8A/wD+AP8BAAABAAAAAf//AP8AAAECAgEAAf8AAAAAAAEBAQABAP4A/wEAAQEBAAABAAAAAAAAAAAAAQIAAP8C/wABAAAAAgABAgEA/wAA//8BAP8AAP8AAAEAAP8AAAAAAAD//wH///8B/wAAAAEBAAEBAQEAAP8BAP8A/gAB/wEAAAABAAH/Af8B/wAAAAD//wEAAAEAAP8BAQD//wEBAP8AAQAAAQAA//8AAAIAAQH/Af8AAQAAAf//AP//AAD///8AAQEAAP8A////AAD/AAAAAAABAAEAAgIAAAAA/wAA//8B/wABAf//AAEA/wEAAAAAAAICAQABAAAAAP8B//4A/wEAAAD//wAA/wABAQEAAAD+/wEBAQIBAf8BAAABAQEB/wAA/wH/AQEAAf8AAQD+AP8A//4AAP8BAQEA////AP8AAAEAAQEAAAEAAQAA//8B/wEAAAH/AQEBAQH//gAA/wEAAgACAv8AAAH//wAA/wAAAAAAAP8AAQEB//8BAQAAAAAA//7/AQEAAQD///8AAAAAAAEA//8A/wAAAAH/AQD/AQEA/wIBAQEB//8AAP8A/wAA/wAAAAH/AP8AAQEA/wD/AQABAP//AAEAAP//AAAAAAD//wEAAQEAAP8BAAD///4AAAAAAAEAAQEAAQEAAQEA/wABAQABAP//AP//AP8B//8BAAAAAAH/AAEA/wD+AQAAAAEAAv8BAf8BAAD+AAAAAP8AAAD/AAD/Av7/AP8AAf8AAAD//wEA/wAAAAAAAAAA/wEBAP//AQAAAP8AAf8A/wEAAQAAAQD/AQEBAf8CAQD/AAABAQAB/wAAAAAA/wAAAP///wAAAAD/AAAAAP8CAAEBAQAA/wAB/wD/AAD/AAAA/wAAAAABAP/+/wEBAAEB/wD/AAEBAQAA/wAAAAAB/wECAAEAAAH/AAEAAAAAAP8AAAH/AQD///8A/wEB//8B/wH/AAD/AAAA/wEAAAD/AQEAAQH//wD/AAABAQAAAQEAAAAAAP//AQEAAAEAAQABAQEAAAABAAAA/wAAAAAAAQAAAP8BAP7/AAEBAQH/AAAAAP8AAQAAAf8AAf//AAAAAAAA/wEAAP//AAAA/wD/AQH///8AAAAAAQEBAQABAAABAgD//wD/AAD//wD/AQAAAf/+/wEAAAEBAP//AAEAAAEAAv8AAP8BAAAAAAAAAAEBAAEA/gEAAP8AAP//Af//AAAAAAAAAf8BAAD/AQH/AAEC/wD/AAEBAAEAAQEAAQD/AQAAAAAAAQAB//8BAAAAAAAAAAEAAAEAAAEAAP8A/wAAAgD//wAA//8BAAAAAP4CAAAAAAEBAP8BAAAAAP8AAQD/AAAAAQEAAQD/AAEAAAAAAAAAAP//AP8BAAD///8AAAD/AAH/AQAA/wAAAQAAAf8BAQD//wAAAAABAAAAAf8AAAAAAgEBAAAAAAEA/wAA/wH//wAAAf//AAAAAgABAQH///8BAP///wEAAAAAAAAAAAAAAAEAAQEAAP4AAAD//wAAAAECAAABAAEAAAABAAH/AAD/AAAAAf8A/gABAAD/AAEAAAAAAQD/AgEAAAEAAP8A//8A//8A/wD/AAAA/wEAAAAAAP8AAQD/AAD/AAAAAP8CAAABAQAAAQABAAABAQAA/wD/AQEAAQAAAAD/AAEA/wAAAQD/AP8AAAEAAAD//wEAAAAB/wABAf7/AQEBAAAAAP//AP//AAAAAAAAAAIAAgH/AQAAAAAAAAEAAAABAAAAAAEAAP///7GytmZnavf19AAA/wAAAAAAAR8PBI1S/REI/gAB/wABAf8AAAD/AQD/AAAAAAABAAAAAAD/AAH9AgHoCQHmCf8CAAD///8A/+T7+7v1+v4AAAAAAAAAATY2NzMyMgEAAAH/AQEBAAAAAAABAAD/////AAD/Af8AAP//AP8BAAAAAAAAAAH//wAAAP8AAP8AAAEBAP8AAAEB/wAA/wIBAAAC/wEB/gH/AAEAAAAAAQD//wH/AAD//wAB/wABAAAA/wAAAP8BAAAAAAAAAQABAAEAAAAB/wD//wABAP8AAQAA/wAAAAIAAP8AAAH//wEAAP8BAAAAAAEAAQAAAAD/AAAA/wEB/gAAAP/+AAAB/wAA/wD/AP////8AAAEAAAEBAP8AAAABAAABAAABAAAA//8AAQEBAQEBAAEBAP///wAAAP8AAP8BAAABAAIAAQH/AP8A/wD/AQAA/wD/AAD/AQEAAAAAAAEBAAAAAQH//wEBAAABAQAAAQAA/wH/AAAAAQACAAAB/wAAAP8AAAABAQEBAgH/AAECAAABAQAAAQAAAgAAAQD/AP7//wAAAAEAAAAA/wD//wAAAf//AAABAgABAQD+/gD///8A/wABAAABAf8AAAEAAf//AQH//v4AAAABAQAAAP/+/wAB////AP8AAAAAAAEAAf//AQABAAD/AP8BAAEBAAEB//8A/wAAAQAAAQEA/wAA/wD+//8BAAABAAAA//8AAQD/////AAIAAAD/AAAA//8AAP8AAAEBAAH/AAEBAAACAf///wEBAP//AAEAAAABAv8AAQAAAAECAQEB/wD/AAAAAAH/Af/+Af//AP//AAD/AAD/AAEBAQEBAAAA/wAAAAD/AQAB////AAAAAQD//wABAAH/AP8AAAEAAAEAAgH/AP//AQEBAQABAQECAAEAAP//Af8AAAAAAAAAAAAAAAEAAAEBAAAAAQAB//8AAAAAAP8AAQAAAAAAAf8AAAH//wAA/wAAAP8AAAABAAAB/wH/AQABAP4CAQABAf8AAAEAAQAAAAH+AAD/AAAAAQEAAAABAQABAQEA/wAAAQH/AP//AP8BAAD///8BAP8BAQD/AP8AAAAAAAAAAAAAAQEAAAH/AP8BAQAAAP8AAAD/AAAAAQAA/wAAAQAAAf//AAABAP8AAP8BAAIAAP8A/wAAAf8A/wD+AQABAQEAAAEA/gL/AQEAAAD//wEBAgEBAP//AgAAAf8AAAAA/wEA/wD/AP8AAAAB/wH/AAAAAQAA/wD+AQABAQEAAP//AP8BAQAAAAEBAQAAAQEBAAEA//8AAAAAAP8A/wAAAAEAAP8AAAEA/wABAf/+/v//AAD/AAABAAABAQABAQABAAABAP8BAAEAAAABAQEBAAEBAAAAAQIA/wAA//8AAAEAAAD//wAAAQEBAQABAQEBAQABAAAAAgABAAD//wABAP8AAP8AAP8BAQIBAAAAAP4B/wD/////AAEAAAEBAAACAQAAAQAAAP8BAAAA/wEAAf//AQD//gAAAAD+/wEA/wAA//8AAP//////AP4AAQEB/wAAAQD/Af8AAAAAAQD/AAEAAAH/AAAAAQIAAAACAAAAAAAB/wD+//////8AAAAB/wABAQAAAAAA/gAA////AP8AAP8AAQH/AP8AAAAAAAABAAACAP//AAAAAQD/AAAA/wAB//8A//8AAv8AAAACAQAAAP8BAQAAAQD//wABAQEA/wH/AAD/AQABAAAAAP8AAf8A/wD/AgIB/wD/AAABAAEBAQAAAAAA/wEAAP/+AAAA/wAAAQD/AP8A/wD//wD+AAEA/wEBAgH/AAAAAP8A/wEAAQEAAAAAAAAAAAAAAQAAAAEAAQAAAQAAAQEAAAH/AQD/AAAAAAAAAAAA//////8BAAAAAAEA/wAA/wAAAAAAAAH/AP8AAAAAAAAAAf8AAAAAAf//AQEAAAABAAEBAQABAAAAAAAAAP8AAAH//wAAAf8A/wAAAQD/Af8BAf/+AAAAAAAAAf//AQAAAAEAAAH///8A//8BAP/+/wC3uLptbnDz8vAAAP8AAAEAAP8cEASfWv8pFv8BAAEBAAEBAAABAAH+AAAAAAAAAAEA/v8AAP8A/gAB7QUB0w0A9wEBAQH/AAEB/v+z8fXo/v0AAAAAAAAAAP9YWFcJCQn/AAD+//8AAAECAAH///8BAAAAAQAAAQACAAAAAAAAAAD/AP8AAQD/AQD/AAECAAEBAQEA/wABAQAA/wEAAAD+AAEA/wAAAQEAAAD/AAAA//7/AAD/AAAAAQAA/wEAAAEAAAAA/wAB/wAAAQABAP4AAAEAAQEAAAAAAQAAAAACAQD/AQAA/wACAAEBAAD/AAH/AAAA//8AAQAAAQAAAAABAf8AAAH/AAAAAQEBAQEAAAAAAAAAAQEBAQAAAP8AAAAAAAABAf8BAAAA/wAA/wAAAAEBAAEA////AAAAAAAAAQEAAP8A//8CAP8AAAEA//8AAAAAAAH/AAAAAQEBAAABAAAA/wABAAAA//8AAAD/AAEAAP8B//8BAAABAAD/AAAAAP8A//8A/wIAAf8B/wAB/wD/Af//AAD//wABAAAAAf8A////AP//Af8B/wAA/wH/AAAAAAEAAQAA//8BAAAB/v////7/AQAAAQABAAAB/wAAAAAB/wH/AAABAAAAAQABAP8AAAAA/wABAAEA/wEAAQAAAAD/AAH//wD/Af8A/gAAAAEB//8BAAAA/wABAAD/AP8BAAAB/wAA/wEBAQEAAAAAAAEBAAEBAAD/AAABAP8A/wAAAAH/AQAAAQAA/wAA//8AAQAB//8B/wAAAP8A/wABAQAA//8BAf8B/wH/AQD//////gEAAQABAAEBAP8AAAABAAAAAAABAAAAAP8AAAD/AQEBAQEBAAD/AAH//wD/AQEBAP8AAAAAAQEBAf8AAQAAAQEAAP8AAAABAf//AP8AAAABAP8AAAABAP8BAAD/AAD/AP8A/wD//wD/AAAAAQAAAQAAAQAA/wABAAAB/wEA//8AAAEAAQEAAAAAAQACAAH//wIBAAD/AgABAAAA////AP8B/wAA/wAAAAEAAv8AAQEAAP8AAAAAAAD//wABAQEAAf///wABAAABAAAAAQD/AAAAAAAAAQD/AAD/AQAB/wAB//8AAP//AAAAAAAAAP8AAAD/AP//AAAAAAEB/wAAAAACAQABAAABAAAB/wD+AAABAAIBAP8BAP8AAgAAAAAAAP8AAAH/AQD/AAAAAQH/AP///wACAf8A/wABAQEBAQH/AAD/AAAAAAEA/wEAAAABAQEAAAAAAQD/AAH/AQEBAQAA/v8BAQAA/wAAAQAA///+AAD/AP8AAQAAAAEA/wD//wD/////AQEB/wABAAEAAAAAAQEA/wD//wAAAP8AAAAB/wAC/wAA/wEAAP7//wD//wEA////AAEB/wAB/wEAAP4AAP//AAAB/v8AAP8A//7//wD/Af8A/wEAAAAAAQECAAAA/wAA////AAEAAAABAAEAAAABAAABAAAAAAAA//7/AP7/AP8B/wAAAAEAAAAAAQAAAAABAAAAAP/+AAAA/wAAAQH/AAEAAAABAv8A////AAAAAP8BAAAAAAAAAf/+AQAAAQAA////AP8A/wAAAAAAAAAAAQEBAP8AAAAA/wEA//8AAAEAAAEAAAAAAAABAAABAP8AAAABAAAAAQAA/wEAAAEAAAABAAABAAABAQAB/gABAQAAAP4AAf8A/v8AAAAC//7/AP//AQEAAP//AAAAAQAAAQAAAAH/AQAAAP8A/wAAAf//AAAAAAAA//8AAAABAAAB/wD/AP8AAQEAAgEA//8AAAEBAAAAAQABAQD/AAD/////AQEB/wH/AQIBAP///wAB/wEAAAAAAP///wD/AP8BAP8BAP//AAEAAAAAAf8A/wD/AAAAAAEAAQEBAAEBAAAAAAAAAAEB/wD/AAD/AQAAAAEBAAH///8AAAEAAAD/AAAAAf//AAH/AQAA/v8AAAD//wAAAP8AAQAAAQABAAAAAf//AgAAAAAAAQEAAAAB/wABAQAA/wH/AAH/AAEBAQAB/v8Btra4W1xf5OPhAAD/AAAAAAD/BwUDgEf9QCT7AAAA/wABAQAA//8A////Av//AP8AAQAAAAEBAAAB//kE/9sMAO4E/wEA//8AAP8B7vr8pvD3/wACAAAAAAABHyAhXF5a////AP8AAAH/AP///gAAAAEA//8AAQAAAAD/AAAAAQD/AQH/AgAAAP8AAAH/AQEA/gD//wD/AQEB//8A/wEBAAAAAP///wAAAAABAAAAAAEB/wABAAEBAAAAAP//AAAAAAD/AAAAAAD//wAAAP8A/wABAP//AP8BAP8AAP8BAQAA/wAAAv8BAQAAABaE6XsC//7/////AQABAAAAAAD/AAAA//8B/wD/AAEBAP8A/wEB//8A//8AAAAAAAAAAP8AAAAA////AAAA/wEAAAH/AAD/AAAAAAD//wAAAP4AAQEBAAAA/wABAAAA/wABAQH//wAAAP//AAD/AAEAAgACAf8AAP8AAQD/AAD/AQEA/wAAAAEAAP8CAAAA/wH/AQD/AQAAAAEAAAAA/wEA/wEAAf7//wD/AgAAAQEB/wABAQAB/wD///8A/gEAAQABAAAB/wEAAP//AAAA//8BAf8BAAIAAQD/AAEAAgABAQEBAAL//wEAAAAAAP8AAf//AP8BAP8AAQD+AAAAAAAA/wAAAf8AAQABAQAAAAEA/wABAAH/AAABAP//AQAAAP//AAEAAAD/AQD/AQABAAEAAP/+AAEAAP8BAAAB/wAAAAAAAAD/AAAAAf8AAAEAAQAAAf8A/v/+AP8BAQH/AAEA/wD+AAEAAAAAAAEAAf///wAAAAEAAAD/AgAB/wAAAf8BAgAB/wAAAP7+AQAAAAD/AQACAAAAAP//AQH/AAAB//8A//8AAQAAAf8BAAAA/wAAAAD/AAD//wD+/wEA/wL/AAD/Af8AAQEA/wABAAABAP/+/wEAAAH/AAAA/wAB//8AAAEBAQEBAQEB/////wAAAP8A//8AAQAB/wD/AP8AAQH/AAAAAAD/AAD//wD/AQAAAf8AAAEB/wAAAAABAAEB/wD+AAD/AQAAAQAA/wD/AP8BAQH//wD//gABAP//AAAAAP8BAQD/AQD/////AAAAAP8AAAAAAQABAQAAAAD/AQAAAAEAAQECAAAB/wEBAQEBAP8BAQAC//8A//8AAAAAAQD//wD/AAEBAAABAQEB/wD/AP8AAAEAAAEA/wAAAAAAAAIA/wAAAQAAAP8AAAABAAAAAAD/AAEAAf//Af8AAAAAAgEBAQABAP8A/wAAAP////7/AAAAAAABAAABAQD//wEAAAAAAP8AAQAA//8AAAEB//8CAAEBAP8CAAAAAAAAAQAAAgIAAAAAAAAAAAABAAAA//7/AQAAAQD//wD/AAD/AQD/AAD/Af8AAAH/AAEBAf8AAgEAAP//AQH/Af///wIAAAEBAQD+Av///wAAAAEAAQEAAAAAAP8BAQAA//8AAAABAAAAAf//AP8BAQABAAEAAQD//wAAAAAA/gAAAAICAQEAAQEAAAAA///+AAAAAAAAAAEB//8BAQIB////AQABAQABAQABAQEA/gD/AQEAAP8BAf8AAAAA//8B/wEB/wABAAD/AAAA/wEBAAAA/wEAAAEBAQABAAEAAQEBAAAAAQD/AP8AAP///wAAAAD/AAAA/wD/AQEBAQAAAAEAAP8A/v8AAAAAAAEAAQD/AAH/AAL//wH/AAEBAAIBAAAAAAD/AAEBAAAAAP8A/wEBAAAA/wH///8BAP8AAAABAAAAAAAA//8A/wABAQAA/wH/AP//AAD+AQABAAIAAP8A/wD/AQEAAf8AAAD/AAEAAAEBAAEA/wAA/wD/Af8BAP/+AP8BAQAAAf8BAAAAAAEAAQAAAQD+AAEAAQEA/wAAAQEA/wH/AQEAAQAAAf8A/wAAAAD/AAAAAAEBAAD/AP8AAAH/AAD/Af/+AP8AAQAAAP8AAAAAAf8A/wAAAP8A/wAAAQEAAAABAQAAAAAAAAEA/wD+AAAA/wAC//8AAAABAf8BAAEAAAAA/wD/AAABAAABAP///v//w8TEbWxv8O/tAAD/AAAAAAABBAMCdT/+Yjj9AAEBAgH/AAD/AAD/AQABAAAA//8AAAEAAP//AP8AAP4CAOAKAeYFAP4AAQAAAQEA//7+rfD1yPn9AAAAAAABAAAARkdFExMUAQEBAQAAAP8BAAEAAP/+AP8AAQEAAAAAAQABAAEA/wACAP8BAAEA/wEAAQAAAAAAAQAAAAAAAAAAAQEAAP//AAAAAQAAAAAA///+AAAAAP//AAABAP//AAAAAAABAAH///8A//8A/wABAQAAAQAAAAEA//8AAQH/AAD//wD//wABAP///wD//wD/AgACAAIBAgEA/wABAAEAAv8BAP/+/QH+/wAA/gAAAAEA/wH/AAEAAf//AP8A/wD//wAAAAEBAQAAAAH/AAH/AAAAAgEBAAEAAQEAAAABAf8AAAAAAAEAAP8AAAABAAAAAAEB/wD//wEAAQD+Af8AAP8BAAAB//8A/wAAAQD/AAIAAAEAAAABAAIAAAEAAP7/////AP//AP//AQEAAAD/AP8BAAAAAAAA////AAD//wD//wAAAAEBAAEAAP8A//8AAAAAAAABAQH/AQAB/wABAAH/AQEBAQAAAP8AAAAA/wD/AAD//wAAAAABAAEBAAAB/wAC//8AAQABAf8B//8AAAAA/wAA//8AAAD+AAEAAAH/AP8AAP8BAQEA/wABAAAB/wAAAf8AAP8BAQEB/wEBAQABAAAB//8AAAH/AAD/AAAAAf8AAv8B/wEBAAD/AP8BAAEBAf8BAAAAAQEA/wEAAQAAAAAAAAAA/wABAQH/AP8AAAAAAP7//wD/AQAB/wAB/wAB/wABAAAAAAEAAQAB/gAA/wABAAD/Af//AAEB//8AAQAAAP8AAAECAAEA/wAAAAEBAAAAAQEAAAAAAf8AAf8BAP/+/wIBAAABAP8BAAEAAAAAAQECAQEAAAEAAP8AAAAA/gEA/wEBAgEAAP8BAAEB/wAA/gAAAQABAP//AQEAAAAAAAAAAQEA/wAAAf8A//8AAP8AAAAAAP8B/wAAAgAAAAAAAP//AAEAAQAA//8AAAEBAAEA/wEBAAEBAAABAAAAAQAAAAAAAf8AAAABAf8A/////v7/Av8AAQD//wEBAAAB/gEAAAH/AAD//wEA//8AAAD/AAAAAAEAAf0AAAAAAAAA/wAB//8A/wEAAP8AAP8BAf8AAAAAAAD/AAD/AAEAAP8AAAABAP8AAAD/AAH/AAAA/wAAAf4AAP8AAP7//wAAAAABAQAA/wEBAQECAQABAAEA/wD+/v///wH/AAAA//8BAAEAAAH/AAEAAAAA/wAAAAAC/wAAAAAA////Af/+AP//AAAA/wEAAAEAAQABAP8AAP//AAEAAf8BAAABAAEBAgD/AAAAAgH/AAAAAP//AAEAAAAAAAABAAEAAAAA/gAAAf8BAAEBAAAAAAD/AAAAAAAA////AP//AAABAAEBAQECAf8B//8AAP/+AAABAAEAAQEAAAEB/wD/////AAAAAAAAAQEBAf8A/wABAQAA/gAA/gD+AQEBAf8AAP7/AP8BAP///wD/AAABAP///gAB/wAAAAD//wEAAQAA/wABAAD/AAAA//8BAQH/AP7//gAA/wEBAP/+/wD/AAAAAAABAQABAAAAAQEAAAAB/wEAAP////8AAf8AAAAAAAIAAAH///////8BAAAAAAEAAAH+AgAA/wH//wEAAAEAAQEAAAEAAAAAAAD//gAAAAH/AgAA/wABAAAA/wEB/wEB/wICAAEA/wAB/wH/AAABAP8AAQAAAAAAAAEAAP//AQD/AAAAAAAAAAD/AAD//wD/AQEAAAH/AP8AAP8BAP8B/wAA/wABAAAAAP//AAAAAQAAAQAAAAAA/wH/AAEAAQEBAgH+AQD/AP//AAEBAQD/Af//AAAAAAAAAAAAAAD/Av/+Av8AAgABAAABAP8A/wD/AgABAQABAAAAAAD//wABAAAAAP8AAAAAAQD//wEAAQAAAAABAAABAQAAAAAA/wEAAP8A/wAAAAEA/wAAAAEBAczNz1VUWuDg3gAA/wAA/wAAAQAAAGo5/3xH/wH//wEAAAAAAQEAAf//Af//AAAAAAABAAD/AP8AAAD/AADpBwLbCgD9A/8AAAABAAD9/9X394bs9f0AAAAAAgAAAQkLDlxcWwH///8A//8BAQECAAEAAAAAAQIAAf8AAP8AAP//////AP8B/wAAAP//AQH/AAAAAf8AAP8BAAD/AQEAAP//AQIAAAAAAAAB/wAAAQABAv8BAQAAAAAA/wEAAAABAAD/AAD/AAEBAQIAAQEB/wAA/wAAAf8AAP8CAP//AAAAAQEBAAD//wEBAAABAAAAAQIB/wD/AP//AQAB/wH/AAAC/wAAAQEAAgAAAAH/AAAAAAAAAgEAAf8BAQAAAAEAAQD//wAAAAEAAAAAAAD/AQAAAP7/AAAA//8AAP8AAP8AAQD/////AAABAAD///8AAAABAAABAAEAAP8CAQABAP8BAP8A/wABAAABAQAAAP//AAD/AAAB///+//8AAAABAgEAAQACAAEAAf4A//8BAQABAAEAAAH/AAEB/wABAQAAAAEB/wEAAAAA/wACAAEBAAABAP8BAAD/Av8A/wH////+AP//AP8BAAABAAAAAQEAAAEBAAEBAf8BAAH+AAEA/wAA/wEBAQD//v4AAAICAAH/AQD///8A/wEAAQEAAAH/AAEA/wABAf////8A/wAA/gABAAAAAAD/Af8A/gD/AAAA/wAA/wD/AP//AQD//wAA/wAA//8AAAH//wD/AAAAAAAA/wEBAAD/AP8AAAD/AQABAAAB/wEAAAH//wD/AQAB//8AAAAA//8AAQH/AAH//wAA/wEBAAH//wAAAQAAAAAB/wABAAD/AQABAAD/AQEAAf///wAAAP///wD/AAH/AQEA/wEA/wAAAAAA/wD///8AAP8AAQD//wD//wABAAH/AAAB/wD/AP8AAP8AAgAAAP8A/////gAAAAAAAAABAP//AAAAAAAA//8A/wAAAAAAAf8AAAEA/wD//wH/AAAAAQEBAAEB/wAA/wAA/wEBAAEBAAAAAAAA//8AAQAAAAAAAAAA/wABAAAAAP/+AP///wD/AQAAAAEAAQABAAD/AQEBAQEAAQIBAf8BAP8AAQD//gAA/gEAAAAAAAD/AAAA/wEB//4AAQABAf//AP8B/wABAAEAAAAA//8BAAL//wEBAAAA//4AAP8AAAD/Af4AAAAAAQAAAAAAAQABAAD/AP8AAP8A/wEAAQABAP8A/wEAAAEAAAAA//8AAAEAAP//AP//AP8AAAAAAQEAAAEAAP8AAAEBAAD/AAEAAAD///8BAQAAAAAA//8AAAEBAAEAAf8AAQAAAAAB/wIAAAAAAf8AAAAAAAAAAAEAAQAA/wAA/wEA////AQAAAf8AAQH+AP//AAAAAQAA/wD//wD///8AAAEAAAABAAEAAAAAAAAAAAAAAP8A/wABAQEBAQD//wD//wD/AP8B//8AAAAAAgD//wEAAP//AAAAAAEBAAD/AAAAAQABAAAAAAABAAAA//8B/wIBAQEAAv8AAP8BAQAAAAAAAAEBAAIAAQEAAAEAAQIAAAL/AQEAAQD/Af8BAAAAAAABAf8BAAABAP//AAECAAD/AAABAAEAAQD/AP//AAAA//8AAQEBAAAAAQAA/wEAAAABAQEBAf8A/wABAAAAAAAAAgABAP8B/wEAAQEA/wABAf8AAAH/AAAAAAAAAAAAAQAAAAAAAAEBAAH/AAAAAP4BAQEA/wAAAAL//wEAAAEA/wABAQAAAAIAAAAA/wACAQAAAAD//wD/AAABAQEAAAD/AAD//wEAAAAA/wEAAQAAAQEAAAH//wAAAAAAAAAAAP8AAAAAAAAAAAH/Af//AQAA//8A/wH/AAH///8A////Av7/Af8AAgEA/wAAAP8BAQABAAD/AP8AAQH/AQAAAf8AAP///wAA/gEAAAEA/wAA/wABAAABAAAAAAEBAAEAAQABAQABAf4AAQAAAAD/AAEBAAAA//8AAAAAAQH+//8B/wEAAAEA/wEAAADAwcRfYWPr6ugAAAIAAAAAAAIAAP9YMP+GTP8HA///AQH/AQD//////wAAAAABAP8AAAD//wAA/gH/////9gMB1gwA9QMA/gABAAEA/gH/AP6Y7vbg/AAAAAEAAAAAAAFdWlg9OzoBAQEB/wAA/wD/AAH//wAAAQD/AP8AAQAAAAABAAAAAAAB/wEAAQH/AAD/AAAA/wAB/wECAAAB//////8BAP//AAAAAAAA/wEA//8A//8AAAAAAAAAAQD/AAEAAAAAAQAAAAAA///+AAAAAAEAAQEAAf8B/wAB/wH/AAEAAAH//wEAAAD//wAB/wABAf8C/////wAA//8A/wD/AAD//wAAAgECAAABAAABAQEA/wEA////AAAAAAAAAAD/Af8AAQAAAAH/AQD/AAD/AAD/AAABAP8BAAEBAAEBAAD/////AAEBAAAAAAAAAgEC/wAA/wAB/wEAAQABAAAA/gD/AAAB/wEAAAEBAP///wAA/wD/AQAAAAAAAQEAAAABAf8AAf8A/wH/AQABAQEA//8AAP//AAAAAAD/AAH//wAB/wH//wH/AAAAAAAA/wABAP//AAAAAAEAAP8AAAD/AAEBAgABAv8BAQAA////AP7//wD//wH//wAA/wAAAAD/AAAA/wD///4AAAEBAP//AAEAAgAAAQEBAAEA/////wAAAQEAAQIB//8AAQEBAAAAAAABAAAAAAAAAf8B/wEAAf8AAAD/AAH/AgABAP8AAQAAAAAAAAD/AP//AAD/AAAAAAABAQH/AAD/AAAAAAABAv7/AAAAAAH/Af//AAEAAAD/AAEA/wAAAQECAQD/AQAA/wAAAAD/AAD/AQEA//8B/wAAAAEBAAABAP//AQEAAP8AAAAAAQEAAP8BAAABAf8AAQAAAAEA/wL//gAB/wD/AgAAAQAAAP8B/wAAAAAA////AQD/AAL/AP///wAAAf4AAQAA/wAB/wEAAAD/AP8AAAACAQAB/wABAAEAAQACAAEB//8B/wAAAQEAAQAAAAAAAP7/AAD+/wH/AAH/AAAAAAD+AAAA/wAAAAEB/wAAAAD/AQAB/wAAAAAAAAAAAf4BAAEAAf8AAP//AQD/AAABAf//AP4AAAD//gD/AP8BAAAAAAD/AAD///8B/wAAAAEA/wEAAAEBAQAA/gABAAAAAAEBAAH/////AAEB///9AQH/AAEAAf8BAQABAAAAAQACAAAAAP8A/wD/AP8AAAD/AAEBAAEBAAEAAP8A//8BAQIAAQD/AAEBAAAAAQAA/wEBAf8BAAABAAAA/wAA/wAAAAABAP8AAAD//wD+AAEAAAAB/wAA/wD//wAAAQAAAAAAAP8A/wAAAAEA/wEAAAAAAAD/AQABAQH/AAD/AP//AQAA/////wAB////AP8AAf//AgABAAD///8A/wAAAQAAAAABAQAAAP8AAAAAAP//AAD//wD//wAAAAEA/wD+AAD/AAAAAAAAAP8BAAAA/wD/AP8AAQH/AP//AAAAAP8B////AQAAAP4AAAD/AAEA/wAAAAAAAAH/AAAAAAAA/v8A/wAAAQD/AP//AAD/AAAB////AAH//gEAAAD+AQAAAf8BAAAA//4B/wABAP///v8AAAD//wABAAD//wD/AQAAAQABAQAAAAAAAP//AAEA//8AAAEA/////wD//wD/Af//AP8AAAAB//8B/wEBAAAAAP//AAD//wAAAf8A/wAAAAAB/wD/Af8AAAAA/wD/AAAAAAAAAAAA////AQEBAAD//wABAP8A/wD///8A/wD+AAD/AAAA//8AAAD+AQAAAf//AAAAAAEAAP8AAQEBAAH/AQIAAAAAAAD/AQH/AgIBAQABAQEAAAAB////AAAAAgD/Af8AAAABAAAAAP8AAQH/AAAAAQABAP8BAAEB//////////8AAP8AAP4AAv8BAf/+AP//AQABAQAAAP8AAAH/AQAAAAH/AAAA/wAB/wAAAAEAAP//AAAAAf8AAP8BAAAA/wAAAQEA/wD/AAAAAP//////AQEAAAEAAQAAAAEAo6KlUFBT2NXUAAD/AAD9AAABAAD/RSUCllX/CwcAAAEAAP//AP8AAP8BAAAAAAAA////AP8BAQAA/wEAAfgFAtYNAOkFAP8AAP4AAP8B//0BvPL4oe34AAAAAAAAAAAAHSEfc3Rx/wAA////AAAAAAH/Af//AAD/AP8AAAEAAQAAAQEA/wAAAAABAAAAAP//AAAAAAAA/wEA/gD+//8A/wIBAAEAAAAAAAAA/wAB//8BAQABAAABAP8A/wAAAP8AAAAAAAABAAAA/wEAAAABAQD/AAAA//8AAAABAAAAAQAAAQAAAAEAAQAAAAAAAQAB/wAAAP8BAgECAQEAAAIAAAAAAAAB/wABAAAB/v8A/wAA/wAAAAL/AAEAAQD+AAEAAQH/Af4BAAABAAD/AAAAAgABAQAAAAAAAAAA/QAAAAAA/wAAAQEAAAAAAAEA/wAAAAD//wEAAQAAAQEAAP8A////AAH/AgAAAAH/AQD/AP8AAAEAAQAAAP8AAP8A////AP////8BAP//AAABAP8A////AQABAAABAQABAAD/Af8AAAD//wH/AQEA//8A//8AAAAA//8AAQAAAf///wEBAQABAQIA//8A//4BAP8AAQECAQAAAAEAAQD/AAAAAQH/AQD/AQABAAAAAAABAAABAQABAQAAAP8AAf//AAD/AAEBAQAB////AAD//wAAAAAAAAEAAAEB//8A/wH/AP///wAAAP///wEAAAEAAAAA/wEAAAABAP8BAAEAAQAAAAAAAAEBAQD///8BAAAAAAEBAP//AP8BAAAA/wAAAf8BAAD//wD/AAEAAQEAAQAAAAAA/wD//wIAAQEAAQAAAAAAAQEA/wD/AP8BAP///wAA/////wAA/wAA/wD/AQEB/wEA/wAA//8A/wAAAAH/AAEAAAIAAf8BAQAAAAEAAAAA/wD/AAABAAAAAP/+AAAAAP//AP4BAQAAAQEAAQIAAf///wABAP8AAAD/AAEA/wEAAf///wAAAAEAAAH//wD/AP8BAP//AP8BAP///wEAAf8AAAAAAAAAAAEBAAAAAP8AAAAAAAD/Af8AAAABAAAAAQAAAQABAAAA//8AAAABAQAAAQAAAP8A/wABAAAAAQIAAQABAAAAAAEBAv8AAQEA/wEAAAEAAQD//wABAP8AAAEAAAAAAAEA/wAAAQEAAQD//wAAAv8A////AAABAAAAAAEBAP8A/wAAAAD//wEAAAABAP8AAAD/AQABAQD/AP8A/wEB/wAAAAD/Af8A/v8AAAAA/wD/AAABAAH/AAAAAQEAAAEA/wABAAAB//8AAQEAAQD/AP//AAEAAQH//wIAAQAA/wAAAQECAAAAAAEAAQAA//8AAAD+AQD/AAAAAQEAAQABAgABAQECAAEAAAIBAQAB//8AAAEAAAH/AQH/AAEAAAD/AAABAAABAAABAAAAAP8AAP8AAAEAAgAAAQABAAEAAQEBAAAA/wAAAQABAAD/AQH/AQEBAP8AAQABAQAAAAEA/gEBAgECAAABAAABAP///wEAAQAAAAAAAQABAAD/AQIBAgD/AAAAAQEA//8BAAEA/wD/AQD+/wL//gD/AQAAAf8AAP8AAAEB/wEAAAABAQEAAAEAAAEAAQEBAf//AP7/AQAAAf8AAf//Af8AAQD//wH/AAD+AAEBAQH/AAD/AQABAAACAP8A/wAA/wH//wAB/wEB/wEBAgABAP8BAAAAAP8A/wEAAf8AAP8AAAEAAP8AAAH/AQAAAQEAAP////8AAAIB/gABAAEBAP8AAQD/Af8AAQAAAAAAAAAAAQEAAP8CAQAAAAD/AAEAAP8A/wD/Af//AP///wD/AP//AQEA/wD/AAAAAP8A/wEA/wEB//8BAf8AAQD/AAAAAAABAAD/AAAAAf8AAAAAAQD/AAABAAEBAAIAAQAAAP8B//4AAAAAAQEAAQAA//8AAAIAAQAAAQAAAAD/AQAB/wAA/wAAAAD/AP8AAAAAAf8BAf8AAP8AAAEBAAAA/wD/AQAAAQAAAQIBAQAAAQAAAP//AKKipWprbfHw7QAA/wAAAAAAAQAAAD0hA6Jc/REJAAD//v///wABAAEAAAAA/wAAAAD//wABAAAB//8AAAD7AQHYCgDfCQACAQD//wAAAf4A/+X6+nfn8/UAAAAA/wAAAQAA/19cXCQlJAEBAAEBAP8AAAH/AAABAAABAgABAAAAAAD/AAAAAAEAAQAB/wAA//8BAAEAAAEAAQD/AAEBAf8BAAAA/wD/AAAAAP8AAQEA/wEB/wAC/wEAAAEB/wAAAAEBAAEB/wAA//7/AAH/AP8B/wAAAAD/AQEBAAD/AAAAAAAA/wAAAP8AAP8BAP//AAAAAAAAAf8BAAL//wAAAP//AAD/AQAA/wIAAAAA/wEAAAEAAQEAAAD/AAAAAP8AAQD/Af8AAQAAAAD/AAH/AQAAAAAAAAAAAAIAAAAAAAIAAAD/AAEAAf8A/wABAAD/AAIAAQAAAQD/AAAAAQD/////AAAAAf8AAf//AP8AAAAAAP8AAAD/AP4BAQAA//8BAQABAAABAQAB/wAAAv8A/gEBAAH/AAEA//8AAP8AAAAAAf8BAAEAAQH/Af7/AAEBAAEBAP8AAAEBAf8AAP8BAQH//gAAAP//AAH//wEA//////7+/v//AQAAAAAAAAAAAP//AP0BAf////8AAAABAAAAAP8A/v8AAAAAAAEAAQABAf8AAAAA/wEAAAEB/wABAAAAAAAAAQAAAAABAAD/AQEBAAEBAAAAAgH+/wH//wEAAAAAAf//AAAAAP//Av8AAQAAAAEA/wABAQEB/wD/AAAA/gAAAf4AAAD/AAEAAAAAAAEAAAAAAQAAAAAAAQAA//7//wEAAQAAAP//Af//AAAA/wD//wABAQEA/v8BAQABAQH/AQAAAQEBAQD/AQD/AAEAAAH/AQEAAAEAAAAAAAEAAf8A//8AAP8AAAD/AP8BAAAAAQAAAAAAAAEAAgEBAAEBAQACAP//AP8A/wD+AP8BAAL//wEC/wAAAQAAAAH///8BAQAAAAAA/wD/AAH/AQAB//8CAP8C/wABAgL///8AAAEBAP8AAAD+/wEAAP8AAAAB/wAAAQAAAAAA/QH/AQAAAP8AAAABAAEBAAAAAAD/AP8AAP8AAAD/AAAAAQH/AAAAAQAAAAAA//8CAf8AAQABAAD/AAEBAAH///8A/wAAAP8AAAD/AAD//wAAAQABAQABAQABAAIBAAAAAf8AAAAA/wABAQEAAf//AQABAAH//wABAQAAAf8A/wD+/wABAAH/AAEA//8AAP8B/wABAAH/AAAAAAEA/wD/AQD/AAAA/wD/AAIA/wAAAQABAAD//wEAAAEAAAD/AP4AAAH/AAH///8AAP8A/gEAAAD+//8BAAAB/wAAAf8AAgABAP//AAH///4A/gAA/wD/AP//AAD//wEAAAD/AAAAAQEBAf8AAAABAQAB/wAA/wEA//8AAAABAQEBAAD/AP8B/wD//wD/AAD//wAB/wEBAP8A/wH/AQEAAQD//wAA/wABAAABAAEAAQIAAP8AAAEAAAD//gAAAAEAAQEA/wAAAAAA/wAAAP7///8BAAAAAAAAAAEB/wAAAP8AAgABAAEA/wEBAAABAAAAAP8AAAEAAAEAAQH/AAAAAAD/AQD///8A/gAAAAACAf8AAP8BAAABAQABAQAAAQEAAQAAAgAAAAAAAP8BAAH/AAAA/wABAAABAAABAAAAAAAA/wH/AP8A//8AAAAB/wABAP8A//8AAAABAAAAAQABAAD/Av7//wAAAAAA/wABAAD//wEA/wD+AAAAAf8BAQAAAAAAAAAAAQAAAAH/AAABAAEAAAAAAQEAAQABAQEBAf//AAAAAAAB/wEAAf//AAH/AP8A/wABAAEA/wH/AAH/AP8AAQAAAf8AAQAAAAD/AQABAP8AAAABAf8BAQAB/wH/AAD/Af8AAQABAQEBAQD/AAAAAP//AAAAAAD+Af8AAQABAQEAAQD/AAH//wEAAAAAAAH/AQEA/wAA/wABAAAB/wH/AAEAAAEAAAAAAAABAAAAAAAAAAAB//+cnZ5oZ2v19PIAAAEAAAEAAAEAAAI9IAOdWvsYDQAAAAAAAAAAAQAA/wD///8AAf8B/wAAAQEB/gIAAAEA+wMB2gsA3woA/gMA/wAAAAL/AAAA/gCj7/TQ+PwAAP8AAAIAAAINDxBYWFUCAQAAAAH/AAAAAQD/AQH//wEAAAAB/gEA/wEAAAAA/wD/AP8BAAACAAAA/wD/AP8AAP8BAQAA/wABAAEAAAAAAAAAAQABAQAAAQEAAAAAAAH/AAAAAAEBAQAA/wAAAAAAAAEBAQD/AAAA/wAAAP8AAP///wH/AP8AAQD/AQAAAf8A//8B/wAAAgH/Af8AAQD//v8CAQAAAAAB/wAAAP8A/wH//wAA/wAAAP8AAP//AAAAAAEAAAD//wAAAf8A/wH/AQAAAQEAAP8A/wAAAP8AAAD/AAAA/wAA/wAAAQAA//8BAAIB/wD/Af////8A/wD/AQD/AP/+AAEBAAABAQEAAAD/AQEAAQAAAAABAAAAAQACAP4AAQIAAP8BAAABAP8AAAD/Af8AAQD//wAAAAD/AAEAAAABAQAAAAAC////AAAAAQACAf8A/wD//wAAAAD//wAB/wAAAP4AAAD/Af8BAP8A/wEAAQAAAQEBAQABAQEBAP8AAQEBAP8AAQAC/gAAAQABAAAAAAAAAAAAAAEBAAEA/wD/AQAA/wAB//8AAQD/AQEA/wEAAAEBAAEB/wAA//8A//8BAP8AAAEAAAABAP8AAgD//wH//wD/AAAAAAD/AQABAP4AAf8BAP//AAD/AAAAAAABAgAA/wEAAAAAAAABAQAAAAD/AQD/AAEAAAABAAD/AP7/AAICAQH/AAAA/gAAAf7/AQAB/wAAAAAAAAAAAAD/AAD/AAABAQAAAP8AAP8BAf8AAQAAAAAAAQAAAAAA/wD/AQAAAf4C/wEBAAAB/wAAAQABAAABAAD/Af8B/wD/AP//AAAAAAAB//8BAQECAAD/AgAAAQEAAQH+/gD/AAAAAP8AAAEB/wD/AP///wH/AAEAAf8AAAEB/wEAAAAB////AQIBAQAAAAEBAAABAAD/AAAAAQD/AAD//wEAAP8AAAH///4A/v8AAAAA/wEAAAD//wAAAQAB/wABAAAAAQAAAP//AAAA/v4A//8A/wEA/gAAAAAA/gAAAQD/AAH/AQACAQEAAP8AAQD/AAEAAQAA/////wAA/wD/AAABAAEA/wAAAAD/AQH///7/AP8AAgEA/wD/AQEA/wAAAP8AAAD+AgEA/wAAAQEA/wABAQEBAAEB/wD/AP8AAQEAAQAAAQABAQAAAP8B///+AAABAf4CAAAAAAH+/wH+/wH/AQAB/wEAAAH/AQABAAEAAAEAAAAAAQEAAAAAAAEAAAABAP8A//8BAAD/AQABAAH//wD/AQAAAQAAAQH/AAEBAAD/AAD+/wABAP8A/wAAAAAAAQH/AAEBAAEAAAD/AQECAQEBAAABAQABAgAAAAD//wH//wAB/wD/Af//AAABAQAAAAD/AAAAAP8A//8AAAAA/wD/AQAAAQEAAP///////wEB/wD/AAAAAAABAQEBAAABAAAAAf//AQAAAAABAf8B/wEA/wH//wAA/wD/AP8AAAD/AAAAAAAAAQAAAQAA//8AAAL/AAIAAQABAAAA/wAAAAEAAAAAAP8AAf///wAA/wABAAEBAAABAAH/AQECAAEBAAEB/wAA/wABAP8B/gAAAQAB/wABAAEAAAEB/wABAAEAAAAAAAAAAP8AAAEAAf8BAQEA/wAA/wEAAAAAAAEAAAAAAAABAP8A/wAAAQAAAAAAAP8AAAD/AAAA////AP//AP8AAAEBAP///v4BAQD/AQAB/wL///8AAP//AP8BAAAAAAEB/wEAAAAAAP8AAQAAAAAAAP8AAAAAAf8B/wEBAAH//wAA//8A/wH/AgAAAAEAAAD/////AAAAAf8AAAAAAf8AAAAAAAD/AP////8AAQAAAf7/AQEAAP8AAAD/AQAAAAD/AAAA/wEBAQEAAQD/AQD/AAH/AQH/AAAA/wAA////l5ibb25y+Pj1AAABAAAAAAABAAD/QCP/pV78JBQBAAEA/wH/AAAAAf8BAf8AAQACAP8C/wH/AAAB/gH/AP0BAtYNAdsMAPsDAP8AAAABAAH/AAAA0vf4m+z3/wD/AAABAAD/AAAAZWRkKioq/wAAAP7/AAAAAf8AAAD/AAD//////gH//wD///8B/wABAQEA//8AAAAAAQAAAQEA/wEA//8AAgD/////Af8AAAEA//8AAP//AP8A/wEA////AQH/AP8A//8B/wAAAP8AAP//AAAAAAAAAAEAAAABAAEAAgEAAQABAf8BAP8AAAAAAQABAAD/AP//AP8A////AQIBAgAAAAAAAAEBAQIBAAH/AAH/AP//AAEBAf8A/wAAAQD/AAAAAgEAAP8AAAD/AQAAAP///wEAAAEA/wAB/wAAAQABAQEAAAAAAP8AAAEBAQAAAQD/AP8BAAAAAAEAAf8A/wABAQAAAQAAAP7/Af8BAv//AP8A/wEA/wH/AAAAAP8BAP//AQABAAAB//8A/wABAQAAAf8BAQD/AAAAAAAAAf///wEAAAIA/gEAAQD//wAA//8BAAEAAAAAAP8A/wEA/wEAAP8A/wEBAP8A//8AAAL/AP4BAP8AAAAB/wD///8BAP8A/wEAAAAB/wIAAAEBAQEAAQAAAQAAAAEA/wD/AQEA//8A/wD//wEB/wAAAP///wAB/////wD/AAD/AQABAAAB/wAB//8AAf//AQAAAAABAQH/AAEAAP8AAAEAAAAA/wEAAP8B/wEBAf8AAv8A////AP4BAAIAAQD/AQAAAP/////+////AQEBAQEA/wABAAABAQD//wAAAAAAAQEAAAABAf//AAABAAAA/////wABAv8AAQAA/wAAAAAA/////gAB//8AAAAAAP8A/wEA/wEAAf8AAAAB/wH/AAH/AAEAAAAB/wD/AAH/Af4B////AQAAAAD//wAAAAABAP/+/wABAf7+Af8AAAAAAgAAAf8AAP4BAAAAAAAAAAABAAD/AQH/AAAA/wAAAAEAAP8B/wAAAQAAAP8AAAD/AP7//wAAAAEAAf8AAgABAgD/AAEBAAABAAECAAICAQAAAAH/AAABAQEAAP8AAAEAAAAAAf8B/wAA/wEA/wEA/wEBAAEA/wD/AQD/AAAAAAAB/wAAAAD//gD//wEAAQABAQH/AAEAAAEAAf//AAEAAP8A/gD+AAH/AQEBAf//AAABAAAAAf7/Af8AAf///wD/AAABAAEBAf//AAIBAAH+AQAAAP4A//7+AAH//wEAAAD///4AAAAA//8AAf8C/wECAf8A/wAB/wD/AAEBAQABAQEBAf8A/wEBAAAAAP8A/wD/AAAAAAEAAAD/AAEAAf8AAAAA//8AAP8AAAAA/wABAAAAAAEAAf8AAQAAAAD/Af/+/v8AAP8AAQAAAAABAAAA/wEB//7/AP8BAAD/AAD/AAD//wD//v8BAP8B//8AAAAAAQD/AAEAAAEAAAABAAD//wD/AAAAAP8AAP8B/wIB/wAAAAD+AP8B//8AAAECAQAA/wAB/wEAAf//AP8AAAD//////wAAAP8BAf8BAAAAAAAAAAAA/wEAAgEA/wAAAAACAQAAAQAA/gD//wAA/wAAAQL/AAIAAv7/AAD///8B/wAAAAD/AAAAAAABAP8AAQEAAAAA/wAA////AP//AP//AAD/////AAAAAQEAAAAB/wEBAP//AAEAAAD/AQAB/wEBAP8A/wAAAAD/AAAAAP//AQAAAAAAAAEBAAEAAAAAAAAAAAAAAAH/AAAAAAH/AP8A/wAAAAABAAEBAAABAAEAAQAAAAAB/wD//wEBAQAC/wABAAAAAAD/AAEAAAAAAAEBAP8BAQEA/wEAAAAA/wEBAAAA/wAAAQD/AAAAAAAAAAD//wAAAAD/AP8AAAH/AP8BAQH/AAH/AP8BAAD/AAAB/wAAAQABAAEAAAABAgAAAf8AAP8AAAAAAAH//wEBAf8AAAD//wABAQAAAAD//////wD/AP4AAAAAAP//Af4AAAEAAJCSlXFyd/f39gAAAQAAAAAAAgAAAD0fAqBa/hwQAAEAAAD/AQAAAQABAP7//wABAP///wAA/wD/AAD+/wD8AgDaCgDcCgD6BP//AAAAAf///wAAAfL8/Xvl7t/8/gAAAgAAAQAAACEjI2xtaAEAAP//AAABAP//AAAAAAAAAAEBAQAAAAEAAQAAAQEB/wEAAAAAAAEBAP4AAAAAAAD+AAEAAAEAAP8BAQIBAP8A/wAAAAEBAAAAAP8AAAEAAAD/AAD/AAAB/wAB/wEAAP8AAAAB/wABAAEAAQAAAQAB/wEAAAD//wEA//8AAAABAP7/AAABAP8AAQEAAAAAAAEBAAD+AAIAAAAAAAAA//8A/wAAAAABAAEBAgH/AP8A/wEAAf8AAAAAAQAAAAEAAP8BAP//AP8BAAEAAAD//wAAAAEAAAAA//8AAAAAAAAB/wAA/wAAAAABAQEBAAACAQAAAAAB/wH//wAAAQAAAAABAAAB/wABAAEAAAH+AAAAAAD///8AAAEBAAAAAf8AAAABAAEA/wD/AQABAAEBAQABAQAAAAAAAQL//wD/AAEAAf8BAAD/AAABAAH//wAAAAAA/wD/AAABAAEAAQH/AAD/AQEBAf//AQAAAAEBAAACAAIAAAIBAAD//wH/AQEAAAH//wEAAP8AAAAAAAEBAAH/AAD///4A/wAAAAAAAAH/AAD//wEBAAAB/gEAAAEAAAAAAAAAAAAA/wAAAAAB//4AAf4AAP/+AP8AAAD/AAEBAAD+////AAD/AQAAAQEAAAAAAf8AAAABAAEA/wD/AP8BAQEAAAAAAQEAAgEAAP///gAAAAIA//8AAP///wAA/wAA//8BAAD/AAEAAQAAAQABAAAAAAAAAP8BAAH/AAAA/wAAAAABAQIAAAEAAP8AAAABAAH/AAD/AAD/AP8AAf8AAf4AAf8BAQAA/wEAAQD/Af8CAAABAv8A/wD/AQABAP//AP8AAf///wAAAv8AAAH//wAAAP8A//8B//8BAAAAAAAA/wAAAQD/AP//AQAAAP8AAQEA/wABAAAA/wABAP//Af8BAAEAAAAAAAABAP8A//8C/wEA/wABAAEB/wD///8AAQAAAP8A/wAAAQAAAQAAAP8AAAD/AAD/AQAAAAEAAAH/AAD/AAABAQAAAQABAP8A/wD/AP8AAgEAAAAAAQAB//8AAAD/AAAB//8BAAAAAAAAAQAAAQAAAP//////AQABAAEAAf8BAAAAAAEBAAAAAAAB/wD//wABAf/+/wD+Av8AAAEBAQACAQAAAQIBAgEAAAABAAABAQD/AP4AAAAAAAABAAD//wAAAQH//wAB/v8A//8BAAEA/wH//wABAQEAAAAA//8A//8AAgD+AP8A/wEAAAH/AAAB//8B/wEA/wAAAAD/AAAAAP4AAQAAAP8AAQEBAAECAAAAAQD//wAAAQH//wEBAQAC/wAAAAD/AQEAAQAAAAABAAABAAAAAAAA//8AAAAAAP8A/wAAAAH/AQAAAQABAQIAAP8BAAAA/wD/AAABAQH/AAABAAD//wABAQIB/wAAAP8AAQAAAP//AgABAQD/AP8AAAAA/wAAAQABAQAAAAH/Af8AAAIAAQAA//8BAAAAAAEAAAAAAAEBAf8AAQD//v8CAAAAAQAA/wEB/wD/AAAA/wD///8B//8AAAABAP8AAAD/Af4A/wAAAf8AAAABAP8AAAD/AQD///8AAAAAAQAAAAH///4A/v8A/wAAAAAB/wAAAQEAAQAB//8A/wAA/wEA/wAA/wAAAQH//wAAAQEB/wEBAAAAAQEAAAL/AAD+/wD//wEAAAAAAAABAP8AAAAAAAEA/wABAAAA/wEBAf8BAAABAAAAAAD/AQEB////AAEAAQAA/wEAAAEA/wAA//8AAgAAAAD/AP8AAAAA/wH//wAAAf8AAAEAAAD+AAD/AQAB/wAAAAABAQEAAAAAAAAAAQAB//8AAAAAAP8AAQABAQH/AQD/AAABAAAAAQEAAAD/AP8BAQABAQAAAAAB/wABAAAAAAD08/N5en55eHv5+PUAAP8AAAAAAAIAAAA7IACZWP0eD/8A/wD///8AAP///wD//wAAAAH//wEAAQAA/wD/AAH//AIB2woB2gwA/gIAAP8B/wD/AP4AAAL+/v+U5/K59P8CAAABAP8AAP8AAQJ0dXEgHyD///8BAQEAAAH//wAAAAEBAAEAAAABAAEBAf8BAAD/AAH/AP8A/wD//wAB/wAAAAAAAgEAAAAAAQAA/gD+AAEBAQEAAAEA/wABAf8BAP///wABAQAAAQD//gABAAAAAAABAAAA/wEA/wAAAf4BAP8A/wH//wD/AAD/AQEAAAAB/wABAAD//v8BAP8AAAAAAAEAAAEBAf8EAAABAAD/AAAB/gD/AQAA/wH///4AAQEA/wEAAQAA/gAAAf/+AAABAP8B/wEBAQAAAAD/AAAAAAH///8BAf/+/wEBAQAAAAABAAD/AAD/AP8AAAAA/wD/AP8BAAAAAAEAAf8AAAD+AQABAAH/AP8BAAAAAQAAAAAAAAIBAP4AAQABAP/+AAAB//8AAAEAAQAAAQAA///+AAEBAAAAAP8AAAH/AAAAAAD/AQAA/gD/Af8B/wH/AAEAAP8AAQABAAAB/gD/AP/+AQACAAD//wEBAAAAAf//AP8B/wH+AAEB//8AAQD/AP8B/wH/AAEAAAAB/wAAAQD///8AAQAB/wD+/wABAQABAAIA//8AAAAAAAEA/wAAAQD//wAAAAEAAAD/AAECAQAA/wEAAQD/AAEBAAAAAAEAAAD//wAAAQABAAAAAAABAP8AAAAAAAAAAAAAAAH9AQABAAABAAD+AAACAAAAAP8BAAD/AAEAAAD//wACAAD/AAD//wABAQABAAAAAP//AAIAAAAB/wEAAAAAAAAA/wD/Af//AAACAAAA//8AAQH/AAAB////AAAAAQEB/wD/AQABAP//AAABAAAA/v4BAQH/AAAAAAAA//8AAf8BAAEA/wD/AAAAAQAAAP8A/wD/AAABAAD/AQEA/wAAAQABAAD//wD+AQABAAEB//8AAAEBAf8A/wL/AP8AAQEB/wAAAQAA/wH/AQACAAH//wABAAAAAAAAAAH//gH/AP4BAf//AAEBAP8BAAAAAAAAAAAAAQAA////AP8BAQIAAf8A/wAAAAAAAQD//wAAAQAAAAAAAAAAAAAA/wEAAf8BAP8A/wEAAQAA/gEBAf8AAAD//wEAAQEB////AAABAAD/AAABAAD/Af4A/wH/Af8BAAAAAQH+AP8CAQAA/wD+AQEC//4AAQIA//8BAAH///8BAQABAAH/AP8AAAAAAAEA/v8AAQACAQH+/wAA/wABAAEA/wAAAQAAAAEAAQABAAAAAAD/AAABAAEAAP//AQEB//8AAf8A/wAAAgH/AAAAAwAA/wEBAAAAAAD/AAEBAgD///8BAP4AAAEAAQEAAP8B/wEAAP//AQEAAf8A/wEAAf8AAAAAAQD/AP8BAAAA/wABAQD/AAABAAEAAAAAAf//AAEA////AQABAQAA/wAAAv8AAf8B/gEBAAD/AAAB/wD/Af8BAAAAAQABAP8AAAAA//8AAAEAAAABAf8A/wAAAAAC/wD+AAACAf7+/gEAAAABAP//////AAAAAP8AAAH//wEAAP8AAQAA/v4BAQH/AAAAAAAAAAAAAQEAAAAAAQD/AAEAAAAB/wH//wAAAAABAf//AgAC/wIAAP8AAAEBAP//AQAAAf8A/wABAP8AAQEA/gD/AAEBAAAB/gD+AgAB/wIAAP////8AAQEBAAAA/wD/AQEAAAAAAAD/AAEAAP///wH//wEBAQD/AgAA/wAAAQD/AAABAP8BAAD//wACAP//AAD//wAAAQAA/wD///8AAAEAAAAAAAAAAf//AAEAAP///wEAAQEA//7/AQEAAAAAAf8B/gAAAQH/AP8AAAEAAQAAAP8CAQH//v8AAAEA/wAAAAEAAQAA//8AAAH/AP8AAP8A/wAAAAD/AQEBAAAA/gEAAP8AAQD+/wEBAQAAAAAAAQEAAAAB/wD/AAAAAAAA/wAB5OPkaWtvtbS0AAD/AAAAAAAAAAD/AAAALhkBpFz+HhH///8BAgAAAAAA//8AAQH/Af8B//8AAAEAAAAAAAEAAPkDAtUNAOAJAP0DAP7//wABAAABAP/////+t+71ke33/QD+AQAC/wAAAAAATU1MW1hX////AQEBAAAA/wD/AgEAAAH/AAAB////AQAA/v8AAQH/Af8A/wAA/wABAf///wEAAAAAAQAA//8AAgAA/gEAAf//AAAB/wAAAQAA/wAA/wAAAQABAAD///8BAAH/AAAAAAEBAAAAAP//AQAAAP8BAAAA/wAAAAD/AQABAAD/AAAA/wABAAAAAgEA/wAAAAEAAP8AAAAA/wAAAf7+//8AAAEA//8A/wAAAQIBAP//AAAAAAD/AQABAAAA/wEAAAAAAAD///8BAQAAAP8AAAIAAf8AAAEA//8AAAABAAD/AQAB/wAA/wAAAQD/Af///gEBAQABAP8AAAD//wEAAQAAAAAAAQEB//4AAAD//wEAAAABAAD/AQAAAP8AAAAAAAEBAAD/AP8AAP8A/wIBAQAAAP//AAD//wABAAEAAQD/AAAA/wABAAD/AAACAP//AAH/AP8BAAEAAf///wABAAAAAAH/AP8BAQD//wABAgD//gABAAAAAQH/AP8AAAD//wACAQH///8AAAEBAP8AAQEAAQAA/wAAAAEAAAABAP7+AAABAQEA/wAA//8AAAEAAQAAAP///wAB/wEBAv/+/wEBAP8BAAH/AP8A/wH/Av8A/wABAAAAAQEA//8AAAAAAAEAAP8AAQEA/wAAAQD//wABAP8AAAD/AAABAQH/AP8AAAAA/wEBAP8AAQH//gACAgD//wD/AAABAP////8AAQEB/wAAAQAAAAAAAAEAAP///wIBAv////8BAAEAAP//AAAAAAABAAAAAAH/Af8BAAEAAP8A/wAAAAD/AQAB/gAAAQD/AAABAAEAAAAAAAAAAP8AAAAAAQEAAAAAAP8AAAD//wEBAQAAAAAAAAAAAP8AAAEAAAAAAP8AAAAA/wEA/wAAA/8A/wD/AAAB/wEAAQAA/wAAAP8AAQH/AAABAAAB/wEAAQAA////AQD/AP8B/wEBAQAAAAD/AP///wABAQABAP//AAH/AAACAAD/AAAA/wABAQD/AAEAAP8A/wAAAQEAAAAA//8AAAEBAP//AAABAgH//wABAAAA////AAEAAAEBAP//AQAB/wD/AAAAAAAAAAAAAQD//wABAgAA/wABAP//AAEBAAD/AAAAAAABAQD///8A/wEAAQABAAAAAQH///4BAQH//wEAAP8A/wAAAQABAQD/AAAA/gAAAQAAAAABAP8AAAH/AAAAAQD//gABAQAAAQABAAAA/wD/AAABAQD///8AAAEA/wABAQAAAAD/AAEBAP8AAAH/Af////8AAAABAAEA/wAAAQAAAQAA/wAA/wEAAf4AAQIB//4AAAH/AAAAAP8AAAAAAAEAAQAA/wAA/wAAAQABAQD+/wAB//8AAAAAAQAAAQEAAAAA////AQIBAP8A/wAAAP///wABAQEBAAAAAQEA//4AAAH/AP8AAQAA/wAAAAEAAP8AAAAAAQAA/wEAAP8AAQAA/wAA/wEAAgD///8BAAEBAAD/AP8AAAAAAAH/Af8B/wD/AAEBAAAAAAAAAAAAAAABAf//AAAA/wEBAf///wEAAAAB/wD/AQAAAAAAAP8AAAEAAAAAAAAAAAAAAAAAAQD//gACAgD//wABAAD/AAAAAAAAAQAAAAAA/wD/AAABAAABAAD/AAAAAAAAAAAAAAEB////Af8B/wH/AQABAAD/AP8AAQEA/wAAAAEBAP//AAAAAAD/AAABAQAA/gABAgD//wABAQEA////AAABAQD+/wAAAAABAAAAAAAAAQEBAP//AAAA/wABAP//AAEBAQAAAAAA/gD/AgAA/wABAf///gEBAgAA/wAAAAAAAAD/AAABAAAAAQAAAAD//wEAAQAB////AQAAAAABAAAAAP//AAEBAAAAAAD/AAEAAP8A/+np6l1dYr28vP8A/wAAAAAAAAAAAAAA/0Yj/pBSAScZ/wH/AAD//wEBAgAA/wAA//8AAgAA/wAAAAD/AAAB///3BQLRDgDlB//9AgAAAAD/AAEAAP/+///8AL/y+GDi8uT8/QAAAQABAAD/AC8zM62qqCIiHwAAAQAA//8AAAEAAAD/AP8BAQIA/////wAAAgAA/gAAAgAA//8AAAAAAAIBAP4AAQEAAAAA/////wAAAQABAAH/Af8A/gAAAQEBAP//AQAAAAAA/wIAAAAAAP8BAP8AAAEAAf8A/wEAAQD//wAAAQD//wACAAAAAQD//wAAAAAAAQAA/wABAP//AQAAAAAAAAEAAAEAAP4A/wH9/v4B/wD/AQABAf8BAAH+AP8A/wABAAD/AAEBAP8AAAAAAAAAAAEAAP8AAAH//wAAAf8BAAIAAf8A/wAAAAH/Af8BAP//AAEBAAAA/wAAAQAA/wAAAP//AAEB//8AAgEA/wD//wACAQD/AAAA/wD/AQECAP/+AAABAAAAAQD//wAAAAAAAAD/AQAB/v8AAQEBAAAA////AgAA/wAB/wAAAQEAAP8AAAAAAAD/AAABAAH/AP8BAAEA//4AAQEAAAEAAP8AAAD/AAABAAAAAAH//wAAAgAA/gAAAf8BAAH//wAAAQAAAAAC////AAD/AAEBAgEA/wAAAP/+AP8CAAEAAP8AAAEAAP//AAEBAP8A/wD/AQAA/wH/AP8BAQEBAAAAAP8AAAD/AAABAQEA/wD//wABAAD/AP8BAQAAAQH+/wABAAAAAP8BAAAAAAD/AP8A/wEBAgAB/wD+AAAA/wEBAAAAAQD/AAAAAAAA//8AAAEBAf///wAAAAABAQD/AAAB/wEAAv///wABAAAAAAAAAP8A/wEAAQAAAQAA/gD/AQAAAP8B/wH+AQEBAAAAAAAAAf8A/gAAAQAA/wABAAAAAQEAAQD//v8BAQAAAAAAAAAAAAD//wEAAQAAAP8AAAAAAAEBAAAAAAAAAQAB//8AAAH///8AAQH///8AAQAB/wAAAQH///8BAQAA/wAAAQAAAAABAAH/AP8BAQD//wAAAAAAAAH/AAABAP8AAAEAAP8AAQEA/wAAAQAA/wAAAP///wEBAP//AQIA/wABAf//AAAAAP8BAAAAAAH/AQD//wACAAAAAQD//gABAQD/AAAAAAABAAH/AP8AAAABAAAAAAAAAAAAAAAA/wAAAP8AAQAAAAEA//8AAQAAAQD//wIA//4AAAABAQL/AP8AAAAB/wAAAQABAAD/AP8AAAAAAAD//wABAQH//wAAAQACAf///wEAAQAA/wAAAAAAAAAAAAAAAAAAAQD//gABAQEAAP8A/wD/Av8A/wEBAAD/AAABAAAAAQD/AAAB/wAAAAAA/wAAAf//AAIAAP8BAAAAAAAAAAEBAf///wAAAP//AAACAAD/AAAAAQEA/wD/AAAB/wAAAQAAAAEAAP8AAQAA/gAAAf8BAAH/AAAAAAD//wABAQAAAQAA////AAAAAAAAAAAAAAEBAAAA/wAAAQEAAP8BAQH+/v8AAQABAQD//gABAgAAAAH///8BAAH/AP8BAAD/AAEBAP//AQAB/wH/AP8BAAAA/wD/AQECAAD+AP8BAAH/AP4AAAAAAAIBAAAAAAD/AP8AAAABAAD/AP8BAAEAAQEA/wAA////AQAA/wABAQAAAAD/AQAB/wD/AAAAAAAA/wAAAQABAAAAAAAB/wAAAgD//wAAAAD/AAAAAAABAP///wEBAQABAAH+AQAB//4AAAIBAf/+/wAAAAEAAP8BAAAAAAEAAP8A/wAAAQD/AQAB/wAAAAABAQD//wAAAQEAAP8BAAD//wAAAQD//wEAAf4B/wIAAP8AAAAAAQAAAP///gECAQH/AP8AAQEA////AAEBAAAAAQD/AAAA/wABAf8A/wAAAAAAAQAA/wEAAP8AAQAA/wEAAf4A/wEAAQAA/wEAAAAAAf8A/wD/AAABAAEAAAD/AAABAAAAAAAAAQAA/wAAAQD//wAAAQDKyMpwcXTJyMcAAAAAAAEAAAAAAAAAAP5bLwCUVv8QBwD/AQEAAP8BAAD/AP8BAQEA/wD/AP///wEAAP8B/wEA6wkB1A0A8AUA/wEA/v4AAAEAAAH//QAA///O9Pte3+7W+/4AAAAA/wEAAAAXGRm1tK8yMjEAAAD/AAAA/wAAAAABAQH/AP8AAAAA/wEBAAAA//8AAgAA/wD/AAAAAAABAQAA/wAAAAEA//8AAgAAAAAA/wEAAAAAAP8AAAAAAQH///8BAQEA/wAAAf8AAAD///8AAAEBAAD/AQAB/wAAAAD/Af4B/wMAAAAAAAD/AP8BAQAB/wAAAAH/AP8AAAAB/wD/AQEAAP//AAAAAQEB//8EAQAAAAL/AAAB//8B/wEAAf8BAf8B/gEAAAD+//8AAQEAAQEB/v7/AAECAf//AQEAAAAC/wEAAf8B/wD+AQAAAf8B/wABAQD/AAAAAAD/AAABAf8B/wEAAAAAAAEC////AAAAAAAA/gAAAAAAAQH/AQAA/wAAAQAAAAAA////AP8BAQEAAAD/Af8BAAEBAAAA//8AAAEBAf///wAB/wD/Af8A/wABAAEAAAAAAQH/AAAAAf8A/wAAAQAB/gAAAv//AAAA/gAAAQAB/wIAAP8AAAEAAP7/AQEA/wAB/wAAAAD/AQAB/wAA/gEAAQEAAf8A///+AAEAAf4AAgEAAAAAAAAAAAD/AAAAAAD///8AAQEBAQAA/wH/AgEA//7+/wEBAAABAQEAAf//AAD/AAAAAAEB//8AAAECAAD///8AAf//AQAA/wEBAAD/AAABAf8AAAIB////AAAAAQAB/wEA////AAAAAQAAAAABAAEAAAD/AAABAQEA////AAAAAAAAAAH+//8BAQAAAAAA/wAAAAECAQAA/wAAAP7/AQAAAf8A/wEAAAH/Af8AAAEAAP8AAQAAAAEB////AAAA/wEAAQD/AP8AAQH/AP8C/wEAAQAAAP//AAEAAQAAAAAAAP8B/wAB/wH/AP8AAAD/AAAAAP8AAQAB////AAIAAf8AAAL/AP4AAAAAAAAA/wABAf///wECAAD/Af8A/gAAAQABAAAAAAAAAQD+/wABAAEAAP8AAgAA/gAAAP4AAAEAAQAAAAH/AAABAQH///////8AAAEBAAAAAAEBAAAAAf8AAAH/AAABAP8AAAEAAAAAAQAAAAEA////AAAAAAABAAD+/wAAAAAAAAEBAQAA/wEBAQD/AP7/AAEAAAABAP//AQD+AAABAAIBAP//AQEA//7//wEBAQAAAAEBAf8A/wAAAAEAAQAB/gAAAgH/AAAA/v4AAQEA////AQAAAQEB////AAEBAAABAP//AQEAAP//AAAAAAEAAf8BAP8AAAEAAQABAAH/AP4AAQEAAP8AAAEA/wEAAQAAAAD/AQAAAAAAAAAA/wD///8AAQAAAAACAQD/AAAAAAAA//8BAAD/AQAAAAEAAP8BAAD/AAEB//8AAAL/AQAC/wD/AP8AAP8AAQABAAD/AP8AAAABAAAAAQD//wABAQH/AP8B/wH/AQEA/wAA////AQEBAAAA////AAEA//8AAP//AQIAAAD/AQAA//8AAQAA/wAAAf8A/wD/AQAB/wH/AAD/AAEA/v8AAQAA/wD/AQEC////AQD//wAAAAABAAAAAQABAAAAAQAB/wH/Af//AAEB/wABAAD+AQAA/wABAgAAAP8AAAEBAQD/AAAAAAEAAAAAAP4BAAEA/gH/AQAAAAAAAAD/AAEBAf8AAAABAAEA/wEAAP//Av8A/wACAAAA//8AAAABAQD/AQAB/wH/AAAA/wABAQH/AAABAv8A/gAAAQAA/wD/AAEAAAD/AP8A/gAAAQEB//8AAAD/Af8B/wD/AQEA/wAAAgAA//8BAQIA/wAAAP8BAAD/AAABAQH+//8BAf8AAQEAAAAAAP8BAQAA/wAAAP//AAD/AAEAAQAAAAH/AAAC/gAAAv///QD+AgACAAABAAAAAAEA////AQABAQAAAAEA//7/AQEBAQEA//8AAQEApqapbm9y7uzqAAABAAD/AAD/AAAAAAD/TSkAkVL+EAYBAAD/Af//AAEA/wAAAf8BAAD///8A/wAAAP//AP4CAOMLAdgMAPYCAP4AAAD+AAECAP4A//7///8Bv/L6Z+Pv3fr9AAABAAEAAAIBAP//enh4MjEyAQD//wAAAgAA/wEAAAAAAP//AAAAAQAAAAEAAP///gEAAv8A/wAAAgEB/wD/AP8BAAD/AQD//wEAAAAB/wD/AQD/AAD/AAEBAP8A/wD/AQAAAP///wABAf8B////AQEB/wAAAAABAQAAAAD/AAAAAQADAAD//wAAAAEBAQABAP///wD/AAAAAAAA//8AAAEAAAD/AAABAQH/AP8AAAAAAgH/////AAH/AQEA/wAAAQAAAP8C/wEA/wIAAAECAQEAAP//AAEBAQEA//8AAAAAAAAAAAH/AAD/AAEAAQAAAP8B/wEA/wAAAP8AAAAAAQH/AP8B/gAA/wEAAAAAAAAAAP8AAAAAAAAAAQEAAAAAAf8A//8AAP//AAAAAAAAAQECAAAAAAABAQAA/wAA/wABAAAAAAEAAP8AAQAA/wAAAP8BAAAB/wEAAAH/AAD/AQD///8AAAH/AP8B/wL/AAABAP8AAAEBAAEBAAD//wEAAAAAAAEBAQAAAQD//wEAAAAAAQAAAAD/AP//AP//Af8AAAEAAgH+AQAAAQAAAQAA/wABAf//AAAAAAAAAAABAAD//wAAAAAAAAD/AAECAQABAgD////+AP8AAf7+AP8AAgH/AAAAAAH//v8A/gEAAAACAAABAAEA/wAAAAAA/wEBAQH//wEAAAAAAP4A/wEAAAAAAAH/AAAAAQAAAP//AP///wAA/wAA/wABAP8BAAEAAAAAAQH/AQAAAAEAAAAA/wH//wAAAAD//gEAAQABAAAAAAD/AP//AQEAAAEAAAEBAAAAAQAAAAABAAABAAEBAAAAAAD/AP8AAf8B/wEAAAAAAP8BAQH//wAA/wD/AAECAAEB/wAAAAABAAEBAQD/AQAB//8BAAABAAAAAQABAf//AQABAQEBAQAAAgIC/wABAAH//wAA//7/AAABAQAA/wEAAP8A//8AAQEAAQH//wD/Af//AAEAAAEB/wEAAAD/AAEAAP8AAf/+/wABAQACAQEAAAAAAP//AAAAAAAAAAD/Af//AAAAAAAA/wAAAP8AAP8AAAEBAAABAAL//gAAAQAAAQEAAQH/AAAA/wH/AAD/AQEBAAEAAAAA/wAAAf8AAQABAf///wAAAAH/AAEBAQEAAAAAAP7//wD/AAAAAP/+AAAA/wP/AAAAAAAAAAEBAAAAAAAAAP8AAf//AP//AQD+AAD+/wAAAAAAAQAB//8B/wD/AP//AAABAP8A/wAA/gD/AP8BAQABAQABAP8AAAEAAAAAAgEAAP8AAAAAAQAAAAEAAAEAAQAAAP8B/wD/AP4BAAEAAQEA/wEBAAABAP8BAQACAP8BAP8A/wEA/wD/AAD//wD/AQD/AAEBAQABAAABAf//AQAB/wEBAP7/AQEAAAD/Af8BAAIAAQD/AAIAAAEAAAAAAP///wAAAQAAAAEBAQAAAP//AAAAAAD/AAEAAP4A/wH/AAAAAAEAAf8A/wD/AAH/AgH/AAAAAP8A/wAAAAD+/gEAAAABAAAAAQAA/wD/Af8A/wABAAABAAH/AQAAAAH//wH/AAEAAQABAQL/AP8AAAAAAAD//wAAAQAAAQD/AAD/AAEBAAABAAEBAP//AAAAAAEAAQH/AAAAAf8BAQEAAAH/AQABAf4AAQABAP8A/wAAAAH/AAAAAQAA/wH/AQEAAAH//wAAAAD///7//wEB//8B/wD/AAAAAQD//wABAAAAAAAAAAEA/wAAAAAAAAEBAAD/AAH/AAD/AQAAAQD/AP///wAAAAD+AQAA/wAAAAEAAQAAAAAAAP8BAAAB//8BAP8AAAAAAAAAAAD/AP8AAQD/AP///wIB//8BAQIAAQEBAAD/AAAB/wH//wL/AAAB/wAAAAH//wEBAP8AAP4AAAEB/5aWmWVmaO7s6gAA/wAA/wAAAAAAAQMAAHE7Aatf/hMLAf8C/wACAAABAP8AAAAAAQAB////Af8AAQEB/wH7AwLaDQHUDAD1AgD+AQAA/wD/AAD//////wD/AMn0+mvh8d34/QAB/wAAAAD/AAD+/WRlZWVmYQEBAAAAAAEAAP8AAP8AAQAAAAABAQEAAQAAAQD/AAABAQIAAf8BAAEAAAD//wAAAP4B/wABAf8BAAABAAD//wH/AP8AAP8AAQD//wAAAAH/AAABAQAAAAAB//8A/wEBAP8BAAEBAAAA//8A/wABAP8AAAD///8AAQAAAAH/AAD///8AAAAAAQAAAQABAQECAP8AAAAAAf8A//8AAAAAAAAAAQH+/v4AAAAAAAH/Af8B/wAAAf8A/wH///8AAgEBAAH/AAABAP///wABAAABAAD+AAAAAAEAAf8B/gEAAf8AAAEAAAAAAAAB//8AAQAAAAH/AP8B/wD+AQEAAP4BAAAA/wEAAgAAAAD//wAAAP8BAAAAAQEA/wAAAAD/AAAAAAAAAAABAQD///8BAAD//wABAgD+AAAB/wABAAEBAAD+AAABAAAA/wAAAAAAAf8AAAH/AP8B/wAAAAEAAP8AAQD/AAAAAAAB/wD/AQEAAAABAAD///8BAQEAAAAAAQAA/wD/AQAA/wABAAAA/wD/AAABAQAAAAAAAP//AAEBAAAAAAD/AAAAAP8BAQD+/wEBAAAAAP8AAAAB/wEAAQAAAP//AAAAAQAA/wABAAD/AP8AAAIAAP8AAAAB/wD/AgIA/v8AAQAAAQABAP8A/wEAAP8AAAEAAP8AAAEAAP8AAAAAAAEAAAD//wABAP//AQEB//8AAQAAAP//AAEBAP8AAAD/AAEBAAEA/wD/AP8BAQD/AAEA//8AAAAAAQEB//8AAQAAAAAAAAEA///+AQACAP///wEBAQAAAAD///8AAAIBAQD/AAAB////AQACAAD//wH/AQABAP8AAAH/AP8A/wAAAQEAAAABAAAAAAAA//8AAQAAAAH/AAABAAAA////AQAB/wD/AQABAAEAAAAA/wD/AP8AAAAAAQEBAAD/AAABAAEAAP7/AAEBAAAA/wD/AQABAAD/AP4B/wEAAQEA/wAAAQAAAAAAAAAAAQD//gABAQD/Af8B/wIAAP//Af8B/wEAAQAA////AAABAQD//wEA/wAAAQACAAD/AAD/AAAAAP8AAAH///8CAgEA/wABAAD//wAAAP8AAgEA/wD/AP8AAAABAAAA/wH/Af8B/wH/AQABAAAAAAAB/wD/AQAAAAAAAAD//wABAf8AAAD//wEAAQAAAP//AAAC/wEAAQAAAAAAAAEAAf8A/wAAAAAAAAAAAAEAAP4AAAEAAAD/AP8B/wEAAf8AAAEAAAAAAAAAAAAAAAD/AAAA/wECAP//AQEAAP8AAAAAAAH/Af8B//8AAAD/AAEBAAH/AP8BAAAA/wD/AQABAAEAAf8A/wD+AAABAAABAAEAAP8AAAAAAAH/AP8BAAH/AP8BAAAAAAAAAQAAAAD//wAAAAABAAAAAQAA/wEAAP8AAQD//wEAAP8A/wABAgAA/wAAAAD/AAACAQH+/wAAAAAAAP8AAQAAAAEB/wD///8AAQABAAEAAP8AAAAAAQAA/wEAAP8AAAEAAP8AAAH///8BAQD/AAEAAQABAP8A/wAAAAH/AP8BAQABAAAA/wAAAAD+AQEBAAAA////AAAAAAEAAP8BAAD/AAABAQEAAAAB////AAAAAAEAAf///wABAAAA/wAAAQEAAQD///8AAP8BAQEBAAH+//8CAAD+AAEBAQD//wABAQAA////AP8AAAEBAAAAAQD/AAEB/wAAAAAB//8AAQH/AAAAAAAAAAAAAf4AAAIB/wD/AAABAQD/AAD//wACAf//AAAAAAAA/wAAAQAA/wEAAQAAAP8A/wAAAQEA/wAAAf8A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//8BAQD/AQEA/wAAAP8AAAAAAAEB////AAAAAQAAAAEB////AQEB//8AAAAAAQAAAAH/AP//AAABAAAAAQAA/wH//wABAQAAAP8AAf7+/gAAAAEAAP4AAQEBAP8A/wH/AAAAAAAAAP//AQEB/wAAAQAB///+/wEAAQEBAP8A/wAAAQAA/wABAQD/AAABAP//AAAAAQH//wACAP//AAEAAP8A/wD/AQEBAf///wACAAH+AAABAAAAAAAAAP8BAAH/AP8AAAD/AAEBAf///wAAAAEAAAABAAAAAAAAAAAAAAAB//8AAAD+AQAAAAAC/wH/AQAAAP7//wEB/wEAAv4A/wIAAP///wEBAf//AQEAAAAB/wAAAP//AAABAAEAAP8AAAEAAQAAAAABAP///wD//wABAgD//wEAAQAB/wAAAAD/AP8BAAEAAP//AAEBAf///wEAAQAAAAEB//8AAf//AAEA//8AAQEA/wAAAf8B/wEAAAAAAP//AQEA//8BAAH/Af8AAAEBAAAA/wAAAP//AAEBAAEAAf4A/wEAAf///gEBAQABAQH/AP4A/wEAAf8AAAEAAAD//wACAP//AAAAAAEAAAAAAAAAAP8AAAEAAQAB///+AQAA/wEA//8AAQEAAAACAQD///8AAQAAAP8AAAIAAP8A/wEAAf///wEBAAD/AP8CAQD+/wEAAf8B/wEAAP//AQEAAAABAAAAAQD//f8BAQEAAP8BAAD/AQAA/wEAAQD/AAAB////AAEAAf8BAAAAAAAA/wEAAf8AAAH/AAABAAAA//8AAAAAAQEAAQAA////AAABAAH//v8BAQAAAAEAAQD/AP8B/wEAAAAAAAAAAP8AAAEAAgAA//8AAAH//wAAAAAAAf8BAAAA/wAAAAAAAQEA/wABAQD///8AAQEAAAAB////AAABAAH/AAAAAAAAAf8AAAAA/wAAAQIBAP7/AQAAAAAA/gEAAQAAAAD//wAAAP8BAAAAAAEAAf7//wIBAf///wABAQD/AAEBAAD//wAAAQEBAP4AAAH/AAABAAAAAAAAAAAAAQAA/wAA/wABAP//AAEAAgAAAAEA//4BAQEAAAD//gAAAQAAAP//AAABAAEAAAH/AAABAP8AAP8BAAAAAAH/AAAAAAEB//7/AQH/AAAAAAABAAAAAP8AAQEAAAAA//8AAAEBAAD/AP8BAAH/AQEAAP4AAAEB////AAH/Af8CAAH//wAAAAAA/wAAAAD/Af8BAAEAAAAAAP8A/wEAAQEAAP/+AAEDAf///gAAAQAA/wABAgD//v8AAQEAAP8AAAEAAAD/AAABAf///wACAAD/AAIAAP8AAP8AAQAAAAAAAAEA/wD/AP4BAAEAAAEBAAAAAP//AAEAAP8A//8AAQEAAAEAAf8AAAD//wABAAEAAAAAAP//AAICAP7/AAEB/wAAAgD///8AAAEAAf8AAAEA/wD/AQEB/v8AAQABAQAA/wD//v8AAQEAAgAA/wAAAQD/AAAB////AAEBAAEAAf8BAAD//wAAAQAA/wEAAP8AAQAAAAEA//8AAAAAAAAA/wAAAf8A/wEAAf8AAAEAAQABAAD//wABAf///wEAAAD/AQAB/wAAAAAAAAABAQEAAAD///8BAAAA/wH/Av8A/wABAAD/AAEBAf///wAAAQAB/wAAAQEAAP7//wEBAQAA/wAAAQD/AAABAP//AAEBAAEAAP//AAAAAP8A/wEBAQD/AAABAAD/AP8BAAH/AP8AANPU1F1cYNPS0AAAAQAAAAAA/wAAAgAA/xgNAKRa/EMlAgD//gAAAP8BAAD/AQAAAAAA//8AAQAAAAAAAAHwBgHYDADpBQD9AgABAgD//wAAAQD//wAAAv/+/wH+AcHy+2fj79n3/AAAAAABAAAA/wD/ASIlJrGvqisqKwEBAf8AAP8A/wD/AAEAAQABAP8A/wH/AAABAAD/AP8AAAEAAQAA/wAAAAAAAAAAAAAAAAAAAAAA/wABAgAAAAAA///+AAABAAEAAAABAf///wEAAAAAAAEBAf///wAAAAAAAAAAAAABAQAA/wD/AAAA//8AAQEAAAABAf8AAAH/AAAAAAAB////AQEBAAD/AP8AAAD//wECAAD/AAAAAAAAAAABAAAAAAL//wD//wD/AAEAAP//AP8A/wEBAAD/AAEAAAACAf8AAAAAAQAB/wAAAQEAAQD/AAEAAAEBAAAAAAL//wEAAAAA/gEBAAABAP8AAQD//wABAQD/AAEB/wEBAQAAAP4AAQAA/wAAAQAAAAAAAP//AAAA//8AAAAAAAAAAQD///8BAQABAQD/AAAA/wEAAP8A/wAA/wAA/gAA/wD/AAAAAAAA/wH///8AAP8BAQEAAAEAAP8CAAD/AAAAAQH/AAABAP//AQD/AAAAAAAAAQABAAD/AAEBAAAAAAAA//8A/wAA/wAAAAEBAP8BAQH+AP8A/wD/AAAAAAEAAAD//wABAQD/AP8BAQD/Af8AAf//AAAA//8BAf//AQAAAf/+AQAAAAABAAH/AAD//wEBAQH/AQABAQL/Af8CAQAAAP8AAAEAAAABAQD//wD///8A/wD///8BAQIBAQAA/wD///8A/wAAAAAA//8AAAABAQAA/wAAAAAAAAAAAAAAAAH/AAH//wD//////wAAAf8BAAIBAQIBAQH/AQEA/wAAAAABAAAA/wEBAP8AAP8BAAEAAf8CAQD/AAEAAQEA/v8AAQAAAf8BAAAAAAABAQAAAQAAAAAAAf8AAAIA/wAAAAAB/wEAAf8AAAEAAAAAAf8AAAEBAQEAAP8BAP8AAP8BAAD/AP8CAP8AAf8BAP8AAAEBAAEAAP7/AP8AAAEBAf8AAAAAAQIAAAEAAAEAAP//AQAAAAAA//8AAAEAAAEAAAH/AP//AQAAAAAAAQEAAAH/AP8BAAABAAAAAAEA/wAA/wEA/wAAAAEB/wAAAf///wAAAAAA/gAA/wABAAD/AAAAAAAA/wEBAQD+//8B/wAAAP8AAAD///8AAAAAAQEAAQEBAQABAAH///8CAQEAAAABAQEB/wABAQD/AQAAAQEAAQD//wAAAP8AAP8AAAAAAQAAAAAAAP4AAAAAAAEA/wEBAQL/AAD/AP//AAAB/v////8BAQEBAAAA/wABAf8CAQAAAP//AQD/AAD/AAABAAAA/wD/AQAAAAD//wEAAAD/AQAAAgAAAAEBAAABAP8AAf4BAAABAQAA/wAA/wAA/wEAAf//AP8A////AAAAAAD/Af8C/wABAQEAAQD/AAAAAAH/AQABAAEAAAD//wAAAQIAAAD/AAAAAQH///8AAAIAAAAAAAEA/wD/AAEBAAD/AAEAAAEAAAEAAAAAAf8BAQAA/wEBAAEA/wAAAAAAAAABAP8AAAAAAQAAAAACAAACAQD//wAA/wEBAQD//wABAAIBAAAAAAEAAQAAAP8AAQABAAH/AAEAAAABAQD+AAAAAAD//wD///8AAQABAAABAP8BAP8AAAD/AP0AAQABAAEA/wAA/wAA/wEAAAH///8AAAAAAAAAAf8BAQABAQAAAP//AAAAAAABAQEAAP8BAQD/AQEBAQAA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AAEAQEJCm5mXIyMjAQD//wAAAAAAAP8BAAH/AP8BAAH/AP8BAAEAAP//AAEA//8AAAD/AAABAAABAQAAAAD/AQAAAAEA//8AAAEA//8BAAEAAP//AQAB/wD/AQEBAAD/AAABAP//AAEBAf///gEBAf8A/wD/AQAAAAEAAP8AAAAB/wEAAf8A/wH/Af8BAAEA//8AAQD/AAD/AAABAAAAAAEBAAAAAAAAAP7/AQEB/gEAAf8AAAD//wEBAf7+/v8AAAEBAP//AAIAAP8AAAAAAAD/AAABAAEBAf///wAAAAABAAD/AP8AAAEAAAAAAAAAAAD/AAABAAAAAQH///8BAAABAAD+AQACAAD//v8AAQEAAP//AAEBAP8AAAAA/wD/AAIBAf//AAEBAf8A/wAAAAAA////AQEB/wAAAf////8AAQEBAAD//wABAQEAAAEAAP8AAAAAAAEAAP//AP8AAAEBAP/+AAECAAD//wABAQAA/wAAAP8A/wAAAQD/AAEAAP8AAAEBAP//AQEBAAAA//8AAQEA/wD/AP8AAAAAAgEA//4AAAEB/wEAAP8AAAD/AgAB//8A/wIAAv8A/gEAAv8A/wAAAAAAAQEA//8AAAEB//7/AAEAAQEAAAAAAAAA/wAAAAAAAQAA/wEAAv4A/wEAAAEA//8AAf4A/wIAAf8A/wEAAAD/AP8BAAIBAf//////AAABAQD//wABAAH/AAABAAD/AAAAAAABAQAA//8AAQEA//8AAQEA/wD/AP8CAAD+AAABAAIAAv8A/wAAAAAA//8AAAAAAAH/AP8BAAAAAQD/AAEB/wD/Af8CAAH//wAAAQAA/wABAAD/AQAA/wD/AP8AAQABAAH/AP8A/gIBAf8AAP8AAQD//wAAAAAAAAEBAQD//wABAP//AAABAAAAAAAAAAEBAQD/AAD/AAAAAP8BAAIAAP8A////AAEAAP8BAQEAAAABAP//AP8AAAIAAAAA/wAAAQEBAP7/AAABAAEAAf8A/wD+AAEB//8AAAAAAQEAAAAAAAAAAP8B/wD/AAD/AAIBAf8AAAABAAAA/wEAAf//AAAA/wABAf/+AAABAAAAAQEA/wAA//8AAAEAAQAA////Af8BAAEA/wEAAAEAAP8BAQD/////AAEBAQEA//8BAP//AQD/AAEAAP8A/wEBAQAAAAABAAD/AAAAAP8AAAEBAf///gEAAQD/AAEAAP8A/wABAQAAAP8AAQEAAAAA/wAAAAAAAAAAAAAAAAAAAQAAAAAA//8A/wAAAQAAAP8AAAIBAAAAAAD/AAAAAf8AAAEA/wAAAQAA/gAAAQAAAAAA/wABAf//AQD/AAEB/wAAAP//AQEBAP8A/wEAAQAB/wD/AQAAAP8A/wEBAAD+AAABAf8AAAEAAP8A/gAAAQAA/wEBAf/+/wABAgAAAAEA/wAB/wD/AQAAAAAAAP//AAEBAf8A/wH/AAABAf8A/gEAAgAAAAABAAAAAAEA//8AAP//AAABAAD/Af8A/wEAAAD/AAACAAH/Af///wACAAH/AQAAAP8B/wD/AAEAAP8AAQAAAAEA//8A/wEBAv8A/wH/AQAA/wABAAD/AQAA/wAAAAAAAQAB/wEAAf///wAAAAAAAQAB/wD/AAAA//8AAgAA/wEAAQAAAAAA/wD/AQABAAAB/wD/AQAA//8BAAD/AAAAAQIB////AQAB/wD+AAEBAP8B/wEAAv8AAAAA/wEAAP8AAP//AAIAAf8A/wAAAQEAAP8A/wABAAD/AAEBAf8AAP///wEBAAD/Af8A/wEAAAABAQAAAAAA/////wEAAgEBAAD///8AAAABAQD//wABAAEAAf7+AAEBAAABAAD//wEAAP8BAAAAAQD/AAABAAAAAP///+rp6XJxdqeopwAAAAAAAAAAAAAAAAAAAAYEAG46/n5IAA0G/wAAAAAA//8AAAAAAAD/Af8A/wH+AQDsBwHaCwDrBP/+AQEBAgD//wAAAAAAAgAAAf8AAAH+APv+ALrw+H7m9dD2+v8A//8BAQAAAAD/AAAAAU5SUpiWkhgXFwD/AAAB/wAAAAD/AAABAAD/AQAB//8AAAH/AAABAAH/AP8BAQAA/wD/AAAAAAAAAf///wABAQABAAEA/wD/AP8AAAH/AP8CAQEA/wD/AAABAQAA/wD+AQABAAABAAD//wAAAAAAAP8AAAEAAAABAAAAAAAAAAAAAAEAAP//AAABAQD//wAAAAAAAAAAAQEAAP8AAAAAAAAB/wD/AQAAAAAA//8AAQEB/wAAAQD//wAAAQH+/f0AAQD/AAAAAAABAAIBAP//AAAAAAEAAP8AAQAB/wD/AP8BAAH/Af8AAAAA/wH/AP8B/wH/AQABAAAAAP8A/wEAAQD/AAABAAABAAD/AAH///4BAQH/AP8B/wL/Af4B//8BAAD/AQL/AAABAAAAAAD/Af8B/wEAAP//AAAA/wEAAf8AAAEAAAAAAAEB/wAAAf4A/wEAAf8A/wAAAQH/AP8BAQH///8BAAEAAP8AAAH//wAAAf8BAAEA/wD///8BAgD/AAAB/wAAAQEAAAD/AAAB////AQABAAAAAAEB////AQEAAAAAAQD//v8AAQAB/wEAAf8AAAEAAAD/AAAAAAABAP//AAABAAAAAAEA//8AAQEBAQD+//8AAQEA/wAAAP8BAAEA////AQEBAAAAAAAAAAAAAAAAAQAA//8AAAAAAAD/AAEBAP8A/wAAAQAA/wH/AAABAQD+//8CAAD/AP8BAQIAAP///wEBAP8AAQAA/wD/AAABAAD/AAABAAH///4AAgEBAP//AAEAAAAAAAEBAP8AAAH/Af8B/gEAAP//AAABAQEAAP8AAAAAAAD/AAEBAf4A/wH//wABAQAAAAAAAAD//wEAAgAC/wD/AAD/AP8BAAAAAAAA/wH/Af8B/wD/AQECAAH+AP4BAAH/AAABAAD/AP//AAACAQEA/wD///8AAQEAAAEBAAAAAP4A/wAAAQD/AQAB/gEAAAAAAf8AAAEAAAAAAAAAAP8AAAAAAQH//gABAgAAAP8A/wH/AP8A/wEBAf8AAAH/Af8A/wEBAAAAAAD/AAAB/wEAAQAAAP//AAAA//8BAQEAAQD//wAA//8BAQH///8AAQAB/wABAQH+AAAAAAABAAD///8BAQEAAP8AAQD/AAAB/gAAAQAA/wEAAQAAAQAA/wD/AAABAAAAAQAA/gAAAQAAAP//AQEB/wAAAP8AAAIAAP8AAAAAAAD/AAABAAABAQH+/wABAAAA//8AAQAAAAD/AAEA//8CAAAAAQD/AAEAAAAAAQAA/v//Af8BAAIAAAD/AAABAP8AAP8A/wEAAf//AAEBAQAA/wEAAQAA/wAAAP8AAQD//wABAAAAAAD/AAEBAf8A/wAAAAEAAAAAAAAAAAAAAQD//v8BAgD/AAAB/wD/AQAA//8AAQEB/wD/AAEBAP///wABAgH///8BAAAAAAD/AAAAAAAAAAEBAAD/AAABAP8AAAAAAAD/AAEBAP8AAQH/AAACAP///wAAAAEAAAAAAAD/AP//AAABAAEAAf8B/wD//wABAQHmseYKAAEAAElEQVT/AAAAAAABAP8AAAAAAAH/AP8B/wH/Af8AAAAAAAABAQAA/wAAAQAA/wAAAAAAAAAAAQAA/wAAAAD/AQEAAP4B/wH/AP8B/wH/AgAAAAEB/v8AAQAAAAEAAQD///8AAAABAQD//wABAAEAAP//AAABAQEAAP8A/wAAAAD/AQEAAP8BAAAAAAABAAH/AAAAAAAB/wD/AAAAAP8BAAD/AAAAAAAAAQEA//8AAAH/Af4B/wIAAQAAAP8A/wABAQD+AAAB/wAAAQABAAD/AAEAAAABAAD///8B/wAAAQAAAQD//wEBAf/+AAEBAAAAAAAAAAAAAAABAAD/AP8AAAAAAAEAAP8AAAHOzM5qa27KysoAAP8AAAAAAP4AAQMA//4XDACKTwJdMv0B/v4AAgAA/wD/AAH///8AAQABAAIA7wQA3AkB5AcA/QL//wABAAAAAQEA/wD/AAEBAAAAAAH//wDr+f6L5vWc7/fw/vwBAAH//wAA/wEAAAAGBwdub29+fXoMCwz/AQAAAP8BAAEAAAAAAP8AAAH/AP8B/gH/Af4BAAH/AAACAQD/AAAAAAAA/wD/AAAAAAEAAQABAP///wEBAP//AP8BAAIAAAAAAP//AAABAAAAAQEA//8AAAEA//8AAf8BAQH/AAAAAAAAAAAA/wABAQD/AAEA////AQACAAD//wEAAP8AAQAAAAEA/wAAAf8AAAH/AAACAAD//wAAAP8BAQD/AAH/AAAB/wD/AQAB//8AAQEB/v/+AAD///8BAf8A/wEAAQEBAP//AAAAAAEAAP8AAAAAAAAAAAEAAP8A/wAAAQAAAP8A/wH/AAABAAEAAf4AAAH/AP8BAAEAAAEB//8AAQD/AAD//wABAAAAAAD/AQABAAAAAP//AAIB//7/AQEA/wAAAf8BAAL///8BAQD//wABAQAA////AQEBAAAAAP8A/wEAAP8AAQEA//8AAQD/AAEA/wABAf///wEAAf8AAAACAAH/AAD///8AAQEB//8AAAIAAv8A//8AAAIA/v8AAgD//wAAAAAAAQACAAD///8AAQIA//8AAQD+//8CAAEAAAD/Af8A/gEAAgAA//8AAAABAAD/AAEBAAABAQAA//8AAQH/AAAAAAAA/wD/AQAB/wAAAAABAAD/AP8AAQEB/wD/AQEAAP8AAAD//wABAQD/AAAA/wABAQAAAAD/AQEB//8AAP///wEBAAD/AP8AAAEAAAAAAf8BAAEAAAD/AAAB////AQAAAAEA//8BAQH//wAAAAAAAAABAAD/AAABAAH/Af8A/wABAQAAAAAAAAD//wAAAQAB/wD/AAABAQAA////AQAA/wAAAgEA/v8AAQEAAAAAAAAB/wD/Af8B/wEAAQD/AAAA//8AAQEA/wD/AQAC//8AAQAA/wAAAAL+AP8CAf//AAIB//8AAQD///8AAAEAAAABAP8AAQEAAAAAAQAA/v8AAQH/AAAAAAAB/wD/Af8A/wEBAP//AAEBAAD/AAABAQEBAP///wAAAP//AAEAAAAAAQAA/wAAAQAA//8AAQABAAH/AP8BAAH/AAABAAD/AAAB/wD/AQABAAD/AAABAAD/AP8BAAEA////AQEAAAAC////AQAA/wEAAP8AAQEAAAD/AAAAAAABAAAAAAD/AAABAAEBAf/+AAEB//8AAP8AAQEA/v//AQECAAH/AP8AAAAAAAAB/wD/AAEAAP//AAACAQEA//8AAAD/AQABAAAAAAD/AAAA/wAAAf8AAAEA/wAAAQEBAP//Af8B/wH//wAAAQAA/wABAQEA//8AAQEAAP8AAQD/AAEA//8BAAD//wABAQAAAAD//wD/AQECAf8A/wD/AAEBAP8AAAD/AAAAAAABAAD/AAABAAAAAAAAAAD//wEBAf8AAAEA////AAD/AAEBAf7/AAIC//8AAQEAAP8AAP//AAEAAAAAAAAA//8AAQEAAAEB////AQAAAAEBAAD/AAABAAAAAP4AAAH/AAH/AP8BAAAAAAAAAAAB////AAEBAQD/AAAAAAEAAP8A/wEBAf4A/wH/Af8AAAEBAAAAAAH/AP8BAAAAAAD/AAAAAAABAAD/AAABAAAAAAAAAAD/AAAAAAABAAD/AAAA/wH/AQAAAAABAP8AAAAAAAAAAAABAAD//wAAAQAAAQEB/////wAAAQAAAAEAAP8AAQAA/wAAAAAAAQAB/v//AQEBAAEAAQD//gAAAgAB/gAAAf8AAQD//wEBAAAAAAAAAAAAAAAAAP8AAAEAAP8AAAH/AAD/AAABAAAAAP8BAAH//wABAQD/AAAAAP8AAQEBAP8A/wD/AAEBAAD/AQAB//////8AAgIB/wAAAAAAAAD/AAAAAP8AAAABAQD/AAEB/wAAAf8A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AP8AAAEBAAAAAAEAAAAAAAAAAQAA/wAA/wABAQD/AP8AAAAAAQEBAAH/AAAAAAAAAQABAf79/gABAAAAAAEAAP8AAP8BAAH/AAEAAf8B/wD/AAAA//8AAQIAAP8BAAD/AAAAAAAAAP8AAAEBAP///wEAAf//AAEBAAD//wABAf8AAAEBAQD//wAAAAAAAQEA//8AAAAAAP///wEBAQD/AAABAP8AAAIA//4AAQEAAQAA/wABAP//AAEAAP8AAAEAAAAAAAAAAAAAAP8AAAEAAAAAAP8AAAH//wABAAD/AAABAAAAAQD//gABAQD/AgAA/wAA/wABAAAAAAD/AgABAAAA/wD/AP8A/wABAQAA/wAAAAEAAAABAQD/AAAAAP8AAAEAAf///gEBAf8A/wEAAP///wEBAv///wAAAAEBAQAA/wAAAAAAAAEAAf7//gAAAQECAf//AAAA/wEAAQD/Af8B/wEAAAAAAAD///8CAAEAAAD///8BAQH/AQAA/wEAAP8AAQAAAAAAAQAA/v8AAAAAAAH/AQAB/gD/AQAAAAABAP8AAQEAAAAA/wAA/wAAAf//AQEA/gABAf//AAEAAP8AAP8BAAH/AAAAAAEBAAEBAP//AAAAAP8AAQD/AAAB/wEAAP//AQABAAAA/wD/AAEBAAAAAQD/AP8B/wAAAAEBAQD+/wEBAf8A////AAEBAP8AAAH/AP8BAAH/AAABAf8A/gEAAf8A/wAAAQEAAQABAP//AAD//wEBAP8BAQD+/wEBAQAAAP8AAf8A/wEA/wD/AQEBAP8A/wEAAf8A/wEAAP8AAAAAAAEAAAABAf//AAEBAP///wEAAAD/AAABAQD//wABAf8A/wEAAP8AAAAAAQD/AAAAAAH///8BAQEA/wAAAf4BAAEA/wAAAQEAAP8A/wEAAAAAAf8AAQEA//8AAQIA//7/AQAA/gEBAf8AAAEAAAAAAP8BAAD/AAH///8BAQEAAP8A/wEAAQAAAAAAAAAAAP8B/wD/AQEAAAD/AP8B/wEAAP//AQEBAAAAAAAAAAAAAAAAAAAAAAAAAQAA/wD/AAABAQAB/wAAAAAAAQD//wABAAAAAAD/AAAAAAAAAP8AAQEAAAAB/wH/AAAAAQABAAD///8AAAAAAQAA/wEBAf8A/wD/AQEB////AP8AAAEBAAAAAAD/AAEBAf8A/wAAAQD/AAABAAD//wABAQAA/gAAAQAAAAAAAAAAAAAAAf///gAAAgAAAAEA////AAEBAAABAQD+/wABAQAA/wABAQAA/wD/AAEAAP8AAP8BAQH//wAAAf8A/wABAAH+Af8BAAAAAAEA/wEBAP8AAf8AAAH//wAAAP8BAQH//wAAAAAAAQABAAD+AP8C/wD/AAABAQAA/wD/AAIBAAD/AAAAAP4AAAEBAf///wIAAP8AAQAA/wAAAAEAAP8AAAAAAAABAQAAAP8A/wH/AAEAAf8A/gABAgD//wABAQD//wAAAAAAAP8AAAEAAQAA/wAAAQAA/wAAAAABAQAA/wD/AQAA/wABAf8AAAEAAAD//wEAAQAAAP8BAAEAAP8A////AAIBAQAA////AAABAQD/AAAA/wEBAf8AAP8AAAD/AAEB/wEAAf///wAAAAEBAP8AAQAAAAEAAAD/AP8AAAEBAP8A////AAIA//8AAgAAAAEAAP8A//X19oKChJOVlvj29gAA/wAAAAAA/wAAAQAAAEwp/5ZW/x0TAAD8//8BAAD/AP/4AQDuAwHfBgDpBgH9AgD/AgD/AgAAAf8AAAEAAf7//wL/AAABAQD+APv/A73x+nrl88/4+wH/AP8CAAD/AAAA/wD/AAAAAFZZWoyKiB0cGwD///8AAAABAAAAAAAAAAAAAQEAAP///wAAAAAAAAABAQD/AAAAAAAB/wAAAAAAAAAAAP//AAEAAAAAAQABAP///wEAAAEAAP//AAABAP8BAAEAAf4A/wIAAAAAAAD/AQAB/wAAAAAAAf///wEBAP//AQAB/wEAAQAA///+AAABAAEBAP7//wMBAf8AAQD/////AQAB/wEBAQAAAAH///8A/wABAgD//wAAAQEAAP8AAAABAAAAAAD/AAD/AAABAAH9/v4AAAABAAAAAAEAAP8AAAAAAAEAAP4AAQH//wABAf8A/wEAAAD/AAACAP//AQEA/wAAAAD/AAEA//4BAQAAAAEAAAAAAP8AAAEBAQH/AP8A/wD/AAABAAAAAAEA//8AAQD/AP8BAAEBAQD+/wABAAD/AAAAAAAAAf8A/wABAAAA/wEAAQAA/wD/AQAA////AQABAAEA//8BAgIA/wD/AAAAAP8AAAABAAAAAAEAAP4AAAAAAAL/AP4AAAEAAAAB/wAAAP//AQEAAAD/AP8B/gAAAQAAAAEBAQD//v8AAQEAAP8BAQD//wAAAQAAAAABAAD/AAAA/wEAAAAAAP8BAQEA//8AAAAAAQH/AAAAAAACAAD/AAABAP//AQAA/gH/AP8AAQABAAAA/wH/AAAAAQAAAP8A/gAAAQAAAQEBAP//AAEBAAEA//4AAQH///8BAQEAAP8A/wAAAQAAAAAAAAD//wAAAQIAAP8AAP8BAAH/AAABAP///wEBAf8BAAD+/wABAQH/AP8BAAH///8AAQABAAH///8BAQEA/wAAAAAAAQD///8AAAAAAQAB/wH+Af8CAAD/AAEAAP8A/wABAQAAAAAAAAD+/wADAgD+/wAA/wAAAQEBAP8BAAH/AAD///8AAQAAAAEAAAAAAQAA/wAAAAAAAf8B/gH/Af8BAAEA/wAAAf4AAAL///4BAAEAAQEAAQH///8A//8AAAAAAQEAAP8BAAH/AQAB////AAABAAAAAAAAAAEAAQAAAP///wEB////AgEB//8BAAH//wAAAf//AAAAAAAAAAAB/wEAAQAAAP8AAAH/AP8B/wEAAgD//wEAAP8A//8BAQEA/wD/AP8AAQEBAAD/AP8BAAIAAf8A/wAA/wAAAQAAAP8AAQAAAAH/AAAA/wABAAAA/wABAQD/Af8A/wIAAf7//wAB/wEBAQD/AAEAAP//AAACAP//AAIAAP8AAAAAAAEAAAABAP//AAEAAP8AAAAAAf8AAAIA//8AAAEAAAAAAP8AAAABAAD+AQEBAAAA/wAAAP8AAAEBAf//AAEA//8BAQAA/wAAAAH/AP//AQEB//8AAAH/AP8BAAEAAAAAAP8AAAH/AQAAAP8A/gEBAAD/Af8A/wAAAQAAAAAAAAABAQH/AAAAAP8A/wAA/wAAAgABAAAA/wAAAQEA/wAA/wAAAQD/AQAB/wABAP//AQEAAAAAAP///wABAAEAAQAAAAD/AAAB/wAAAP8AAAEAAP8AAAEAAf8AAAAA/wD/AAABAQEA////AAABAAAAAAEA////AgAB/wEAAP4AAAEAAAH/AP8BAQAB/gD+AQAAAAABAQABAAD//wD/AAEBAP8AAQD/AAAB/wAAAAD/AAECAf//AAEA/wAAAQAAAAAA//8AAQEAAAAA//8AAAH/AP8B/wABAgAA/wH/Af8AAAAA/wABAAH/AP8AAQEAAP8AAAAAAAAAAAEA//8A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AAAAAP8AAAEA////AQABAAABAAD//wEAAQAAAP8AAf8AAAEB/gD/AQABAAD/AAAB/wH/AP8AAAABAAAAAQEA////AQEBAAAAAAAAAAAAAf8A/wAAAAAA/wAAAQAA/wAAAP8A0NLSvr3Bw8XGwsHC8e/u///+GhwdtbSwMC4r/wEAAAABAP//AQEB/gD/AQABAP//AAEBAAAAAP//AAEBAAAAAf/9//8A/wABAAABAP///wAAAQEBAAEAAP8AAP///wEAAQAAAAAAAAD/AP8BAAEAAQAAAAAB/v//AAIAAf8AAAD//wAAAAEBAv8A/wD/AAABAP8AAAAAAAEAAAEBAQAA////AAAAAAAAAAAAAAABAAD//wAAAv8A/wAAAAEAAAAAAAABAAD//wAAAP8AAQH//wABAQAA/wAAAf8AAAAA/wAAAAAAAAAAAQD//wEBAf8A/wEAAf///wABAAEAAP8AAAAAAQD//wEAAAABAAAAAQAAAP///wEBAf//AQEBAAD///8B/wEAAAD/AAAAAAEBAf4AAAAAAQAA/wH///8BAAD/AAEBAQD/AP8BAAEA//8BAQH//wABAgD//wD/AP8B/wEAAAD/AP8BAQEAAP///wECAQD+//8CAAD+AAEAAP8AAAABAAH/AAAAAf8B/wEAAQAA//8BAAD+/wABAQAAAAAAAQEAAAD//wABAAAAAgD///8A/wABAAAAAAAAAQEAAP//AAAA/wECAf/+/wEAAP8BAgD//gEAAP8AAAAAAAEBAf///wEBAQAA/wAAAAD/AP8BAQH/AAABAP8AAAIA////AAABAAAAAAAA/wAAAgD//wACAAEAAP//AAD/AP8BAAEBAQD+AP8AAAABAAD//wABAAH/Af8B/wABAAH/AAD/AP8AAQEAAAABAf8A/gD/AQEBAP8A/wEBAf///wEAAP8AAAH/AAACAf//AAAAAAEB/wAAAQD/AAAAAP//AAEB/wAAAf8A/wEAAP//AQAAAAABAAAA/wEAAP8AAQEB/wAAAAD/AAAAAAAAAQAA/wAAAf8BAAD/AQAA/wD//wEBAQAA////AAABAQD/AAEBAAAA//8AAAEAAf//AAEBAQAAAAAA/gAAAQABAf/+/wECAQD///8AAAEA/wAAAQAAAf8A/wAA/wEBAgH///8AAAAAAAEAAf8A/wAAAQD/AP8BAAEB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AQEB//8CAgAAAAAB9v4AxfT/u/L7nfD67v3+AAAAAAABAP//AAIBAP8AAP//AAAAPUFDcnJuUExL/v//AQABAQEA/gAAAQAAAAAAAP8AAAEAAAABAAD/AAABAP8AAAAA/wH/AP8BAP//AAEBAAEAAv8A/wAA/wH/AQAAAP8A/wAAAAAAAAAAAAAAAQABAAEA/wD/Af8AAAEAAAABAAAAAP8AAAEAAAD/AAAAAP8BAAAA/wD+/wEB/vv9xsjKuLi8tLS11NLQAAACAAD+AAD/AAABAAD+AAABAAD/AAAAAAAAAAAAAAAAAAEBxsfDODc3//8AAQAAAAH/AAABAP//AQEA//8BAQEA//8AAAEA////Af7+/gEAAP8BAAD/AAABAAD/AP8AAAEAAAABAAD/AAEAAP8AAP8AAAAAAAAAAAEAAAAAAAABAAH/AP8AAAAAAAAAAP//AAEBAAAAAP///wAAAQECAP/+/wEBAQAAAAABAQD///8AAAAAAAAA/wEAAAAAAQAAAAEAAf8A/wAAAf8A/gEAAQAAAQAB/wAAAAD/AP8AAAEBAP///wAAAAH/Af8AAAAB/wEAAf8AAAAAAAAAAAAAAAH//wABAQD///8AAP8BAQEA/wD/AAEBAv///gEBAf//AQEA/wAAAAABAP8AAAEA//8AAQD/AQAB/gD/AAABAAAAAgEBAP///wEAAP///wEBAAAAAf4A/wEAAQAA/wAAAAD/AQAAAAEAAAABAAAAAP8AAAAA/gEAAv8AAAH//wAAAAABAf//AAEB/wAAAAAAAAAAAAAAAP//AAEAAP8BAQAAAP8A/wL/AAABAAAAAP8AAQEA/gAAAf8AAAD/AAEBAAABAQD/AAAA//8AAAEAAQAB/wD+//8AAQABAAD/AAAAAQEBAAD//wABAAAAAAAAAAD/AAABAf8AAAEAAP7//wIBAP8AAAD/AQEB/wD/AQABAAAAAAAA//8AAAEAAAD/AQABAP///wEBAP8AAP8AAAIAAP//AAEAAP8AAAEBAP8AAAEA/wAAAgAAAP8A/wAAAAH/AQAB/wAAAQAAAP8A/wH/AQAA/wABAQABAP8A/wH/AAD/AAABAQAA//8A/wEBAgAAAP//AAEAAAAAAAAAAP8BAAH+Af8B/wH//wABAQAAAAABAP///wH/AQACAAD/AAD/AP8C/wEAAP7/AAL/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AAEA//8AAAAAAQEBAP///wACAAD+AAH/AAABAf8A/wH/Af8BAQAA/gEBAAD/AAAAAQAAAAAB//8AAAH/AP8BAQD/AAAAAAAAAAAAAAAAAAAA/wAAAQEB/wAAAQH/AP8AAP8BAAEAAAD/AAAA/wAA/wAAAgABAP8A/wH/AAAAAQABAQAA/gD+AQEBAP4AAAIBAP//AQAB//8A/wH+Af8BAAAAAAAAAAH/AAAB/wABAQAAAAAA////AQAAAAEAAAABAQD//wAAAAAAAAAAAP8A/wEAAQABAAD/AQAA/wAAAP8A/wEBAAAAAQD/AAABAAAAAAAA/wD+AQABAP8AAAEB////AQABAAD//wIBAP8AAP7/AAIAAP8AAQABAAEAAAD//wABAQEA//8AAAAAAf8AAAEAAAAAAP8AAAH/AAABAAABAAD//wAAAAAAAgAA/wAA/wH/Af8AAAECAP///wD/Af8A/wABAQEAAP8A/wH/AAAAAP8AAQEBAAAA/wD/AAABAQEA//8AAAD/AAABAAAAAQAAAAAAAAAAAAAA//8AAAAAAQEAAAD/AAEAAP8BAAH/AP8BAP8AAAH/AAECAf///wAAAAD/AAACAAAAAAAAAAD//wEAAf8AAAABAAH/AP8AAQEA//8AAP8AAQEB/wD/AQAB/wEA////+fj4u7y9ra2xtbS17e3sAAEAAAAAAP8AAAEBAP/+AAEBAP//AAABAQAAAAEBAQIB/v//DQ0HHyAILSgMHBoGISEEGx0HCgwMExIBGRb/FBH+/v8AAP//AAEB/wACAP8DAAEBAAEAAAABAgEB/wABAAACAAH9+fr94+T26+v14OD24+X46ef83d783d764+X69/b9AP4AAAACAAEAAAABAAEBAP4BAQEB/wABAQEBAAAAAP//AAAABAUDNTQ0T09NUFFNJSQjAAEB//7+AQICAAD/AAABAP//AAEBAQAAAP/+/wABAAEB////AAD/AQACAAEAAP///wABAQAAAAEAAP//AAEAAAAAAP8BAAD/AAAAAAEAAP8A/wABAQAAAAEAAP//AAABAQH/AAAB////AAEAAAAAAP8AAAEAAAABrausent829vbAAD/AAAAAAABAAAAAAAAAAD/CQ0ULj1KKTQ/HyctAwUH/v3//v///gD/AAAA/f38/v7//f79/f7/AgIAAgEDAgICAgID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EgAVDQEpHQMZDwIGA/wA/f0A////AAIBAf4AAAD/Av8AAQEAAQAA//4BAgD/Af8BAAH/Af8AAgEB/f8A/wH//AAB+gD/9QEB+QIA+QEA/gAA/wAA/gIA/gL//gAB/P/++f8A9v8A+AAB/gEB/QL//QH//QHu/P9y1/2k7Pj/AP8AAAEAAP8AAACDhYZ8enj/AAABAP8AAAAAAAD///8AAQL/AAAB//8AAAEAAQD///4BAAEAAAH/AP8AAQEA/wAB//7+/wEAAAAAAAABAAD+AQABAAABAAD///8BAAD/AAAA/wEAAQD/Af8BAAAA/wEA//8AAQABAAH///7/AQIBAQAAAAAA/wABAP8AAAEAAf///wH/AAABAQAB////AAEBAAAAAP//AP8A/wEAAQAAAQD//wACAAD+AQAB/wEBAf8A/gAAAQD/AAEAAQD/AAAB//8AAAD/Af8BAAH//wABAQD//wEBAQAA/wD/AP8BAAAAAQEB/gD/AP8AAAAAAQAA/wD/AQAA/wAAAQAAAAAAAQAB/wAAAAAAAP8AAAEA//8AAAL/Af8B/wABAQD/AP8B/gH/AgAA/wAAAQAA/wEAAP8AAQD/AP8A/wABAAEAAAAAAP8BAAH/Af8AAAEB/wH+AP8BAAD/AAABAAAAAP/+AAACAAH+AAEDAf/+AAAA/wAAAAABAQD/AAEBAP//AAD/AAABAP8BAAAA/wEAAAAAAQAA/wD/AAAAAAAAAQAA/wABAAAAAAD/AgAA/gABAP//AAIAAf8BAAAAAAD/AAAA//8AAQEBAAD//wABAf8A/wD+AQEC////AQEAAP8A/wEAAP8BAgEA/gABAQD//wAAAP//AAAAAAEBAQAA//8AAgEA/gH/Af8B////AQEB/wD/AAABAAAAAAD/AAABAP//AAEAAP8AAAEAAP8BAQIAAP7//wAAAAEB////AgEAAAEBAAAA////AQABAAD///8AAQEA//8BAQH//wABAAAAAQD+AAAC/wAAAAD/AQAB/wAAAf8AAAEAAP8AAAAAAAAAAAIA////AQABAQAA/wAAAP8AAAAAAAAAAAAA/wEAAAD/AP8BAAEAAgEA//8A//8AAAH/AP8AAQEAAAABAAAAAAEA//7/AQEAAQAB/wEB/wAAAf7+AAICAAD/Af8AAAEA/wAAAAABAP8AAAAAAAH/AAAA8/T1bGtvo6KjAAH/AP8AAAEAAP8BAAAADA0ChIAga2cSAgMBAQADAf8C/v0X+v8g/P8g/AAVAgAEAAEAAQABAAEBAP8AAAAB/wEB//8AAgECAAAAAAH//wAAAf8B/wABAQAB/wD/AQAB/wH/AAD/AAACAAAA/wAAAf8AAAEBAAAAAAIBAP4A/wAAAAAAAAABAQAB/wAAAAAAAAABAAACAAAAAAABAQAA/wAAAQEDAAD/AAACAAABAAABAAAAAAACAQECAQABAAEC/wABAf8AAAECAQAC//8AAQEBAAABAQABAAADAAAAAAEBAQEBAAECAf//AAECAgEBAQADAgIEAQAF//79AQH9AADtAQPiAQDb+fjZ19bFoJ/gq7D55uUAAAAAAP8AAAAAAAABAAAACQoKZ2dlgYF+DQwN/wD/AQABAAH///8BAQH/AP8AAAAA+/r8Y2NkpKWjAAAAAAD/AAAAAAACBgkKHCo77+bh9e7m+vn0AQD//wABAAD+AAACAAAAAAAAAAAAAAACBQkODBIZDBEVCQwPFx4kEhkeGB8kGh0h/gABzLusvamW+ff0AAEBAP7/EREPY2Nha2pn4OLkvcDCs7W30s/R/wD/AAAAAP4BAAD/AQABAAIA//8AAgEA/v8AAAAAAP/+AAABAQIBAQEABAQFAgQEAQEEAgIAAAECEBogNVdtFR0j8OTdvJd/7uHWAAD/AAAAAgAAbC0IdSoC9f0B9fv96vj+7P7+/gP/AAIA/wABAgMB/wAAAwL/BgL/AgIBBwP/AgEABQMABAMABgQABAH/AQACCQUBEAgCAgD/CgYADAr+BAb+AAABAAEAAQD//wEAAAEAAAEAAAABAAL/AAIA//0AAQIBAAD/AAABAAIAAQEAAAD+AAEB/wQBAf7/AAAAAAD///4AAP7///4AAv8B//UCAfoBAPoDAPoCAP4BAP4A/wEBAQABAPr///sAAPr+//b+APwAAP8AAPwC//4BAv4B/f4A6fgAcNv6ru37/gD/AP8AAAAAAAABXmFflpKTCgwLAAD/AP8AAAEAAQAA/wABAAAAAP8A/wD+AQAC/wH/AQAAAP8B/wAAAAAAAQH//gAAABaE6XsBYmJlGhsZDgwPBQQDFhkXGhcYAwQCEhUUBwQGIiUjAQABAP//AP//AAEB/wABAAD/AQAAAAABAAAAAAD/AP8A/wEAAQAB/wH/AQAAAP8BAAD/AAAB////AAH/AAAAAgAC//8AAAL/AAAB/wAAAf//AAAAAAEAAP8A/wD/AP8BAQIBAP///wD/AQABAAAAAAAAAAD/AAACAAD/AAAAAAAAAAEBAf///wAAAQAA/wD/AAEB/wD/Af8AAAABAAABAQAA/wD//wAAAQD/AAAB/wAAAQAAAAD/AAABAAAAAAAB/wD/AQEAAP8A////AAEAAf8B/wEAAP8AAAEBAQD//wAAAAD/AAABAP8A/wEAAf8AAAH//wAAAf8AAQAAAAEA//8AAAEAAQAAAAAA//8AAQEAAAABAAD/AAABAAD//wAAAAAAAf8B/wEAAQH///8AAP8AAAAAAQEAAAAB//8AAAD/AAABAAH/AAABAAD/AAABAAD/AP8AAAEBAf///wAAAQEBAAH/AP8A//8AAAABAQEAAP///wEBAAAAAAD/AQEB////AAAAAQAA/wAAAP8BAQH/AAAAAAACAAD//wAAAgAA/wAB/wD/AAAAAQAAAP///wABAQEAAAEA//4AAQEA/wD/AQAB/wD/AP8AAQEB////AAAAAQEC/wD+AP8BAAH/AQAAAAAA/wABAQAA/wD/Af8B/wH/AAABAAABAAD+AAAAAQAB/wAAAQH/AP8B////AQEAAP8BAAD/AAEBAAAB/wD/AQD//wAAAgABAAAA/wEAAP8A////AQEBAQEA//8AAP8A/wEAAAD///8AAQEBAAAAAQAAAAAAAAAAAAAAAP8AAAEAAAD//wABAQAA/wAAAQD/AAAAAP8BAAEB/wH/AP8AAP8AAQIAAP8AAAEAAP8AAAEAAP4AAAIBAP8AAAH/29vda2tuvLy8AP//AAD/AAACAAD/AAD/MDELg4AaSkYSAQADAAACAAAK/P0d+Pww/QAPAAACAgIF//8CAQEBAAECAQAA//8AAAECAQAA//8A/wEAAQABAAD/AQEB//8A/wABAQD//wD/AQAA/wABAQAA/wEAAQABAAEAAP8A//8AAQEB/wAAAQAB/wD/AAABAAAC///+AQEA/wAAAQECAP8AAQAB//8AAQEC//8AAQECAQAB/wABAQAAAAEC/wAAAAACAQEBAAACAQAC/gAAAQD/AQED//4BAQICAAABAAAAAAABAgEC//8BAQEBAAABAAABAAABAQEB//8AAgEBAQEDAgEFAQED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Af8BAAAAAAH//wABAAABAQD/AAAAAAEAAAAA///+AQAAAAD+AQEBAAABAP8AAAH/AP4AAP//AQIA//8AAAD/AAH/AAAA/wABAf4AAAEBAP8A//8AAQIAAQD//wAAAQAAAAABAP//AAEA//8BAAH/AQD//wABAAAAAAABAAD/AAEA//4BAQEBAP////8BAQEA/wD/AAAAAQD/AP8AAAEBAAH///4A/wL/Af8AAAAB/gD/AQAA//8AAAEAAf8AAAEBAAEAAQAA/wAAAQEAAAAAAAAAAP8AAAH//wAAAP//AQIC////AQD/AAABAQAB////AP8BAAAA/wEAAQAA//8AAAH/Af8C/wEAAAAAAAABAAAAAP8AAAEAAwIA//4A/wEAAf8BAAH//v4BAQEBAv////8BAAD//gEAAf8BAAD/AP8A/wABAAEAAAAAAQEA////AP8BAQH//wEBAQABAAAAAAEAAf8AAAH///8BAQEAAP///wEB/wEAAQD//gAAAQAA/wD/Af8BAQAAAAABAf8A/wEAAQAAAAAAAf8AAAD/AAEBAAD/AAABAQEAAP8BAAEA////AAEBAQAAAAAAAf8AAP8A/wEAAQEBAAD/AP4AAAEBAAH/AP//AAAAAAEBAf//3ODfkZOUAAD/AAD/AAABAAAADhABYl4GAQAF/gEQ/f4S//8EAQAA//8BAAEBAQAC//8AAAIB//8BAQAA/wH/Af4AAQECAP//AQEA/wD/AQABAAAAAQD/AAABAAAB/wAAAAAAAgD+/gAB//8AAAEAAP8AAAAAAAAC/wD/AgD//wEAAAAA////AP//AQD//wD/AAAAAP/+AAD+AQL///7/AAD9////AgEAAAD//wH9AAD9////AAD/AP8AAQD/AAH+AAH/AP////7+AQH/AAAA/wD+AgEB//7+AQEBAAD//wAAAf8A/gAAAQH+Af8BAAH/AP8BAAH/AgAC/gAAAQAB/wD/AAAAAP8BAAACAQAAAQD///4AAAH/AP///wH/AQACAAD+AQD+AAAAAP//AP8BAQH+AAD/AP///wD+AAEAAAD+AAAAAAD+AP/9/v/9AQL/AAD9AAD//wH9AP/+AQD////8AQD8AQH9///+AP/9AAH9/wH9AQH/AAD9AQH9AQD9///9AQH///4G/gIMAgL5AAH//gD/CwsBe2v4y9AE5+j/AAAB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Af8B/wEBAQAB/wD/AQAAAAD/AAACAQL/AAAA/wD/AAAB/wAAAQAAAAAAAP8AAAAA/wD/AAEAAAAAAQAA/wD//wAAAQEB////AQD//wAAAf8C/wAA/wEAAQAA//8BAAEAAQAA/wEAAv4A/wEAAv8BAAAAAP///wAAAQEBAP8AAAEAAP8A/wD/Af8AAQEBAAEA//8AAf8A/wABAP//AAEAAAAB////AgEAAP8B/wAAAAACAAEAAAAAAAAAAQD///8BAAH/AgAB/gABAAD/AP//AAABAgEA////AAICAP/+//8CAQH//wABAQAAAQAAAAD/AQEAAf4A/gEAAAAA/wABAQD/AP8BAQIA/wAAAAD/AAAAAAAA/////wIBAf//AAAAAAEBAP///wABAQEAAP/+AAAAAQEB/wABAP//AAAA/wEAAAD/AAEByMnJoaChAAAAAQD+//8D/wACJCP+XFYFAAAHAAAO/QAN/wAEAAECAf8BAAAB////AQEAAAD//wH+AAADAQD//wH+AP8AAQAB/wEBAf//AAH/AP8C/wD+AQACAAEA//8AAAD/AAEAAf8A//8BAAEAAAD+AAD/AAH/AAD/AQEBAAH/Af8A/wH/AQD/AAD/AAD+AP//////AgH/AP//AgH9AAD+/wAAAAD+AQD/AAL+//79Af//AAH+AQAAAP/+/wH/AP///wEAAAAAAAD+AQAA/wAAAP/+/wEAAP/9//8AAAAAAQAAAAAAAAD/AAEAAf//AAAAAAEBAP7/AAH/AAAAAQAA/wD//wAAAAAC/wAAAAAAAAH+AP8BAAMAAP8AAQABAAD+AAEAAP/8/wEBAf//AAAA///+AgD/AAEAAP/+AP/9Af/9AAH//wD+/gH+AgD/AP7+AAEA/wD+AQD+AAH9AAD+Af//AAH8Af7+AAL+AP/9AAH/Af79AAH+AAD9Af/+Af/////9AAH9AgH9AAD+AP8DAf8DAAABAQH+AAEA/gD/AwIAOzL+tr//AQIEKy0vFhQO/wEAAgAB//8AAAAA/wEAAQAAAQEA/v8AAAAAAQAAA/4A/gD/AAECAP//AAH/AAAAAP8AAAEAAP4A/wIAAf4BAAABAQEA/wAB/////wEBAf//AQEB/v///gAAAQIBAAEA8fLxAAD9AAEEAAQF+//8AwAC/v7/AwIB//4AAAD+AAECAP7+AQMA/f8A/wICAAL+AP8AAQECAP/+Af0AAAH/AAADAP/9AAMDAwD+//8A/v8AAQL+AgH//f8BAgABAP8AGiQqIS042cu7AAABAAD//wAA8wAAh+T+z/L9Zh4EQhgABQgB//0AAAIBAAL+/wMBAAMA//3/AQMB//sAAAIAAAIAAAEAAAQA/wAAAQIA/wMAAAMAAAAAAQEA//4BAQL/AQAAAAAAAQEA/wL/AAIBAgABAP/+/wABAQD/AAEBAP8BAQAB/wAB//3/AAIAAAABAAH+AAH/AP8C/wH/Af4B//8AAAAB//0AAQIAAP4AAP8AAP4BAP8BAf0A//0EAvoB//r///r/AfkA//z+//wAAf4AAf0BAP//Af8B//wA/v//z/j+dOL9wPX+AAEBAAD/AAEAAP4AaW1riISBBAMEAQH/BAAAAf8A/wEAAQD///8AAAEAAAAA/wAAAP8BAQAA/wAAAAD//wEBAP8AAAD//wEBAAD/AQH/AAEAAQABAP//AQAAAAD/AAABAQD/AAABAAAA/wAAAQH/AP8AAAEBAAAAAP///wEBAQAAAAEB/wAAAf8AAAAAAQL/AP8AANXU1m1tb8DBvwAAAQAA/wAAAQD/AQAA/y4uLoqOihITEv7/AAEA/wEAAAAAAP8AAAAA/wABAP//AQIAAP7//wAAAQAB/gAAAQAAAAEBAAEAAf8B//8A/wEAAQAAAAABAAEAAQAAAP8BAQAA/wH//wACAP//AQD//gABAQAAAAEA///+AAABAP8BAAEAAQAB/wAAAQEBAAH/AP//AAEBAAH/AP8AAAAA/wEAAQD/AQABAAAAAQD//wAA/wEAAQEA//8B/wABAQD+AQABAQD//wAA/gEAAQABAAABAQD//gAAAQD/AAEAAAAAAP8AAf8A/wD//wABAAD/AQEBAP8AAAD//wAAAAEBAf8BAAD/AAAA/wAAAAD/AQABAAAA/wAAAP8AAAAA/wAAAP8AAAL///8CAAD/AP4A/wEAAgEAAQAA/wD/AQEAAP4AAAAA/wAAAP///wAAAAEAAQEAAP8AAAEAAQAB/wAAAQAA/v//AQEB//4A/wEAAQAAAAEAAP8AAAEA/wAAAAEAAP8BAf//AQAB/wEAAf8AAQEAAP7//wIBAP//AAAAAQEA/wAA/wAAAQEAAP8AAAEAAv///v4BAAEA////AAEBAP///wAAAQH+AAECAAAAAQAA/wAAAf8B/wH/AAAAAAAAAAD/Af8AAAAAAAH/AAABAQEAAP4AAQAA/gEBAf/+/gEBAf8AAQEA/p6fofb18wAAAAABAQABAAD//l9XBR4dB/8ABv7/DgH/BAAAAgAAAf4AAAEAAP8A/wAA/gEBAgD//wAA/wECAP///v8A/wIAAgAA/wAAA////wEB/wEAAQAA/v//AgEAAAAB/wD/AP8AAgEB/QAAAQAAAP///gEBAAAAAP8A/wD///4A/wEA/gABAP/+/wEB/gAA/wIBAAD//gEB/wD//v8A/wD//wEB/wD//v///gEA/gAB/wD//wAB/gD//wAA/gEAAf8AAAAB/wD//f8A/wD//wEBAP//AAEA/gABAAAA/gAAAQAA/gEAAP//AAEA/wAAAv//Af8B/gD/AAECAf//AQEA/f8BAgD//AAB/wEAAQAAAAAAAQH+AP8B/gEBAf8A/wD//gAA/wIA//8BAQAB/gL+AAEA/v8A//8B/QEA/P8BAAH//wAB/QIA/gD/AAAB/QEAAAAB/wD//wAA/gEB/QEB/gD//gAB+wD//gEB/gD//wAB/v8A/AH///8A//8A/gAB/gIA/f///gAAAP///////wEBAAABAAAAAAH+AAABABwa/wABAwEBBSQnJQICAP7/AP8AAAEAAP8BAAEBAAD/AAD/AAD//wEBAgAA/wABAQH/Af8B/gABAQD/AAD/AAABAAD/AAECAv8A/wEA/wAA//7/AAAA/wAAAQEA//4AAAH+/wEBAAEBAAD//gL/A+Lg4AAAAgAA/wgNEAD9//0B/gIBAf4A/gIAAf4CAQAB/v8AAQD//wH9/gAAAAEAAQAAAAD/AAEBAf0A/wACAP/+/gABAv8B/wABAAH//gECAgP+AP7//wEA//8CAf//AAIBAiUyPdnMvAD//QAAAQAAAf8A/vkAAbLyAr/U/krj/2cdAT0VAf8FAgEFAf8DAAEEAQADAP/8/wEDAf8AAQED/gD/AP/7AAEBAQEC/wACAv8A/wABAQACAAAC/wD/AQAB//8BAQEAAAEBAP8BAP8B/wD+AAEBAAD/AwAA/wH/Af8AAAD/AQD/AQEC/v8AAAABAgEA/wAAAQAA//8AAgEAAAH9Av//AAD+AAH/AP78AAD+/wD9AAL6AAH5///8/wD+AAH9/wD/AAD/AAH+AQEAAP8AAAD/AQD+//0AAa/v/nni/N36/gABAAAAAAABAAAAAE1UUYeEgA0MC//+AAABAQQB//8AAQAA//4BAAEAAQEA/gAAAgAAAAEA//8AAQEAAP4BAAH//wD/AQEBAAAB/wD/AQAA////AAAB/wEAAQAAAAAAAAAAAAEA/wABAAD//wABAQAAAQAAAAD//wABAf8AAgAAAP8BAAD/AAD///8BAAAAAQD//wCzsrJxcXPe390AAAIAAAAAAAEAAAAAAP8kJCSbmpopJyr/AAAAAQAAAAD/AAD/AAEBAP//AP8B/wEA/wD/AQEA/wAAAf8A/wEBAAD+AQAA/wAAAP8AAAABAAD/AP8AAQEBAAAA/wAAAP8BAAAAAAEAAv///wABAP8AAAIA//4AAAEAAAABAgAA/wAB/v8AAf8AAAEB//8AAAEAAAACAAD+/wAB/wAAAf8B/wAAAf8AAQACAAH/AAAAAAABAAIA//8AAAABAQIA/wAAAf////8AAf8AAAEBAf///wEA/v8AAAAAAP8BAAD+AAEAAAEA//4BAQH/AAIA//8BAQD/AAAAAAD/AQEBAAD/AP8A/wEA/wD/AQIAAP4BAf8A/wEBAAH/AAAAAP8AAP8AAQEA/wD9AAEC/wAAAAEA//8AAf/+AAEB/wEAAP//AgAA/wEAAAEBAf//AAEAAAH/AAABAQAB/wAAAP8AAAD/AP8AAAECAQD+/wEBAf8AAAAAAAAAAP8CAAH/AAAAAAAAAgAA/wAAAAAB/wAAAAABAAAAAQAAAQD//wEAAQD///4AAQEAAAEBAAD+AAABAQD//v8AAf8CAAL+AP8AAAEAAAABAQIAAAAAAQD//wABAAAAAAH///8BAgH//wABAAAAAf8A/v8CAQH+AAAAAQAAAAD+AAABAP//AAH//wEAAQAAAAABAADQztKpqKkA/wAAAP//AQAA/wAXGQJgWwYAAQcAABD9/wr+/wAAAAEAAQIBAAL/AAEBAQAA////AP4B/wH/Af3+/wICAAL+AAD/Af7//wIBAP4CAAL/Af8A//4AAQIB/v8AAgIA//////8BAAAAAf7/AP8AAQAAAAD/AQD//wACAP4A/wABAAABAf8A//8AAf4A//8BAP8AAP8BAf4AAP7//wAAAP4BAP8BAP//AP8B//0BAP//AP0AAQAA//8AAf8AAP//Af4A/wAB/wAAAf8AAP4A/////v8AAgAA//0BAAAAAAD/AQAB//7//wAAAgD//wABAP8BAf///wABAQAB/wH/AP7/Af8AAAEBAQAAAAD//wABAAIAAP8AAAD///8AAf8BAAH/Af4AAP4CAP/+/wAA//7/AAD/Af4BAP8B//4AAP0AAf8AAP8A//7/AP4BAf8A/wAAAf4AAP4AAP4AAf4BAP7/AP0AAP0B//0AAf4A/v4AAf8AAP4AAP4AAP4A//4BAf8A//3/Af8BAQD/AP4AAP7//wAAAAEAAf8B/wIAAgH+/v8HBf8BAgMBBAYlJB3/AAAAAP8BAAEAAAACAAD//v8AAAEAAQAFBAP8/P8BAAIAAQACAv/+/wL+AP8BAAH/AP7/AAEBAQH/AAAB/wD/AQEAAP8AAAD//wIAAP8B/wEAAP//AQAAAP8BAAH/AQHq6url4uMAAP8A/wIBBAn9/v4BAQH/AAH/////AwP///4A/v8CAQH+AQABAAEA/gAA/wMAAP8AA//8/P0DAgEAAP8CAAABBP8A/f8AAgICAgIC/v/+Af4BAQIAAQAA/gABAQH///8jMDkNEhjz7eUAAP8BAP//AAD/AAAAAQDw//+n8QGz9f5k5/5fHAUsEwECBAH/A/8AAwIAAgAAAwABAf///QEAAQAAAP8BAQAAAQL/AQAAAAIAAQD/Af8AAQIBAv//AAEBAQEAAP//AAEAAAAAAQAAAP8AAAD/AAIA//4BAAEA/wABAP//AAH/AAEB/wH/AgAA/gH//gABAQIB/QL//gH//wAA/AAA/wD//P8C/AD//AAA//////8A/wAA/wEA/wEAAAABAP///wD//wD/AP8A/wEA/wD3/QCX6P1+5fr2/v8AAAIA/wAAAAAA/wI/RUOUj48ODQ0A/wABAAAAAAAE/wEBAAD/AAAB/wAAAP//AAEAAP8BAAAAAAEBAP8AAAAC/wD/AAAAAf8A/wEAAP//AP8BAAACAAEA/wAAAf8A//8AAAIAAf8A/wEAAAAAAQEA/wAAAQAAAP8AAAAA/wAAAAABAP8AAQH/AAABAQAAAAD/8fDvkZGUjo2P8vPwAAAAAAAAAAD/AAD/AAABKCYnnqCcNjc0AAD/AP8AAgABAAEA/v8AAQH/AAAAAP8B/wABAQH//wEAAQAAAAAAAQAA/wAAAf8BAAD/AAAAAAH//wABAf8AAAD/AAAAAAD/AAABAAEB////AP8AAAEAAP8AAAD/AAEB/wAAAf//Af8B/gAAAQIBAAAAAP4BAAH+/wAAAQAA//8AAQEB/wH/AAABAAL/AP4AAQEB/gD/AAD/AQEBAAH/Af8A/wAA/wD/AQD/AAABAQH/AAABAQAA//8B/wD/AQIBAf8A/wEA//8AAQAA/wD/AQEB/wD/AAH+AAAC////AAEBAAAAAQD//wABAAABAf8A/wIAAP//AQAB////AAD/AQABAQAA//8BAQEAAP8AAQD/AQAAAAABAAD/AgEB/gAAAAAA/wIAAP8BAP8AAQAA//8AAAAAAAEAAf8A//8A/wAAAf//AAECAAH+Af8B/////gIAAQABAAAA/wAAAQEB//4A/wL/AP8AAQAAAP//AAABAAD+/wAAAQABAAD/AP8BAQAAAAEAAP8AAAABAP8AAQEBAQH/AAD//wAAAQEA/wACAAD/Af8B/wAA/wD/Af8BAQH///8BAQD/AAABAAEAAQACAP//AAAAAAAAAP8AAQEB/wAAAgAA/wD//wABAQAA/wAAAQAA/wD/AAEAAAAB/v8Ar7Ky8/HzAAAAAAEBAQAC/wH/U03+Gxr7/QAN//8LAP8EAQD/AAEA/wAC/wACAAD+AQAB/gH/AP8D/wD+AP8CAQAA/QD/AQABAQAA/wH/AAAA/wH/Af///v8AAAD+AQECAAD+AP8AAQEBAAD9AAAAAgD//v7/AQEA//8AAf///wH/AAH/AQAA/wD/////AQH9AAEAAQAA/wD9////AAD/AQH+///+AAD//////wH+Af//AAH/Af/+AAEA/wD+AAD+AP8AAQH+/wIA//7+Af//AAH+AAH/AQAA//7/AAEAAAAAAAH+Af8BAAD+AgD//v8BAQD/AAD/AQD+AAAAAQAA/wEAAf4BAAEBAAAB///+AQEAAQIBAf7+AAABAAD+AQAAAQD//gD+Af8AAAD//gD+AAD/AAD+AgH+AAEA///+AAD+AQH/AP///wD/AAD+AQD/AP//AQD+AAD+AP/+AAD9Af///wD+AAD+AQAAAAH/AAD+/wH/AAD+AAD+Av7+AAH9AAH//wD/AQEA/wEAAP/+AP/+/wD+AAEE//8CAAEA/wAA/v7/AP8AAQEBAAEHAQEIDg0PAAD/AQAAAf8A/wD/AAEBAgEA+/r7xcTFu7y8x8XJ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AAACAAAAAf//AAACAQABAAH/AgAB/wABAAD/AP8AAAH/AQAAAP8BAAD/AQAA////AQEAAgD/AAAB/wD/AP///wEAAQAAAf///gH/AAAA/wH/AP8AAgD//gEAAf//AQEA/wD9AAEA/gEAAQL//8z0AJ7q/aPq/PX+AAAAAAAAAAAAAQAAAgMGBGNkZISAfhMREv8B/wD/AAABAf///wD//wQAAP8AAAAAAAABAQAAAQD//wEAAAD/AAECAQD/AAAB/wEAAAACAAD/AAEA/wAAAP/+AAABAAAAAf8A/wABAQD//wEBAQD//wABAAD///8AAQH//wAAAQABAf///wD/AAABAQD/AQD/AP/39/igoKGLi43g4N8AAAAAAAAAAAEA/wAAAAECAQJSUVCSk48ZGhr//wAB////AQEB//4AAQD///8AAQEA//8AAQL/AP8AAAAB/v8AAv///wEBAAD+AAABAP/+AP8CAgH//wABAQAAAAABAP8BAAD//gAAAQH///8AAAEC/gH+Av4BAAH/AgEA/wABAAAAAAAAAAAAAAAAAQIA////AQD//gACAf//AAAB/wAAAQAAAf//AAD//wABAf4AAAH//wABAAD/AAEB//4BAQAA/wAAAQEAAP8AAAH+//4BAQH/AAEA/wAAAP//AAAB/wL/AP8BAQAB//8AAAAA/wABAAEAAQEA//8BAf///wECAQD/AP8AAQEAAAAAAP8AAAEAAAAB/wD/AAD///8BAQAAAQAA/v8AAQIA/gABAf/+/wH/AQABAQEAAf7//wEBAP8BAAEAAAD/AAAAAAABAQD///8BAgAA/wD/AQEAAAD///8A/wAAAgEAAP8BAAAAAAEAAAACAAAAAAAAAP8A/wIAAAAB//8AAAAA/wAAAgEB/wAA/wAAAQEA/wH/Af8BAAAAAAH/////AAABAAAAAv8BAAEAAAAAAP8AAAAAAAIAAAAAAAAB/wAAAAAA/v7/AQEB//4AAQL///8C//8AAAAAAgH/AP8BAAAA////AQEA/wAAAAD+AP8BAQIAAP8A/gH/Af8B/wEAAv///wEAAgGwsbHY19gAAP4AAQAAAAABAQFQSQE4NgABAQMBAAcAAQYA/wIBAAP/AAEBAgAA//8AAQD+//8BAAEB//8AAAH///8BAQEAAf8BAP//Af8AAAAAAP8AAP8AAP////0BAQMBAP8AAQH+/wEBAAD/Af4C/wH/Af8AAP8A//8BAP//Af4BAv4A/wD///4BAAAAAAD/AQAB//3///8AAf4BAf8AAP7///8BAP/+AP0BAv4A//8AAAAAAP8AAP4B////AP7/Af4BAAL/AP4A/v4BAf4AAP8A/wABAP7///4AAAABAv///f4AAAAAAQAAAQEAAP8B/wEAAP8AAP4BAP//AAABAP4A/wH/AP7/AQAC/wMA/wAAAQABAAAAAf0B/v//AAABAAH///8AAP4BAAAA/wD/Af0BAP4AAAEA/wAAAf4A//4A//3///8CAP3/AP8AAAD/AP0CAP8AAf7/AQAA//8BAv4A/v0B//8A//8AAP4AAf3/AP4BAP4AAP8A////Af0BAP8A/wAAAf4AAP4AAP4BAP4AAP0A//4AAP8BAQH/Af///wD/AQD//gD19wH/AAYQExgYFRP/AQACAQD//gCys7SQjpHEw8IAAAAAAP8AAAAAAAAAAAAAAAAAAAHy8PF/fH5AQUIeHh4AAQH+//8CAQH/AP7+/gABAf8AAf//AAAA/gABAf8AAQH//wAAAP/+/wABAADX1df/AAEAAAEFCw7+Af/+AP8E/v4AAQEAAQEA/wIB/QH/Af8A/wAA/v4CAQIAAv4C/QIAAf4A/gEAAQEAAAH/AP4A/wAAAgIAAAH/A/8DAAD+/gAAAAECAP/+AAABAQH+/v8AAQEAAP8cJi8ZIizn3tMAAP8AAAAAAAEAAAEAAv8AAAIBAAABAP//AP8BAAH1/gGx9AC09f0sA/5JDQI+DwI7DQENBAL//f/+AAABAAAAAAAAAP7/AQEAAQEBAQAAAQAAAQAAAAAAAwEB//8AAAEBAQAAAgD//wEAAQAAAAEAAf//AAAA/wEAAP8AAAAA/wECAQH//wAAAAD/AAABAgAA/wMAAP7///8AAf8AAAH/AAAA/v8BAQD/AQABAAAA/wD+AQEB/wDw+wC48f6t7f287/7y/v8AAAAAAAAAAAAAAAAA//8ICQiAgYB0cnACAwL///8A/wEAAAAA/wAAAAH/Af8EAAEAAP4AAAABAAAAAAAAAAD/AAABAQAA/wAA/wD/AQABAP8A/wH/AP8AAAEAAAABAgEA////AP8AAP8B/gD/AQEAAP//AAEB/wAAAQAA/wAAAAAAAAAA//8BAAEAAP///wAAAAAAw8LEh4aIuLm5AAAAAAAAAQAAAAAB/wD/AAABHyAgfXx5XFxbBwcH//8AAAD//gEBAf///wEBAP8A/wABAf8AAAABAAD/AAD/AQAB/wEAAf8BAQAAAAH/AAABAQAAAAABAP8BAQD/AAAAAQEA//8AAAABAAH/AAH/AQAAAP8A/wL/AAAC/wAAAP/+AP8BAAEA/gAAAQEAAP8AAQD+/wABAP7/AQEC/v//AAAB////AAH/Af8B/wAAAQEA/wABAAEAAAD/AQAAAQIC//8AAP//AQEBAAAAAQAB/wD/AAACAAEAAP4BAAD//wEAAf8AAAD//wAAAv8A/wABAAAAAQAAAAD/AP8AAQEBAAAAAQL///8AAAAAAQD//wAB/gABAQD/Af8B/wH/Af8CAQEAAAD/AP8A/wAAAAD/AAEB/wEAAQD/AAEBAP8A//8BAAAAAAAAAP8A/wD/AAEAAAAA/wAAAAABAP8AAAAAAP8AAAH/AQAA/wH/AP8A/wAAAQEBAAD/Af8BAAH//wAAAQAAAf//AAD/AAABAP8AAQAA////AQABAAIA////AAH/AQACAAH/Af7//wEBAQEB////AQAA/wAAAgAA/wECAAD+AP8AAP//AgAB/wABAP/+AAABAAEAAAABAAD/AAEAAAABAQEA/wAAAQAAAAD///8AAQEA/wL/AgABAP8A///+AQEBAAH/AQAAAAH/AP8AAAEA/wD+sLGyAAD/AAABAAH/AgAA/gEATkkBAQEB/gED/v8MAP8C//8B/wEAAP4B/wP/AQD//v//AAAA/wD+AQAA/wECAP8AAQD//wH+//8AAQEBAP4BAAH/AAD//wH+AgAC/wD9/wACAAABAQD+AAAAAQAA/wD+AAD//wH/AAH//wAAAP/+AQD/AAAAAQD/AAD/AQEBAP/+AAD+AQL/AAD8AP8AAAD+AAD/AQD/AQD/AAD8/wAB/wAAAP/9AAH+AAD/AAD+AAD/AAD9AP8CAgD//wD9AAD+AAAA////AAL/AAD+////AAH/////Af4AAAEAAQAA/wAAAAAAAAD/AAD9AQEBAQD+/wADAAH+AQAB/wL9Af4AAAAAAP8A/wH+AAEAAQAA/wACAQAAAAH////9AAD+Af///wAAAAD/AgD//v/9Af//AAAAAgD+/wH8AQAAAAH/AAD+////AAD/AP/+AAAAAP/9AQD+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/wAAAAEAAAAEAAAAAP4A/wEAAAABAAD/AP8BAAD/AP8BAAAAAQAB/wAAAP7//wEBAQEAAAAA/////wAAAAEAAP8AAQAA/wEAAQD//wAB/wD/AQAB/wD//gAAAQAB/v//8O/vj4+RkZKU8/LxAAACAAD/AAAAAP8AAAEAAAEBRURCf4F/OTk5AP//AP8AAAAAAAEAAAAAAAAAAAABAQAAAAAA/wABAQD/AQIA/wAAAQABAf8A/wEAAP//AAABAAD/AQH/AAAB/gD/AQACAP8A/wAAAf8AAAD/AAEAAP//AAABAQAA//8AAAAAAAAAAf8B/wEAAQAA/wEAAP//////AAEAAAEAAf8AAAAA/gEAAf8BAAEA/wAAAQAAAAAC/wAAAAABAAD+AAABAAAAAf8AAQAAAAEBAAD///8CAQAAAP///wEBAAEA//8AAQAAAAD///8AAAD/AQAAAQAC/wEA/wD/AQD//wAAAQEAAAAAAQAAAP8B/wAAAQAAAAAAAAAAAAABAAEAAP8AAQAAAP///wEAAf8BAAD/AAD/AAEBAP8BAAH/Av8B/gAAAf8AAQEA/gAAAQIA////Af8AAAAA/wAAAAABAAABAf7/AAIBAP8A/wIAAf8B/wD/AgAA/v/+AQAB/wAAAQD/AQABAAABAQD/AAAB/wD/AP8BAAAAAf///wAAAP///wIAAf4AAAEAAAD/AAAAAAAA//8AAAEAAQABAP7//wIBAf8BAP//AAD/AQEA//8BAf//AAABAQAA/v8AAgEC/wD/AQH//wAAAP8AAQAB/wH/AQAA/wAA/v8AAAIAAf8AAQAA/wAAAAH+AAACAAD/AP7//wECAQAAAAAA//8AAQAA+Pj5sLCwAAD/AAH/AAAB/wABDg7/Ukz//v0CAAQGAP4NAAACAQD//wH/AAH+AP//AQD//wD/AP/+AAD//wD/AAADAAH/AP4AAAABAAEBAgD/AAH+/wAA/wEDAAD+AP8B/gAAAQD/AAEA///+AAAAAQD//wAAAP8AAQL+//7+AQAAAAABAP7+/wAAAAD/AAD/AAD8AAD/AQEAAAD+AAEAAf/9///+AQD/////AAH9/wAAAQD/AQH/AAD/AP//AP/+AAD/AAD9AAD/AP//AgH/AQD//wH/AP8AAgH9AP///wD+AQD+AAH/AP//AAAAAAH////+AAABAf//AAH/AQH+AP4C/gAAAQD/Af8AAQD//gD8AQAC//4BAAD/AAAA////AAD/AAH/AP/9AQEAAP4A/wAC/wD+AP//AAD/AAD+AQEAAP/+AAD+AQAAAAH/AP/9AQD+AAD9AQAAAAD9AQD/AP7//wL+Af//AAD+AP4AAQL+AP/+AAD+/wH+AQAA///+AQEBAAAA/wD/Af/+/wH+AAD/AgD+AAD/AAD//wAAAQAAAAD///sAAP7/AAAAAP4A4+cDAAD5+PnvYF5jx761AAD/AAABAAABAAAAAAAAAAD/AAD/AAACAAABAAEAAP//AAAAAAD/AAAB6ejpAAAA////AAAAAQL/AP8BAP8A/wD/AP8AAAD/AAH/AP8BAP8AAAEBAP///gD/2NfY7u/tAAABAAACBgwS+/3+AwIAAgED/wH//wH//f4AAAEBAQACAQL+AP8CAQD/Af8C/gD+Af0B/wIC/gD/AQL+//4A///+/v8D/wP+//3/AgIDAQL/Af3/AgIA/gIAAf4BAAAC/wH+AAACAQD/AQECIC464dXHAAABAAABAAD/ycjJj42KNjU4eXV2wcTDqqqutLSz5ePiAAEC////AAAAAAH/AP8B/wD/AAAAAAAAAAEA////+v8A0Pj/z/kAAQAB/wH/AP8BDAL/KwgBFQMAHQcDFwYBBgAACwL/DgD/CQMBAAAADAYCBP/+DQYCAAH+9P8AyvH8/P8ABgAC/QP+9Pr+1fb/0vX96/sB+AAAAAAAAAEAAP//AAAAAAACAAD/AAAAAAABAAH/AP8AAAD/AAACFRgYWlpaYWFdLyssAAEAAAAB/gAA////AAABAgAA/v//AQEAAP8AAAAAAQAAAQAAAAAABAH/AAABAAAA/gEAAQABAf///wABAQAA/wAAAP8AAP8AAQEB/wEA/wD/AAAAAf8BAAH/AAD/AAL/AP8CAAEAAP8AAAEA////AP8A/wAB/wAAAQH/AMLDwnh2esjJyQAAAAAAAAAA/wAA/wAAAQAAAAIAAVdYVIyMihoaG///AAEAAf//AAACAf8A/wEA/v4AAgH//wAAAAD/AAEBAAAAAP//AAAB/wD+Af8CAAAAAAABAAAAAAD/AQAAAP8A/wEAAQAA////AAAB/wAAAf8AAQEA//8BAQH/Af///wABAP8AAAD//wEBAP8B/wD/AQD/AAH/AQEBAf//////AAAC/wD/AQH/AP8AAAH/AAAB/wD/AP8A/gH/AQABAP8BAAD/AAD///8BAQD/AAAAAQEBAAD/AP8A/gABAQAA/wEAAAAAAAABAP//AAEBAQAA/wAAAf4BAAH/AAEBAAAAAAD/AQAA/wAAAAAAAP8BAAAAAAD/AQABAQD///4AAAEA/wABAQD///8BAQD/Af8C/wD/AAAAAgD//wAA////////AAEBAQABAP//AQEB////AAAAAQAAAP8AAAEAAAABAP/+/wAB/wH/AP8BAAD/Af8A/gEAAf8AAAH/AQAA/wABAf8BAAAAAQEAAP8B/wAAAAL/Af8A/wABAAD/AQACAAH/AP7/AAEAAAEAAAAAAAD//wEAAQABAAEAAf8A/wEBAf//AP///wABAAH/AAAAAAEAAAAA/wAAAP8AAQEBAP8AAAABAAD/AQEBAAAAAf8A/wAAAP8AAAAAAAEBAQD/AP8BAAAAAAIBAf///wEA//8AAAEBAQEA/wAAAAAAAAEAAAAAAMTEw8fHyAD//wAA/wABAAICAUhEAi8u+v8ACP//C/7/BQAAAgAAA///AAAA/wH//P8AAAH/BQAB/AAAAgABAQEA/v8A/wABAAAABAAA/////wAA/wD/AAEA/gAAAQAAAP8AAAEA/QAAAAEAAP0AAAD//wAAAAAAAf/+/wIA/wAAAAAA/wAA/wAAAAAB/v/+/gEB/gEA/QAAAQAA/v///wEAAAEA/gAA/gAA/gD//gAB/wAAAP8AAAD//gEA/gAA/v4A/gIBAP8A/wAB/wIA/v///wD//v8A/wEA/////gEC/gAAAAAA/gEB////AAD//wEA//8AAAAB/wAA/gD/AAAB/wAAAQD//wAB/v8AAAEAAAD//gABAAAAAP///wEAAAEBAAD/AAAB/wD/AAAB/wEA/gAA/wAA/gD//wD//gAB/wEA//8A/gD//wH//v8B/gAA/////gIBAAAAAP///wEA/wD//v8A/wEA/wAA/wH+/v8A/QAA/wAA//8A/gEAAP///wIA/wAA/f8A/wEA/wIBAP7//wEA/AEB/wEA/gH//AH+/f78AAAAAf7+/+rsAdbaAgIB/djOwvHv6QAA/wAAAAAAAQAA/wAAAAAAAAAAAAAAAAAAAQD/AQABAAAAAQAAAAAA/wAAAfj4+f78/wABAAAA/wD+/wAAAAAAAf///wEAAP8AAAD/AAAA//8AAAD//wAAAQEAAtfW1QAA/wAAAAUPFwcUGQAAAP7+//0D/gD9AQACAQEC/v8AAgAA/wP/AP////4AAAL+//4CAQEBAAEA/wH/AAH/AQD+/gACAwH+/gIAAf8CAv/+/gH9/wACAwH+AP8B/wL/AP4B/QH9AwID/wAAAf7//h0oMwIGCf76+AAA/gAAAdvZ2czLzkdIRgIEA0JAQUE/QYJ/fMHDwrq7vsjHx9nb3Pv5+QAB/wD+/wAAAAABAAAAAAABAf8A/wABAgEA/v//AAAAAAEB/vX/Acv2/f8AAv/y/QEAAP///QABAAAA/wD/AQAB/gAAAQD+AAECAf///wD/AQEAAP8A/wAB/wEBAv/+AAAA/wAAAAAA/gAAAgAAAAD//wAAAAAAAQAAAAAA/wABAQAAAAD/AQAAADM2OVdXVVFQTSMhIgABAQAAAAAA/wD/AAEBAP8BAAEAAAD//wEBAQAA/wAAAAAAAP8AAf8BAAH/AAT/AQEAAP8AAQH+AAEBAAAAAAEBAf///wAAAAAAAAEBAP8AAQH/AP///wEBAf8A/wEAAP8BAP//AgEAAP//AAEBAAD//wEAAf8AAAEAAAHl4uOOkJCen6Hy8PAAAP8AAAEAAAAAAP8AAAAAAP42NjdubmtQUFALCwz/AP4AAP8AAAEAAgEAAP8AAAD/AAICAAD/AQAB/wD+AQABAAAAAAAAAAAA/wEBAQD+AAABAAAA//8AAAH/AP8BAQAB/wEAAQAAAAABAAD//wL/AQABAQAAAAAAAAH/AQAA/wAB/wAAAAABAQD//gAAAAIAAP8BAQEAAP8AAQAAAAAA/wD/AAEAAQAB/wABAP///wABAAABAf8A/wEBAgD/AAABAAEBAQD//wEAAAAAAf//AAH//wAA//8AAAEAAAABAf8A/gIBAf4A/wEAAAAAAP8AAAD///8BAQAAAAD/AAAAAAEBAAAA/wH/AQABAAAA//8AAAH/AAAA//8BAAACAAAAAAH///8AAgIAAP8BAQAAAAEAAP7//wABAP//AAAB/wAAAQAAAP8AAAEAAf8AAP8BAAEAAP8AAAEAAP8BAAH+/wAAAQABAAIAAP8A/wABAP8A/wEBAQD/AAD/AQABAQEB/wABAf////8BAQH//wEBAQD//wABAAD/AAAAAQACAAD/AQECAP//AQAA/wABAAIAAQD/AP8BAAEAAQD//wEAAAABAAAAAQEAAAAAAf8AAAEAAP//AAEBAAEAAP8A//8AAgAA/wD/AAAB/gABAf8AAAD/AAAA/wEBAP8AAAD/AAABAAD/AP/+/wABAAEAAAABAAD/AAABAAEAAP//AAECAAD+AP+6u70A//4AAP8AAQEAAAH+/v5GQwH+//8AAQP//wYAAAT/AAAAAQAB////AP8AAf8B//0AAgH//wIAAQAA//7/AQAAAAIAAAAA//4BAAH/AQEB//4AAQEAAAEA/wD/AAICAAH/Af8AAAH/AQEB//4AAAEA//4BAQH///7/Av8B/wH/AAABAPwBAP8B////Av7///4AAAAAAP4AAP8BAP8A//4AAP//Af4BAf3///8AAAAB//8AAAAAAfwA//4CAP4AAP8A/v8BAQAAAf////4BAf8A//3/AP//Af8B//4A/wAAAP8BAf7//wAAAf8B//4AAf8A/wEA/wAAAP//AQEBAP8A//4AAP4A//8AAQAAAAAAAf8AAP4AAAEBAgAA/gAA/wH/AAEBAP////8AAP4BAf////////8BAf8BAP8A////AP8A//4AAf8AAP4B//0AAf8AAQD///4AAP8CAAH/Af8B//8BAP8AAf3/Af////4AAP8BAP7/Af4A//8AAQAB/v7/Af8AAP8AAP8A////AP4BAf4AAAABAP8BAP4BAf3//P///P//AQH8+gO5wAPX3vf+/Pnx7vwAAP0AAAEAAP4AAAAAAAEAAP4AAAEAAAEAAAEAAgMBAAH///8AAAAAAAAAAAIAAP4VFBT9//0DAQMAAP8AAAIAAP4AAAH/AAAAAf8A/gH/AQEBAAAB////AAD/AP8AAADZ2doAAAEAAAEKFiEBBAf+/v4CAQH+/f8AAgL//gIC/wADBP7+/gEBAgH//f8AAwD/Af////0E/wL+/gACAgP+//8A/wABAP0CAwIAAQQA//8AAP/+/wEB//78/wABAgEBAQEAAAIAAP7+/gIBAQABAQAVHyQbIy3j18sAAAIAAP//AADFxsZHSEcBAAAAAAABAQAWFxZUU1NVVFT+/v/HyMi7u722trXLy8wA//8A/wAA/wAAAQAAAQAA//3//wEAAf8AAP///wEAAP///gEBAP8AAf//AQABAQD/AAEB/wH/AQAAAAIA/wAAAAD//wAA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Af8AAQABAAH+AAECAf///wEAAAD/AP8B/wEA/wABAgAA//7/AAL/AQAA//8BAAEAAAD/AAAAAAEB/wD/AQEAAQD//wABAQAA/wEB////AAAAAAEAAAABAAAAAP//AAABAAEBAAD///4AAQEB/wD/AAD+AQACAAD/AAEAAP8AAAH//wEAAQAAAAD/AAAAAAEAAP//AAAB/wAAAQAAAAAA/wAAAQAA/wEAAAAA/wACAf//AAEAAQABAP///wD/AQH///8CAAD/AAABAAD+AP8C/gD/AgEA/wEAAQD//wAAAQAAAf8A/wH+AQACAAEBAAABAAD/AAAAAAEBAAD///4AAAEAAf8B/wL/Af4A/wEAAf8A//8AAAD/AAEBAAAAAQAA////AAEAAP//AAABAQABAAAAAP//AQAA/////wAAAAAB/wD//wEBAQD/AQEAAAABAP7/AAH/AAEBAP8C/wEAAf//AAIAAP//AAEBAv8A/gABAQD/AQAAAAD/AP8BAAEAAQAB/wD/AgAA//8BAP//AAEA/wAAAP//AAAAAAAA/wAAAQAB/wH/AQD//wABAAAAAQAA/wEAAQH//wABAAEAAP4BAAD+AAEAAP8AAAH+/wAAAQAB/wABAQH///8AAQAAAAD/AAABAQEA/wAAANLT1NHR0AAAAAAA/wAAAgABAUxH/xYV/f//BP8ABf8ABAD//wAA/wAB/wAA////AAEBAP8A/QD/AgAAAAD//wABBQD//wAA/wEA//8B/wH//v0AAAEBAf8A/wD+AwEAAf4A/wEBA////P8BAQEB/v/+AAAA/wEAAf//AP8A/gAC/wH//v8AAAAAAP/+//8B/wIAAP8B/wEA//8A/gAA/v///gEB////AAEB/gD//gEA/wEB//7//QAA/QEA/wH/AAAA/wEB/wAA/QAB/gH//v8A/wAA//8A/wL/AP8B/gAA//8A/v//AAH//gEB/wD///8BAAD///8A/wEB/wD+AAAA/wD/AAEAAAAAAAEA//8B////AQAA/v8B/wEA/wD+AQABAP///gEAAQEAAAAAAQAAAP///v//AAAA/gEB/gAAAQEB/QH//wAA/gAA/gD//wEC///+/gEA/wAAAAH+/wAB/wAB/////wABAQAA/gAB/gAA/gEC/wD9AAAB/wD+/f8B/wEA//7//gIC/wD//wEA/gAA/wEB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AP//AAAA/wEA/wD/AQAA/wABAP8A/wEAAf8AAAEAAAD/AAEA//8BAAH/AAABAP8BAAH/AQABAf8B/wH////+AAIAAP8BAQEAAQAB/wEAAAAAAAH/AP4AAAEBAAAA/wABAgH+/wABAQD//wAB/wAAAQIA////AP8AAAEBAQEAAAAA/wABAAAAAAAAAAD//wACAAEAAQD///////8BAAEAAP//AQAA/wEA/wABAAH/Af4BAAEAAAEAAP8BAAAAAQAA/gAAAgAB//8B/wAAAAH/AQABAAAAAAH///8BAP///gD/AQEBAQEA//8AAAAAAAABAAEA//8AAf8AAAIAAP4AAAAAAAEAAAEBAQABAAD+/wABAgEA/wAAAAD/Af8CAAL+AP8BAAEAAf8B/wAAAAD+AAECAAABAQEAAAAAAAAAAAD/AP4B/wECAAH/AQD/AAD//wC/wMHl5OUAAP8AAAIBAgEMC/5FQP4B/wD/AQIAAQgAAQYB/wH//wEBAQD9AP8BAQAC////AP/+AP4BAAD/AP///v4AAQMAAP7/AAEAAQABAAD/AAAAAgAA/wH/AP8BAQH/AP8AAAAA/wABAP8AAAD/AAEBAAD///4BAP8AAAABAf8B/wD///3/AP8BAQD///4BAAAAAf8CAP8A//0AAP4AAP8B/wD///4AAP////4BAP4AAP0BAf//AP8AAf8A//4AAP0B/wAAAf8A//8AAP4AAP4AAP7///8AAP7///8AAP8BAf/+AP4C/wD//v8AAgAB/wAAAP4AAP8AAAABAAAA/wAAAP//AAEB//4BAAABAP8A////AAAAAQACAP//AP//AAAA/v8BAQAA//4AAQAA//8A//8AAAABAP4BAf4AAP8B////AgAB//7/Af8A//8A//8AAP7/AAABAP8AAP8B/wAAAf////8AAf8B//8AAQAA//3/AQD//f8BAgAAAAABAf//////AP8A//4CAgD/AAAA//7/Av4AAP8A//0AAP4BAQD/AP8BAQMBAf3/BgAD/wD//QEnIf8AAgEA/v4AAAAAAAAAAAEAAP4AAAAA/wEAAgEB/v//AAAA//8AAP8AAP4AAAAAAAEAAP9HSkoTExL+//7///8A/wAAAQAB/gAAAP//AAEAAP8BAAH///4AAAEAAAD/AAHFxMXz8/UAAAAABQwKGSUAAQAA/v8AAP7/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AQABAAABAQABAAD/AP8BAf/+/wH/AAAB/wD/AAEBAQAAAQAA/wEBAf8AAP8A//8A/wEBAP8B////AP8BAAD///8AAP8A//8AAP//AQD/AQD/AQAAAQD/AP//AP//AQEA/wABAAEA/wD//wH/AP8AAAD/AAD//wABAQEBAP8BAQD/AAAAAQAB/gAAAP8BAAD//wABAQAAAQAA/wACAP8BAAD/AAD/AAEAAQD/AAAAAAAAAAH/AP8AAAAAAAH/AP8AAAEAAAEBAQAAAAD/AAD/AgABAQEAAQEAAP8AAAAAAP8AAAH/AAL/AQAAAAAAAAABAf///wECAQEA/wD//v///wAA/wAB/wAA/wH/AP8AAAAAAAIA/wEAAf8AAf8AAAABAgABAP8A/wH/AAD//wD//wAA/wAAAQAAAP7/AP//AP4B////AP//Af8AAAD/AAEBAf8AAAAAAAAAAP4B/wIBAQICAAAAAQAA/////wIBAAD/AP7//wAAAAABAAAAAf8AAAAAAf8AAf8AAAEAAQAAAAD/AAAA/gD/AAABAP////8AAP8AAP4A//8A/wD/AAAAAAAAAAAA/gAC/gD//gEAAAD//9LS09PS0QAAAAABAAAAAQD//zo2AP//AP7/Av3+Bf//AgD/AQAAAAEBAAAA/wD//gEA/wD/AP///QAB/QH//gD//QD//QAA/gH//wAA/v8A/gEA/v8B/gAA/gAB/wAA/gD//QEA/f8A/gH//wD//f8A/gAA/AAA/wH//gAA/P8A/f4A/gAA/P///gD//QAA/f4A/QH//f8A/QAA/QAA/gH//gD//QD//QAB/QAA/gH//gAA/f8A/QAA/f8A/QEA/gEB/QH//QAA/P8B/AH//QEA+wEA/AH//AAB/f4A/wEB/QEA/QH//gEA/AEA/QEA/QAA/gAA/QAA/QEA/AIB/QAA/AAA/AEA/AAA/AH//AEA/QAB/QEB/wD//AEA/AAA/v8A/gD/+wAA/QEA/P8A/gAA/QEA/QH//QD//f8A/gAA//8B/v///QL//gAB/wD/AAD/AP4B/wH+/wAA/gD//wAAAP///wAAAP8AAQD+AAD////9/wAAAP8A////AQH/AP8BAAEA/wEAAAAAAAD///8A/gD+/gABAP8AAQD/AAAAAAAAAf8A//8BAf8AAQABAAAAAAIBAAIC/wYHACUh/gAA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/wD/AAEAAP8AAQAAAAD/AAAA/wABAAD/AAD/AAAAAQH//wAAAQEA//8BAQH/AAAB/wAAAQH+/wABAQABAAEAAf4B/wL//wEAAAD+AAAB/wABAf//AQEA/wAAAAABAAH//wABAQD/AQH/AP8AAAD/Af8A/wIAAf8B/wD/AAAAAAAAAAD/Av8CAAL/AAAA/v//AAABAQAA//8AAAABAgAA/wABAAABAAD/AAAAAP8B/wEAAAABAQD/AAABAQAAAAAA//8CAgABAAAAAAACAAEAAAD/AAIAAAH//wD/AAAA/wAB///+AQEAAAAAAf/+zs7OmpyeAAAAAAABAAABAAAAAAABAAD/bGxqb3BtAQECAQAA//8AAAABAQEB/wAAAf8AAf8BAAAAAAAA/wAA//8BAQAAAQABAAAAAf8BAP8A////AP8A//8AAAAA/wABAQAA//8AAAEBAAEAAP8AAAAAAAABAAABAQH/AAAB/wD/AAAAAQEBAAABAP//AAAAAAAAAAABAAAB/wAAAAEAAAEB//8AAAD+AAAAAQH/AAAAAAAAAP/+AAD//////gD/AP//AAD/AQEAAAAAAAACAQAAAAABAQEA/wABAP8BAAABAAEB/wAAAAD//gEAAAAB/wD/Av8B/wD/AQAB/wABAAEA//8BAP///wAA/v8A/wH/AAAAAP4AAQAA//8A/wAAAQABAQD/AP8BAAEAAQD+AAD+AQEBAAEAAQH/AAD/AAEAAQH///8B/wD/AAD//v//AP8BAQABAP4A/wABAQEBAAABAAAAAAEAAQAAAQAAAAAAAQD/AP//AAEAAP8AAAAA/wAAAQAAAQEBAAD/AAEAAAEBAAEBAQEBAAEAAP8A/v//AP//AP//AAABAAD/AAD/Af4BAAH/AAD/AAAA/wABAP//AQEAAf8B/gD/AAD///8AAQAAAP8BAAAAAQIBAAEAAQEA//8AAAABAQAAAAD/AAD/AAAB/wEBAAH/AAAB/wABAAEAAAAAAP7/AQAB/wAB/wAAAAD/AAAAAf//AAABAP8B/wABAAABAAEBAAH/AAABAAACAP4AAAAA//8BAP8CAAAAAAABAAAA/wAAyMbIAAABAAEAAAEAAAABOTEAJyUAAQEAAQAIAAAE//4AAQAA//8AAAD////+/wD///8AAP//AP8A/wAAAQAA/wAAAf8A/gD/AQAAAP/9AQAA//8A/wH+AQL9AAD9/wD+AP//Af/9AP/9AP/9AAD8AAD8AQH+AQH9AAH8AQD+/wD//v/8/wD8AP/+AQH9AAD8AQD9AgH9AP79AgD9Av/+AAH9AAD8AP/8AP79AAD9Af/9/wH9Af77AP/9AP/9//7/AAD9AAD9AQH+AQH+AAD9AAH/AP/+AQH+AAD+AQH+AAH+AP/9/gH9AQD9AAD+AQD/AAD9AAH8AAD8///8AP/9AQD+/wH/AAD+AAD+AAH/AP8AAAAA///+AAD+//7//wH+AQD/AP/+AAH+AP/+AQD+AP/+AAD+AQD+Af/+///9AP7+AAH+AAD+///+AAD+AAH+AAD/AAAAAAH//wL//gD+/wD/AP/+AAAB/wABAf8A/wEAAP////8DAf8BAP8CAP8A/wEBAP8BAP8BAAIAAAAA/v4D/v8DAP8C/wAC/wACAP8AAP8B/wAC/wADAQACAQEB/wAAAAEAAAIBAAIAJCD+AAEBAAEAAAAAAAAAAAADAAAAAQD/AP8AAQEAAAAAAAAAAAD/AAAAAAAALzIzP0A/AAIBAQAB/wAAAAH///8AAAAAAQAA//4AAAAAAQEAAgEAAAAA9/b1j4yL+fn1AAD/AAoSCiAx/f7//wAA/gD/AP//AP7///7///8A/v8A/////////wD///7+/v////7+//////4A/v7/AAD//v/+/v/+//7+/wD/AAD//////v7+/v8A/v///////v7///7//v///f7+AAD+/v/9//7//v79/v7//v/+/////v3+DBYe/wAAAAAB/wABAAAB5OXj19fXAQABAQAAAQAAAP///wAA/wD//wAAAAD/AAAAAAEBAf8AAAAAAP8AAAD/AAAAAAAAAP8AAAD/AQEAAP//AAAAAAAAAP8AAAEA////AQAAAP4AAP8AAQAC/wEA/wD/AAH/AQD/AAAB//8AAP//AAH/AAAA/wD/AAD//wAAAP8BAP8BAQABAQABAQH/AAAB/wABAAAAAAEBAP8BAf8BAAD/AQD/AQEBAAEA/wAAAAEBAAAAAP4AAAD/AAAA/wEAAAEAAAABAQABAAAA//7/AP8A//8BAQEAAQEBAv8A/wAAAQEB//8AAP8BAQAAAQEAAQEAAQAAAAABAAEAAv4AAAAAAAD/Aq6vsfb19QAAAAAAAAAAAQAAAQAA/zg5PHt7eP7/Af//AAABAQABAQABAP4AAAEAAP8A/wABAQAA//8AAAAAAAAB/wD/AP//AAABAP8AAAAB//8AAAABAAAAAQAAAAABAP8BAQEAAf//Af8AAQABAQABAAD/AAH/AP//AAEA/wH/AAAAAP///wD//wAAAAAAAP8BAP8A/wAB/wEBAAD//////wAA/wAAAQAAAAD/Af8A/gAA/wEAAgAAAAABAQAAAQABAQEAAP//AAEBAAEAAAAA/wAAAf7/AAAAAAABAAAA/wEAAAEAAQABAAH/AAAA/wD/AAABAAEAAAAAAAAB/wAAAQEAAAECAgAA/wEAAP/+AAD/AAEBAf8BAAAB/wH+AP7//wABAQACAAAAAAABAP8AAv8AAAH+AP8BAQAAAQD//////wEA/wEAAQD/AAEBAAAA/wD/AAEBAQEA/////wAB/wEBAQAAAf8AAAAA/v8A////AQH/AQD/AAAAAAD//wD/Af4AAP4A//8AAQH+AAD//wAB//8AAAH//wAAAAEBAQEAAAIBAAEAAAEAAQAB//8BAP//AP8BAQEAAQEAAP8CAAD/AQAB/wEAAAEAAQAAAQAAAP8AAP8BAP4AAP//AP4AAAEAAAABAAAAAAD/AQAAAv8AAQEAAAH+AP8B/gAA/wD//wEBAAAAAQAAAAD//wAA/wEAAAEAAAABAAACAP8B/wAA/v8A/wAA/gD+AAAB/gAA/wABAAEAAAABAAAA/wH/AAABAP8A/+De3srKygAAAAAAAQD/AAD/ADEv/gEDAP4B//7/BAAAAQABAv//AAAAAQEA/wEC//8AAAEB/gAB/wAB/gEA/gAA/gEA/v8A/gEA/wAA/QEA/f7//QEA/gD//QH//gAB/QAA/v8B/f8B/gAA/gAB/gAB/QAA/v8A/v8A/QEA/QAA+wAA+QL//AH+/AAA+v3//QH//gAA/P4A/AAA/QAA/QEA/AIA/QD//P8A/P///AH/+wAB/AEA/QAB/gAA/QAA/QEB/QAA/AAA/QAB/gD//QAA/QD//AAA/f8A/QAA/AEA/gAA/QEA/AIA/f///QIA//8B/QEA/gD//QD//gAA/////wAA/wH9/gH//QH//gH///8A/gEA/AIA/QAA/QEB/QH//gD//v8A/wH//AEB/AAA/QAA/gEA/wEB/gAA/wEA/wAB/wH+/wD//gAA/QH//gH+/v///QEA/v///wH/AAIBAAH/AAAAAf//AAEAAP8BAgD+AQAAAwEAAgAAAgAAAf8AAQAAAQABAQABAQD/AgAAAgAAAAEAAAAAAQD/AAD+AAAAAQAA/wAAAQEBAv8BAv8BAP/+AAD/AP8BAAIC/ywpABIPAAD/AAAA/wAAAAAA/wAAAQAAAQAAAP8AAAD/AAAA/gAA/wAA/wAAAFdZWgsNDf/+/f8B/gAAAAAAAQAA/wD/AP//AQEB/wEAAQD/AP//AQAAAcLCxMC+vQAAAAAAAQsmOwMMEAD/AP79/wD/AP7/AP8B//8BAP//AAD+/wEAAP4AAP/9AP8AAP///wAA///+//7+/v7+APz+AP/+////Af0A//7///7+//39AP8AAf///////v7///8AAP4A/gD+AP/+//3+/f7+AP///wD///7/////AP///v7+/hEcJBAVHQAAAAAAAAAAAAD//tfX1/8AAAAA/wAA//8BAAH//wEAAAD//wEBAQEB/wAAAAABAQAB/wABAAEBAf8A/wD//wABAAD/AP///wABAAABAf///wEB//8A/wABAQAA/wABAAAAAP8AAAEAAAIBAAAAAAD/AQAA/wABAAABAAD/AQAA/wAAAQEAAP/+/wABAAEAAP///wD/////AQD//wAA/wEAAAD//wEB/wD/AQD/AQAAAQABAAEAAAEAAAH/AAAAAQAAAQAAAAABAQD/AQAAAAABAf8BAAAAAP8BAAAAAAAAAP7//gABAAL/AQD/AP//AAAA/wAB//8AAAAAAAD/AP//AAEAAAAAAf8BAAAAAAD/Av/AwcEAAP8AAP8AAAAAAAAAAAAGBghxcm8REhIBAgD/AQD///8BAf////8BAAAAAQABAAD///8A/wAA/wEA//8A/wEAAQEAAf8AAAAAAAAA/wEBAAABAAABAf//AAD///8BAAAAAf8BAP8B//8A/v8A/wAAAQAAAP8BAQH/AAAAAQD/AQAAAQD/AQAAAAEAAP8BAAAAAAABAAAB/wAAAAACAAEBAQAAAQABAAABAf8BAQEAAAH/AP8BAAEA//8BAAEAAAAAAAEBAQEA/wAAAf8AAAEA//8BAQABAf8BAAAAAAD///8AAAH//gEAAAAAAQEAAAD/AAD+AAAA/wAA/wEB/wD/AAD///4AAAAAAAADAQAAAgD/AP8B/wABAQH/AQEBAAD///8BAP8A/wAA/wABAP4BAAD/AQEAAAD///8A/wH//wEBAAAAAAABAQAAAQEB/wEBAQEA/wD/AAABAAEAAAAAAAABAAAAAAEAAAABAAAAAAD/Af8AAAH/AAAAAAH/AP8BAAAA/gAA/wD+AQAAAAD//wAB///9AQAAAQD/AAD/////AQEBAQEB/wAB/wIAAf8AAAAA//8AAP//AP8B//////7//wEAAAH/AP8AAAD/AQEBAAEB/wAB/wEAAAABAAEA/wAA/wAAAAAA//8A//8CAP8AAAD+AP8C/wIBAAEAAAAA/wAAAgAAAAAAAQAAAAD/AAEAAQEAAAEB/wABAQAAAAEBAAEA/wABAf8A/gEA//8AAAAAAAACAQD/AQABAAD///8B/wDb3N3u7u0AAAAAAAAAAAAAAP8yLgACAAABAgIBAgP/AAIAAQAAAAABAP8AAP4A/v0CAP3///7/AP////3///8A//8AAP4AAP7///4A//7/AAABAP0AAP0BAP3///0BAP0AAPwAAPz/APwAAP4A//0B//8CAPwA//wA//0A//v/APwAAf0AAfz/APwA//sC//3/APwA//4C/wABAf//AP4AAP3+/vwAAP0BAPsAAPsAAPr/APoAAPz///0AAP0AAP8AAP4A//7/Af4A//0BAfwB//0BAf0AAP4C//0AAP4AAP0BAP8AAf8AAP8AAf7/AP0BAP3///0CAP8AAv0AAP0BAv0B//7+Af0AAP4AAP4A//0BAP4A///+/////v4AAP4AAP4AAf8BAP4A//8B//4BAP8AAAAB//7///8AAf7/Af8A////AP4BAP8BAf//AP4AAf8CAAAAAQABAQH/AP8AAAH/AQH/AAABAAAAAAAAAP8AAAD/AQH/Af8AAQABAQEAAQAAAQAAAAAAAAD/AAD/AQABAAEAAAD//wAAAAAAAQD//wH//wH/AP8A/wEB/wQA/gMCAwEA/wABAAABAgAfHQAlIgEAAP8AAAEAAAAAAP8AAQIB/wEAAAAAAf8AAP8AAAAAAAAAAAAzNTZPU1ECAQAAAAEA/wABAAAAAAAAAAAAAAABAv8AAAAAAAABAQABAAD+/PykoKAAAP8AAAICER4LJTgAAAD+AQD/AQD//wD+AAD//wEA////AAD+AAD9////AP//AP/+////AP/+///+AP//AAD+AP7///8AAf/+//7//////v/9////Af7//v3+/v3//wD+///+/v7//gD9//4A/////gD9///+/v7//v7///////7+AAD/AAACBQkMFRoAAP8AAAAAAAEAAAHf3+AB//7/AAAAAAEBAAD/AAD/AQEBAQH/AP///wABAAAA//8AAAEAAAH///8BAQEAAQAB/wEAAAABAQAA/wAAAAABAAH/AAAB/wAA//8AAAAAAP8AAf8BAAD//wD/AP8BAAEAAf8BAAEA/wAAAAABAP4AAQAAAP8AAAACAQABAP//AP8AAAD/AP8AAP//AAAA/wD/AAAAAAAA/wEAAf//Af8AAQAAAAD/AQD/AAAAAAAAAAAAAf//AQAA//8BAf8A/wD/////AP//AQAAAAEAAAEB//8AAQEAAP8CAf8AAAAB/////wEBAAAA////////AQAAAQD/AAD/AAABAQD/AAAA1tXXy8zNAAD/AAABAAAAAAAAAAAACwsLJSUiAAAAAAABAAAAAAAAAAAAAQEAAP8AAQAA/wEAAAAB/wAAAAH/AAAAAQH/AP//AP8AAAABAAH+AAEA/wH/AAABAAABAQABAP//Af//AP4AAAAAAAEBAAEBAAEBAAAA/wABAAAAAAABAP8BAP8AAf8AAP8AAAH//wABAAABAgEAAAAB/wEBAAAA/wD///8AAP8A/wAAAAAAAAAB/wD/AQABAAAAAAABAAEAAP8AAAH/////AAAAAAABAAAAAAAAAP8A//8CAP8AAAABAAEAAAD+AAH+AQD//////wAAAAEAAv8A/wAAAQD//wH/AQAAAQABAAAAAAAA//8BAf8A/wD/AP8AAP8AAf//AQAAAAAAAAAB/wD/AP8BAQEBAQAAAAAAAP8AAQABAAD/AgEA/wEB/wAA/wAAAP//AAEA/wAA/wH+AAAAAP//AAEAAP8A//8AAAH/AAABAAABAgEBAQAB/wD/AgAA/wEAAQAAAP8AAgEAAgIBAQABAAAAAP8AAP8BAgAAAP8AAf8AAAIBAP8A/////wEB/wD/Af8BAAEBAQABAAAAAgEBAQAAAAEAAAH/AAAAAP8A/wD/AAD/AAD/AAAA///+AgAAAP//AAH/AAD/AAD/AAEBAQH//wEA/wAAAgEB/wH//wD+//8AAAAAAAAA//8AAAABAAABAQAAAP//AQAAAAD/AP8A/wAAAAAA/wAB/gABAAEBAQICAAAAAAAA//4AAQEA/wABAQAA/wEAzM7PAAABAAAAAAAAAAAAFxb/NTAA/wEA//8C/wACAP//AP8A/v8AAP8A//8AAQEAAAH9AgL/Af//AQEBAgD/AQH+/wD+AP/8AQD9/wH+///9AAD+AP/9AP/9AAD9/wD+AQD9Av/9AQD+AP/8AP/9///9AP/9AQD9AQD8AAD+Av/9Af/8AP/8AAH9/wD+/wH7AAD7AAD8/wD8AP/8AQD8AAD8AAD8AQD9//79Af/9AP/8AgD+AQD9AQD8AAH9AAD8AQD9AAD+Av/9AQD8AP7+AAH9/wD/AAD+/wH+///9AAH9Af/8/wD8/wD9Af79AAD8AP/9AQD/AAD9AP7+AP7+Af/+/wD9AgD9AAD/AAD9AAL+AQD8AAH9AQD/AQD+AQH9AAH9AP/9Af//AAD//wEA////AP/9/gD9AAD9AP7+AP3+AQH/AQD//wD/AP4AAAABAf4A/wD/AP/+/wD/AAIBAAD/AQD/AQD/AAD/AAAA/wD/AAAAAAD/AAD/Af///v/+AP//AP//AAAA//8AAQABAf8A//8A/wAAAAEAAAABAP//AQAAAAAAAQAAAP8A/gACAAAC//8A/wAA/wAAAQAACw0AJyQBAAAAAAD/AAAAAAABAAD//wEAAAEBAP4BAAD+AAD9AAAAAQAAVllZDxEQ/v//AAEAAQECAQAAAQAAAAAAAQAAAP///wEBAf8AAf8AAQIBwb+/uLa3AAAAAAD/CSE0AQYI/v8C//7///8A//8A//7///7//wAA//////////7//////gD+/wD///7//wD////+//7+///////+/f3/AP7//////wD/AP////4A/f8A/wAB//7//wD///8A/v///v///v7+/QD//////v///f7+/v/8/v///////v7+///9DhYeAAABAAAAAAD/AAD/1tbW/wABAQABAAD///8AAAAAAQD/AAAAAQABAQEB/wD//wABAAD/AQD/AAH///8AAf8BAAEAAAAB/wABAAEBAP///wD/Af8A/wAAAAAAAQEAAAAAAQAA////AAD/AQAB/wD/AP8A/wEAAAABAf8A/wABAP8AAQAAAAEA/wAAAP8AAAEBAAD/AgECAAABAAD/AAEAAQEAAAAB/wH/AAAAAAAAAAAAAAAAAf8BAAAAAAEA/wAAAAABAf8BAAAA//8A/wABAAEAAAAA//8AAAAA/////wEAAf//Af8AAgEAAAH//wEBAgIAAP8AAAEBAAABAAAAAAEBAAAAAQEAAP8AAf//AObm5vr5+gAAAgAA/wAA/wAA/wAAAe/v7rCvtP////8A/wEA/wEAAf8AAQAAAQEBAAAAAAEAAQEA/wAAAAAAAQABAP8AAP8BAAABAAD//wAAAQD/AQAAAv///////wABAAEBAgABAAEBAQEAAQAA/wAB/wD//wEBAQABAP8AAAABAAABAAEBAP8BAQEAAAAAAQEBAAEAAP//AP8AAAEAAAABAQEBAAABAAAAAAABAQAAAQD/AAIBAf8B/wAB/wAAAAAAAAABAAEAAP8AAP8AAf//AAABAAAAAAD/AAEB/wABAAEBAAAAAP8AAQEAAQAAAgEAAAAAAQAAAAABAAH/AAAAAAAAAP8BAQD/AAABAf8AAAEB/wAA//8AAQABAP8AAP8AAQAAAAEAAQD/AAAAAQAB////AP4A/wAA/v//AAAAAAABAQABAAD+AQAAAAEAAQIBAP///wAA/wAAAf8AAAAAAAH/AP8BAAABAAD/AAD/AP8AAP4B/gD/AAH/AAAAAQEAAAD/AP8CAP8BAP7//wAA/wEBAAACAAABAAD//wAAAQAAAQD/AAAB//////8A/v8AAP8AAAD/AAAAAQAAAAD///8BAQAAAQD/AAAAAAABAQAAAAD/AQAAAAABAAEBAf4AAAAAAQAAAv8AAf8AAAAAAP8AAQH/AAEAAAD/AAH/AAEAAAEAAQD/AAAAAQEBAAAA/wAAAAAAAP8AAP8AAAAAAQEAAAEAAQAAAAEA/wEAAP8A//7//wABAf//AP8BAP/+AQAAAAABAQD/ANXT1QEAAQAAAAD/AQAAAS4o/x0dAP8AAf8AA///Af8BAAH/AAIAAP8A/wEB//8A/f///wD+/gAA/wH//v8A/gD//gAA/gAA//8B/f///gEB/wEA/gH//v8A/gD//gD//QAA/v8A/wH/AAAA/wAB/wD//v8A/wAA/QAA/gAA/gAB/gD//AEB/QL//QAB/AL//gEB/wD//QEA/f8B+wD/+wD+/QEA/AAB/AIB/QAB/QEC/wAB/wAA/wAB/gD//AEA/AD//QEA/QAA/QD//QAB/QD//QEA/AD//AD+/gH//gD//f8B/QD//wH//v8B/v8A/gD//QAA/f///gD//QEB/QD//QH//gD//wAA//8A/wD+/v7//gD//////gAA//7+/wH+/wEA/wAB/gAB/QD//wAA/wEBAQIAAAD/AQABAAEB/wH//gAA/wEA//8B/wD//v4AAAAAAAD/AQD/AAD9/v8A/wD/////AP//AAD//wEA//8A/wH//wEAAP8AAAH/AAH/Af8AAQAAAAEA/wD/AP8A//8A/wAAAQD/AAAAAQAAAv8AAAEAAQD/AP8AAAD/////AgABAgEBAAECAP8BAQH/ATcy/wABAQAAAQAAAAAA/wAA/////gL//gAB/gAA/gAAAgAA/zo/QFBSUwH/AAEAAQH/AP8A/////wD///8AAP8A//8AAQL/AAABAP8CAfXz9JqZmwAA/wAA/wEPHAgeLgD/AQAA//7/Af//AP7//wAA//4A///9//8AAP8A//7///7//v/+AP7+//7//wD+///+AP8A/wH//v4A//7+//3//v7+/v7///8A//7//v///v////8AAP/+AP7//wD//wD+//8A/v/////+/f7//wD/AP//Af3//v/+/v///wABAg4XHgAAAQAAAAAA/wAAAd/f4Pj5+P8AAP8AAAEBAAABAAD/Af////////4AAAEAAQEBAAD/AP8AAAEAAgAB/wAB//8A/wEAAAAAAAAA/wABAAAAAQABAAD/AAAAAf8AAQAAAAD+AQEBAAEAAAD/AAEAAAABAAAAAP8B//8AAAAAAQAA//8AAP//AAAAAP8AAAAAAAAAAf7//wAB/wEAAgABAf//AAAA////AQAAAAAAAQEAAAD/AAAA/wIAAAD//wAA/wAAAAAA/wABAQAAAQAAAAAAAAAAAAIAAQEAAAIBAQEBAAAAAf7/AAL/AAD/AQAAAP//AAABAAAA/wAB/wEAAQD/AAAAAP//AAABAP8BAAD//f8A//0AAP8AAAAAAAEAAP8AAP8AAP+NjI56en3h4OH//wAAAf//AP//AAAAAAEAAAH/AAD/AQEBAQABAP8B/wAAAAABAAEBAAAAAAEB/wAAAP8BAAD/AAAAAP8BAP8BAAD/AAD/AP//Af4BAAAAAAAAAAEA//8BAAD/AP8AAP8AAAAAAAEAAAD/AQEB/wAAAAD/AP8BAQAB/wD/AAABAP/+/wABAAAAAAEA/////wAAAf////8BAAH/AAEBAAAB//8B//8A/wAAAAD/AP8BAP8AAAABAQEAAgD+/wABAAH//////wABAAEAAAEAAQAAAQABAP8A/gAAAAD/AQAAAAH/AAAA////AQD///8BAAD+AAEAAQEBAAAAAAAAAP8BAv/+AAAA/wAAAAEBAQD/AAEAAAAA/wH+AAACAQH/AAAA/wD+/wD/AP4BAAAAAP///gEAAQAAAP8BAAABAAD/AQD/AAABAAAB/wAAAAAAAQABAQAA/wAAAAAAAAH/AP8AAAD/AgEB/wAA/wEAAP8AAAD//gAA/wAA/wD/AAD/AAD/AQD/AP8A/wABAQECAAEBAP8CAAACAP8AAP4AAAD/AAEA/wAAAP8AAQABAAAAAAAB/wD/AP8AAAEAAAEAAAEAAAEAAP//AP4AAP8B/wH//wAAAQD/AQAAAAAAAgEAAAAAAAH/AQAAAgAA/wAAAAAAAAABAP8AAAAC/wAAAP8AAQD+AAH/AP//AQAA/wEA/wABAAABAP////8BAQABAAEAAf8AAf8A///z8/PQ0dD/AAIAAQIAAAEBAAAoJP8AAAABAQEBAQMB/wEB/wEAAAAAAP8B/wAA//4BAAAAAP//AP8AAP4AAv4BAQABAAAB//8BAf4BAP0BAPwA//z/AP3/Af4BAf4BAfwAAPwAAP0BAP0BAPoCAfwA//sBAfoAAPv/APwAAPwAAPwA//4BAAAAAP7+Af8BAP8AAPwA/v0AAf3///sC//wA//0AAfwAAf0A//0AAP0A//wA//0A//0A//sAAPwBAf3///0AAv0A//0AAP0BAf4AAP4BAP4BAP4B//4AAP0BAf0BAPwB//z/APz/AP4BAP0B//0A/wD/AP4AAf4BAf8AAP8AAP8AAP8AAAAA//4B//4A//4BAP4AAP4CAf3///4CAAD/AP////4CAP0B/v8B//4B//7/AP4AAAABAv4A/v0AAP//////Af8AAP8AAP8AAf8AAP4B/wD/Af8A//4AAP8B/wAAAAABAP8BAf////8B/wAAAP8A/wD//v8A/wEAAAD/AAAB//8A////AAEAAf8A/wABAP8B/v8AAQL/AAH/AQABAAH//////wH/AP8BAQIAAQIA/wIAAAEA/gABAQD/AQAzL/4LCgAAAP8AAAAAAAAA//4BAPz+/foA/vsAAP8AAPwZGxuChYUQEhAA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AAD+/wEBAAEAAAH/AP8AAQEAAAD/AAEBAP8AAAEBAAACAAAAAf8AAAAB/wAAAAAAAP///wD///8AAAABAAEA/wAAAAD///8BAQABAQD/AQD/AAAAAAD/AAAAAQABAf8BAQEBAf8BAP8AAQACAAEA//8A//8A/v8AAQAAAAAAAQAB/wAAAAAAAAAA/wD///8A//8A/wAAAAAAAgAAAAAAAP8BAAABAQAAAf8BAAAAAf8AAP8BAQEA/wD/AQEBAQIBAB4dHERCQwAAAAAAAAAA/wAAAAAAAQAAAAAA/wAAAObm5pWUlElJTVBQVJaWmdzc3gD/Af8A/wAAAP8A/wD/AAEAAQAAAAEAAP8AAQAA/wAAAAAAAQEAAAEAAAEAAAABAf8BAAAAAQABAAAAAQEAAQABAQEAAQAB////AQD/AP8A/wAAAAEAAAH/AP//AQD/AP8AAAAB/wD//wAA/v8A/wAAAAEB//8B//4AAQEAAQAB/wEBAAAAAAAAAQAAAAEBAP8AAQEBAAABAQABAAEBAP8AAAEAAAEAAP8AAAAAAAEA/wEAAP8B//8AAAD//wABAQABAAAAAP4BAAEAAAEAAAAAAAABAAIBAAEBAAAA/gEB////AP8A//7+/wEAAP4AAAAAAQEAAAAAAP7/AAAAAAAA/wACAQEAAAEAAAEAAQAA/wD+AQABAAEBAAEB/wD/AAABAv8AAAABAQABAP8BAAABAAD///8B/wD///8BAAD/AAAA/wEB//8B/gEB/wD/AAEAAP8AAP//AAAAAAEBAQIA/wEAAAAA/wEA/wAAAQD/AQEAAgEAAAAA/wAA/gEA/wH/AAH//wD//wIBAAH/AAABAQEBAQAAAAEAAQAAAQD/AAEBAgAAAQABAAH//wAA//8AAAABAQEA/wAAAP8BAAAAAAAA////AAEBAQABAP///wAA//8B/wECAv4AAQABAAABAAEBAQH///8AAAAAAP8AAAAAAP8AAQABAQEAAP8CAAAAAP8BAAEA/wEAAP7/AAAAAAAA/wAAANDR0f4A/wAA/wAAAAEAAAIA/yIgAP//Af//AQD/AgD/AQH+AP///wAAAAEBAAAAAAABAAAA/wAA/wAA/v8A/v/+/AEA/QAA/gD//gAD/wEA/wH//wAB/QAA/f8A/QAAAAAA//8A/wEA/gAA/v7//gEA/wEA/gD//gAB/AAA/f8A/AAA/AEA/QEB/wD//v8A/QAA/gAB/QAA/QEA/QAA/QAA/AEB/v8B/QAB/QAA/QAB/v///v///QD+/AEA/QH+/v8A/gH+/gH//QEA/v8A/QD//gD//QD//gEB/v8B/gEB/QD+/QAA/gEB/gAB/wAA/QED//8B/v8B/AAA/wD/AAD//wH/AAABAAAB/v8B/gD+/gL//gD//QAA/wAA/v8A/gAA/AH//v8AAP8B//8A/wEA/gEA/gH//gIA/wAA/wH/AAEA/v///wH//gEAAQD//wAA/wAAAQEAAP8AAAAAAf///wAB/wAA/wAA/wEAAAEAAAAA/gAA/wEA/wEA/gABAP///v//AP8A/////wD+AQH/AQAAAAAAAAD//wEAAAEA/wD//wABAf4A/gAA/wD/AQAAAf//AP8A//8B//7/AQAAAAIB/wwOATIv/wAAAQAAAQAA/wAA/wAA/gAAAAAA/wAA/SYrLFpaWv79/P8BAP8B////AAABAf8AAP8AAAD//wEAAAAA/wAAAAH///v8+4mHit3Z1wAAAAEJEg0rRP8CBAD/AQH///4A/////v8AAQD/Af/+//8AAf8AAf8AAQAA//8BAAD+AAD/AQEAAf7/AP7+/wD/AP4A//8A/v8AAP4B/v7///7//////wD///7/AP3/AQD///4A//4AAf4B/v4AAP//AP7////+//7+//8AAP79/wD+//////3+/v///v3+/gUJDgkPFAEAAAAA/wAAAAAA/+Th4QIBAAAA/v///wAAAAEB////AAD///8BAAEAAAAAAAAAAQEAAAEA//8AAQAA//8AAP/+AAABAAD/AQEBAQAAAgH/AP//AAD+AAABAAAAAAAAAAAAAQAAAP///wAB/wD/AAEAAAAA/wD//wD//wABAAEBAQEAAAEAAAAAAQEAAP8AAAIA/wABAAABAf7/AAABAf/+/wD/AAEA//8A/wD///8A/wAAAAEBAAAAAQAB/wIA/wEBAAABAP8AAAEAAAH/AAAAAAEAAAEAAQAAAP8A/wL/AAEAAAT/AAABAQEA/wABAP7/AAEBAP8AAAAAAQH+AP8AAAEAAAAA////AQEBAABubmu6u73p6OYAAAEAAAAAAAAAAAEAAAEAAP4AAQEAAAH39va0tLO0tLMTExQ5Ozg8OzwoKCczMjAZGBkCBAP//wABAQAA/wAAAQD/AAAA/wAAAAH/AAAAAAAA/wAAAAABAQD///4AAQEAAAD//wABAQABAAEAAQD//wABAAEAAAD/AAAAAQAB/wAAAQAAAAH/AP//AQAA/wEBAAAAAAAAAAH/AAABAP//AAABAAAAAAAAAAAAAP8B/wEAAP8AAQD/AP4A/wEAAQAAAP8BAAEAAf4B/wH/AQAAAAEAAf8A/v8AAAEBAAEAAP8B/wD/AQABAQACAAAA/wD//wAAAAABAAD/AAAAAP8BAAEAAAAAAAACAQH/AAD+/wABAgEA/v8AAgAA/wABAP8AAAEAAQEA/wAAAAAAAAAAAAACAQH+AP8B/wAAAAD/AAABAAD/AP4BAAIA//7/AAEBAQAA/v8AAAAA/wAAAgEA//8AAQH/AAEBAAABAQEB///+AQAAAQAB/wABAQD//wD///8BAQAAAAAAAAL/AP4B/wD/AQD/AP//AAABAAEAAQAAAAD//wAAAAEBAAD///8AAQEAAAAA//8AAQAAAAEBAP//AAD+//8AAAEB/wD/AAD//wABAAEA//8AAAEAAAABAQH///8AAQEBAAEA//8AAAABAAH+AP8CAAIA//8BAAAA/wABAAAAAAAAAAAAAP//AAABAAEB/wAAAQABAQD/AAAB/wD/AAD///8BAAH+AAECAQD/AP8BAQH/AADk5eUAAP8AAAEAAAD/AAAMDAElIv8AAf///wAAAQMBAAD+AAEAAP4BAP////0AAQIA/wL//wABAf7//wABAf8BAv///wAAAAD/AP8B//8A/wMAAP4A/wEAAAEBAAAAAgAB/wEA/wAAAQEAAf7//wAA/wABAv8BAP0B//8BAP//AP4AA/8A/gAAAP8B////AP0BAP8AAP8BAAH///4AAP7/AAAB/gAAAf4B/wAAAf7///4BAf8A//7/AP4A/v8BAf8BAAD/Af4AAP8A/v//AP8CAP//Af//AP4BAAAB////AP8BAf//////AQABAP4AAAD///8B/wAA//8AAf/+//8DAQH/AAEBAP4B/wD/AP4AAQH/AP8AAAAC/v//AP8CAAAAAAD+/wABAgEA/v8BAQH/AP8A/wAAAAAAAAAAAf8AAAH//wEA//4AAQEB//7/AAAA///6/P8EAwMBAv//AQABAP///wD/AP8BAAAAAP4A/wAA/wABAv7//wH/AP8AAP8A/wABAf8BAAEAAQAAAP8AAgAA//8AAAD/AQEA//4A/wABAP8A//4BAAH/AAAAAf//Af4BAP8AAAD//wEBAQH///4AAQAB//85NgCTnQQAAAAAAAAAAAAAAP8BAP//AAIAAAPg3NxcWVgjJSUoKScZGxwHBgcBAgIfHh4BAgIDAgAGBgYBAQIFBQQUFRWgnJ+vrKsAAP8BAAMJKEIDERb+AP8CAAH+AQACAQH/AAAA//7/AQH///8B/wD/AAAAAQD//gEAAgD+AAACAP/+/wACAAEAAAH+AQAD/////wEBAP7//wIAAf8A/wD+//8AAP4DAAAB/gD9AgID/wH+/v4A/wACAv///wH/AP/9Af8AAQD//wEEAAL////+/v4CAwL//wD///4BAP8LERjv4tYBAAD/AAECAP/d3N0A/wABAQEAAQAA/wEAAP8AAP8BAQIA/wD/AQAAAAAAAQAA/gAAAgAAAf8AAAAA/wEAAf8A/wAAAP8A/wH///8BAgEBAAEAAAAB////AQD/AAAC///+Af8B/gEAAAEAAP//AAEAAP8BAAAAAAH/AP8B//8AAQD+//8B/wEBAAAAAAH+AAAB/wD+AP8BAQEA//8BAQIAAf////8BAQEA/wAAAAEAAQD+//8BAQEAAQH/AAAA/////wEBAP//AAEAAAD//wH/AP8BAf8CAAD/AAD/AQEA/gAEAAAAAP//AAEBAAACAP////8BAAD/AAEAAf8AAAD/AQAB/wEBAQAA/wAANDQzk5SQaGdq7u3uAAD+AAABAAAAAAD/AAABAP8AAAD/AAABAAABAAH/7e3stLKztLK0AAAADw8QERESGxsZERARDhAPEBAPGhoZKCgmREREDw4OAf8A/wEAAQAAAAAAAAAAAQEC//8AAQH/AAAAAAD/AAABAP//AQEA////AAAAAQAA/wD//wEBAAAAAP8AAQEAAAABAAH//wABAP8AAAEAAgAAAP8AAAEBAAAA/wD/AP8AAAEAAAD/AAAAAQAAAAAC/wAAAQD/AAEBAQAAAP8B/wAB/wD/AP8AAAEB/wIBAQAA/wD/AQABAAAAAP8A/wAAAAD/AQEB/wABAP///wEAAP//AAABAAAA/wD/AQAB//8AAP8AAgEB/gD+AQEBAAAAAQD/AAAB/gABAv///gD/AQAAAAAAAAEB//8AAQD/AAD/AAABAAAAAAABAf//AAD//wAAAQAAAP8AAQEB/wAAAAD/AP8BAP8A/wEAAQAA/wAAAf///wEAAf8AAP8AAAAAAAAAAAEBAQD/////AAIAAgD///4BAAH/AQAA//8AAgIA//8A/wD///8BAQAAAAD//wEBAAABAQAA/////wEAAAABAQD//gABAAH/Av8B/gD//wD/AQEAAP4AAAD/AAIBAP8AAAEBAP8AAf//AAD/AAAAAAH/AP8B/wH/AgAB/gD/AgEAAP8AAAAAAP//AAEBAAABAf8AAAAA/wEAAQAAAAAAAP8AAQAA/wAAAQD/AAABAAABAgD//wEAAf8AAAD/AQAB3NvdAQABAAAA/wABAAAAJSH/IiEAAQAAAQEA/wACAAD/AAAAAAABAP//AAEAAP8A/wD+AQAA//8AAAABAQD/AP///wD+AAAAAQADAf///wD+AAABAAABAAABAP8D///+AAD//wEBAAABAP7+AAEBAQEAAQD//wD/AAH+/wAAAf//AP7+/wD+Av8BAAD+AQH+AP/+/wAAAAD/AAD9AP/+AQEAAAD/AP//AAAAAP//Af/+Af/+/wD+AQH/AAEAAAH+Af//AP/////+AAH/AgD/AAD//v8BA//+AAD/AQH///8A/wD+AAH/AAABAP7/AAEAAP7/AQH//wABAQD9AgEC/wH+//8AAP///wAAAQEAAP/+AP////8AAQEAAP8AAAEA/wD/AgECAP////8B////AQEAAf//AAAA/gEAAf4AAAD/AAAAAAAAAAD/AAAAAQH//wAABgP/AAD7AP4C/wH/AQAAAAD/AQABAAD/AP8BAAD+/wEAAP8AAAD/AAD/AP//AQAC////////AQEAAAAA//3/AQEA/wABAP/+AAEA////AgIB/v4AAAD/AQH/AAD/AP7/AgEA//8AAP8BAAD/AAEAAAAB/wAANjH/GRoA5+b/AAEAAP//AQAA/wEAAAD+AP//+vn21tPQ1tTRtK/+AP8AAQH/AP8BAAAAAAH/AAAB//8A/wAAAQABHiEg6OXo/fv6AQEBBBgpByMy//7+AgIBAAABAv8B//8AAgEAAAEA/gD/AgABAAAA//8BAQEA/f8AAv7/AQL/AP8BAv4B/gL/AAH/A/8B/QIBAv7+AAMBAP//AgACAAAA/wD///8A//4AAAH+/v8AAf0BAwQAAAAB//7//gL+AP8BAgAB//4AAQD+/QIBAv//AgEA/v/+AP4CAAABAAABDRUb/wABAAD/AAD//gAA5ebmAAAA/wD/AAABAQAA//8BAAEAAP8A/wEAAAAAAQABAP8AAAH///8AAAEAAAAA/wH/Af8AAAEB////AAAAAQIAAP8AAAD/AAEB/wAAAAAAAQAB/wD/AP8AAAEAAAD/AAAA/wD/Af8B/wD/AAD/AP8BAAEAAP8AAQH/AP/+/wABAAAAAgEA//8AAQABAP//AAEAAP//AP8B/wEBAQAAAQD+//8A/wAAAAAB///+AQACAQD//wAAAAAA/wAAAf//AAEAAQEA/wEBAAD///8A/wAAAv8A/wH/BAAAAAAAAQH/AP8A/wEAAP8BAAAAAQD//wABAAD/AAABAAEAAP///wEBAf8A/1VTUQIBAnJzeOLg3gAAAAAA/wAAAQAA/wAAAAAAAAAA/wAAAAD//wAAAQAAAQAA/wAAAPHx8PHx8ODg3gAAAAAAAAAA/wAA/wAA/2hoaJaVlAECAgH/AP8AAAAAAAAB/wAAAQAB//8AAAAA////AAEAAAEBAf//AAAB/wAAAP//AQAAAAAA/gAAAQABAf//AAEB//4AAAIA/wABAf8AAAD//wABAQD/AAABAAD/AQAA/wAAAQAA/wABAf7+//8B/wEBAAD/AAEAAAAB/wABAQAAAAEAAQAA/wD/AQEA/wEBAQAAAAABAAAAAAAAAAAAAQAAAQD//wAA/wEBAQD//v8AAf8AAAEAAAEBAQAAAAD/AAABAP8A/gAAAQAAAQAA//8AAQABAAD///8AAAEAAAAAAAEAAP//AAAAAP8AAAABAQEAAQEAAAAAAAD/AgEA/wD/AQABAf8A/gABAQD/AAEBAQD+/wABAQEBAP//AAEAAAAAAAAAAAAAAf8AAAIA////AQAB//8A/wAAAQH/AP4AAAEBAP4AAAEAAAECAP8AAAABAAH/Af8AAQEAAP8AAAD+AAACAP//AP8AAQAAAAEAAAAAAQEAAP8AAf//AQAB/wEAAAD/AQEBAAAAAAAAAAABAAD//wAB//8AAQEBAAH/Af//AQD//gEBAf8AAQIAAP///gIAAf////8BAQEA/wAAAQABAAAAAAEAAP8B//8AAQEAAP8AAQAA/wAAAAAAAAAA//8AAAH/AAABAAD/AQAAAODg4QAA//8BAAD/AAAAAR8cAQIH//7+AAH/A/8BAf8BAAD/AQD/AAEB/////wEB/gAAAgAC/gH/Af////8A/wEA/gEAAP//AQD//v8B//8B/wEAAQAAAQD/AQEA//8AAAACAQEA//7+AAIAAAAA/QEAAP///wEA//8AAAAA/v8CAAH/AAEA/v8BAAH//v//AAEA/wD+/gACAAEB/gAB/v8AAAAA/gAA/wEBAAD+/v8A//8B/gEAAP8B/wH//wD+/v8A/wAB/gEB/wD//gD//wAAAQMA/gAB/gD//v//AAAAAAEA/wD//wAAAAAB/wAA/wEAAAAAAAD//wABAQAB/gD/AAEAAP//AAEB/wD/AAH//v//AAABAf8AAAABAP8AAAD/AP8A/wEBAQH//gECAf///v8A/wAAAQL+Af8BAAAA/wAAAAAA/wD/Af8A/wL/AQAAAP8BAAEAAv8A/wEAAAAAAAH/AAAA/v8AAAAB/wH/AAL/Af4A/gEAAAAAAAACAf///wH/AAABAAD///8A/wEAAAAB/wD+/wACAAH/AQAAAAAA/wEAAQAB/wH/AAAA/wAC//4A/gEAAgEC/wD+/gABAf/9AAEA/xgWACwm/+fm/wD/AAABAf//AAD//wAAAQAA/wAA/wAAAAD/AP8AAAAAAf//AQEB////AQD//wAA/wAAAAAAAQAB/uLg3wD//wECAQD+Af/37vbcyQgbKgQOFQH/AP8AAAD/AP4AAAEBAQH/AAABAP/+AP8B/wH+AAIC/wD+AgAAAf8BAP8A/wL/AP//AP4CAQH9/gECAf7/AAEAAv///wADAQD+//8BAP3+/f8CAgT+AP4C/gD9AQACAAECAAH/AAAAAAEAAf4A/gD+AgL//f4DAAH+Av8AAAAB/gICAf//AAwXGwEA//8A/wAAAAEAAeLf4f8AAAEAAQAAAP8A/wAAAAEAAQAAAP/+/wECAP8BAf8AAAL/AQAA/wEAAf8AAAH//wEAAf///gEBAQD//wD/AAAA/wEAAP//AAEBAAAAAAAB/gAAAQAAAP//AAABAAH/AQD//gABAAEAAQEA/v8BAAD/AAAAAQAAAAABAQAAAP8AAAD/AAAA/wEAAQAAAf7//wIAAP8AAAEA/wAAAP8AAQAAAQAA/wAAAAAAAQABAP8AAP//AAEAAP8AAAAAAAD/AQACAAAAAP//AQEA/wEBAQD+/wEBAQQBAAEAAP//AAAAAf8A/wH+//8CAP8AAQIBAAAAAQD///8AAAABAQH//wAAAQAAAP9SUk4zMzCEg4mysbLr7OkAAAAAAP8AAAAAAAAAAAEAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAP8AAAAAAAAAAAIAAADT0dX/AQAA//8AAQEAAP8AAAD/AAABAAABAAAAAAEAAP8AAAD/AAAA/wAAAQAAAAABAAD/AP8BAQEA/wH+AAEBAQAAAQD/AAEBAP/+AAACAP8A/wHb293s6uv/AP/8/v78/f0BAAD/AAACAQIAAAAAAQACAQAAAAEBAQEA/wAWFxUmJiYAAP//AP8BAAH+AP4B/wD+AAADAQD/////Af8AAAEA/v4AAQL/AQEAAAD/AAAAAQL/AAAB//8AAAAA/wD/AAACAAH/AP4AAQEBAAAAAAD/AAACAAAA/wAAAAAAAAAAAQAA/wD/AAH///8BAQABAQEA/v8AAv///wEBAAD/AP8BAQEAAAD/AP8AAAAA/wAAAQAA/gD/AAEAAAD//wABAAAAAf8AAAAA/wL/AP8A////AQAAAQABAAAA/wEAAf8AAAEC/wD+AQABAAAAAP/+/gAAAQIBAf8AAAABAP/+/wABAQAAAQAAAAAAAAABAAABAP/+AAEB/wAAAQAA/wAAAf8A/wAAAQIBAf////8AAAH//wAAAAAA/wABAQEBAAAAAAD/AAAAAP8AAgEA/wAAAf7//wEBAAL+AP8BAQAAAAEAAAH/AP4AAAEAAAAAAP8A/wEBAAAAAQEB///+AAABAAH/Af8BAP8AAAL/AAABAAD/Af/k4ePV1NX//wEBAf//AAAAAP8gHQEA/gAAAQD/AgIBAAL+/gEBAQAAAf//AP8BAP//AP//AP4AAAMC////AP8AAP//AQEA//4BAQL+AP8AAAAB//wAAAMCAQH/AAD/AP8CAAL///4B//8CAQEA//8BAAAA//8BAP8AAQABAAD/AP8A//4A/wD/AP4B//4AAv4A/wAA//4AAgABAP3/////AP4AAAACAP8A//8AAP8AAf8AAP8BAP8A//4BAP////4C/wAAAf8A////AP0BAAD+AP4CAAAAAP4B//4AAAEA/wH/Af7/AAABAf4A/gIAAP4AAAABAAD//wEAAP///v8BAQD/AAAA//8CAAAAAAEAAAD+/wACAP8A/wAAAAABAAD//wEAAAAAAAAAAP4AAQH///7/AP8CAAH/AAAAAP8AAAAAAP8AAAAAAAEA//8BAAD/AQAAAP8AAP////8CAAH+//8BAv8BAAEB/wD+AQAB/gD/Af//AP8BAAAAAAAAAP///gABAAEA/wD/AAABAAAC/wAAAQH//v4BAQAA/gD/AAEBAP///v4AAP4A//8AAf7///4B/wABAAAAAAAA/gD/AQEB/gAAAQH/AP8FBAArKf27wAIAAAAA/wAAAP4AAAEAAAAAAAAAAAEAAP8AAP8AAAAAAAABAAH//wABAP7/AAABAAD/AAACAAD//wEAAP8AAAD+/gABAP/88OL80OH61AwGHjAGJDwDERsCAQECAQH/////AgAA/wABAP8AAAEBAQAA/gD/Af8B//8AAQH/AAH9/v8BAgAB//0AAgL+AAEC/gD/Av7+AQIC///9AAACAAADAAL////9Af4C/wEBAQH+/gIDAAD/AQAAAgD+AP8BAQAAAAD///8C/v8BAv8B/wD+AP///gIBAAAJDhX/AAEBAAH/AAH/AP3g5OTr6+oWFRb/AQEBAQD///////8AAQECAAD//wEAAAABAf/+AQAB/wH///8BAQH/AQD///8AAQEAAP8BAAH/AAEAAf4AAAEA/wD//wABAAD+AQEAAAAC/wEAAAAA/gAAAgABAQAA/wAAAP//AAD//wABAAAAAP8AAAAA/wH/Af///wAAAAEBAf/+/wABAP8BAAD/AQAA/////wABAAEAAP8AAP4AAAAAAAAAAAEA//8AAQABAAEAAAACAQD/AAEAAP8A/gABAQAAAAEBAAEA////AQEBAQAEAAD/AAAA/wABAgAA/wEBAv//AAACAAAAAAD///8BAAEAAf8BAP//AQEA/wAB//8AAAAAHx4fm5uVb29rpqaot7a30tLQAAAB/wAAAAAAAQAB/wD+AAABAAAAAAAAAAAAAAABAAEAAP8AAAAAAAABAAAAAAAAAQABXl9dAgEB/wABAQAAAAAAAAAAAP8AAAD/AAEAAAD//wAA/wEBAf///wEAAf8AAAABAAEAAQEA////AAAAAQD+1NLX7/Dw5eXm19fX8vP33t3e7+/s3Nvf7u7u/P3+/wEAAP//////AAD/AQAAAAD/////AQD//wEBAP8AAQD/ExQVICEeBgUHFRUUGhoY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/wD/AAAAAAAAAAAAAQAA/wD/AAABAP8A/wEAAAIAAP8BAQD//wEBAf////8AAAABAAEAAP8AAAEAAAAAAQAB/////wECAP//AAEAAP/+/wABAAEBAf7//wEAAAD/AAAAAP8A/wEAAQABAAD//wABAAD/AAABAAAAAAAAAf8BAAD/Af8AAAEBAAD+AAAB//8B/wH/AQIAAAAAAAD/AAACAgD/AP4A/wD/AAAA/wIAAP8AAP8AAQAA/wABAAEBAQH/AP8AAP8AABUS//8CAQEAAAAA/wAA/wAA/f8AAwAA/gAAAQH/AgD//QABAgD/AQEAAQEBAQAC///+/wAAAgEBAAAAAP8A/gEAAgH//gABAgD/Af//AQECAAEAAf8A/wABAQH//v8A/wEA/wAA/wAAAAAAAAAA//8B/wIAAP8A/wD/AAABAAD+/QAAAAAA/wAA/wEB/gH+/wAA/QEAAQAA/wEAAQAA/wEBAAAA/v//AP//Av8B/gH9Af8B/wEAAQAA/wAAAAD+AAABAAH+AQD/AQAAAP8A/wH/////AQD+/wABAgAAAP//AgEA/wD/AQH/AAAAAQL/AAAAAAD+AQABAAAB///+/wEAAQAAAP8AAQH//v//AQAAAAAAAQEA/wAAAQH/AAABAgD//f8AAQD/AAABAAD8/wEDAQD/Af8BAAD/AAEA/wD/Af8BAAABAAEAAAD/Af8AAQACAAH+/gACAAD+AQD//wEAAQD//wD/AP4AAAEBAAD/AQAAAAECAP/+/wEAAP/+AAEAAAABAAD+AAAA/wABAAH/AP7/AP//AgIAAf/+/wsIAPUC/wD9///9AQH8/wD9AP//AQEA/wECAP/+Af8AAAAA/wAAAQAAAQAA//8AAAAAAAAB/wAAAAAAAf/+AQABAQH/AAAAAQD/Af8B/wABAAH/AAABAf8B/gH/AgD/AQABAQAB/wD+Af//AQD//gPw7QD7+f4UGf4ICwABAQAAAv/+B/wCFQMGAAEB/wD//QH++DcnBIVXCm2g9/r9/vrn0/fYGg0xS/8CAAAA/////wEBAAD/AP8BAQH/AP8CAf7//wIBAAAAAAD/AQD//wD//v8AAv7/AAH//wABAAIB/wD/AP7+AQEB/wEBAf7/AQEA/gL/AgADAQAA////AP8BAAECAwABAwD/+wEAAQAAAP38/fz8/AgHCP4AAAEAAAD/AAABAQH//wAAAgEA/wD/AQAA//7/AQAA/wIAAQAA/gAAAQAAAP/+/gACAQAAAAD/AAAAAP8B/wH///8AAAEAAQEBAQAB/wH/AP8AAAAAAQD///8AAAH+AAACAAEA////AQEAAf8AAAEAAgABAAH//wABAQAAAQEA/wAAAP8AAAEBAP//AAAA//8AAQAA//8B/wH/AQD/AAEBAP///v8BAQAAAgEA/wEAAP8AAAH/AP8AAP///wAB/wEBAQABAAEA/gEAAgT/Af8A//8AAAEBAAD/AAAAAAAAAAAAAAH/AAACAAAAAgD/AAAB//8AAQAAAQAB/wEAAQD//wAAAQAAAAAB/wEAAf//AAAA/wAAAQH/AAAAAADw7vGdn5yPjpLm5uYAAAEAAP8AAAEAAAEAAQECAQATFhYzNjczNzYSEhICAQMJCggQEBANDQ4JCggEBAP+/v7Iycq7tLr5+PgAAQICAf///gABAQMAAAAAAAD/AQAA/wAAAQAB/wH/AP//AAEBAQAAAgEB/v8BAAD/AAECAQAA/wD/AAECAAD/AQD/AAEBAQAAAAEA/wABAgAB/wL/Af8BAAEAAf4CAAL//wAC/wEAAQEAAwAA/wD/AQADBgQJEAsIEgsCBAT9/gACAQD/AAAAAAAA//8A/////v4A/v/9+/wCAP8mJSQ/PTskJCTb2dyyrLHd3d0BAQAAAAH/Af8AAAEA//8AAAECAAH+//8BAQD09vempqmysbJnZ2Vwb24bHRkAAAIAAP8AAQAAAAACAAH/AAAB//8BAQAA//8BAQD/AAL/AAEBAP8AAQH/AAAAAP8A/wAAAAAAAAAAAQAA//8B/wAAAAEAAP8AAAAAAP8BAP8AAf//AAIBAQAA/wD/AAD//wACAQH//gABAgEA/v//AQD+AP8BAAEAAQAA/v8AAQD/AAEAAAABAQD+AAABAP8A///+AAABAQABAAAA/wD//wABAQEAAQAA/wD/Af8B/wAAAQAAAAEA////AQEA/gABAQAAAQD+AAABAAAAAQAB/wAAAAAAAAAAAQD/AP8A/wD/AAEB/wEAAP4BAAH/AAAAAAABAQD//wAA/v8BAAH/Av8A/wECAQEQDv8AAAAAAQAAAP/+Af8B/v8BAQAAAP//AP8AAPwAAQL/AP8AAQP/AAAA//4BAAMAAf8AAP//AP8A/wEAAAABAAAAAf//AP8BAP4BAQIA/gD/AgAA/wH//wACAP8BAQD///4AAAAB//7/Af8AAQAB/wH///4AAAABAP3///8AAP8BAAAAAf8A//8B//4AAP8AAP8A//4AAQAA//4AAAAA/wABAP8A/wABAP7/////AQABAAAAAP8A/wAAAAEBAAEB/gD+AAAB/wAA/wAB/wD/AAIB/gABAAL//v8BAAAA/wEAAAEA/wEAAQAB////AAEA/v8AAf8A/gEBAAH/AP///wABAAEC////AQIAAP8AAAH//wAAAAECAQAA/wD///3/AAEAAQAB/wH//v8BAAEA/QEBAQEAAAEAAAAB/v8BAv7+/gD/AgEBAP8BAAEA/wD//v7/AQIB/f8B////AAIBAP8AAQL//v4BAAEAAQMCAP4A/wAA//8BAAH//wAB/wAAAP8AAQECAAD+AAEA/gD/AAABAAAAAP8A/v8B/wEA/wEC/AAA/v4A/AEA/QD//wAA///+AAAAAAAAAP8AAAABAAL/AAAAAP///wEBAQEA/gABAQEAAAD/AQABAQD//v8AAgEBAf/+//8C/wH/AAH/AAABAAAAAQL/AQABAP8A/v8AAQAAAQEA/wAB//4AAAIC9vQA7Ob/DxT/DBEBAf8AAQEBAAb8ARUDBP4CBf4A/f4AAflkQgbh6v6Gs/gAAAD12cMFFiIIHCoBAQD/Af8AAAL/AP8B/f4AAgL//wABAAEAAQD/AAD+AP8C//8A/gL/Av7//wIAAQD/AP///v/+AQEBAP//AAD///0BAAIAAAL+Av8C/gAAAQD//wAAAQD/AAEBAgH//QD/AP4AAAH+//79/v/+//8CAQL/Af8AAP///wAAAQEBAP8A/wEAAP8AAAABAf8A/wH+//4BAQEBAAD/AAEAAgAA//8AAQEAAAD//wABAAABAAL/AP8AAAAAAQAA/wH/AAAAAP8A////AP8BAAEBAgD//wD//wAAAAD+AQEBAP////8AAQACAQH+//8AAQABAAH/AP8AAAH+/v8BAQD/AAABAP//AAAAAAEAAAEAAP7//wEBAQH/AAEAAP//AP///wEBAQAB/wAAAQAAAAL//wD/Af8B/wAAAAAAAAAEAP8B/wAAAgEB////AAAAAAABAQD/////AQH//wABAP//AQEBAAAA/wAAAAAB/wEAAP8AAQEAAAD/AAABAAD/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AAEA/v4AAAAAAQL//wH/AAAAAAD/AAAA/wD/AQAAAQEB/wAAAQAAAQAAAAAA/wABAAH/AAABAAD/AAAA/gD/AAABCwwL/wAAAAEA/wAA/gAA/PkA/wH/AP4B//4BAP8AAf/+Af7/AP8A/wH/AP7/AQD/Af8BAP//AQD//wAAAQD/AAEAAgD/////AQAAAf///wEAAQAAAP//Af8AAf8AAAD/AP//////////AP4AAAD/Af7/AAAAAP//AP//AP4BAP4CAv8BAAABAf4AAP8AAQAAAP4AAP7/Af8BAAAB/wABAP4AAP8B//8BAP8CAP//Af8AAP8CAf4AAP4BAP4AAf8AAf4BAf4CAP0BAP4BAf//Af7/AP8B//8B//0C//4BAf8BAP8B//8AAP8AAP4A//8B/v4CAP0B//4A/wAA//7+//8B//4B//8A/wAA/f7//v4A//7//v4A/v4B//0B/v///f8A/f////4B//7//f4A/v8B//0B////AP8A//0A//0B//8A//0B/gABAAAC//wCAP4B//0B/v3/AP8A//3//v4A/v4BAP8A/v//AP8B//8A/v0B/v4AAP8BAP8AAP0B//8B/v4BAP////4B//8AAf4B//4BAf0AAAAB//4CAP4A/v7///8A/wACAP//AP8A//7//wAAAP///wD+AAD/AP/+///+//7+AAD/AgAAAAH/+v8AeaYEus0AAP8BAP8BLBwIeEcEAf8BAAACAAAAAP8BAP8BAAAAAAABAP8F/P8J+/4I/gECAAACAAABAf4AAAD/AQEAAQAA/wAA/wABAAAA/wEBAAAA/wAAAAAAAAD/AAAA////AAEA//8BAAEAAAEBAf39APn5APr4AvfuAff0AP/+Af//7/kB//3/AAD/AQQGAAL//wAAAAEA/wL//wD+/wABAP8A/wIAAQAA/wD+AAD/AP/9/wD//v/+/wEB/wAAAf4AAQD//v///v/+/wD//v7+//4A/wD+/fLuAP76AAABAAAAAAABExMTBgYH/gD+AAAA////AAD//wAAAAD/AP//AQAAAP8AAAAAAAAA/wD/AQAAAQABAQAAAAABAAABAAD/AP8AAAAA/wAAAf8BAf//AQH//wAAAQEA/wD//wD///8A/////wAAAQAA/gEAAQABAQAAAAACAAEBAP//AAEBAQD/AAD+/wAB/wIBAQAAAAAB////AAAB/wAAAP8BAP8A/wAAAQAAAAAAAAH//wAAAQAB//8AAf8AAv8AAAD/AQD/Af8AAP//AQAAAQAA/gD/AQABAAEA/wEAAf8BAgH//wABAQD/AAH/AZSTlZaUlgAA/gAA/wAAAAAAAQABAwABAgACAgEAAf8AAAAA/wD/AAEB//8A/////f//AAD//g4RDS4yLgIBATQyMTw6Nw8ODQMDAgQDBAMDBAICAgMDAQEBAgIEAgQDAgIDAwQCBAQEAgQDAwIDAgMCAwQEBAMEAwIEAwQCAwIDAgIDAgEDAgMEBAIBAgICAgMDAgICAAIDAgICAQEBAQEBAQIBAQMBAQICAQICAgIBAQMBAQICAQIBAAEBAQECAAICAgEAAAIBAgABAAMCAwEBAAH+AAEAAQEBAQUHB1hYWF5dXQMBANvb3LW1suzs7P7//wABAgD/////AAD/AAH///4B//8AAAACAP7/AAD/AP4B//4A////AAEBAAEBAQAAAP/+//8B/gD/AP7+Af//AP8A/wD//wAAAf///wEAAQAA/wH/AP/+/gAAAAD//wAAAAAAAP4BAAEAAQAAAAcHBwEBAQMBAgkGBvX29fz9/QEBAQEBAQEAAAECAQABAAEBAQABAAIAAAMCAf7//kRERHx+fQsLDAD/AAD/AAAA//8A/66vsH18f/r4+AEAAQIAAgABAQD/AAAAAAAB/wAAAAD/AAABAAD/AAAB/wD//wEAAAAAAAH/AQH/AAAAAAEA/wEBAP4AAAD+/wD/AAEB/wAAAAAAAAEAAAEA//8AAP8BAP8AAQAA/wAA/wEBAAAAAQH/AQD/AAEB/////wD/AAABAAAAAP8AAAEAAAEAAP///wAAAQAAAgEAAP8A/wH/AQAAAP//AAAAAAEAAAAAAQAA////AP8AAAH/AAEAAA8PD////////wAAAAEAAeXpAAD/AAD//wAA/gH/AAD/AAH/AAAA/wL+AAAB////Af8AAAAB///+/wH/AQAAAf//AP///wIA/wEA//8A/gAA//8AAAAB/wAA//8A/wAAAAAA/wL+AQH+AAH/AAD//wAB/wD+/gD/AQEAAQD//wD/AP8AAAD+AQD/Af/+/wD+AAH+AQD/AgD+AAH9/wP+AAD9/gD/AAH9AQD9AAH8AQH8AQD+AAD9AAH+AQH+Af/+Av/+AgD+///+AAH+AQD+AP7+/wD+/f/+AAD+AQD+Af//AP//AP/+Af/+Af7+Af7//////v7+AP/+Av78//7/Af/9AAD/////AgD/AAD/AP/+//0AAP/9Af//Af7/AP7+AP//AQD+AP//AP//AgD/AQD9AP8A///+Af//Af/////////+//8AAAD/Af3+//7/////AQD+AAH/Af/+AP8AAf//Av7+//79/wD+Af7+AP78AP8B/wD+Af/9Af7+/wD/AP79//7+///8Af//AP79AP7/AP/+AP4A///9////AP4AAP/+AAD9/wAA////AP/+/wD/AP/+AAAA/gD//v///P8A/QH//QH//gAB/wABAP4AAo2yAp27AQABAAD/AR4WB5dbCR0RAQAA/wAA/wABAQAAAQAAAAAAAv/9Bf3+CPz/Bv8AAwH/AQD/AAEAAP4B/wECAAAA/wAAAQIAAAABAAABAAD/////AP8AAAAAAP//AQAA//8AAAAAAAEAAAEAAAAAAAD//wH59wH06wD68//7+QL8/QEB/+Dy/wABAAAA/wAKCwD/Af8A/wAA/wD//wEBAAAA/v4A/wD//wAAAQAAAP8A//8AAAD+/wEAAP8A/wD//////v3/AAAAAAAAAAEA/wAA//8A/v//APr07AAAAQAAAAAAAQAAAC0xLgACAAEAAgAAAAEBAQD//wABAAAAAQABAQAAAP8A/wEAAf//AAAAAP8BAAABAAEAAP8A/gD/AQAAAAAAAP8AAAAAAAABAf8AAP8AAAEAAAD+/wEAAAAAAQECAAAAAAEAAQD/AAABAAAAAAAAAAEA/wD/AP8BAf8AAP8AAP//AQEA/wD+/v8BAAAB/wAAAAAA/wAAAP8AAf8AAgH/AAAAAQD/AAABAQAA/gAA/wECAf8A/gABAQABAP8BAAABAAABAAAAAP8AAQH/AQAAAAD/AAEA/wAB/wIAAQEAAAABAQC3triDgYP3+PcAAAAAAAEAAAEAAQMAAQEBAgIBAAEA/wD/AP8BAAH///7+/f8AAP8BAQEAAQEGBgYqLS0IBgZCQD45NzYIBwcDAgIEAwICAQICAwIBAwMBAwMCAwIEBAMDAgMDAgECAgIDAQMCAQIDAQICAwMBAgICAgECAwICAgEDAQIAAQECAgMCAAICAgICAgECAQMBAQECAQEC/wACAQECAgMBAgAAAQEAAQEBAAABAgECAQECAQIAAgIDAwICAAECAAACAwMBAQACAQL/Af8AAwECAwICAQECAQEBAQADAgRNTk08PD36/PrT19XBw8D59/j//v8AAQABAAD/////AAD/AP///v///gACAP//AP8A/wAAAAEBAP/////+/wD///4BAQAA/wD/Af8AAP8AAf8A/wABAAH+/wAAAAD+/gD/AP//Af8AAgEBAf/+AQAAAAAAAAAAAP////4A//8EAwQCAgICAgEHBwf5+vj+/vwBAQEBAQABAP//AAECAAABAP8CAAIAAQAAAAAAAAH+/v1ISEh2eXgICAkAAf8A/wEAAQL//wCQkpKbm50AAAD+AAAA/wABAQH/AAEBAAEA/wABAQEAAAAAAQEB/wIAAAH//wABAAAAAP//AgABAAAA/wAA/wAB//8BAgEAAAD/AAEBAQAAAP//AAAA/wEAAAEAAAABAAEBAAEAAAEA/wABAP//AAD//wD/AQAAAQAAAQAA////AQABAAAA/wD/AAACAQL/////AP8AAAEBAAEAAP8A/wABAAABAAAA/gAAAAABAQEBAAEAAAEAAQD/AAAQERD/AP8BAAEBAAAAAP/m6gABAQAAAAAA/wD/AAABAAD///8A////AP4A//8AAAAA/wEB//8BAAAA//8AAP7///8AAAD/AP///wAB/wAAAAAA//8AAAABAP8BAP//AP///wAAAP//AAAAAQABAQIA/QAA/wIA/wD+/wEA/gEAAAEA/wAB/QL//gAA/wIA/gEA/wAB/gAA/gAA/v8A/v8BAAEA/QAB/gEA/AIA/wAA/wAA/QEA/wIA/v8A/gAA/f///QD//QD//gD//QD//QAB/gD//gIB/gD//////QAA/AAA/QAA/wH//v8A/wD//AAA/gH//wD+/wD/AAL//gH//gH+/QH+/QD9/gD+/wD+AAIA/gL+AAD+/QD//v///v/+///+/wD9/wD//v/9/gD+AAD+/QD+AP/9/f///gH//wH//gL9/f/+/f8A/gH//QL//gD+AAD+///+/wD//QD+/f/+/wD+/gL+/QD//wH/AAD+/QH+/wD+/wD9/gL8/f/+/gD//////v/9/v/+AAD9/gD+/gD+/QH9/wD+/v/+/f/+/wH+/wD//QD+/gD/////AP//AP7//f3+/v0A//8B//z+APsAAf8BAP/2+QGAqQODqQT8/AAA/wIdFQeiYgs6JAMA/wEA/wIAAAEA/wL/AP8AAAAA/wP8AAf7/wb/AAEAAAEAAAAAAAD/Af8DAP8A/v8BAP/////+/wABAAD/AAH/AAIAAAAA/wEAAAAA/wD/AP8BAAIAAAAA//////8A//8A//8A+vf/+fYB/vwB/fsA/v8A/v/c7f4A/wAAAAECCQ3/AQAAAAD/AAAAAQD/AQAAAAAAAQAAAQD+AP//AP//AAD/AP//Av///wD+//4AAP8AAQD/AP/+AP/////+////AAD/AQH+/wD79O8AAP8AAAABAAEAAAEUExMAAAABAf///wAB/wAAAQEA/wD/AQAAAAAAAAAAAAH/AQEAAAABAAD///4A/wD/AAABAAEAAv8BAAEAAAAB////AP8AAP8AAAEA/wH/AP8AAQAAAAABAQD//gABAQH/Af8BAQAAAAEA//8AAP8AAAD/AAAAAAABAAAB/wEAAAAAAAABAQEAAP///wABAAABAAEAAQABAP8A//8AAAAA//4BAAH//gABAQEAAAD///8AAAH//wAA/wD///8AAP8AAAEAAf8BAP8AAv7/AP8AAQH/AAAAAAACAAD/AQAAt7e6Wlte7O7uAQAAAAAAAAEBAAABAAABAQIDAQAC/wEA/wEAAQAB/wEAAQICAQEAAP//AQABAv8AHyIjFBYUPT49MS8sBwUEAwQBAgMDAQIDAwMCAgECBAICBAMCAwECAgIDAwICAgMCAgICAwIDAwICBAMDBAIBAwICAgIBAwACAQIBAgIBAgEBAgABAgEAAgIAAAEBAQEAAQEBAAEBAQIBAQABAgEBAQEBAwICAQABAgICAQEBAAEBAQEAAgEBAAEAAgMCAgECAgEAAQICAQEBAwECAv8AAQAAAgIBAQEAAQACAAEBBAQFWFpZHRwd+vj4ycnI2tra///9AP8A/wD/AAD//QD/AP7/AAABAP8A//////7//wAAAP///wD///8AAP///wEB/wD+AAAAAQAA/wD//////////wAAAQD//v8AAAH//wAAAP8AAP///wABAQAAAP8A/wABAAABAAAA/v8AAgMCAwMDAAH/BwYF+Pn5+vr7AAEBAAEBAAICAgEAAAABAAEAAf8AAQABAP8AAQAAAQIC/v7/U1RTaGlpAQEDAAEAAP/+AP///v7/hoaJyMjMAAD/AAH//wAAAP//Af//AAEBAAD/AP8B//8A/gEAAAD/AAEBAP8BAQEA//8AAAAB/wAAAAD/AQEAAP8AAQAAAAAB//8AAAAAAAAAAAEBAf///wAA/wEAAP//AAEA/wAAAAABAQABAQEAAP8BAQD/AAAAAQECAP8BAP8AAAAAAf///wD/AQIAAgEAAAD/AAD/AAAAAAH/AQAA/wABAAEAAf8AAAD////+///+AQAAAAAADg0OAQAAAAAA/wAA/gAA7PAAAP8AAP4BAQABAQAA////AQEAAQD/Af8AAP//AAD/AAH///8A//8BAQEA//8AAAD/AP8AAP8BAQEA/wAAAAAB/wABAP8CAAABAP8BAf4BAv8C//8BAP//AP4AAf//AAABAf8AAf8BAv4AAQEAAv4AAf4B/wD/AP8AAf7///4AAP8AAf8AAf7/AP8CAP8C//0CAP4BAf4AAf//Af0BAP0AAP//Af3///7///4AAP4AAP4A//4BAP4BAP4A//4B//4C/v3///4CAP4A//8A//8A/v8B/v7///7+/v7//wAB/P7//v8A//4A/v4A/P8B/QAA/P4C/v8A/v0A//0C/v3//v7//v////8A/f4B/v8B/v0B//4B//7//f8B/v4A//4B//8A//wB//4B/v8B/v0A/f4A//4C/v4B/v4A/f7//f4A/f4A/v4A//0B/v8A/gAA/v4B/f3//f7//v0A/v4A/v7///8A/v8A/v7+/v/+//////7//gEAAP0BAP0CAP8C/f4A/v4B/v4A/v4A//4B/v0A//0A/v3+///+/v3//v7+/v79/v//Af3+Af/7AAH8AgH/AAL+9/wBf6kAg6oE9/j/AQABCwkEjlEJPyMCAf4AAAICAAEBAAACAAABAQADAAAE/P8H/P8H/v8BAAIBAAEAAAAAAAAAAAD//wABAAAA//4BAQEBAAEB/wABAAAAAQD/AP//AQEBAP8AAQAAAAAA/wD/AP8AAAAAAQEAAAEAAQEA//z8//35/v35APv7APz+//wA4PABAAABAAQHAQcJAAEB/wIBAAIB/wH//wIAAAEAAAEA/wAAAAD+/wAAAAEAAAEA/f//AAH+AQAA/gEA//8A////AP4A/wAA///+/gAAAAAAAAD++O7oAQEBAQEBAAEBAQEAHh4fAP//AAABAgEAAAAA////AAAAAgAAAAAA/wAAAQD/////AQEA/wD//wEBAAAAAAAA//8A//8A//8AAAD//wAAAf8A/wAAAQAAAQEAAQAAAP//AAAAAAAAAAEA////AP8AAQAAAP/+AQEAAAAAAAD/AQAAAQAA/wD//wEAAAEA/wAA/wEAAQABAQD//////wD/AAAA/wEAAAAA/wD//wIBAAAAAAD///4A/wAAAf8AAQAAAQAAAAABAQAA/wABAAD/AAABAQABAP4BAQD/////AQAB/wAAAv8AAc7O0HN0dvHx8gEBAf8AAQAAAQD/AAABAQECAgAAAQABAQEAAgAAAAAA/wD9///+//8AAAICAQEBAQkKCCsxLT9APzAvLgQEAwIEAwIBAgICAQMCAQECAgQDAgMDAgMBAgIEAgICAwMDAgUDAwMEAgMDAgMDAwIDAQIDBAICAgICAwIDAQIBAwICAgMCAQIC/wECAQABAgIBAQECAgIAAQMBAQECAgMDAQACAQEBAQEDAAICAgECAQIAAgIBAgECAQEBAQMBAQL/AQADAQEBAQEAAAECAAAC/wEDAgECAQABAQEBAgAB/wEBAAEAAhsbHEtMTQEEA+rr6sTFwfLw8f///v////4A/wD+//7//////v8B/wABAQABAAD/AP7/AP7/AAABAP8A/wD//wEAAf7///7///8AAAEAAAAAAAEA/v//AAIAAAH/AAAA/////v/////+/wEA/wD//wD+///////+/wEB/wQFBQQFBP//AAcGBfLy8/n5+gIBAQEBAQEBAQD/AAABAAEAAQEBAAABAQEBAQEAAAAAAP8AAAEAAV9hYVhYWQEAAQD/AAAAAAD//ufo6HV2du/t7gD/AAEAAAEBAQAAAAAAAP/+AAAA/wAA/wH/AAEAAf8B//8CAP8A/wIBAAAA/wL/AP8AAQAAAAAA//8AAf///wEAAAABAAAAAf4A/wABAAEAAAH///8BAf//AQEAAAAA/wAB//8AAAAAAQAAAQD/AAAA/gEA/wAB/wAAAQAAAQAAAP///wAAAAD///8AAP8CAAABAf4BAAAA/wAAAf8BAAAAAQECAgEBAv8AAf8A/xgYGAAAAQAAAAAA/wAAAersAOfqAAABAP//////AAAAAQH+/wAA/wD//wEAAP///wD///8AAAAAAP/+/wH+AAIAAQAAAAAA/wD//wEBAQH/AAIAAf////8AAQD+AP///wD+/wEAAAL/AQH/AP/+AAEAAP8AAAD/AAAAAAD/AQD/AAEAAgD+/wAAAQAAAAH/AQD9AQEAAf/+AQH+Af/8AAD+/wD+/wD+///9AAD+AQD/AQH9AgD//wH+AAD9AP/9AAD+AAD+AQD9AAD/AAD/AAD+AAH+Av79/v/9AAD+Af3+Af/+AP/9AP8AAv7///3+//7+//7+//7/Af3+AP//AP3+Af3///3+AP3/AP3/AP3+Afz9AP79AP3+AP3///7/Af7/APz+//z/Af39/v7///z/APz+Av3+//4A//7+AP39AP7+//7+///+//7+//3+AP3/AP3+//3+AP7/AP3+AP/9AP//Af8AAf7/Av3///79AP79Af3+AP79AP7/AP7+Av7/Af//Af3+AP4A//3+//z9//7+AP4A//79AAD+//7+//7+//7/AP0A///9/v7+/f79///9AAD//wAA+wAC/AH//QAB//f6/3qiAY2wAwD//gD/AQMBA3lICVIzAwABAAAAAgD/AAABAgAAAAAA//8AAvv+CPz+BgAAAQABAAH+AAAA//8AAP8AAAD/AAAA////AAABAAAA/wEA/wAA/wD///8BAQABAf///wABAP8BAAAAAQAAAAAAAP4AAQD/AQD+AP8AAAD//wH/AAH+AAH8/wD//+bu/93r/gAA/gEPFwAJB/4BAP4B//8A/wAAAP////8A/wAAAP8B/wEBAAD//wAA////AAEAAf4AAP4A/wD/AAAA/wAA/wAB/v////8AAAH/AP/+/v79/fry7f//////AP//////ASEiIQAAAf//AAD///8AAAEBAAAAAP//AP8B/wEAAAAAAQH/AP8AAAAAAQL/AQAAAf8AAAAA/wEA/wEBAAAAAQABAv8BAQAAAP8A//8A//8AAP8AAAAAAP//AAH//wABAAACAf7/AAIAAf8AAQEBAf8AAAAAAP8A/wAAAQAAAAAAAAEBAAD+AP8A//8AAgEAAQD/AQD//wH/AAAC/wD/AQD/Af8BAAEBAQEBAQEAAv8BAAAAAAAA/wD/AAAAAAIAAf8AAQD/AP7/AP4AAP8AAQEBAAAAAAEAAALk4+RnaWnX1tf/Af///wAAAAAAAAEAAAEAAQIAAQICAQEAAAEA//8AAAIAAAEAAgEA/wAA//8CAAMBAgA1Njg9OzwrKCgIBwYCAgMCAQECAwICAQIBAQEDAgACAgACAgIDAwMDAgQDAwICAgICAgIDAgICAwIBAwIDAgMCAgEEAgIDAQEDAAICAgEAAAECAQIBAQICAQECAgEBAgEDAQACAwEBAgIBAAH/AQECAAEDAAIBAAEBAQEBAAEBAgEBAQACAQEDAgABAAEBAgEBAAEBAQIBAgECAQMCAQICAAEBAAICAQEBAQECAQIBAQEAAQH///85NzkkISP8/fzV19XV1tT+/P4A//8B/wAA/wAAAP///////v//////AP/+//8AAP///wD//wD//v8A/gD9//8AAAEA/wAAAP///wAA/wD+/gAAAP8AAP//AP4B/wIBAAAAAQEAAAD/AAAAAf//AP8AAAAAAQH+//8EAwIFAgMA//8FBQbx8fDy8/IBAAECAAEAAP8AAgABAAAAAQH/AQEB//8AAgAAAAEBAAEBAQD/AAEFBgZqbWswMTIAAAEAAAAAAAIAAQHExMSPkZL/AQEAAP//AAD/AQAA//8AAgAAAQD//wAAAP//Af8B/wAC//8AAAEA/wAAAAH/AQABAQD//wAAAQAAAAACAQH/AQAA/wH/Af8BAAAAAAAAAQEAAAEBAP8BAQAAAAAAAP///wABAAABAAD//wH/AP8AAQIAAQAAAAEAAf7/Af//AP8CAAL//wAAAQEBAQEB/wAA/wEBAAAA/wAAAf8AAAD///8AAAD/////AP8B/wAVFRX/AAEAAAEAAAEAAAHm7AHd3AD9/wAA/wAAAP8A//8AAQAA/wD/AP8A//8CAAAA/wAAAAEA//8AAAAAAgAA/wEB/wEA/wD//wEAAAD///////4BAAAA/gAAAQABAAABAP8A/gD+AAAAAP8B/wIA/wEB//8AAAD//QAA/wD+/gD//v8A/wAB/gAB/gAB//8A/wD+/P8A/wEA/v8B/wEB/gEA/gH//QEA/gAA/f8B/QAA/wD//QH//QEA/gAA/wH//gD//gAA/wD//QD//v///gH//gAA/v/+///9/v/+/f///gD+/wH+/v///gD////+/QH9/gH8/v7//wD+/v/+/gD+/gD8/wH+/wD9///+///+AQD8/gD+////AAD+/wH9/wD+/wD//f/+/wH9/gH//wH+/v/8/wD8/AD8/gD9///+///9/wD8/wD8/wAAAAD+/f///gD+/wH9/////v/9AAD9/QD+/gD///7+/wD9/wD+/wD//gH//wD//gH//wD+/QD7/f7+/v39/f/+///+/v/+AP/+/AD+///9/QD+/wD////+/v7+/v/9/v/+/wD+/v7+/v4A/vwBAvwBAP4AAgD0+gB4ogKRtQL//wEA/wAAAQFkPwd0RgUCAgEA/wEAAQAAAQEA/wAAAQIA/wL9/wn+/wb/AQECAAEBAP8AAAAB//8BAAABAP8BAAAAAP8BAgECAAAA/gEAAAAAAAD/AQABAP8AAAAAAQAA/wABAP8B/wAAAf//AP8B/wD/AP8BA/8B//8AAP4A/wAA+///+fv///7U5v/l8/4AAP8DExf/BgL+AgAAAAAAAQH/AAAAAQAAAgD/AAAAAP//AAAAAf//AQD/AAD/AP8AAAAA/v7/AP7+Af//AAD///8AAP///wD/AP7/AP/67+j47ugAAAAAAP8BAAEUFBMnJib/AP8BAQAAAQAAAAAA/wAAAQAAAAAB/wEAAAAAAAD/AgABAAAAAP8AAP//AP8BAAABAgL/AAAAAAAAAQAA/wABAAABAAAAAAEAAQEBAAEAAAD/AP8BAAEBAQIBAAEB/wABAQD/AAAB/////wABAAAAAAABAAIA/wABAAAAAQD//gAAAQEBAAEAAP//Af8AAQABAAEA//8A/wABAQABAP8A//8AAQAAAP//AP8A/wEAAQEAAQD/Af8BAAH+//8CAQEA/wAAAAABAQEAAAD/////AAAA//8CbWxvzMrOAAAAAP8AAAABAAABAAAAAAECAQICAAEB/wEBAP8AAAEBAQH/AP8A//7//gH+AgMCAAIAMTEySE5JICIfDQwMAwIDAwIAAgICAgECAgMCAwMDAgMEAwEEAwEDAgIBAwMBBAECBAMDAgICAgICAgECAwEBAgIDAgEBAAEBAQEBAAEAAQEAAQIAAAACAgICAgECAgABAgABAAACAgECAgAAAgIAAgABAQH/AAEAAQABAgEAAQABAgEBAgEBAQECAAEDAAACAAEBAgABAQEBAgACAQAAAQABAQEBAgABAAABAgECAQACAAD/AQIBAAD/DQ0MODg4AgEC8vLyycvJ8PHwAP4A/v/+AAD+//8AAAD/AAD//gH//v4A/wD//wABAAD////+AAEAAAD/AP7////+AP/+//4A/f4A/wD+AAD///7+/f8AAP8B/////gABAP//AAD//////gAA/wEBAP///wH+/wAAAAEA/wEB/v//CAcH/wAB/v39AQIBAQIBAgEBAQECAAEAAQEAAQEA/wEBAP8AAAEAAQEBAQAAAAH+AAD/ERESdHZ0FRYWAQEBAQH/AAEAAP8BlJGWpaOk/wAA////AAABAQAA//8AAP8AAQIAAAAA/wAAAAEA/wEBAAAA/wD/AAD/AAAAAAABAAABAP8CAAAA/v//AP8AAAH/AQAA//8AAQAA/wAAAAAAAAABAP//AAEAAAABAQEA/wAAAAAAAQD/AQEA///+AP8B/wD/Af8BAAEBAQAB/wD/AQAAAQD/////AP//AAAAAAABAAH/AP8A/wABAQEAAAAAAAEAAf8AAAD/EA8PAAAA/wD/AAABAAABAAAA6e0CBAEAAP8AAP8BAP8B//8A//4AAAAA/wD/AAABAf8AAv//AQAA/wEAAP8AAP//AAD/AQABAf8AAP7/Af//Af8BAf8BAQAA//8BAP8A/v8AAAD/AP8A//8AAP//AP4A//4CAP4BAv8BAP4BAP8CAP4A//4CAf7///4C//4AAP4AAP8CAP0AAP0BAP4BAf4AAP0BAP8BAf8C//4A//4BAf3///0CAP8CAP8C//4AAP4BAP7+/wAA/wEA//4B/////v4A/gEB//4B//4AAP8A/P4A/f4A/P4B/f4B/P4B/f8A/P7//f0B/f4A/f7//v7+/v8A//0A//4B/v4A/v8A/vwA/v8B/f3//P3//Pz+//0A/f4B/f4B/v8A/v4A/f7//v8A/v4A/f4A/v4B/v4B/P0B/v7//v4A/v4B/QD//f/+/QAA/v///v7//f4A/v3///7+/v4B/f4A//8B/QAB/v8A/P7//P7//v///v0A/v8A/wAB/f4C/f8B/v4A//7//v0A/v///f4A/v/+/v7+/v/9/v/+/v3+/v8A/v/////+AgH7AAP6AAD9AAH/2+oAWowEk7IF//0BAP8BAAACYjwFjVQEBwP/AAD/AP8A//8BAP8AAAAB//0C+/8J/f4F/gABAAAD/wD/AQABAAAAAAAAAAD/AQAAAQAAAQEBAQD//gEAAQIA//4AAAABAP8A/wAAAQEAAP8A/wD///8B/wEAAf8AAQD/AAH+////AP7+/wH/AQH+Af/+APn7APv9Af0AyuL//gAAAAABAxUZ/gEB/gEB/wAA/wD9AAIAAP8AAP8B/wD//wAA/wD+AAEA///+AQD/AgEA/wD+/wEAAP////7//////wAA/gD/AAH+/wAAAAH/+OvhAPz3AAD/AAAB/wH/MDAwHRwcAQABAAAA//8BAAEBAAEB//8AAAD/AAAA/wAA/wD/AP4A/wAAAAABAAAAAP8A//8AAP//AQEBAAD///8AAQH/AAAAAAABAQAAAQAAAAAAAAEAAAABAAD+AAD/AP8AAAAAAAAAAAAA/wEAAQH/AAAB/wAAAAD/AAEA//8AAP8AAAAAAQD+/wH/AAD/AQABAQABAAAA/wEBAAABAAAA/wAAAAAB//8AAAABAAAAAQEA//8A/wAAAQD//v//AQEA//4AAAAAAAH/AP//AP8AAAABAQAAAAABArS0twEAAgAAAAAAAAEAAAAAAAAAAQECAwABAQEAAQAAAAAAAAEAAQD+//8A/wEA/wUBAgICAiQpJVNbVRweHRUREQECAQMDAQEBAgICAgIDAQMBAQIBAgMCAQMCAQMDAgMCAwMDAwICAgECAgMCAgIBAgIDAAEBAAABAAICAQIBAQIBAQMBAQIBAQMAAwECAAEBAAABAAECAQABAQEBAAAAAQECAQEBAgABAAABAgEBAgEBAQEBAQECAgEBAQACAQAAAAEAAAIDAQIBAQECAAABAAEB/wECAgEBAAEAAAAA/wEAAAD//QEB/wECAgAA/wMBAgAA/x8fIA4QDv4AANve3OTk4v/////+AP8AAf/////////+/wD9/wAA////AP7+/QH//v//Af3+/v3/AP//AAH+AP//AQAA/wEA//8AAf//AAAAAQH/AP////7//gD+////AAD//gD//wD/AAD///8AAAD+AAH/APv9/gABAf3+/QUGBgoICOnq6AACAAABAQEBAwIBAQICAgAA/wEAAAABAAEAAP//AQD/AAAAAQAAAgABAQAAAC8wMnV4eAoMDv8AAQD/AQABAfHy8np7f9XS1AEBAQAA//8AAAEBAAABAAAAAP8AAAD/AQAAAAD/AAD/AQEAAv8AAf8BAAAA/wAB/wAA//8B/wEAAQAAAAD/AQAAAAEAAAAAAQH/AAAAAP8AAAABAAAAAP8BAP8AAP8A/wAB//8AAAD/AQEA/wD//gD/Af4AAAH+AP8AAAABAf8AAP//AQAAAQABAf8B/wD//wAAAQAAAAEAAAD/AAAA/wD/AAAAAQAAARkaGR0eHQAAAAEAAAAA/wIAAN3iAQD+/wD/AQH+AQD/AAH/AgECAAD/AAH/AAD//wABAP8AAP8AAQH+AQAAAAABAQEA/wD//wD+AP//Af//AQAA/wAA////AAH/AAEAAAAAAAD/AQL/AAH/AQAAAAD/AQH/AQD+Av/////+/wH/AAD+AQH+AP7/AAH/AAH+AQH/AQD+/wAAAAD/AAH9AAD9AQD//wL+/wD9AAH+AQD+///+AAD+/wD8/wD9/gD+AP///wD/Av/+AP/9Af7+AP7+Av7+///9AP39AP7+Afz/Af7///3+/v7+AP3+Af7+AP7/AP//AP4A//3+//39Afv/Afv+APz+//z+/f3+AP39//7///7///3/AP7+AP//APz///7+AP3///3+AP3/Afz+//3+AP39AP7/AP3//v3///4A//7/Afz/AP7//v79////Av/9/vz9Af3+Af3/AP3+AP3/AP79/v3+Af38///9//v+//3/AP79//3+AP3/AP39//z9AP39AP78APz9AP3/AP39//7//v7///z///7+AP79APz+//z/APz//f7+/QEA+wEC+gEB/QAEAK/LAFGFBLTJAAAC/gABAgECAFw5BYxTBgoFAgABAAD/AQACAgEAAAD+AgAABPwACf3+B/4AAgAAAgAA//8BAP8AAAABAP8AAQEBAQAAAP4A/wAAAAEAAAH/AP///wADAAAAAAABAAD/AP/+Af8AAAAAAAAAAAD/AP//AQAAAf8AAQEBAP//AQEC/wAA/P///gD2+QD9APP4/q7X/wAAAQAABQIdIAADAv8B//8BAAAAAf/+//8BAP4A/wECAQEBAAAAAQAA/wAAAP8B//7//wD//wAA//8B//8B/gAB//8A/gAA/v4B/////v8BAfrt5wAAAQAAAAAA/wD/ASEhIAD//v8A/////wEA/gH/AAH//wEA/wAAAAAAAAAA/wEAAQEAAAEAAAAAAAAAAAABAAEBAAAAAP8AAAABAQIAAAD/AP//AAD/AP//AAD+AAD//wEBAAEAAAEAAv8AAP8BAP8AAAD/AAAAAAAAAf7/AAAA/wAAAAAA/wEAAAAC/wIAAQECAAABAAD+AAAAAf8AAAD///8BAAAAAQAB//8AAAH/AAEBAAEAAAABAQAA/wAAAAAA/gEAAQAAAgEBAf8A/wAB/gAB/wEAAQABAAABAQEBAQAAAP8AAAL9/v7/AP8AAAEAAAD/AAAAAAABAgIBAQABAAMAAAEAAAEBAAAAAP7/AAAAAAACAQECBAMNDg1SVFAaGhkeGxkDAgEDAwIBAQICAgQCAgIDAgICAgMCAwEDAgICAwMCAwICAgICAQECAwICAgECAgIDAwICAQICAgMCAQABAAABAQACAQABAQEBAQIAA/8CAgIAAQICAQIAAAEDAAECAQEBAf8CAAEAAAABAQICAQICAQD/AQEAAQIAAAEAAgIBAAIBAAEAAQEAAAABAQEBAAEBAQAAAgEAAv8BAQAAAAABAgAAAAD/AgIAAAD///8AAAD/AQD/AAAGBwcLCwsAAgH29vfo6+j9//7///7///7///////7/Af/+/////f8A/v4AAAD9/wD+/v7//gD///7+/v39//7///7//v7/AAD//v/+///+/wD9///+AP//AAD/AAAAAP/+/wAA/wAAAP8A//////4AAQD/AAABAAAEBAT5+fkAAP8NDw7m6OgA/wECAAABAQABAAABAAADAgIBAQEAAQECAQECAf8AAf////4A//8BAAEAAP//AP5KSkpiYmICAgIAAAAAAAAAAQDk4+RwcXXx8PH//wEAAQEAAAAA/wAAAAAAAAABAQAAAAEBAQAAAQAAAP8BAf8B/gAA/wAA/wEAAAAA/gAAAP//AAAAAAAA/wD/AAH+//8AAP8AAf8BAQAAAAD//wABAAAAAAABAAAA/wEBAQAAAgAAAQL/AQEBAQABAQD/AAABAAAA//8BAP8AAAAAAP8AAQABAP//Af8BAAAA/wD///8AAQAA/wABAQEAAQD/AAAUExIeHh4AAAAAAAABAAD/AP/l6P4A/gD//wAA/wAAAQD/AP///gAB/wH+AP////8A/v4B/wAA/v8AAAD//gAA/gD+/gL//wH/AQAAAP8AAAD//gD//gAA/wH//v///wAB/wAAAP////8B/wAA/wAAAAAA/wAB//4A/gEB/gH//gEA/wEC/wEC/wEA/QAA/gAA/QEB/gEC/QEA/gAA/QAB/wEB/QL//QEB/gEA/wD//QD//gEA/wAA/wH//gL//QEA/gL9/f/+/QD+/f///gH+/////gD9/QD9AAD8/v/+/v/+/QD9/wH8/gD9///8/f/9/gD9/gD7/f/8/gD+/wD//f///v//AP/8/gD9/v/+/wL8/v/+/gD+/gD9/gD9/gD9/v/9///+/gH9/gH9/v3//gD9//7/AAH9///9/f/9/wD9/gD9/v///gD9/wD9/gD9/v/8/QD+/f/+/QD8/gD9/gH7/gD8AAH//QD8/wD8/gD+/gD+/f/8AAH8/QD9/v/9/wH+/v/9/gD8AP/9///8/P/9///8/v/8/v79/gD7/v/8///8/QD//v7//v7/AfoAAvkBAfz0+v5xoQFejgPW4QMA/wEAAAICAP9aNQaTWAcRCgMAAP8AAAAAAgEA/wH/AAMAAAT8/Qj9/gf/AQIAAAEAAAEAAAEA/wAAAAAA//4B//4A/v8AAP8B/wEA///+/wAAAf8AAAEB/gEAAAABAAD/AP8AAf8BAAAAAAEAAP8AAAEAAf8AAAAAAP//AP4AAf4B//wAAv8B+/wA+v0A//+32ADR6v8AAAACHSYCFBkAAAD///8AAf//AAEAAQD/AAABAgD//v//AP8AAQAAAQEBAgEAAAD/AP//AgABAP//AP8AAAH+/v//AP4AAP///wAAAf///f758ewBAP8BAAAAAAEAAAAqKyr/AQECAQEA/wAAAQL/AAD/AAEAAAEAAAEAAAAAAAH//wAAAQD/AP8AAAAAAAAAAAD//wAAAAAA/wAA/wD/AQAAAQABAQD+Af4AAAD/AAD/AAH//wEAAQH/AP8AAAABAAABAP//AAABAAAA/wABAAIAAAEBAAEAAAD///8B/wD/AP8A/wEAAAEAAQABAAABAAAAAQABAP8BAP8B/wD///8AAQD//wAA/wD///8A/wEAAAAB/wIAAAAAAAAAAP8BAAEBAAEA/wAA/wAA/wAA//8BAP//AAABAAAEAAABAAD/AAAAAAABAAABAAAAAAEC/wEDAQH/AP8BAQAB/wD+AP8AAAAAAP7+AgYDAQEATE5NJiYnGhYYBQIDAAAAAgEB/wAAAgIAAQMCAQAAAwICAAIBAgEBAgICAgIBAQACAwICAQEBAQEBAQEBAwEB/wEAAf8AAAEBAAABAgH/AAACAQEAAQAA/v8CAAEAAQAAAAAAAgECAQL///8AAgAA/wAAAf8BAAEA/wAAAAABAgAAAP8AAQIAAAAA/wAAAQEAAAAAAf8A/gAAAAAAAf8AAAEBAP///wABAQL///4CAQL//v/9AAEBAf8B/gD/AAD//v7++fn4/v//BQME/v7+3N3dOzj2CgsLAP//AgIAAAACAP8AAAAAAAH+/wADAf4AAAD//wAA////AP/+/v7//v79//7+AAAB/v/9/f7/AP//AAAA/wD/AAEBAAD/AP8AAAEAAP//AAEBAgEBAAAAAAIC//7+/v7/9Pbz9/f48vLzAwYHDAsL3+DgAQIB//8AAAABAgIA//8AAAAA/wAAAv7//wEAAQAB//8AAQEA/wAB////AAEBAf8A////Wltby8rKycnJ////AQAB/wL/vb7AkpOUfn17/wD/AAABAAD/AP8AAAD/AAAAAP8A/wAAAQEB/wAAAQAB/wH/AAEBAP/+AAABAQIAAP8AAAEAAAAAAP8AAAEAAQAB/wD+AP8BAQEBAP8AAAAA////AQEAAAACAP/+AAEBAP8AAAAAAgEA/v8AAQAAAQIB//7+AAIAAf8CAAH/AQAB//8AAQH/Af8C/wH/AQABAgAA////AAEBAAD/AAABAQAA/wABHBscAAAA/wD/AAAAAAAB0tn//PwAAwQB/wAAAQIBAP/+AAEBAAD/Af8BAQH//gAA/gD+AgAE/wAAAgEB//8AAQEAAP/+AAABAAABAAAA/wAB/wAAAf//AAAB//4AAQD/Af8BAP8A/wAAAP4BAQAAAP7/AAABAQAAAf8B//4A//8A//8AAP4AAf8AAP4BAP//AP0B//0AAf8BAP4B/wAAAP0AAP8A/v3+AP8BAf4C//////8BAP4A//////8B//7//wAA/v4BAP8AAP///v8A/////f8A//8B//4A/wAAAP8A/wD///8AAAAA/v8B/v//AAAB//8AAAH+AP8CAAAAAAD+/v4A/wH/AP4AAAH9AQEA//8A//4AAQABAQAA/wEAAP//AAAAAAAAAQEBAP//AQEB////AAEAAAAB//7/AAACAAD/AAH/Af4B/wD/AAABAQAA/v//AgAAAAEBAAAB/wAAAAAAAgIA/v4A/wD/AAAAAgAAAAAAAQD//wAAAP//AQH/AAD/AP///wH/Av8A////AgEA/gAAAwEA/v7/AQEAAf/9AAH8AgT9AgH9AQP+zOMBgacCu80C/wD/AAD9AAMEBwUBbUEDe0gFDwkCAAAA//8BAQECAP8BAP8A//8D/f8I/AEE/wAAAAEBAf///wAA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AAEBAP8AAAH/AAAAAQEAAAAAAQAAAAD//wAAAQD/AP8BAQEB///+Af8BAAEBAP//AAECAAD/AP8AAQD//wAAAP8BAAEAAf8A//8AAAD/AP8C/wH/AQAA/wABAQAAAAAB//8A/wH/AQD//wABAf8AAP8BAAL/AP8BAQACAAABAAECAQIBAP8A/gAA//8A///+AP7/AgcGBwgI///+HBwZOTo4CwoLCAkIAwECAgACAgECAQECAwIBAQICAgIBAgMBAgACAQECAQEBAAMCAAEBAQECAQECAgABAgEBAgECAAH+AgIBAAEAAP8BAAIBAAABAQEBAgD/Af//AAEAAQEBAQEBAQIA/wEAAf8B/wABAAD/AAABAP4AAgIBAP8AAgEAAQD/AP8BAQL/AAEBAQEBAQAA/gD/AQEC/gABAAACAgACAQABAQAAAP8AAQH/AAEA/wEAAQEBAP8B//4A/v3//v7+AP7/0NXR3+De/P39+vv89/j6+fn7/P3/AP8BAAABAAECAQEBAQEAAAECAQEAAQICAAACAQABAAEAAAIBAAABAQEBAQEBAQECAQACAgEAAQIEAgEBAQABAQAAAAABAP8AAf8AAAAB/wAAAQD//gH+AAD/AAEA//7/AAAA/f/9/v/+/////fz9/v78/v7+/////f79AAD/FhsZAAADy8fFvb29AAD//v/////+///+AAAA//7//wEAAAEAAP4BAgABAAD/AQAAAAH///8BAAEA/wEA/wEAAP//AgIDTU9OBAQFAP//AP8BAAAA7e3slJWXAAAAAAD/AP8AAv8AAP/+AAH/AAAAAAH//wH+AAD/AAH/AAABAQEAAP8AAAD/Av8BAQEC////AP//AAAA/wD/AQAA/wAAAAAAAAAAAP8BAAAA//8A/wEA/wABAQABAAEBAAAAAAEAAAAAAAD/AQABAP//AP8BAP8A/wAAAf8AAQABAAAAAQD/AAAAAP//AQAAAAABAQH//wAAAAH/ISAgLSssAAAAAAAAAAAAAgAA0dkBAAD+Af4CAP8AAf4AAAABAQABAP8AAf7//v7/AAD+Af8AAP4AAP8AAP8AAP8AAP//AP8A//4A//4AAP4BAf8AAf8AAv8AAAAAAQD/AP4BAP4C//8AAf////8A//4BAP0B//4AAf8AAP4BAP4AAf3//v/+AP7/Av4B/v0A//4B//7/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AAAAAAAAAAEA/wAB//8C/wEBAQABAAEBAAD/AQD/AgAAAQH/AAH/AQD/AAD//wD/AP8AAAAA//7/AAABAgH/AQAA/wEAAAEA//8AAQAA//8AAAAA/wD//wD/AQD///7/AP8AAP8BAAH09PPh4+L6+vsAAAD//wD//wH//wD/AAAAAAD/AAD/AP8AAQD/AP8AAQAAAAD///8A/v/+AAD//wD//wD//wAB/wD+/gAAAgD//wABAQD/AAAAAQAAAAEBAAAB////AQABAf//AQAAAAD/AAEBAAL/AAAA//8AAf8AAP8A/wAAAP//AP//AAH/AAD//v//AP8CAP//AAEA////AAD//v8AAP7+/wD+/////v7////+/wD//gD////+///+/v7//v7//////gD9/v4UFxgCAwK1sLDZ2NkBAQAAAP8AAP8AAP8A/wEA//8A/v8A/wD/AAD///7+/f7/AAD/AAD/AP////8CAf8oKSoAAgMAAAAAAQEAAADW1tfCwcMBAP4AAQEAAAEA/wAAAAABAgEAAAD/AQAA/wAAAAH+/wAA/wAAAf8AAP8A//4AAAD/AAEA/wABAP8BAAAAAf8AAAEAAAAAAAAAAP//Af8AAAEBAAAA//8AAP8A/wD/AAD/AQAAAQAA//8AAAAAAAAAAQABAAAAAP/+AP8AAAD/AQABAAAAAQEBAAD/AAAA/wAAAf8AAQEA/wBlY2IKCgoAAP8A/wAA/wD/AACuvAH8+v///gEA/QAA/wD//wAA/wAA/v8A/wAA/v0A/P0B//////8A/wAB/v8B/gH//QAAAAAA/gAA/gEA/v7//v///gAA/v8A////AP8A/v8A/////wABAQG60vmHru8A/wAAAAAAAAAAAP8AAAEPEROen51YWFUCAQIAAAH///8AAAAAAQABAAAB/wEAAQH///8A//8AAQD//wH//wAAAQH///8AAP8BAAAA/wAAAQAAAP8AAQAA/v8AAf8B/wAAAf8AAf///wACAQH+AAABAQAAAAAA/wEBAAEA//8BAAEB/wEAAAAAAAAAAAH+///+AAEAAAAAAAECAgIAAQAA/wD//wAAAADn8/MBAAH//wAAAAEBAP//AP8A/wAA/wAAAAABAAD/AAABAQABAP8C/wD//wAAAQEKBgj9AQL/AAH+Af7A4N19sK3x8/MA/wERDQWWYAE7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//8B/wAA/wAAAAD//wD///4A/v8AAAD//wAAAAD+/wAA/wD/AP8AAP8A/wD//wAA//8AAQD//wD//////wAAAAEAAP7/AAAAAP8A/wD//wAAAAD///7///7+///////+/wD/AAD/AAD/////////////AP7///7/AP4A//0B/v8AAP/////+//7//f7///8A/gD+/f7+/wD+//3+AwgGCAwNAQEAxsXD/gEAAQD/AQEAAQD/AP//AQAAAQEA//7/Af8AAP/+//8A//7///7+////AAABAgEBHBwdAAEBAAD/AAD/AAD/5ubnz87QAP8A/wAA//8AAAAB//8AAgAA/wABAAEBAAAAAQEAAQH/AP8BAAD/AAABAQAA/wD/AP//Af//AAEAAQEBAAACAQEAAQAAAP4AAf8AAP8AAP8BAAAAAAAAAAAA/wEBAAAAAAAAAQD//wH/AAEAAAEB//8AAAEAAQD//wABAP8BAAEAAAEAAAAA/wAA/wAAAAAAAAAAAAAAAAL/EA8ObGpoAQEBAAD/AP7/AP8A+foAiKP/9/f+Af7//wAB//7/AP8AAP4CAP//AAEAAP//AP7+///+Af7+AP3/////AP4A//7/AP7/AP//AP//AAAA/wAA///+Af//AAAAAQAAscz33OX+AAACAAD/AAAAAAACLS8ydXFvAAAAAQD/AAAAAP8BAQEBAAEAAAABAAABAAEB//8AAgAA//8AAAABAAAAAAAA//8AAP///wABAAECAAEAAAABAAABAf8AAQEAAAEAAAABAAEAAQABAQAAAAEAAQD//wD/AgABAQAA/wAA/wEB/v//AP8BAP8B/gD/AAD/AAEB/////gD/AP8AAQEAAAEA////AAAAAAAB/wEAAAAAAQABAP3+AP/+AP8AAgAAAP8AAAEBAAAAAQD/AQH/AQIAAP///wH/+v794vDuAP8AExAQhLOyudbP/wD/AAEAVjwGk172Cgn+AAAB//7+//oJ/fcQ//sJ/v4D/gD/AAABAP8BAQAAAQD+AAAAAP8BAAABAAD/AAH//wD//gD////+AQD8AwD5BAL0AgT0/wH7AQD8AAD/AP8B//4BAP8B//4AAPz/y9r+aJ76TJf2p9D29fv9/gID/jMo/WdL/2JEACQVAAH8AAEAAAD/AAECAAD/AAD/AAAAAAIAAAH/AAH/AAH9/wD+/wL+AAD/AAD/AAEAAAD+AAD/AAH//wL/AAD/AAD+AAD/AAD/AAAA/wD+/wL+/wH+AQAAAAD+AAH+/wH+/v//AAEBAAAAAQABAQEAAAD//wD/AAD+/wD+/wEA////AAAAAQAAAQAA/wEB/NXRAPHsAAAAAAAAAAAAHRwcZGVhAAEBAP8AAAAAAP//AAAAAQAAAAAAAAAAAAAAAAAAAAAA/wD/AAD//gAAAAAB//8BAAEAAQAAAP//AAAAAf8B//8A//4AAQEAAAD/AQABAQH//gAAAAAAAAABAQEAAQEAAP8BAQD/AQD/AP8AAP8AAQABAP8AAAH/AAABAP8BAP8AAP8AAAD/Af8A/wAAAAAB/wAAAP8A/wAAAQD/AQH/AAD/AAEBAAD/AAEAAAABAQEAAAAAAAEBAgAA/wEAAAABAAAAAP8AAf4B//8A/wD/AAEAAAH//wD/AQAA/////wAA////AAD/AAD/AAIA/wD/AP8BAAEAAAH/AQH/ABaE6XsCAQEC/P3+QkJADg4O//7/7OzqAAEAAgEBAAD//gH/AQEBAQD/AQAAAQD/AQEA/v///wAB/wEA/wAAAf8AAP8BAAAB/gH/AAAAAAABAQAB//8AAAD///8BAQEA/v/+/wIAAAAA/wAB/wH/////AQH+AAEA/wD//wIA//8AAAAA////AP///wD/AQEA//8BAAEBAQAA/gH///8AAAD/AQEA/wAA/wABAP//AAEBAAAB////AAAA//////8AAQAAAAAA////AP//AAEAAQH+Af//4ePh9Pb0////AQAA/wD//wD/AAAAAAAAAAAAAAAB/wEAAAAAAQAA/v//AP/+AAAAAP8AAAAAAf//AAAB//8BAP8A/wEAAP8AAAEAAAABAAABAAAAAP8A/wAA//8AAP7///7///7+/v/+AP8A//8BAAAAAP8BAQECAAD//wD/AAAB/wD+//8A/wAA/wEAAP8AAQAAAP8A//8A////AAAAAP///v////////8A/v///gD///8A/////gAA/v/+//7//v/+/f7+///+//3+/wD/AP3/Cg8OAAEC3t7d5uXkAgICAAAAAAABAQMBAAABAAABAQEBAAEA/wEAAAAA/wAA//////8A/wH+///+JSUlAQABAAABAAABAAAAAP//1tXW/wABAQAAAgEAAP//Af8A/v8AAgEA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AAAAAQAAAQEAAAABAQH/AQD//wACAAD/AP8A/wD/AP8AAf8A/wD//wAA/gEA/wADAP8AAAABAAEBAP//AADx8fDj4+P8/f///wD//v8B/gABAAD/AP8A//8A/wECAQEAAP///wD///7//gD//wAA/gH///8BAAL/////AAEAAAH//wAAAP//AQD+AP8AAAAA/wH//wD//wAA/wAAAP7/AP0BAQAAAP///v//AAD///8A/v7//wAA/////v8AAf/+/v8A//8AAAEA/wD///8A/v8A/wD///8A/gD//wD/AP8A/wAA/wAA/wAA/gH//v//Af/+/QAA//////7+AAD+AP7+/wD//v/+AP///gD+//////4BAP///fz+/f0CAgEDAwMBAgIBAQIBAAEAAAD///4AAP8BAgH/Af8AAAAAAP//AP///v8AAAD//v8VFRIdHB4AAAAAAAEAAP/////a29wAAAIA/wAAAAABAP8BAAABAQABAAD+/wD//wABAQEBAAAB/wAAAAEA/wD//v4AAAEAAf8BAAAA/gD/AQEA/wAAAAEAAQAB/wAAAQD//wEAAAH//wAAAAAB/wH/AQEBAAEAAAAAAAABAQECAAEA/wAAAQH///8BAAAAAP8AAQEA////AQABAQEAAAD/AQD+AP8BAQD///8BAP8BAf/+/wBHRUVSU1QAAAH///8B//8AAP7D0PyRrP8B/wAA/wEA/v8AAP8A/v///wAA//8A//7///0A//0A/gAB/v8A//4AAP8B/wD////+//8AAAAA/f8B/wAA/wAAAP/I2fv0+f8AAAEAAP8AAAAAAP9fXloLCQgAAAD/AAH/AAAAAAAA/wD/AAEAAAEA/wD/AP8AAAABAQEA/wAAAQECAAH+AAL/AAEA/wEAAf///wEBAAH////+/wAAAAABAQD+AP8A/wD/Af8BAAAAAAD//wABAP8A//8AAP8A/wAAAP8AAAABAQIAAP8AAAAA/wEAAP//AAEB/wD///4A////AAD/AAD/AP/i4uL/AAAA/gEAAAAA/wASCAwBAAACAAD//wD/AP4AAgABAQEA/wAA//8AAAAAAAEB/wH+/gDA3tsAAQH09PTx9PIAAAAiGgSdbgAjFvgAAP8AAAAA9wn99RL//gYBAAEBAQEAAAD/AAIA/wEA/wH/Af//Af8BAAAB/wEAAP8BAf4C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Av7//wAAAgEAAAEAAP//AAAB/wAAAAEAAQD/AAEBAP4AAAAA/gIBAf8AAAD+AP4B/wL/AQAAAP8BAAD/AAAAAAH/AAABAQAAAAD///8AAAEAAAH/AP8AAAEA/wEAAAD//wABAAD//wAAAQEA/wAAAAAAAQEA//8AAP4AAQEAAAAAAQEB/wAAAAAAAAAAAQAAAAABAP8A/wD//wD/AgAB//8AAAEAAQD/AAAAAAH/AAABAP8B/wAAAQEAAQAA/wEAAAD///8B////AQEA/wAAAQD/AAEA/wAAAgAB/gABAf//AAH//wABAv8B/gEA//39/hgZGS4uLf/+/9PT0/8AAQD/Av8BAP8B/wABAQD//wD//gD/AAEAAAAA//4A/v//AAABAAEAAP8AAP8CAP8BAAABAP7/AAD/AP//AAD//wAA/v//Af8B/wD/AP8A/wH/AAAA/wABAP4A/gAAAP///wAAAAABAgD/AP///wD//wAAAP8BAP8A/wH/AAAAAf8AAP7//wH/AP8BAP//Af8A//4BAP7+AAEA/wAA/wABAP//AAEAAAEAAAAA/wACAP//AQAAAfLy8vj6+//+/wAB/wEAAf///wAA//8A//8B/wEBAf8A/wD/AAD/AAEAAAABAP8A/v8A//8AAP///wAAAAABAAAAAP8A/wAAAP//AP7/AAAA//4A/wD/AP/////+AP7+AP7//gD/AP7+AAD+AP8AAP//AAD+/v////7//wAAAP7/AP///wAA////AP8AAAH/AP8A////AAAAAAAAAAAAAAH//wD/AAAA/wAAAAD/Af3+///9//8AAAAAAf7+//8BAP7+/gD+///+//39/gD/AP8A/gEAAfb19QD/ACQlJB4dGwQCAgcFBcrHyIuLin16e8HBwf////8AAQD/AAH///8BAQAAAP////8BAP///wAAAhQUFgABAAAAAQAAAAAB/+vr69vb3AABAP4AAAEB/wAA/wD/AP8AAP8AAP8A/wEA//8B/wABAP8A/wIBAP//Af8BAAABAgABAAEBAf8AAQAAAAAAAQD/AQEAAP////8BAP8BAAEA/wEA/wABAAAAAP8A/wAA//4A/////wEAAAD/AAAAAAAAAAH+/wD/AP///wABAAABAAEAAAAAAP//Af8BAQABAAEAAQAB/wH/AQEA/wAA/xwbGl9gXQAAAQAA/wAB/wAA/+/z/YCf/PX3/QL+/////wAAAAD//wD+/wH/AAEAAAH//wD+/gD9/gH+/wH//wAA/gAA/wD/AAAB/wAB//7//gD+AP/+/tbk+gAA/wAA/wAAAAAA/jk4OBsZGf//////AQEAAQAAAf8BAQAAAAD///8B/wAA/gAA/wABAQEBAAH/AQD/AP4BAAAAAQAAAAAAAAD/AAAAAf8BAQAAAQEA/wAAAAD/AP8A/wH///8B/wABAAABAAD/AQABAP//AAABAQD//wD//wAA/wAAAf8A/wD/AP8AAAD/AAAAAP8AAAAB//4AAAAAAQD/APz8/NPT0wD/AAD/AAEBAQMCAxkODgEBAQD/AAABAQD/AP//AQAAAAD///8BAQAAAAH/AfT6+5vIw/j7+AD/AAAA/xsVBphpATMi+AAA/wD+AAD2Cv31EP7+BAD/AQABAf8BAf8B/wAA/gAB/wAB//8A/wEAAAAA/gIB/QQD+QUE9wMB9AIA9wEA+/8A/f/+/QAA///+AQH+AOPrAISwAUaN/IG2/OX1AgIA/wEFBf48KwByTQFiPwAkFgADAAAAAAAA/wD//gD//wACAAABAAH//wAA/wAA/wD//wAB/gAA/wEB/wAAAAABAAAAAAABAQABAAACAAABAAABAAAAAQABAAAB/wABAAACAAAAAAAA//8AAAABAP8AAAAB//8B/wABAAEAAAD/AQAA/////wAAAP///wABAP8BAAAC/wAB/wABAAD//wAAAAEBAAECAAAA/gABAAEB/wDw7//a1gAAAAAAAAAAAgAA/15cWyEjIv8A/wAAAAAB/wAAAAAA/wABAAAAAAD/AAIAAAABAAECAP//AAD+AAAAAQABAQEBAAD/Af//AgAAAAACAf8AAAH//wD//wD+AQEBAAH/AAEAAAEB/wAA/wEAAAAAAQAAAP8AAf//AAAB/wAAAP8AAQABAf//AAD/AQAAAQEAAAEAAAEAAQABAAAAAQIBAAAA/wEBAQEB/wAA//8AAP8A/gD//wAAAQAAAAEAAP//AP8AAAEAAgIAAQAA/wEBAAAAAAAAAP//AAD/Af8AAAEBAAABAAAAAAAA/wAAAAAAAf8AAAAAAP8A/wH/AP8AAQH/AQH/Af//AQAAAAABAQAAAgEAAAL//v///v7/AAEA//80MjEAAADHxsff4N//AQAAAAAAAAEC//8AAAEAAQL/AQAA/wD//wAA/wEA/wD////+/wAAAAAA/v8B/wD//v0BAf8AAf8AAQD/AP///wD/AP8A/v8AAAD/AAAAAAAA/wD///8A/gD+//8AAAH/AAD/////AAABAQD/AAAA//8A/gAA/wD+/////gAAAAABAAH/AQAA/gAA//4AAAAB/wD/Af///wEAAAAA/wAB/wD/AP///wAAAAH//gABAAD//wDx8vL6+vsAAP8AAAD+////AAAAAP//AAH/AAAA//8AAQH/AAAB//////8A/v//AAEA//8B/wD////+/v7+//7/////AP///////wABAAD//wAA/wD9//7//////gD//v///wH//////v7/Af/+/v7///7/AAAA/v////8A//8C//8A/gD+/gAA//8A//7///8A/wAAAP///gD///////7+AP//AQD+/gD//gAAAP4BAAD+AP8A/wH+//7//wD//v7//v7/AP/+//4A//7//f8A///7+vr38vMAAP80MzMFBQUAAAAAAP9bWlgxLzDLysqCgH92c3Kzsa/w7u3/AAH//wD+AP///wAA/wABAAAAAQAZGRgAAAEAAAAAAAAA/wD/AP7k5uQBAAEBAAH/AAAAAAAAAQD//wAAAAAAAAAAAP8B/wD+AAAB/wAAAQEBAAAC/wAA/wAB/wAA//8A//8A/wAAAP8AAf8AAAACAAAAAAD/AAAAAAABAAABAAAAAQABAAAAAP8AAQAAAQAAAQH/AAAAAAD//wABAgABAQABAQAAAQAA////AQD//wAAAf8C//4AAAAAAf8B/wAAAP8A/wD/AAH+//9hYl8pKioAAP8A/wEA/wAAAAC2x/metfz+/gD+/gD//gAB/wAA/wEA//8A/v8AAP4AAP8AAP4A//0A//7//v8A/wAAAP8A/wAA/v8BAAAAAf/6+/7h6/4AAAEAAAAAAP8AAAAsLiv/AP8BAQEBAQD/AP8AAAAB/wAAAAAAAQAA/wABAAAAAAEAAP//AAABAQD/AAAB//8BAAAB/wD/AAAAAP8AAQABAP8A////AAEAAP//AQABAAH/AQAB/wABAP8AAAABAQAA/wAAAf8AAP//AQAAAAEAAAH/AAAA/wEAAQABAQABAQAAAQABAAAAAAEBAAD/AAAAAADp6uvh4OMAAAAAAAEAAP8LBQgSCQr/AAAAAQEBAAD/AQAAAP//AP//AAAA/wEAAAH+AACq086519IAAf8ABAEVEwadcQc+KvcAAf///gH/9Ar88hH+/QUA/wIAAgEAAQEAAQAAAQH///8BAAAAAAAAAf8AAP8CA/8FA/cFA/MCAPUBAPv///0AAP8AAAEAAf////7v9P6Wuv5PkPp+s/na7P4AAP8CAAL+LSH/bkoAYT8AJBb///4A//4AAf8AAf8AAf8AAgEAAAEA/wAAAP//AQAAAf8AAf8AAv8AAAEAAv//AP8AAgAAAP4AAv8AAP4AAf4AAQAAAP8AAP8AAf8AAP8AAQEAAf8A/wAAAf8AAP8AAf8AAAAAAf8AAQAAAQAAAP//Av8AAv8AAf8AAgAAAv8AAf//Av8AAv8AAgD+Af8AAQD+AQAAAAAAAAD+Af8AAwEAA/8AAQD80swA9PMAAAAAAAAAAP8kIiRhY2ABAAABAQEA/wAA/wEAAQD//wABAAAB/wAAAgAA/////gAA/gEAAP8AAQD/Af8AAf8A/gAAAf8AAf///wAB//8BAQAAAQH/AAD/AAD/AAAA/wD+AAD/AQAAAAH/Af8AAP8BAAAAAP8AAAABAAIA/wAB/wAAAAABAQAAAP4A//8A/wD/AQAAAAAA/wABAQD//wAAAQEAAAAA/wEAAAEAAAACAAEBAP8A/wABAAD/Af8AAAABAP8AAP//AP8AAAIAAAABAAAAAAAAAAEBAAEBAAAAAAAAAP8BAP8A/gEB/wABAQAB//8BAf8AAAD/AAAAAAEAAAD/////Af8A//8AAAAA/wAAAAEE////////AQD//wABMjMxAgMD7+3syMjJICAf////AQAC/wH/Af8A////AQAAAAIAAP8BAAEAAP//AP8AAAH/AP/+AAAB/wH/AgECAAEAAAEAAP//AP4BAAH/AAAB/wAAAQAAAAD//wABAAEA/wAAAgEAAAAAAf7//wICAAAAAAD//v7/AgEA/wEAAf8CAAD//wAAAP//AAAAAAAAAP4B/wH/AQEB//8A///+AAABAAD/AP8A/wH/AQAA//4AAAD+AAAB/wD/AP4A/wAA9/f4+vv6/wAAAf8AAAAAAQAB/wAAAP8AAAH///4AAAAAAP4A/wAA////AAABAP///wAAAP/+/wAAAAH/AP4A/wAA//////8A/wD//v7////////9AAAA/v//AAH////////+/////wD///4BAP7/AAAA/v//AAAAAP//AP8A/gD+AP8BAAD///8AAP8AAAH///4AAgIBAAD///8A//8AAQIA////AQAA//////8AAAEBAgAC/wD/AP8BAQH+/wEBAAAB/v7/AQMA//8BAAL/AQAC9PHx+/f3AgICODg2AQEBAAAAAAAAKisrl5eUtrW4pqamzMrKycjJpRujRkhJPT9AJiYm//8C//7+/wL/AgABBwgJAQD//wAAAAAAAAEAAP8A6urqAAAAAP8AAAAAAAEBAP//AQEAAAAB/wAAAAABAQD/Af8A/wAAAAABAP//AAEBAAD/AQAB/wEAAf//AQEA/v8AAf8AAAEA/v8BAAAAAQAAAAEA//8BAAH/AAABAAD/AQABAAABAAAA/v//Af8AAQIAAAEB////AAEAAAD/AP8BAAABAQAAAAEA/wAA/wEBAv8A/v8AAAAAAAABAQH//v//AAACFxcYjYyJV1da8/PzAAAAAv8A/gAAf6H8JBwCSDUEAP7///8BAAH+AP0CAP7+AP8CAP/+AP//AP8CAP4CAf8AAAD/AAAAAP4BAAABAAABAQAA6fH+4+3+AAAAAAAAAAAAAAAALy4sAQAA/wAAAQABAP//AAEAAAAAAAABAQD//wD//wECAf//AAAA/v//AAAAAQEAAP8AAAAA/wAAAQEBAP//AP8AAAAAAAEB/wD/Af8BAQD/AAEAAP8AAAAAAAABAAD//v8BAQD/AAAAAAAAAQABAAAAAQAA//8AAAH/Af8B/wABAAD/AAH/AP8BAQAAAAAA/wAAAAAAzczN6+ztAAD/AAD///8BHxQVKRYZAQD/AAAAAAD///8AAgEB/wABAQAAAAD///8BxeXfkcK9AP/+AAACCgkCjGEHRyzy//3+AQED//UH/vUQAQADAAEB/wIC/wAB/wEAAP8CAAAAAAEA/wAAAf7/AgIAAQP7BAL7Af/0AAD7////AQD/AQEB//4AAAAA9PgCnsH/m8L81+r8AAD/AQABAQD//iAZAEEqADojAAMCAP//AAD/AAEAAP//AP8AAAAAAP8AAAH/AAEAAP//AAAAAAEAAAAAAAH/AP8AAQL///4BAAEAAAD+AAABAAD/AAH/AP8BAAH+AAABAAABAP8AAQD//wABAAH/AAAAAAD/AAACAAAAAAH/AP8BAAD/AP8AAAABAAEBAQD///8AAAABAAH/AAABAP///wD/AAAAAAIA//3+AQIB//4AAAAAAAAA/wAAAv4A/+7t/9PRAAAAAAAAAAAAAQACbm9tJiYn/wAA//8AAgEAAAH+//8BAQAA/wABAAD/Af8A/wEBAQEAAQD//wAC/gD/AgABAP8BAAEAAf8A/wD//wD//wAB/wAAAf//AQEA/wABAAD/AAEAAf8B/wD+Av8CAAEA/wD//wABAf///wEAAP//AAEAAAAB/wD/AQAAAAABAQEBAAD/AAAAAP8A/wEAAP8A//8AAv8AAAD/AAEB/wAAAf8A/gEAAQECAAD+AAAAAf8BAAEAAAABAAAAAQEB////AQAAAAAAAAAAAAH///8A//8AAAIAAf8B/wAA/wL/Af8B///+AAEBAAACAAD/Af8BAAH//wEAAQABAAAB/wEAAAD+/wEBAP8BAv///wAAAQD/AP///ykoJywrKv8BAcnIxwEBAQEAAgEAAP8AAAABAQABAAABAP/+AP8A/wAAAAABAP8AAf8A/wAAAQEBAP8AAAAAAP/+AgD+AQAAAf8AAAAAAAD/AAEBAf8A/wD/AAAA/wD/AAIAAP7//wAAAP4BAQEA/gD//wEBAAAB/////wD/AgAB////AP8AAAEA/wD//gD///8A/v8A/////wD//wAAAAD+AQABAP8BAAH///4A/wEB/wAAAf///wD//wEBAP////T19P39/gD///8AAAAA//8AAAD+/wD//wD9AQAAAP8AAAACAP8BAQEBAAAA/wD/AP//AP4AAQD/////AP8A///+////AP/////+/f8AAP//AP/+AQD+///+//7/AP///////f8A/v/+AP///f4A/v3//v/+/v/+/gD+AP/////9Af8A/gD//wH/AP8BAAD/AAEAAP3+//7+///+AP//AP/+/wD+AP//////////AAD/AP4A/wD+AP///wD/AP//AP///v/+///+/////gD/APz6+vTs7QD/ADs4OTk4OQD/AAAAAAEBAf/+/w0LDlhXWJubmXl6eSosLOfo6Z+en3FsbImGhdHQzP7//gEAAf//AAoKCgAAAgAA/wAB/wD/AAD/AeHh5AAAAP8BAP8BAAAAAP8AAAD/AAH/AAL/AAEA/wAAAAABAAABAAD//wABAP8A/wAAAP8A/wD//gAAAP//AQEBAAAAAAEAAAAAAAEAAAAAAAD/AAAB/wAAAP///wAAAf4AAQD//////wEAAQABAP//AQD//wABAQD/AAH/Af8AAAEAAQH/AQD/AAEAAAH/AP8BAAEAAAAAAAAA////AQEBAQEBAAH/AEdISGlqaQAA/wAAAP4A/wAAAPD1/naZ/Ojq/gH/AAAAAQD+AAAAAAD//wD+/v///gD+/gD//QAA/wD//wD9/wD/AP8A/v///gD//v8A/vH2//n7/wAAAQAAAAAAAQAAAAcFB///AAEAAQD/AAEAAAAAAAAAAAAA////Af8AAgD///8AAAAAAQEBAAABAAEAAAAAAf8AAAEB/wEA/wABAQABAAABAQD//wEAAQAAAAAAAf8AAP8AAAABAP8AAAD/AAEA/wABAQD/Af8AAAEAAAAB////AAEAAP//Af4AAAAAAAAAAf//AP8A/////wAAAAEAAAAAANXU1v8AAAABAAAAAgEBARgLDQQBAAD//////wABAAIAAgD/AAD/AAAAAQAAAOv19Ia+uO/18wD/AQABAHVQB1w78//9/QEAA//1Bv/1DgD/Av8CAf4DAP8B/wEA/gEB/wAB/gAB/wABAAIB/gID/AME9wUC8gH+8AD/+v/9/v///wD/Af/+AQD/ALvS/06O+XOs+NXq/AAA/wEAAAAhGP1fQP95Tf8+JgACAQD//wD//gABAAD+/wAB/wAAAQD//wABAAD+/wAA/wABAAAA/wAA/wAAAAAAAAAAAf8BAAAC/wAB/wABAAAB/wACAAABAQABAAAAAQAC/wAB/gAC/v8BAAAB/gABAAAC/gABAQADAAAB/wAAAAABAAABAAACAAACAAD//v8AAAADAAEB/wAAAAAA/wAAAAEBAAEAAAH/AAAB/wEBAAAC/v8B/wAAAAD//////fzIxQDw8QAA/wAAAAAA/jQzMl5fXf4A/wEBAAEBAAABAAAAAQAB/wAAAAH//gAAAQAA/wEB/wAAAP//AQD//wIAAf//AP8A//8AAAABAAD/AAL/Af///wEBAP8AAAAAAAAA/wAAAQAAAQAC/wEAAf4B////AAH/Af//AAABAAAAAAABAAEBAAD//gEAAAAAAAEAAAAA//8AAAAA/wABAAEAAAEAAAIA//8A/wABAP//AAAAAP8AAAEAAf8A/wAAAf//AQAAAAAA/wABAP//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AP8A/wD/AAAA/gAAAQD/Af//////+vr6/gD/AQAA/wD/AP8AAAD+AAABAP8A/wAAAAD/Af4AAAH+//8AAf///gD/Af8A/wAA//8BAP7//gAA/v8A/wAB///9//////7//////wD/AP8A/v////8AAAAAAP7+/f/+AP7//v//AQD////////+//8A//4AAAD/AP8AAAAA///+AAEB/////gD/AAEBAP//AAD///8AAAEB////AAEAAf///gAAAv0AAAEA/wEAAP8AAAIBAP8AAQH+//8CAAD+//4DAgIAAv8B/fv89e/yAAAAPDw8QD8+AAH/AQEB/wAA/wAAAAD/AAAAAQD/AAAA////Hx4fcXBwPD08q6qswb7A9PP2x8bGyMfGAwMDAP8A//4AAAEAAP//AAAAAAAB+fn6/wAAAAEAAP8AAQH/AAABAAAAAP8AAAEAAQEAAf8A/wD/AAAAAP8AAAAAAQEA//8AAAL/AP8AAP8AAAAAAAEAAf8AAP8A/wH+Af8B/wAAAQEB//8AAAD/AAEA//8AAAAAAQAAAAAAAAEC/wD/AAEB/wD/AP8BAAEAAAABAP//AAH//gAAAf8AAAAAAAD/AP8AAAAAAQIB////AAEAAAABAAD///8AAQEBERESg4SBUVBT8O/vAAD/AAAAAP8BpLz8JhoFd1T9AAABAQABAP7/AAD/Af4B/wAAAf8CAQD+AAAA/wD+AQABAAABAAD/AP4B/gH//f0BAAD/AAABAAAAAAABAAAAEhISAQICAAD/AAAAAAH//wABAP///wEAAQAB/wAAAQECAP8AAAD//wAAAQD//wAAAf8A/wEA/v8AAQABAAEAAP8AAQAAAQEA/wD///8AAAEAAAABAAAA//8BAQH/AAABAAAA/wAAAAAAAP8AAAAAAAEBAP//AAEBAAD/AP8BAAH/AQEB/////wAAAAEAAAABAQAA8/Pz09PUAQIA////AAACAP//Hg4RAP7/AgAAAQEB/v///wEAAP4BAQEB/wH/n83Ipc/HAP8AAAD/HxgEh175DAf//v0BA/gDAPgEAAD+AAL6AQEB/wD/AP8AAQEDAQAC/wEDAP8AAQIBAQH///76Av35AAD///8AAQAAAAEA/wD/z98DmL3+qs738fwAAAD/AgAAAA8K/j4pAEEpABAHAAD/AAD/AAEAAP8AAAD/AP8AAAEAAP4BAAD/AAIAAP7+AAAAAAEAAAAAAP8AAP//AAIAAP4AAAEAAAH+AAABAAEAAP7+AAAAAAAAAAH+/wABAAEAAP8BAAL/AAAAAP8BAAAAAAAAAAEAAAD/AP//AQAB/wAAAAH/AP8AAAAAAAAAAAEBAAAAAP/+AAACAAD/AAH+AAAAAAEAAP4AAP//AQAB/wIAAf8AAAAAAAIAAf7+AAEC/wD//9PTAP38AAABAAD//wAAKigqWVtZ/wAAAQAA//8AAAAAAAAAAQEB////AAAAAgIA/wAAAQAAAP8AAQAB/wAA/wEAAP8AAAAAAgEB/wAA/wH//wABAQD+AQEC////AgAB/wD//wAAAP4AAQEAAAEBAf8A//8A/wAAAAD/AAEB//8AAQABAAEAAP8AAQEA//8BAQEAAAEAAf4C/wAAAAH/AAAAAQAA/wD//wAAAAABAAD/AQEAAAAA/wAAAP8AAQAA/wD/AQACAAD/AQAA/wEAAQEA/wABAf8A/wEB/wABAAD/AQAB/wH/Af8AAAAAAf8AAAEAAQAB////Af//AAECAQD+//8AAQEB//7/AQAA/wEAAQAB/wH+AQABAAAB/wD/Av7/AP//AAAA//8AAQEAAS8wMTg6Of///snJyQEAAAACAQIAAAD/AAAAAAAA/////wEBAf8AAP7//v7//wD//wAA/v//AAD//wAAAAD/Af8A/wH/Af8AAP//AAAAAAD//wAA//3/AP////4AAf7///8AAP//AAD/AAH/AQAAAP///wEAAAAAAAD/AP//AP8A//8AAQEBAP8AAP7/AP7///4A//7//wAAAAH///8AAAAAAAAA/gEA/wECAP//AAAAAAH//wD//wEBAP7///7+/gEA/wD/AAH/AAIAAP8BAf8A/v////////8B//4A/wH+AQD+AP//AAAAAAAA/////wD+//8B/////wD//gD+/QD/Af7+/v7//v7//v//AP3//v//AP///f///v3//QH+/////gH//v78/v/+/f/+/////wAA/f/+//7//v///v7/AP79/f///wD////+/gD//wD+/wD//wD////+/gD9//7+/wD///7//////////wD+/v/9/v8A//8AAP////8AAAEA/////gEAAPLu7/z7/A8PD25uawgHBwAAAf4AAAEBAAEA/wD+AAD/AP//Af8AAP//AAD//gICAjU0NYWFhI+Rj01PTRYVEwMCAv////8A/gACAAD/AAAAAQABAQAA/+3r6wD/////AAAA//4AAQD/AQAAAAABAQAAAf8AAQAAAQAAAQD/AAAA/wAAAP7//wEBAP/+AAAAAQAAAAAAAAD/AP8AAP8AAAAAAgEBAAABAf8AAAAB/wAAAf8AAAABAAABAAAAAAAAAQD//wD//wEA/wEAAAAB/wAAAP7//gAAAAD/AAEAAAEAAQAAAQABAAABAQAAAAD/AP8AAAEAAAAAAP8AAAIAAAAAAAAAAD48PX+AfQEAAAAA/wD/////APv9/4Kk+5W0/gD+Af7+//8AAP//AP8AAQH/AAD//wD+/wD//wH//wD//wD//wD/Af8A/wH//wIDAAAAAQABAQAAAAAAAAAA//v8/P8A/wAAAAD/AAAAAQEA/wAAAQAAAAD/AAD/AAAAAAAB/wABAAEBAQAAAAABAP8BAAD/AQEBAQEB/gEA/wAA/wAB//7//wAAAQAAAAAAAAAAAAABAAAA//4AAQAAAAEAAAAAAQABAAAB/wAAAAH/AAAB//////8AAQEBAAD/Af8A/wEBAAEBAQAAAAEAAAAAAMrLzNXV1gD+AAD/AQD//gAAACcVFwAAAAH+AP//AAABAQH+AAEBAP///8nm4ZTIwQAA/wD/AQ8MAZJn/DUf/QH//wT6BAH5BwD/AwEB/wAC/QEB/AEA/QEB/gEA+gEA+AIB9gME+AEA+QD89wH9+////wAAAQD+AQD/AAD9AKPGAE+R/J7K+/P8AQEA/gIGBQBCK/52TABSLwARBgAB/gACAAAA/wD//QD//QAAAAABAAAA/wAB/gAB/wD//wAB/gAB/gD//gAB/wABAAAB/gD+/wAB/wD+/gAB/wABAAD/AAABAQABAQAB/wACAQABAAD//gAC/wD/AQAAAAAA/gABAAACAAAB/wABAAABAAAB/wACAAABAQABAAADAAAC/wAA/gAB/wACAQAD/wAAAQD//wABAAAAAAAA/wACAP8B/wABAP8BAP8A/wEAAAACAP///QDi4//U1AAA/wAAAAAAAAAAAVVWUxEREgEAAQD/AAABAAAA/wABAQAAAAEBAAEBAQAAAAAAAf//AAAAAP8B/wD//gD/AQD///8AAP8A/wAA/gAAAAAA/gAAAQD//wD//wAAAAAAAQAAAAAB//8AAAD/AP8AAP8BAf8AAP8BAAAAAQEBAAEBAP8AAP8BAAABAAAB/wD//wAAAf8C/wAA/wH/AP8AAAAA//8A/wEAAAEAAP8AAf8AAf///wAAAQAAAP8AAAABAAABAP8A/wAAAQABAf//AQABAAAB/wAAAAEA/wEAAgD//wD/AQAAAP8A/wD/AAAAAAD//wH/AAABAv8A/wAAAQEBAQAAAAABAAABAQEAAP4A/wEAAQAAAAEAAAEAAQQBAQAA//4AAAEB///+AgEBAAFDQ0K9vL3Kycnf4OAgISEA//8BAQEBAAD///8BAQAA//8A/wH/AP8B///+AAACAAIAAv/+AAEC/v8BAgD/AAD/AP8B/wACAQAAAAD//wAAAQAAAAABAAD///8BAQEA//8AAAD/AAAAAAAB/wEAAf///wIAAP//AQAB//8B/wD/AAD/AP8BAAEAAQAA/f7/AQEAAAD+//8BAAAA/wAAAP//AP///gAAAQD/AP8A/wD///8AAQD//gABAP8CAwIA/wH/AAAAAAABAQD///8B/wH+AQD///8A/wAB///+AQEA/wD////+/v//AAD//wD/AP///v4AAP///v/+/v/9AAAAAAH///8A//8A/gD+//7////+/v///wAA/QD+AP/+/v4A/gD/AAD//gH///7/AAH//gAA////AAAA/wAAAP8A/wD//////wABAQH+AAABAAD///8BAAAAAP//AgAB/wAA/wEBAP8AAf//AQL/AQEA//8AAP8CAQAAAgAA/wD/AP4CAgT6+Pj28fAA/v1SUFAzMjH+AP8CAP/+/wH/AAAA//8AAQH//wAAAP//AAEBAP//AP8A/wH///8DAwQ4ODc0NjXo5+fm5ebu7u4BAQGgn6DS0c8A/wEA/wAAAADe3+D9/v0DAgMAAAABAAAAAP8A/wH/AAAAAf8A/wH/AP8AAAAAAAAAAAL/AP8BAAD/Af8AAAAAAf8B/wD/AAH/AP8BAAEAAAAAAP8A/wD/Af4A/wEBAAAAAP8AAQD///8BAAEBAQD//wD/AAAB/wH/AAAAAQAB/wAAAQACAAH/AAABAAEA////Af8A/wEA/wD/AQABAQAB/wABAAD//wEAAQAAAAAAAQEBAAD/AAACAQFmZWbl5OWNi4z/AAAAAP8A/wL3+gF3nfsC/gBqTAEA/gL/AAIB/v///wEBAAEAAf4A/wIAAQAA/wAAAf8A//8BAAEAAAEA/v8AAAEA/wAAAAAAAAAAAADm5+gA/wAAAAAAAQABAP///wEAAP8BAAH/AQABAAAAAAAB/wAAAAD+AQABAAEA//8AAP//AQABAAD/AAIAAAAAAf8BAAEAAf8B////AQEAAAAA/wABAQAAAQAA//8AAAEAAAAAAAAA/wAAAQD/AAEAAQAAAAIBAf8AAP8AAAEAAQAAAAAAAAEA//8BAAAAAQD/AAC5urwAAwL//v4AAQAAAQEYDhImEhYB////AgEAAf///wEBAQH////i7u17uLT09/gAAAEICQKFWQBMLfoB/wEA/AMA9gUA/gIAAP4AAAAA////AAABAAEAAP4AAQEAAP8AAf4A/f0A/gEA//8A/wAAAQL//////wDH3QKfxf6my/74/P4BAP8AAAD/JRwAUzL/JhQAAP4AAf4A/wEAAQAA/wAA//8AAQAAAQAAAP0AAAAA/wEAAAAAAAAAAP8A//8AAQEAAP8A//8AAQEA/wEAAf8AAAAAAQEAAAABAf//AP8A/wAAAAEAAgEA/v8AAQAAAgIAAP8AAAAAAAEAAAEAAAAAAP4AAQEA//8AAgD//wEAAAAA//4AAQEA/wEAAAEAAv8A//8A/wAAAQEAAv4AAAEA//8A/gEAAQAA//4AAAIAAP8AAAAAAQH///4BAAMA///+ycsB9/n/AAEAAAABAAAUExNWVlX/AP8AAQEA/wABAAD/AQAB/wAAAAD/AAAAAP8AAAAAAAABAQH/AP8A/wAAAQEAAP8AAQEBAAABAAD/AAEAAP8AAAEAAQAAAAAAAAD//wAAAf8BAAAAAAEAAP//AAEBAQAB////AQIB//8A////AgAA//4B/wH/AgAA/wAAAAAAAQEA/v8BAQD/AQAA//8AAAL/AAABAAAAAAD/AP8A/wACAQH+AQEBAP//AAAAAQEA/wAAAf8AAAD/AP8B/wD/AAAB////AAEBAQD/AAAB//8AAQECAAD+AAEBAAABAQD/AAAAAQD/AAABAP4BAAEAAAD//wAAAQAA//8BAQD///8BAAD/AAEAAQAB/wAAAgAE/v//AgAAAAEBAAL/AP8AAAD/TEtJpqWm0tLTwsLGISEiAP8AAQIBAP7//wACAQH//wD/Af8BAQIBAP8AAAEA/wD/AP7/AAEB/wEA/wD/AP4BAQIAAAAA/v//Af8CAQL/AP8BAAH/AAABAQEB/wD/AP8A/wAAAQEB////AAAA/wAC/wD/AgEAAP////8A/wABAAD+AAEB///+AP8B/wEBAP8AAAH/AAAA/wD/AAEB//8BAP8A/wEAAAD/AP8A/wH/AQEA/v//AQAA/gAAAgID////AAAA/v8AAQD/AP8A/wAAAP//AP8A/wEAAAEB///+/gAAAAEA////AP7//wD//wD//////gD+/////v////7//wD+//3+/////v7+///+//7///7//gD//wD///39AP4A/v////8A//7+/////v/////+AAABAP///v8BAAD/////AAAA/wD/Af8AAAAB/wH/AP8B/wH/AQAB//3+AgEBAAD/AAEBAP8AAP//AAH/AQICAP///wD/AP4CAQICAAEB/v7+8u7u/vv8FhgXWVlV/gAAAf8A/gAAAAD/AP8A/wABAQAA/wAAAAAB/wD/AP////8B/wD/AAAA////AAAAAgABGhkaGRkaAQAAAAABycjJ0tDQAAEAAP//AAAB/Pn7/f39AgMDAQAB//8AAQAAAAEAAAAAAAAAAQD/AQEB//8AAAH////+AQEBAP8AAAD/AQEB//8AAAAAAAD/AAAB/wD/AQAB//8B/wH+Af8CAAAAAQAA/gD+Af8B/wABAAAB////AAAAAQAB/wIAAf////8BAQAA//7/AQIAAf8AAQH//gAAAQAAAAH/AQABAP///wD/AAABAAAAAAAAAAD/AAAA/wD/AP8BAQEA/wAACQgIgYCA8e/wm5ycAAH/AP/+AAAB9vn/dJ35BQQHZEUAAP7//wABAAAA/wD/AP8BAQD///8BAAH/AP0BAP//AP8AAAAAAwP/AAAAAAD/AAABAAAAAAEB4uLh/wEAAAABAAAA////AAD/AAAB/wD/Af8BAAD/AAAA/wEAAAAAAAD/AAAAAAAAAQABAP8AAP8B/wL/AgAB//8B/wEAAAAB/wAAAP//AAABAAEAAAD/AAAAAAAAAAH/AAABAP8AAQAA/wABAQEAAf8A/wH/AQABAP8A/gH/AQABAf8A/wH/AAEA//8BAAAA+fj7xsfJAP7+AAEAAP8AAQABPB8jEQcH//8A//8AAQH/AQEBAQEA3+zsarKt1ujmAP8AAQEBakf+aUP8Av4BAP0BAPcFAP0D/wL+AQAB/wD/AQAAAAAAAAD/AAD/AP/9AAABAP0B/wD///8BAQACAQD//vwAzuAEkr3+r9H89vz+AAAAAAAB/hsQAD8mADkh/w4GAP7+AAEBAAD/AAEAAP8AAAH/AAAAAAH/AP4BAAD/AAEAAAAAAAH/AP7/AAEBAAABAAAAAAIAAP7/AAABAAIAAP//AAABAP//AAH///8CAAEAAP8AAAH/AP3/AAIBAAAAAAD+AP8BAAL+AAECAP4AAAABAAAAAP//AAEAAAABAP8AAAH/AAEBAAAAAP/+AAEBAP8BAAEAAAEAAP7/AAABAAH+AP8CAAEAAAD+AQEC//7/AAABAAAAAQD//wIBAP///+XlANPX/wD/AAACAQAAAQD/bWtrKisrAP//AP8A/wAAAAAAAP8B/gH/AP8AAf8AAAEBAAAAAQD///7/AQEB////AQIB/////wEAAAABAf7/AQEBAP//AAEA////AQABAAABAAH//wAAAP8AAAABAAEBAQD///7/AQEBAQD/AAABAAEAAf8AAAD//wH/Af8B/wAAAAAAAAD//wEAAAABAQAAAAEBAQH/AAAAAAAAAAAAAP4BAAEA/v8AAQEA/wH/AAABAAD/AQEBAP8AAQABAAAA/wAAAQABAP8AAAEA//8BAQD+AAABAAD///8BAQEAAAEA/gD/Af8AAP8AAQIB//8BAQAAAAEAAQAAAAAB/wEA/wABAQEA/wAAAf8A/wAB/wH/Af8AAgAA//8AAP8A/v7/AAAAAP8AAQ0NDT9CQgABALW0s/Hx8gEBAQD//wAB/wIBAAAAAQAAAQABAP////8AAAAA/wEA/wEA/wEA/gAAAP/+AQAAAAD+//8A/wAAAAAA//7+/wABAAEB//8AAP///v///wAAAAAAAAD///8BAP7//wD//QEAAP7+AAAAAP8A/wD//wAAAf////8AAP8A/wH//wEA/gD/AAAA///////+//8A/wAB/wAA/wD//wEA/wAAAf7//wH/AAAAAAAAAAMDBP4BAP//AAEB////AAABAQD/AAD+AP8A///+/wD///8A/////v4A//8AAf4A///+//79//8AAP/+//7//gD///8A/v/+AP4B/v7///8A//7/AP3+/////wD+/v/9/v7/Af3//////v/+///////+/wD+/v/9///9///+///+/P/8/f79/wD//wD+///+/v/+///+AAD+///+AP7//gD/AP//AP/////+//7//wAA/wAAAf/+AAAAAP//AQD//////wEAAfn19fjz8gEBAWhlZCUmJAD//wAAAAEAAAAAAAAAAQEAAf//AAH/AP///wL/AAAA/wAAAAAAAAD/AQIBAQAAAAABAQAAAP////7//////wwNCwAA/wD//wABAQAA//r9/Pv8/QIAAQD/AQEAAP8BAf8A/wEAAAH+AAEBAAAAAAAB/wAAAAIBAQAAAAABAAD/AQAAAAEBAAAAAAEAAQEB/wEAAQAA/wEA/wD/AQEAAAAB/wAAAAEBAQEAAQEBAAAB/wABAAAB/wEA/wAA/wEAAQIA/gEB/gEBAAAAAQEBAQD//wAAAAAAAAH/AP8A/wAAAQEAAQABAAAAAAAA/wAAAAAAAQD/AQEBAP8AAAAAAAAAAAkJCH1/fS0tLQD/AAAAAAAB/wAA//f8AXKb+qa9/QD//wEAAQAAAAD+/wD+/wD+AAD+/wD+/wAAAAEAAf8AAAEBAAUEAAAA/wAA/wAB/wAAAAD/APj5+QEAAQD/AAAA/wAB/wAAAAAA/wAAAAAAAAAAAAEAAQAAAQAAAQEAAAAAAQAAAAABAAABAAEC/wH/Af7/AAEB/wD///8AAAEA/wAAAQABAAD//wAAAQH/AQAAAAH/AAAAAAEB//8A/wAAAAAA//8B/wAAAP///wAA/wH/AQAAAP8AAQD/AAD/AAEBAAD//76+vsjHyQABAAAAAAAAAQEAAUAfIwD//wD/AAD////+AAD//+Tu7Xq7s9Dn4AAA/wIDAE43/4FS+wIAAQD+AQD7BAD/Av8C/wD+/wAA/gAAAAAA//8A/gAB/gAB/v8AAQD+///+/v/+AgD//wH//9roAXar/0uV+qPN+fT8/gAB/v8ZDf5YNf94SP9IJwAOBwAAAAAC/wAA/wABAAAA/wAA/gD//gAA/gD+/wAA/wAB/wD//wAB/gAC/wACAAAA/gAC/gAA/gD//wACAAAA/gAA/gABAAAA/gAB/wAAAAAA/wD//wEB/wABAAADAAAB/wAAAAAB/wAB/wAAAQD+/wAAAAAB/wAA/wABAAAAAAEBAAEC/wAAAAAB/wAA/wAAAQAB/wACAAACAQAAAQABAAABAAD/AQAAAAAB/wABAP8A/wAA/wEB/wABAP8A/wAB//8A/gDIzgD//QAAAQAA/gAAACEfHl9hX///////AAAAAAEA/wAAAAAB/wH/AAEAAQEBAQAAAAAA/gAAAQEBAP8A/wABAP8A/wAAAAH/AAH//wAAAP7///8BAgAAAAEAAQAA/wEAAAAAAAEBAQECAAABAAAB/wAAAQECAgAAAAAAAAAB/wAA/////wAAAQEAAAAAAAD/AQAAAAAAAQH/AQH/AAAAAAAA/wD//wD/AAD/AAEAAAAB/wEA/wEBAP//AAD/AgAA/wAAAAD/AP8AAAAAAAAAAAEBAQEA/gABAAAAAAAA/v8AAf//AAAAAQABAP8AAP/+AAH/Af8AAP8CAf//AQIAAQAAAf//AAEAAP///gH/AQEA////AQEAAAAAAAAA/wAAAP8AAQIA/wAA//4A//8A/v//////AP8BAABFQkEMCwzS0dG9vbv/AP7/AP8AAAAAAP8AAP8AAAD/AAAAAP8AAQD//wD+/wD+/wD///////7+AP7/AAD/AgH//wAA/wH/AAAAAQD////+/gD///8A/wABAP//AP8A/wD/AAAA/gABAQD/AAH+/v8AAAD//wAAAP//AP8A/////wAA///////+AP//AP/+AP/+/gABAAAAAAAA/v///v8AAP///wD/Af///v4A/wD/AAD//v8A/v8FBAQA/v8AAP8A/v8AAAD///7+AP8AAAAAAAABAAD+/wAA/gAB/wH//QD///7///7+/v//AAD9//7+/f///f//AP7/AP/+//7//gAA/v/+/f7//f4A///9/v79/v/+/v///v3//v7+/v/+//3+/v7+/v////7//v///v3//f3+/f///wAA//3+/f7//v///wD+//7+/v7/AP8A//4A/gD///7//v3//v7+/wAA/gD/////////AP/+/v8A/////wEAAQD8/Pvy7e8A//87OztUVVL+//8BAP8AAAD/AP8BAAAAAP7/AP8BAAD+AP8AAAD+/v//AAD/AP8A/wH/AQD//gD/AAH//////wAAAQEAAAEBAf8TExQAAP8AAP8A//8AAAHq6Ojs6+v/AP8AAP8AAQAB//8B/wH+AP7/AgD/AAH/AP8A//8A/wD//wAA/wAA/wAAAAAB/wD///8AAAD/AP8A/wAAAAAAAP8AAAABAAH/Af4AAAD+AP8B////AP8BAAD/AAEA/gEA/wD/AQABAP//AP8AAAH//gEAAQAA////AAD/AAEB/wH////+Af8AAAD/AP4A/wAA//8AAQEAAAAAAAAA//8AAQD/AAABAAAA/wAAAAAAAAEcHByPj44XFRUAAP8A//8AAQAA//70+QFxnfqiwQIA/gAA/wEBAAEBAAIAAQABAf8B/wABAAAA/wACAP8AAP8aDwAeFQIAAAEA/wAAAP8AAP/Z19j/AP8AAQAAAAEBAAH/AAAAAQEB/wABAP8AAAAAAAAA/wABAP8AAAABAAAAAAD/AAEA/wAAAAEAAQABAAD/AAH/AQAB/wAAAAEAAQABAAD/AAD/AAD/AQAAAQH/AQEAAAAAAAEBAQAAAP8BAAEA/wH/AAAAAAAAAAABAQAA/wABAQD+AAEAAQABAAABAACtrq////4A//8A/wABAP8fEhU+HiEA/gAAAP8BAAAB///W6eZ1urDB39sA/wABAQE1JQGSXfwMBQIA/QAA+gEA/AAAAf8AAP4BAgAAAP8BAf4A//4AAP4AAP8A/v8B//8A/wIBAQQBAAD2+AGWvgBIj/uOv/zr9f0BAP4BBgL+QCb/ekQASiYADQMAAP4AAP0A//8AAAAAAP8A/v8AAP4AAAEAAAAAAP8AAf8AAf8A//8AAP8AAf8A/v8AAP8AAAAA/v8AAf8AAf8A/wAAAQAAAAAAAAAAAAAAAQEAAAEAAP8AAQD/AAAAAAAA//8AAAAAAf8A/wAAAQEAAP8AAP8AAf8AAP8AAQABAf8AAQD/AAD/AP8AAv4AAAAAAQAAAf4AAAAAAQAAAf8AAf8AAf8AAf8AAAAAAf8AAAAAAAEAAAAAAgD/AQAAAP8AAQAAAf4B5eQA1dkAAAEAAAAAAAAIBweFhogeHh8BAAABAQD/////AQH/AQAAAAABAQEAAQD//wAAAP8AAQIAAf/+AQAAAAD//wAA/wAAAAEAAAAAAAAAAQABAQABAP8AAAD/AP8AAAEAAAEAAAAA/////wABAP8A/gEAAP8A//8AAP8AAAAA/wD//wAAAQEA/////wEAAAEAAQAA/wH/AAAAAQAAAQAA/wAAAAD/AAEAAAH/AAD+/wABAAH/AAEAAAEAAQAAAP8AAAEAAAH/AAEA/wAAAAD/AP///wD9/wH/AAAA/wABAAEAAP8AAQH//wAA//8B/wAAAP8AAAABAAEA/gAAAP7+//8AAAABAAD+/wD/AQEAAQD//wABAAD/AAD/AAAA/wABAAAA/wACAP///wAA/wAAAAD/AQD/AQD//wAAMTIvNjY1AP//rKqu9vX3AAAAAQEAAP8BAAAAAf8AAP7/////AP7+/wAA///////+/wD//wAA//8AAAAA//3+AP8BAP//AAAAAP8BAP//AP8BAAAA/wAA/v8B/wAAAAD//////wAA/v4A//8AAQEAAP///wD+//4A///+/wEAAAABAAEAAP8AAP8A/f8BAf4AAAD//v8A/wD+AQD//wAA//4A/wAA/v0AAP/+AP////7//wEB/wEBBAQE/wAA/gAA/wEB//8AAP4AAP8A/wEAAP8A///////+/wEA/f/+/wD+cadKigABAABJREFU//////8AAAD+///+//7/AQAA/wD//v4A//3///7//v7//f7+//////8A/v7/AP7///3//////v7//////v3+//3///0A//3+/f3////+//7//wD//v79/v79AP///v7+AP7+/v7//v7+//7+/v39/v7+/v/9AP3//f7+//8AAP7+AP////7//////////wD//gAA////AP3/8+3u/vn4EhEScnJwCgwMAP8A/wAA/v/+/wAB//8AAAAB/wD/////AAAAAAD/AQMA/wABAf8B////AP8A/wEA//4AAP8A/wEBAP8AAAD//v4AAgICAAAAAAABAAEBAAD/9fX1+Pj4AQAAAAAAAP8BAAABAQAAAf8BAP8AAAD/AP8AAP8AAAAAAAAAAAAAAAAAAQEB/wAAAQEBAQEB/wAAAQAAAQH/AAABAP8B/wD/AAABAAABAQAB/wEBAAEA//8AAf//AAH/AAEAAP8AAP8CAAAA/wAAAQIAAP8AAAAAAP//AAAAAAH/AAEBAP8C//8AAf8CAAEBAAAA////AAAAAQAAAQEBAP8AAAAA/v///wEAAAAAAAEAAAAAQUNBmJuZEA8QAAAAAP8AAAEBAAD+6/X/bpn2kLP8/vz+//4A//8AAP//AP8AAP8B///+AAAAAP8B////Egr/KBcBAAD/AAABAAABAAD/3t/hAgAAAQD/AP///wAAAgEBAP8AAAAB/wABAAABAAH/AAH/AAAAAP8A/wD/AAEAAP8AAQAB////AAD/AAH/AP8AAQABAAAA/wAAAP8A//8AAQEAAAD//wD/AAD+/wD/AP8A/wD///8A/wAA/wAAAAH/AQABAAAB/wEB/wAAAQAA/wAAAgAAAAAB/gAA1NTYr62xAAD/AP8AAP//AAAASiUpFQkMAP7/Af4AAAH/3O7rb7Wuv9za//8AAAIBOyz+q2v2HhH/AP7/APwBAP4BAAAA/wH+AAH/AAL+AAH/AAD/AAL+AAH////8AAAB//8A/v4A//7+1eYAW5n6bKr44PD8/wH+AQH/ACcaAGU5AGA1AA8JAAD+AAIBAAD/AAABAAH/AP//AAEAAAEAAP8AAAL+AAL/AAAAAAAAAAD/AAEAAAEAAAD/AAAAAAH/AAD/AAEAAAAAAAAAAAEAAP//AAEAAAH/AAL/AAH+AAD/AAH/AAAAAAEAAAD/AAIAAAD/AAAAAAL/AP/+AAD/AAEAAAD/AP//AAAAAP8AAAD/AAD/AQH/AAAAAAH/AAEAAAICAAD/AAD/AP8AAAD/AAH/AAH/AAH+AAAAAAIAAAABAAL/AAH/AQD/AAEAAAL/AAEB/9LaAPz8AAABAAABAAABQT8/VVhVAAIAAAEB/wABAQEAAAD+AAAAAAAB////AQD/AAIAAQEBAAD///8AAv8A/wAAAQEBAQAAAQAAAAEBAAD///8AAQD//wAAAAAAAQABAAAAAQAAAAAAAAEA/wAB/wAAAQH/AP//AAEAAQAAAAAA//8BAQEAAP8AAAEAAQEBAQAAAQH/AQEAAQAB/wAAAf///wEBAP8BAQAA/wAA/wABAAAAAP8AAP8AAAEAAQAAAQD/AAEAAf8BAP//AAAA////AAABAAAAAgH/AAD//wD//wAAAP8BAQD/AQAB/wEB/wAAAQEAAAAAAAAAAQEBAAABAAAAAAH/AAABAQAAAQAAAQD/AAEA/wEAAAAAAQEAAAAB//8BAAEAAv4B/wAA/wAA//8BAP8AAAAAAAAAAAD+/kdGRgEAAc/Qzr7AvwEAAP7/AAABAAD/AQABAP8AAAD/AP///wD9/v//AAABAf//Af//AAEAAP/9//4A/wEAAP///////wD///8AAP///v///wAAAAD//wD/AP8A/wAA/wD///8B/wAA///+//4AAAH/AAAAAAAAAQD//////v//AAAAAAAA/wEA//8B/wAAAAAA///+AP7/AAD+AAD//wD//wAB/wABAP4A/wABAP///gAA/gcHBwAA/wD/AQD+/wEB//8AAP8AAP/+/v7//v4A////AP/+/gEA//8BAAD/AP7////////+/v/+/v///QD/AP/+/v8A///+/v/+/v7/AP///v7+/v/+/v3//gD//v7+/v/+/v79/v/+//3+/v///f/////+///9/v7+/v38/gH+/////v39/QD+/////wH+/gH+///+//7//wD+//78//4A/wH/Af/+/v7+//7//v7//v///gD//wD+/gH/AAEBAff09Pn19QABAVtcWy8uLQEA//8A////AQAAAgAAAAAAAP/+/wEAAAABAAAA/wAAAP7/AQD+//4A/wABAf8A/wAA/wEA/gAAAP/+//7+////AP7/AP7+/wAAAgABAAEAAAAA//4A/v8AAP7/AAABAQAB/wAA//4A/wAAAQAAAQAAAAAAAAABAQAAAQAAAQAAAAABAQAA/wAAAAD/AP8A/wEAAQABAf//AQEAAAECAAEB/wAAAAD//wABAAAAAAEAAf//AP8AAP8BAQD/AQABAP8AAAAAAQAAAP8AAAAAAAAAAAD/AAAAAAD/AAEAAAAB/wAAAAABAAAA//8A/wEAAAAAAP//AP////8A/wAA/wIAAQEAAAABAAD/AAAAAAH/AU9PTqutqiQjJAAAAAD/AAAA/wEAAPP5/Xal94ev/f78/wD+/gD+AQD/AP///wH/AQAA//8A/wEAAAECABsRAQAAAAAA/wAAAAAAAdTT0+Hh4v4AAQABAAH/AP///wAA/wEA/wEAAP8AAP//AAD/AP//AQAAAf//AQEAAQABAP4A/wAAAAD/AAD/AQAB/wD/AAAB//8A/wAAAP8A//8AAAAAAAEAAAAAAgIAAQAB/wAAAQABAQH/AQEAAAAAAAEA/wABAAD/AAD/AP8AAAAAAAABAAD//wD/AKCho/Dw7wD/AAAAAAAAAA0GCVInLf7//wAAAP8B/9jt6W+3rtTp5AABAQAB/kcz/aBi+x0SAQD+Af//Af/+AAAAAAAA/wEA/QAB/QAA/QAB/gAA/QAA/wD//wAAAf///gD/AOryApG9AFCV+rLX/P8B/gEB/gEVDf5ZM/9yPP83HAAD/wAB/QAC/wAB/QAAAAAC/wD//wAB/wAA/wAA/gAB/wD//wAA/wAB/wAA/gAA/wAA/gAA/gAAAAAB/gACAAABAAAC/wABAAAAAAAA/gAA/wAA/QAA/wAAAQD/AAAA/gAAAQAAAAAA/wAAAAAAAQABAQAA/wAAAAAC/wABAAAB/wAB/gACAAAB//8C/wAAAAAB//8BAQAAAQAB/wAB/gAA/gACAQAA/wAB/wAB/wABAQAAAAABAAAB/gAA/wEC/gAA/wD///8A/gAC/gABAQDx8QDQ1wAA/wAAAAAAAAAA/01PTQEBAgAAAAAAAAABAP8BAAD/AgH/AQAAAAAAAAD/AAD/AP//AAEAAAAAAQAAAQEAAQAA//8AAP///wH/AAAAAQEBAP8AAQEAAAAAAQAAAQD/Af8AAAAAAAD/AAIA/wD/AAD/AAABAgD/Af8AAQEAAQAA/wD/AAEB/wAAAf////4AAAD/AP/+AP///wEAAf4BAQEA/wAAAAAAAAEA/wIAAAD/AAAA/wEAAAD//wAA/wD/AAD+//8B/wECAQAB/wABAQAAAAD///8AAAAAAQIBAQD//wABAP8AAP8B/wEAAAABAAAAAv8AAAAAAAAA/gEA/wEBAP///wD/AP8AAAEAAP8A/wAAAAH/AAAAAP//AAAA/gEA/wAAAAIA///+/gD+/wAA/wEAAAH/AAD/Af/+AP9CREEcHh4A/wGjoqT29/gBAAAAAP8BAgEA/wEBAQD/AAH/AAD/AQAAAP////8A/v4AAP/////+Af4B/wD+/v//AP/////+/wAA/wD/AAAA///+/v8AAP///////wAA/gD/AP4A////AP8AAP8A/v7+/wD+//7/AAD/AP8BAP8A/gD/AP//AP///v8A/////v/+/gAAAQAAAQD/AP//AP////4B////AAAA/wAAAP8A//8BAAEICAkA/wD/AP79//7+/v4AAP8A////AAD/AAAAAP//AP///wD+AAAA/P8AAP4A///+AAD///8A///9/v/9/v7/AP///f/9/v7//v3//vz9/QD//v/9/v7//f39/v7+/v3+/v///f/////+/v79/f79/f3+/f7+/////f7///7+/////f8B/gAA/v7+/v7+/v4A/v8A/v8A/v/9/v4BAP///f/+/v3//v4AAP////8A/wAA/v4A/v8A/wH///77+vn18O8A/f40MzJiYV/+//7///8AAP8AAf8A///////+AP//AQD+/gD+/wAA/wD//wAA/wAAAQAAAP//AP8B/wH/AAD+AAH/AAAA/wD/AAD/AAD//wD//wAAAP8A/wD///8AAAEAAQH///4A//8AAP8AAAEAAQACAAH/AP8AAP8AAAABAAEAAQEAAP8AAAAAAAD/AP8AAAAAAQH/AAAAAAAAAP////8AAP//AAEA//8A/wIBAAEAAQEA/wAA/wH/AAABAAABAAEB//8BAQABAAEBAP8AAAAAAAD/AAD/Af8AAAAAAP//AQAAAAH/AAEAAAEAAAAAAAAAAAABAAEAAQAAAQAAAAD/AAABAQEAAAD/AQAA//8AAP8A/wAA/v8AAAD//wFDQkOYmpcSEhQAAP8AAAH/AP//AAD7/f+Crfdvn/fu8v7//v//AQAAAf///wAA/wABAAD//gD//wEhFAMAAAAAAAAAAAEAAALw7vDQ0NEBAAABAAEAAAD/AAAAAP//AAH/AAABAQABAQEBAP8BAAAAAP8BAf//AAAB//8BAAAAAQD/AQAAAf8A/wEBAAAA/wEBAP//Af8BAQAAAAEA/wAAAAEBAAD/AAAAAAAAAP8BAP8AAP8A/wAB/wD//wAAAP8BAQD/AQAAAQAAAAABAAD//wDY2NmfoaMAAP8AAP8AAP8AAf5CIyUrFxkB////Av7L5eFvtKvO5OAA/wAA//5ONQCjZfsiFP8A/QEA/QAB/AEBAQEAAAAAA/4AAAABAAAAAAAAAP7/AAAA//4AAP4A/v/+/gC51AJQlPhxrPfd7PwCAf8BBQL+Qyj/dUAASiYACwQAAf8A//4AAP8A//8A//8AAP8A//8AAQAAAf8AAP4AAf8AAP8AAP8A/wAAAf8AAAAAAP4A//8AAAAAAP8AAQEA/wAAAf8A//8AAP8AAf8AAAAAAQAAAgAA//8A//8AAf8AAQEAAf8AAP8AAQAAAP8AAf8AAQAAAQAAAQAAAAEAAQAAAQAAAAIAAP8A//8AAQEAAgAAAQAAAf8AAP4AAAAAAQEAAQAAAAAAAv8AAf8AAgAAAAAAAQAA/wAAAQAAAQD/AAAAAQEAAgEAAgAA/wEAAP4Axs8A8/MAAAAAAP8BAAA2MzRUVVUAAQH/AAEAAP8AAP8B/wEBAAD/AP8A//8AAQD/AAEAAQABAAAAAAH/AAD/AAAAAP8AAAEAAAAAAQD/AP8AAAH/AP8AAAH/AAEAAP8AAP8AAv//AP4AAQAAAAD/AP8AAQAAAAH/AP8BAP7/AAAAAAABAQEAAQEAAQAAAP8BAQEAAAAAAAAAAwAAAQD/AP8AAAH//wD/Av//AAAAAAD/AP4BAQD/AgH/Af8AAP8A/wEBAQEAAQAAAAAA/v8B/wEA//8BAAABAf8A/wEB//8AAAABAgEAAAAAAAAAAAD/AP8BAAD/AAAA/wAAAAD/AAAAAAAAAP8AAQIAAP8AAQEAAAABAAEAAAAAAf4AAAABAf8BAAH/AQEAAAACAP8BAQAAAQAB/////wD+////Av8AAAABGBYWQkNB/wD/0tLTv7/C/v8A/wAB/wAAAAEAAAAA/wEAAAAA/wH/////AP7//gAAAP7/////////////AAD+//8A//7/AAH//v/+AP////8AAAD///8B/v/+AP8A/gD/AAAAAAD//v4A/gD//wD/AP//AAEC///+//8A/wAA/wL//wD/////AAH//wD/AAH/AQD//v/+//7+AAD//v//AAAA/wD/AP7/AQAA/v///wEAAAAACwoKAAD///4AAQABAP8AAf//AP//////AP4A//7/AP//AP8A//0A/wD//v7///7//v7+/f///f7/////AAD+/v3+/f/////+/f7//v7/AP7+/v/9AAD+//7//v7///7///7+//7+/fz9/vz+/v7+////AP/+//3+///+//3+//3+//79/v7///3+//39//7//f7+///+//7+AP8A///////+AP///v8B//7+AP////4A/v8A/v//////Af7/9+7wAPz9AwMCXFtaDA0LAAD//wABAAAC//8AAAEAAAAAAP8AAAABAQABAAAA/wEAAAAAAP/+////AAAB/wD//////wAAAAAA//8BAAD/AAAA/v8A/wD////+AAAAAAAAAAABAAAB//7+AP//AQIAAP8AAQD+/wAB/gD+AgEAAQEA//8B/wAAAAAAAQEBAQD/AAEAAP8A/v8AAAAAAQAA//8AAAH/AAD/AQH/AAH//gD//wAA/wD/AAAAAAH/AQH/AP//AAEAAAH/AAEA/v//////AAAAAAD+/wEBAf8AAv8CAAEAAQIBAP//AAAAAf//AP//AQAA/wAAAAABAAAAAAAAAP8BAAAAAQEAAAD/AAABAAAAAAABAAABAAEAAAIB/wEAAQAA/gAAQkFCpqekKikqAAAAAAAAAAAAAAAA+/3/lb36XJT42eT9Afz/Af4BAP///wD//v7/AQAAAAAALBwDAAD/AAABAAD/AAAA/wD/zczOAQAA/wAA/wEAAQAAAAAB/wH/Af//AP///wAAAAAB/wAAAAABAAABAP//AAEBAAEBAQABAQABAQAAAQAA/wAAAAEAAAACAf8A5eXm5+fnAQEBAAAAAAAAAAD/AQAAAP8B/wAAAQAB/wEA/wEAAQEBAQAA/wD/AQAAAAAAAAAA/wD/9/j3fX6A7+zqAAAAAP8BAP//AP8AQyMoAP7//gH+qtXPYa+k0uflAP8CAAAAUzf/mmD7FQgBAP8A//8AAP8A/wD/AP8AAAD/AP//AAD//wD+AAD//wAAAP///wEBAf8C2OcDb6UCV5n5yeL8AAD9AQH9/hYN/2A6AF4yABkJAAD9AAD+AAD/AAH/AAAAAAAAAAEAAAD/AP/+AAD+AP7/AP//AAD/AAD/AAH/AAD/AP8BAAD/AAABAAIAAAD/AAAAAAD+AP//AP8AAAAAAAD/AAD/AAH/AAH/AP4AAAEAAAH/AAD+AAH/AAEAAAD/AAEAAAAAAP8AAP/+AAAAAAEAAAH/AAH/AAD/AAH9AAH/AAAAAP/+AAAAAAD/AP8AAAH/AP//AAD/AAABAAH/AP8AAAH/AAAAAAH/AAH/AAIAAAEBAAAAAAD/AAH/AAD/AAD/AAL/AObpAM3UAAAAAAABAAAABwYJdHZ0FBQUAQAAAAD///8BAAAB/wH//wAAAQABAQH/AAABAAAAAf8A/wEA////AAH/AQEAAAABAAAAAAABAQAAAAEAAAD/AAACAQD/AAD//wAAAAABAP8BAQABAP8BAP//AgEBAQABAQIAAP8B/wABAQAB/wEA/wH//wAA/wAA//8AAP//AQAAAAAAAP4AAf8AAv8AAAD/AQEBAf4BAQAA//8BAAABAAAAAP8AAQEB//8BAAEA/gEAAAABAf8A/wAA/wIA/wABAAAAAAABAQEAAAEBAAD/AP8AAQAAAQAAAQAAAAAB/wEBAAD/AQEA/wABAQEBAAAAAAACAP7/AAEAAAD//wAA/wEBAQAAAAABAAAAAQAA/wEAAQAAAP/+AgAA/wAAAAD//gAA/wD+AAEA/////wD//////0hHRQICA/7+/ZeXl+Pj4gD/AAD//v////8A/wH/AAAA///+AP///////wAA//4A/wAA/wD/AP8A//3//v8A//8B/wD+/gD///8AAP8B//8AAP8A/wEAAf8A/wAAAP/+AP7/AAEAAP//AP8AAf8A///+/v8AAP///////////v/+AAAAAf//AP/+Af7+/////wD/AP4AAP///wEBAP8AAAD/AAAAAf8AAAH/AAD//wAAAAkJCQUFBQAA/gAAAP8B//7/AP7//wAA////AP//////AP7//v///v7////+/v/////+/v/+/v8A//////39//3////+/P79/f/+/v/+/v3+/f/+///9//7+///9/f39/v7+//3+/v////4A/v7+/v7+/f7+/v/+/f7+/v/+///+///9AP/+/v3//v/+AP/9/gD+/wD/////AAD//v/+/wAA////AAEA//8AAP/+AQD////+AAD+/gH///Xw8fz59wAAAFJSU0NFQ///AQH/AQD/AP//AAD/AP/+Af/+/wABAQD+/wAA/gAAAQD/AP4AAP8AAAD/Av8AAAH+AAAA/wH//wD/AP8A//4A/wAA/wD+AP4AAfT09gAAAAABAAAA/wAA/gD//f38/gEAAQABAAAAAQEA/wIBAf8AAP8AAAEB/gAA/wEAAP////8BAAD/AAEBAAIBAAD//wAAAQABAP//AQAAAP//AgD/AAIBAQAB/wD/AP8A/wEAAf8AAQAAAQAAAAD/AAD/AAEBAAABAf8AAf8AAQEAAP8AAP8B/wD/////AAEAAQAA//8AAAIAAAAAAQAA/wAAAAAAAQAAAP8A//8AAAAAAf8AAQAAAAAAAAEB/wEA/wABAP//AAEA/wAAAAMBAAAA/0VEQ6SmozIzMgIAAQAAAQAAAAAAAAEAALjU+kmN+LbO/v///gABAAD/AAEBAgD//wH/ACEWBAcEAQAA/wAA/wAAAQAAAMnLzP8A/wAA/wAAAAAAAAAB/wEAAP8BAAEA/wD/AP8BAQAB/wABAAD//wAAAf8AAAD/AP8AAAD/AP8AAAAAAAEAAAD//wAA/wEBAXp7flhZXsHExQEAAP8AAAAAAAAAAQAAAAEAAQABAAEAAAAAAf8A//8AAAAAAQAA/wD//gAAAAEAAaSjpq6srgAA/wAAAAAA/wAAAhsOE0EeJPb9+Z7Ox3q6ru328wD//gIB/mhFAZti/hcKAAD+AAH+AAH/AQD/AAEAAP8A/gAA////AAABAAAAAP///wD//gAA//r7/5jAAEqM+pXB+PL7+wAB/gEDAv81HwB1QwA+HgAD/gABAAAAAAAA/wAA/wAA/wAA/gAA/gAA/QAA/gAC/gAC/gAB/wABAAAB/wAB/wAAAAAB/gAC/gABAAAB/wAAAAABAAAA/wD/AAD/AAABAAABAAABAAAB/wAA/wAA/wAB/wAA/wAB/wAAAQD/AAAAAAACAAAAAAAA/wAA/gAA/wACAAAAAAAA/gAA/wD/AQABAQAA/wAC/wAAAAAB/gD//wAB/wABAQAD/wAAAAAA/gAA/wAC/wAAAQAAAAAAAAABAQAC/wABAAAB/wAC/gAAAAAC/wACAAACAADEzwDy9QAAAQAAAAEAAlVWVFRVVgABAQAAAAD/AAEBAAD/AAD/AAEA//8A//8AAgD/AAAA/wABAAD+/wEAAAH/Af8AAAAAAAEA/wAAAP8AAQD/AQAAAQAAAP8AAQH/AQEBAAEAAAAA/wABAAEA/wAAAf//AAAAAP//AAAB//8BAAABAAD//wIAAAEA/wD+AAEBAQAAAP8A/wAAAQEA//8AAP4AAAAA//8B/wAAAAAAAQEBAAEA//8AAAEAAAD/AAAAAP//AAL/AAEAAf8A/wAB/wD/AAEAAP8AAAAAAf8AAQAA//8AAf8AAAAAAAD/AP8A/wH//wH//gEAAAAAAAH//wD+AAAAAAD//wAAAAD/AAEAAQD/Af//////AP8A/wEAAP4AAQD/AP8BAAAAAQL/////////AAAA////AP///wD/AAAA/wD/AAA0NDM1NTMBAADa29uGhoja29oAAAD///4BAAD/AP7/AAAAAAAAAAH/AP///gD//wD/AP/+AP////8AAQH+/wD////+///+/wH+AP///wD+//7//f3+//7//v4AAP//AP////////8AAAAA////AAH/AAAA//8A////AP/+/gD/AP/+/v7//wD/Af8AAAH/AP8A/wAA////AAD//gEAAAD/AAAAAP////4AAAAAAAH/AAAUExQODg///wAAAAD+/QAAAAD/AP/+/gD/AP3//wD//////wD//v8AAP/+///+//3///3//v7//v3+/v79/v3//v7+/v/+//7+/v/+///+/v7+/P78/P3+/f/+/P7//f7+/P3//v7+/P0A/f7//f7+/f///v3+/v/+/f/+/f7+/v7+//7//v0A/v////8A//7///////8A//////7//////f///v///v7///////7+AP8B/wACAQH69vb79vUAAQExMzNxc24FBgf/AP//AQD///8A/wD/AAEAAf8AAQH+/wD/AQH+/wEA//4A/wACAAAAAQH+Af7////+AAD/AAD//wAAAAAA/wAAAAD/////AQAB//////4AAQAAAAAAAAAAAAASEhQSExL/AAEA/wD/AAAA/wD//wAA/wD//wAAAAH/AAD+AAABAQAA/wAAAQEA/wD//wAAAQABAf8CAAABAQAAAAIAAQABAQD//wAB/wD/Af8BAAAA//8B//8BAP8AAf8AAQH/AQH//wABAP8BAQABAAAAAAAAAAH//gAAAAEAAAEAAAH/AP8BAQD/AQAAAP4AAP8AAf4BAP8A/wEBAP8BAAAAAAAB/wAA/wAAAP///wD/AAAA//8B//8AAAEAAP//AAAAAQEBAQIwMDCYmZcnKSoAAAAAAAEAAP//AAAAAAHg6/xYl/R7p/r19f8A/wAA////AQEBAf8rHQUtHAUAAAAAAAAAAP4AAADT0tPl5eYAAAD//wEAAQEAAAIA/wABAf//AQEAAP///wAAAAEAAAAAAQH/Af8A/wAAAP8BAAAAAAAA/wD/Af8AAQAAAQH/AQDZ2dqzsrXEwcFRUVOkpKYA/gAAAP///wAAAf///////////wABAAAA/wEAAAAA//8A/wABAQIA/wDX19mDg4YAAAAAAQAAAP8AAAAAAP9MLi/p+vJntKiBwLX2+vsA/v8NC/+DWf+LV/sPBwAA//8A//8AAAAAAP7/Af//Af4AAAAAAf8BAf4A//8A/wABAAEA/wHZ6QBknwBto/zg8QAAAP8A/gIAHBP/ZTsAZjoAFwoAAP4AAf8AAAAAAgAAAf8AAQAA//8AAP8AAP8AAAAAAQAAAP4AAAAAAv8AAf8AAAAAAP8AAP8AAf8A//8AAf8AAP8A//8AAP8AAQAAAQAAAQAAAP8AAAAAAf8A//8AAf8AAP8AAAAAAf8AAAAAAQAAAv8AAP4AAP8AAP4AAgAAAQAAAQAA//8AAP8AAQEAAQAAAv0A//8AAAAA/wAAAQAAAQAAAf8AAf4AAf4A/wAAAP0AAf4AAAAAAAAAAv8AAP4AAf8A//8AAAAAAf8AAQAA/wAAAAAAAAAAAQAA5OgA0NgAAAAAAAAAAP8LCgpjZWMAAAD+//8A//8BAQD/AAABAQABAQH/AAEAAAEA//8AAQAAAAEAAP8BAgEAAQEBAP8A/wAAAP//AAEBAQAAAP8BAP8BAAAAAP8AAAD/Af8AAAH/AQD//wAA/wD/AAD/AQAAAAAAAAAAAP8BAAAA//8A/v8AAAD//wAAAAABAQAAAAAAAQABAAEAAP4AAQIBAQEAAAAB/wEBAAAAAQAAAP////8BAAEAAAD/AAH/AAAAAgAAAAH/AQD/AP8AAQAAAAEB//8AAf8BAQAAAAAA/wABAAIBAAEBAAD//wD/Af8A/wD/AgEAAAEAAAAA/wAAAQAAAQAAAQEAAQAAAQD/AAAAAP8AAf4A/wAAAQAA/wH//wAAAAAAAQEA//8BAQACAAAAAAAA/wD//gABAAAAAP/+AAAAAAAA////CAkHZGNgCAkJAgEAwMLEb3RyyczLAQEC/f7/AQEBAAAAAP///wD//wAA/wH//wD+//4AAP4A/v4B//3+AP7+//8A/wAB/wAA//0AAP7+AP8A/wAB//8A/wAA/v8AAP8AAAD//wD////+/wD/AP//AAD//////gAAAP8AAP////8A//8AAQD///7+///+/v///wAA////AP//AP/+AAD/AP//////AAD//wH/AP//AP//Dw8QFxUV/f/+/gD+AAD//v7/AP8A/wD///8A//7///7+//7+/v/+/f39/wAA/v8A//8A/v///v4A/f/+/////fz++/v9/f3////9/fv9/f3+/v79//7//v39/v7+/v7+//7+/v3+//7+//z+//7/AP////3///3+AP7+AP7/AP3+AP/+//////8A/v///f//AP///v7/////AP8BAP//AAAA//////////3/AAD/Af//AP//+vn4+PTyAAD/FhYVe3p3EhISAAH/Af8B/v7/AAAAAQAAAP///gAAAAAAAQAA///+/wAA//8A/wEA//8AAP//AAEBAAABAP//AP8AAAAA/gAA/wAA//8A/v8A/v/+/wAB9fX0AP8AAAAAAAD/AAEAExMUDw8OAQD/AQEAAQAAAAEAAQAAAAEAAQAAAAAAAAAAAf///wAAAAEBAQD/AQAAAQAAAP8A/wAA//8AAP8BAAAAAP////8AAAAAAAD/Af8BAP8BAAAAAAAA/wAAAP8B///+Af//AQEAAP8AAP//AAEB////AQEAAQEAAAAB/wD/AAD/AAAB//8AAAAA/wABAAABAAAB/wAAAAH/AAAB/wEA/////wD//wH/AP8BAQAA/wABAAEBAAIAAP//AQEBAQAAAAAAAAEAAAAANDIzr7GtQ0REAAAAAAABAAABAAAAAQAA8/j/h7f2XZf12OX+AP//AP8AAP8CBQMBNyMFAAAAAAAAAAAAAAAA5+fnxcTHAAABAQH/AAAAAf8AAAAB//8BAAAA/wABAQD/AP//AAD/AQAAAQABAAAA/wEB////AAEAAAAAAAAB/wAAAAD/Af8B4d/h8O/tAAAA7+ztZmdriIuO+/r8AAEAAP8BAAEBAAEBAQH//wAAAAAAAAAAAAEAAQEB////9/j4goOG5eXlAAD/AAAAAAECAAD/Ew4QExIOYa2mu9nU/Pz8AP//GRb8p3D/eEr8CwYBAQD/AAD//wIAAP8A/wAAAAD/Af8AAAD+//7/AAAAAAEAAAAA/gD+t9MAS47/pMf9/AD/AQH9AAP/AD0jAHdAAD0gAAkDAAIAAAD/AP8BAAD+AP/+AP//AAD+AAH/AAH/AAD+AAD/AAH9AP//AAD/AAD/AP7/AP//AP//AAH/AP4AAAD/AAAAAAH/AAEAAAD/AP//AAH/AAH/AAAAAAD/AAD/AAEAAP8BAAIAAAD/AAABAAD/AAD+AAAAAAAAAAH/AAAAAAEAAAEAAAEAAAD/AAH/AAD/AAD/AAAAAAEAAAABAAP/AAD/AP//AAIBAAABAAAAAAEAAAABAAAAAAH/AAAAAP//AAEAAAAAAAEAAAAAAAEAAAH/AAIAAQH/AQEAAAABAM3WAPr7AAD/AAD/AAABR0lIPz49AAAAAgEAAAEA/wAAAP/+AP//////AQAAAAD/AAEA////AQAA//8B///+AP8AAAABAQAAAAH/AQEA/wD/AAAA/wEA/gH+AQAAAP//AQEA//7/AP8AAQEAAP8A/wD/AAEAAAAB/wD+AAAAAAAAAgAB/wD/AAABAAAAAAEBAAAAAAAAAAABAAAAAQAC/wH/AP/+AQEAAAEAAP8AAAAAAAAAAAH//gAAAAD/AAD/AAAAAf8BAgIA//4AAAEAAQABAAD//wEBAf8BAP4AAP//AAEA/wD//wEAAAABAQEAAAABAAAAAP8AAAAAAP8AAAEAAAAAAAD/AP//AAEBAQAAAQAAAAAAAP8BAAEAAP8BAQAAAAAAAQABAAD/AAD//wAAABaE6XsCAP///wH/AQABAQAAAAAAAAAA/////wD/AQAAAP//R0dHOjw7/wECAwQE7e7ykpubr7i2+fv6AAD/AP//AAAAAP//AP8A//8A//8A/v///v//AAH//gD//wD//v/+/v7//v/+/wD+/gD//v4A/wD/AAD///7//////wD+//7/AP7/AP8BAP7//f79/wAA/wAB//////7/AQAAAAD+AQD////+///+AAAAAP8A/wD+Af8A/wAA/wL//////wEA/wH//wAB//7//v/+6eno09TS9fT0//z8/fz9/v/+/gD+/v7+/////v///wD+/v///v/+/v////7+/v39//7//f7+//7//v79//3//fz+/gD+///9//7+/f3////9//7+/f3+/v79//7+/v7+/v39/v7+/v79/v///v/+//79//39/v79//7//v7+/v79/gH+/v7+//7//v/+AP3/Af8B/wD+AAD/AP/+////AP8A/v7/AAD/AP8AAP8A/vz+/v7//f36+vPzAP79CAkIeHd3LCwrAAAAAAAA/wH/AQEB/////gAAAAAAAAAAAAAAAAD/AAAAAQD//wEAAP8A/gAA//8AAP///wD/AAEA/wH///8AAP///wD/AAABAAABAAAB////9fb2AAAAAP//AAAAAP//BQUEBQUH/v8AAAAB//8AAAAB/v8AAP8AAP8A//8AAQAAAAD/AAAAAP4A//8B/wAAAAEAAAAAAQAAAAEAAP//AP//AAEBAAAB/wAAAAABAAAAAQH//gAA/gAAAAEAAAEBAQACAAAB/v///wEAAAAA///+AQAAAAD//wAAAAD/AQAAAAAAAf8AAAD/AP8AAQEAAQEAAAAAAAEA//8A/wAAAf8BAQEBAAAAAP7//wEA/gAAAP//AP//AAD//wEA/wAA//8AAQAAAAD/AAAAAAEAJiUlp6ekd3l3DAwMAAD/AAAA/wD/AAD/AAEBsdH8Ror2m7/4/////gD//gAAQCoFAAD/AAD/AAD/AAAAAAAAxcjH/wD/AAD/AQAA/wEAAQH/AAABAAAAAQD/AAEBAQEB//8A/wAAAAD/AAEAAgD/AAEBAAAAAAAAAAAAAAAAAAAB/wEA1dfWAAABAAAAAAAB9/b2fX1+ZGRq3dzfAAEAAf/+/wAA/wABAAAA/wEAAAABAQAA/gAA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AP8AAAAAAAIAAAAAAAEA//8AAf//AAEA/wAA//8AAgAAAAEAAf//AAAA/v8BAAEAAQEAAAAAAAD/AP8CAAH+AP8AAQAAAP///gABAQD/AP8A//8BAAD/AAEAAAABAAAAAAAAAAD/AAABAQABAP//AAABAAEA/wABAQH/AAABAAIBAf8A/wEAAP8AAAD/AAAAAP8AAAH///8CAQIA//8BAAH/AAEBAP/////+AP8BAQEBAgH///8A/wAAAQEBAAAAAAAA////AAAB/wACAAAAAQD//gEBAf//AAABAAH///8BAQAAAQH//v8AAQAEAP//AAEA//8AAQD+9vj8hYyMtrm6DQ0OChANAgUE/wIBAQABAQABAAEAAQAB/wP/Av8BAQEB/wEAAf4AAAEAAP8A/v8AxMnJ4eLkVE9NNC4vAAAA/////wEBAQD//v//AgAB//8AAAEBAAL/AP/+/wAB/wABAAD/AQD+AP4BAAH/AP8BAAAAAQD///8BAAAAAAD//wAAAf//5uXmycfH0dDP7u3sAAABAf8A/wH/FhcYLS8uJScpIyMkCwsLAAAA/////wABAP8A//8AAP8AAAAA/v8AAAD/BwcJNTQ3NTQ3V1foxcXGw8TFy8vL8/Ly/f79////AAIBAgABAgQE/wICAgEBAAAA/f7+AP3//v7+/fz//f0AAf7+//7+/wAAAf8A///+/wAAAAEA/wAAAf8A/wAAAAL/AAAB//4A/wABAQEBAP/+AP8AAAABAQEC////////AAIAAAD/Af8B/wEAAP8A/wAAAf8B/gD+///+//37AAAAAwUEc3V2PDw9AP8A/wEA/wH/AgEBAAAB//8BAAEAAQAAAAAA/gAAAAABAP8A/wEBAP///wAAAQAAAAD+//8AAP8CAAH//v8CAAD+AP8AAAABAAH///8A/wAA/wD//wAAAAABAAD/AQED+vr7/wD/AAEBAP//AAACGhgbAAABAAD/AQEAAAD/AAACAAEA/wD/AP8A/wAAAQABAAABAAD/AAABAQABAQEA/wEA/wABAQEAAAD///8AAQD/AP8BAQEAAAD/AAABAQEA////Af8AAAAAAAEAAAEAAP8AAAD/AQAA//8A/wH/AAEAAf4AAQIAAP8A//8A/wIAAQD/Af8AAAH/AP8B/wABAQD/AAABAQD//wABAAEA////Af8BAAD/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AAD+AAECAAAAAAH/AAAAAP8BAP//AAEAAAD/AP8BAAD/AAABAAAAAAEAAAAAAP8AAAAAAAABAP8AAAEAAAABABYM/00MAEIfAcvnAMjn/9HmAf8AAAD/AAAA/wAAAAD/09TSVldYcHFxdXZxDQsNAAAA/wD/AAEC//8AAf//AAEBAP8AAAD/AAACAAEAAP//AAAAAQEAAAAAAP8AAP8BAQIAAP8A/wAAAQAAAAEA/wAAAP8BAf8AAAD+AQABAAEAAAD/Af8AAAAAAAAAAAAA////AQEA//8AAAD/AAABAAD/AP8AAAACAQH/AAAAAQABAAD/AAD/AAABAAAAAAH+AAACAAD/////AAEBAgAABAAAAQAA/wD+/////v0BAP8A/QAAAAAFAQABAAD8AQEAAP7/AAD//wEEAAD7AP/+//4EAAL///7//wABAv8F/wD9AAEAAP///wIDAgH+AP8AAP8CAQD+/QECAgL/AQABAf/+/wABAf//APLs7vv5+QwKCiAgIf8A/wD/Af8A/wD/AAEBAP8AAAAA//8A/gAAAf8AAAD/AAAB//7+AAEB/gAAAP7//wEAAf/+AAAAAAAB//8AAAEAAP8AAP8A///+AAAA/wD/AP8AAf4AAAD//wEAAP/+AAAA/gEAAf4A//4BAQH//gAAAf7+/gD/AgEBAP3//wD///8AAf8AAf////8AAf7//gEAAP7//gEAAf////8B//////8AAQAA//8A///+//8AAAD/AQD///8AAP8AAP7+AQAA////AAAB/gD/AgEBAf4A/i8xNgsND/Xy8AAAAfPz8P/+AAEC//////4AAgEAAAAAAQH///8C/gD/AQECAAAA/gD/AQAAAP8BAf4A/wEAAQP/Af3+/wEB/wP///8AAQECAQAAAf////7//wAAAP8AAAAAAP//AAAB/wAAAP4B///+AAAAAf7//wD/AP//AAAAAP8AAP4A/v8A//7+APb09NfV0gD//wAAAAABARQXAI6T/drV/qipA7KuAPz9//Ly9Gppbff4+FxbWwAA/wEBAAAA//8BAQH/AQD/AAABAf//AAIAAP8B/wD/AAABAP4A/wEAAAEAAQEA//8AAAEAAf//AAEAAP//AAABAf8AAAH///8AAAEBAf8B/gEAAQAB/gH/AQAAAP8AAAAAAP8A/wEBAQAAAAH/AQAAAAAAAf4A/wEAAQEBAP//AAEBAAD//gD/AQIAAQAA/wD//wAA/wEAAQABAQD///8A/wD+AQEC/wD/AQAA/gAAAQAAAAD/AAABAP//AQEAAAEBAAACAQAAAP8A/wD/AAABAf///wL/Af8AAP8BAAEBAAAAAf8A/wD//wEAAQAA//8AAAEAAAECAf///wAA/wD/AAEB/wD/AAEBAAEAAP8AAP8AAQAAAAEBAP8A/wEAAQD/AAABAAD/AQABAP8B/wH/AAAAAAABAAEAAAD//wIBAfv7/IKAhKKiogAA/wAAAQAAAAD//hUXBJaK+ici///+AAEBAQABAgD/AgEAAv/+AAAAAAAA/gEA//8BAAD//QEAAAD+//8BAP8B////AP//AAAAAP7+/wAAAf7///8AAAD/AP4AALC4C/T0BAcOBAFZHvQvDQD9/wACAQAA/wABAQEA/wAAAP8AAQAA/wEBAf///gACAgD/AAAB/wD/AAD//wABAAD/AAABAAD/AAABAQAA/wD/AAAAAQAB/gD/AQAAAQAAAQAB/gD/AQD//wABAQD/AAAB/wAAAAAAAAABAQD//gABAQAA/wAAAQAAAAABAAAA/wAAAAAAAQD5/AG03P+y1wD8/QAA/wAA/wIA/wAAAf8uFwBSJP8mEQAAAQD//gACAQD//wAAAAAAAQAAAAABAP8CAAAA/wD/AAAAAAEA//8AAQAAAAAA/wD/AAAA/wABAAABAAABAQD+AAAAAAAAAAAA/wABAAABAAD/AAAA/wAAAAAAAAAAAAACAAD+/wAAAAAC/wD/AAAA/wAAAAAAAAAAAAAA/wAAAQAB/gD/AAAAAgAA/wAAAAAAAQD/AAAB/gAAAQD/AQAAAAAAAAAAAQAAAAAAAAABAAABAQAAAAAAAAAAAAAAAQAA/wAB/wAAAAAAAQAA/gAAAAAAAAAAAQALBf9AHgBAHwHL5v+v2QDe7gEAAAAAAAAAAf8AAPP084ODgs/Nzo+RjiIjIgIBAf8AAAEA/wABAAAAAQD/AAACAAD//wEAAAABAAAAAP8AAAEAAAABAf8A/wD/AAAAAQD//wAA/wAAAAABAAEA////AQABAQAA/wD/AQAAAAAAAAEC/wAAAAIBAf4A//8AAAIAAf8AAAAAAAAA//8AAQEBAP/+AAABAAAA/wAAAAAAAgAB/wEAAP8AAQEA/wAAAAAAAQEAAP//AAQBAP//AAAAAQH/AAH//gAB/P39AQAA/wABAQUAAf7+/QAA/wH//gD//wEDA///AAP//wD/A/4BAgICAwT++/8AAgAB/v4DBAL9AP//AgADAAAB/v//AwIB////AQMBAf8AAQECAgD8+vr18vQAAAAkJScfHh7/////AP8B/gD/AQEA/wD+////AQAB/wEBAP//AAH/AP8A/v8AAAD/AAD+/wEA/wD//wAAAAD/AP///wAA//8BAP//AAD/AQAA/wEAAQD//gAAAf////8AAAD+AAACAQD//gD/AP7+Af8A///+//8AAQAAAAH/Af7//gEBAP//AP//AP8A/gD/AP8AAAH/////AP///wD/AAD/AAD//v//AAD///8AAAAAAP7/AAH///8AAAH//wD/AP7/AAD/AP8A/wD/AAEB/gH/AP8AAAAA/wAWGhknKSvOycUAAP/n5ub/Af/+/wEBAAH/AP//AAECAP8AAAAA/wABAf//AAH//wD+/wEBAgABAAAA/gABAgD/Af8AAAAB/gD+AgABAAAA/v8AAAAAAAD/AAD/AP8CAQH+//8AAgD//v///wAAAAD//wD+//7//wD+/wD////+/v/+////AAD+/gEA///Pzczq5ucAAAEAAAAA/v4kJgMFAfcqLQGFLQAsKgOQjgLx8gLs7e1tbHAGBwZXVFX/AP8AAAIB//8AAAAAAf////8BAQH//wAA/wAAAAABAQEBAP8A//8AAQEBAAH///4AAAEAAAD+AAACAP//AAD/AAABAAABAAAAAP8BAAD+/wABAAEAAAH/Af8A/wAAAAABAAIA////AAEBAAAAAP8AAAABAAD//wABAAAB/wD/AAAAAAABAQAA////AQABAAABAAH//wD//wAB/wEBAQAAAgD//wABAP8AAAEBAf//AAEAAQEA//4AAAAAAAAAAP8A/wABAQABAP//AQH//v4BAQH/AP8A/wEBAQAA/wAAAAACAQH/AAEBAP//AAECAP//AAEA//8BAAAAAQEA//8A/wEAAP8AAQD//wABAAAAAQD//wAAAAAAAAAAAP8AAAH/AP8BAQEAAP8B/wD+AQABAP8AAAEAAAAAAQD6+/yEhYePkpIAAP8AAAAAAAEAAAEaGwOck/s2Mv8AAAABAAL/AAIB/wP//gH/AQIAAAD/AP///wIAAQAAAP4AAAH//wAAAP//AP8A/wH//v//AAAAAQD/AAH9/gH/AAH//wD+/wEBAQDQ2AYBAgEAHw34LA4A//wAAgMCAP//AAD/AP8BAQEA//8AAAAAAAD//v8AAAEAAf4A/wIAAAAAAP8AAAEA/wAAAAAAAAAAAQAAAAAAAQEAAP8AAAAA/wAAAQAA//8AAP8AAAAAAAAAAAAA/wAA/wAAAQEA/wAAAv8A/gAAAAAAAf8AAAEB/gD/AAAAAAABAQD/AAEA8PgAotYAyeMBAAH/AAEBAAD/AP7+Gg4BTSP/NxgBBwMA/v4AAQEAAf8A/gAAAQAAAQEAAAAA/wAA/wAAAP8AAAEAAf8A/wH///8AAQAAAAAA/wAAAQEAAP8AAAEAAP8A//8BAQD//wAAAgAA/wEA/wAA/wAAAP4AAAEAAf8A/wEAAAEA/v8AAQAAAAAA/v8AAQAAAAEAAAAAAP4AAAAA/wEAAf8AAQEAAAEA//8AAf8AAAIAAP8AAQEAAAAAAP8AAQAA/wAAAQEAAAAA//8AAQEAAf8AAAEAAP8AAQEA/gEAAf8AAAEA//8AAAAAAQAAAAEAAAAAAP8A/wAAAAAAAQAAAQH/NBsAKRQBsNv/vN0A+PsAAAAAAAEAAP8AAAC0trXs7O2foZ0oJyYBAQH/AAAA/wAAAf8AAQEAAAAAAAAAAAAAAAABAQH///8AAP8BAf///wABAQL+/v8BAgEA/wD//wEAAP7/AAEAAf8B/wEAAQH///8AAQEBAAD//gEAAQD/Af8B/wD/AAEAAP8AAAAAAAAAAAEAAQAAAP8BAAD/AAAAAAACAAD/AP8AAAD///8AAQEAAAD//wABAQD/AAAAAAACAP8BAAACAP8BAP8AAP8A/f3+/fv9/f38/fn7/fv8//v9/fz9AP39/vz8/fz8/vv8/vz8/f39//7+/fz7/v38/v38//3++/z9/vz9/fz8/fv8/f79/vz+//3+/v79/f79//7+/v7++PX2+/v7/v7/HR0b/wD//f//AP////8AAP/+/gD+AP//AP///gD//v///v/+//8A/v///v////4AAP/+AP8A//7//v7///4AAP8AAP8A/wAA/QAB//4A/v////7//wD//v/+AAD//v8A/////f7+/QD//gAA//8A/////wAA//////7///4AAP/+/f///v////4A/gAA/wAA/QD+//////4A/wAA//7+//3//v////7//////v7//v8B//8A//8A/////v/9/v4A//7///8A/v8AAP///wD+AP/////+//8AAAD+GRobAAAAAAAB5uXlAQAA/////wH//wAAAAD///8A//8A/wAA//4A//7/AP4A/wH///4A///+/wIA/v//////AP///wABAP8A//7///8A/gD//wD//wAAAAAA/v8A/wD+//7//v8AAP8A/v7//f///v4A/v7+///+/v///QD+/gAA/v7//////wAA2tjWAAEAAAEAAAAAAAABJyT9/v4DAP0A/f4AWVr9i4v7FRUAAP8A8vLzZ2VrsLCy//8AAP//AAEB/wD//v8AAAAAAP8BAAAAAAAAAQAAAP//AP8A/wACAP///wD/AAEBAAH/AAABAQEAAAEAAP8AAAAA/gAB/wAB/v7///8BAQAAAAAB/wEA//8AAAAAAAAA/wH/AAEAAgEAAAD/AAAAAQAAAAH/AQEAAAAB/wIAAgABAQABAP4BAQAAAf8AAP8BAP8AAAAAAgAA/wH//wAAAP8AAQAAAAEBAQAB/gABAP8A//7/AAACAAEAAAEB//8BAAAA//8A//8BAAAAAAEC/wAAAAAA/wH/AAH/AP//AQAAAP7/AQD//wAAAQD///8AAAAA/wAAAAEAAP/+AQEBAAEAAAABAAABAAAA/wAA////AAAA/wD/AAABAAAAAAH//wAB//8A//8AAAEBAAABAQABAAAAAAAA9fX2bm5xhIaH/Pv6AAABAAAAAAAAEhL/lYv/SUH/AP8CAP8C//8EAP8E//4CAAAD/wAE/wECAQAEAAEDAP8CAQABAAACAQABAAAC/wAB////AAAAAAAB//4B//8AAAAB/////f///P4A/P0C+fcCAQEC/voAAgH/AQAC/wH//wD//wAAAf8BAP///wABAQIBAAAAAAABAAEAAAABAAD/AAD/AAABAAH/AAIAAAH/AAH/AAD/AP//AAAAAP8BAP//AAEAAAD/AAAAAAD/AP//AP/+AAAAAAD/AQAAAAD/AAH/AP4AAAD/AAD/AP8AAAAA/wL/AAEAAAH//wD/AO/3AJPNAsnj/wAB/wD/AAD/AAAAATQaAHU0/z4bAAcC/wD/AAEAAAH/AP4BAAEAAP8AAAD/AP//AAD/AAD/AAECAAD/AP8AAAD+AAABAP//AAAAAAH/AP/+AAD/AAD/AAEAAAAB//8AAAD/AP4AAAD/AP//AAAAAAABAAABAP8AAAABAAEAAAEAAAAAAAAAAAAAAP8AAAD/AP//AAEAAAABAAH/AAAAAP8AAP//AAD/AP8BAP/+AP8AAAAAAAAAAP8BAP8AAAAAAAD/AAD+AAEBAAAAAQAAAP/+AP8AAP//AAH9AAAAAAD+AAAAAAAAAAH/AAD/AAD+AAABAAD/AAD/AP//AAD+AAH+AAwF/1srAHM3ACYVAQD/AAD/AAAAAAAAAAD/yMrIWFhczc3O/wD/AAAAAQEAAQAAAAD/AP/+AAAAAP//AAD/////Af8B/wEB//8BAQEAAP//AQEAAAD//wAAAAH/AQACAQD/AQAB/wEAAAEBAgIBAQD//wEAAQEAAQD/AAAA/wD/AAAA/wAAAAAAAAD//wAAAf8BAP8AAAEAAAAAAAAA/wD/AP8AAAAAAQABAP8AAAABAAD/AAD/AAAAAAAAAv8AAAD//wABAAEBAAD+/wEAAf/8/f36/f38/f35+/z8/AD+/f39/f/9/v77/v78/f78/f78/vz7/AD9///8/v78/f39/P/8/f38/P77/f79/v38/f38/P39/f79/v7///7//v79/vn09v37+gD+/goJCv7//wH/AP7+AP4A/v//AP/9//7//////wD///7+AP////3+/f////////0A//7/AP8A//4A//8A//8AAP7+AP7/AP3+/wD+///+/wAA//4AAP4AAP4AAf4A/////v8AAP4A///////+///9//////7+/wD/AP7///4A/////////v7/Af7///7/AP/+//79AP4AAP7///3+/v3/AP0B////AP8AAP7+AP8A//7+/v3+/v7+//4A/v//AP8A//7/AP//AAAA//7/AP7/AP4A/wAAAAAB/v4A/xkbGwAAAQAA/vXz8fn4+v8A//7//wAB////AP////7/AP7/AAABAP8BAP4A/v///wAA/v8AAQD+/gAAAP8A////AP4AAP7/AP8AAP4A//7/Af////8A////AP7//wD+AQD/AP8A//3///4A//8A//4A//4A//8BAP0A/wD/Af7///8AAP3//fX19M7IyAD/AAD//wAAAAAAABkZBAD/AP7/AP//Af/+AD9BAICA+hET/wD/APLx821tcsC/wv8AAP8AAAEAAAEAAAH/AQAA/wABAQAAAP8AAQEAAAAAAAEA/wABAQH/AQD/AAAAAgAA////AP//AQAAAAH/AAAAAP8A/wEAAgAAAQABAP8AAP/+/wEA/wABAAAAAAEAAAEAAf8A/v8AAAAA//8AAAH/AAAAAAAAAAH/Af4A//8AAP8BAAAAAP8AAQAA/wAA/wABAP8B/wEBAAEBAAEAAAAAAAD//wAA/wD/AAABAAEA/wAA/wEAAAD//wEBAAAAAAABAAEAAQD+/wEA/wEAAP8A/wEAAP/9AQAB//8AAP8CAP8BAQABAf8AAQABAAH//wEAAAAAAAABAf8A/wAA/wEB/wD//wAB/wABAAIBAAIA/wEAAQD//wABAQD/AQEAAAABAAAAAP8AAAAAAP8AAAAAAPb29m1vcJmbmv/+/gABAQAC/wAAAQ0P/5KL/k9J/f8AAv8BAf8AAwABAgAAAwABBP4ABAD/AgD/A///Af//A///Av8AAv8AAv4AAf4A/wEAAf8AAv7/Af8AAP7///8AAf7//v3/Af//Af4AAP0AARweAgACBP7q+gDu/P4AAQH/AP8AAQH//wAA/wAAAAAA//8A/wAB/wAA/wAA/wD//wABAAABAAAAAAABAQAA/wAB/wD//wD//wAB/gAA/wAA/QAA/wD/AAD/AAD//wAAAAAAAAADAAAA/wAA//8B/wAA/wAA/wAB/wAA/wAAAAAB/wD//wD/AQAA/wAAAADz+gCh1ADY7f4AAgAAAAIAAQMA/wE+HP9mLAAWCQD//gABAAABAAAB/wAAAQABAAD/AAABAAD+AAD/AAAA/wD//wD+/QAAAAABAAACAQABAAAAAAAA/gD/AAAA/wAAAAAAAAD+AAD//gABAAAAAQAAAAD//wAAAAAA/wAAAAAA/wABAQAA/wD//gAAAAABAAABAAABAAABAAAAAAACAAD/AAAAAAAA/wD//wD//wAB/wAAAAAB/wAA/wAB/wAA/wD//wAAAAABAAABAAABAAACAQAA/wAA//8AAAABAAAA/wAAAAABAgAB/wAAAAAA/wABAAD//wAAAAD/AQAA/wABAQAAAAAA/wD+/wD//wAB/wAB/wAtFwB7O/9YLwAIBAAAAAAA/wAA/wAAANHRz1pZXsrKzAAAAQABAQAAAAAAAAABAgAAAQABAgAAAgAAAP8B/wH/AAEBAP//AQAA/wABAAD/AAEAAAEAAAEA/wAAAQABAAEAAAD/////AQAAAgH/AAEA//8AAAD+AAABAQEA/wAAAf8BAAAAAgEBAf8A/gD///8AAAEAAQEAAAD/AgABAP8AAQABAAEBAP8A/wACAAAAAQEAAAAAAQIAAQEAAAAA/wD/AAABAQAA/wD/AAH+/QD8+/z8+/39+vz9+vz+/Pz+/fz//v3+/f39/Pz++/z/+/37+/z9/P39/Pz++/z9/Pz+/P7+/v38/Pv+/f7+/f3+/f39/fz//P3+/P39/f36+vr//wD/AAAeHh7//wD+/wD+AP//AAD+//7+AAD+/////v7///8AAf/+AP8A/wAAAAH//wD//v7//v79////AAD+AP/+//4A//3///7///4A//7+AP/+///+/v////8A/v7+/v//AAD//v3//wD9//7/AAD/AP/+/wAAAAD9//7+AP7+/v7+AP///wD//f7//////v39//8A///9/f3+//8B/wD/AP4A/wD////+/v/////+/f///wAA//8AAP/9/QD9/v/+////AP///v/+///////+/v/+/wD9//7+/wAA/wAdHiIAAQEAAADq6Ofc29kA//8B/wH+/QD//wD/AQEAAAAA///+/v//AP//AAH+/v///wD/AAD+AAD9AP7//v7+/v7//v4AAP//AP//AAAA//7/AAH//v//////AP7+AP7+//8A/wD//////wD+/wD///8A/gH8//8A/v/+AP8A/wD+/v8AAADd29vd29cAAP4AAAIAAQIAAv8tLP7//wH+/wH+/gD9/wH//wFERAB5d/0GB/0AAP/l5eRiY2XKys4AAAD/AP8BAAAAAv8AAQD/AP//AQAAAf//AAAAAQD/Af8B//8AAAABAQAAAP8A//8BAAEAAf//AAAA/wEBAP8BAAEAAgD/AP4A/wABAP8CAQAAAQIA/wAA/wAB/wD///7//wEBAf//AQH/AAD/AAEBAAAAAP8AAAABAAEBAQAB//8AAQABAP8BAQAAAAIA/wAA/wH//wAA/wD/AQABAAAAAQD+AAACAAD//wABAQIA/wD//wD//wH///8AAAAA/wD+AP//AAEAAAAA/wAA/wEAAAABAgAAAQEAAf8A/wD///8B/wAAAAAAAQD/AAAAAAEA/wEA/wAAAAD//wH/AAAAAAAAAAH/AAD//wD/AAABAAAAAQAAAP8AAf8AAAABAAD/AAAA//8A//8A/wDZ2dpZW16gnaEA/v8A/v0A//8A/wASEwCVjf5bVP8B/wAAAAEAAAIB/wQAAAP/AQP/AQMBAAEAAAAA/wEAAQABAQIAAAD//wABAAAAAAEAAAH//wH/AAAAAAH//wH/AAH/AP//AAL//wH9/wD+/wD8AP81NPcDCAP/9wH/0fMAAP//AAAB////AQAAAAD/AP8A//8A//4BAAEAAP8AAAAAAf8A//8A//8AAP8A/wAA/wAA/wEA//8AAAAA/wAAAAAAAQIAAAAA//8AAP8AAQAAAAAAAQEA/wAAAf8AAAAAAAAAAP8AAP8AAP8AAAEAAf8AAAAAAgAAAf4AAAEA9vsAo9cBy+cBAAAAAP4BAAABDAX/YSv+YigACwQAAf8AAf8AAP4A//8A/wEAAP8A//8A//8A//8AAAAAAAAA/wAAAAAAAAAA//8A/gAA/gAA//8AAP8A/wEAAQAAAQEA//8A/wABAAAAAAEAAAAAAAEAAAAAAAEAAAAA/wAAAAAAAP8A/wAA/wAAAAEAAAAA/wAA/v8AAAAAAQAAAAEA/wAAAAAA/wAAAAIAAQAAAAAA/wAAAQEAAAAAAAEA/wAA//8AAgAAAAAAAP8AAP4A/wAA//8AAAAAAQAAAAEAAAAAAAAAAAAA//8A/wAAAf8AAP8A//8AAAEAAP8AAQAA//8A//4AAf8AAAEAAP8AAP8A/wAAAP8AAP8BCQQAUicAdj0AHA8AAAAAAAEBAP4AAP/b3NliXmPLy8r/////AAEBAQAA/v8BAAAAAP8AAP8AAAAAAAAA/wH//wEAAQH/AAH/AP8AAQABAAAAAAAAAAEAAQAA/wD/AAAAAAAAAP8AAP//AAH+AAABAAAAAQEB/gAAAAH/AP8A/wD///4A//8AAAIAAQEBAAEA//8AAQAAAf//AAAB//8AAAD/AAABAAAB/gL/AAH/AAAAAP8CAAD/AAEBAAAAAP////8AAP8AAAABAAAB//7//fv8/Pr7/fr7/vv9//39/v7///3+//39/vz9/f79//79/fz9/v39/v39/vz9/v39/vz9//7+/vz7/v39/f39/v39/f78/f3+//7++ff3AAD/AQD+EhMS/f7////+AAD//v7//gAA//////8A/gAB/v4A/v7///4A//8A/v3///////8A/wAA//////////7//v///f8A//8A/v8A/f8A//7///4AAP4A/v///wAA/wAB/v/+//8B/v//AP///f/9/v///v/+/f7///4AAP4AAAAA/v///v/+/f///v79/v///v///f//AAD//wAA/f////8A/f///v4A/gD//////wH//wAA//8A/gAAAP/+/wEA//8A//4A/gD//v3//////wAA//7+//8A/v8A/v8AIiYnFhcWAAAB+/r45eTh/wAB/f7//wAA/v////z+/v7+/v///QD//v4A/v8A/wAA/f////7+//8AAf8AAAAAAAEBAAEA/wD///7/AP8A/gH/AP7+/wEA/gD///8C/wAA/v///v/+/wD//v8AAP7+/v7//v8A//4A/f4A//7//v7+/v////4A1tDPAP//AAABAAD/AP//ExQCGBz/////AP8AAP///f4A/Pz/AAEBUFABYF0AAAD+AAD+4eDhc3N27uztAAAAAQH/AP8AAP8AAAAAAQAAAP//AAAAAP8BAQAC/wAB/wH//wAAAP//AAEBAAAAAQAAAQD/AQL//wAAAAH/AAD/AQEBAAD//wAA/wAA//8A/wD/AAH//wEAAAEBAAAAAQACAQAAAQAAAAAA////AAEAAAH/AAD/AP8AAAH//wABAAEB//8A/wAAAQAAAP//AQAA/wEA//4A/wEBAf8AAQAA/v8AAQAA/wD/AAAAAQABAAD/AAEBAAAA/wEBAgEAAQABAAAAAQEAAgIA/wAAAAEA//8AAP4AAAEAAQEB/wEA/wD/AP//AAAAAAH/AAEAAAAB//8AAQD/////AQAAAP//Af//AAABAAAAAAH/AQABAAABAAAAAAAA/wAAAgEBAAEBAgEAsbOzTExRs7CzAAABAP//AAABAAAADAwAmpH/XVUBAP4BAAEBAf8DAAAF/wEF//4FAP8E/v8B/wACAAAB/wEB/wAC/v8AAAAB//8B/gAB/gAAAP8B/gAA//8A/wH/AAD/AAAA/f4B/////v8A//8B/v8B//3+Rj/0WlT2/wH/AMDxAef5AAEA/wIAAAL/AAH/AAAAAQEBAv8C/wD/AAAAAAD/AAEBAAIAAAABAAH/AAH+AAD/AAEAAAICAAH/AAH/AAD+AP//AAAAAAIAAAEAAAH/AAH/AP7+AAD/AP8BAAEAAAH+AAD/AAEAAP8BAAH/AAABAAAAAP8AAAAAAPr9AKrZAcTkAAAA/wAAAAAAABUK/28x/0MdAAUDAAD/AAAAAAABAP4CAAD/AAABAP4AAAAAAAAAAAD/AAD/AAD+AAABAAEAAAEAAAAAAAEAAAD/AAEAAAEBAAAAAAD/AQAAAAEAAf//AAAAAAH/Af8AAAD/AP8AAAABAAH/AAIAAAEAAAABAAAAAAEAAAAAAAAAAAAAAAICAAAAAP//AAEAAAAAAP8AAAH+AAD/AQAAAAEAAAEAAAH/AAEAAP//AAD/AAAAAP4AAAAAAAAAAAACAP8AAP8AAAEAAP8AAAD/AP8BAAAAAAD/AAAAAP//AP4AAAEAAAD/AAD+AP8BAAD/AAEBAAAAAP8AAAD/AAABAAEBAP//AAAAAP////3/AP//ACoUAHQ5ACoYAAAB/wACAAAB/wAB1tnXYmJm2NjZAAH//gAAAAIA/wEAAAEB/wABAQEAAAABAAH/AAD/AAD/AAAAAf8BAP8AAAAAAAD//wD/AP8AAAAAAAABAAAB/wAA/wAAAAAAAP8A/wAAAAD/AAIAAAD/AQAAAAAAAQABAP8BAQAAAAAA/wD+AAEA//4B//8AAgAAAQEAAAAAAQEA//8A/wD+AAAAAAAAAgIBAgAAAQAAAAAAAAAAAQABAP8CAgH/AAAAAAD+Af//AP38/vv6+/v7+vz5/P36/P38/P7+/v79/f77/Pz7+/78/P78/f77/f/9/v/8/f78/P77/f3+/fz9/P38/f38/f78/f79/f79/vn39gD/////ABYWFv///v4B//7+AP8A///9AP////8B/////////v7////+AP////4A//4A//8A//7+AP/////+/wAAAP////8AAP//////AP////4AAP4A//0A/f////7+//7+//8AAP4A////AP7/AP//AP7+///+Af8A//7//v0A//39/v7/AP/+AP8A/v0AAf7+/v//AAAA////Af7+/v7///7/AAD+AP8A///+AP4A//7/AP7///4AAP/+AP//AP//////AP////8AAAABAf4AAP////8AAP//AAD///4AAQ0PESMnKwAA/wAAAezr6/////8B//8A//////4BAP4BAP///wL/AQAA/wD///7///8AAP7/AP//AP////0AAP///v/////+//7///7//gD+//4AAAD+/wD/AP/+/gD/AP/////+Af7//////v3+//7/Av4A/v7+//////7///4A/////vr8/M7LyAAAAQABAQAAAQAAATg6BRMSAf4AAP8AAP8AAQD/AP4BAf79AAQCAG1t/VZX/gAA/wAB/8bFxIKEiP7+/v7/AQEBAQEBAAIAAAAAAAABAf//AQAA/wD//wAA////AQH/AAEAAQAAAAAA////AAAAAf///wEBAAAAAAD/AAD/AQABAAEAAAAAAAEA/wEAAQD/AAD/AAD/AQEAAP7/AAEAAP8AAP8AAAABAgD/AQD+AAAAAAAAAAAAAQD//wAA/wD//wAA//4B/wECAAAAAAIAAAICAAD///4AAAAAAAEA/wABAAAAAAAAAf8A/wEAAAD/AAEAAAH/////AAAB/wABAf8BAf//AAEBAf/+/wH/AAABAAAAAQD/AP8AAAEBAQABAQABAP8AAAAA/wAAAAABAAAAAAEBAgABAAABAf8BAP8A/wAAAP8AAf8A/wD//wEAAQAAAAAAAP7///n5+YmLj1tZX93c3AAAAAAA/wAAAAAAABEVA5+ZAlJNAgAABAAAAwD/A/8ABQD+Bf4ABAACBP//AgH/AgABA///Av8AAQD//wAA/gAAAAABAf/+AQD/Af8B/wAAAAAA/wAAAP3///7/AP/+AP3/AP3+APz9Af7+AP3/AQQE+3Vv60xJ9QDp9wG47gH9/wABAAD/AP8BAAABAP8CAP7//gAAAQABAAACAAAA/wD/AAD//gD/AAAA/wD/AAD//gD//wAAAQAA/wAA/wAA/gAA/wD/AAD//wD/AAD/AAABAAD/AQAA/wD//wD/AAAAAAAA/wAC/gAB/wAA/wD//wD/AAAA/wC54AC64f8A/wAAAQEA/wIZDf9yMP4qD/8BAAAB/wABAAD//wD/AAAA/wAAAQD//gAAAAAAAAAB/wD/AQAAAAAAAQAA/wD/AAAAAAAAAAAB/wAAAAD/AAAAAAAA/wAAAP8AAAD/Af8BAf8CAAD/Af8BAQABAAACAAAB/wAAAAAAAAAAAQABAQABAAAAAAAA/wAAAAAAAAD//gAB/gAAAAD/AAABAQABAQD/AgAA////AAABAAAA/wAA/wD//wACAQAAAAAA/wAB/wAB/gAA/wD//wAA/gAB/wD/AAD//wEAAAAB/gAA/wD/AQD//wAAAAABAAD/AQAAAAH/AQAA/gD//wAA/wAAAAAA/wABAAABAAD//wD/AQD/AAAAAAAA/gD+/gAB/gAXDABtNAA5HAAAAAAA/wAA/gAA/tXV1GxrbO3r6wAAAf8AAAAA///+/wEAAP8AAQEB/wABAP8AAAD/AP8A/wAAAf//AP4AAAAAAf8BAAAAAP//AQAAAP8B/wEAAAAAAAAAAAABAQEBAQAAAAD/AAAAAf8AAAEAAAABAAAB/wAA//8AAAEAAQAAAQAB/wACAP7/AP8AAf8AAAD/AAIBAAABAQEA/wABAf4A/wIB/wAAAAABAQEAAQEAAAEBAP8AAQEAAP8AAAD//wEA/wH8/P/69/v5+vn8+/v9/P39/Pz+/v3+/f7//f79/Pz9+/z9/f3+/P38/Pz9+/39/f39+v3+/P78/fz+/v39/f7+/f39/Pv7+vsAAP8AAP//AQD///7//f/+///////+AP7+/////wD//v//Af/+///+//3+///////+/gD+/gD+AP7+/wD////+/v/+//////7+//////8AAP/////+/v4A//////4A//////7+/v7+//7+/v7//v/+/wD+AAD9/////v/9AAD+/f/+///+/gD9/wH//wAA/v/+AAH+/f7+/v/+/////wH+/v/+//3+//7+//7//////wD//gAA/QD+AP/+/v/+//////7/AP/+AP////7///7+///+/wH+AAD+/wD+AQH+/v4AAP4bHh8AAAIAAADr5+j+AAH//v/+//7//////wD//gD/AAD9AP/+/wD+AP8AAP///wD/////AP////8A/wAAAQD//wD/AP8AAQD//////wD+///9/wD9/v/+AP/9/v//AAL+AP7//gD9/wH/AAH/Af/9/wD+AP/+AP///gD+/v7+///Z1dTW1NAAAP4A/wAAAAAAAf8REwj9AQMA//8A/wD/////AAD+/v/8/v/9//4SEgGCgP1TVAIA/wAAAACZmJqvr7MAAAD/AAH/AAH//wAA/wD//wABAf8AAAABAQEAAAEBAf/+AQD/AAEBAQAAAAABAAAAAf8AAAEA/gAAAAABAAAAAf8A/wIAAAABAAEAAQAAAQH//wAAAQAAAP8AAQAAAf/+/wABAAABAQEA//4AAf8AAQEAAAABAP8AAAAAAAEAAAABAQD/AP8AAAH//wAAAQH//wD//v8AAAAAAf//AAABAgIA/wEAAAABAQD/AAAAAQABAAD/AAEAAAAAAAH/AQAB/wAAAP4AAAAA//8CAQEAAQAAAQEA//8AAf8A//8AAP8AAAAAAAEB/wEA/wAA//8A/gAAAAAA////AAAA/wABAAABAAEAAQEA/wD/AQAAAQH/AP//AP///wDu7u1ram54dnj29vUAAAAAAP4AAAAAAAAhJwCblv1TTAEA/wMA/wMA/wX/AQb//wX/AQQA/gP+/wL/AAH/AQH/AP8AAQEAAAEAAQIAAAH/AAAA/wABAQEAAQAA/wH////+/////wD/AAH+/wD+AAD+/gH+AAL+/wEA/v/08wG/wgZ7egrOwwIA+/kCzvAD4fYBAAEAAQABAf8A/wAA/v8AAQAAAP4AAf8A/gAAAAAAAP4AAgAAAQAAAAEAAgAAAAAA//4AAP8AAAAA/wAAAAAA/wAAAP8AAAAAAAAAAQAA//8A//8AAP4AAAAAAP8AAQAAAAAA/wAAAAAAAP8AAQAAAQAA1O4Ar9wBAP8AAAEBAP4CFwsBbS4AHgsAAAAAAP8A/gAA//4AAP8AAf8AAQAA/wAAAQEAAAAAAQAA/wEAAQAAAAAAAQAAAAAA/wAA/wAAAP8A/wAAAAAAAP8B//8AAAAB/wAA//8BAf8A/v8B/v8AAAAAAP8BAAAA/gAB/wAAAAEB/wAAAf8A//8A//8AAP8AAQEAAAEBAAABAAAA/wAAAAAAAP8BAP8AAAAAAf8AAQAAAQAA/wAAAAEA/gAAAAEAAP8AAAEAAP8AAAAAAAAAAQEAAQAAAAEA/wEAAAABAgL//wAA/wEAAQIAAf4AAP8AAP8BAAEA/wAAAAD/AP8AAAAAAQEA/wAAAQAA//8AAAAA//4A//8AAf4AAf8A//8A/wAAAP8A/v8AAP8AEgkAZjABNBsAAAAAAAAAAAAAAAC+v8B3d3z39fQC/wEAAAECAQAAAf8B/wAAAAAAAAABAAAAAAACAQEAAAABAQEBAAEAAAAA/wAAAP8CAv8BAf8A//8AAAEBAAEBAP8AAP//////AAAAAP//AP8CAAH/AAAA/wEAAAAAAAAAAP//AAD/AP8B/wAB/gECAf8BAAAAAAAA/wD/AAAB/wAAAAAB/wAB/gAE/wAAAAABAP//AAAAAAAAAAAAAAAAAQAA/wEAAP8A//8AAQEB/////fr+/v35BQYEBf8F/v4AAQP+AwAEAQIBAP8A/gAAAv//AAICBAT+AP0AAAEBAP8AAf4B+/7+AwIE/wP/AgAA/v39AP8BAAABBAME/f8AAQAAAP///gIAAQAAAP8AAP/+AAAB/v0AAAEAAP8B/wAAAQIAAP7//gAAAP///wD/AQH/AP8A/wAAAP8A/wAAAAAB/v7//wD/AAEA/v8AAP//AAH///8A////AAAA////AAAA//8C/////wAAAAD/AP8C/wD/AP8AAP/+/wD/AP8B/v/+AAEBAAD///4A/wH/AP8CAAH///8BAAD//wAAAAD//////wAA/QABAf7//v//AAAAAAAA/wD/AAAA//4AAAAAAAD//wD///0AAAH/Af4AAAEB/f//JSgqAQIB//7/6+vnAAD/AAAAAP8BAP8A/wD+AAEB/f4BAwH/AAIA/wEA//8BAAAAAAD///4A/wIAAP////4BAAH/AP8AAP8BAAEB////AAIAAP/+AAAC//8A/wAAAP/+//4A/f8A///9/f8A/gD//v7//gH///8A/////v7//gL/1NDM//3/AAABAAABAAAAAAACsa38KioHTEv8/v4AAAH/AP7/AgAA/gD/+PsB//8ADwsCfHn78vIGu7oB+vn6e3t/KCYlLS4s/v8AAQAAAQAAAAEBAP//AQAA////AAAAAP8AAQAAAAD/////AAACAAEAAP7/AAAAAQEA//8A/wEAAP8AAAEAAP8B/wD/AP7//wIBAAEA//8AAQEB////AQAAAQD//wABAAD/AAEBAP4AAAL+//8BAAABAAEBAP////8AAAABAQAAAP8AAAAB//7/AAIAAgAB/wAAAf8BAAAB/wD/AQAAAAAA/wD+Af8B/wEBAQD/AAEA/wAAAf//AP8A/wD/AP8B/wH/AP8AAQABAAAAAP8AAAH/AP8BAf8AAAAAAAABAAEA///+AAEBAQEBAQH/AQAA//4BAAD/AAD/AP8AAAAAAAAAAAAAAQABAAD/AAABAP8A2NjXampuwsDBAAAAAAD/AAD/AAAAAAD/MzYBo5kAJyMBAP4DAP8B/gADAQAD//8E/gIDAP8CAAEB////AgD//wAAAP///wD+AAAAAAAAAAAAAf8A/gEA//4A/wAAAAAAAAEBAAAD/v////8B/gAA//8A/wAB//8BAAH/w8kNh4QP2tv+/QD9/wH9AgMAAAoA/A0EAAL/AP8A/wABAAAAAAEAAAABAAH/AAAAAAEAAAD/AAABAP//AAD/AAECAAD/AAH/AAAAAP8AAAECAAD+AAABAAL+AP8CAAAAAP//AAEAAAH/AAABAAABAAD/AAAAAP8AAAEAAAAAAAD/AAEBAAAAAPH6AKjaAPj9/wAAAQD/Ag0H/2cs/R8JAAD+AAEBAAAAAAEAAP8BAAABAAEAAP//AAEAAAD/AAEAAP8BAP8BAAAAAAAAAAAAAP8AAAD/AAABAAABAAABAAD/AAEA/wAAAP8B//8AAAEA//7/AAEA/wEBAP4AAAAA/wD/AAEA/wEBAf8B////AP4AAAAAAAAAAAEAAP8AAf//AAEAAP8AAAEAAAD/AAAA//4AAAH/AP8BAAAAAAH/AP8AAAD/AAEAAP8AAAAAAQD//wIAAP8AAP//AP8AAAEBAAD/AAEAAP4A//8AAAH/AAAAAP8AAAEBAAH/AAEA//7+AAIAAP8BAAAAAAIAAP7+AAABAP4AAAEAAP7+AAEAAAEAAP8BAAABAAD/AAD/AP8BAAD+AAABAP8BAAkG/14sAO33AN/tAAABAAD/AAABn5+gNzYyZmhnAQAB/wABAP///wD/Af8A/gAAAAAAAQAA/v8AAQEA//8AAAAAAgD/AAABAf8C/wD//wABAQAA//8AAQH/AAEBAf///wEAAP//AAABAQABAP//AQEAAAD//wD/AgACAAAAAP8AAAH//wEBAf///wEBAP//Af///wEBAAEAAAD/AP8BAQH//wAAAgAAAQEA//8A/wABAAEAAP//AP//AP8AAQAAAQABAAEAAP8A/wEAAv/+AP/9//v5+/v5+v78/P/8/v78/P78/f79/v78/vz8+/79+/z7/Pz7+/79/P37/P79/v/8/f79/P78/fv7/f38/QD//gEA/wAAAQD///7//v8A///+///+//7+//4AAP3//v///v/+//7//wD///39/v3///7/AP7///7///7/AP7/AP////7/AP7+AP7///4A/v4AAP7+//////7///79//3+/v8A//7/AP//Af7/AP/+/v///gAA/v4A//7//f/+//8AAP4AAP//Af4A//8AAv/+//7/Af8AAAD/Af4A//7+///+/v//AP7+AP/+AP7/Af7+AAD/////////AP8A///+AP////7+//8A//4AAP7/////AQABAAABAf7/Af7+Af8AARgaHAUFBwAAAezq7Pr6+/7///////4AAP7/////AP////4BAP/+///+AP/+//8A/v7/AP7/AP/+AP7/AP4A//////7/AP4A//8A//4A//7/AP0BAf7//v7+/wD9//3+/v0AAP3///z+////AP//AP8AAf79AP4A//0A//4AAPby9MnEwQAA/gAA/wAAAAABAQACAvPyAIqC/sjFDAIBAwD+AgD///7/AAD+AAD///r8//T5/xISAYB8+i4uAAAA/tvb2ZOVlQAAAAEA/wEBAQABAAH//wAAAP8BAAEBAQAAAQAAAAEBAAAAAAABAQEB/////wACAf8B//8AAf8AAQD/AP8A///+/wABAAD/AAABAgAA/wIBAQEAAAH//wEAAQAAAAAAAgEAAP8AAAEAAAABAAD/AQEAAAAAAP8A/gABAAEAAAEBAf//AAAB/wABAAABAAH+AAABAf8AAAAAAP8A/wD/AP8AAf4AAP8AAQABAAH///8BAQD//wD/AP8B/wEAAP8AAAAAAAEAAQEAAf//AAAAAAAA////AgAAAAAC/wAAAAAAAAAA/wEAAQEAAAAB/wD+AP/+AQACAAAAAAAAAAEAAf8BAAD//wABAAAAAAD/AQD/AL+/wE9QVMHAv/8B/wAB/wAA/gAA/wAAACst/puPASghAv/9A//+Av7/AwD/BP4BBf8BBgH/BwD/BQABBAEBA/8BAP//AP//AAAAAf8AAAD/AP8AAf8AAQEAAQEB/wAAAf//Af7/Av8AAAAAAQAB/wAA//8AAf7/AAAA//7//6SkCdfa//4B+wEC/AAB/P8yD/1rHv8WBwD+/wD/AAD/AAAB/wAA/wAA/wD//wAA/wAA/wAAAQAC/wAAAQAAAQD//wD+/wD/AAAAAQAA/wAA/wAAAAAB/wAAAAAA/gAA/wAB/gAAAAABAAD//wAA/gAA/wAA/wD//wD/AAD//wD//wD/AAD+AAC55gDe8AAAAAEAAAMGAwBkK/0mCwAAAAABAQAAAAD/AAD+AQAAAAAAAAAAAQAAAAAAAAAAAQAAAQABAAAB/wAA/wABAAD//wABAAABAAD//gAA/wAA/wD/AAEAAQH/AQAAAAAAAAD/AAEBAQEAAQH/AAABAAAA/wEAAQD/AQD/AP///wIAAQH+AAH/AAH/AAD/AQEA/wAA/wAAAAAAAAABAQAAAQEAAAEBAQH/AAAB/wAAAQD+AAD/AAD/AAAAAQEB/wACAP8A/wH9AQD+AAAAAQABAAAB/wAAAAD/AAABAAAB/wAAAAAB/gAB/wD//wD//wD//wACAAD+AAD//wAA/gD9AAAAAAAAAAAA/wD/AAAAAAAAAAD/AAD//wD//gAA/wAAAAAA/wD/AQAAAAD9/gD+/gAXCgFfLQASCgAA/wAAAAAAAP8A/nl7f8TDxP//AAEB/wEAAAEB//8AAQIAAQIAAAABAQH/AP/+/wEAAAEAAP7/AQD/Af8B////AAEA/wAAAAAA/wAAAQH/AAABAAH/AQD/AgD/Af8A//8BAAD/AP8BAAEAAf4BAAEBAQABAf8BAgEB/wABAAD//wAAAP8AAQEAAAH/AAEBAQEBAAAAAAAAAQIBAP8AAP8AAAEAAAAAAAAAAQEAAAEA/gAB/wAA/wAAAAEAAAEAAAABAAEA/v/+/QD7+f37+Pr9+vr+/Pz++/v9/Pv+/fz//QD++/7+/v/+/f39/P3+/vz9/Pz+/f3++/z+/f3//fz/AP0AAAAAAQH/AP/+/gD//wD+//////79/v7/AP7+/v/+///+/gD9/f/////+AP/////+/v7+//3+/wD/AAD+/v///wD+/wH8//7+Af/+//7//v/+/v7+///+///+///+/wD//wH+/gH+///+//////7////+///+/gD//v/+///+///+/v7+//7+/////v//AP7+////AP7//v/+/wD//v///wD+/wH9/v///v/9AP8A////AAD/AP/+/QAAAQD//wD+AAD//v7//////wD//v7+//7/AP3+/gD+/wD/AAAAAP///v8YGx0hIyUAAADt6+ru7ez//wD//wD+////AAH////////+/v7+AAD//wD/AAD//wD+AAABAP//AP//AP///gD+/wD////////9/v7+/v///v///v/9/gD+AP/9AP/+AAEAAP////7/AAD+//7+/v7+/v7//wD+/v/+/v8AAADMx8bf2tkAAAAAAQIAAAAAAAEBAAIAAADx8QSMiAPb3gYBAgD/AAAAAf8AAQD+AAAAAQD8+//7+/8bGwJvbPoLDQEA/wCsq67Nzc8BAAD/AP//AAEAAAAAAAAB/wD//wAAAAAAAAD/AAEAAAAA/wEA/wABAQEA/wACAQIAAP8BAAAAAAABAQEBAQAAAAAAAQEAAP8B/wD//wD/AP//AAAA/////wH+AP//AAABAAD/AAD//wAAAAEAAf//AAEB/wEAAAEAAAD///8BAAAAAAEAAP8BAAD/AQH///8CAAAAAQABAAAAAP8AAP8BAQEBAAEAAAEAAgD///8A/wABAQACAAH/AAABAAD/AAAA/wEA/wAAAAAAAAAAAAAAAf8AAAAB/wH/AAD//////wEAAQD/AQEA/wAAAQAAAQAA/wAAAQAAAQAAAQABAAAAAQABAP8AAAAAAQCeoKJXV1rc3NsAAQAA//0A//8AAAIBAQFIRwO1qQQwKwQAAAMB/wMAAQUBAQf+AAb//wj/AAj+/wP+AAH/AAH//wEA/wMBAQAAAv8AAP8BAAD+AQIAAQH+AQD+///+/wABAQAAAQH/AQL+/wH+/wD+/wL+/wH9////AP/+AQAAAQPq6gAA//7//gD//wIAVx38ax3+IAsAAP4AAgAAAAAAAAAAAAAAAAEAAf8AAQEA/wAAAP8AAf8A/gAAAP8AAf8A//8AAf8A/wAAAP8AAQAA//4AAP4A//8AAAAAAQEAAAAAAAAAAf8A/wAAAf8AAAEAAAAA/wAAAAAA//8AAAAAAQEA//8A2/AAt9wAAAEAAP8AAP7/Wyb8NBIAAQEAAAAA/wAA//8AAQAAAf8AAP8AAf8A//4AAP8A/wAAAP4A//8AAAAAAf8AAAAA//8AAQAAAP8AAAAAAQEA/wAA//8AAP8A/v8A/wAB/wEBAAABAQD//wAAAAD/AP8BAP8B/wAAAAABAP8B/wACAQD+AP8AAQABAAAAAAEBAAAAAAEAAf8A//8AAAABAAABAP8AAP8AAP//AQAAAAAAAf8BAQAAAP8AAAAAAP///gAA//8A/wAAAQAAAQAAAP8AAAAA/v8AAf8AAAABAAAAAP8AAf8A/wEA//8AAgAAAQEA/wEA//8AAf8AAQAAAAAAAf4AAP8AAAAAAAAAAP8AAP8A//8AAAAAAgAAAP8AAAAAAP8AAP8AAf8AAAAAAQEAAf8A/v7/JxAAYi8ACQYAAAEAAAEAAADu7u1zcXXo6Ob/AAH/AAD/AAIAAP//AQD+AQAAAP4AAP8BAQAAAQD/AAABAAABAf8A//8BAAAAAAEAAQEBAf8BAAD/Af8B/wD/AP8BAP8AAf8BAAAAAAD/AQABAAAAAAEA//8A/wAAAAAA//8AAAH/AAAAAAIAAAEBAQAAAAAAAQAA/wD/AP8AAAABAP4CAAAAAP4AAAABAP8A/wEAAQD/AQH/AQEAAAAAAP8BAAEAAf8AAP8AAAD/AP8CAf8A//4A/Pn8+vf7+/n8/fz+/fv8/fz6/vv6//38/vr8/fv8/vz8/fv8/vv7/fv8/f79/fz8/Pv7//0AAP8AAP///v8A/wD//v/+/v7//v4A/v8A/f8A/v////8A/gD//wD+/gD//v7//wAA/gAB/v7////9/v79//7//f7+//7+Af4A/////v7//v////////8A//////4A/wD/AP4A/v/9/v7+/v////8B/gH//v7///////8A/v7//wD+//4A//4B/v7+/gD//v8A/gAA/f7//gAA//7+/v/+/v4B/////wAA/gD/AAD//QAA/v7+/v7//wEA//8A//8A//7+/gAA/////wAA/wAAAAACAAAB/wD/AP7///7+/v/+/gAAAgIDHiMkAAD/9vXy5eLj/v8A/gD/AAH//////v///gH///8A//7//v//AAAB//7/Af/+/v////4AAP7///8A//7///8A/v4A//8A/wAA/f/+/v3+///+/v7//f/+/v3++/3//gD//v///gAA/v8B/f///f/+/v///wD/+vr6xsK/AAAAAAAAAAAAAAICAQEC//4CAwACAQEA29sAiIID9PT/AgEAAf4AAP8AAQAB//7//gEB/f///f7/Pz/+VVP+AAD+7+/ukJCTAAEBAQAB/wD//gEAAAEB/wEBAAEAAAH//wAAAP//AAEAAQAA/wABAAD/AAAA////AQEAAAH/AAAA//8BAP8AAQAAAQAA/gD//wH//wD/AQABAAAAAAEBAQH+AQEBAAAAAP8A/wAAAQIAAAD//wABAQH+AAEA////AQABAQAAAAEBAAAAAQAB/wD/AQD/AAEA/wAAAAAAAAEAAAEBAAEAAP//AAD/AAD/AP8AAAAAAAEBAP8A//8AAQAAAAABAQEB/wD/AAEAAAEAAAAAAAAAAf8AAAEB/gD/AQAAAQEBAQAAAAABAP7//wABAAABAAAAAQEAAP8AAP8B////AQAAAP8B//8B+Pj4iYiMb3Bz7e3rAP/+AP//AAEDAAABAQD/ZGMBoJj/HRkF/wAC//8E/wEG//8H//8JAAAL/gEG/v8C/wECAAED//8C/wAB/wIB/gACAP8B//8A/wAA///+////AAAA/wECAAEB/v4AAP8BAP7/AQEBAAAB//////8B//8C/wEC//8BAAEBICT+AgABBQIGBEEW/UoVAAIBAAD+AAAB//8AAAEAAAH/AAEBAP//AP8AAP//AAAAAAAAAP7/AAD/AAH/AP//AAEAAAD/AAD/AAAAAP/+AAEAAAEAAP//AP7/AP//AP//AAAAAP7/AAD+AAEAAAD+AP//AAH+AAH/AAD/AAAAAAAAAP7/ALPiAfj7AAABAQAAAzwd/T8YAAH/AAAAAAAAAAD/AAEAAf4AAAD/AAD/AP8AAAAAAAABAAEAAAABAAAAAP//AP8BAAEAAAL/AAD/AAAAAAAAAQABAQAAAQAAAQABAAABAAEAAAH9AAAA////AAEAAAEAAv8A//8AAAEAAP8AAAABAAEAAAD/AgD/AAD/AAAAAQAAAQAAAQAAAAAAAAD/AQEAAP//AAABAP8BAAD/AAAAAP8AAP7/AAD/AAAAAAL/Af8AAAAAAAD/AAIA//8AAAEAAAEBAAD+AP//AAAAAP8B////Af8AAP8BAAD/AQH/AP/+AAH/AAH/AP8BAAAAAP//AAEAAP8AAAAAAAD9AP//AAD+AP//AP8AAAD/AP//AAD/AAD/AP8AAP//AP//AAD+AAD+AAAAAAAAAP8AADIXAF0tAAsFAQD/AAAAAAD/ys3Ng4GE/v39AQEAAAAAAQEBAAD/AP//AAABAQIB/wAAAP8AAQH//wEA/v8BAAECAAH/AQD/AP8AAAAB/wD/AP8AAAABAAABAAEA//////8A/wAAAQAAAAD/AAD/AQAA/////wD/AQABAAAAAAEBAAAAAP8AAAAAAAAA//8A/wD/AgAB/wAA/wEBAv8AAAAAAgEA/gAA/wD/AP////8A/wAB/wABAAECAP8AAAAAAf8BAP8AAQAAAAABAQD/AAAAAf79//v4+vv6+v78/f77/v39/P38/f78/P78/f78/f38/v78/f78/f/7/f78/P78/v///wABAQAAAP////7//v7///4A/f7//v7////////+//7+/v7+AP//AP7+//7///3//////wD/AP7/AP8AAP3//v////7+//4A//79///+AP7+AP79/v7+//39/v//AP7+//0A/f7+//8A/////v7+//79//8AAP8AAP7+/v//AP/+Af4B//7/////AP//AP7+//7///7///7///wA////AP///f4A//39/gD+AP79AAD+//8AAP7/AP7///7+//7+//7/AAD+AP8AAf7+////AAD///7+/gAA//4AAAAA/wAAAQD///8A/xcYGgAAAQEC/+zs6P8AAP7+//79//7///8AAAD/AP///////wAAAP7+/v8B//8A//////4A//8A//4A/v7/AP3//////v7///7+/v8A//8AAf7+AP7/AP79//7//v7+/f79//7///3+AP3+//8A//7+/v7+//7//9DMyc/IxAAA/wABAQEBAB0MBF8iCHstB0sZByAGBQcAAczLAsDABAICAP8CAAD/AAH//wD/AP////z9AP39/gEBAWJf+yMjAQAAAq+wssPCxP8AAAEAAAEAAQD//wEA/wD//wH/AAIAAAABAAD///8A/wEA/v//AP8BAf8AAP//AP//AAAAAQEAAAAAAP//AP///wH/AAD+AQEAAAAAAf//AAAA/wABAQD//wEBAAAAAAEAAf//AAAAAAL/AAEAAv/+AAEA/wABAAAAAAD//wD/AP///wEAAQEBAAEAAAABAP//AQD/Af//AAD/AAEBAAABAP8AAAAAAQIBAQAB/gAAAAABAAABAAAA/wH//wH/AAEAAf8AAP8BAP8AAQAAAAAAAAEAAf8AAP8B//8A/wEAAAEBAQIB//8B/wAB//////8BAAAA/wEBAf7/AAAB/u3v7XJydXl7e/Xz8gAAAQAAAQAAAwD/AQkKAYKAA42DBRQQBwAABP//Bf//BwAACP4ACf4ACP8BBgAAAwAAAgAAAwD/AwEBAQABAf//AQEAAQABAgABAf//AQABAf//AP/9AQD/AP//AQABAf8AAP8AAP7+Af7/AP7/Af//Af4AAP7+AP8AAP8BABIYAv4CA/0FBvwnDQH//wAAAAABAAAAAAD//wD/AAD/AAD//wECAAAAAAAAAAABAAD//wAA/wAAAAH/AAD/AAD//gAAAAACAAD//wABAQD//wD/AAAB/wAC/wAAAAABAAACAAABAAABAQD//wABAQAB/gAAAQAAAAAB/wABAAAA/wDY8QHN6AAAAAAA/gIaCwBSHwAFAAEA/wAA/wAA/gAA/gD+//8B/wEAAQAAAQAA/wAA/wAA/wAAAAABAAAAAQABAQABAAD/AAD/AQAAAQAAAAAA//8A/v8AAP8BAAAAAP8B/wEA//8AAQAB/wAA/wEA/wD+//8BAAAC/wD/AAEA/wAAAAD///8A//8B/wEBAP8B/gAB/v////4A/gAAAZrLF/cAAQAASURBVAEAAAAAAAAAAQD//gEB/wEAAQH/AQEAAAACAAAAAQEAAAD/AQACAAACAAH+AQH/AAEB/gD//wD//gD+AQACAQD/AAAA/QAA//8A/wD//gD/AP8AAAAAAAD//wABAAAC/gAB/wABAAD+/wAAAAAAAAAAAQAA/wAAAQABAAAB/wD/AAAAAAAAAAD//wAB/wAAAQAAAAH/AAAA/wD+/wD+AAD//wAAAAA/HABWKv8CAQAAAAAAAQAA/5+goYeEhf37/QAAAP///wH/AAEBAQD/AP7//wEAAAAAAAD/AAEBAQEA/wAAAP//AP8AAAAA/wAAAf8AAAAAAP8A/gAA/wABAAABAgEBAAEAAAAAAf//AQAAAAAAAAACAAEAAAAA/wAAAQH/AAAB//8CAAABAQAAAAEBAAL/Af8AAAEAAAEAAQIBAAAAAP//AAEAAQEBAAABAAEA/wL//wEA/wAB/wAB/wAA//8BAAEA//8BAf///wD/AQAA/wAAAAH+/gD7+P35+Pr8+vz+/P7+/f39/P39/Pz+/P0A/fz9/P39/Pv8/Pv9/P3+//0CAQEAAAD//////v/9/gD9/v/+/gD+/wD////+/v79/v7+///+///+//////7+/v/+/v7+///+AAD+/v/+/QD/AAH+/v7+AP/9/v7+//7/AP3+AAD/AAL/////AAD9Af/+//7//gD/AAD9/gH+/wD9/v/+/gD//wD+/wAAAAH+//7+///+/QD+//7/AAD+//7//v///gEA/wD+/wD//v///wD+AAH+/v8AAAD+/wD////+AP///v8AAP8A/wD+///+AAD/AP/+AAD///3/////AP/+AP7/AAD+AAD///7+AP//AP7+AAD+/wAaHyEBAQH//gLs6eoA/wAAAP/+AAD//wD/AP///////wD+AP////7+/////v/9/gH+Af/+///9/wD+////AAD//wD9/wD//v7/AQH//AD+/v7+AAD//v7+AAD+/v///wD9AAD9/v/+//7/AP/+/gD//gD////29vW3sKv9/PoBAAADAgElDgSRNAONOP50MfuYPv1aGQkQAwIAAAOvrgf6+gAC/wEAAQD/AAEAAAD/AAD//wH+/gEA/wAfHAJdXP4AAAH19PONj5L7+/0AAAEAAP8BAAAA/wAAAAD/AQH/AQD//wAAAAEAAQH/AAL/AQEBAAAAAQEAAAEBAAAAAP////8AAQAAAP8AAQABAQEBAQD/AP8BAAABAQD/AQAA/wAAAAD/AAEBAAAAAAABAAH+AAH/AAD//v8AAQAAAAH///8AAf8AAQAAAQAAAAAAAQD//wD/AAEA/wEBAf8AAP8BAAAAAQD//wAA/wABAP//AP////8A/wIAAAAA/wD/AAABAQH/AQEAAgD+AP8BAAAAAAAA//8AAAEB//8BAAAAAAAB/wEBAAD+AQAA/wAA/wAB/wAAAAEAAQEB/wAAAAD+/wABAf/j4+VcXF+Yl5gA/v4A//8A//8A/wEAAAAREwKXkgR3cAQJCAL//wT/AQgAAQn/Agj/AAoAAQj/AAX+/wIA/wMA/wL//wH9/wH+/gIAAQL/AAD+/wD//wAA/wAAAAD//gEAAAAAAf8AAAD/AAH//wH+AAD+/wD+AP///wH/AAH+/wEAAAIAAAL+AQL+AAESFv7/AQL+/wIC8P7/AAAA/wAAAAAAAf8A/wAAAgAAAQAAAP//AP8AAAAAAP8AAP4AAP8AAAAAAf//AP8AAgAAAQAAAP8A/wAAAf8A//8AAQAAAf4AAAEA//8AAP4A//4A/v4AAP8AAP8AAAAA//8AAAMAAf8AAP8AAAAAAf8A/P4AuOT/AP3/AAABAgMBXCT8FQQA////AP8AAAAAAQEAAAIAAf8AAP//AP8AAP8AAP8AAAEAAAAAAf8A/wAAAf8AAP8BAP8AAf8AAAAAAP8A/wAAAAEB/gEAAAAA//8AAf4B/gD//wAA//8A/wEBAQH//gAAAf///wAB/QH/AQD///8AAP0AAAAA/wAA//////8AAAD//wAAAP8C/wAA////AAAA/wAA/wAAAAH//wAA/v8BAP8AAf8A/wAA//8AAAAA/wD///4B//8BAf4BAP8AAAABAAABAAABAf8A/v8AAP4AAQEAAAAB/wAAAP8AAP8B/wAAAf8AAAAA/wAA/wAA//8AAf4AAQAAAAAAAP8AAP8AAAAAAP8A/wAA/wAAAf8AAP8A/wAAAAAAAP8AAP8AAP7/Af8A/wEAAQAAAf8AAAEAAAAAAQEAQh4DQCEAAAAAAAEAAAD4+fmFhomqqKkA/wAAAAH/AAAA/wEAAAACAAEAAQAAAP8AAAAAAP8AAQD/AAABAQIAAQEAAAAAAP8BAAAAAAEAAAEAAQAA/wABAP8AAAAAAQH/AQAAAgEAAP8AAAD//wH/AAAAAQAA//8AAAAAAAAA/wD///8AAQAB/wAAAgEAAAAAAAEAAAACAP8A/wEAAgAAAv8AAAABAAABAAD+AQAAAQAB/wD/AAAAAQEAAAD/AAAB//8BAf//Af8A//8A//4BAf8AAgD///z//Pj8+/j5/fr7/vz8/f38/fz7/Pz6/v38/vz+/fz8//v8/vv9AP8AAP//AgIDAAEA////AP///v8A/v///gD9/v4A//7//v8A/gD+/f8A/v8A/gD///4A/v7+/v7+/v8A/wAA/v7+/gD//v///wAA/v///f8A/v///v/+/f7///////3///4A/v/+/v7/AP/+//8A/wH+/wD+/v/+/v79/f/+AQAA//4A//////8A/v/9/v4A/////////v8A////AP8A//8A/v/+//8A//7//gD///8A/v3+/wAA/v4A/v8A////AP////8B/////f8B//8A/v8A/v8B//////4A/wAA//8BAP//AP8AAAABEBESAgAAAgH+8/Hu/wAA/v8BAAD//////v3//v3//v//AP///v4A/wD//v/////+/v7///8A//7///4A/v///f///////gD//v39/f/+/f8A/f3+/f///f7+/f///f///v7//gAA/v4A/v///v/+/v///f7/0szL08zHAAEAAwIBBQMDTRgBPBv/AQb+/gT+Bwn8EAb4E///EAcB0M8CurwDAQL//wAAAf//AAABAf4BAQAA//8A/v8A/wAASEb9ICD9AAAAsrGzqqqr/v7+AAAA/wEBAAEAAQEAAP//AAAAAQAAAAAAAP8AAQD/Af7/AP//AP7/AQAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAD/AAABAAH/AAAAAQD/AAD/AAH//wD/AAEAAAD/AAD+Av8AAAAA/wEAAgAAAQAAAAAB//8CAAAA/wAAAAEAAP8AAAEA//7+AAH///8A/wAB/wAAAP8AAAEAAQAAAAEBAAD/AP8AAAH//wEAAQABAQAB/v/+AP//AP7/AQAAAP8AAv8BAQIAAAD///8A/wAAAQABAQAAAAAAAf//AAEA/wAAAAAAAAD/AAD+AAAB/wABAQEA09PVVVdaubi5AAH/AAAAAAD/AAABAAEBGyACn5gBW1UCAAADAAAGAAAI//4L/wAN/v8O/QAI/gAE/wECAQAC//8CAAADAAABAQEBAAEB/wABAAACAAEAAAAA/wEB/wEAAAAAAAAB/wEB//8AAP8AAAD///4AAAABAP8C/wABAAABAAAAAP8A/wAAAP8C/wACBgcEAQMEAf8A/fkAAP8AAAABAP8AAAABAAH/AP7/AAD/AAAAAP8AAP//AAD/AAAAAAAAAAAAAAD/AAAAAP/+AP//AAABAAD+AP/+AAH/AP/+AP8AAAD+AP//AAAAAAH/AAAAAAAAAAD/AAH/AAD/AAL+AP8AAAAAAAD/AP8AANzxANLqAAADAQAAAjgX/C8QAAICAAEAAP8AAAD/AAAAAAH+AAABAAEAAAAAAP8AAAABAAH/AAD/AP8AAAD/AAD/AP8A/wAAAP8BAP//AAAAAAEAAAD//wL/AAD+AAAA//8A/wH//wH+AAAAAAD+AAD/AAL/AAEAAQD/AAH/Af/+AAD/Af8AAQL/AAH/AQD/AQD/Af//AQD+AAD//wD+AAAAAAD/AAD/AQH/AQH/AQAC/wEA/wD///8AAf//AAAAAAH/AAL/Av8BAf8AAQAA/wAAAAAAAAD+/wH//wD/AQEAAAAAAAD+AAH+AAEAAQAAAAEA/wD/Af0BAP8AAP/+AP8AAQAAAAABAQEAAAD+AAAAAQAAAAEBAP8BAQABAAD/AP//AQAAAAD+AAD/AAAAAAD/AAAAAP//AAAAAP//AAH/AAH+AP/+AAD+AAMA/VclACERAAD+AQABAAD/+Pr5hYaI19fXAAEAAQABAAD/AAAB/wAB/wAAAAAAAAABAAAAAAAAAQAA/wD/AP//AAAAAAAAAAAA/wD/AQEAAf8AAP8AAP//AQAAAP//AAD/AQAAAAACAAEBAP//AQAB//8AAAAAAAD/AP4AAQD+AAAAAf8A/wAA/v4AAAEB/wD//wH/AgAAAAEBAP8AAP8B/wEA/wAB/wEAAQAAAP4A/v//AP8AAAAAAP///wEBAf8BAf//AP8A/wECAQAC/gEBAP7/AQAAAQD///37/vn5+/z6+/78/f39/fz6/P37/P38/f77//37/P/9/gAA/wAAAP7+/f39/v8A//3///8A//7+AP79AP7//f4B///+/v/+AP////0A/wD+//7//wAAAP//AAAA//7+/v//AP7/AP//AP//////Af//AP/+//8AAP8A//7/AP7//v0B//8BAf//AP8AAf/+//7/AP8AAP4AAf7/AP////z+//4A//7//////v//Af8A//4A//8A//8A//////3/AP7//wD/AP////8AAf7/AP3///8AAf7/AP//AP/+//7/AP3/Af4A//3/AAD/////AP8A//7+/v//AP8B/wH/AAAAAP//Af8A//7+/hcbHhUaGwAAAvDv8P/+/v8A/v7+//////8AAP8AAf7///3/AP7//v7+Af//AP4A//7+//3//f0A//3+/f7+/v/+/v7///79//7///4A//7+/f4A//z+/v7///3+//3///////7//v7//v7+///+//8A//f29LauqQD/AAH/AAsDAyAKAkIfAwcIAAECAAIC/wIEACADAUIFBToaBQAEA7ayCf/+AgQBAAAAAAD///8A/wD/Af8A//39Afn9/xYVAUZFAQAAAv///pmZnPf39///AAAA//8AAQAAAQEAAAAAAQABAQABAf8A//4AAAABAAAAAQIBAP8AAAAAAAAAAAAB/wH/AQAAAP8AAAEAAQEBAQEAAP7/AP8BAP8AAQD/AQD/AgEA//8AAAAAAAABAP8BAAAAAAEAAP8BAP7/AP8BAAAB/wAAAAH/AAD/AAABAAEAAAEBAf8AAAAAAAAA/wAAAAABAP//AAABAAAAAAEBAf8BAf/+/wH/Af8AAAD//wEBAQAA/wABAgAAAAACAP8A/wAAAAAAAAABAQEAAAAB//4A/wEBAAABAAAA/wAAAAAAAQAAAAD/AQEAAAAB/8rLzF1dYMrJygD/AAD/AQAAAAAAAQABADw9AbSp/0tGAv7+BAD+BgD/CP8BCP8ABv/+BQD/BAAAAwD/AgD/A/8AAgAAAv4AAAABAQEBAP8BAP//AAD/AQAAA/8AAQAAAAEAAQEA////AQD/AAAAAQAA//4AAAABAv8AAP8AAP//AP3/AP8BAf8AAQABBP4AAf//AQQFA/8AAf//Av/7AAABAAEA/wABAAD//wAAAQAAAAAA/wAA/wABAQABAAAAAAAAAAAB/wAB/wD/AAD//gAAAAABAAAA/wD/AAD/AAD//wAAAAABAAAAAAABAAAA/wAAAAD/AAD//gD/AQD//wAAAAD/AQAAAAD//wAAAAAB/wDD6AD7/QIAAAIFBf9FFwAB/wAA/wAB/wAAAAAAAAD//gAA/wAB/wD//wAA/wACAAAB/wAAAAAAAAAAAQAAAAD/AQABAQAAAAAB/wACAAAAAQAA/wD/AAAAAQABAQAA/wAAAAAA/gD/AAAA//8A/////wH/AP8A/wEAAAAA/wD//wED/wAC/v/+/QEA/wABAAAC/wAA//8AAQABAAEB/wAA/QAAAP8B/wEAAAD+Af8A/gAA/wAA/gEB/gAAAP8A/wEAAAH/AAAA//8C//4AAQAA//8B/wAAAAL//wEBAP//AAABAQH/AAABAP8B/v8C/wAB/wAAAAABAAAAAAAA/wEB/v//AAD///8A/wABAQD///8A/wAA/gAC/v///QAAAAD/AP8A/wABAAAA/wAA/wAA/wAA/wD//wD//AD//wD//wAA/wAA/wAAAAAA/wAMBQFgLAAQCP8A/gAAAQAAANbY13t5e/n4+P4BAAAAAQEB/wAA/wD/Af8AAP8AAAD/AQAAAAEAAAEAAQD/AQAAAAAAAAAAAQAA////AAABAAABAAABAf4AAP8AAAEAAP///wAA/////wECAQD/AAH/AAAAAf//AQABAAD/AQEAAP8AAP8AAAAB///+/gAAAAD/AQIAAgAA/v8A//8A/wH/AAAA/gABAAAAAAAB/wEBAQMBAP//AQEBAAH///8AAP4AAQEBAAL//wAA/wD+/wEAAAH/AP///wEA/gEA+//8+fz7+vz9+/3//v78/Pz9+/v8+/v8/f39/f0AAAIA/wAA/wD5+/r+/gD//wD+/f/+AP3//wD+AAD+/v/+///9//7///7+/f/8AAD+//79/v/+//79/v7/AAD+/wD////+/v7+/wD+///+/v/+//7+///+/v7//v7+AAAA/gD+/f7///7+/v7+//7+/v/+/v///v/+/v7+/gAA/gD+/v8AAP///wD+///+/wD+/gD+//7+////AP8AAAD+//7//wD+///9/wD///7////9/gD+/wD+///+Af///wAA/////f8A/wD//wD/AAD//gEAAQH+/wAA///+AP8A/wD/////AAD/AQAEBgYNDg4BAP/v7uz8/v4A/v8AAAD//wD+/v7/AP3/AP7////+/wD/AP3//////v7//wD9/gD//v7/AAD9///9///+/f/8///9/v/9/gD//wD9/f7+///9///+/wD9/v/8/v7+/gD+///////+/wD+/gG9tbPZ0s8AAAEFAAYPAgRJGgAsGAABAgABBP8CAgADAwD7/gEK+wI9FAMHAQDR1AXEwwMDAgABAQAAAQABAAL//////wH/AP7//AD8/gIlI/4AAP0AAALHx8mam58BAAD//wAAAAD//wD/AQAA/wD//wAA/v8BAAEAAQEA/wAAAP8AAAEAAP8AAAAAAAAA/wH+AgAAAQEB/wD+/wD//wABAP8CAAECAAAB/wAAAQAAAf8A/wH//wAAAQAA/wEAAP//AAAAAAAA/wABAQAB//8AAAABAAD/AAD/AAAA/wD//wAAAAEB/wABAQACAQABAAAAAAEBAQAA/wEA/wAA/wECAAABAQAAAQAAAP8AAAAA/wABAQIAAf8AAQAAAAAAAAEA/wAA/wD/AAD/AAAAAAACAQD//wEA/wABAQAAAQABAQAAAAAAAAAAAQCysLNdXF/S0dEA//4AAAAAAP8AAAAAAgFGRwGimQAsKAb+/wcBAQcAAQj/Agn/AAb/AQX+AQT+AAMA/wIAAAL/AAEA/wL/AAAAAQD//wAAAAABAQAAAQD/AQD////+/////wL+/f//AQIBAf8AAAD+//7/AAAAAAH//wAAAQH/AAD/AQEAAAD//wD/AQH+/gD//wL/AAIJBwL+AAEAAAEB+/8B/////wAA//8AAQAAAQEAAf8A/wAAAP8B//8AAAAAAAAA//8A/wEA//8AAP8AAQAA/wAA//8AAAEAAf4AAv8BAAAAAP8A/gAAAAAA/wAAAAAAAQEAAQAAAAIAAP8AAAAAAAAA//8AAP8AAgAAAAEA6PYAy+wAAAH+AP//OBX+Jw0AAP4AAAAA/wAAAP8AAQAAAQAA/wABAQAAAQAAAf8BAP8A/wAAAAABAP8AAf8AAAABAf8AAP4AAP8AAP4A//8AAP8A//8AAP8A//8AAAAAAQAAAP8AAf8AAf8BAP8BAf4BAf8AAf0B////Af4AAf8BA/////8AAAEBAQAAAP4AAP4A/v8AAP8BAP8B//4AAAIAAf8BAP4AAP7+AP4AAf4CAP8AAf8AAf8A/wAAAf8BAf////8A////AP8B//8AAQAAAP8BAP8AAP//AAD//wAAAf4AAP8AAAAA/wABAAEA/wAAAAAAAAD/AP4AAP4AAQH/AAAAAf8AAP8A/wAAAP8AAf8AAf8AAP8A/wAAAgAAAP8AAf8A/wAA//8AAf8A//8AAP8AAAAAAv8AAf8AAf4AAP8AAAAAAP4A//8A/wAAAP//Iw8BVCcAAgIAAAAAAP//AACytLWhoaUBAP8AAf//AAAAAQAAAP8B/wAAAP8AAf8AAAD/////AP7/Af8AAAH/AAEAAAAAAAEAAQD//wAAAAAA//8AAP8BAAAA/gEBAAAAAAABAAAAAAD/Af8AAQD/AQAAAf///wD/AAD/AAAA/wEAAAEAAAABAQEAAP8BAf8CAP8AAAEBAAEAAQD/AQAAAAIC/wD/AAEAAAH//wH//wEBAP//AQEAAQH/Af8AAQAA/wD+AAAAAAABAQAAAQAAAP8B/wD/AAAAAAABAP4A//r8+/f7+/r7/vz9//z9/f37+/r7/Pr6AP8AAAACAP8A/fz8/f////7//wH///8B/gAA//4A/v8A/f7//v///v//AP7+///+//8A/v//AP8AAP8B/v7+/v/+/v4A/gD//v7+/v7+/wD//v8A/v7+/wAA/QAA//7//f/+/gD//f8A//7//gAAAP8A/v4A/v/+/wD////+/gAA/v///v4A/v8A/v4A/v7//wAA//8A//4A/v8A/v7+//8A/gD+/v8A///+//8A/v////////7+//4A//3/AP7+/wD//wD/AAD+/////wD//wD///4AAP8A//4B//7//wD+/wAAAf8AAP7/AwIBERMVAP//+fb3/f3+/gAA//7//gD+AAD//v4AAP4A/wAAAP/+/f///f7+/gAA/v/+/////f///f7///7+/v7//f/9/v7//P7//f39/P7+/gD+/////f7//f///v////8A/v7+/v7//v7+/wAA7+3qurSvAAAAAgIGAwMHBgQFLA/+DAgB/wAAAgABAQIB+fn/7+3/Bf7/Cev6UhwE/PoAnJ0H8PACAwIAAQAAAAD/AQIAAAAA//8A/wEAAAD+3+P/AAD/AAD//fz7jIqO0NPUAQEBAAAAAAH/Af8BAQEAAQD/AAEBAQD/AP8AAAIAAAEAAAEAAQAAAAAA////AAD/Af8AAAAA/wEAAAH/AAAA/wEBAAH+//8AAAEBAAEBAAAAAAAAAAD///8AAAAAAAABAAD/AAAA/wEBAAAAAAD//wAA/gAAAAAAAQAAAAEA/wAAAAD/AAAAAP8AAAAAAf//AQD/AP///wD+AAEAAAH//wAAAQABAP//AAAAAAAAAAAA////AP8AAAAAAQAAAAEAAAAAAAIAAAEAAAEAAAAAAAABAAEAAAAB/gAAAAAB/wD/AP8BAAAAj5CQYGFj29vZAAD/AAAAAAEBAAABAwUCaGX/n5cEGxkK//8JAQALAP8M/wALAP8IAAAGAP8EAP4CAQAAAP8AAAABAP8AAAIAAAD/AP8AAAEB/wEC/v8BAP8AAAAAAAABAAAC/gH//wED/v///wEA/wAAAAEC/wAB/wAB/wD/////AAAAAP8A//4A/wAB//8C/gAB/wAA/gECAwX/AP///wD/AP4B/wIBAAL/AAAAAP//AP/+AP8AAAD/AAEAAP/+AAD+AAD+AP8AAAD/AP8AAAAAAP8AAAD/AAAAAAD+AP8AAAAB//8AAAAAAAH/AAD/AAEAAAD+AP/9AAH+AAD+AAD/AP8AAAD/AAD/AAAAAAD/AAD+AMjqAPP5AQAAAQAA/zkTAAD/AP8AAAEAAAD/AAH/AAD/AP//AAD///8AAQD/AQD///8AAAH/AAD//wAAAAD/AAH+/wD/AAD/AAD/AAEAAQAAAf//AAAAAAAAAAH/AP/+AQAAAQAAAf8BAf//AAD/AAAAAf/+AQD/AQD+AQD+AgD9AP7+Af///wD9AQH+/wH/AAD/AAD//wD/AAH/AAEAAP/9AAEA/wAAAAD/AAD//wH//gD/AAD/AP8AAAAAAf//AP8AAAD/AAD/AAEAAAEAAP7+AAEAAAAA/wD/AAAAAQD/AAEBAAAA/wH/AQD//wD/AQD/AP//AAD/AP//AAEAAAD/Af8BAAD/AAD/AAD/AP//AP8AAP8AAP//AP//AAD/AAH+AAD/AAD/AAH/AP7/AAH/AAH/AAD+AP//AAAAAAEAAP//AP/+AAAAAP//AAAAAAABAAAA/zwbATwdAAD/AAABAAAA/v79e3x8xMPFAP8BAP8BAAAAAgEAAAIAAgAAAAABAAABAAIAAQACAAAAAAD/AQD+AAH/AAEA//8BAAAA/wEAAAEBAQABAAAAAAD/AAEBAAAA/wAAAP//AQEB/wABAf8AAAAAAAEBAAABAf8AAAH/AAAAAQEB/wAAAP8C//8AAgABAAD///8AAf8AAf8AAAD//gAAAAD/AAAAAQH//wEAAAAAAP7/////AQAAAf8AAAEAAQH/AAEBAAABAAAAAQEAAAH/AAAAAf8AAQAAAf/+AgD9AP35/fv4+/v6+//8/f78/P37/QEA/wAA/wABAPn5+v7+/v4A//39//7+/v7+/f7+/////v8AAAD/AP7+//4AAf////0AAP////3+/v3//v////7///7//wD9//7+//7///39//////7/AP/+//7+AP7///7/AP//AP/+//0A/v7+/v3///3///7+//79AP7/AP/+/v8A//3//v/+//////7/AP///v3+//4A//7+AP4A//7///39Af////7//v7+/v7//////wAAAP4C/v7///0BAP//AP8A//7/AP8AAP7/////AP////7///8A/v4B//7/AP8A//7///8AAAEBABETFv8BAfv7+fv8+v////8B//////7///4A//3/AP7+/f3+//7+/v4B//79//7+/////v7+//79/v3+//7+/v3+AP7/AP7+//8AAP7+AP7/Af3+//7///////7+AP7/AP8AAP7///0AAP79/K2loOzm5AACBQcJE/4CBfX//yEb/wYO//8EAP36Af/+At3jBOvsAQkAAQnnBn0rETYdC9XZAaipBgIBAAMDAAH//wD+AAH+AAEAAAH///39/83PAAAAAQAA/wAAAufn5399gfb09f7//wAAAf8AAP///wEAAQEA//8AAAEAAAD/AQEAAf7///4A/wAAAAEBAv8AAAAA/wH//wAB/wEAAAD/AAD//wD/AQABAAD//////wD/AAABAAAAAQEAAAEBAQAAAAAAAQAAAAL/AAEBAAAAAgD/AAEA/wEAAAAAAQD/AAIBAAAAAP8BAAEAAP8AAP8BAf7/AAABAAABAgD/AAAAAAAA/wAAAf8AAAEBAQABAAEBAAEAAAEAAQH/AP//AAEAAAABAAAAAAEAAAH/AP//AAAAAAD//wAAAAEAAQD/AAEAAQEB/5KTlHV1evHw7gD/AAABAAD/AAD//wgJAoOAAY2HBhQRCwEBCv8ADAD/Df8BCwABCQABBv8ABf4BAv8BAf8BAP8BAQABAQACAf8AAP8CAv8BAAAAAf///wD/AP8AAP//AP8A/wABAQD+AAEB/gAAAP//Af8AAf//AAAAAf//AP8AA/8AAv8AAf7/AP4BAv7+Av4AAP8AAAABAP8BAgIDAP//AAEBAf/+AQAA/gAAAAABAAAAAAAAAQAB/wAAAAH/AQACAAEA/wAAAAAA/gD//wAA/wD//wAA/wAAAAABAAD//wABAAAAAAAB/wD/AAAAAAAA/gAA/wD/AAAAAQD/AAAAAAAAAAAC/wAAAAAA/wAB/wD/AAD3/QDI6wAAAf8AAAEZDQEkDgAAAAABAgD//gAAAAAAAAD/AAABAAABAQAA/v8B/wAAAAEA/wAA/wD//gAB/gD//wD/AQD/AAACAAD/AQD/AP////8B/wAA/wACAAAAAAABAAD//wAA/wABAAAA/wAA/wD//gAAAAAAAAAA/wAA/v8A/wAB/wAB/gEB///9/wAA//8AAAAAAAEBAP///wD///8A/wD//wEB/wAAAAAA/gAA/wEAAAD+/wEAAP8AAAAAAAEA/wAA/wEB/wEAAP7/AAABAP//AAD/AAEBAgD/AAAAAAAAAAEAAAEBAQABAQH/AP8A/wD/AAD//wECAAD//wAA//8A/wEAAAD//wD//wAB/gAA/wD/AAABAAAB/wAAAAD/AAAB/wAB/wAAAAAB/wD//gEA/wAA/gAA/wAB/wAAAAAA/wD/AAABAAAB/wAA/QAA/wAB/wAGAgBVJQAhEQAAAAAAAAAAAO3s7HV1d+nq6/8BAP8AAf4AAAAAAP4AAQAA/wABAAD/AQEA/wEBAAABAAABAQD/AAH/AAEAAAEAAAD/AAAAAAAAAQAAAf8BAP///wAAAAABAQD/AAD/AAEAAAAA/wEAAQEBAAECAAABAP8AAAEAAAD//wAAAAEBAAEAAAIB/wD/AQACAf8AAAEBAAAB/wABAQEAAP8B//8A/wAA/v8AAP8BAAABAAAAAAAAAP8AAAAAAQEAAAEA/wEBAAABAgAAAQEAAP8AAP///wAAAAD/AAAA/gH//gD8+f369vr9+vv9/PwBAQAAAf8AAP8BAQH+/////v7+AP7/AAH//wH+/////gD//v/+/v/+AP/+/////QAA/f39///9///////9/v/+///+/wD9AAAA//8A/wD/AAD///8A/v/9/gD9/v7+//8AAAD//wD+/////wD+/gH+/wAA///////+AP///wD+AP///v4A/wH9AAD+AAAA////AAEA/wD////+//3//gD////+/wD+/////wD+///////+AP79//4A/QD/AP//AP79//4A/wD//v///gAA//8A/v7/AAD+AP/+AAD//gEAAAD+/wH/AP///wAAAAIODw8AAAHx7u7x7u0AAAD9/v/+AP//AP/////+///9///+//7///7+/v/9//79/gD+/gD9/gD9///9/f/+///////9//79AP/9/v3+//79/v/9AP///gD+//7+AP///v/+/f////8B/wHFvrzBuLQAAAEYITULERz+AQEPCv83MP4IF/0JHvsHFP4ABv729gEJAAIMAAMP/QQi/gx3JREhEgyepQSlqQb9+QACAQD/AP//AP8AAAAAAQDAvwLQ0AEAAAEAAAEAAP4AAP+0tLa5vLwBAAH/AP8AAQABAQEAAP//AAAAAAAAAf8AAAD//wABAQABAQIAAAAAAP8BAP8AAAD/AQAA/wIBAAAAAgD/AQIAAAEA/wD/AP8BAAAAAAAA/wABAAAAAP///wABAAABAAD/AQD/AP///wAAAP4BAAAAAQEAAAAAAAABAP///wAAAAAAAAD+AAEAAAH/AAAAAAAA/wIB//4AAAAA////AQD/AP8CAAD///8A/wAA/gH/AAAAAP8AAAABAAD///8A/wEBAAEA/wD/AQABAAH/AP8AAQEAAQAAAAD/AADv8vByc3Z4eXv9/PkAAP8AAP8A//8AAAAKDP+LiAJybAgDAgsAAQv+/w3+/wz+AQj+AAcA/wX+/wQA/wMB/wL/AAIA/wL//wD//wAA/wIAAAEBAQABAAIAAP8A//8AAQAB/wEAAgEAAAAAAP0AAAD//wEAAf8AAP4AAAAAAQD+AP//AP8BAf7+///+/gD//wAB/wD+AAH//gEAAAEAAAEAAf8CAwEAAAAB/wIAAAAA/wAB/wAA//8AAAAAAf8AAAAAAAD/AP8A/wAAAAABAP8AAAEAAf8AAP8A//8A/wAAAAAAAP8AAAEA/wAA//8A//8AAP8AAP4AAAIAAAEAAQAA/wAAAAAA//8AAAEA/wAAAP8AAQAA/wAAAAAA1+8A4fIAAAABAP8BMRD+CwMA//8AAP4AAAAAAgAA/wAAAf8A//8AAP0AAf8A/wD/Af7/AP8AAP8AAQAB/wEAAAAAAP8AAv8A/v8BAP8A/wAAAQEA//8AAAAA//8AAAAAAAD/AP8AAP4AAf4BAP8BAf4BAAAAAf4BAf4AAv8AAQAAAP8AAP//AP4A////AwAA//8AAP7+Af3+AP7/Af4AAf8AAAAA/wD///8AAAAA/wABAP8AAP0AAf/+AP4AAP3+Af/+AP8AAAD//wD///8BAf8AAf4CAv8AAQAAAAABAgH/AAABAP8AAf////8A////AP8B/wAAAf8AAQD///8AAP4A/wAAAP8A/wABAAEB/wAAAAEAAP8BAP4A//8AAAAAAP8AAv8AAAAAAf8AAP4AAv8AAQD/AP4AAf8AAP8AAP8A//4AAf4AAf8A//8A//4A/wAAAP4AAP8B////EgcAXykAEwkAAP8BAf8AAP/JycqZmJYB/v8AAAACAAEAAAABAP///gABAAAAAP8AAQABAAAA/wAA/wD/AAAAAQAAAP8AAAABAAAAAAABAAABAQABAAABAAD//wAB//4BAAH/AP//AP8AAQD/AP8A/wAAAAAAAAEBAQH/AAD/AAEBAAH/AAAAAAAC/wD/AP8A//4BAAEA//8AAAIA//7/AQEBAAEAAQEAAAEBAAEAAf8BAAAAAQEAAQABAAAB/wD/AP//AAD+/wD//v4A/wD/AAABAf8B/wAB/wAA//8AAAEBAP8A//8AAP4A/Pz9/Pn6//7/AAEDAAEA5+jo/////QEA//4A//39/v///////P///gD//v///v7//f/+/AD//QAAAP7//v8A/f8A/wAA//4A/////////QD//f/+/v///v7//QD//v//AAAA//4A/fz+/f7+/////v7/////AP///gD//v//AP4A/v4A//4A//8B/f//AP7////+/gD//P79/gD//v4A//8A/gAA/v8AAP/9//8A/v8A/wAA/v8A/wAA//8A/QD//wH///8AAAD//v///wAA/gH///8A/gD////+AAAAAP//AAAA/v4A//8A/v8B/wH/////BAYHAAAA9/f28fDw/f3///8A//4A/v8B/v8A////AP8A//8A/f4C/f7//f///f///f////8A/f8A/QH/+/7++//+/f4A/v8A/f8A/P7//f7+//3//f/+/f7///7//QD+/wD//wAA5uXiqaCb/vz7DhopMkNaCxEb/v37Kxr8BwkC+wL//gUBBRj9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AAH+Af7/AP8AAQAB//Dt7f3+//79///+AP/+/f7+//7+/v79/wD//v7/////AP0A//3/AP7+/v3+AP4A/v3/AP4AAP79//7+AP79AP3+/v3+/v7+AP7///4A//////7/Af7///8AAP7/////////AP3+/v4AAP7+//7+AP8AAf4A//7/////AP8A//7///////7+AP//Af4AAP///v//AP7/AP4B//7/////AP7+//8A/v7+///+////Af/+///+AP8AAP//AP/+/////v8AAP//AP/9/wD+AAAA//7+//7+AP7+//8AAf//Af//////AAUHBwEAAf8A//3+/P8AAP7/////AP0AAP8AAP/+//8A//7+//3+//79AP39AP3//f8AAP3///3//f7//v3+/f0A/vz+/v4AAP3+AP3//v8A//4A///+AP79/v3///7///r4+KKXldfQzAACBiw5ThgeJuvl3+7p2wkEADkdCP//AgH+AAH+//8AAO3lAq7l+aX78ej/+hgNBAH+//7+/Qn9AB75/VUoEnE8DlE4Bw39AObeAwT+/2dAAdNxAplN/pI8ABUGAAAAAAAAAAAA/wD/AamprPz7/QEAAAD/AP8A/wD//wAAAP8BAQAAAAAAAAAA//8B//8AAP8AAAAA/wEA/wAA//8AAAD/AAAA/wEBAQAAAAIAAQH+AAAA//8A//8A//8A/wEBAAEAAP8AAP8AAP8BAAABAP///wEA/wAAAQAAAAEAAAAAAAAB/wEBAQAAAAAA/wEAAAABAQABAQD/AQABAAAAAQD/AAAAAAEAAAAAAf4A/wEB//8BAP7//wEAAAAAAQAAAP///gIAAAEA/wD//wAAAAAAAAEAAAABAAABAKeoqlZXW9fX1wD+AAD+AAD//wD/AAAAADg4B6+nEklDFQD/Df/+DAD/CAABBgAAA///BAAAAP8AAgEAAQAAAAABAQAAAQD//wAAAP8BAQABAf7///8AAf//AP4AAv//////AAAAAP8AAP8B//8B/gEBAP7/AAABAf4B/////wAAAAAA//8B////AAAAAP//AP7+////Af7/Af4BAP7/AQD/AP7///4BAf//AgECAAABAgD+AP8CAQAB//8B/wAAAAEAAP///wD//gEBAAAAAAAA/wEBAAD/AQAAAQD/AQABAAEAAAAAAAAAAAAB/wAA/wAA/wAAAAAA/wD//wAAAAAAAAAA/v//AAABAAAA/wD+/wD//wAA/wAB/wAB/wD/AAHj9gDh8gEAAAAA/wAxD/4GAAAAAAAAAAAA/wAAAAAB/wAA/gD//wAA/wAAAAD/AP8A/wH/AAAA/wD/AQABAAAAAP/+/gD//wD/AAAAAAAC/wD//gAA/gD//wAA/gAA/wH//wAAAAEAAQAA//8A/v///v4A/gAA/wAA//4BAAID//8AAAAA//8AAAH+Af8AAAD+//8BAP8A/wAB//8A/wAA//8A/wD/AAIA/wEAAP8BAQD//gH//wD//wAA/gD//gL/AAAAAf8A/wAA/wEA/wAAAAEAAAAB///+AAEAAQAB/wABAAD//wIAAAEAAQAB/wAAAQD//wAB/wABAAEAAP8B/wAA/wEBAAAB/wEA/wAB/wAAAQAAAAD//wACAAABAAD//gAA/wEAAAAB/wD//wD+AAAB/wAA/wAA/wD/AAAB/wAB/wACAQAAAAAB/wAB/wH//wD//wAAAAAAAAAA//8A/wD/AAABAABRIwAeDwEAAAAAAQAAANLR0paWlgAB/wH/AAABAQEAAQABAQABAAABAAEA/wD//wEB/wEAAAAAAP8CAAABAAAAAAD//wAAAP//AP8AAAEAAAEBAAAA/wEBAAAAAgAAAQABAQAAAf8AAQEBAf8A//8AAf8AAP8AAf8AAQABAP8BAAQAAAAAAQAAAAEBAP8A/gABAQH+AQABAQAA//8A/wD/AQAAAP8A/wEAAP8AAP8A////AAEAAAEBAAD/AP8BAAD/AgH//v4AAQAAAAEAAAAA/wECAQD/AQH//v4B/wEAAAEAAP8AAv8BAAD/AAAAAADz9fX+/v8AAf8AAAH/AAAB/gD/AAD/Af8A/wD/AAEAAP8A/gD/AAAA/wEB//7+AAAAAf8A/gAAAQAA/////wAAAf///wH//wABAf/+AAABAAEA//4AAAAA/v7+AAEAAAAA//4AAQH+//4B/wD//wD/AAD///8AAAH//wABAP//AP8BAP//AAL/AP7/AAD//wAAAAD//v8A/wD+AP///wAAAQD//gABAAEAAAD+AP8AAAAAAP8B/gAAAf//AP8A/gAAAQABAAD+AAEBAf///wAAAP8BAQD/AAEAAP8A//8AAQD9//4OERQAAQAA/gH9/f///wD/AP4A/wH//wEAAQD/AAACAAD+AAAAAQD//v4BAQH/AAAB//7/AAEBAAD/AAABAQD//wAB/wH9Af8A//4AAQL/Af8CAQH+//4AAAD//wD39fSnnJfGu7MAAAEkLj00O0n5/Pno3c0A/vY3IwUpC/z88QAABf8AAwAAAwC64v2Z7fn4AP0DAAIIBAMAAgAAAP/+DPMECfT98BAkAQ09X/gRGv7q8v8BBf04Af4F1QQA8AA8Hv2GNAJrxwD6/wIAAP8AAAC7ur22uLhPTUv+/wABAAEBAQD/AP8A//8AAQEA/wAAAAAC/gD/AQABAAEAAAAAAAACAQD//wAAAAAAAAEA//4AAAH/AQD/AAABAAIB//8BAAD/AQD///8AAQAA/wABAAAAAAAA/wAAAQH/AP8AAAAA/wAAAAAAAAAAAAH/AP8AAP8A/gAAAf8BAAAAAAD/AgD/AAAB/wD/AQAA/wEB//8AAP8BAAAB/wL/AQABAAAAAAEAAP//AAEBAAL/AP4AAAEAAQAAAQAB/wH////29/eKi46Ojo/08vIAAP0AAAIAAAEAAP8AAAFSUgeOiRAZFwgAAQUAAAb+/gUAAQP/AAAAAAIAAgEA/wMAAQD/AP8AAAH///0BAAAAAAIAAP////8BAf8AAQAA//8AAQAB/wD+AQEB//8AAP8AAP8AAAD//gABAQEA/wD/AP8A/wAAAQAA/gH+AAAAAQAAAP//AP8AAP8AAAEA//8AAQEA/gP+AAL+/wD/AAH+AAD//gD9/gEAAAD/AQAA/gEAAAAAAAAAAAD/AAAAAf8A/wH/AAEBAP7/AP//AAACAgD+AAAAAv8A/gH/AwAA//8AAAAAAQAA/wIAAgAA/wAA/gAAAgAA/wAAAf8AAAAAAP8A/wAAAQEAAQAAAP8AAAAA/gEAAAAAAAH/3PIA/P4BAAH+CwQAMhEAAAAAAf8AAP8AAgEA/gAA/wEAAAEAAAAA/wAAAQAA/wABAP//AgEA/wAAAQAA//8BAAEAAf//AAAAAP0A/wEAAf8BAgH///8A//8CAAD//wAAAf8BAP//AAAAAP4BAP//AQEB/wD/AQAA//8CAAD+/gEAAAAAAP8AAQAA/wABAAAAAAEA/v8BAgH//gAAAAEAAv8C/wAAAQD//gABAf//AAAAAQEAAAAAAP8BAAL/AQD/AP8AAAECAAEAAP//AAEBAP7/Af8B/wAAAQEAAAAAAAAA//8AAAD+AP4BAAH/AQAAAP4BAAEBAf///wEAAP8BAQEA///+Af8A/gEAAAAA/v8AAQAAAAAAAQAA/gAAAQAAAQAAAP//AAAAAAIAAP4AAAEAAP4AAQAAAAAAAgAA/gAAAgAA//8BAAL/AP8AAAD/AAEBAf//AP8A/wEA//8AAAEA/wEAAQD/EAUAVCf/kc0B/f3/AAAAAAGXl5lNTE02NzYB/wH/AQD//wABAQD///8AAAEAAP8BAAD+AQAC/wEA//8AAAACAAD/AAEAAAAA/wABAQD/AAEAAP8AAAD/AAAA/wABAQD+/wACAf8AAQH/AAABAQEAAAAA//8AAAAAAP8A/wH/AP8C/wD/AAEBAAAAAP7//wH/AAH/AQAAAP8AAAEBAAH/AAAAAAABAQEAAQAC/wACAQECAAEAAP8A////AQAAAAEAAf8AAQEAAQAAAQAAAQD/AAAA//8AAP4AAQAAAAAAAAAA/wAAAP8BAP7/AP8AAP8A6+jpAQAC/f7+/f///////f/+/QD+//8A//4A/v3+/v7//f7+AP7//wD+/f///gD///8A/gAA/f4A/AD//v///v7/AP7//////v////7//f3+/v///f///v8AAAAA/gD//v///////v4A/f8A/QD//gAA/wAA/v7//wD9/f8A/v8A/v8B/v7///4A/v3//gD//v///////gAA//8A/wL///8AAQAA/gAA/QD+AP//AP////7+/wAA/v8A/v7//v8AAP8A/wAA/wD//v0A/gAAAAD//v//AAD//v////8A/v8A//7/DA0MAQECAQEA+/36/gD///8A/v8AAAD//v7//////f8A//7+//3+/gD+///+/f7//f8A//7//f////7+/f7+/f4A/P79/v7+/gAA/f/+//7//P3+AP7/////+Pn3oZePw7izAAABFx4rOUJUAwQH8e/p6uHTAAAARCIACQX/AP4AAvwB//0BAP3+MiH9KBkCCQACHAMGFQUD/wAAAQD+Ah/yByLyCBDxCwEE1sgLAv0QFg0NJf8OBN0FAPMAAAAAAQICWScBUyD/AAD/AAAAAAD/9/b1lJKV9fb2AAEAAAAA/wD/AP8BAAABAP8AAQEAAQEA/wIAAAAAAP//AQAAAAAA//8AAQEAAAEA/wH/AP8B/wAAAf8AAQEAAAD//wD//wEAAf//AQAAAP8AAQAB/wAAAP8AAAEAAP//AAABAAD+AAAAAP8AAAAAAf8A/wD/AAEAAAEAAAAA/wAA//8AAP8AAv8BAAAAAf//AQD+AAAAAAEAAAEB/wH/Af4AAAH/AQH/AQABAP8AAQAAAAEBAQEBAQEBAP///wH/6OnoZmZqg4OE9PLyAAAAAAECAAEAAAABDA0CgoIIn5oOGRcJAAEH/v8H/wAHAAAEAAACAP8CAAECAP8C/wAAAAAAAP4BAP//AQACAAEC/wAAAAABAAAA//8BAAAAAAD/AP8A/wH+AAD+AAAAAP////7+////AP8AAP7+AAAAAAEAAAD//wD//wACAQEB//4A//8A//8A/wABAP///wAA//8B//0AAP8A//8C/wAB//4B/f4C/wACAAABAQAC/wEAAAAAAAEAAAAAAP//AP8AAAAAAP/+/wAAAAAAAAAA/v//AP4AAP8BAAAAAP//AAAAAP8AAP4BAAD+AP//AAH+AAEAAP8AAAABAP8AAP8BAP8AAAAAAP//AP//AAEAAP8AAAH+AAD/AAH9ANfvAAAA/wAAAhgKABoIAAD/AQEAAAEAAf//AQD/AAH+AAH+AAH/AAH/AAD/AAD/////AP7/AP/+AAH+AQD/AP///wAAAAH+AAD+AAH9Af/////9Af/+AAD/////AAD+AQD////+AAD9AAD+/wEAAf//AAD/AQD+AAAA/wAA/wEA/wAAAQAAAQABAAD/AAAAAAAAAAMB//7/AQIAAQD+Af8A//8A/wH+/wH//gD/AAH+AQD/AAEAAP8A/wD+AAH+AAEAAP///////gH/AAD+AAD/AP4BAAAB/wD/AAH/AAAAAP/+AAD+AAIB/wD+AAD+AAD/AAD/AP7+AQD+AQD/Af//AAL/Af8AAQD//wD/AAIAAAH/AAH/AAD+AAH+AAH/AAH/AAEAAAD/AAD+AAACAAH/AP8AAP8AAP8BAAD/AAL/AAD/AP8A/wH+AAD+AP//AAH/AAH/AAD/AAH/AAEAAAAAAAH/AP8AAAAAADASAjsc/wABAAAAAAD+7+7tgYKD9fX0AAH/AP8AAQD/Af//AQAB/wD/AgEA/wEAAQAB/wAAAAABAQEB/wAA/wAA/wAAAAEB/wABAf8AAQABAQEBAAEBAQL/AAD/AgEAAAEBAP//AP///wD//wD///8AAAAAAP8BAAEAAgABAgAA/wD//gAAAP8BAQEAAf//AAEB/wEB/gD+AAEBAQAAAQEAAP//AP8B/wAA/wABAAD/AAEA/wABAf8AAQABAP//AAAAAQAAAP8AAAD/AQAA/wAAAAAB/wEBAQAAAQAB/wEBAAD/AP8AAAAAAAABAfDu7v3//f//Af/+AP//AAAAAP////3+/f3+/v7//v7///7///3///3+/v4B///////////+AAD//wD9Af7///3+//0A/f7//v7///7/AP8A//3/AP/+/v7///3+/v/9////AP3+///////+/v7/AP/9///9AP//////AP///v///v7/AP3//v7//v//AP/+///+//4A//////4A//79AP7/AP3/AP/+/v//AP7/AP7///8AAf///////wAAAQAAAP0AAf7+AP//Af8BAAD+Af3/Af//AP7+AAD+AP4A//////3//wABAgAA/wABAfn4+f7+/f3/AP3///3//v4BAP7///3//f0A//8AAP/+/vz///7/AP7+/v4A/v3+/v3/AP7//////v//AP7///7+AP7+//79//3+/v3//uXh3pWEfcm9ugAA/hAWIUFKYQ4QFwICAuXe1fv18AsHAUsm/QAAAP8CAf7/AQL//gABASUYAE4lBCoHBysMCQ4GAAIAAP4E+/4c9gEGAAUO9REK/fjdCLOyDcW/FNS9EP3iBAD8AgAFAAAD/woG/4U3ASYMAAAA/wAA/wAA/7y8vb2+wQEAAAEAAAAAAAABAAABAAAAAP8AAP//AAH/AQABAAACAf8AAAEAAAD/AP//AP8AAAD/Af8C/wEAAP//AP8AAAABAAEBAgD/AP8BAQAAAAEAAAAA/wEAAAAAAAAAAQAAAQAAAAABAQAAAQABAAAA//8BAAEAAQD+AAAAAQABAP8AAAAAAQAAAP8A/gEA/wAAAgAAAQAA/wEAAP///wD/AQAB/wAAAf8AAAAB/wEB//8B/wAAAf8AAP8AAAAAANra3FZWW6amp//+/gABAQABAQD/AQD/ARAR/5KNBXZxEgcGC///Bv//Bv//BQD/AgABAQD/AQABAgD/AQAAAQAAAgD+AgABAgEAAv8BAf//AAAAAf8AAAEBAAAAAAD/AAH/AQAB/wD//wD+AP8B/gEA/wEBAAEA/wEC//8BAP8B/wD//wAB/wH/AgAB/v8A/wAA//8A/wAA//8AAf4BAf//AP7+AP0CAf4AAf8BAP3/AQAAAP7/Afj3AAAAAv8AAAAE/wD+/wD+/wD/AAAB/wAAAAABAAAAAQD/AQABAQD//wD/AQAA/wAA/wACAAAAAAD+AAAA/wAA/wD+AAAA/wD+AAAAAAAAAQAA/wAAAQAAAAAAAAAAAQAAAQAAAAD/AAABAAD+AAD//gD6/QDg9AAAAQAAAAAfCgACAgABAP///QD/////AP8AAAD/AQAAAQD//gAA/wD//wAA/gAB/wAB/gAB/wAA/v8B//8B/gEA/gD//wAA/gAA//8A/wH/Af8B/wAB/wAB/wAB//8A/gAB/gAA/wEAAAD//wAA/wAB////AQAAAQD/AAH/AQEAAf8BAP7/AAD/AP8BAAAAAAD+AAECAAD//wAAAf8A/wABAAH+AAEBAAEAAQAAAv4AAP///wABAAEAAAD+AAD+AAAB/wAB/gH//wABAP8AAAAB/wAA/wEAAAD//wAA/gAB/wAB/wAA/wEBAQL/AQEAAP///wACAf8A//8BAP/////+Af///wABAAAAAAD//wAAAAAA/wABAAABAAD//wD/AAAAAAABAQD/AAAA/gAAAAABAAAB/wAC/wAAAAAA/wAA/wAB/wD/AAACAAABAAAB//8A/wAA/wAAAAD/AAAAAAAB/wABAAD//wADAv5IHwANBgAAAAAAAAAAAbi3uKOjpQAAAQEBAAD/AAABAQAAAAEAAf//AAD/AAAA/wEB/wAA/wD+/wAAAQEBAAD///8A/wEAAAD//////wD//gD+////AAAA/wAB/////wABAAABAQAAAQD/AAEBAQABAP8A/wD/AP7/AAIA/wEAAAAAAQAAAP8AAP8BAP8A/gAA/wEAAv8A/wABAQAAAP//Af8BAQEBAQEB/wAA/wEAAQEBAAABAgAAAAEBAf//AAD/AAECAAH/AQEA/wD/AP8AAP//AP//AQAA/wIA/wD/AQAAAgAAAQEA/wH4+Pn4+fn/AP//AP78/v39//7+/v///wD+AP/+///9/v7//wD9/v/+/v/+/gD+/wD9/v/+/v7+//////7/AP/+AAD9/wD/AP/9/v///////gD+/v7+/wD+AP/+AAD+AP/8AP/+AP///wD+AP8A/v////////7+AP///gD9AP7+/wD+/v8AAAD/////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A/4ABwEAAwD/AQAAAgAAAP8AAQD/AQH/AAABAP8A//8AAQH/Af8AAQEA/wD//wAB///+AAEAAAAB/wD///8B/wABAP/+AQAA/gAB/wD//wH///8BAAAA//8B/wH/Af8A/gD+/gABAP/+AAL//v///gAB////AAAAAP8BAQD/AP/9Af7///4AAP7/AP8BAQAA//7+Af8BAP8AAOTgAgACAAD9AAAJAQD+/wAC/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wABAAD/AQAA/wABAAAAAAD//wAAAQAAAAAAAAAAAQAA/gAAAQAAAQD/AAAA/wAA/wABAAAAAgD//gD/AQD/AAAAAAAA/wDl9gEAAAAAAP4QCf8hCwAA/wAAAQD+AAAAAP8AAAAA/wABAAAB/wAAAAD/AAAAAAAA/wABAQD//wEAAAAAAAABAAAAAAAAAAAB//8AAQEAAf8A/wH/AAAA//8AAQAB/wH/AAD/AP8BAQAC/v//AQAA/wEAAf8A/gABAQAAAQAAAAEA/v8BAAD/AAAAAAEBAP8AAAAAAQAA/wD/AAEAAf8B/gAAAAH/AgEA//8CAAD+AAH/AQAA//8BAAAA/wAAAQACAAD//gD/AQABAP8BAAD/Af8B/wEB/wD/AAH/Af8AAQAA/wAA/wAAAAH///8BAAD/AAEBAAD/AAABAQD///8BAAAA/wAAAf8AAAAB/wD/AQD/AAAB/wD/AQAB/wD/AQD//wABAQD/AAAB/wD/AAABAADx+wAKBQAD/gABAAAA/wAAAAAA/wAAAAEAAf8B/wD/AAAAAQAAAAAA/wD/AQAA/QD/AgAA/wAAAAAB/wAAAAAAAAATCwBHIwCn1gD+AAAAAAAAAKCgokhIR0xLSwEBAP8BAAD/AP8AAAEAAP4A/wEAAQD//wAAAP8BAAEAAAD+AP8BAAIAAf8A/wABAQAAAP8A/wEAAAAA//8BAQAA/gEAAQD//wEAAAAAAAAAAAD/AAIA/wAAAAABAQQAAP4B/wD/AAD/AQAAAQABAAAAAP4A/wH/AAABAAEBAP//AP8AAAH//wABAf8A/wAAAP8BAAAAAAD//wABAQD//wABAAH/Af8A/wEAAP8AAAEA//8BAQH//wEB/////wAAAQAB////AAABAAD/AP8AAP/l5OQlLCwBAP///v7/AAIBAP////8CAQD/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AAAAAAAAAAAAAf8B/wAAAAD/AAEBAP//AAIBAP//AAMAAP8AAAABAAD/AAACAAH/Aeb4A9L2/CEHABIGAAEAAP8AAP8AAP//AAEBAAD/AAEBAP8AAP8AAP//AAACAAH/AP8BAAAAAAP/AP8CAAAAAPX7AcXtA7jhA/j++QEEAP/9/wEAAP8B1dXWkpOVh4eFAAABAQEAAAD///8AAQEAAgAAAAEB/wAA//8AAf8A/wIBAP//AQD/AAACAP8A/gH/AAEBAQD/AP8A/wEBAP8BAQD/AAD/AAAB//4B/wEAAP8AAAEAAQABAAEAAl9fWAABAAAC//8AAAAB/v8A/wAAAP3//gABAAAAAQAB/wAA/////wD/AAD+AAH//wEA/gAAAQD/AQABAAAA/wAA/wD//wABAP8AAAEA//8BAf8AAf8BAAEAAP8B/wABAQEAAQABAf8AAAEBAgAAAQEAAebl5f7//////v3//f7+/v4AAP4A//7///7//v/+/v/+/v///v//AP////4A/v///v7+/v7///7//v0A//7//gD/Af//AP8A//7//v3/////AP7+APz+//7////+///+/v7+/v///////v7/AP79AP//AAD/AP//AP8BAP79//3//v////7//v4B////AP7+AP//////AP8AAf4AAP/+AP/+/v//AP////3/Af4AAf8AAAAAAf/+//7+/gH/AP8A/QAAAP7/AAD/AP////7////+//4AAP//AP7//+/r6a+imff29QABAQEBAAAAAAAAAgECBgIFDQIDDwMFDwMEEQMGEQIFEgIEEwEFFAMIFwIFFQEGFAIFEwMFEgMGEwAHFgMHFgMGGAMHGQIJGgIJHAALHQMLHgANIwAOJv8DDP//BAAABP8AAQD56f3w3AYB/VsuAhAH/gD+/v/9//37APX1AeLfD/HoEAD9//f6Ae/3B+v3BtPaFuHgCwsN/gAB/wEAAQH4AfjXBP/0AgYI/wUD/wH/Af3/AAQN/gYg/wQ1/QUt/gAd/QEQ/v8F/RkO/lwtAgAA/wAA/wAAAOfn5ri6uwAAAAABAAAAAQABAAABAQEAAAD//wH//wAAAAABAwEAAAEAAAEBAAEAAQAAAAEAAQEAAAABAAAA/wD//wABAAD///8AAAABAQD/AAAA/gAA/wAA/wAAAAAA/wAA/wAAAAEA/wAB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sgYA/v0AAQIAKAT/A/4A/wAAAAEA/wAAAAAAAf8AAAIA//8AAP8AAAAA/wAAAf8A/gIAAQAAAf4A/wEAAAAA//8AAQAA/wAAAAAAAAEA//8AAP8AAAEA//8AAQAAAAAA/wEAAQAAAAAAAAAA/wAAAAEA/f8B+f0AAAEBAAAADgMA/v8AAgAAAAAAAP8AAQAA/wEA//8AAAAAAP4AAAIAAP8AAAEBAP//AAEA//7/AAIAAQAA/wABAQD///8BAQEAAAAAAAEA//4AAAEAAAAAAAAAAgEB//8AAAEB////AQABAP8AAAEAAf4AAAH/AAEBAAAAAv//AAABAP8AAAABAf//AAABAAH/AP4AAAEAAP4BAAEA/gABAf8AAAABAgD+AP8B/wAAAQAAAAAAAQD//wAAAf4AAQH//gEBAP///wAAAP8AAQEAAAEAAQAA//4A/wIAAP8AAAIAAf4A/wAA/wD/Af8AAAAAAP8AAAIBAAD/Af8A/wAAAP8AAQEA//8AAgAA/wABAQD///8AAAEA/wAAAP8AAAEAAAAAAAAA/wEAAQAAAP//+f8BAP8AyvAB+Nz/aiIAEQcA//0AAAIAAwAA//4AAQEA/f8AAAEAAP8A/gEAAP8AAAAAAP8A9wADyfEMst8D8fsBAgD/AAABAgElGgMICv3O1v0AAP8AAQHs6el0dnepqaYTERP/AP8CAQAAAAH//wD/AP8BAAD/AAAA/wAAAQAA/wACAAH/AQD//wABAf//AAABAAD/AP8C/wH///8AAQH/AP8BAQEAAAABAP///wABAQEAAAAAAP8CEhMTkpGMIyIhAQEAAP//AAD+/gD/AAEAAQAA/wD/AAD+////AAEA/wAA/wH//wD/////AAAC/wEAAP8AAQABAP8B/wEAAAEAAAAB//4A///+AAD/AAAAAf8BAAIBAAEA/wAAAQAAAAABAQAB/wD/AAAA7erq7evu/f8A/f7//f///P7+/////gAAAP/+/v8A/v0B/f8A/gD//v4AAP4A/wD+/v0A//8A/gAA/v////7//wD//v////4A/gD+/f8AAAD//v8A/v/+/v8A/gD//f/+/f/+///+//7+//8A//8B/QAB/wEA/f/////+//7//wD+//7///////////8B/gD/AP///v/9/f///gAA/wD///8A/gD///8A/gAA/v////0A/P7//gD/AP4A////AAAA//8B/v7///////7/AP8A/v8A/v7+9fXzqJmQ2dPM/wAAAQAAAAABAAABAAEEAAAD/v/+/fz5/Pz6/f38//3+/v39/v39/v39///9/v7///7+AAAA//4A/gAB//8B/wACAAAB/gAB/gEDAAACAAAE/wEG/wMP/wYS/wII/wADAgAAAQEA//HaAPbjNhT+eDf9EAsABAQEAf4D/fYC+fQC4+UF0+z+2f377P/9AAT9Bgj3BAX9Bgf6ExH3/+sA+dID+sn+5dkH/voBAwn/BxP8Bx35Axv6AQb8APn9//b//vr/AAAB/wIAAQkAAQMAAAAAMxkAIxABAAD/AAAAAAAAx8XK6urqAAEBAQACAAEBAgEA/////wD/AAAAAQAAAf//AAAAAAAAAAEAAAEAAAAAAQAAAQAAAf/+AAEBAgIC/wEAAQEBAQAAAAAAAAD/AAD/Af8B/gEA/wH///8AAP4A/wEAAQABAgACAAABAAACAP8BAP8BAAAA////AAD//wIAAP8A//8AAQAAAAEAAAAAAAD/AAAAAQAAAQEAAP8AtLW4V1db09PRAAD+AAD/AAD/AAAAAAEBHR8DnZgNZF8QAQAEAQIGAP8H/wAEAAAD/wAB/v8CAf8B/wADAf8BAAACAAAC/wAA/wAB/wEAAAABAf8BAgABAQAAAAH/AQEBAAIA//8BAAAB/wD//wD/AAD+Af/+//8AAAD/AP/+AAH/AQD/AAH+/wH9AP/+AAD/AAAAAP8A/wD/AP///wD9/wD/AP/+//8AAQEA//8AAAD/AAAC//8A/wAB/QAB/wEB//8B/wAAAAAA/v8BnpoJ8uz/AAEBABgBAC8FAAEAAQAAAAD/AAEAAAEAAAAAAP/+AAD/AAD/AP//AAAAAP8AAAAAAAH/AP8AAAD/AP8AAAD/AAD+AAD/AAAAAAH/AAD/AAIAAP//AP8AAP8AAP8AAAABAP//AAD/AAAAAAD/AAD/AO/6APL6/wAA/wD//wcCAAEAAAD/AP//AP8AAAABAAAAAAAAAQEAAAAAAAD/AAAAAP//////AP8AAAAAAAL+AQAAAAEAAf//AAD//wD+/wH/AP/+AAEA/wEA//8AAf8AAP7//wAAAAD+AAEAAP//Af4B/wD///4BAP8BAQD////+/wH/AAEA/wD+AQD+/v//AAAAAAH/AQD/AAH+/wEA/wH//wL+AAD/AAH//v//Af8AAAH//wD/AP8A/wD/AAH/AP8AAP//AAH+/wD/AAEAAAEBAAAAAAAAAP7+AAABAAD/AAAAAP/+AP8AAAIAAAAAAP8AAP8AAAEAAAD/////AP8AAP///wAA//3/AAAAAAD/AAEA/wD/AAEAAAEAAAEAAAABAAAAAAAAAAAAAAD/AP8AAP3+APL6/wABAAD/AtPxBJXdAOX3AAECAAD/AP3/AAACAP7/AAD/AP//AP4AAAD+AP//APP7AcbvC5LbEKfcBPL8AgEAAQADDQoDXVb5sqH0cmr8AAD/AAABAP8AAAAAvry+jY6Q////AgEA/wAB//8AAAD/AQAAAAEAAQEAAQEAAP///wAAAAEA//8AAQEBAP8BAf///wABAAEA/wEAAAEAAQEAAQEB////AAABAAABAQEA/wEAAAD//wEAAgAA/ykpJ4qMhQ8ODwEBAQABAQH/////AP8A/wEAAAAAAAAAAAEA/wAB/wEBAQEAAAEBAAAA/wH/AAAA///+//8B/wD/AQH/AAABAAEBAAAAAf8BAAEAAf8BAAD/AP///wAAAP8BAP8A/wAAAAABAQAAAfLw7+Xj4/7//v/+//7+/gD+//3//f/+/v3/AP/+/v4A/v7//////v//AP7//v3+AP8AAP3/AP////7//v7////+AP7/AP7///39AP//AP7/AP3/////AAD//////wD/////////AAD+//7//////v/+/f7///7///4AAP0AAP//Af//AP8AAP7/AP7///7/AP4AAP8BAP4A//8AAf//AP//AP/9AP/+AP7+////AP4A/wAAAP/+AP8A//8BAP////////8AAP/+/wAAAQAAAAAA//Ty8qqbk9DIwv7/AAD/AQABAwAAAwAABf8ABP//AAD9/gD+/QH+/P79+/7++/79/f79/P79/f78/f///v///v7+AP8AAf7/AAABAAAAAgABAwAAA/8ABf8BBAABB/4BDf8GEAADCgEBAAH/AP7+AAD57QHv0QsB9Wct/xgNBAYLBwwTBAwRBQ8IBhMBCBT1CAb7/M3y+cv299r8/fYE//X2+fwH8QME+f/k/wPmAeLlCfz2AvwH/gcg+gcc+gII/gL+/gH+AAD9AAD+/wL6Af/6AAH8AP8EAQEIAgABAA8HATcbAwAAAAAAAQAAAN3c2MLBxQD/AP4AAAAAAP4AAAEAAQEAAQABAP8AAAAAAAD/AAEAAAD/AAD/AP8AAAABAP8AAP4BAAD///8AAAEAAAAAAAAAAQAAAQEAAQEBAAAB/gD//wD/AAEBAAACAQAAAP8B//8A/gAA/gAA/wAAAAABAQABAAABAAAAAQEAAAAAAAAA//8AAAH//wEAAP8AAf//AP8AAfn6+qOjqGNjZ+fm5QAAAAAAAAAAAQAAAQAAAS0rBKmiDUpFDf8BBQECB///BAD/AgAAAv8AAgEAAgIBAP8AAP8AAP8BAQH/AQAAAP//AAEAAAABAAAAAQAB/wAB//8B////Af/+/wD/AP//////AAAAAAH/////AP8A/wEC//8A/////gAAAP8A/wAAAAD+AAAA/f8A//8AAQAAAP/+/wAAAP8A/////wD/Af8AAP7/Af8AAf7/AP//Af8AAv7/AgEAAP7/AP4BAf4AAAD/ALi6CaymCQD//wAE/wBBCQAYAwAB//8AAAAAAQH/AAAAAAD/AQAAAQAAAAAAAAAAAAAAAAD/AAAB/wD//wABAAAAAQAA/wABAAD/AgD//wD//gAB/wABAAD+AQAA/wABAAABAQAAAAAA/wAAAQAAAgD//wAAAQD//wDu/P/5+wAAAf8AAf8AAAD+AAAAAAAAAAD/AAD+/wAA/wEBAP8AAAAAAQAAAAAAAAAAAQABAQAA/wAAAQD/Af8B/v////4BAAEBAAEAAQH/AAABAAAAAAH/AAEAAAAB/wABAAABAAAAAP7/AAAAAP8B/gAA/wEB/wAB/wAA/wAB/wD//wAA/gAA//8AAAICAAEA/wD//////wAAAAH//wAA/wABAP8A/wD//wEA/wEA/wH/AAH/AP8B/wAAAAAAAAACAAD//wAAAAABAQAB/gABAAAAAAD//wABAQAAAAAAAAAAAAACAAABAAD//wAB/wABAAABAAAAAQAB/wAA/wAB/wACAQAA/wAB/wAB/wD/AAD/AAD/AQD/AAAAAAAAAAAA/wAAAAD//wAAAAD/AQD/AALn+gLi9gECAQAA////AADT8gKD1ACu5ADw/AABAAD//wAAAAAA/wD//gD8/QDb9QOs5w6E3BSf4gnZ8gH8AQD/BAUDAkpD+6Sd8ZGO9yMu/0VH/TEuAAAAAAAAAQD/AAAAAZ2bnsbIyP8AAQAAAAEAAAEAAP8A////AQAAAP4AAAABAAEBAP//AAEAAAAA/v8A//8BAQD//wD/AAD/AAAAAP///v///wEAAQEB/v8B/wABAAEA//8BAAH/AAIAAAAA/wBOTUtxb2kBAf4BAP8A/wABAP8B//8AAP8AAAAAAAH///8A/gD///8AAAEAAAEAAAH/AQAAAAABAQAA/wAAAP//AAAAAP//AAABAP8AAf//AAH/AAEAAQABAAEAAAAA//8BAQD/AAAAAAAAAP8AAADj4eH//f/+AAD////9/v7+/wD+AP///wD+/wD+/wD+/wD9/gD9//3+///+//79///+/v/9/v//AAH+///+/wAA/v///gH/AP7//v7+/v8AAAD+/wD8///+/wD9/gD//wD+AP7+AAD9/v7+//7//wD//v///////gAA/gD+/v/+/wD//v8AAP///////////wH+/QAA/wD//v7////+//7/AAH/AP8AAP///wD/AAD+/gD+/////wD+/v/+//7///4BAAAAAQH+AP79//7w7OuhkIXOxL0AAQAA/wAAAQH//wAAAQIA/wMAAAEA/wIAAQAA/wD//wAAAAD/AP8A//4AAP//AP8AAP4A/v7/AAEA/wAA/wAAAP/+/gEAAQH/AAP/AAUAAAUAAAn+AgkBBQsAAgoAAAL//gH/AAAA//v/7dEB+u1aIv5LJgEDCQQCDAH9BQABAQIC/QEF+wIdEPxgH/NmHfgHAgLM+Qni+gb6AvAAC/fu5wMB9P/g8wnI8RH8/AcNFf0HDwD++gEAAQMBCAQACgP/EwMBFwL/CQD//f//+wEA//8BBwEAAgAA/wE6GwIDAQIAAP8AAP8AAAC9v7wAAQACAP8AAAACAQD/Af8AAP8A/wAAAP///wEAAAEAAAEAAAH/AQABAAD///8B/wABAAL/AAAA//7/AAAA////AAAAAf8BAQAA/wAAAAABAAECAQH//wD///8AAAAA//8AAAEBAQEAAP8AAAAA//8A/wAAAAAAAP8A/wAAAQAAAQIB/wD/AAD/AAEAAAEBAQH/AACKjJBhYWPr6ukAAAAAAAEAAAAAAP8AAAA6OwanoQszMAkA/wUA/wf+/gUBAAUAAAP//wH/AAAAAAAAAAIAAAIC/wEA/wD/Af4BAf8CAAH/AAH//gEBAf/+//8A//8B/wAAAAAAAQD/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AP8AAAEAAAEAAP//AAAAAP4AAAEA/wD+AP8AAAAAAAAAAAD//wABAQD///8BAAEBAAH+AQD/AP8BAAD//wAA/wEBAAH+AP8BAQIAAP8AAAABAQAAAP//AAEBAQIBAP//AAAA/wH/AAAA/wABAv///v8AAAAAAP8AAAEAAAD/Af8A/wAAAP8A/wEBAQAAAP//AAABAP/+/wEBAAAAAP//AAAAAAH/AAAAAAABAAD/AAIAAAAAAAABAAACAP/+AAD/AP8BAAAAAAAAAAAAAAH+AP8CAAEBAP8AAAAAAAAAAAEAAAAAAAD/AAD/AAACAAAAAAD/AAAAAP8BAAIAAP4AAAIAAQD//wAAAP8AANDxAP8CNC7+oZr1pawIaXT/AP8CAgECAN73/5XaAQICAf4AA/4ABP8AAwMDAQAA/wL///4CCQf7Skf+Xl/3OUH6AAAAAAAAAAAAAP8AAAEAAAAAV1MAp6oAvsUCAAD9AAAAAAD/tLS0p6epWVhY////AgAA//8B/wH/AgAA//8AAAD/AQIB/wD/AP8AAAAA/wEAAP//AQABAAAAAP8AAAAAAQAAAP//AAAAAAAAAQEB/v//AQABAQH//wAAAgAAAP8AAAEBAQsLC5WTjlNUUAIA/wH///8A/gAAAAEB/wD//v8A/wAB////AAABAQAAAP8AAP7///8AAP/+//7//v8AAAAA/wAA/wH/AAEBAgEAAAAAAP8AAP8B/wL//wABAAAA/wD//gD/AP8AAQAA/gEBAdjR0O3r7P/+/v79/v7//v79AP7//f3//v3+/v7//v79/v4B//7/AP//AP79AP/+//7+//3//v7+AP4AAP7////+/gD///////3+//8AAP8A/v//////AP7/AP8AAP7//v3/////AQD/AP///f7+////AP/+/wAA/////gD//wH+////Af/+/v7/AP//AAD+///+//7/AP7+AP4AAP8AAP8A/wD///////4AAP//AP////8AAf8AAAD+AP//AP//AAD///3//t/Z1p2LfNjQyQAAAQD/AAAAAQAAAAD/AQABBAAAAgABAQD+AgABAgABAf8CAwAAAgAAAgEAAQD/Af//AAAAAf///gD/AAABAQD+/wAAAAD/AwAAAQAAAgD/A/8BBAAAA/8BBv8CCP8CBQABAwD//wAAAQH25gDw1w0B93YtARkLAwAGAgMH/gEBAP34/wD3/QH+/v8D/v8DAAADAQIEACER9wYD/fn+AOz9CAH5BxT/A/X4BgD8ChoJA+/8DrLgD/H/BAEMAgAGAAAAAQD8AQIB//4C/wH/AgEBAQAAAQD/AgAFAQMLAQEIASsdASoWAQAAAAAA/gAAANPT1OLj4v8BAAAA////AAIAAAECAAEAAAEAAAABAQACAAAA/wAAAP8A/wABAgD+AAAAAAAA//8A//7//wIAAAEA/wABAQABAQAAAAEAAP8AAAIAAQAB/wD/AAABAAEA/gAB/wEAAAABAf//////Af//AAEAAAEBAAAAAf8AAAH/AAH/AP8AAAAAAQAA//r7+4CBhoF+gvj19wAA/gAAAgECBAAAAAABAG5qApuRCxcWCP4BBQABB///BAEAAf8AAgABAv//AgD/AQAAAQH/AAEA/////gD/AAD/AAD+AAAA/wAA/wD//wAB/wEBAQAAAAEAAAD/AAEAAAH//wH///8A/wH/AQD//gAA/wEAAAAAAAD//wD+/v8AAP8B/gD//gAA/AAA///+/v7/AP8A/wH//wEA/gD+//8A/wD+AP////7/AQD/AP//AP0AAf3/AAABAf4AAf4BAf8AAdHQCHlyDuLiAAACAAEVBQBaDv8RAQD//wD+AQAB/wEA/wAA//8AAAD+AAABAQAA/wD//wD//wD/AAAA/wD//wAAAAABAAABAQAAAAABAAD/AQD/AAD+AAABAQD/AQAB/wAAAAD/AQEA/wAA/wD/AQABAAAA/wABAQAA/wAAAQD/AQACAQAAAgAA/wAAAAD8AAD/AQAA/wAA/wAA/wD/AQAAAf8A/wAA/wABAAD//wD+/gD/AAD/AAEAAAABAQD/AAAAAAABAAAA/wAAAAABAP8AAAAC/wH//wEAAQD/Af8A/wABAf8BAAH/AAH/AQAA/////wAAAAAA/gAB/wABAAAA/v//AAABAgABAAAAAQD/Af////4A/wAAAAD/////AQH+////AP8AAAABAAABAQAA/////wAA/wAA/gECAQAAAAABAAABAAAAAAAAAAAAAAAA/wAA/wD//wAB/wAAAAD//gAAAAABAAAA/gAA/wAB/wEAAAD+AQAAAAABAQD/AQD//wABAQD+AQD//wAAAAAAAgD/AAAAAAAAAQAAAAACAAD/AAAA/wH//wD/AAD+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AAD//wECAP8AAAD/AAAAAP//AAAAAQEBAAAAAAD//gAAAAEAAAAB/wEBAQAAAQH/AQAA/wAAYGBetrazODg3AAAAAAAAAAD+AAAAAAAB6ubjqpeNwrKs//r6/wAB/v//AP7+//8A/v8A/////v8AAAEA//8A/wD///8A/gD+/////f////8A/v//AP//////AQAA//8B////Af8AAgABAAABCAcJMT1EaYOMVmhyIiYr/wAAAAAA8OznyLy0oIyDq5qU183J+ff1/gEA/wAA//7//v///v4A/v///wD/////AP8B/wABAAD//v////8AAP//AAAAAP7///4AAAAB//8B/v8AAP8BAAAA+ff4y7+5nYd4w7Ss9fPxAAABAAACAAABAAABAP//AAEBAQABAAECAAAHAAEJAAAHAAAFAP//AAD/AAD/AAD+AAD/AAD/AAD/Af8AAAD/Af8A/gH/AP8CAP4C/wAFAAEEAAAEAAIDAAADAAAFAAEFAAEFAAEEAAIEAAEFAAAEAAEDAP8BAAH8APjdAPbTAP7zIQ/8lTP5QRb///7/AAEAAP///wH+AP8A/wAA/wAA/f0C+P0GABgMCiwPDyIUERANDAYCAP4D//0FAPYHAfIG/wAB//8B8O3//f0CEif7ByH5AxH/BAEABf3+AAEABQL+Av7//PoBAR/9Hk7xDiX79vv+xt33ytv4xND/3NMR/+wG/wEAAPQBAPcD//8AAAL/AAD/AAD/AQEBAAD/AAD/AAABAAABAP8AAQD/AAAAAQAAAP8BAAABAAAAAQABAAAAAAD/AQD/AQEAAAAA//8AAAEA/wD+/wH/AAAC/wH+//8A/wD/AQH/AQEA/wAAAAEA/wH/AQEBAAD/AAD/AAABAAABAQABAP8AAAEAAAD/AQD/i42Q0dDPAAD9AAD/AAEB/wACAQEAgXj9RUH8/wEB//8D/wACAAABAQABAAEB//8AAP/9AAD//wEBAAABAAD//wEBAf/+///+AQD/Af8A/gD/AAH/AAD9/wD/Af//AQD/AP//AAEA/gD9AQD/AAH/Af8AAgEA/wAAAf//AAD/AQEA/wD//wD+AAD/AP/////+Af/+AAD/AAD//wH/AAH8///9AAD+AAD+///9AP/9////AQEA////AAAA/gEA/v8B/wADAAEBAAEB//8BAP8B/////wAA/v4A//8C/wEA/gAB/gEB/v///f8BDRL+Fx8DAAH/AAIBAOH7AP8BAP8B/wAAAAD/AAH+AAEAAAAAAAAAAAACAAABAAAAAAIAAP//AP8AAAAAAAEBAf4AAAAAAP8AAP4BAAEBAAAAAAABAP4AAAD/AAAAAP8BAAD/AAABAAABAP8AAP8CAAABAAAAAP8BAP8AAAABAP8BAP4AAAABACQOAAIBAP//APX7ANnwAAEAAAABAAEAAAH/AAD/AP8BAP8AAAD/AP//AAAAAAD/AAAAAAAAAAAAAAAAAAEBAAAAAP8AAP4A/wEAAAAAAAACAAH/AAEA/wABAP8BAAEAAAAAAAL/AAH/AAEBAAD/AAIBAAEAAAEAAAAAAAD/AAH+AAH/AAEBAP8AAP//AAABAAD/AAD+AP8AAP8BAAEBAP8AAAABAP8CAP8AAAAAAAAAAAABAP8AAAEAAAAAAP//AAAAAAL/AAEBAAAAAAD+AAAAAAD/ANj0AYvdAKTkAO76MjUHfXoHAP//AAD+Afz//v//AAEB//7/AP7///0AAf8BAQABAAAAAP8BAP8A//7/AP8A/////wD/AAAAAAABAQH/AAD/AP8A//7//wAAAAAAAf8AAP/+AAAA/wAAAP8AHhwAIR37//7/AQH/wsQGAAEAAQEA/wEAAAAAAAAAAP8A/wEAAf8AAf8AAP8AAAEAAAD/AP8A/wAAAP8AAP8AAAAAAAAAAP8AAAAAAAEAAAAA/wD/V1T9CAYAAAAAAAAAAAD/6enpubq7AAAAAAAAAAAAAQAAAAAA/wAAAP//AQEBAAAAAQAAAAEAAAAB/wABAAAAAP8AAQAAAAD+////AAEAAP8BAgAAAgABAQABAQEAAAAAAAEAAQD//wAAAAABAQIAAAAA/wAAAAD/AP//AAH/AQD//wEAAP/+/y0vLaippVNTUgMCAAAAAAAAAAAA/wAA//n29b2vpauZke7p5wEAAf//AP/+/v7+/v7+//////79////////AP7//gD/Af4AAAAA////AP7///4A/wD//////wD//wD/AP4A//8A//8A//0AAP//AAUICzRCSGR/il5xfScuNQAAAv8AAPr5+NPHv6aSh5yFfb+spuTb2f7+/wD+//8A/v////3+/wD//v///v///wD/AP8AAP8A/gD/AP4AAP8BAP8B////AAAAAAEAAP///dnPyZ+LfrOhluzo5wAAAQAAAQAAAgABAAABAQAAAQAAAwD+Av8ACAAACQABCAAABgAAAgAA/wAA/wEA/wAA/wAA/wAA/gAA/gD/AP8A/gD/Af8CAQD/BAABAgACBQAAAwD/BAAABQAABQABBgACBQAABAABBQABBQABBAAAAQABAgD//wD+9AD42gD42QD98TQQ+ZMw/jQTAv//AP8BAv//AAD/Af7+AP//Af37APn5Av0HCw4tDg8mCggHBQP+AQEAAAABAAABAQAAAQH9A//wCgH3A/8BAujnARQc/gEC/QUd+wkk+v8E/wD6/9/5A9MBBvr+AfP/AQgv9QQc9goR9fD5+ez0/gH4//fs/tfj///9AAACAQH+Af7iBQDxAAD+AAAB/wABAAUBAgIAAQAAAQAAAAAA/wEB//8AAAAA/wAAAP///v///gABAAAAAAAA/wAA//8A//7+/wAA/wABAAD/AAH/AQH/Af8A/gEAAQECAAEAAAD/Af7/AAD+AAD/AgH/AAD/AAAAAQIAAQAAAAABAP///wABAP///wD/AKyssZubn/8A/wAAAAAAAAD/AQAA/mdg/Wdi///+Af8ABP8ABAAAAQD/Av8BAf//AQEBAP8AAQAB/wH//wEB/////wD///8AAAEAAQAA/gAA/gEA/wAA/gIAAAEA/gEB/wAA/wAA/wAA/gH//wAAAP///wEA///+/wAA/wAA/wAA/gD//wD//QD//////wAAAQAAAQABAP8AAAD//gD//gD+//8AAAD/AP//AAAA//8A/wAA//7//gAAAP7/AwAAAv8AAAABAf//AP4AAf//Af4AAQABAv8AA/8AAf8BAP4BAf7+Af3/AAD/Af4A//3+/xEaAQAB/wAA/wDv/wD8AAD/AAAAAAEAAf//AQAAAAD/AAAAAAAB/gD/AQD/AQAAAQAAAQH/AQD//wAA//8CAQD/AAD/AQAAAAAAAAAA/wAAAAAAAQD/AAAAAQD/AAAAAgABAAD/AQAAAQD//wD/AQD+AQAB/wD/AAD+AAH+AAD+AAD+AQAfDgAbDAAA/wAAAADR8AEAAAAB/wAC/wABAAAAAAAB/gABAAAAAAAAAAABAAD/AAAAAAAA/wAAAAAAAAAA/wABAAAAAAAA/gAAAAABAAAB/wAAAAAA/gD//wABAAEAAAAAAAD/AAAAAQAAAQABAAAAAAAAAAABAAD+AAAAAQAAAQD/AQD//wAB/wACAAAA/wAAAQD/AQABAQAAAAD//wABAQAA/wABAAAAAAACAAACAAD/AAAAAQAAAAAAAQACAAABAAAAAAAA/gD//wAA/wD0/QCk5wKL4f/W9Q0MAH559rqv70RB9P///wAAAAAA/v/+AAAA/wEAAQAAAAABAAAAAAAA/wD/AAAAAAABAAEAAP8AAAABAQH/AQAAAQD/AQD/AAAAAf8AAQACAQAAAP8AAP8AAAEBAf///wAAAQAAAAMFACIfAAEA/wAA/73CBd/fAAD+AQEAAAAAAAAAAAD/AAEAAAABAP8AAAEAAAD/AAAAAAAAAAEBAAAAAAAAAAABAAAAAAAAAAD/AAD/AAAAAAEAAD07/0lHAgAAAQAAAQAAAAD+/8nKyv8A//8AAQAAAP//AQAAAAEAAAAA/wEA//8AAP8B/gAAAAD/AAH//wAA/wEAAAAB/wAAAQEBAP//AAAC//8A/wT///8BAAAAAAD/Af8AAAEBAQAA/wAAAP8AAQAAAAEAAAAAAP8AAQD//wABAQH/AP8BAgEA//8eHh6fn5wyMjCJiIvy8/IAAAAAAAH/AAD//v/VzMbo5OFFVVsqMTkAAgIAAAAAAAH//gAAAQD///8BAf8BAQH/Af///wD/AAABAAAAAQEA/gD/AQAA//8BAAH/AP8BAAD//gAAAQH//wAAAgAA/v/+Af8EBAYtOUArNTvc1NDNw7/Xzcj39vEAAALo5N7o5ODHubUaICMfJyocIyYZHyIMDxAAAP///wEAAAAAAQD/AAAAAAD//wABAP8AAAEAAf8AAf/18vLb0s/SysPf1c/9/f0AAAEAAAAAAAEAAAAAAAEA/wIAAQAAAQAAAAIAAAUAAAQAAQYA/wAAAAIAAP8AAP4AAgH//v4AAQEBAAAAAAD/AAAAAf4AAAEAAAEAAAIAAQMAAAMA/wMAAQQAAAUAAgMAAAYAAAQAAAQAAQQAAQQAAAMAAQMAAAIAAfsA/O0B+uEA/e//Af4wEQCJLwMoDwH+/QEAAf8A//4DAAIAAAH//AT++AP+AQICHgEOJgIFBQIA/f8BAQIBAQD//wABAgL//wAAAAD/AQIB/QAA8wv39/rx8v4lLvsC/wH/BAAJKPf12A3m9QIg//4BAQHiCAP/Avn07PUa9gMB+PwUDPoVBwTx/QTr9/4JCPwAAv4B/f//AQIA9v//+QEB/P4AAgEA//4AA/8AAP8AAAEAAAAAAAL+/gAA/wAAAAEAAQABAAH/AP8BAP//AQEB/gEAAAABAQAAAQAAAAEA//7/AAAB/wL/Av8B/wEAAP8A/wEAAAEAAf4B/wEAAQAA//8AAQAAAP8AAAD+//8BAQH///8BAAAAAAH+Af/V1dh+foL08vAAAP8AAQEA/wEAAP5CO/2Cev8FBgD//wEB/wL+AQEAAQL/AAAB/wH//wAAAf8AAQAA/wH/Af8A/v8AAQAA//4AAAEAAAH//wAAAgAA//8AAAD/AQL/AAAAAAD/AP8AAAH//wEBAgD///8BAQH/AAAAAP//AP8BAP8A//8AAf8A//8BAQAA/wD///8AAAABAP7/AP4AAAAAAf7//v8CAf/+AP0BAP7/AP8A//8AAP8AAAD//wEAAP///wEAAAD+/wAAAAL+/wEA/wH/AAD+AQD//wD9AAD//gEAAAD/AQD//wD9/wD+/wL9/wL/BgEA/wIAAgEA8gAB7wH/FP4AAAD///8BAQL//v8AAAAAAAAAAAEBAQD/AAAA/wAAAAD///8AAQAA/wAA//8AAAAAAQAA/wAA//8AAQEA/wAAAQEA/gAAAAAAAf8A/wAAAAAA/wAA//8AAAEAAP8AAAEA/wAAAQAA/gD/Av8AAAIAAP4ABwEAJQ8A4vQAAAAA2fQA5PgAHAYAAAAAAP8AAAEA/wEAAAAAAAAAAQAA/wAAAQEAAQAA/wEAAAAAAP8AAP8AAAEAAgEA/wIA//8AAAAAAAAAAP8AAAEAAQAA/wD/AQEAAQAAAAAAAP8AAAAAAAEAAAAAAAEAAP8AAQAAAP8AAAEA/wAAAAEAAAAAAP8AAAEAAAAAAf8AAAEAAQEAAAAAAAAAAAEA//8AAQEA/wAAAAAAAP8AAAEAAAAAAP8A/wEAAP4AAAAA/wEA//8A0/YCqub/3vf+AAAfIAOhmPU/O/3+AAADA/0BAgT//gABAAH6+QD//QIBAv4A/wEAAAEAAP//AAAAAAABAQAAAAEAAv8AAAAA////AQABAAD/AP8BAAEAAP8BAAAA//8AAAAA/wEAAP8AAAABAAAAAP8A/wAAAQAkI/3/AQQA/wDu7wLQ0AMhH/0AAAAAAQAAAAAAAAAAAAAAAAABAQAAAQEA//8A/wAAAgAA/gAAAAD/AQABAAEAAP8AAQAAAAAAAQAA/wAAAAACAwBGQf2vsQIAAP8AAAIAAQK8ubvo6egZGBkAAP8AAQD/AP8BAAEAAAH/AAEBAAAA/wAAAP8AAgD/AAEBAAAA/wD/AP8B/wAAAAD//wACAAH/AAAEAQEBAP///wEBAf//AP//AAEAAQEA////AP8BAQEA/wAAAAEAAQAA/wEB//8AAQEA//8AAQAB/wAADA0Lenp4NDU0eHd8z8/NAAAAAAAAAAAAAAD/7ejlrJmRLzvRPUpREhUY/gD/AQD+/wAD////Av8A/wEAAQH/AAABAAABAAH/////AQAAAf8BAAEA/wAAAAABAQAAAQD/AQAA/wEAAP7/AQIB/wABAQD//v8BAgMFJjA1JzE16+bj0MTA0sjD5+PdAAAA+vr34NrT4NrUAAABDRIUISgrHiQoHyYrEhgaAQEBAQEBAP4AAAMB//7/+vfz5eDc39bV0sjE8e3nAAACAAD/AAABAAABAAAAAAAAAAABAAABAAEAAP8CAAADAAAFAAEEAAEBAAAAAAEAAP/9AAEBAP//AAD/AAEAAAD+//8AAAEBAAABAAABAAADAAECAP8EAAECAAAEAAEFAAADAAADAAEFAAAGAAIEAAEDAAABAAECAAACAAAAAP7uAPrgAfzo///9AAEBFwcCdygGJw4DAQEBAQEA//4BAf4C/QAC/fwBAP0HBQIHCSEBCSL7AAMBAP/+AQEDAP4A/gAAAAEBAP4AAAAAAAAAAAH+AP////QG7fkBDQ/0CAj///4CAAD/ARr9FCL4AfsFAAD87P/7/f0CAQwDGRwJ/vX3/AL8GS3/LRUGBfgG/QcADgH1AvAB/wAAAf//AAEBAQIBAP3/AAMAAAIBBQH+/wAAAAAAAAD/AAABAwMDAQEAAAD///8BAQD/AQABAAAAAAAAAAEAAAAA/wAAAQD/AAAB/wAAAf8AAAEAAf8BAAD/AAEBAP8A/wD/AP8AAQAAAAEAAAD//wECAAD/AP8AAAEBAAAAAQEB/wD/AAAA+vj5gYGF2NjXAAD+AAAAAP8BAAD/Hx7+iYL+DxAA//4AAAED/wABAAAAAP//AQD//gD/AQH9/wAAAf8BAP8AAAAAAAABAP8AAAECAP8AAAD9AAEB//8CAQAB//8B////AgH//wACAQH///8AAgH///8AAv8A/wD//wAAAQH+AP//AAEAAAEA//8AAAD//wD/AQD/AP//AAD+/wD/AAD+AAD9AP//AQEA/v7+AAD9/wD/AAD//wAA/wD//wAC/wD/AAAB//8A/v8B//8B/wABAf8A/gD//wEA/v0B/wEB//7//wEB/f4B/v8A/QAB/f8B/f4B/QIBAgb/AP/9AAIDAPcA//UCABP/AAD/AAABAAD/AAAAAP8BAAABAAD///8BAAH/AAAAAAD/AAECAAD/AAEAAP8AAAABAAAAAAH/AAACAP//AAEAAP4AAAIAAP//AAD/AAABAP//AP8BAAABAP8BAAEBAAABAP8BAP/+AAABAP4AAAD/AP8AAAD/ACINAL0AAAAAAff//9DxAB0VAAABAAD/AAAAAAAAAAAAAAAAAAABAAAAAAIAAP4AAP//AAIAAP8AAAECAP8AAP8BAAH/AAAAAAEAAP8AAAEBAAAAAP8BAAEBAAAAAAD/AAD/AP8BAAH/AAAAAAABAAEAAP8BAP//AAEAAAAAAAEAAP//AAAAAAAAAAH/AP8AAAABAAAAAAH/AP//AAEBAAEAAAABAP8AAAAAAAAAAAEBAP//AAABAAAAAAD/AP//AAABAO77ALnuAbjo//wCDw8AYl/5YVz6LCj+AAAAAQAAAgEB//4B/wAA/QAC9vUAAQH+AP8AAAD/AQABAAEBAf//AP8BAAEAAP//AAAAAQD/AAAB//8AAAD/AP8A/wD/AQABAAD/AAABAP8AAAEAAP4AAAAAAAEBAAD/AAIAAP8AISH9AQEBAf////8AzM8HUVL2AP8AAP4AAAAAAAABAAAAAAH/AAAA/wD/AQAAAAAAAP8AAAAA/wAAAP8AAAD/AAAAAP8AAAAAAAAAAAEBAAD/AP8AREL9ExMA7e0BAAD/AP/95ufm2dfaGhgZ/wAAAQABAQABAAD/AAABAAAAAAH/Af8B/wEAAQAAAAAA/gD/AQEBAf4A/wL/AQABAQAB/wAAAAD/BAAAAAEAAP8A/wABAQAAAP8BAAEAAf8BAAH/AAD///8BAAL/AAAAAAABAAABAP8AAAEAAAABAAD//wEBAf4AAEZFRB8fIHp6eq6trgAAAQAAAAAAAQAA//z6+c2/ud3U0DtIUDA8QgYHBwH//gD/AP8AAQAAAP//AQEB/wEAAP4AAQEBAP8AAQAA/wAAAQEAAP///wH/AP8AAAABAAABAP8B///9AQEB/v8AAQEB//4B/wEAAv//ABIZHUVVXjxKUNLIxdjQy9rRzvn48gAA/wAA//Pu6tLG6tLGvwQGCRYbHg4TFQ8REgsNDvf09PDu7Ork4u3p5AD/AAAA/gAAAAAA/wAAAQAAAAAA/wAAAgAAAgAAAQABAAD/AgABAgAABwD/AwAAAQD//wAA/gAAAQEA//8A/gABAAEB////AAD/AAAAAQAAAQABAgAAAQAAAwAABQABAwAAAwAAAgAABAABBAABBAABBAAABQD/AwACAgD+AAD+/wAA9wD96AH74AD++f8A/gAB/xMIA4YxBz8VAgECAgAB/wD9AP4AAfv8AP78AgUGBgkLC/kfDAwX8gIDAQABAQEAAv7/AQECAAD+AAEA//8BAQH+AQABAQD/Af8A///+APv8AQwMBP/9AgEAAP4B/wIK/gcS/AcG/wAAABMCBv8F/gsX8iAm//4BBgIK/wH3ASMM/vfs9wgI/wr5AQDvDQD/AP8A///9AQH7Av8A+wD+AQEBAPz9AP8AAAAAAAAAAAAAAP39/gD+AAABAQEAAQABAAD/////AQAAAAABAP//AAEAAAAAAQAA/wIAAP4AAAAA/wD/AAEBAAD/AAAAAAEAAQAAAQAA/wAAAAAAAQEA////AAEAAP8BAP///wAAAAABAQD/AKqsr7CvsQD//wAAAQAB/wD/AAAB/ntw/C8uAAD/AAEBAv//AQACAQD/AP8AAAEBAAL//v8AAgD//v8BAQEBAf///wEB/gD/AgAA/wD/AQAB/wABAQL/AP8A/wAAAAIBAQAAAAD//gABAAAAAP4AAAAAAAAA/wABAQD//wAB/wAA/QD/Af8AAAEB/////wH+/wAA/wAA/wEBAP///gEA/v7//wD//wEA/QAA/v8B/gD+/v8BAP8AAAAAAgABAAAAAf7/AP4AAP//AQD/AP8BAP8AAP4AAf//AAABAf7/////Af4AAf//AP7/Af3+AP4AAv7/Af7/AfwAAAAB/wAA/QD+/wD6/QAAAAAAAQAAAP//AAAAAAABAQAA/wH/Af8B/wAAAAAAAAAAAQAA/wAAAAD//wD/AgAB/wAA/wD+AQAA/wABAAD+/wAAAAD+AQAAAAAAAQAAAQAAAQABAAD/AQAAAQAAAQD+AAAA/wAAAgD/AAAAAAAA/wD/AAAAAAAnDwAXCgHp9f8AAADM8ABGFQAG/wABAQAAAAAB/wAAAAAAAQAA/gABAAD+AQAAAAABAAD/AAABAQAA/wABAQD//gD/AQAAAAAAAAABAAD/AAAAAAAB/wAA/wABAQD/AAD/AAAB/wD/AQAAAAAB/wD/AAD//wAAAAAAAQAAAAD/AAABAAD/AQAAAAAAAAAA/wAA/wAAAQD//wD/AQABAAD/AQABAAAA/wAA/wD+AAABAAAAAAD+/wAB/wABAgD3/gDE8AO47P7n+P8A/zo5/YuB9jo3/wACAAD+AAD/AAEBAAoHAQIC//3+/wAAAO3vAAD/AAABAAAAAAAAAAD//wAAAAAA/wD/AgAAAAAAAP8AAAEAAAEB/wD/AQEB/wAAAAD/AAAAAAAA/wABAf8AAAABAAEAAAAA/wD/Af8A/wH/ACUh/gMC/vv8AQH+/czQAgABAAD+Af4B/wEAAAD/AAEA/wAAAgD//gAAAAAAAP8BAAEAAP8BAAD/AAABAAD/AAABAAD/AAAAAAABAAAA/wAAAAD/ACQiATUzAri6/gAAAQAA/gD//dDR0EBAPwEBAQEAAP//AAABAQAAAAD//wAAAP8AAAD///8AAQABAAL/Af8A/wACAAEAAQD/AAEA/wABAP8AAAQA/wAAAP8B/wH/AQAAAP8A/wH+AP8B//8AAAH/Af8BAAH+AQABAP8AAAAB/wH/AAH/AQABAAABAAH/AP8BAAH//wAmJiOfoJwlJSaSkpX39vUAAAAAAAAAAAAAAP/w6+e2o5jZ0Ms+TFMfJir/AAIAAf8A//8AAQEA/wD/AP8AAAH//wACAf7/AAAA/wH/Af4AAAD9AQECAAEA/////wAAAAABAf8AAAD/AAECAQAA/wEA//8AAQH//wD9AP4GCQw1Qkc4REnn5ODb0tDb0s7e1tP49/MAAP8AAAH8+vjn39rn39r/AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAEAAAAAAAMAAAAAAAEAAAEA/wIAAAIA/wMAAAAAAf4AAAEBAQAA/wAAAP7/Af4A/gEAAgD//wIA/wABAQH/AAIAAAIA/wIAAQQAAAMAAAUBAQH/AAMAAgMA/wUAAQQAAQQAAAMAAAIAAgEA/wEAAf0A/e8A/OEC/e3/AAACAP/+AQAQBgOHLgtLGAH///4A//8AAAD+AAL3+AD9AP4UBv8LCPYGBPrsDQMEBv4BAQH/AAEAAAABAP8AAAEBAQD/AAAB/wAAAQH/AP8AAAAAAAD/AP8KDgL0+An/APAAAP4B/gD/AgAKJPXv1g379AT/+QAD+gIB8wb///cBBgIFBv4CCQMXDgICIP789f772/8BBP7/+wEAAAIA/gD98AMDEvwBBf8AAP/4/f8AAAAAAP8AAAEAAP8FAwMAAAABAQH//////wABAAEAAQAA/wD//gABAQH/Af8A/wAAAP8AAQEBAP8AAAD/AgD//gEBAAD/Av4BAAEA//8AAP///wEBAQAA/wABAAAAAAEAAP8AAQABAAAAAP/i5OSFg4f9/PwAAQAA//4A/wEBAP5XUf1VUgAAAAAAAAH/AAH+AAEB////AAAAAAEAAAH///8AAP8AAQABAP///wABAf8A//8AAP////0BAgH//wIB/v//Af0AAQEB/wL/Af4B//8A/wH//wAA/wABAAEAAf8AAAEA/wAAAP8A/////wEAAP8B////AAAB//7+AQAC//4BAP/+/v8AAP7///0AAf4AAf8A//8AAf4A//7/AQAA/wH//wD/AP/+//8AAQH//wEAAAEBAQD+AAH//wH+AP/+AP//AAH9/wD/AAH/AQH+/wD+AAH+/wD+AAP+/gL8AAD7/gECAQAAAAAAAAAAAgAB+/7/AAQAAP4AAAAAAQAB/v//Af8AAAH/AP8A/wAAAP8AAAAA/wAAAQEAAAABAQH/AP4A/wEAAQEAAQEA/v8AAAEAAAAAAAEAAQAA/wEA/wEAAP4A/wAAAAEA/wAAAP8A//8A/wEAAQEAAP8AAAEA/v8AAgIA/wAA//8ACgUBIhAA6fcAAP8B2fT/2/YALAoAAAAAAAAA/wAAAAAAAQAAAQAA/wAAAQAA/wAAAgAA/gEA/wAAAAEAAP8AAQEA/wAAAQAA//8AAAEAAAAAAQAAAAAA/wAAAP8AAQEAAAAAAAEAAQAAAP8A/wEAAQAAAgIA//8AAAAA/wAAAAAA/wAAAP4AAQAA//8AAAEAAQAA//8AAAAAAQAA/wAAAP4A/wEAAAAAAQEAAv8A/wAAAAAAAP8A+/8Eyu/+uOsA3fT9AAISEwJjXfJwaf8aGgAA/wAA/wAAAQAAAAAAAAAVEwALBgDz+AD/AP7w8QEAAf8AAAAAAQEA/wAAAAAAAAAAAQH///4BAQEA/wABAf8A/wAAAAD/AAABAAEA/wAAAP8AAAD//wABAP8BAgAA/wAA/wAAAQAAAf8A/wAAAgAiIP4aGPvh4wT+AQHY2gLt6QMRFP0CAAAAAAD/Af8A/wAAAv8AAAEB//8A/wABAQAAAAABAAAA/wAAAQAAAQAAAAAAAQD/AAAB/wAAAAAAAgAAAAAAAAAnIwK4AP0AAAAAAAEAAADd3d8BAQAAAP//AP8AAAEA/wEBAQD/AAAAAAAAAAAAAAEAAP4AAAL/AP8AAQAA/wEBAP//AAD+AAEB/wAAAP8EAP///wIAAP8AAP8AAAEBAAD/Af8BAAIBAf8A/wEBAAABAQD/AP8AAQEA/wH/AP8AAQAB/wD/AAAAAQAAAAD//wEB/wABDgsOhoaDOjo4enl81dXVAAAAAAD+AAAAAAAA/wD/3NPM4tvXMz9FNUFIEhcZ/wAAAf7+/gEBAQEAAP//AQAA/gD/AAABAQD//v//AQEAAgAA/v//AQEAAAAC/wEAAP//AgABAAH9/v8BAQAB/wAAAf7/AAIBAP///wEB//8AAP7+FxwhFhsgO0hP7Onm4NnW5Nzc5uHe9PHv8Ovn/Pz4AAABAAD/AQAB/wD/AAAAAAAAAAABAAAAAAABAAABAAAAAAACAAADAAEAAP8AAAADAAIAAP4CAAEBAAD/AQEB///+//8AAAAAAAAAAP8BAQH///8DAQAB/wEC/wABAAAEAAACAAEDAAAEAAECAQAC/wICAP8FAAADAAEGAAADAAACAAADAAD/AAD/AP/zAP3mAfrkAAD8AAAAAQAA/gAAGAcCkjcMPhUD/fv9AgH/AQD/+vwB8/gABgn7Fg/5Af8C8wEACf4EB/fsAhEE//8EAAIDAP//AQECAP8A/wABAf8AAAEA/wD9AQAC//8A/wD/AAf/EBMB7doJ+/MGBgz6/wH+AP//Axb69gj/AvECAf/+//7/+PUF/O/4Axr/Af7//wEAAP8CAP8C/vEB//P4/wj+APoE//8BAQL///oBAP///wEAAf///v8AAAAAAAABAAAADg8RDw4NAAAA/wAAAAAAAQEAAP8AAf8A/wEAAgD//wAAAAD/AP8BAQEB//8AAQABAAAAAf8AAAH/AAEBAQACAQAA/wD/AAABAQAA/wABAAD/AAAAAf+gb2nzAAEAAElEQVT/AQEAAAAA////AgECkpOY29vaAAD/AP8AAAACAQD/JSQAfHX/DAsA/gAAAP8AAQEBAgD//gAAAQAAAAD/AP//AQECAAAA/gAAAAAAAQL9//8CAAEA////AAEC//8DAAD/AAAAAAAB//7/AQH/AP///wABAAL/AP8A/wAAAQH//wD/AAIBAf8AAf/+//8BAQH+AP8B/wAAAf//////AQEA//8AAAD/AQD/AAAA/gEAAQD/AP/+/wD9/wD+//8AAAAA//7/AQMA//7/AQAA/f7//wAD//4A/QAA//8B/wD/AAAC/wAA/wEB/wEB/f8B/f8B/wD//v8A/QAA/QAB/AAB/P8A/gD//voAAAH/AAICAP4B/wD/AAD/AAH/Af8B/////wABAAAAAQD//wABAQD//wABAP7/AAEAAP7/AAAB/wAAAAABAP//AP8BAAD/AAEAAP/+AAEBAP//AP8BAAH/AAD/AP8AAAABAAABAAABAAD/AAACAAEBAAAAAP4BAAD/AAABAP8BAP//AP8CAAD//yQPAsfo/wD/AAD/AM/yACsLAAH/AAEAAP8BAAH/AP//AAIBAP//AP//AAECAP8AAAD/AP8AAAEAAAEBAP8AAAEBAP//AAEBAAD/AAEBAP8BAAAAAAH/AAABAP8AAAEAAP8AAAABAAAAAAEAAAAAAP//AP4AAAEAAP/+AAABAAABAAEAAP8AAP8CAAD/AP//AAEBAAD/AAD/AAEBAP8AAAH+AAABAP8BAAAAAAH/AAABAOn7A7Do/8XwAf3//QD+Tkj9fXf5NDL//wAAAP8AAP8AAAAAAAAAAAIAAAABExP9Gx0F2Nv/AAAA3uQBAAD//wEAAQAAAAH/AP8AAAAAAAD/AQEAAAD/AAEAAAAAAAEBAP8AAQAAAAAAAAEBAP////8AAQIA//8AAf4AAAAAAAEAAAAAAAABAAH/AP8AERP/HBv/4OIA/gD/6On/09YDQD79/wAAAQAAAf8AAAEAAAD/AP8AAAAAAAAAAAAAAAAAAAAAAAIA/wEAAf8BAAH/AP8AAAAAAAAAAAEAAP8BAAAAAP8CHBwAAAD/AAEAAP8BAAAA2NjZAAAAAP8AAAEBAAEAAAD//wABAAEAAP//AAEAAAAA/wABAv///wABAP8AAAEAAAAAAQAAAP//AQAA/wAABAABAQD/AAEAAP8B////AQEBAQAAAAEAAP8BAAD//wAAAAABAQEBAP8A/wAAAQAAAP8A/wH/AAABAP///wEBAQH/AAAB//8BAQAAAUxNSzEwMIqNjp6anPb39wAAAAAA/gAAAAABAPr49ce5sNPKxDZBSjE8QQ0REwD//////wABAv8A/wD/AQIB//8BAQD/AP8AAP///wAAAP8AAQAA/wD/AAABAf3//wECAQL//wAAAAAAAf8B/wH+AP8AAQD/AQAB//4A/wD+/QAAAQAA/xMXGxMXGzM+RQD///v8+ujk4uvm5Pbz8vXz8tLFvuzn4gAA/wAAAQAAAAAAAAAAAQAAAQAAAQAAAwABAAD/AgEAAf8AAQH+Af8BAQAAAAAAAP///wAAAQAAAAABAAD+AAABAv8AAQABAf//AQD/BAACAwAAAQABBQD/AQABAgABA/8ABAD/AgAABQAABAABAgAABAAAAgAA/gAA+QD87gH85P/+9QAA/wABAf4A/wH/AP8AARgIAjoN+wD6/QP//v8A/gUIAgIJ/wEL/Q4E/AH+A/v/AAABAfz9/gr69gL/BAAABgD9BAABAgAAA/8AAwH/AwAA/gD/AQAAAQAA/wD/Af8CAAIR/v4AA+7uCO/qDRYI7/8CAAABAAED/fD//xD///8B////Av75//PoBREb+wEABP/8AAAAAv7yAPfiAgUXAf8OAADxAQEBAP7//wIH/QEDAAH+AAAA//n+AP8AAQAAAQAAACEfICIkIwD//wD//wAAAAAAAQAA//8AAAAAAP8BAQD/AAH+Af8BAP8A/wAAAQD/AAABAP8AAAEBAP///wEAAf4A/wAAAQEAAf8A/wD//wEAAAAAAP8BAAH/AP8BAAAAAsbHyaCeoQAA/wAA/wAAAAAAAAQC/nZsASgkAP//AAEAAQACAQAAAP//AAAA/wAB/gEAAf8AAf8AAP8ABQAA/wH///8AAAD//wEB/wD/Af8AAAEA/gAAAgAAAQAA/wAAAQAA//8AAAD+AAABAAEBAQEA/wD/AAAA/wAAAP/+//8AAAEB/wD/Af8A/gEAAQAA/gAB/wD/AAEB/v4B/gH+/v8A/QIAAP4A/wEA/QD//QAB/wAAAf8A/wABAf///v8AAP7/Af8AAP4AAP4AAQAAAP7/AP8BAv7//wAAAv39////Af8AAP8AAP4AAf4AAP4AAf7/Afz/APv9AfsBAPbwAAD//wD//wD+AQIBAf4BAAD/Af8AAAAAAQD//wAAAQEAAQAA////AAAA/wAC/wAAAQAAAAAA/wD+AAACAAAAAQD//wAAAQD/AAABAgD//wAAAAABAAD/AAAAAAAAAAD/AQABAQAAAAAAAQAA/wD//wAAAgAAAAD+AAABAAD+/wD+AgABAAD/AQApD/4OBwDy+f8AAADR8ABRFwAMAQAAAAAAAAD/AQD//wD9/wAAAAAAAAD//wAAAQABAAAAAQD/AAABAAABAQAA/wAB/wAAAQAAAgD//wAA/gAAAAAAAgAAAAAA/wD/AAAAAAAA/wD+/wACAAAAAAAAAQABAQAAAAABAgAA/wAA/wD+AAABAQAB/wABAAD/AAAA/wAA/wD/AQAB/wABAQD/AAAB/wD//wAB/wD4/wDH8gGx5v/q+gD/ACsoBXRu+FVQ+wkLAAABAAEAAP//AAAAAAEAAAAAAAD/AAD/AAID/xEQ/wAA/wAAAN7gAQACAAAAAAD//wAAAAAAAAD/AAAAAAD/AAABAAAAAQABAAAAAAAAAAAA/wAAAQAA//8BAAD/AAD/AAEBAf8A/wH/AQD//wABAAD//wECAAAAAAAAABoX/v///gAAAf3+/tXXAUA+AAEAAAAAAQAB/wABAQD+/wABAAD/AAABAAAAAAAAAAAAAAAAAAH/AQAAAAAAAQAB/wH/AAAAAAABAP/9/wEBAQAB/gQF/gABAAD/AgAA/wAAANva3fDw8RAPDv//AQIBAP8AAAD//wAAAAABAQAAAAD/AAIAAf8A/wAB/wD/AAH/AAABAQD//wEAAAABAAEAAQQAAAAAAQD/AAAA/wIBAP8A/wAAAAEA//7/AAABAAEAAAD/AP8A/wAAAAEBAAD/AAAB/wD/AQABAAEBAQD//wAAAQAA/wAAAf8CAAH/AAEaHRyQj4w+PTp8en7a2tsAAAEAAP8A/wEAAP8AAAH07+y+rqLSx781REstNj4JDAsA////AP8AAAD+/wEAAf4AAAAB/wD+AgAA/wABAAAAAQAA////AAEBAAAA/QL+AgAAAAACAf///wEAAP8BAAAAAf8A/wD//wACAf8AAP8AAAEBAf8AAAEBAQAAAQEFBgcdIiUcIiUDAQH//v/6+PbEtOIAAAEBAAD/AQEA/wAAAAAAAAAAAAIAAAEAAAIAAAP/AAAAAQH/AAEAAAEAAAEBAAD/AAEAAQEA//8A/wIBAgMAAQH//wAAAAIAAgEAAAUAAAMAAQIAAQQA/wEAAAMA/wIAAAMAAQMAAQMAAAIB/wP/Av4A/vMB/eYA/uwA/voBAf8AAAABAQH+//4BAAL/AP4BAADR8Pyh4AFkHgIAAP8GBgENFPkBAf8A/wP79AH9/gD/AAECAP4DB/8EDP0B8/sABfkAAwQAAQMAAwQB/wT/AgX//wUAAQMBAAEA/gD////8B/8GCP/9+//x9Afr6wwREfADB/3/9f77/QAA//z/AAb/AAIBAP/8AQHw7gQR/PoA/QMB/QX++gP96P4HFP4DH/wAzwb/AAD//wD/BgAEDvwBBf8AAwDy9P/o8/4AAAAAAAAAAP8EBgP+//8C/wAAAv8AAAEAAP8AAP8BAAH//wABAQD+AAABAgABAP8A/wH//wAAAAD/AAABAAAAAAAAAf8AAP8B/wEAAAAA//4BAQH/AP8AAAAAAAIAAf//AAAAAAH09PKGh4vu7esAAP8AAAAAAAABAP9MSv5YU/8A/gAAAQD/AAAA/wIBAQEAAQEAAP4CAP7//wH/AAIAAP8BAf3/AAL///0BAQL/AAH+/v4BAgEB//4AAAIAAf8AAP4A/wEBAP8A/wABAAIAAf//AAIAAP7//wH/AAAA//8BAAAAAf8BAAEA/v8AAv8CAP/+AP8AAP8BAP/+AAD///4B/wD/APwA//3+//4AAv3///4AAf///f8AAQAAAAD+AP4A/wD//wEAAAAAAAH+/wD/AAH+AAAAAQH+/wD/AAH+/v8AAAH/AQD//gH+AAD9AAH9AAD+AAH/AAH7/wL7/wH8/f/69v8AAAEA/wAABP4ACAIAAP8AAAAA/wEAAP8AAQAAAP/+AAEA/wEBAQD///8A/wEAAAEAAAAAAP8AAQAA/wAA//8AAAIAAP8AAAAA/v8AAQAAAAEA/wAA/wAA/wAAAAIAAgAA/f8AAAEAAAEAAAAA/wAAAAAA//8AAQEA/wEA/wAAAAAA/wAA/wAADQYAKREAyecBAAEA5Pf/zfIAQA8A/v8AAQEA/wAAAQEAAf8A//8A/wAAAgEAAP4AAAAAAQAAAAEAAAAA//8AAQEAAAAAAP8AAP8AAAEA/wEAAQAA//8AAQAAAAAA/wAAAf8AAAEAAwEAAP8AAAIA/wAA/wEA+f0ABQMAAQAAAAIAAf8AAQAAAAAAAAAA/wEAAQAAAQAAAP8AAAAA//8AAAEA/wEA9P0AyvQBvuoA4vYA/P8MDwRsYvlvavUWFwAAAAAAAAD//wAA/wABAQAAAAAAAAAAAQD/AAEAAf8BAAAKCf8AAP8AAP/d3wD8+gADBgEAAf8A/wAAAAEAAf8A/wH/Af8BAAH///8AAAEBAQD/AP8BAAEAAAAAAP8BAAD/AQAAAAD///8B/wD/AAAAAQAAAAABAQD//wABAQAAAAIcHf7/Af4A/gH/AP7X2AIAAwD//AABAf//AQAB//8AAQAA/wAAAgD//wABAAAAAAAA/wAAAQAA////AAAA/wABAQD/AgAB/gAA/wAAAAAA/gAAAwDk5f8AAAAAAP8AAQEA//7j4+DIxsZISUgBAf8AAP8B/wIAAAH/Af4AAAIA//8AAAH/AP8BAAEAAP//AQEAAP////4AAAEBAAH/AAAA/wACAAAAAP8BAAAAAAD/AQEA//8AAAD//wEBAQEBAAABAQEAAP8AAAD/AAAA/gEAAAAA/wEAAP8A////AAABAAEAAP//AAAAAAAB////AAD/AgD/AgEBU1NTtrezd3d1GBcYAAABAAD/AAABAAD/AAD/AAAA7Ofit6OXnYZ2v7Go6OTfAP8BAAAB/wD+/v7+/////wH/AP4A/wD///4A//4A/v8AAP7//wD//wD+//8A/v8A/P7//f/+///+/v/+/v7/////AP8A/f0A/v///v8A/v7+/v7+/f7+/v8A/v4A/v4A/////v7+/gD9CQsNAAAAAAD//wAAAP//AAAAAAAAAAABAAEBAAADAQADAAABAAEDAP8DAAAFAP8EAAAE/wAEAAAEAAAEAAEEAAAE/wAF/wAGAAEIAAEIAP8KAAEIAAEHAAEGAP8EAAIFAAEDAAIEAAACAAEDAAABAAH9//7qAfvWAvvQAf3mAf/5/wD/AQAAAwICUlBSioaGBgcGAQABAAABAQEAl938zu7+BAH+BQX9APwAAPsB/voAAQH/BAIABwH+AwH/BAMAAfb//+7/APH8//n3APr1//nz//3xAfzvAf3wAPr2AP36AP/+/wABAAz8/wH/AwD//P4D5esL6+cL+uz89+4B/fX//wT8//4A/wD///8B+P0C8fMG/f0DAAACAPsD/uz8/wz4BiD8AesH/u0F//4B/v8A/wYAAAn+/wP/AP/+9/n95vX/AAD/AAD+AAD/ExUXAAABAAEAAAAAAAAAAAAAAAEB/wEB//8AAP8BAgEBAAABAP8BAAAAAQH/AAEAAQAAAAD/AAAAAQABAP8CAAAB/wAAAAEAAAEA/wAB/wEB/wAAAP8AAP8AAQAAlpectbS2AAAAAAEBAAABAQAAGhj+e3P/BwcA/gAAAAAAAQAAAAAB//8D//8CAAED//8AAAD/AAEAAAEAAAD/AP//AAAA////AAD/AAAAAP7/AAD/AAD+AAD/AAD//wD9AAD//wD//wD//wAAAAD+/wD/AAD+AQD/AAEA/wD+AAD//wAA/wH//wD//gD+/wD+AQD//wD+AQD/AAD////7////AAEAAAH+AP//AQH+//7/AAD/AAAAAP8AAAAA/gAA/gAA/v8B/v8BAP8B/wAA//////8AAP8A//8A/wAC/gAA/f8B/f8A/v8BAP8B/v8B/P0B+QAB+f4C+v8A7/IA590AAP//AP//ABED/xMAAP8BAAAAAAH/AAAAAAAAAf8AAQD/AAD///4AAAEBAAAAAP/+AP7/AP//AAAAAP8AAP8BAP//AP8AAAABAAAAAAAAAP//AP//AAAAAP8AAP8AAP4BAAEAAP//AAD+AP4AAP//AP7/AP4AAP8AAP//AP8AAP//AP8AAP//AAAAAC8SAAEC/wAB/wADAc7xAP4BAAABAP//AAEAAAAAAAAAAAAAAAEBAAD/AAABAAABAP8BAP//AP//AAH/AP8AAAABAAEBAAABAP8AAAH/AAABAAEAAP8AAP//AAAAAP8AAAD/AP//AP8AAP4AAAACA9XzAILYAJHeANr4AP8AAAAAAP//AP8AAP7/AAEAAAL/AP4AAAD/AAD/AAEAAOn4ALnvAIjhAaLiAOH4//0BQUAEtqn0hYL4FhcAAAEAAAEAAP8AAQAAAQEAAAEAAAAAAAAAAAAAAf8AAP8A/gABERD+/wAAAAAA0tIC4eEAAP7/AP4A//8A/wD/AAAAAAH/AAAB/wAAAAEA////AP8AAQEAAAH/AAAAAAAB//8AAAAA/wABAQEBAAEAAAD/AQABAQEB/wAAAQABAAEA/wAAGxsBAAH/AAH/AQEA6OUCAP0BAAEB//8AAf8AAAAAAAAA/wAAAP8AAf8AAP8AAAAAAAAAAP8AAAAAAAEAAQAAAAAAAf8AAAAA//8AAQEAAAL/+fz/xsj+AAABAAH/AAD/AAABAP/+tra4AAAA/wABAP8C/wAA/wD/AAABAP8AAQEB/wAAAAEB/wAAAAABAQAAAAAAAAEBAAEAAAH/AQAAAAEABAEAAP8A////AAEBAP//AAIBAf4B/wEAAAD/AP8AAAD/AAH/AAEBAf8AAAH/AAABAAAAAP8AAAEBAf8A/wD//wABAgH/AAD//wAAAP8AAP//AQEBAAEAACIhIoeIhmVlYpWVl52dnvPy8v8AAAAAAQAA/wAAAAAAAO3n48Kwp8m6sygxNyk0Oh4mKwcICv///wH+AP4AAAH/Af4B/gD/AQAAAAABAgD+//8AAAEA/v8BAQEAAQEBAP0AAAAA/wIA//4CAAEAAv8A/wL+AQEB//4BAAD//wD/AAEB/gEBAQABAQH/AP4AAAAAAQ4QEQAAAAAAAAAA/wAAAQEA//8AAAEBAP//AgABA/8AAQAAAwAAAwABAAAAAgAAAQAAAAAAAgAAAgAAAQD/AgABAQABAgD/AwAAAQAAAgABAgABAwD+AgAAAQAAAQABAAD/AgAAAQAC/gD/8wD+8wL/7gD+8gAA/wIBAP8BAAEAAAMDADc3OXF0c0tKTAcGB+fm6JCUlAEAAP//AeT4/nfX/Z8zASwOAAD9Af//AAD+AAIAAQAB/wYC/gkE/wEEAP/5AQAB///4AfjwBujoDf4BBQYL/QwR+w4R+fz39P7/AwcSCAELBgMIBAABAAIC//j6At/qDg8GEf4O8wUDAgwS+AoN+v//Af4A//sAAvoBAP/5/vv1BwMC/QD0+gMG/wISAPzmA/7NBgD0AgEC/gAA///7AQAD/wAB/wAC/+36APwAAAAAAQAA/wAAARcYFgEBAAD/AAAAAgAA/wD/AAAAAAAB/wAAAP8A/wAAAQEAAP8BAAD//wAAAgAA/wD//wACAQD/AAAAAP//AAIBAAAAAAD/AQABAAEBAAD/AAAA/wEBAf///87Oz5aUmAD//QAAAAD/AAEAAgAA/HFqADArAP7/AAH/AAAAAAABAgAA//8BAQD/AQD/Av8BAAD/AgD+/wAC/////gEBAQAAAP8BAQH//wAA/wAB/gD/AQABA//+/gEAAgABAP8A/wAAAgAAAAEAAP4A/gH/AQAAAAH/AAABAAD//gACAQH+/f8A/gD//wEA/wAAAf8A/gEA//4A/QAB/QAA/QL//////QAA/wD/////AAABAP//Av8A/v8B///+AP8AAQAAAf8AAP7/Af//AAAAAP8AAv7/AP8AAf4AAAAAAP//Af8AAAABAP7+AfwAAP7/AP4AAP39AfwAAf3/AO3nAfPn/QD/AAD//wANA/8KAAD+/wABAgAA/gAAAAABAP8AAAD/AQEAAP8B/wH/AP8AAAAAAQACAAD/AQD/AAAAAQAB/wD/AgAAAAAA/wAAAQD//wABAAD+AAABAAABAQD/AAAA/wD+AQAAAQD/AAD/AAAAAgD/AAD/AAAAAAD/AQABAAAAAQAAAQD//wD/AQMjEv4bDwDl8v//AADX8wDe+QAjBwD+AAABAAABAQD+AAACAAD//wAAAQD//wABAAABAQAAAQAA/wABAQD//gAAAQD/AAAA/wAAAQABAQD//wAAAAAAAAABAgD/AAABAAAAAAACAAD9AAAB/wD0+v6s5AHf9v/f9QHS7QEpEQMdC/0UBv4NAgAPBQAEAgD7/gD+/gDp+gDk/AHl/AHl+QD0/P79/wwNBEY+/VJN+09M+AsM/gD+AAABAAD/AAD/AAAAAAAAAAAAAP//AAD/AAABAAH/AAAAAP8AAAL//xES/wAAAQAAAfz+/9naACMjAAABAAH/AAAAAAAAAQAA/wH///8BAQEAAQEAAP8AAAH/AAAAAgAA/wAAAAAAAAAAAQEA////AQD/AAABAAAA/wD/AAEAAAD////+AP8B/woI/gH/Av0AAAIAAebqAf7/AQIA/gACAAD/AAAAAAABAAEBAQD+/wACAAD/AAAAAP8AAAEBAAAAAAH/AAABAAAAAAD/AP//AAEBAAAAAP8BAKGoA8rOAAAA/wAAAQD/AAAAAQAA/qipqWlraCkoKf4BAAEAAAH/Af8A/wAA//8AAAIBAf8A/wAAAAD/Af8A/wEBAAAAAQEAAP//AAAB/wD/AAT/////AQABAAAA/wEAAAD/AP8C/wD/AAD/AP8BAQAAAAAAAAH+////AAACAQEBAAD///8CAQD//wABAQH/AAABAP8AAQD/AAD//wAC/wABAQD///8AAQEBAQH/AP8iIyONjoxbXFqNi46pqqv+/v8AAAEAAP8AAAAAAP8AAAD59vPRxb3Sxr8aISQiKi8hKjEbIyUEAwf/Af8AAAD/AP8BAAEAAf8A/wABAQEAAP7///8AAAL//wABAQAAAQD9AAAA/gEBAP7/AQEAAP8BAAAA/wD/AQABAAAAAAAA/wEAAP4AAAD+AAACAAEKDg8AAAAAAAAAAAAAAP//AAIBAAH//wAAAP8BAQT/AAQA/wQAAAIAAQAA/wEAAQIAAQEA/wIAAgEA/wEAAQAAAf8AAAIAAQMAAAEAAQIAAAAA/wIAAgEAAAEAAQAA//4BAPb//fIB/vEB//YAAP4BAP//AAD/AAD+/wABAQANDQxtbnByc3MPDxAAAP8AAABzd3evs7Ph4eAAAAEAAAHR8v571QKcDgEYBf8BAwH/AgD//v4AAgABAP8CAv//AP8A/QEABAH69gbV0xn49QUDAgH+AQAICvwlN+oLD/n59Pr//foB/QgB+g0ACAIFA/3+/fnc6Q8H/BEpMt7w+QcD+QMKA/z5AgH8AAD6AQL9AP77+QD36fsJDf4BAQH/DQH+7wX70AYC8wIBAgD//wEAAAL++v0BBAAABf4AAADw9/8AAAAAAAAAAAAAAAAeHh4CAAD/AQD///4CAQH/AAAAAQAB/wAAAQAAAQABAP///wEA//8AAgD///8BAf///wAA/wEBAQAA//8BAf//AAEAAAEAAQD///8AAQABAAAAAQD//wD/AACKjJDk5OIAAAAAAQAA/wEAAP44Nf9jW/4BAQAA/wAAAAD/AQAAAAAAAAEA//8AAAAAAP8A/wH/AAAAAgAAAAAAAAD///0AAAP/AAAA/wAAAP8AAQH/AAEAAP8BAQAA//4BAAEBAf/+//8C/wH/Af8BAAEB/wH/AQH/Af8BAAD/Af/+/v8CAAAAAf7//f8AAgAAAAD+//4BAP7/AP4C//4AAQD+//0A//4BAf/+AP8AAf8B////Af/////+////AQH+/////wH+AAEAAAD/AQD//gD+AAD/AAD+AQH//gH8AP/9AAD+/gD9AAD+AAH////9AAH9AAL6AAH7/QD+AAHo4gAA/QEAAAAA/gEBFwT/AgEA//8A//4AAf8AAAAA/wAA/wEAAAD/AP8AAQH//gAAAP8A/wAAAAEAAAAA//8AAAAAAAIAAP8AAAAA/wAAAAAA/wEA/v8AAQEA/wAA/wAA/wAA/wEA/wEAAQAA/wEAAAAA/v8A/wEAAAAA/gEAAQAA/gAAAP8A/wAA/wEAAAD+BgIAKRD/5PIBAf//8/sBwu//JBkAAv4A/wEAAP8AAQAAAAAAAAIAAP8AAAEAAP4AAP8A//8AAQEA/v8AAAAA//8AAQAAAQEAAQEAAAAAAQAA//8AAP8AAAAAAQAA/wEAAQAA/v8AAAEA/f8BreYD3PT8AP8AAAD/+f//0O7/0fAA/wIEAgIB/wABAwb+AAH/AP8AAQL+/wEA/v4A/gEREP1LSfxfXftCOvYAAgAAAAAA/wAAAAAA/wAAAgEA//8AAQAA/wAAAAAA/wABAAAAAAAAAAAAAP8CAQD//wAdHAAAAAAAAAAAAADJzgJKSv4AAQAA/wD//wABAf8A/wEAAgAB////AAABAQAAAAH/AAEB/wAAAQAA/wABAAD/AAAAAAEBAQD/AAABAAH//v8BAAAAAQD/AQABAQAA//8jHv7/AAAAAAD//v/e4gDm5QEcHQD//wABAQAAAAEA//8AAP//AQAB/wAAAAAAAAABAQAAAAAAAAAAAAD/AAABAAD/AQAAAQD+/wAAAQCjqwF5fwP9/P0AAAEA/wAAAP8AAP8AAAHs7O2WlpeUk5EBAAH/AAAAAQABAAH/AQAAAAD+//8BAQEBAP//AAABAQAAAAEAAAD/AAD/Af8CAAD/AAECAAAAAAABAAAAAAD//wH/AAAA/wEBAAAAAQEBAP4AAP8AAP//AQEAAQEAAAEA/wAAAAD///8BAAD//wD/AAAA//4A//4A//8AAQAAAAAA/wD/AAAAAP///wAAAQABAP8BAAAAMTEyoKGfubq4Xl5dCQgIAAABAAABAAABAAAAAAABAAD////85d7Zw7Sqo41+qJGGzMK58O/t/gD/AAAB/wD//v7//f///f79/P8A/gAA/v///QD//v8A/v4A/v4A/v4A/f8A/////v7//v7+/f/+//3///7//v7//v/9//7//f////8A/v//BAYIAAAAAAABAAABAAAAAAD//wD+AAD/AAAB//8DAP8EAAEEAAIEAP8EAAEGAAACAP8FAAIGAP4FAAAEAAAEAAAGAAAEAAEDAAECAAAAAAAAAf/6Af/2Af/uAfzjAvzbAvvaAv3lAf/zAAD9AQD/AAEBAQAAAQAADw8Pamhpur2+f4GCDw8Q////AAAA/wAAGhwac3Nx/wAC/wABAP8BAf8CuOkAldsB/v7///4BAAH/AQP/AQH+AQT//wEA//4AAP4AAAEB6OYO+fYGAgMBAAD/AwAB9/YE8uoLAwT+CQ4CAgb/Afv5A/HzA+v2BfH58/AB/vn+6eYJ3dkVAvAI9OkIAfMHAP7+AP8A/wAA//4BERL0Dgf8AQICAAIA//YC/M4EAfAC/wH///8B/wAB//8C/v4BAAP+AAP+AAP93+/+AAD/AAAAAAABAAD/Ih8g/wAAAf8BAQEC//8AAAEAAAAA/wAAAAAB//8A/wAAAQEAAAEBAP8BAQAB//8AAAICAQD/Af//AAAAAAEAAAH+AAH/AAD/AQAAAAAB/wAA//8AAAAAw8HCtLGz////AAH/AP8AAQAAAgIAa2H/DAwA/v4AAQAA/wIBAAAD/v////8AAAH/AAAA////AAABAQH////+////AAEAAAAAAQEBAQD/AAAAAAEA///+AAD+AAD+AAD+/wD/AAD////+AP///gH//wAAAf8A/wH/AAD+AAD//wD+AP//AgH/AAD+Af//AQIAAP8AAQD9AgD/AP8AAf///wEA//7+AAEA/wD+/v/9Af/+/wAA/wEAAAEAAAAAAQECAP8BAAAB/wAB//8B/wAB//8A/gEBAQEA/QAA//7//wD//wAB/gAC/wIB/wEA///+/QAA/v4B+/8B/f4B/v8B/wD/5Nb/AP8AAP8BAP3/AB4FAQD/AAAAAAEAAAABAAABAP8BAAD/AAH/AAEAAP4AAAAAAAAAAAEAAAD/AAABAAABAP8AAP//AP8AAP8AAP//AP8AAAD/AAIAAP/+AP8AAP8AAP8BAAABAP//AP4AAP//AP4AAP8BAP8AAP8BAAABAP8AAAACAP4BAP8BAP8AAAAB//8A/zETAAoF/wAAAAEA/8/vAOb5AP8AAAD/AAH+AAD/AP8AAAD/AP8AAAAAAAACAAD/AAAAAAAAAAEBAAABAAEBAAAAAP4AAP4AAP4AAP4AAAABAAEAAP8AAAECAAEAAAEAAAEBAAAAAMHrAbnq/v3+DQz/AwICAQD+AAD/IR38Ukz8IB75AwH7//34//z3///7/f37BAP6Lyz5cW33sKrzoZrxQTv3AAIAAP8AAP8AAAAAAAAAAAAAAP7/AAAAAP8AAP8AAAABAQAAAAAAAP8AAP8AAP8A//4A/wAAEA79AAAAAAABAQADycoCAAIAAP8AAAIAAQAAAP8BAAD/AP//AAABAQABAAABAQAAAAAA/wH+AP8AAAAAAAABAAAAAAAAAP//AAAAAAD/AQAA/wEA/wAAAQAAAP8AAAAAFBQBBAIAAAD/AAD/9PX88/H+//8AAQAAAP4A////AAAA/wAAAAAAAAEA/wEA/wEAAAAA/wEAAAAA/wIAAAEAAAAAAAEAAQEA2d8DbXUFbG8I7+v9AAABAAAAAAAAAAIDAAAAAAAAAAD/q6qs0tLTAAD/AQAAAAAA/wD/AAD/AAD/AQEBAAD/AP8AAAH//wD//wD/Af//AAD+Af8A/wAAAAAABAAAAAEBAAD/AQEA/wD//wABAP///wIBAf//AP8B/wEAAQEAAAAA//8AAgD//wABAQD/AQAB////AAEAAAAA/wEBAf4AAAEBAP8AAQAA/wAAAAABAP//AQH/AP8BAAD//wAAAAEAAAMFBUFCQUNDQWFhXoeGi7u7uQAAAf8AAAAA/wAAAAAAAgAA/wAAAP/9/N/WzeDXzwsPEx8oLh4mKhwjJxUbHgECAf8AAgD+//8AAAIAAP8BAP0BAAEA//8AAAABAgH/AAD/AQD/AP4C/wAAAQH//wIAAAAAAAD/AQAB/wD/AP8A//8BAQIDAwAAAAAA/wAAAAAAAAAA/wAAAAAA/wABBAAABQABBQAAAwD/AQAAAgAAAQABBAAAAQAA/wABAgAC/wAA/wD/AAAA/wD/+wAA/AAA+QD/+gAA+AD99wAA/QEA/gEAAgAAAAAAAAEAAQEAAf8A/wH/AAoKDE9RUG5ubDAyMwQEBP//AAAA/wAAAf8AAAAAAAAAAF5gX7S1ubm5uQAA//8A/wAAAJja/j8WAkMd/wH//wAC/wECAQAA/wD/AAEBAQAAAfTzBunsDQACAQEA/gACAf///wAAAP/7//8EAQH9/wD+AP8A/QHw9v//BvsCBfH3/AD9/gIC/ubcE/jk9wwO+gj8/wAB//4AAf0B//4C//4CAfv8AgT/AQAD//3fAv7pBQECAP8BAAD//////gAAAQABAAAFAAADAf8B/uD0/gAAAQAAAAAAAAAAAhgaFwD//wAAAAD/AAEAAP8AAQAA/wABAAH///8A///+AgAB/wABAf8A/wEA/wH/AQD//wABAf3+/wIBAAH///8BAQH/AP4B/wEAAgD//wEBAAAAAPr6+pSWmPb39QAB/wD//wEAAv8A/01GAFNP/gAAAP//AAECAAH///4B/gEBAf8AAQD/AQAA/wEA//8A/QD/AwEBAf/+AAAAAAEAAv///wAAAAAB/f//AgEBAAD/AAABAP8ABP8B/QD//wABAwAB/gEAAf8AAgD//wAB//8AAQIA//8A//8BAQH+/wEA//4BAAH///8C///9/v8A/wL///4A/P///gAB////AAAAAAD/AAD/AQD/AP8B//3//gAAAP4AAf4AAf7/Af//AP//Af8AAQAAAf3/AQD/AAEAAPwAAf4AAP//AAD/AP7/Av7/Af4A//7+APv/Avz/Avr/Avv9//oAAuXU/QD/AgAA/gALBP8lBAD+AQAB/wAAAQD//wAA/wAAAAAAAQD+/gABAQAB/wD/AAD/AQAB/wAAAQD+/wD/AAAC/wD+AQAAAAAAAQABAAD//wABAQD+AAAAAAAAAQABAQD//wD/AAD/AQD/AAAAAgD//wAAAQABAAAAAQD+/wABAAD+/gD/AAAAAAAAAAD9/wD//wAYCwAwFgDG5gABAQHr+v/G8QBTFQD//QAAAQAAAQAAAAAAAAAA/wAAAAD/AAD/AAABAQAA/wAAAAABAAAAAQAAAQAB/wABAAD/AAAAAQD//wABAQABAAAA/wACAAD+AAAAAADW9AKl5AH+/hUT/YeE/H2GBOXjAQMAABobAqyp+PXzAt7iAfTy/wIDAAEA//4BAA8MAiAc/gkL/wD+AAD/AAEA/wAAAAABAAD/AAAAAAD/AAACAP/+AAEBAAD/AAD/AAAA////AAEBAP//AAECAAD/AAAAAAL+ACMfAQAAAAAAAf8AAdHRAuLfAB0eAQEA/wABAP///wH/Af8AAAEBAAAAAQD/AP8AAAEC/wD/AQABAAD/AQAB/gH/AQABAAD/AAEAAP//AQADAAH+/wAAAAACAP//AQAB/yUi/yooBNDV/v8B/vb4/3+KBWtk+zw6AAMC/wD/AP8BAP//AAECAP4AAAAAAAEAAP8BAAEAAP8BAAAAAAAAAP8CAMvQAamuBaOiBOvs/wEC/v8CAwD+/w0LAicZAMzc/AABAAD//wAAAurq6ouMjqOioP8AAAAAAAAAAP8AAQL///8AAAAAAQABAAD//wAAAgABAP8BAAD/AAAAAQD//wEBAAQAAgEA//4AAAL+AAABAAEAAAABAAH///8AAf8BAAAA/wD/AgD//wEB//8AAQEAAP8AAf///wEBAAABAAD+AAEAAQAA/wABAAAAAP///wABAAABAQAAAP8AAAEAAAAAAgEAAAAAAP8C/wD/AAEAAAA/Pz8zNDPGxcafnqKur6/8+/r/AAEAAQEA//8AAAAAAP8AAAH////08OvVyL7VyL4FBwscJCcaISUWHiMaISYOERT9Af4B/wH+//8BAQIBAQAA/v//AQD/AP8BAAEA/v8CAgEAAAD+/v8AAQAAAf8CAAEBAgH//wAB//4CAwQAAP8AAP8AAAEAAAAAAAEAAAEAAAQAAAYAAQkAAAIAAAAAAAIAAgAAAAAA//4AAf4AAP8AAPwA/vsBAPwBAPv///0A//kAAPsAAP4AAAAAAP8BAAD/AAABAAEAAP8AAAACAAAAAAABAP8hISFMTk1XWVg2NjgAAf8BAAD/AAAAAf//AAAAAf8A/wEBAQD/AAAODQ14eHXExML19fQAAAEAAAHu+/940AGvEP4dEQEBAAAA/wAAAAABAgAA//8A/wHy8Aj6+gMCAP8AAAEAAAEBAP4CAAH/AQEB/gH//wIA/wAAAP//AQIBAQEFBP8HBfz9AP/+Av4L/fwC8gP88AoDEfYCBvv5/Qj9A/8AAf/t7Qvx8vUHCv0A+QD/6AIBAQAAAQAAAAD/AAEAAAH9AQACDvwAD/wAAwEBAADb7P0AAAEAAAAAAAACBAYcGhsBAQAAAAAA/wEAAf8A//8AAQD/AAAAAQEB/wABAf/+AP8BAAABAAAAAAAAAAAAAP8A/wACAQH/AP8AAAAAAP/+AQAA/gH/Av8BAQH///8AAAC/wcGxsrQAAP8AAP8AAAL/AAEGBQBlX/0FBAD+AAAAAAD//wD/AQEBAAH+AQEA/wD/AAABAAAAAQEA/wH/AQAB/wEAAQABAAD/AP8AAQIAAAEA//8AAP8AAAP/Af8A/wABAf0A/wEAAQAA//8AAf//AAIA//4AAP8A/wAB/wH/AQAAAAEB//4AAQD+//8BAP//AQAB//7/Af4B///+Af4AAP8AAP8A//8A//7/AP4AAAAAAf///wAA/wD/AAEAAAEAAAEA/wEAAP//AAIAAQD//gD+AAAB/wD+/wD/AAH+////AAL9AgD+/QH+////AQD9/v/+AAP/AAD7/wL5/gH9/gDi1gPn2v0A//8AAAEAHgMBFgL/AP8AAAAAAP8AAP8AAAAAAf8A//8AAAIAAP8A/v8AAAEAAP4A/wIAAAAAAAAAAQAA/wEAAAAA/wAAAQAA/wEAAQAA/wAA/wAAAAIA/wAAAAAAAAEA/wAAAP8A/wEAAf8AAP4A/wIAAAIA//8A/wEA//8AAAEAAAAAAAAAAAEAAf8A/wAAAAAALxEAy+kA/P7/Af8AyfEARxIACgEAAP8AAP8A/wEAAAAAAQAAAP8A/wEAAAEAAAAAAAEA/wAAAAAA/wAAAgAA/wAAAAAAAQAAAP8A/wAAAAAAAQAA/wAA/gEA//4A1/UBk9kA9f0CAAByawBdUwCpq/zk4wT+AADf3P3l4gAbHP4rJwABAAAAAAEA//8AAQABAP0AAQD//QABAgD//wAB/wAAAAAA/wD/AAABAAAAAQAA/gEBAf8AAAAA/wAAAQAAAAAAAQAAAAABAAAA/gAAAgABAAAAAQAcGwMGBgL6+gAAAP/q7gG4ugNmYv3/AgABAAABAAEAAQEA//4AAQEAAAAAAAAAAP8AAAD/AP8B/wEAAP/+/gABAQAB/wD/AAEB/wABAAAA/gAAAAH/AP8A/QABAv8A/wAICP8bGf3R1gH/AP///wCrrgC1uAU1MwEnJv0vK/0lJf8YFwABAwD+AAABAQD9/QD7/QD5+wDq6gDc2gbg4gPY2QHLzf/09AAAAPwAAQH//wAAAQMODv+KbPgpGQJVfALq8P4AAP8AAP8AAACrq61hYGBBQT8BAQD/AAEBAAAAAQEAAP8AAAH//wAAAAEBAf///wEAAP8BAQD+AP8CAAAAAAAEAP//AAABAAH/AgAB/wAAAP8AAAAA/wAAAf8AAP8CAAH/AP//AQABAAEA/wEAAQAAAAEBAAABAAD//wAAAQEAAAAAAQEA////AAACAQH/AP8A/wABAAD/AAD/AQAB////AAAAAAAAAAEBAf//AAABAAEADAwMRUZGQkNCYbxftra3srOx4ODhAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA+/n139XO39XOAAABCg8TGiInGCAiExcbFRsfExkcAQABAAABAAH/AAEC/wEAAgAB/v7/AAEAAQD/AAAAAP4A/gIAAf3/AQAAAQABAP7+AAABAAD/AAAAAAAAAAD/AAACAAEEAAENAAADAAACAAD/AP//AAD/AAH5AP/3AP/6AQD6AP/6/wD9/wAA/wD+AQAAAAAAAAABAAAAAAD/AQAAAQAAAAAA/wABAQD+AQABDg4OSEhITk5NPkJAFxcYAgIDAAD//wAA/wABAQAAAAAAAAAA//8BAAAA//8AAAEA//8BQEA+ZGRjkZGRAAAAAAD/AAEAz+/9j9gCjzf+AAEA/wMBAf8AAP8A/wAAAAAB+fsE/wAA/wEAAgEB//4AAAECAQEABwMBAP8AAAD/Af8A/wD+AQAC/wL/AAAADQb8AAD/B//9Gfr9/QAB/wD+APgEAAb//wIA/gH//gAA//gF9fUDAQH7/voB//0BAAIA/wEA//8BAQD//wICAgT9CR31/wj+Af4C/gAB3e7/AAD/AAABAAD/IR8gIyQi/wAAAP8BAQD/AAAAAAEBAAD+AQABAP//AAEAAP8AAAABAf8A/wAAAAAAAAAAAAAAAAEAAAD/Af8A/wABAf8AAQEAAAEAAAABAAD/AQAA/f79nJuf/Pr5AP/+AAIBAP8AAAD+WlL+RD79/wAAAQAA/wAAAAAAAAAA/gAAAP8B/wD/AQEB/v4AAQD/AAEBAQAA/wD/AP/9/wEBAP8BAQEA///+/wABAQD//wD/AAD/AAD/////AAECAP4BAAH+AP8BAf/9AAABAAD/AAACAQH+/wACAAD//wAAAAD//wD+AAABAP7+/wL/AAD+/wD9/wAA/wD/Af/+AP/+AAAAAP8BAQH//v4AAAD//gAB//8A/wAB/////gAC//8B/wEB//0B//8B/wAB/wAA/wEA/v8A/wAB/gAA//0A/gAAAAEA//8AAP8A/v8A/P8B+v8C+P0B/wAB2cYB//sAAAACAP3/ACUG/wT/AAABAAAAAP8AAP8AAAIAAP8BAP8AAAH/AP8AAAACAAAAAAABAAD/AP8AAP8BAAABAAD/AAAAAAABAP8AAAAAAP7/AAABAAEBAP8AAP8BAP8BAAAAAP4BAQAA/wIBAP4BAP8DAAABAP7/AP8AAAEAAAABAP7/AAAAAAAAAP8BAP8AAAACAP//AR0OABwM/+HxAAAAAeL1/9n2ADMMAAD/AP4BAAAAAAAAAAAAAAAAAAD/AAABAAAAAAH/AP8BAAABAAL/AAABAAABAAAAAP4AAAEAAAEAAAAAAAACAP8AAAH/AM/wAZzfAfD9AAAAYFz+amP8AwQAIx8AAQAC/wD+5esAtbkBZWH/Af8AAAAAAAD/AQAAAAAAAP4A/wEAAQEAAP4AAAEA/wEAAf8A/wEAAQAA//8A//8AAgH///8AAQAAAAEAAAAAAP8AAQAAAAEA/wAAAAIAAQEAAP4AAAAAKSb7Ih4H2NwBAAAAAAD+tLgAZWQAAP8A/wEAAAEAAf/+AQAAAAAA////AQEAAf8BAP8AAP8A/wAAAQEAAf8BAAAA/wAAAAAAAAAB/wH/AP//AQABAAABAAD///8AAAAAAAEAKCb9tbwCAAAAAAD/AAEB9vb/wcQAwcQCAAECAP8AAwMB/wH/BQIA/v//AAAA/f0AAP8A/v8BAQAC/wH/AAD/AP8AAAAAAAABAAD/AAECRToAfWf8PCwC+u//j2UCZpP/9fgAAAAAAAAA+fn3fn+BqymnGRkYAQAAAP//AAAAAAEAAP//AAEAAAAAAAABAAEAAAAB////AQEBAP//AAEAABaE6XsEAAAAAAAAAP8A/wAAAAD/Af8AAAIAAP8A/wEBAQD/AQEA//4AAAH/AAECAf/+AAAB//8AAQIAAP/+AAACAP//AAEBAP8AAAEBAP//AQAA/wEAAP//AAEAAQD///8AAAAB/wAAAQEAAf8AAAAAAP8A/wABAAD/AQEBBQQERUdFRkdFen13srCzrKysxMPG9vf3AAD/AAAAAAD/AAABAAABAAD/AAAAAAAAAAD/9vHr3M/s3M/FAAAABgkMFBsdDRIVDBAVDxUWEBUYDRATEhYXBwkLAf8B/wD/AQAAAQEDAP//AAEC/wD//wEA8OzoAAAAAAAAAAD/AAABAAACAAEDAQEL/wD/AAH2AP/7AP76AAH8Af/6//76AAD/AAD//wABAAD/AQAAAAAAAAABAAD/AQAB/wAAAQD/AAAB/wD/AAD/AAABCgoHOjk6QUJBSktKLS0vAAIBAf///wAB/wAAAf8AAQEBAAD/AP8BAAD//wEBAAD/AAABAf8AAAAAAAH/AAABbGpqr66w4uPiAAD/AP8BAAD/pN/+VyEDOBj9AP4AAAEB//7/AAACAP8AAQECAAAB/wD/AAEBAQH//wAB/wACAgn+//7/AAAA/gAAAf8C/wIAAQEC/wABDQj+Af4BAQH/A////wL+Cwj7DBL79Rb77ecLAP//AQL//v0A+vQD//v9AQT+AA8JAPAAAAAAAAD//wEA/gEABiT1ARz3Af4CAP//6O3+2Of+AAAAAAABAAD/IyYlCgkJ//8AAQH//wABAAD/AP//AAEAAAAAAAEA////AAEBAf8A/wEBAAD/AQD//v8BAAAAAP8AAAAAAQEBAf//AQAA/v8AAQEA/wD/AQD/AAEBwMDCtLO1AP//AAABAP4BAAABEhD+bGb9AgP//gAAAQAAAAEAAP8AAAAAAAEBAP8B/wEAAP/+AQEE//8BAQEC//8A/wAAAQECAQEBAAAA///+/wAB/wD/AAEAAP7+AAICAAAAAAABAP7/AAEAAQAA///+/wAAAAAA//8CAQD///8A/wL+AP//AAAAAP8AAQD/Af/+AAEA/wH+//7+////AAEAAf/+AQAA/gAAAAD/AP4A/gEAAAEA/gAB/v4A//8B/wAA//8C/wEAAP8B//8B/gEC/gEA/v7//gEB/f4BAP8B/wL//v0B/gAB/wAB/v8A/gAA/QAB/f8A+/8B9/wB+/sA9/T/2cP9AP8BAAL/ABQAADYFAP7/AAEAAAEAAAABAAH/AP4AAAH/AAABAP8BAP//AQAA/wAAAAD/AP8CAAD/AAABAAAAAP8BAAD/AAABAAAAAAD+AP8BAAAAAP8AAP8BAP8BAP8AAAEAAAEBAP8AAP4AAP//AAAAAP4AAAABAAH/AAD/AP8BAAACAP8AAAAAAP8AAP8AAAL/AP4A/wUBACwSAeHy/wAA/wAAANDzADMNAP4BAAIBAP7/AAAAAP8AAAD/AAABAAD/AP8AAP8AAAEAAAD/AP8BAAD/AAAAAAD/AAEBAAEBAAAAAAABAAABAPr+AbTjALPoAvgABgYFYlr9hH37CwwB////NzIAlp8AAAAAAAAAt7j/ZWEAAAAAAP8AAQEB/wD/AQAA/wEAAQAA//8AAQAAAf8A/wAAAAAAAAAAAP8AAAEAAv4AAAAAAAAAAAAAAP8AAAAAAAEAAP8A//8AAAEAAP8A//8BAQAAAAH/BAgAJCIA2Nz/AQAB/gAAu8ACvMD9RD8BAP//AQABAAAA/wAAAQAAAAABAP8AAAAA/wD/AAAAAQD/AP8CAAD/AAAAAP8AAQAAAAD/Af8A/gAAAQAAAf8AAAIA//8BAAD/Af4BIh/9AQEC////AQEBAP8AAAH9/wABAAEAAAABAAAA/v8C//7/+f0AAAABAAAAAP4AAAEAAAAA/wD+AP8CAAH/AAECAAACAgD/OzP/Wkf8Wkr+Dgv/AAABBwsBUEb7xdcClrQAAAD+AAACAP8AxcTFd3d5mJiWCQkIAQEBAAAAAAAAAAH/AQAA/gABAP8AAAEA////AQEAAQD//wEAAf//BP///wABAQABAAH//wAAAP8BAf///gEAAQD//wEBAAAAAgEBAP///wAA/gAAAQD/AAAB////AAIBA/8A/wD/AQEAAP4AAAH+AAAAAP8A/wAAAQABAQD///8BAgEAAP8B/wEAAAD/Af8A/wAAAAD//wACAQAAAQAAAAAAAQEA//8AABYUF2RlZGNjY9fW1r/Awbm4uMjHyu3u7f8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAA/wAAAPv38+bc1gAAAQAAAAAAAAABAAICBAwRFAoNDwwOEAUICQYICAYICP//Av8B/vr19fj39uvj4AAA/gAAAQAAAQAA/gAA/wD/+///7gAB7AD+/wAA/wAA/wD/AP8AAQAA/wAAAAAAAAEA/wAAAQAAAAAA/gAAAQEAAQAAAP8A/gAAAQEAABIQETQ0NDY2NUZHRTk7PAMDAQD/Af8A/wD///8AAAEBAQD///8AAAAA/wH/Af8BAAEAAQD/AP8AAAEBAP8AAAEBAP8AAAAAACQmJHV1c29wcf7+/wAA/gAA/+35AXnNAKtCAxUK/v4AAAIAAP4B/wIBAQoF+gQB/v7/Av8A/wEAAgAAAf4BAP0CAf4AAAL/AAEBAAAAAQEBAgABAQAAAA0F/v///v////oBAwf/ARAQ9wwj9wIMAP7jAQEEAP//AP/+Afn5AwH8/wIF/f0C/f8ABAAA/gAFAAII/gkh9wEg9AH/AAAAAQAA/9vo/e31AQAA/wAA/gAAASkoKP8AAQEB////AQEB/wD/AAAB/wAAAQAAAAD/AAEAAQD/AAABAAD//wEB////AQH/AP8BAQEAAQAA/wD//wAAAP8BAAD/AP7//wIBAf//AQABAKSlp/n6+AABAAD/AQEAAP8A/VBK/S8r/wAAAAEAAP//AAAAAP8BAAAAAQD/AP8AAAEAAgD/Af8CAAD/AQD/AAABAQH/AAEA/////gAAA/8AAAEA/wEBAf8AAf8B/gH/AAABAQD+AP4BAAMAAP8A/gAAAQEA//8A/wEBAAAAAAABAAD//wAAAf///gEAAQAA//8C/wD////+/wAB/gD/AAD//f8A////AP////8A/gEBAAAB//7/Af8AAAABAP//Af8AAP8BAf/+AP8AAf8AAf8AAP///wABAQD/AQH/Af0AAP79Af4AAf//AP8BAP8AAP/+AAH/AP7/APf9A/P6Av8A/tvNA+zf+gABAAD+AQAkBgAVAwABAAABAQD/AAAB/wD/AQAA/wH/Af///wAAAAAAAP///wABAQD/AgAAAAAAAwAB/wD+AAAA/wAAAAD//wAA/wAAAQAAAAD/AQAAAQAAAAD/AQAB/wD/AQD///8AAQD/AAABAAD/AQABAQD+/gAAAQD/AAAAAAD//wD/AAABAQD//wABAgD+AAD/AAD+AAAtE//C5wDz+QACAQDS9ADv+wAQBAD+/gAAAQD/AQAB/gAAAQD/AAACAQD//wABAAABAAD/AQAAAAABAAAA/wAAAQAAAAAA/wABAQD/AgDb8wCo4v/U8AAABBALAYB6AGll+gMDAAAAAAAAAEFAACAd/t/j/wAAALvAA72//URAAAAAAP8A/wEAAAD+AAEBAAD/AAABAAAAAP//AAABAP//AAEAAAAAAAD/AAABAP8AAgH//v8AAAEAAAAAAAAAAAAAAQEB/wAAAf///wEB////AAEAAAAAADAv/7W7AwD//gAA//r6AaKhBEVA/P//Af8A/gEAAgEA/wD/AAEAAAAAAAD/AAEAAAAAAP//AAEB/wABAAH/AP8AAP8B/wAAAAD/AAEAAf8AAP8AAAL+AQD//wEDAP7//wgH///+/gECAQABAgEB/woDA/T5/wAB/wEAAAAAAf///wAAAQAA/wD//wD/AAAAAQAA/wAB/wD/AgD//iAaAyUfATku/0E0/Tsx/wUF/wD+AP/+AgAA/wEFAAkLAm5U/bfOA9/m/wAAAAAA/wAA/qWmpU5PTlJSUP///wIBAAAAAAEAAP8AAAEAAAAAAAD/AAEAAQEAAP8AAAD//wABAQQBAAEAAAAA////AAEBAQAA/v4BAAEAAgAB/wH//wD/AP4BAQEAAAH/AAAB/wABAQAAAAEAAQD///8A//8AAQH+/gAAAQAAAgEAAAAA/wD/AP8B/wH/AAAB///+AAAAAAACAAD/Af8A/wAAAAAAAgEAAAAAAAAA////AQABAQABAAAAAAH/AAABAv8qLCsqLCtsbGvd3Ny8u7/DxcXBwMDk5eMAAAAAAAAAAAAAAAAAAP4AAAAAAAD/AAEAAAAAAAAAAAEAAP8A/wD+/fzz7Ojy7OYBAAL/AP8BAAD/AAEAAAAAAAEAAAAAAAEAAP4AAAEAAP8AAP8AAAAAAP4AAAAAAP4A/wAAAAABAAH/AAEAAAAAAP8AAAABAAH/AP8BAAAAAP//AAEAAAEAAAD/AAEAAf4dGh49PDtGR0U5OTglKCgAAP8BAAEAAAEAAAAAAf8BAAIAAAD///8AAAAAAQEBAAD/AAD/AAAB////AAAAAAABAAABAP//AQD//wEBAAAAAQD+/wFjZWO8vr+xsLAAAAAAAAECAALB6f6L1AKINQABAP//AQEBAf8AAAATDPbpB/v1+QgA/gEAAAAAAf8C/wIDA/0C/wEAAAAA/wAAAAAA//////8AAf8QCfoC//8IAf4AAAEFAQEKIf0DFwD96An/AAABAP8RBvwQB/oWFvQCBv4AAgEFFfr++AEBAwAFFPoCEvoADvgA//8AAAMA/wAAAv7M4v//AAAAAAEAAP8AAP8qKygA//4AAQEBAQAAAP8AAAAA/wH/AAABAQABAP//AAIAAQAAAP8AAQAAAAIAAQAAAf8A/wH/AP8BAQAA/wD/AAAA/gAAAf8CAAEA/wACAAHU1dWwsLIA/v4AAP8AAAD/AAAPDf9kXf8AAAD/AQABAAD/AAAAAQAAAAAAAP//AAEAAQD/AAAAAAMB/gL/AQH+AP4B/wMAAAD+AAABAAIAAP8AAP//AAEA/wEAAAABAAEAAP8A/wAAAP8CAAEA/v//Af8A/wEBAP8BAAEAAv4A///+AAIA//8AAf8BAAD/AP0AAgAB/////v7/Af4A//4AAAD/AP8BAAD/AP//AP8BAAD/Af/+/gD/AQD//wD+/wD/AAD//wD/AAD/AAH/AAD+/wD/AAD//wH+AQH9/wD+AQD//gD/AAEAAAD/AAH9/v/+AP8A/wH/AQH3/gXt+QT5/v/++QLGrPsA/gEAAv4ACwEAPwoAAQEAAAAA//4AAAEA//8AAAEAAP//AAEAAAEAAAAAAAAAAQIA//8A//8AAAAAAP8AAAAAAQAA/wAAAAAAAAAAAAEA/wAAAAIA//8A/wEA/wEAAQAA/wAA/wAAAAAA/gAAAQAB/gD/AP8A//8AAAEAAAAAAAEA/wAA/wAAAAAA/wAAAAEA//8A/wEA/wAAAQAADwcAJxEAy+gAAQAA6vsA1fUAOw4A/wAAAP8AAAAA/gEAAgEAAgAA/v4AAQEAAAAA/v4AAQEAAAEA/gAAAQEAAAAAAgEAAP8B7PoAseoAwur/9/4AAAQWEwGMg/5dWfkAAP8A/wAAAAABAQEcHf9GQv6ZogIA///2+P+kpQBDQAABAAAB/wAAAQAAAQAA/wAAAAAB/wAAAAAAAQAAAAAAAAAAAAAAAAABAQAA/gABAP4AAAABAAAAAAD/AQAB/gAAAf8AAQH//v8BAQAA/wABAQD//wAB/wAoJ/3//wMAAQEB/wH+AAG2uwLGxwU5OP0A////AP8AAAEBAP//AP8AAAAAAAAA/wABAf8BAQEA/wABAQD/AQABAAD//wABAAL/AP4A//8AAAABAAAAAAEBAQH//v///wACAgAAAP///wADAv/9/gBMSAFKPf7j5P/p7AL8+gD7/ADv8//7+wAAAQESDgAREQELBwAZFAENDAEgG/4sI/sQD/8A/QAAAQAA/gD//gAA//8AAAD///8BAAIBBv8kIwJuUP5ylwD///4AAAEAAAD+/f6DhIY2NjcdHRn/AAEBAAD/AP8BAAD/AP8AAAAAAQEAAAD/AP8A/wEBAAH///8EAAEAAAH/AP8CAQH/AP8BAAEAAQD//v8BAAD/AQABAQABAP8AAAAAAgAA/wAA/wAAAAEAAP///gAAAwABAAAAAAH/AAAB////AgEA/wAAAQEC////AQEA//8AAQEBAP//AAAAAAAAAAAAAAABAP//AAD/AQEB/wD/AAACAP//AAEA////AQEB/wACAP8AAAH//wAAIiQkZiQjZmhk4eHhxMPFw8XE1dTWz8/N9vb3AAACAAD/AQAA/wD/AAAAAAD/AAAAAAAAAAABAAAA/wD/AAAB/wEAAAAB////AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAABAAAAAAD+AAABAAD/AAABAAABAAAA/wAAAQD/AAAB/wAAAAAAAAAAAQAAAAAB/wD/BgYFIiEiJSQlLzMwMjExNDQyGxocAQICAP//AAAB/gAAAQAAAAAA////AAEBAAD/AQABAQAA/v8AAQH/AP//AQEB/wAA/wEAAAAAAAAAAQAAAAAAAAAA/wAAAAAAAAAAAgEACQgJg4F/y8vL5uXkAAAA/v/+AAAAl9f7LhIGWyP9AAD/AP8B/wAAAwIABQP9AAD/AQEBAQEAAP///gAAAwP+Af8AAAEAAAABAAEA/wIBAAECAP8BFw/9BP/+AQAA/AMA+RD7+BMC+PQH6e4JAwAACgj9KRbyCvz+AQr8AAH/AP//ARP5CBL7AP8AAAD9AAb/AP4EAAAAAAH+AAAAAP//xd36AAD/AAAAAAACAAAAKSgo/wEBAQABAP8AAQEB/wEAAQAAAAAA/wAAAAEBAAAAAQD//wAAAP8BAAAA/wH/Af8AAQD/AAEAAf8A/wEAAf8A/wL/Af8CAAD//wEAAP//s7G08e/vAAD+AAAAAAAAAQACS0IANTAA//8A/wIA//0A/wAA/wAAAQAB/gABAQACAAACAQEC/gAAAAAA////AAEC////AAEBAQAC/wD+Af8BAAEAAP8A/wEAAQD//wAAAQD/AP8B/wECAf///gL/AP8BAAEA//8A/wAAAf3//wEBAAL///8AAP//AAD//wD/Af//AP///wH+AAD/AQH//v8A///+AQEBAAD+AAAA/wD///8A/wEA//4A/wEA/wAB//8B/wEA//8B/wEC/gD/AAAA/v3//gECAP7///8BAAAA/gEBAf8B//8A/gAA/P0D/v3//wIC/P4B6/sF8fwCAwL+xbEA5s/9AAUDAP8BADEIACUEAAH/AP8CAAAAAAD/AAAAAAD/AQAB/wH/AP8BAP8AAAAAAAD/AAAAAAEAAP8BAP8AAAD/AAABAP//AAABAAD/AAAAAAEDAP0AAAIBAP3/AAAAAP8BAP8BAAAAAP8AAAABAP4A/wAAAP4AAAAAAP8AAAABAP8AAP8AAAEBAP7/AAD/AP8BAAEAAAAAAAAAAP8BAAD/ASYQ/8vpAAAAAAAAAM/1ADkOAAAAAAABAAAAAAEBAP8AAAAAAAABAAAAAAEBAAAAAAABAAABAAL+AP8BAAIAAPf+AMLr/67mAfD7/wABAAECLisCl4r4Ojj+AAEAAP8AAAAAAAEAAAEAAP8AR0H+mqMC//8AAAD/tLkEzM38NTIAAAEA/wAAAf8AAAEAAP8AAAAAAAEAAP8AAQAAAAEA//8AAQEAAP8AAAEA//8AAQAAAAAAAAABAP//AAEAAAABAP7/AQAAAP8BAAEAAP7/AQEA/wAAOzb9HBoA5ecA/wEAAP/+8PICnJ4DOTf7AAEAAQD//////wACAf8AAAAAAAH/AAAAAP8BAAEA/wAAAf8AAQEAAAD/AP8BAAEAAP8BAAAAAAH/AAAA////Af8AAQIAAgAA0tQBAP8AAQL////+AwUEyNIFd170XEcB/f7/////AwEA//8AAQEAAgEAAAD/AAEAAP8BAAAAAAAAAAD+AAAB//wAAQIAAP4A/wEB//7/AQEAAP7/Af8CAAD/AAEAAwcAY08Ax9UEqsL8AP8AAAD/AQAA0tDPhYWGl5aSAgIBAP//AQEA/wAAAAABAAH/AQD///8BAQAB/gD/AAEBAAABBAABAP//AQEAAAD/AQAB/wD///8AAQIBAAD/Af8AAAAAAAAA/wEAAf7/AAIAAP8AAAAAAf8A/wIAAf8BAAAA/wAAAP8AAAEAAP//AAAAAP///wAAAAD/AQEB/wD//gABAQD/AAABAAD//wAAAAABAAD/Af///wAAAAD///8AAAD+AAABAf8AAAAAAAABAAAAAAD//wAAAAAAAAABAB8gHx4fIFxdW/39/dLT0+Lh4tnZ2dzc3dnZ2ejn5+jo6PLz8QAAAAAAAQAAAAAAAAAAAgAAAAAAAQD//wAAAQAAAAAA/wEAAf8A/wAA/wAAAQAA/wAAAAAAAAAAAQAAAAEAAQAAAP8AAQAA/wEAAP8AAAAAAAAAAQ0NDiEfIB4eHioqKSUlJCwtLDAxMQgHBv8BAQAAAAEAAP/+/gD//wAAAf7//wIAAP8AAAABAAABAAAAAAAAAf8AAAABAQL/////AAABAf8AAAABAAEAAAAAAP//Af4BAAEA/wD/AQEBAAEAAP//AP8BAAAAAC0uLouLiGFhZPr5+QEAAP8A//X8AIXO/CwOBC8U/wAAAf8BAAEB/wgI/QD1AAAA/gD/AgEBAAME/gMF//8AAQEAAP8AAAH/AAH/AP8BAgEAAQ4M/AUF/vj+AfsIAAMBAuLQDPz9BPb9AgUBABUI+goG+QAKAv8L/gEBAP//AQEC/wAA/wAA/gAB/gAAAAD/AQAAAAAAAgAB/+71Asvk/wAAAAAAAQAA/y4vMTIxLwEAAQAAAP8A/wAAAQAA////AAEBAAEAAP8AAAD///8AAP8A/wEAAP8AAAL/AAABAP///wAAAv8B/wAA/wAAAQH/AQAB/wAAAAH/AfPz8a6urwEA/v8AAAAAAQAAAQUE/mFY//8AAAAAAAD+AAABAAD/AQEBAP//AQAAAf4AAAH/AP8AAQEBAf//AAAAAQEA//8AAAEBAAD+/gABAf8A///+AgEBAAH+/gABAQEAAP8AAQAA/gH///8AAgD/AQAA/wD/Af8AAAAA//4BAAEA///+AgAA/QEB/wAA/wEAAP///v7//QAAAAAAAP//AAEA//7/AP3//wEA/wD/Af8AAf8A/wD/AP4BAP//AQABAf4BAAD+Av7/AP8A//8BAP8AAAABAf8AAP8AAgAB//7/Af8AAP4A//8BAQH/AObmDfDrBRYq/On7Aej3/v0C/+PXAsOi+wABAgD9/gAPAgA/CQAB/wD/AgAA/wAAAAABAQD+/wACAP//AAD/AQAAAAEAAP8AAQAAAAAAAAD/AAAAAAAA/gAAAgAAAAAAAwD//wD/AAACAgD//wABAQD+AAD/AQAAAAAA/wD/AQAAAAD/AQAAAAAA/wD/AAABAQD+AAAAAQD/AAAAAAAAAAD/AAABAgD//wAAAAD+AAD/AQAA/wD//wD/AP8iDgAUCQDt+AAC/wHR8v/mFAAZBgAB/gAAAgD//wAAAAAA/wAAAAAAAQD+/wAA/gACAgAAAAAAAgD+/wDL8QC16AHZ8v8AAf8AAgUHBFxT/Xt0+CMh/v//AAD/AAH/AQAB/wD/AQAA/wAAADc5ABwZAOPl//8AAO7y/qSpATUy/wD/AAABAAD/AAD/AAAAAAABAAAAAAABAAD/AP8AAAAAAAD/AAAAAP8AAAEAAf8A/wEAAAAA////AAECAAAAAP//AAABAAD//wD/AQEBAAAAAQEA/x8fAEE9/6SqAQD/AQAA/wAAAKyyAlxaB0JA+v8A/wAAAAH//wABAf/+/gD/AAACAQH/AP//AAAAAP8BAAD/AAAAAAEB//8A/wAAAAEAAQD/AP//AAEBAf8B///+AOrrALK5BgAB/v//AAABAQMDAuzzBIOZDp+D9gwI/gABAAEAAQAA/wIAAP7//wL/AAAB//8BAAH/AP8B/wH/AQAAAAEBAQD//wAAAP//AAL/AQAA//8BAAD///8AAQEAAAABAA0OAX1i/MnZAeHo/wAAAf8AAAEAAKSlpEdGRVJST/8AAAH/AAAAAQEAAP8AAQABAAAA//8A/wABAQH/AP8AAAT+AAABAAD/Af8AAAEB/wAAAQH/AP///wEC/wD/AQAB//8AAQH/AQACAAD/AAAAAAAA//4BAAD/AAABAf//AAEB/wABAAEA//8BAAD+AQABAQAA/wD/AP8B/wD/AQEB/wD+AQABAAAAAQEA/wAA/wAAAAAAAQEBAAD//gAAAQAAAQEAAQABAAD/AP///gD/AgEBAAABAP8AAQABAAH/AAABAf//AAADAwMwMDAwLzAAAAABAQAAAP/7/P3k4+HNzc/i4ePt7u7o6ejx8fHe3N/9/f3x8vLl5OMA/v/9////AP//AP8AAAIAAAABAQEB////AQAAAAAA//8MDAwbGxsQEA8ODg8aGhsVFxUTEREiIiMfISATEhEaGxsIBwcAAAEBAQAAAAD/AP8AAAAAAP8AAAH+//4BAgH//wAAAP8AAf//AAEAAAEAAAAAAP8A/wEAAP8AAAAAAAH+AQABAAAB/wD/AAAAAAD/AQH/AP8BAQAC/wD+AQEBAQAA/wD+AAACAQAAAP8AAAD/AABYWFnEw8aXl5j/AP4AAP//AAHZ8wBzyACoRQAUCAABAQIA/gALB/kCAgwA/gAAAP4AAAEABf4BAAAAAf//AP8AAAL/Af8A//8BAf//AAERDP4LB/r5+AT3AQAG/wP4+AD//wEAAf8CAf8GB/wBFfoACwT/CgAAAP8BAwEAAAAAAv8AAAEA/wEA/wAAAQD/AAABAQAA///G2f3k8f8AAAIAAP8AAAExMjIKCgr//wAAAQABAQABAP//AAABAQH/AAABAAABAP//AP8AAAIBAQEBAP/////+AAABAAEAAAEAAP4AAAEA/gAAAQAAAAD///8B/wAAAgC/wMLMztEAAAAAAAABAf///wBHQP47Of///wAAAgD//wAAAQD/AQAA/v//AQH//wIBAQH/AAAAAAH+/wEAAAEBAQABAP8BAQL/////AP8BAAH/AAMAAf8A////AAEA/wIAAQAB/wD/AAAAAAAAAP8AAP8AAAH/AP0AAAH///8CAQH//wAAAvoA/wD/AAAA//8AAAD/AP4AAAAAAQAAAP//AP////0CAAD/AP8A/wL/Af8AAP///gD/AAIAAAD//wD/AAEA/wD+AAD/AQH//wD//gH+AAD/AAAA/wH/AAL+AP4A/wD+AQEAAAAB/wACAQLY1grTyRNEKujp+vb8AAPs5f65k/778gEAAAAABAAASwwAHgIA/wEAAP8A/wAAAf8A/gEAAQAA/wAAAAAA/wAAAAD/AAAAAQAA/wAA/wEA//4AAQEAAAEAAP8A/wEA//4AAQAAAAEA/wAA/gIA/wAAAAAAAAEA/wAAAAAA/wAA/wAAAAAAAP8AAAEA/wEAAAAAAP8A/wAAAAAA/wAAAQEA/gAAAP8A/wEAAP8A/wIA/wABAQH/AP8AAAAACAQAKRIAw+UAAAL/9PwA0/IAGhQAAAEAAP8AAAAA//8A/wEAAgAAAgIA/v8AAAEA9/4B5Pn/2PQAy+4A3PQA/gD/AAMAAP9BOQJtaf9OSvoDA/8AAAEBAQD/AP8AAf///wABAP8AAAAAAQAZFwBMR/+YngH/AAH/AP64uwLpcv0WGAAA/wAAAQAAAAAAAAAAAAAA/wABAAAAAQAB/wAAAAAAAQAAAAAAAAAA//8AAAAAAAAAAAACAQD/AAAA/wABAQD//wEAAf8A//8AAAAAAP8AAAAB/gFNR/uqsAb5+gAA/wAAAf/1+P2HigUuK/8UFfv/AP//AAAB//8AAQEBAAAA/wAAAgEB/////wEA//8AAQAB/wH/AP8AAAEAAP//AP8AAAEBAP////8AAQD+/wCHjwXg4wEBAv7//wH//gEBAgL/AAC6zwWfsAdtWPUBAP///wIAAAD//wAAAAD/AQH/AAAB/v8AAQEA/wEAAP//AAIB//7/AAEB/wABAAAAAAH//wAAAP8AAQAA/gAAAP///wABAv8qJQF8Xf5liwEAAP8AAAD/AAH29PaQkZFBQkAQEA//AAAA/wAAAAABAf//AAEAAQABAAEAAAAAAAAAAP8EAv8A/wD/Af8BAAH/AAEAAP//AQAB/wEA/wAAAQD/AAIBAP//AP8B/wAB/wD+AQEB//8AAAABAQEA//8AAAEA/wAAAf//AQH//wABAAAA/v8AAQABAAH///8AAQAAAQEBAAAA///+AQABAAAAAAAAAf8AAAEA/wAAAAIBAP//AAD/AP4A/wEAAAABAAH/Av//AAEAAAABAP///wEAAP8AAQAB/QD/AwEAAP//AAAAAQAAAAAB/wAABQMDICEiISAhAAABAAEB/wD/AQAB///+/wAB8vDx3N7e+/z6+vj6AAEB+/v7BAIC/gD/AwECAQIBAgIDBQUFBAUDDw4PHh4eAwUEAwAB/wAAAQEAAAAB/wD/AAD/AP8BAAH/AAD/AP8A/v8AAAAAAP//AAIAAAABAP7+AAEBAAABAQD//wAAAQACAP8AAAH/AAAAAP8AAAD//wD/AQABAQEAAP8BAQD//wH/AQACAAD//wD+Av4B/gH/AAAAAv8A/wABAQEAAf8AAP8A/wAAAQABAQEAAQEAd3h2wsLB1dXVAAABAAAB/wH/vuv7hc8IjDb+AwL/AAICCw37AeoA/v8CAP///wAA+QEC9/4BDAAAAP8BAQH/AP8B/v4DAf4CAf8DAAQCAgX89PgB5wIICwH6//4A/wIAAAH/Exb2Fibx/xAAAQP9AQABAAH/AAAAAAEAAAAAAAIAAP4AAAAA/wAAAAABAAD//wL/zuT9AAACAAAAAAAAAAAAPDw5/wABAQH/AP///wECAQAAAP///wEA///+AAAAAAEBAAABAAD///8AAAEAAAABAAEAAP8A/wAAAf8B/wAAAAEAAQAA/wEA/wACAAH/AQABr7CzAP/+AAABAAABAP8ABQT/W1cABggA/P8AAAAAAAEB/wD//v8AAQEDAf8B/wEBAAABAQAB/wABAAAB/wD/AP7//gECAQABAAABAAEB/gD+AP/+AAAB/gABAQAAAQH+AP8B/wAAAAAC/wD/AAABAAD/////AAAB/wH/AQEB/wD+AAEAAP8AAP8A/wD/Af8AAAD/AAD+AAD///8AAAAA/wD/AP8B/wAAAAAB/v///wAB/wAA/gAB//8A/wABAAIBAP8B/wEAAP8B//8A/v8A//8BAAD//wAB/wAA/wD/AP8B/QEB//8B/gAA/gEA//8B+vP78+EAyKEBDi8E2tX6x6oA8+MAAAD/AAX+AEsOAEAJAAH+AP8AAAD/AAEAAP8BAAD/AP8AAAAAAAAAAAAAAAAAAP8CAQH+//8BAAAAAAABAP4AAAAAAAAAAAD/AQAB//8AAP8BAAABAAAAAP8AAAABAP8AAAAAAP8AAAABAAH/AP8AAAAAAP8AAAD/AAD/AP8CAP//AAAAAAABAP7/AP8BAAABAAAAAP8AAAD/AAAA//4AAP8AAAEAAAD/ASYP/8joAPr8AAABAMvyAEYUAAD/AP8BAAAAAAAAAAABAP//APT8AN/3Adby/8zuAOb4AP0BAAABAAABAAACKiUAZ2IAY1z7Cw39AP4AAAEAAP8BAAD+Af8AAAEBAAAAAAH/AAEA//8AAQEBYFr+pasB8vMBAQAB29//srcAZWEB/wD/AAAA/wAAAQABAAD/AAAAAAAAAP4AAAIAAP8AAP8A/wAAAQAA/wEBAf//AAAA/wAAAQAAAf4A/wH///8AAQD///4AAQEA//4AAQEA/wAAAQH/NjP+FRT+5OX/AAEBAAAA///9wckCipAIh4L6AwEA/wEA/wAAAQAB/wAAAP8BAP//AAEBAAD/AAAAAQAA/wAAAAABAAD/AAAAAAEAAP//AAEAAP8A/f4Ai5MEmKIB/f7+Af4AAAMANy0D2uUE+v4BAf79mKwHQTP6KyT7AQD/AAAA/wAB/wAAAP//Af8AAAEBAP8AAQEB/v8BAgAB/wABAP8BAAAAAf8AAAD/AAD/AQAB//8AAQAAAAABAAH/AAABAgQAWEYAtcUCsMb+AAABAAAAAAD9xMPDm5ycdXRz/wD/AgEBAAAAAP8BAP///wL/AP8BAAD/AAABAQEBBP8AAAAAAQAAAP//AAEBAAAAAAAA/wH/AQAAAAAAAP//AAEAAQD///4CAAL/AQD//wEAAQAA/wD/AQEAAQEA//4AAAABAf8AAP//AQEC/wD//wEB/wD/Af8AAAD/AP8A/wH/AQABAf8A/wH/AQABAP4C/wD/AQEAAAEB//8AAQAAAAAB/wABAAEA/wAAAP//AAEAAf//AAIAAf//AAABAP8A/wL/Af///wABAAAAAP//AQAAAAH/AAABAQAAAP8BAAD/AAD/AAABAP8A/wEBAQAAAA8REDMzMgAAAAAA/wAAAQEAAAAAAAAA/wD/AQABAP8AAAD//wABAQD/AAABAAD/AP8B/wD/Af7/AAEB/wD/AAABAQABAAD/Af8BAAABAAH/AAABAP8BAQAA/wD/AAECAQAAAP8A/wABAAAAAQAA/wABAP///wEAAQAAAgAB/wEAAQAAAP///wABAP//AAD/Af8BAAEAAQEAAf8A/wEAAAEAAP8AAAAA////AQAAAAEAAAABAQAA//8AAQEAAB8eHYmKiFlZWvPy8gAAAAD/AQAAAJ/c/D0WAlMjAAD//wsM/AoI/PX0B/wDAf8D//4ABPf6Av8B/wEAAP8AAfnzBd7iEvH3BgYCAQoE/PP2/PT8AAL///8AAf4AAAYN+R8k8RMb9wEG/wABAQAAAAAB/wAAAQAAAAABAAAAAAD+/wAAAP8BAAH+Af8A/wD/AAEBAsff/gAAAAAA/wAAAAoMDDs7OQEAAAEAAAABAQAA/wAA/wABAQAAAAEBAgAAAAAA/wAB/wD/AQEAAP8AAAEA/wAAAQABAAD//wAAAAEBAf/+AQAB/gD+AgIC/////9DS0q2usAAA/gAAAQAAAP8AATUv/kpGAP7/AAABAP//AQAAAP8BAQEBAgAAAv4BAAAAAQAAAAABAQAAAAD+/wECAP8AAQAAAAD///8CAAD//gAAAQEBAP///wD//wABA///AAABAAD///8A/gIBAf7+/v8AAAABAAAA/wD/Af4B/wIAAP4A/wAAAAEA/wEA//8AAP///wAAAAEBAQD//gD//wAAAP//AAD/AP8B/wEBAP0BAAD/Af/+AP4BAAAAAP/+AQD/Af8BAP//AP//Af8AAQAB//7/Af////4AAP4AAf7/AQABAAAAAAD///8BAAAAACIk9JXU2vTI+gUG/fn4AgAAAwAAAQIMA/5MDwBCCgACAQAAAQAA/wAAAQD//wABAAD/AQAA/wAAAQAA/gD/AQAAAAAB///9AQAAAAABAAAAAgAB/wD/AQD//wABAf8AAAD/AAAAAAAB/wD+AQAAAQD/AQAA/gD+AQAAAQAAAQD/AAD//wAAAQD/AAAAAAD/AgAA/wAAAQAA/wD/AQD//wABAAD+/wABAQD/AgD//gAAAQAAAAABAAD+AAD/Af8dDgApEQDR6wAA/wDe9QDW9QApCwAA/gAAAAD9/wDh9ADV8gDQ8QDb9v///wAAAv8A/wAAAgkHADo0AFhR+05N/xYW/QAAAgAAAP8CAAEA/wABAP/+AAABAAEA/wEBAQD/AQAA/wEAAQABADQyAT86ALO5//8AAQAA/6OmAVtV/wkLAAAAAAEAAAD//wABAf8B/wH/AAABAAAAAAAAAQAB/wH/AAAAAAH//wAAAAD/AQEB/wAAAAABAAH/AAAAAAABAAABAAAAAAACAAD/AAEAAAABARsZ/y0q/uTlAAD/AP8A/v8AA////p6pASgsB2FY+QH/AP//Af8BAAEA/wAA/gAAAQD/Af8AAAD//wAAAQH/Af8A/wAAAAH/AP8AAf///wECAP8BAJicA4OMBPv5/gIBAP4CA008/6WP/nWJ+aK4BwEFA+TuAomiC5d48gwK/gEBAAD//wEAAAAAAf8A/gD/AgABAAEAAAD///8BAAAAAP8A/wAAAQEB/wAAAQD/Af//AQH/AAAA//8BAQEAAP8A/wH/AAwNAGdR/rXLAPv7AAAA/wAAAf///5STl1lYWB0cG/8AAAAAAAAA/wABAAEAAgABAAAAAQD/AAAAAAIA/wAAAAD/AQEBAAEB/wABAAH/AAH/////AP8AAAABAf//AQAAAQEBAP//AAD/AQH/AAAAAAH/AAAAAAH//wAAAAH/AAD/AAEBAf8A/wAAAAEA/gAA/wEAAAD/AP/+AAD+Af7/AAACAQEAAQAAAQABAAAAAQAAAQD+/wD/AP//Af8AAQEA/wD/AP///wABAAAA//8BAP//AAAAAf8A//8AAAAAAP//AAEA/wAAAAAAAf8BAAD/AAH///8A//8A/wEAAQAAAP8AAAEBAAH/AAEBAAEBAAAA/wABAP8A/wD/AAAA////AP///wD/AP//////AP8AAQEAAAAAAP8AAP8BAQAAAAEBAP8C//8B//8AAP8AAP8A/wAAAAAB/wAAAAAAAP8A/wAA/wAA/gD/AP//AAEBAAEAAAABAAEA//4A//8AAAEBAAEAAQAAAQAAAP8AAAAAAAAAAQAA/wAAAQAAAQEAAAD/AP////8AAgAAAQAAAAEAAQEAAAAAAP8BAQH/AQAA////AAEAAAD/AAD/AABJSEh2dnUBAgEAAP8AAP8AAP/y/f190f/e+QX/Af/8+wL/AP8CBf8CBQD+AAMB/AH+9wMAAP8A/wAA/QDt3g385QcG8AIB8AEA7QME//33/PsI+/z9/v4REvgtNegUHvUBBf4A/wAA/gAAAAAA/wH//gEA/wD//wD/Af//AAAAAQABAAH/AAD/AQEAAAHc5/7I4f0AAP8AAAAAAAEzMjUoJyYAAP8AAAAAAAABAAD//wEA//8A//8AAAAAAP8AAAAA/wEBAf8AAAAAAAAAAAEB/wAA//8BAAAAAAAA//8AAf8AAQEAAv//AAH/AAC2trr08fIAAAIAAAIAAAEAAABNSP4HBv/9AAD/AAAAAAD/AAD//wH//wL+/gEAAAIA/wL+AAL+/wEAAP8AAf7//wABAQAB/wD+AAAA/v//AP//AP/+//8AAAAAAAL/AP//AAD+/v7/AP8AAAD///7/Af4BAf8AAP4BAP4AAP4B//7///4B//8B//7//////v7///4A/wAAAP8A/v3/AP8AAf8AAP8AAAAAAgAAAQH+AAEA/wH+/wEAAQEAAAP//wL/AQH+Af///wD/AAH//wH////+AAEAAAEAAAIB/wIA/wH/AQH//wH+/wD+AQL+/gH+/wAsMPtdZfwCAPr6+P8A/vwAAfwBIwb+aRIARgsABP8AAP4AAP8AAQEAAf8AAQAA//8AAf8AAQAAAP8AAAIAAQAAAAEA/wEAAQAAAQEA/wAAAAAA//8A/wABAAAA//8AAAAA/wAA/wEA/gAA/wAA//8A//8A/wEAAQAAAAAA//8A//8A/wEA/wAA//8A/wEA//8A/wEA/wAA/wIA//8A/wAA/wAAAAAA/v8A//8AAAAA/wAA/gEA/gAA/wIB/wEAAgEAMxUABgMAAP4A+f0Aq+gEwfQCtu8BnOIAidsAhtkAquQA2vMA//4AAP4BAP0NCgBcU/y2p/u7sPlkY/wWFv4AAAEAAf8AAP8BAAAA/wEA/wABAQAA/wAAAAAAAAAAAP//AAD/AAAA//8CAgBJRP8AAAEAAP8AAADFywPGyAAAAAAAAQD/AAAAAAAA//8A/gAAAQAAAAAA/wAAAAAAAAAAAAH//wAAAAAA/wAAAv8AAAAAAAD//wD/AQAAAAAA/wABAAIA/wABAAAAAQEAAQAA/v8EBgAsKP8AAAEBAP8AAAIBAQEAAf/6+v+Eiwt/iwre5QIBAwAAAgD/AAAAAQP/AQH///8A/wAAAAH//wAAAQAAAAAAAAAAAQAAAf8BAQHx8gOHjQd6hAX4+P0BAP8A//8gFwKFa/8LAvtvWfoZE//9/gH/AQG1yAervAoBAQAA/wH/AAEAAAAAAAAAAQABAP8AAAD//gABAAEA////AAEB/wIB/wH//wL+/wEA//8BAf8AAf//AQAA//////8BAAEAAAAAAQFCOABrUAIAAAEAAAEBAP8AAADj4uCanJ0AAAABAAAA/gABAAEBAAEAAAD/AP8B////Af8A/wACAQL/AQD/Af7//wD//wEA/wEAAQAAAQEBAf8AAAAA//8AAf//AAD/Af8BAf8AAf8AAQD///8AAQAAAAH/AP8BAQAAAQEAAQAAAAD/AAAAAAH/AAEBAAL/Af//AQAAAQAAAAEBAAAA/wAAAAAA/wAAAP8BAP8A//8AAQEBAQEAAf8BAP//AAEBAf8BAQAAAAAAAAAA/wD/AAD/AP8AAAEAAAABAAEAAQD/AAD/AQABAAAB/wAAAAH/AQEAAQEAAAEAAP8BAP8AAP8AAAD/AP8A/wAAAAD/AAH///8BAAEBAQD//wEBAAABAQAAAAEB/wABAQAAAAAAAAD/AAEAAQAB/wD//wD//wAA/wIB/gABAAACAP8B/wAA/wEAAAAAAf8A/wEB/wEAAAAA/wIBAAAA/////gD/AAD//////wEBAAEC/////wAA//8A/wD/AAABAAD/AAAAAP8AAAABAAAAAP//AAD/AAAAAAEAAf8BAP8B/wD//wAAAQEBAAAB////AP8AAQEAAP//AP//AAAA/wABAQICcG9wSEdJAQAAAAD/AQAAAP7/2PH8mNoB/QQD4egM8fkHAAIACQX+AgP/BQH/6+sN8vgGAQL/+OcH++wJCQMADAEACgAAAwEACgH99v7++f7+EAv6Iy3rBgz9AP8AAP0AAAABAAD/AP4AAP7/AQD+//8AAf//Af8AAQEAAAAA/wAAAAH/Af8AAP4Av9n98PcCAAABAAABAAD/Nzc1AAABAAABAAAA/wAA/wABAQEAAQABAAEAAAD/AAD/AP8AAQAB/wABAQEAAQAAAAEAAQH/AAAB/wEAAAABAAABAAAB//8BAAABAQD/9vX2sbCyAAABAAABAAD/AAACGBYCVFH//wABAAAAAP8B/v8A/wAAAAAC/gABAAAC/v8C/gAAAP8BAAAB//8B/v8BAAAB//7//gEBAQAAAAEBAP8BAf8BAP8AAP//AAH/AP8AAAD/AQEAAP8AAQD+////AP///v/+AP///wAA////AAH/AAD+///+///+AAD9////AAD/AAH+AP/+/gAAAP8B/v8B/wAA/wD//v///v4B/wAB/wAB//8A/wAB//8B/gABAP8A/wAA/v8A//8A/wAAAAAB//4A//4A/QAA/wEB//8B/v8A/wABAAAAAP8AAAAC/wAA/QEAUFoEKS0DBAQCAgH/ABUJ/2QdACoGAAD9AAABAAD/AAAAAAEAAAAAAP8BAAAAAP8AAP4AAAAAAAAAAP8BAP8AAAD/AP8BAP8AAAABAAAAAAABAAD//wAAAP8BAP8BAP8AAAAAAP4AAAABAAAAAAEAAP4BAP4AAP8AAAAAAP8BAAAAAAABAAEBAP7/AP8AAP8AAAEAAAAAAP8BAAABAP7/AP4AAP4AAP7/AP4AAP8AAAH/AP8AAP///wEAAAEBASARACYRAAD/AAD/ANvx/ZzZ/6ff/8HrANf0APn+AAABAAABAQEBLigAenD/xLb9o5z8QEL+AQUBAAEBAAH/AAD/AAD/AP8AAAD/AAH/AAAAAAAAAQAA/wAAAAD/AAIAAAAAAQEA//8BAAD/Skf/HhsAAAD/AAAB/wAArrABAQEA//8AAf4AAAAA/wAAAQAA//4AAAEAAAAAAAD///0A//8AAf8BAP8AAAAAAP4A/gAA//8AAAAAAQABAAAAAAAA/wD+AAAAAP8BAAD//wAA/wEA//4AHBoABgMB/wAA/wAA///+/v4A/Pz/8vMElZkLTFIRgIcM1NYD/wAB///+AP8AAQEAAAD/AQD/AQL//wD+AAH/AQEAAAEAAAIAytACXGcGfocC8/T+/////v8BDgwCiW0ALSL/Av0AKR7+gGP5BgQA/wEB+/8BjqkO1t0IAP8AAAABAP8AAQD/Af4BAAAAAP//AQD/AQEAAQABAP4AAAD//wH/AQD/Av//AAABAP8A//8AAQAAAAEAAAAB/wAAAAEB//8ABgUBel/9JR0AAAD//wAAAAD/AAD/lpSVzc7PAAAAAAIAAAH/AAD/AAD/AQAAAAABAAAAAAAAAgD/Af8BAgAB/wEBAP//AQD/AAEBAP8AAP8CAf8AAQAAAAABAf8AAQD/Af8B//8A/wAAAQEBAAAAAAD+/wEAAAAAAAAAAAAA/wAAAf8AAAEAAgABAAD/AP8BAf8BAQEAAAH/AAEA/wAAAAAAAAEAAAABAAEAAQEBAQD//wD+AAAA/wABAAH///8AAAAAAQABAQAAAQAAAf8AAQAAAAAAAAD//wAAAAABAAABAf//AAAAAAEA/wD/AP8AAP8AAQD//wEA/wECAAAA//4AAQAA/wD/AAAAAAAAAQAB/wD//wD/AQAAAAAAAP8AAAAA/wAB/wD/AQAA/wAAAf8AAP///wEAAAEAAP8BAAD//wEBAAEA/wAA/wEAAAEAAAABAAABAAEAAAEAAAIA/wD/AAABAAEAAAH/AAH/Af8AAAEAAAAA/wEBAAEAAAEBAQEAAP//AAD/Af8AAAAAAQAB////AAAB/wD/AAD//wD/AP8A/wAA/wAAAQIA/////wABAAAAAf8A/wD/AQAAAQABAAAAAAEAAAAAAQsMC3d3dQoMCwAAAP8A/wAAAf8A/qTW9+D2BwwIAv8AAP0A//v+AQECAAEC/gTyBfXWDvTZDPPbEQb6/wX+/gP//gH+/gEAAAgAAf//+PkG+hwi8AUL+wD/AQAAAQABAQD+/wD/AQAAAAAAAAAAAAEB////Af8A/v8AAAD/AP8A/gABAAEBAP///rXW/AAA/wAAAAAAAAAAAEJCQAEAAAAAAAD/AQH/AAAAAP8A/wABAAH/AAAAAAAAAQABAf8BAAAAAP8AAAD/AAD///8AAQABAAH/Af8AAP8BAAABAAEAAAAAAP//ALy8v8vKywAAAAAA/wAAAQAAAUlBAB8b//8BAP4AAf//AAEAAf8AAf4AAgD/A/4AAQEAAgD/Av4AAP//Af//AQEBAAD/AAEAAwAA////AP//AAEAAP//AAEAAP8A/wD//wD//gEA/wD//gAA//7//v8A/wD//wAAAAAA/gH//wEA/gD//v/+/gAA/v8B/////v8A/v8A/v///v8A//8B//8B/QD//wABAP8AAf//AQABAP7/AP7+AAAAAv7/Af8AAQAAAP7/Af//AQEBAP8AAP8BAP8AAP4BAf8CAAD/Av4A/wAA/wEAAf8A//8AAf/+AP8AAP/+Af/+AAYH/0BJBP38/P8C/wLy9wDu9QD+AAABAAAA/wAAAAAAAAD//wAAAAAA/wAAAQABAAABAQD/AAAA/wAA/wAAAAAAAAAA/wAAAAAA/wD/AAAAAQD/AAEAAQAAAAAAAQABAgD/AAD/AAD//wD/AQD+AAABAAAAAAD/AAD+AAAB/wAAAAD+AAD+/wAAAAAAAQAAAQD/AAD/AQAAAQAAAAAAAQABAAAAAAAAAAAAAQAAAAD/AAD/AQAAAAH/AQD+AP//AQA3GQEHAwEA/wEA//8A//8AAAAAAQAAAA0PBEdEAIF5/L+y/ca7/oR//C4v/gABAAD+AAAA/wAA/wD/AAAAAAAAAAAAAAD/AP//AP8A/wD/AAAAAAH/AQD/AAD/AP//AAD//wEC/wAA/x8dAExHAAAAAgABAP8A/6u1A9fWAAH/AP8CAP8AAAEAAQAAAAEBAQD/AP8AAAD/AAAAAAAA/wAC/wAAAAAAAP8AAAH/AQEBAQEAAP////4BAAABAAH/AP8AAAAAAAD/AAH/AAH/AP//AAMCARMRCQEAAQAA/gAA/v/+/v37/fz7+wAA/ubr/5GbB1RdD2RuDKmvBe7uAQAA/wEBAP8AAAAAAAEAAAAAAPHzAbO4B2huCUtWBbW7//7//QD+AAH+AQsJAYtsAVRD/AD//wAAAAD+AVlE/FlC/v4AAQMB/uPuApOsE/r8AQH//v8A//8AAAEAAAEAAQD/AAD/Af//////AAIAAP8AAP/+AAAAAP8AAAAAAP8AAAABAf//AAEAAAABAAABAf8BAAECAgABABQSAmxT/wAAAAAAAAAA/wABAe7t7IOEhvn6+gAAAAAAAQABAQAAAAEAAAABAP8AAQABAAL/AQEA/v//AAEA//8BAP///////wEAAAABAAABAAAAAAAA//8BAP8AAf8BAQEBAQEAAQAAAAAAAP8AAQH/AQEAAAAA//8AAQAAAP8B/wAAAP8AAAD/AQABAf8B//8AAP8AAAD/AAAA/wAAAQD///8A/wAAAP//AAAAAf//Av8A//8BAAD/AAAAAAABAAAA/wAAAP8B/wABAAAAAAAAAAEAAQEA/wH/AAD/AAAA/wAA/v8AAAEBAQAB/wAA//8AAQD/AQD/AAAAAAEB////Af8AAf/+AAAA//8AAAD/AP//AQAAAP8A/wAAAQAA/wABAAEAAP//AAAA/wAB/wAAAQD/AAEAAAECAAAAAQD/AAH/Af8AAQEAAAAAAAAA/wD/AAH+/gAA/wD//wEBAQABAAEAAQAAAQAAAQABAQAA/gAAAP8AAAAAAf//AP////8BAQH/AQABAAAAAP8AAAABAQAA/wEAAP8AAAH/AQEBAQAAAQD/AP///wAAAf8A//8AAf8AAQH+Af//AP8AAAH/AAAA/wAA/wAAAAE9PkBvcHABAAAAAAAAAP8A/wHo9f2U2P0XIPQdFvcHBAH4/QX7/QL//gAC/f/95gfy3Az+9gED/QD7AAH8/wECBP8RGvkCCAHs/QDYBPwADfz//gD//wMAAAD//gAA/gAA/wAA//8AAAH/AAEAAAIBAf///wEA/wAAAAABAAEBAAAAAf/S5f282v4AAAAAAQAAAAAlJyg7PDwAAAH//wD/Af8AAQABAP8A/wH//wH/AAAAAAAA/wEAAAAB/////wD/////AQAAAQEA//8AAAAAAAABAf8A/wEAAAAAAQABAAEAAQC9v8EAAQAAAP4AAP8AAP8AAP4+Pfz/AAAAAAABAAD/AQD9/////wL/AAL/AAAAAAH+AQD/AQEAAAL/AAD/AP//AAH/AAL/AAH//gH/AQAAAAD//wAAAf8A////AAEAAAAAAP///v//////AP3///8AAP4AAP4C//3//wD///4AAf////3/Af////8B//8AAQACAAAA/wEAAQAAAAEB/wH//wIAAQH//gEA/wD/AAH+/wD//wEAAAH/AP//AAH+///+AAH/AAH/AAH//wL/AAH//wH//wEA/wH//wD/AP///wD+AAH/AP8A/wEB/wH/AAEA/wD/AQD//wH//wA7QAQQF/7/AP7++foA0vMAAAEA/gAAAP8AAAAA/gAAAAAAAAAA/wAAAP8A/wAAAP8AAAEAAAEA/wEAAAAA/wEAAAIA/wAA/wAAAAAAAP8AAAD///8AAAEAAAAAAAAA/wEAAQAAAAAAAP8A/gAA//8A/wAAAP8AAAAA/gEAAAAA//8A/wAAAAAA//8A//4A/gAA//8A//4A/wAA//8A/gAAAAEAAQIA/wEA/wAA/wAA/wAB/wH///8A/wEAAAAAHA7/MBb/AP//AAAAAAABAP8AAAErJvyupPq2qf1+d/8/Pf0LDf8AAQIAAQEAAAAAAgAAAAEAAAAAAQAAAAAA/gEAAAEA/wABAAAB/wEAAQD/AQEAAQAAAQD//wABAAAAAAH//wAA/wAAAABNSf4JCAAAAAAAAP/u7/2mqQAAAQAA/wAA/gD/AP8AAAAA//8A/wABAAH/AAABAQABAAAA/wAAAQAAAAABAQD///8A//8AAQABAAEC/wH//wEAAQAA/wAAAP//AAAA/wD/AAD/AAD5+QEFBQYMCwUAAAEAAAEAAQAbFgP/+/38+f0A/v7/+/7q6v6qrANgaAhDTwhXZQd3gASKkgSLkgRyfQddZwg/SwhOWQKbo/7t7f3///0BAP8A//8BAgR2XAFiTvwCAQAAAQEA/gEA/wAEAwBvVvoTDP79AAEBAAKwyAe7ygsAAAEBAAL//wH/AAEAAP8AAAD/AQAAAAEBAf//AAABAAABAQD//wABAAAAAAAAAAEA//8AAAAA/wABAAEB/wAB/wEAAAAAAAEBBAFgTQBALwAAAAAAAAEA//8AAACysLC1trYAAP//AP//AAABAAH/AAEA/wABAP8AAP8CAf8AAQEAAQD/AAACAAD/AQIBAAD/AAAAAAAAAAAAAQAA/wACAAABAAAA//8AAP///////wH//wEA////AAD//wEAAAEBAP8BAAAA/wEA//8A//8BAv8AAP8AAAEBAAAB/wH/AQAAAAH/AAABAQAAAAD/AP//AQD///8BAAABAAIA/wAAAAEA//8B/wH//wD/AAAAAQH/AQD/AAD/AAAA////AAH/AQAAAAABAAH/AAEA//8A//8B/wABAAEAAQAAAAD/AAAAAAD/AAAAAf8BAP7/AP8A/wAB//8AAQABAQAAAAABAAD//wAAAAABAf8AAAAAAAAA/wD/AAEBAAABAP8AAAD///8AAP8AAP//AAABAAAA/wAA/v8B/wAA////AQEAAAH//wEA//8AAP8AAP8AAP8A//8AAP8A/wIAAP8BAAAAAAABAQAAAQABAAD+AQAAAP8AAQEAAAAAAAAA/wD/AAEAAQEAAQD///8BAP8AAQEAAAAB/wABAAEAAf8BAf8AAQABAQEAAAAAAQAAAAH+AAEAAAAAAgEAbWttKCsrAAAAAAAAAAAA/wAApNT40vn6GirsICbuJR7uDg35/AIB9/4C9/8F+/0E/f4C8wMC6wED7QQDDSDuEivr8wz66fz/3vf//P3/Af8DAP3+AP7/AP8AAP8AAP8A//0BAP7/AP/////+AP8AAv8BAQAA/wD+AP//AAAAAP//tNX/9fgAAAAAAP//AAABSUlIDAsL/v//AQAAAf8BAAAB/wABAAAAAQD/AAEAAAAAAQD/AP///gAAAQAAAAACAv8BAAABAQECAAD/AAEA//8BAQD/AQD//wD/AAD+5OPlsq+yAP/+AAD/AAABAAD/JCABQz/+/gAB/v4A/wAA/wEB/wED/wED/wAA/wAAAAAB//7//wD/AP8BAAAC/wABAP8BAAD//wD//wAA//8B//8A/wEB//8B/wABAf/////+AAAAAAD/AAABAP8BAAEAAP///wAB/gAAAAD/AAD///7//wABAf//AAD/AP////8B/gEAAQAA/wAB/QD//gAAAAD///8A/////gAA/v8A/wABAAAA/gAA/gAB/wD/AAAAAP8B/wAA/v8B/gH///8A/wEA/wEAAAH///8A//8BAAACAP////8A//8A/v8AAAAAAAAA//////8BAAEAFxoBOj8KAP8BAQD/Adr4APgBAP8BAP8AAAAAAAIAAAABAP8AAAEAAAAAAAAAAAAAAAAAAP8AAP8AAP8AAAABAAAAAAAAAAEBAP//AAAAAAABAAABAAAAAP4AAP4AAAAAAP8BAP8BAP8BAAIAAP8AAAD/AAABAAAAAQABAP8AAAABAAABAP8AAAABAP8BAAAAAP//AAABAP7/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/wAAAAAAAAAAAQAAAQD/AQD/AP7+////AAD/AAABAQAAAQD/AQD/AAAA/wAA/xcVFQL/AAH/AAD/AQAAAQEBAQEAAQD/AAD//wD/AP8A/wAA////AAAAAQEA//4BAAD/AQAB/wEAAAH/AAIA/wEBAQEA/wAAAf//AAEA////AP8AAQAAAAEBAAABAAH/AQEAAgEAAQAAAQAAAQAAAAD/AQD/AP8BAQEAAAABAAIAAP8AAP8A/wD///8AAAH//wEAAAH+/wAA/gAA/wAAAAAAAQAAAP8AAQABAP//AAH/AAAA/////gH/AAEAAAIAAAAAAAAAAQAAAP8A/wEA//8AAP8A/wAA/gAAAwEA//8AAf7+AP4AAAD/AAABAf8BAQH//wD/Af//AP//AAAAAAEAAP4B/wAB/v8AAAD/AP//AAABAP8AAQH/Af///wAAAP8A/wAAAAABAAIAAP8BAAAAAP8BAAABAQIBAAEAAAAA/wEBAQAAAAEBAAEBAP8BAQAAAP8AAQD/AAAAAP//AgABAQH/AP8B/wABAP8AAP8AAAD/AAABAQD/AQD/////AgEBAAD/AQH/AQABAAD//wD//wEA//8A//8BAAABAP8AAAAAAQEAAP8BAAEAAP4BAgD/AAEC/wAAAP8AAP8BAQAAAAAA//8BAP8A/wAAAQAA/wAuLiwA//8AAAEAAAEAAAIAAADU5gEA/gAA/f8BAQAA/wH//wEA/wEAAAAAAP8B/wAB/QAB/gABAAEA/wEA/wECAAD//gHC1gG42v4BAQIAAAEAAP9fX1z/AP8BAP8BAAAAAAAAAAAAAAAXExIRDw0AAAAAAAAA/v8A////AAEAAQEAAgIAAAEAAQAA//8AAP8A/wEAAAAA/wAA//8BAAABAQD/AQAA/wEAAAAAAQAA0+0B1/L/AAD+AP8EBwL//gL+AAH//wD9/wD+/wD+/wD/Af//AAEAAQL+AAL9AAL+/wH//wD/AAL+AP/+/gD+AAH+/wD/AAH//wH//wL/AAL/AAL+/wH//gH+/wD/AAD9/gH//wL+AAD+/wH//wL+/wL9/wEA/wH/AAL+AAIBAAP+AAH//gH+AAD+Af7/AP/+//8AAAD+/wH/AAH/////AQH//gD9AAD/AAH+/wABAP8A/wH+/wD+AQH///8AAAP//wEAAAIA/gD+/wD+AQL/AAEAAQEA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//4AAP8B/93P+QD+/wAAAQAHBQEzDwAB/wAAAAD//wD+AAEBAAD//wD/AQAAAAABAP8A/gACAAD/AAAAAP///wD/AAABAAD/AAD/AAD/AAAAAQD/AP8A/wAAAQH/AQH/AQH/AQAAAQAAAQD/AQD/AAD+AQD/AQD/AAACAAABAAAA/wD/AAD//wD/AAAA/wAA/wAAAAD//wD/AADY4wD3+wAAAAAAAAEAASkpK01OSwAAAAAAAAEBAAEAAAABAP8CAQAAAP8A/wAAAAAAAf8AAf4A/wAA/wAAAAAAAAABAP///wEAAf8B/wH/AP8BAAEAAf8AAAEBAAH/AP/+AP8A/wAAAQAA/wEAAAD/AP8AAf8B/wEAAQD//wEBAAD/AP//AAD/AAD/AAAAAP///wAAAgABAQD//wH/AAAAAP8AAAD/////AAABAAAAAAAA/wAAAAEAAAEA/wEAAP////8AAQAA/wAAAP//AAABAQD/AAAAAAH+AQAA//8BAAAAAf8AAAAAAAEAAQH/AP8A//8BAP8AAP//AQD//wABAAEBAAD/AAABAAAAAAAAAAEAAAEB/wAAAAABAAD/AP8AAf4AAf8A/wAAAP///wAA/////wH/Af8A/wAAAAAA/v8AAP8A/wAA/wEAAQABAAD//wD/AAD//wEAAP8BAP////8A//8AAf8BAQD/AAEAAAAAAAAAAf8A/wD/AQABAAABAP4A/gEB/wABAAABAQH//wEBAAD/AAEAAAAA/wAAAAAAAAEAAAEA//8BAAABAAD//wABAP8AAAD//wD+AP8AAAAAAQAAAQD//wABAAAA/wAAAAAB/wIAAQAB/wAAAP4A/wD///8AAQEAAQAAAAEAAP8AAAAA/wD/AAAB/wD//wD/AP/+AAEAAQAAAAIAAAH//wABAAABAAD//wAAAQAAAAD//gD/AAD//wABAAAA/wD/AAH/AP/+AQAAAAAAAQAAAQAAAAEAAQAAAAEBAQEAAQEA//8BAP8BAQAAAAH/AQEAAAEBAAEAAQABAf8BAQEAAAABAAEBAAEA/wABAQEBAAAAAf8AAQH//wAA/gABAAAAAAH/AQAA/wAAAP8AAAEBAAAAAAAAAQEA/wD/AP8BAAAAAAAAAAD/AAEAAAL/AP8CAAAB/v8AAP//AP8AAP8AAf4BAAD//wH/AQEA/wAAAAAA////AQD/AAAA/wL/AP8AAAH/Af8AAP8BAQEAAAABAAAAAQEB/wACAf8AAP8AAQD//gABAP8BAgD//wEAAQEAAAH///8AAQABAAD/AQEA//8A/wEAAP8BAP//AP7/AAAA/wH/AAABAP////8AAQH/AAAAAP////4AAAEAAAEAAP/+//8BAQAAAAAAAP//AP8AAP//AQD/AAAB/wEAAQEAAAAA/wAAAAAAAQEAAQAAAf8AAf//AAAAAAABAAD/AAEBAAH/Af8AAP////8AAQEAAQABAAD//wAAAAABAAABAQABAAABAAD+AP8AAQEAAAD//wEBAAEAAQItLS0AAP8AAAEAAP8AAAAAAADg0Pjz8f0AAP4B//7/Af8AAP8AAAAB/wD+AQAFBQBkcwUqOQWeifjFu/8DAwH//wAAAQABAQAAAP///wAB/wEBAQHp6P+3pusA//4A//4AAAEAAP8gICNCQEECAAH/AAABAP8AAQABAAABAAAAAQEAAAD//wAAAAAAAP////8CAAAAAAAAAAABAf//AAAAAAD//wAAAAAAAQD///9HRkQGBwYAAAEAAAAAAP8AAADk2PLSxfH9/v/6/QH6AAH8/wH8//7/AP//AAD+AQD+////AAD+AAH9/gH8/////wD+/wD+/gH/AAD/AAH//wD//wD+AAL//wH//gD+///9AAD9/wD+/wD/AAH//v//AAD+AAD+AAH+AAAA/wH//wD//wH9Af/+AAD///8A/gD+/wD+/v/+AAD/AAABAf/+/wD/AAEAAAH//gD+//8A/wL+AAH+AAH//wH//wL+/gD+/QH+/wD+/wD9/wH8/wD9/wD/AAH9AAD8AAD8/gD//v/s7P3dzfkAAf8A/f8AJAz/GgQA/wAA/v//AAAAAAD//wEA/wIAAP8AAAAA/wEAAQIA/gAA/wEA/wEAAAAA/wAA/v8AAQAAAAEAAAEA/wAAAAEAAAEAAP//AAH/AP///wAAAAAAAAEAAQEA/gIAAQEAAP8AAAAA/wAAAAIAAQEAAP8A/wAAAAAA//8AAAAAAQAAAAEA8PYA1+QAAAAAAAAAAAD/AP9TVFMRERABAAAAAAD//wAAAAAAAQAA/wAB/wAB/wAAAf8AAP8BAQADAAD///8B/wD/AAD//wAAAAEAAQAA////AgAAAQEAAQAAAAD/AP8AAAABAQAAAAD/AP8A/wD/AAEBAQEBAAAAAAD/Af//AQH//wD/AAAAAAEA//8AAP8AAQABAAAA////AP7//wEA/wAAAf8AAAACAAEBAAAAAAAB/wD/AAD/AP8A/wABAQL/AQABAAEAAAAAAAEBAAECAQAA//8AAP/+AP//Af8BAAAAAAABAAABAAAAAQAAAf8AAQABAAABAAEBAAEBAP//AAAA//////8AAQD/AAEAAP8A/wAAAQD/AAD//wD///8AAP8B/wAB/wABAf8AAP8AAAEAAAABAAH/AAAA////AP8AAAEBAAEAAAAA/gD///8AAAAAAQEAAQABAAAAAAH//wAAAAEAAAEB//8BAAABAAD/Af8BAAAAAf8AAAAAAAAB/wABAAABAAH/AAAAAAABAAD/AAD///8AAAAAAAAAAAAAAAABAAD/AAAAAAEBAP4A/gEB//8A//8A/wAAAAAAAgABAP8BAf8AAQAAAQAAAAH//wD//wD//wD/Af//AAAAAP8CAAEBAQABAP8AAQD/AAH+AQAAAP8A/gAAAAABAAAAAAABAAEBAQH/AAAAAgACAP8BAQEAAP///wEAAQEAAQD+AAABAQEBAQACAQABAAD/AAABAf8AAQABAf8BAAABAAEAAAEAAAEA/wAA/wD+AAAA////AgEAAQAAAP//AP//AQABAQD//wH+////AAAB//8AAAAA////AAAA/////wAA/wAAAAABAAH/AQEAAAEA//8AAQAAAf//AAAA/wACAAAA/wD//wAAAAAAAAAAAP8A/wD//wEAAP//AQAA/wH/AQAB/wEAAAEAAAAAAAAAAP8BAAABAAD/AAABAQAA/wEAAAEBAAIAAf8BAAAA/v/+AAABAQEAAQACAAEBAAD/AQAA/wABAAD//wEA/wEAAAABAP8AAgAAAAAB/v//AQD/Af8A/wAAAQEAAP8AAP4AAQAAAAIAAAD+AAAAAAABAAABAQABAAD/AAD//v8BAP//AP//AAAB/wABAQACAP//AQAA/wD/AAAAAP4A//8AAQAAAQAAAQEAAAAAAQAAAAABAAAA//8A/wEBAP//AP4AAAEAAP8BAf4AAAAB/gAA/v//AP/+AP8AAf8BAgEBAQIC////AP8AAAAAAQAAAQEBAAEBAAECAAAAAP8AAgEAAAABAQD/AgH/AQH/AP//Ly8tDxASAAD/AAAAAAABAP//59z4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Af7/AP8BAP4AAf4AAP//Av4AAf7/Af3/Af//Av4BAP8AAv4AAAD/Av4AAP4BAv8AAP3+AQAAAf//AP8AAf//Af8AAf//AP4AAf7/AP//Af3/AP3/AP/+AQAA//8BAAD+AP3/AP8AAf7+AP7/Av7/Af7/AP4AA/7/Af3///P2/9G+9gD9/AAA//8XCQApCgD//wAAAQAAAQD/AAEAAAAAAAD//gAAAgH//wD/AAD/AAAA/wAAAAEAAQD+AAH/AQAA/wD/AQAAAAAAAQAAAAAAAAABAQD/AgAAAAEAAQABAAD/AP/+AP8AAAABAQAAAAAAAAAAAQD/AAD9AAAAAAD+//8AAAAA/wD+/wAAAAD//wDu9gDW4gAAAQAAAAAA/gAA/1JTUB4eHv8A/wEAAAAB/wAAAAD/AAAAAAABAQEBAQAA/wAAAAEBAQABAQAAAQAAAAAAAQAAAAAAAAEA/wEAAQAA/wAAAAAA/wEBAAAAAP4A/wEAAP///wEAAAAAAQIAAQAAAAABAP8AAQAAAAD/AAAAAAD//wEA//8BAP8A/wH/AAAAAAD/AAEAAQABAP8AAQAA/wAA//8AAAAAAf8B//8BAAABAf8AAAAAAAAA/wAAAAEBAQEAAAABAAAAAAD//wAAAP//AAAA//4AAAAAAQAAAf//AAABAAEAAQABAAAAAAEAAQAA//8BAAH//wD///8AAP7/Af//AQAAAf8AAAEAAQEB/wD/AAAA/wEAAQAAAQAA////Af8CAQAA/wEBAf//AQAA/wAB//4A//8A//8AAAAAAAAA/wIAAP8BAQAA//8A/wAAAAEAAf8A//8AAAH/AAAAAQL/AP8AAP8AAAABAP4A//8AAf/+AAL/AAEBAAEAAQAAAP8A/wAAAAD/AQAAAAD/AAEAAAABAQAAAAABAQEA/wEAAf8BAQAAAAIAAf8A/v4A/gEBAAAAAAAAAAEB/wAB//8A/wAAAAAAAAAAAQABAP8A/gAAAf8AAP8CAQH/////AQEAAP8A//7+AQAA/wD//wEA/wABAP//AQABAQEBAQAAAQABAAIAAAABAAIAAAAAAP8AAP8BAAD/AAD/AP8AAAAAAAH/AAABAAAAAf8AAP4BAAEAAAAB/wEA//8AAAEBAP//AP8BAAH//wD/AAD/AAEBAQL/AP8B/wABAAD/AP8BAgABAP8AAAAAAv//AAAA/wAA//8AAAEA/gABAP8BAP8BAQEAAgH/AAEBAAEAAAAAAAAA/wABAAAB/wAAAP8AAf8AAQEA/wACAP//AAABAAEBAQEBAAABAgIAAAD/AAAAAAAAAAACAAABAAAAAAEBAAEB/wABAQH/AAEAAAECAQAAAAEAAQIAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAP8AAAAAAQABAAABAf8BAAABAQEAAAAAAAD+AAD//wAA////AAAAAP8AAP8AAAAA/wAB/wAAAAAAAAH//wD/AAACAQEAAQH/AAD/AP8BAAEBAAEAAP8BAQAA/wAAAf8AAAAA/////wH/AQAAAQABAAEAAQEAAAH/Af8AAAD/AQEBAAD+AAAAAQAAAQAA/wEA/wAAAf8AAAD/AP8AAgAAAAEBAQEAAAIB/wH//wAA/wEAAP8B/wD/AAEA/wAAAQD/AAAA/wH/AAAAAAAAAgAAAAEAAAEA/wAAAf8A////AAA+Pj0AAAEAAQIAAAAAAAAAAADSwPn08gAAAQEBAAABAQAAAP8A/////v8BAgABAgH/AAArMvt6mAEvRgUEDP8SGwU8VApykw11iQ0LCQWih+jz7PsA/wEAAP8AAP8AAABfXl4TFBMBAAEAAP8BAP//AP8A/wAAAP8BAP8B/gAA/wAAAAAA/wAA/wEAAAAAAAAAAQD/AP8BAAD/AAEBAAD//wEBAAAAAAEA/wD/AAFQUVAoKisAAAAAAAAAAP8AAAH+/f/QuOz+/wH9/wL7/gH+/wH8AAH+/wD+/wH9/gL9/wD+AAD+/gD+/gH/AAD+AAD//gD+/wD9/gD+/wH9/gD//wD9/wD8AAH/AAD+/wD/AAH9/gH9/gD//gH/AAH+/gD8AP/+/v/9AAH//QH9/////wD+/////gL9/v7/AAAAAQH//wH+///+/wD/AAD+AAD+/wEA/wH//gD9////AAD//wD/AAD+/wD+/wD+/wD/AAD+/wH+AAD+/wD+AAD+/wH9/v/+/wAAAAHQy/jq0/oAAf8AAAEBJwn/CgIAAQAAAAAAAP8AAQD/AAAAAAAAAAIAAv7/AAAAAAABAQEA/wEA/wD///8AAQH/Af8A/wEAAQAAAAAB/wEAAAAAAf8A/wEB//8BAAD//v8B/gEAAQABAQAAAAAA/wAAAP8A/wEAAP8AAQIBAgEA/wAAAAAA/wAA/wEBAAEAAAAA/wAA1eIA9vkAAAEAAAAAAAEYFxlaWlkA//4AAAH+AAAB/wEAAAAAAAD/AAAA/wD/AAAAAAEA/wAA//8AAP8BAQAAAAH/AQAAAAAAAAH/AQD//////wAAAAAAAAAAAAAAAAAAAAAA//8BAf//AQABAP/+AP//AQAA//8AAP8AAAD/Af4BAAAA/wD//wAAAAEAAAEAAv8BAAD/AAAAAAH/AAAAAQAAAQD/AQIBAQH/Af8AAAEA/wD//wABAAEAAAAAAAAAAf8A//8BAAAA/wD///8AAAABAAAAAAD/AAEBAQH///////8AAAD//wAAAAEAAAEB/wD/AQAAAAEA/wAAAQAAAQABAQABAf8BAAAAAP8BAAD/Af//AP8AAQAAAAAAAAD//wD/AAEBAP4AAAAAAQD/AAABAQAAAAEB/wIBAAEA/wAA/wAAAAAAAQH/AQD/////AAD/AAH/AAAAAP8A/wAAAP/+AP8BAP//AAAAAAAAAAD//wAAAAEAAQD/AQH/AP///wD/Af4AAAABAAEAAAAAAP//AQD/AAH/AAD/////AAABAQD/AAEAAAABAP//Af//AP4AAAECAQH//wEAAP8A/wAAAAD//wH//wECAAAAAQH//wD///8A/wEAAP8AAP8C////AAABAAAAAAACAQAAAf8AAQAAAP8AAAAA/wEAAP8AAP/+AP8A//8A/gD/AAEAAAECAAD/AQAAAAD//wH/AAD+AAAAAP8AAP8AAQAAAAEC/wAA/wEBAP8AAP8AAQEAAAD/AAH///8CAgABAP8AAQEAAAAAAAAAAP7+//8A/wABAAABAQABAP8BAAABAAAA//8BAP//AAD/AQD//gD/AAEAAP8A//8CAP8AAf8BAAAAAAAAAQD//gH/AAEAAAAB/wABAQACAP8B//8AAQH///8BAf8AAP//AAAAAAEB/v/+AQAAAQAAAP8AAAABAAAA/wH/AAAA/wD//wEA/wD/AAAA/wEAAP8B/wD/AAAAAQABAQD/AQAAAAAAAf8A/wABAQAAAQABAQAB//4AAP//AP8AAP8A/wAAAAEB/wABAP8AAAD/AP8A/wAA/wAAAAEBAf///wAAAAAA//8AAAAAAQAAAQAA/v8AAP//Af8BAQAB/wAB/wAAAf8A//8A/wIAAAACAAAAAQAAAAEAAQEAAf8A/wH+//8AAAAAAP8A/wABAQD//wAAAf//AP8AAP8AAAAAAP8B//4AAP4AAP8BAP8BAAEBAAABAAAAAAEAAAEBAP/+AQABAAH/AQAAAAEAAP8AAAEAAAH+AQEAAf8B//8AAQIAAAD/AAEAAP8AAAEBAAABRkdFCAcIAP//AAAAAAAAAAAB5d77wa33AQD//v/+AP4AAAD+AAH/AP8A//8AAP8AAgECAAABJzL/co0HfqMPh6sNc48GPUcHBgcEspzwzr/xAP//AAD+AAAAAAAAICAhXl9bAQABAAAB/wAC/wAAAAAAAAAAAAEA/wAA/wIAAAH///8AAAEBAAD/AAAAAQABAAAAAQAA/wEA//8BAAEBAAEAAAABAAABAAEBAAAAEBAPXFpZAAACAAAAAAACAAAAAAAA1sDr39Hz/f3/+/8C+/8B/P7//gAA/P8A/f///f7//v8B/v8B/wD//v8B/v0A/f8C/f4C/wEC//8A//8C/v8B/wABAAAB/f8A/v8B/gAB/v4A//8B/gAB/v8A/gEBAQAB/gAB//7//QAAAP8B/gD//v///wH/AQEB/v8A/f///v8A/gAC//8A/v///v8B/gAA/f4A/wAB//8B/v8A/wH//gAA/wAC/f8B/wAB/wAB/wAB/wAB/gH//wD//v8A/gAA/wAA8/UA0b/3APz/AP//AQQA/zIPAAEAAP8BAAD+AAEAAP8AAAAAAP//AAAAAP4AAP8AAP8A///+AAAAAAAAAAD/AP/+AP8AAAAAAP8AAP///wD/AP8BAP4BAP8A/wAAAP8AAAH//wD+AP8B//8AAP8AAP7/AP4BAAAAAP8BAP//////AAABAP8AAAABAAAB/wAAAAABAO70ANbkAAABAAAAAAAAAAAAUFBQJyYm/wACAAAAAgAB////AAEAAP8BAQABAAAAAAAA////AAIAAAH/AAAAAP8AAP//AQAAAQABAAH/Af4BAQABAAEA/wAAAAD/AAEAAAEBAQABAAAA//8BAP8AAQAAAAAAAf8AAAH/AAAA/wEAAf8CAAAA/wEAAAABAP//AAD///8A/wEAAAAAAAH/AAEBAf8BAP8BAf//AAAAAf4AAf8AAQEAAQAA/wH/AQEAAAEBAP8BAAEB/wAB/wAAAAEAAQEBAAEAAQABAgABAQAAAQAAAQEBAAEBAQABAP8AAAAA/gEAAP8AAAAAAQAB/wAAAP//AP8AAP8A/wD+AAAA/wAAAv4AAP8BAP//AP8AAP//AQD/AQD+AAABAQAAAP8AAP//Af//AAD//wEAAAEBAAAAAAEBAP8BAP8A/wABAQAAAP8AAQD/AQAA//8AAAD/AQH/AQEA/v8BAAAAAAAAAAEAAQAAAQH/////AQAAAAABAAH/AgACAAAAAf8AAP//AQABAf8A/wEAAAAA/wABAQAA/wD/AAH//wEAAP8BAf8BAAABAQEA//8B/wH/AAAAAAEAAP//AAAAAQD//wEA////AQH/AQABAQEAAAAAAAAB/wAA/wABAAEAAAEA//8BAgEBAAABAAAB/wEBAAD/AAD/AP8AAf8BAAABAAEAAAAAAAD/AgAAAgABAAAAAQD/AAEAAgAA/wAB/wAB/gAA/wEAAAAAAAEAAAAAAAABAP8AAAAAAQD+/wAB/wAAAAABAP8AAAH/AAAAAAABAQIBAQEC//4B//8A/wAAAQABAP8AAAABAAAAAQABAf//AQEAAQD//wAA/wEB/wD/AAAAAAABAQABAAAAAQH/AQAAAAAB/wAC//8A/wABAAAA/wABAQABAP8AAAABAQAA//8AAAABAf8B//8A/wAC/wEB//8B/wD/AAEB/wAAAf8AAAEAAQEAAAEAAf8B/wD/AP7//gAAAP8BAP//AAEA/wAA/wH////////+AP8A/gICAf8CAf8AAAEBAQIBAAD/AAEBAAABAAEAAQAB/wIBAAH/AAAB//8BAQABAP4BAAEAAAD//wD//wAA/wEB/wH/AAEA/wD//wAA/wEAAP4CAAAAAAH+AAABAP//AP8BAAAAAP//AQD//wH/AgABAAAAAAD/AAEA/wEBAQD/AP8AAAABAAAA/wAAAAECAAECAQABAAAAAP8AAP/////+/v///v///v///wAAAf8BAAD/Af8A////AAABAP8A/wAAAQD//v8B/gH/AAD//wD/AAAAAAABAQAA/wD/ADY2N0ZIRgAAAQAAAQAAAAAAAAD//7Kc8ezo/QIAAf8A/wH/AP/+AP8B/wH///8AAP/+AP8AAgABAQ4O/i4y/xYZ/AD+/QD9ANHA+K2R5gD9/wAAAQAAAgAAAQABAXFybxwdHf///wAA/wAAAAAAAQAAAAABAP//AAEAAQAAAAD/AAEA/wEAAAAAAQEAAQAA////AP//AAEAAAEB////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AAEAAAEA/wAA//8AAAAA/wAA/wAA//8AAP8A/wD///8AAAABAAEA/wAA//8BAf8AAP8BAAEA/wEB/wAA/v8BAgAAAP8AAP4A/wEA//8A/wEAAAAAAAEAAAAAAP8AAAIAAQEAAP8AAf8AAAAA//8AAAEB9fsA1uMAAP8AAAAAAAD/AABKSUo/Pz0AAQMAAAD+AAH/AAAAAf4BAQACAAD/AAEA/wAAAAACAAAAAAEBAQAAAP8AAgEAAAD/AAEAAAAAAP8B/wH//wAB/wD//wAAAAD/AAEAAP///wEAAAD/AP8CAQD///8A/wEAAAABAAL/AAAAAP7/AQAAAP8BAf8BAP8BAQD/AP8A/wD/AAAAAf8AAQEAAAEBAAAA/wD//wH/AP8BAQAAAAEAAAEAAQD/AAAAAAD/AAAAAAABAf//AAD/AQAAAAABAQEAAQD+/wH/AgAA/wD/AP//AAAA/wD/Af8AAAD/AQD/AP/+//8AAQABAAH/AQEA/wABAP8AAP4AAQH/AP8AAAABAAAAAAAAAAD//wIAAQAAAQAAAP4A/wAA/wAAAQEBAP8AAAAAAP7/AP//Af8AAAAAAQACAQABAQD+/wAA//8BAAH/Af4AAP8BAAAAAQD/AQAB/wEAAP8AAAD/AP8A//8AAQAA/wEAAAAAAAH/AAEBAAAB/wH///8BAAABAAAA/wABAQD/AQABAAD//wD/AAABAAD/AAAAAQAAAQH/AAEAAAABAAD/AAAAAAAAAAEAAAAAAP//AP8BAAAAAQAAAAD//wEAAP8AAAEAAAD/AQECAAAA/wABAAAC/wAA/wD+Af8CAAAAAP8BAAAA/wD/AAD/AQEA/wD//wAAAP8A//8AAAECAAEAAAIAAAABAP8AAQEAAAABAQAAAQAAAQH/AQAAAQABAQAA//8BAAABAAAAAP8AAAAAAQAB/wAAAAAAAAAA/wEAAAAAAAAAAQABAAAB/wD//wEBAAABAAAAAQD/AQAAAP4A//8AAQAA/wEAAQH/AAAAAAAA/wAAAAD/AAAAAAAA/wEAAQABAQD/AQAA/wABAAAA/wH///8AAQAAAQABAQAA/wAA/wD/AAAA/wEA/wAAAAAB/wD+AP//AAD/AAEBAAAA/wIAAAABAAD//wICAQAAAf8AAAABAQEA/wEBAQEBAAH/AQABAP8AAQEAAQAAAQEAAAAAAAEAAP8AAAH//wEBAAD/AQAAAAAAAAABAAD/AAAAAQEAAQEB/wABAAEA/wAAAQABAQD/AQEAAAH/AAABAP8AAQAAAQAAAP//AAH//wD//wAAAP4A/wAAAQABAQABAAD/AAH/AQAA/wAAAgAAAAEAAQABAAEAAAAB/wABAAD///4AAQAAAP///wAAAAH/AQAAAAAAAQEA//8AAQAAAAEAAQEC/wH//wAAAQAAAAD/AAEBAAEAAAD/AAAA////Af8A/v//AQEBAP8A//8AAP8AAAEBAAAA/wAB/wAA//7/SEZFQ0REAAABAAAAAAABAAAAAAABuqTzx7n4AQAAAQABAAAB/wAA/v8A//4B/v8A/wAAAAD/AP8C/wAAAQIA5Nr8gmDn2830AP8AAAAAAAD/AAABHx4fjI2KDQwNAQAAAQAAAP8AAQD/Af8AAAD/Af8BAQEAAAAAAAEBAP8AAP8AAQD/////AQAAAQAA/wAAAf//AP8AAQEAAAAAAAD/AAEAAQAA/wD/AAEAAP8B//8BY2NgMTExAAAAAAAAAAAAAAAB//r/xq3n9PH8/v8B/AAC+///+/8B+v8B/P8A/gIA/v4B/f8B/f8A/f8B//4B/v8B/v8B/f8A/f8B/v8B/QAB//8B/wAC/f8B/gAA/wAA/QAB/v/+/v8A/wEA/v8A//8B//8A/gAA/v8B/QAA/f4A/gAB/f8CAP8AAAAA/QAA/f8A/v8B//8BAAAB/wAA//8A//8B/f/+/gAA/v8A/wAB/QD+/gH//gD//gEA/v8B//8A/gEA/v4B/v7//P0Awrf28dn5AP7/AP8AATwXACQF//7+AAD/AP4AAAABAP4CAP8AAAABAAABAAABAAAAAAAAAAABAQABAP8BAP8BAP8BAAAAAP//AAAAAAACAP4AAf////7///8A//8AAAIA//4AAAAAAP8CAAD/AAAAAAAAAP8AAAAAAAD/AAAAAf8AAP//AAAAAP8CAAAAAAAAAAAA/9rkAPD1AAAAAQAAAAAACwoLdHRxCQsKAQD/AAH/AQEAAAAAAP8CAAAAAAEAAAEAAAAB//8AAP8B///+AAABAQAAAf//AAAAAAAAAAAAAAABAAD//wH//wH/AAEAAAAAAAAAAQABAQD/AAAAAAAB////AQAA/wAA////AP//AQAAAQABAAAAAAH/AAAAAAAAAP8AAf8BAAEAAP8AAf8AAAH+AP//AAAAAP//AQD/AQECAAD///8AAAAAAAABAAAAAAAB//8BAQAAAQABAQAA//8AAAAAAAD//wABAQD/Af8AAAABAQAAAf/+AAH/AP8AAAAAAf//Af8BAQEAAAAAAQD/Av8AAAAA/wAB/wEB////AQEAAAEAAAABAAAAAAD//wD//wEBAAABAAEAAAAA/gD+AAD///8BAP//AAABAQD//wAA/wAA//7//////v8AAQD/AAEA/wD/AAAB/wAA/wEAAQD/AP8A/wL/AAAAAAH/AAAC/wAAAQAAAAH//wAAAAH/AAAB/gD/AQAA/wAAAAAAAP8AAAAAAP8AAQAAAAEAAQEBAQAB/wAA//8AAP8B//8AAQAB/wAA/wD+AAAAAP8AAQEAAAD/AAEAAAD//wD/AP8BAQAAAAIBAQABAAAAAAEA/wAA//8AAQAAAAEA/gD/AAAAAgABAP8A/wEA/wD/AAD+AQEAAQD//gABAQAA//8AAAAB/wD/AgH+/gH/AAEB/wABAAAA/wD/AP8BAAAAAf8AAP8B/wAAAAAAAAEB/wD///8BAQAAAAAAAQAB/wEAAAAA/wD//wH/AAEBAAAAAP///gAB//8AAQD/AAAA/wD///8AAAAA/wABAAD//////wAAAQD/Av8AAP8A/wEB/////wAAAP8AAQD/AP//AAABAAEAAAEB////AAEBAAABAAAAAAD/Af8AAQEAAP8BAQAAAQEAAAEAAAAAAAAAAQEAAAAAAAAAAP8AAAAAAgAAAAEAAQD+/v8A/wAAAAAA////AAAAAP4A/wEAAP8AAAABAP//Af////8A//8AAP///wAB/wAAAAEAAAAAAAEAAQAAAAEAAAAAAP8AAP8A//7/AAAAAP8BAAEA/wAAAAAAAQAAAQEAAQAA/wAAAf8AAAD/Af8CAf//AAEAAAEBAAEBAAD/AAAAAP8A////AAD+/wAAAAEA//8A/wAAAP8B/wD/AAAAAAEAAAAAAAABAP8AAP8AAAAAAP//AP8A/wAAAP//AAEBAv8AAAAAAAAAAAD/AAAAAP8B//8BAP//AAAAAP8BAAAAAAIAAQD/AAEAAP/+AAABAAEBAAABAAD/AAAAAAEAAAH//wECAQkJCGhoZgEBAgAAAAAA/wAAAAAAAP37/5+E8ODY/P3//wAA/gD+AAEAAQEB/wH//wL//wEA/////QD//+Ta+pRz7OTX9wAA/gAAAAAAAAAAAQkJCoyMijAyLwAAAAAAAP//AAABAAD/AP8BAAEBAv8B/wAAAP8AAAD//wABAAAAAP//AP8BAP8A/wEAAAEAAP8AAQEAAAAAAAAAAAAAAf8AAf//Af//AAAAAAAB/wAA/wsLCnFxbgYFCAAAAAAAAQAAAAAAAefU8MOi5fn9//z///v/Afr+//v+APv+Afz9Af0A//7///3/AP3+Afz/Afz+////Af0AAf4AAf4AAf8AAP4AAf/+AP//Af7+A/4AA/4AAf4AAQAAAf7+Av4AAv3/Af7/AP/+Af7/Af/+Av//Af//AP3/AP4BAf/+Af/+Af8A//4A//7///0AAP//AP////7//gAAAP7/AP//AP7+AP8AAf//AAD/AP/9AAAAAP3///3///8A////ANjZ+tS69f/8/QD//wMWCAA/DwAA/wABAAAAAQABAAAAAAAB/wAAAAD/AAAAAAAAAQABAAABAQAAAP8A/wD+AQD//wD//wD+AQD+AAH/AQEA/v8BAf8AAQEAAAAB/wEAAP///wAAAAD/AQAAAAAAAQAAAQD//wD/AQAAAQAAAAAA//8AAAABAQAAAQD//wD/AAAAAAD5+wDW5AEAAAAAAf8A/wAAAFdXVkBAQQH/AAABAAAAAAH/AAAAAAEB/wAAAP/+AQD/AAD//wECAP8BAAIBAQAA/wD/AQAAAf8BAf//AAAAAAAA//8AAAH/AQEAAAEAAAD/Af8AAP8AAAAAAAD/AP8AAAEAAAAAAQAAAQABAv8B/wAAAf//AAEB/wAAAf8BAAAAAAABAAAAAAD/AAEAAAEBAv8AAAEBAAECAf8BAv8AAQD//gAAAQEAAP//AQD+AP4AAP///wEA/wAAAP/+AAEAAAIAAAIBAAAAAAH///8AAP///wAA//8AAAAAAf//AQABAAD/AP8AAQABAf8AAAD+Af8AAQD/AAEAAQEAAAH/AAEAAAD/AP8AAAAB/wABAAABAQEBAQH//wD/////Af///wEAAQAAAP8BAAABAf8AAP8AAQIAAAEAAAEAAP//AAEBAAAAAQAAAAAAAQH/AQEA/wD/AP8AAQAAAQD/Af8BAf//Af8A/wEAAf8AAQAAAAAAAf///wAA/wAAAP7//wEBAAD/AP8AAAAAAAAAAAD//wD//wD+/wAA/wAAAQEAAAAA/wABAP8AAAEAAf8AAQH/AAABAP7/AAAAAQD/AAEBAQEBAf8A//0AAf/+AAAAAf8A//8AAQEA//8AAAAA/wD+/gEBAQAAAAD/////AAD/AAIAAQEAAv8AAAD//wEB//8AAAEAAf8A//8BAAL+AAD/AAD//wH/////AQAAAQAAAAAAAQAAAAEAAQEAAAEAAAAAAAABAP8AAP8AAAH/AAAA/wAAAP8AAAEAAAEAAAH//gAAAAABAQIA//8AAAAA/wD/AAAAAgIA//8AAAAAAAAAAQABAAEAAAAA//8B/wEBAAH//wEAAAH/AP8BAAAA/wEAAf8AAAAAAAEAAP8AAgD/AAEA/gAAAAD/AP8A/gD/AAD//wAB//8AAQAAAQH/AP4AAAH/AAEBAQEAAAAAAAAA//8A/wAAAf8AAQH/AAAAAQABAAAAAQABAAAB/wEAAAEAAP//AAAAAP8AAQAA/wEAAAABAAH/AAEAAAIAAAAB///+AP4BAAD/AQAB/wEA/wEBAQEBAQAAAAABAAD/AAEAAAAAAAAAAP8AAAAAAAEBAAAAAAD/AgAA/wAA/wAAAAAAAP8AAQAAAQH/AP8BAQEBAQEAAgD/AAD/AAAAAAAA/wABAAABAQAAAP8AAP4BAAEAAP8BAQAAAP8BAP8A//8BAAEAAAAAAAD///4BAAD/AAEAAAAAAQEBAP8B/wAAAAEAAQAA//8A/wEAAAD/Af//AgABAgEBAQAAAP///v8AAAD//wAAAQEAAP8AAQEAAAABAAJPTU9VWFYAAAEAAAEAAAAAAAAAAP/q4fuXePDo3v8BAAEBAQABAAAB/wH//wAAAP8A//8B//7WyPmBXerZyvYA//8AAAEAAAAAAAEEBQSDhIFUVFAAAAIAAAEAAAABAAEB/wH+AAEA/wD///8AAAAA//4CAAD/AQAA////AAABAAAB/wEAAAD/AP8AAQAAAf//AAAAAAAAAAEAAP8A//8AAf8AAQEBAf8AAAEAAQH/AABcXFtkZWMAAAEAAAEAAAAAAAAAAAHRtujYxu/+/v/+/gH8/wH6/wL7AAL6/gH9/gH9/v/+/wH+/gD+AAH+/wL+/wH9///9/gD+/wH+/gH9/wD9/wD//wH+AP/+/v/+/QH/AAL9/wH9AQD//gD+AAH+/wD9///+AAD+/wD/AQD+/wD/AQD9/v/9AP/+AP/+////////AAD+/v//////AAEAAAH/AAH+AP/+AP///wAAAAD+/gD+/wH/////AAH+AAIA/gH+AADy+P7HtfX96PoA/v4BAf/9Uxv/EgQAAP4A/wAAAP8AAf8AAP8A/wAAAAAAAv8AAP8AAP8AAAAB/wAA/wAA/wIBAQAAAAEAAAAAAAAAAQEAAAAAAAEA//8CAQAAAAAA/wAA//8AAAEBAAIBAAEAAQAA/wEA/v8AAQEBAQAA//8A/gEA/gEA/wAA/wAA/wAA/wAAAAEA/wAA4OoA7PL/AAIAAP8AAAECAAFgYWAAAQH//wAB/wAA/wD/AAAAAQD/AAAA/wABAv8BAQAAAQAB//8AAP//AAD//wD/Af4AAP8B//8BAgAAAAEAAAECAQEBAAD/AAABAQAAAf8BAAAAAP8AAAABAAABAQH/AAEAAf8CAAABAP4AAAEAAf7/AQD/AAAA/wEBAAD//wAAAQAAAAAAAAAAAQD+AP8B/gL//wAA//8BAP8CAf8A/wIA/wD/AP8BAf8AAv8BAAACAQEAAAD/Af8AAQD/AAD/AQD//wAAAQEAAAAAAP8BAAEBAAAAAAD/AQABAQD//wEBAQAAAAAAAP//AAAAAQABAQAAAQD/Af8A//8AAAAA/wAAAAABAAEA/wAB//8A//8B/v8A/wD/AQEAAAAAAQEAAAEA/wAA//8A/wEBAP8BAAAAAAEAAf8AAQABAQAA/wAAAP8AAP8B//8AAf//AAEAAP8AAAAAAAAAAP8A//8BAAEBAAAAAAEBAf///gAAAP8AAAH/AAAB/wEBAgEA/wH/AAABAAD/AP//AP8AAQIAAAEAAP8A/wABAP8AAAD/AQAA//8AAP//Af8CAQAAAf8AAQEB/wAA/wAAAAIA/wH//wABAQACAf8BAf//AP4AAAABAAAAAAABAAAAAQEAAQL//wEAAQAAAAAAAgAA/wD/AQAAAP8BAAABAQEAAAACAAAAAP8A/wEC/wECAQABAAD/AAEAAAEC//8AAAAAAAABAP//AAD/AP8AAAD+AAAAAf//AAEBAgAA////AP//AQAAAAABAAAAAQAAAP7/AAEA/wAAAQD//wABAQD/AQEAAQABAP/+AQEB/wAAAAEAAQEBAAH/AAAAAAEA/wH//wD/AAEAAAH/AQEB/wAAAQAA/wABAAEAAAD+AAABAP8BAP8AAAEA//8AAAD/AQH/AQH/Af8A/wIBAP4A///+AAACAQAAAAD///8AAAD/AQAAAQEBAQIAAAABAAAAAQAB//8AAAABAP///wD/AQIA/wAA//8AAP8AAP8BAAABAAD/AP//AAD/AQABAf///wABAAEAAv8AAAD/Af7/AAAAAAIAAP8AAAAAAQD/////AP8A/wAA/wD/Af8C/wAA/wAAAAAA/wAAAP8AAAAAAAEBAAAA//8B////AAD/AAAA//7//wD///8BAQABAQABAAEBAQAAAAAB/gH//wAA/wABAAEAAQAB//7/AAAB/wABAAEB/wAA/wEBAAAAAQAA/wD/AAH//wAAAAEAAAAB/wABAf8AAAAAAAEAAQD/Af8AAAAAAf////8AAAEBAAEBAQEB/wEAAQIB////AP8AAQD/////AAH/BAYDh4SCLS0wAAAAAAAAAAAAAAABAAAA2Mv4gF3tw7b7/wAA/v///v79//8B//8B9/QAu6n6kG/u7OD6AAD/AAD+AAD/AAAAAAD+Z2ZkcW5s/wAAAQD//wD/AAABAAH//gAAAQD/AAEAAAAAAP8A/wECAAD+Af7/AAEAAAAAAAEAAP//AAABAAAB/wABAAAAAAEA/wAAAAAAAAEBAAAAAAABAf8AAP8BAf8AAQAAAAABAQEAf4B9NDQ3AAAAAAABAAAAAAAA/ff9w5ni6eX5+//++/4B/P4B+/4A/AAB/P8A/AAB/P4A/v8C/v4A/QAA+/4A//8C/gAA/f///gAC/wAB/wAB/AD//v4A/f8A/gEB/P3//f///v4A/QEB//8B/v8CAP8B/v8A/gAA//8B//8BAP0B/wAB/gD///8B//8B/v8B/f8B//8C/f8A/f7//v8B/f4AAP8C/v8B/gAA/P8A/gEA/gD//QEA/f4A//4A/gEA+v3+y8X24cH2AP8AAAAA/0MWACwIAP7+AP8CAAABAAAAAP8AAP8BAAH/AP8AAP4AAP8BAAAAAP8B/wEAAAAAAP//AAAAAQH/AAABAAAA//7/AP/9//7/AAAA//4BAAABAQAA/wABAP8B/wAA//8BAP4AAP//AAAAAP////8BAP8AAAH/AAAAAAD/AP8AAP//AAAAAAAAAPv9ANTiAQD/AAAAAAABAQAAQ0RCOTg4AQEAAQIA/wAAAQAAAQAAAQAAAQAAAAIA/v8A/wD/AP8A/wABAAABAQAAAQEAAAAC/wABAAAAAP8AAP8AAAD//////gD/AAD///8AAAAAAAEAAAEAAP8A/wEAAP4A/wD///8A/wD//wABAgAAAf8BAAAAAQABAQAAAAAAAQEA//8A/wAAAAAA//8AAAABAQH/AAEA//8AAQEBAP8AAAL/AAEAAAEAAAAA//8BAQEBAP//AQEAAP8BAAEAAAAB/wAA/wAAAP///wD/AQABAQEA/wABAAAAAf8B/wAAAQD//wAAAP8A/wH/AQAA/wH/AP8BAAD/Af8AAAAAAQAAAAH/AAAAAAD/AAD//wAAAAABAAABAAIAAP7/AQEAAAABAQD//wD/AQACAAIA/wAC/wABAAEAAAAB/wD///8AAAD//wAAAAAA/wAAAP8AAQAAAAABAQD///8A/wEAAAD////+AAAAAAD//wAAAQIAAAD/AAD/AQD//wAAAP8A////Af8AAQEAAQABAQEBAAH/AAD/AQEBAAEAAAAAAAAAAf8AAAAAAAD/AP4AAP8BAAAB////AQAAAQIAAAD+AAAAAAAAAQAAAP///wEBAQEBAQEAAP8A/wABAAABAQAAAAH/AQD/AP8AAAEAAAAAAgEAAAAA////AP///wAA//8A/wAB/wABAAEA/wAAAgEBAP8AAf//AAD//wAAAAEBAAD//wAAAf8AAAD//wAAAAAB//8BAf8AAP8AAAEB/wABAP8AAAAAAP////8BAAAC/wAAAAAAAP4AAAEAAAD/AP7/AAAA/wAAAAAA/wAAAAEAAf//AP8BAf8AAP8AAAEBAAH/AQEAAAH/Af//AAAAAQABAAH/AAD/AAAAAAAAAAH//wAAAAAA/wEBAAIAAv//AQD/AgEBAAAAAAEBAAAAAQEA//8A/gEAAQIBAP8BAQAAAP//AAD/AP4AAAEA/wEAAAEA/wAA/wEBAgEBAf8AAQH/AQICAQEBAQAB//8AAAABAAECAP8AAQEA/wABAAAA/gAAAAABAQAAAAAAAAAB/wEA/wD/AAAA/gAAAAAAAAAAAQAAAAEAAv8B/wEAAAAA/wD//wAAAAH//wEB/wAA//8BAAAAAAAAAQD/AQD/AAABAQAAAQABAAAAAf8AAAD//wAAAP8AAAD/AAD/AAH//wAAAAABAAAAAQAAAAH/AAAAAQEAAAH+/wEAAAAAAAEBAQH/AgEBAAH/AAAAAAABAP8AAAIB/wAAAgABAf8A/wD/AAAAAQAAAAD//wD+AAAAAQD/AAD+AAEAAP8A//8AAAABAAAAAAD/ACIiIYeHggsLDQAA/wAA/wAAAAAAAAAAAOng+pBs7KaL9fDq/f37Avfy/8O1+INf7Zdz6uzj+gAA/wAAAAAAAAAAAQAA/1hYV4iHhAEEAwAAAf8AAQD/AQAA/wAAAAEBAP8AAAD/AAEBAAABAQEA//8BAf8BAQD/AAEBAP///wACAP8A/wAA/wAA/wH/AAD/AAAAAP8B//8A//8A/wEA/wAA//////8AAP/+/wEAAAD/ABYUE4eGgQoKCwAAAAAAAQAAAAAAAfHl9cOd4/r5APr+//v/APz/APsAAPsAAfz+AfwBAf0A//3/Afz9Av4AAP3+AP3/AP3/AP3//v3+AP3/AP//Av0AAv//AP//AP4BAf7/Av7/Av7+Af7+AP4AAP0AAP8AAf//Av7+AP/+AP4AAf3/AP7+Af7+//0AAf7+Af7+AP7/AP7/Af4AAv3///7/Af7///7/AP3+AP//AP7/AP7/AP7+//7///4AAf3+/+Ph/cqo8//5/AD/AAEaCgBCEwAB/wEBAQAB/wAA/wD/AAD/AQAA/wEAAAAAAAD+AAD//wAAAAD//wD//wD/AAEAAAD/AAD+AQEBAQEA/wIB////AgEAAAH/AAD//wD+AAD/AQABAAAA/wD//wAA/wEBAAAAAQAAAAD/AQAB/gAAAQD/AQAA/wACAAAB/wEBAQAAAQAA/wDg6wDj7P8AAQAAAAAA//8A/15fXwEDAwD/AP//AAEAAAAAAP8AAP//AP8AAAD/AAIBAAEAAQABAAAAAQD/////AAH/Af8AAAEAAAABAQAAAAAB/wAA/wAAAAEBAQD/AQEAAAAAAAD/AAD/AAABAAAAAP8B/wAAAAEAAAAAAAEAAf//AP//AAEAAP7/AP4B/wD/AQAAAQEAAAEBAAAAAQD/AAAA/v4AAP8AAAACAP8A//4AAAD/AP///wD/Af8AAQEAAQD/AP8AAP7//wD/AAD/AAAAAAH/AQAAAf8AAAEBAQEAAP8AAP4B/wIBAf8A/wH/AAAAAAAAAAEBAAH/AQABAAD/AP8A////AAD/Af8BAf8BAAEAAf8AAAAAAQAAAAEAAQABAP8B/wD/AAEAAP//AAAA/v8AAAABAAEB/wD//wEA/wH//wAAAQD+AAEBAAEBAAAAAAEAAQD/AAAAAAABAAEAAAAAAP//AQEB/wD+AAEAAQECAQAAAAAAAQAAAAH/AAEAAQH/AQAAAQICAf//AAEC/wABAAD/AAAAAQD/Af//AP8AAf8AAQEAAAAAAAAAAf8AAAEBAQEAAQABAP///wAA/wD/AAABAP7/AQAAAgAB/wEBAP8AAAAAAAH/AP//AP////8A/wAAAAAA////Af//AAAAAAABAAAAAP//AP4AAAAAAQACAgAAAAABAAEA/wAA/wEB/wD/AAEB/wH9/v0BAAAAAAAAAAEAAAAAAQD//wABAP8BAQH/AAAB////AQH/AAAB/wEAAP7/AAABAAH/AAAAAAAA//8AAAAAAQEAAAABAP///wEBAgEA////AAECAP//AQAA/wD/AAABAAH/Af8B/wAA/wAAAQD/AAAA/wABAQH/AP8A/wAAAf8BAAH///8BAAD/AQAAAAEBAAAAAAAA/wD/Af8B/wH/AQAAAAABAAD/AQAB/wAAAAAAAAH/AP8BAAD/AQAB/gD/Af8AAAABAAEAAAD/AQAB/wD/AAAAAP8B/wH/AQAAAAABAAEAAP//AQEA//4AAAEBAAAAAP8AAAD/AQEB//8BAAH+AAAB/wD+AQACAP8AAAAA/wAAAQEAAAAAAf8A/wEAAAD/AP8A/wAAAAABAQD/AAEAAAABAP//AQAB/wH///8BAQEAAAD/AAEAAP4B/wAAAQD/AAAAAAEAAQAAAAAB/wAAAP8A/wEAAQAAAAAAAQD/AAAA/wEAAP8BAAAAAAEAAP8AAAD/AAAAAf8B/wAAAAL/Af8AAAH//v8BAQAAAP4A/wIAAQABAAAAAQEAAP8A//8A/wAAAQEBAAD/AAAAAP8AAAL///4AAQEB/wEAAv///wABAQAA/wAAAAEBAf+Li413dnn/AP4AAAEAAAAAAAAAAAEAAAEAAP8ZJgciLAfq4/zdz/f+/QIA//4AAP8AAP8AAAEAAAAAAABOTU6dnZsTFBIAAQAA//8BAQEAAAAAAAAA///+AAEBAf8A/wAAAQAA/wAAAAAAAQAAAAEA/wAAAf///wABAAD/AQAB/wABAAD/AAABAQH///8AAAEAAf8BAAAAAAD//wEAAP8AAAEAAAABAQD//wAAAQABAP9/f4KCgoQA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AAH/AAAAAAEBAAAAAAD/AQAAAQAAAAAAAAEBAf8AAP8AAP4AAAAAAf8AAAEA//8AAP8AAP8AAAABAP8BAQAAANvlAOXtAAAAAAD/AAAADAsNeHZ3CAwLAQAAAP8AAQEBAAD+AQEBAAEAAAAAAQD+AQAA/wEAAAEAAAAB/wABAP8AAP/+Af////7+AAAAAAD/AAAAAAD+AgABAP8A/v8AAQEAAAH//wABAAAAAAEA//8C//8BAAEBAQD///8BAQAB/wEA/gAAAAAAAP8BAP7//gD/AAAAAP8A/gAAAAEA/wEAAAD/AAD/Af///wAAAAAAAQABAP8AAQEBAAAAAP8AAAAAAAAAAAEAAQABAAEAAQD/AP8AAAAB/wABAAEBAAAA//8AAQABAAAAAAAAAAD/AP4A/wAAAAAAAAAB//8AAgEAAAIAAAEA/v//AQEAAQAA/wAB//8BAP//Af8CAAAAAAABAv8BAAD//wABAAAAAAAAAAEA/wD//wAA/wAAAQAAAQAA//4A////AAABAP8BAAAA/wD/AQACAP8B/gEAAQABAQAAAgEAAP//AAECAAEAAAAA/wAAAAEAAQABAP8AAAEBAAAAAAABAP8AAQAAAQECAAAAAAEAAAAAAAAAAQEBAP8AAAD/AP//AAAB/wD/AAIBAAEB/wAB//8A/////wEA//8AAP8BAAEAAAD/AP8A/wD/AAAAAP8BAP8C/wD/AAD/AAD//wEAAAABAAAAAQAAAP7///7///4BAAAAAAEAAQEAAQAAAQAAAAAB//7////+Af8AAAEAAP//AQIC/wH/ABaE6XsCAP8BAAD//gIAAAABAAD/AAH/AAMBAP//AQAAAAEAAP8BAAABAf8CAQEAAf8A/v//Af8B////AQEBAQABAAABAAD///7//wEAAQD/AAAAAQABAAD/AAAAAAAAAQD/Af//AQABAAEBAP8AAAAAAQAAAQEBAAAAAf8AAQEAAAAAAP8A/wAAAAAA/v4A//8A/wAB/v///wD//wAA/wABAAEAAAH/AAABAP8BAQABAf8A/wAAAQAA/gAAAAEBAAAA/wAA/wEBAP8A/wEA/v8AAAEA//8BAAEAAQABAgAB/wEBAQABAAH/AAAAAAIBAAAAAAEBAQEAAAEA/wAAAAEAAQAAAAAAAQABAQEBAAABAQAA//8AAQEA////AAD/AAABAQAAAP//AAEBAAAAAAAAAAEAAQEBAAH/AQAA//8BAAAA/wD/AAD/AP8BAP//AQAA/wD/AAIA///+AAAA/wD+//8AAP8AAAABAAH/AAIBAf8BAP8AAQAB/wAA/wAAAP8BAP//AQAA/wAB/wAAAP8A////AQABAAEAAAAA/wAAAP8A/gEB/wEBAQD/AAABAAEA/wAA/wEB/wAA//8AAAEB/wD/Af//AAABAQEAAAEAAAAAAgH/AAAA/wAAAAAAAQAAAAAABwcIi4uIhIODCwkLAAD/AAD/AAAAAAD/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAD/AAAAFBQVl5eThYaCCw8NAAAAAQEB/wEAAAABAAD/AAD/AP8AAAAB//8A//8AAP8AAAD/AAAB/wD/AAAA/wAAAAH/AQEAAAD/AAD/AP8AAAAA/wAAAP8AAAD+/wEBAQAAAAH/AAABAAABAAAAAQAAAAAA/wAAAAAA/wABAAAAAAEADA0MiIeGISIiAAABAAD/AAAAAAAB/fn9wpfd7OX5/f4A+/0A+wAB+/8B/AD/+/8A+/8A/QAB/f8B/f8A/v8B/f4C/P8B/v8B/f8A//8A/AAD/f8B/f8B/f8B/gAC/wAC/gAA/gAB/v8C/wED/v8B/v8B//4A//4A/f7//QAB/gAA/v8A/f8B//8B/QAB/gAC/wAB//8B/v8BAP8C/gAA/gAA/v8B/AAB/v4A/gAB/gD/+P7+v7Ly17TwAPz8AAD+AzATAEkVAAAAAP//AAAAAAEAAAACAAABAAD//wD/AAD+AP8AAAAAAP8BAAAAAP8BAAH/AAABAAIBAAAAAAABAQD/AQEAAQAAAQEB//////8AAQIDAf8BAAEBAAABAAEAAP8A//8AAP4A/wAAAAEAAAEAAQEAAAEAAP8AAAH/AP8AAAABAP//AAEA/+70AMrbAP//AAABAAABAAAAVlZUQkNBAv//////AAD///8AAAEAAAAAAP8AAAAA/wABAAEAAAD/AAAAAQAAAQH/AAD+AQIBAAAAAQEBAAABAAIAAAD/AAEA/wAAAAAAAQAAAP8AAP8AAv8BAP8AAP8AAAD/AQEAAAAA/wABAQD/AAD/AQAAAf8AAAAAAAEAAAEAAQAAAAAB/wEBAQAB//8AAf8AAAECAAABAAAAAAAAAAD/AAD/AAEA/////wAA/wEAAP8AAQEAAf8BAP//AP///wEA/wIAAP8AAAAA/v8AAP8BAQIA/wD/AAAAAAAAAP8B/wAAAAAA/v///wAAAgEA//8AAf//AP8AAQAAAP8B//8AAQAA/wAA/wEB/gD+AAABAAAAAQH///4BAgEB/wAA/wAAAAAAAAEBAQAAAQAA/gAA/wEAAAD/AQAB/wD/AAD/AP4AAQEB/////wD/AP//AAD//wAB/v//AQEBAf////8AAf8BAQEBAf4BAAD/AQEAAP//AAAAAQAAAAAAAAD/////AAAAAP7//wAA/wEAAf//AAD/AAAAAQAB/wEAAQEB/wD+AQD/AQD/AQEAAAEAAQAAAAIBAQL+//4AAAABAQAAAAAAAAAA/wD/AQH/AP4AAAAAAQEBAf8AAQD//wH/AAH/AAEBAQEAAAH/AAAAAf//AP8AAAEB/wIBAQAAAgH/AQEBAAAAAAEB/wABAP8AAAACAv8A////AQH/AQABAAEAAf/+AAH/AAEAAP//AQAAAQAAAAABAAEA/wD/AAEB/wEAAf8CAAAAAQD//wAAAf//Af//Af8CAAAB/wAAAAAAAAEAAAAAAf8A/wAAAP8AAQAAAAD/Af/+/gD//wAAAP0B/wAAAAAAAf8A/gD/AAAAAQECAAAA/wD//wABAAAAAQAA/wEAAQEA/wEBAP8AAAD/AP//AQD//wAAAQAA/wAA/wD/AP//AAEAAf/+AP8AAQH/AAH//wABAAAAAAEBAAH/AQABAAD/AQAAAP8AAAD//wD/AAEAAQACAQD/AAABAQD///8AAAD/AAD/AAABAQAAAQABAQD/AAABAAAAAAEBAgECAf8AAAH/AAEBAf8AAP8AAf8AAAAA//8A/wEAAQH/AAAAAP//Af8AAAACAAABAAAAAQEAAP8B/wEAAf8A/wH/AAD/AQEAAf//AAH/AAABAAAAAP8A/wEAAf/+/wABAAEAAP8A/wH/AQEAAP8CAAABAQAAAAEAAAH//wEAAAEAAAAAAAD/AAEAAAABAAAA/wD/AAD+/wAAAQEA/wAA/wD/AAAAAAABAAAA/wH//wH/AAAAAP8AAf8AAAAAAAAAAf7///8AAAD/AAAA/wAA/wAB/wAB/wYFBXp8eK2urDY1NwAA/wEAAAAAAAEA/wAAAAAAAQAAAQEAAQAAAAEAAQEAADQzNLGxq2NjYAEBAQEAAf8AAP8A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AAH9/wL+/gD9AAH9AAH+AAD8/v/S0ffHne/88/oAAP8CDwb/Ux77FgIA/wAAAQEAAP8A/wAAAAAA/wEAAQAAAQEAAAAAAAAAAAAA//8AAAIAAQAAAAAA/wAA/wAA/wAA/wH//gEAAAEB/wEA/wH/AP8BAAEAAAABAAD//wAAAAAA/wAA/wEAAQAAAAEA/wAAAAEAAAAA/gL//v8AAAEA/wD+AAAAAAABAQAAAAEA3usA1uQAAP8AAP4AAAAAAAFqbGo2Nzj//wH///8AAAD/AAD/////AQAAAAD/AQD/AQAC////AAEBAQABAAH/AAEAAAAAAAABAAEBAAAA/wAA//8AAf8B/wAAAQEA/wAAAP8AAP8AAAAB/wAAAQAB//8AAAEBAAAAAP8AAAAAAAD+AQD//wEAAAEAAAD/AAAAAP///wH/AQD/AP//AAEAAQD+/wAAAQAA//8BAQD/AQEAAAD/AQABAQAAAAAA//8BAQABAQD/AAD//wD/Af//AQAAAf8BAP8AAf//AQAAAAAAAQH/AAH//wABAQEAAAH/AAEA//8B/wAAAAEBAP8B/gAAAAAAAAACAAD//gAAAQH/AAABAgH/AQEAAAAAAgEA/wAAAAACAQAB/gD/AP8BAf//AQAAAgH///8BAAD/AAAAAAH/AQD/AAABAgAAAP8BAAAAAP//AAD/AAD/AQABAP8A//8AAAAAAAAAAP8AAAAAAAAAAAD//wABAP///wAAAQAB//8BAQEBAf4BAAAAAQABAAEBAf7///8AAQEB/wAAAAD/AP8BAAIBAAEA/wAA//8A/wEAAAD/AAH/AAAAAAAAAQABAP8BAP8CAQAAAAEAAQH/AP8A/wAAAAAAAAH/Af4BAAEAAAD/AQAB/wAA/wABAAEAAAAAAAEBAAEA/gAAAQEAAf8BAAD/AAAAAAD/AP8BAP8BAAEA//8BAAAA/wAC/wD/AAAB/v7+//8AAQEAAAEAAf8AAAEA//8AAAAAAAAAAAD/AQEB//8AAAAAAAAA/wEAAv8A/wABAAD//wAAAAAAAAAAAAAAAQABAAD/AAABAAD/AAAA/wAAAQH///8AAAEAAP8BAQAA/wAAAAAAAQAAAAAAAAAA/wD/AAAAAAEAAP8AAAABAAH/Af8AAP8AAAEBAAAAAAD//wABAP//AQEA/gAAAv//AAECAAAAAAEB//7+AAEBAQAA/wAAAQAA/wAAAQAA/wD/AAABAQD/AAEBAP////8BAQEAAAAB/wD/AQAA/wEAAP8AAAAAAP8AAQEAAAAA////AAABAAEAAf8AAAIAAAD/AP8BAAAAAAD/AAEBAAAAAP8AAAAA/v//AQEBAP8AAAEAAQABAAD//wD/Af8BAAIAAP////8BAAEAAQH///8BAAD/AAEAAP8BAAD/AQEAAP8B/wAAAQAA//8AAAH/AP8BAQEA////AAEBAQAB/wD/AQAA/wAAAQAA/////wEAAQAAAQACAAH///8BAQD/AAEBAP//AAEAAP8A/wAAAQD/AAAAAAAB/wAAAgAA/wAB/wD/AAD/AQABAAAA/wEBAP/+AQAC/wH/Af8AAP//AAECAAH/AP8AAAABAQD/AAEB/wD/AP//AAABAAEAAAAAAAAB7OvrxcTE1NPUys3P9PLzCwsKJiUlNzk1REVEEhES//8AAQAAAAEB/wD/AAAAAAABAAD/AP8AAAAAAP8AAAEAAAABAAH/AP8BAAD/AAAAAAD/AAEBAf4A/wH/AAABAQAA/wAAAAAA/wAAAQEA/wAAAf//AQEC////AAEB/wD/AAAAAf8B/wH+Af8BAAAAAQEAAP8A/wABAAEAAf8AAAEAAAAAAP8AAAAA/gD/l5eZb25u/f39AAAAAAAAAAD+BggDSocsGCcOAAIABgD/AwEABAH/Bf4AAwMAAv8AAgAAAgACAwIAAQD/AgH/AQEBAgABAQIBAv7//wH/AgD/AQEAAAD/AP8BAAD/AAAA/wEAAf//AAEAAQAA/wABAAAAAP8A/wD/AAAB/gH/AP8A/wABAP8A/wEB/wD/AP4A/gEB/v8A//8AAAAB/QD+2t74roXm9eH5AQAAAA4GAV4i/ioIAAH/AAAAAAAAAP8AAAD/AP8BAP8AAP8AAAAAAP8AAP//AP8AAP8BAAABAP7/AP8BAAABAP8BAP4AAAAAAf8AAP8B/wAAAf4BAP//AP8B/wAAAf4CAAAAAP8A//8BAf4AAAAA//8BAP8BAP8AAP8BAP8AAP4AAAD/AP4AAP8BAQAB/wD/AO/4AK/JAO/1AAD/AAABAAAAHR0ewcHAHx8fAgEAAAEAAAAA/wAAAQAAAP8A/wAAAQAAAAAAAP8AAAEAAAAB/wD/AP8AAAAAAQEA/wAAAP8AAQEA/wAB/wD/AAAAAQEBAP//AAAAAAEAAf8B/wD/AAAAAP8AAAAAAQEBAAEA////AQEA/wAAAP8BAAEAAP8AAP///wEBAAD/AQAA/wEBAv7//wEAAf8A/wEAAAAAAAAA////AQIBAAAAAP8AAAEAAP8AAAEAAf8A/wAAAAAAAAEAAQAB////AAEAAP8AAAAAAAAAAAAAAAABAAH///8AAQEBAP//AAH/AP8BAAAAAAABAAD/AQAAAAAA/wD/AAABAAAAAP8AAAEAAAAAAAAAAAAA/wAAAQABAP//AAH//wABAf8AAAH/AAABAAAA/wAAAQAA/wAAAQAB////AQEBAAH+AAABAP8BAAAA////AQEAAAAAAAEAAP////8AAAEBAQABAAH/////AQAC/wH/Af8A/wAAAP8AAAIBAAAAAP//AQAA/wD/AAABAQEBAf8AAAD//wAAAAD//wABAQAA/wD/AAABAQAAAAAAAAAAAAAA/wH//wABAv8A/wAAAAD/AQACAAD//wAAAQAA/wEAAf//AAABAQEA//8BAAD/AAAAAAAAAAEAAP8AAAEB////AP8BAQH/AAAAAAABAAD//wD/AQABAAAAAAEAAP4A/wEAAgEB/v//AQAAAf79/gAAAP8BAAD//wEBAQAAAQEAAP4A/wAA/wEBAv///wAAAAEAAAAAAAEBAf7//wEBAQD//wAAAAEAAf8B/gD/AQEAAP8AAP8AAAAAAAH/AP8A/wAAAAEBAv8A/wEAAf8AAAAA/wEAAAD/AP8CAQEA//7//wIAAQAB/wD/AAABAP//AAEAAAABAQD/AAAB/wD+AP8CAQAAAAIAAP7//wH/AQABAQAA/wAAAAEA//4AAQAA/wD/Af8AAAICAP/+/wABAf8AAAEAAAAAAAD/AAEB//8AAQAAAAAAAAEAAAAAAP8AAAEAAAAA//8AAQEAAAAAAQAA/wABAAD/AAAAAAAA/gD/AgABAAAAAAAAAAAAAP8AAAAAAAAAAAAB/wH/Af//AAEAAAABAAAA/wAAAf8A/wEAAf4A/wEAAAAAAQABAAH/Af8B/wD/AAABAAD/AAD//wEBAQAAAAAB/wD/Af8AAAEAAP///wEBAf8A/wEAAQAA/wAAAgD//v8BAQEA//8BAAH/AAABAQD/AAAAAAABAP8AAQEAAAD+//8BAAAB/wEAAQD+AAACAAEAAP//AP8AAAAA/wEAAQD/AP8BAAEAAQAA//8AAAEAAAAA//8AAAEAAQAAAQAA/wEBAAD/AAABAf//AAAB/gAAAQAAAAD/AQAB/wAA/wH/AAABAQAAAQD/AAAB//8AAQAA/wD+AAACAQAA/wAAAAAAAAEAAQAA////AP8AAAEBAAH/AP8AAQH///8BAP8BAAH/AP8AAAAAAQEA/wEAAP8AAQAA//8AAAEBAAAAAQAA/wD/AAAAAP8AAAEAAQEBAAD///8AAQAA/wAAAQAB/wH/Af8B/wAAAAD/AAAAAAABAAD/AAABAAH/AP8AAQABAAAA//r5+nt6fY2OjwAA/gAA/wAA/wEAABUnDEWALQsPAwICAQQAAQQA/QQCAAMAAAMAAQP+AAECAAMBAAIBAAMAAQEAAAAC/wIBAAL+AQEB/wH/AAEAAAACAAAA/gAAAQEA//8AAQEA////AAEBAQAA//8BAAAAAAD/Af4A/wEAAP7+AAABAQD+AP8BAP4AAAAAAP7/AQAA//4AAP7+AObq/KuM5u3Q9QAA/wAFAwJgJP4yCQD//wABAAAA/wD/AAD/AQAAAAD/AAAA/wD/AAD/AQAAAAD+/wABAQD+AAD/AAD+AQAAAQABAAD+AAD+AQAAAQH+AAEAAP//AQH//wAAAf/+AQAAAP/+AgEA/wD+AP8AAQD+AAD//wD/AQD/AQABAQD9AAD/AAD/AAD/AQAA/wD/AQH/Af/6/AC70wDY5QEAAf8AAAAAAAAAAYuLjHR0cQAA/wD/AP8BAQH/AAAAAP8A/wAAAQAA//8AAAIAAP8AAQAA/wABAAD/AAH/AP8BAQD//wABAAD/AAABAAABAQAAAAD//wAAAAAAAP//AAIBAP//AAAAAAABAQAA/wAAAAAAAAAAAAEAAf8A/wABAAAAAAD/Af8B/wH+AAAAAAAB/wAAAf8AAQEAAAD/AAABAAAB/////wEAAf8AAAEBAAD/AAAAAAAAAP8A/wEAAgAB/wD+AQAC/wD/AAAAAAAAAAD//wABAAEBAf//AAD/Af8CAAH//wABAQD//wEAAP8AAP8AAAEBAAD/AQAA/wAAAP8BAAD/AQIA//4AAAEAAP8AAAH/AP8BAAEAAAAAAP8A/wIAAf8BAQAA/wAAAAD/////AQEA//8BAQEAAAAA//8AAQEAAQAA/gAAAQAAAAAAAP//AAECAAD//wABAgD///8AAAAA//8AAQIAAAAAAAAAAP8BAAD+AAABAAEAAAAAAAABAQAA/wD/AP8AAAH/Af8B/gEAAgAAAP8A/wEAAP8B/wEAAQAAAAD+AAABAAD/AAD/AAACAP4AAAIBAAAAAAAAAQD///8AAAEAAAAAAAABAP//AAEBAAAA/wAAAP//AAEAAQD/AAABAAAAAAABAAAAAAAAAAD/AAABAQD//wAAAAAA/wAAAAAAAQAAAP8BAAD/AAEB/wD/Af8AAQABAAH/AAL/AP8AAQABAAEBAQEAAP8BAAD/AP8BAAABAAEA/gABAAEBAQAA//8AAP8A//8CAAAA/wD/AAEBAAD/AP8A/wEAAAD+AAD/AAAAAAECAAAAAgAAAQIAAgH/AAAC/wAAAP4AAf8A/wD/AP8AAQABAP4A//8CAAEAAAAAAAEAAAEA/wABAAEAAQEA/gABAP8B/wAAAQEB/wAAAP/+AP8BAQIAAgAAAf8AAAAAAAD/AAEBAP8AAAEAAf8BAQAA/wABAQEAAAECAAABAP8BAAAAAQD+AAEAAAAAAf8BAf8AAAEAAQABAQD/AP///wEAAP//AP8AAP4AAAD//wD/AAAAAAAAAQEAAv8A//8BAAAAAP8AAP8A//8AAAABAQABAAEA/wAAAf8AAQD/AAH//wAAAAAA/wH//wEBAAEAAAH///8A/wAAAP4A/wAAAQAB/wD/AAABAgEAAf//AP8AAAAAAAABAP8AAAAAAQH/AAAAAAEA////AAEA//8AAAABAAAB/wEAAAL/AAEA/wD/AQAAAQAAAAAA//////8AAQABAAABAAH///8AAgAA/////wABAAAAAAAAAAD//wAAAQABAAAAAAD/AQAAAAAAAAAAAAICAAEAAP//AAAAAAD+/wD+AAD/AP//AAAAAAIA/wAAAAEBAQABAAABAAL/AQEAAAAAAP8AAf///wAAAP8AAAAAAQH///8AAAH/AAEA/wD/////AAABAQABAAH//wD/AQABAP//AQD/AAAA/wAAAP8BAAABAP8AAAH/AQAAAf8BAAECAAAA/wAA/v4A/wAAAQEAAAACAQAAAP//////AAAAAAAAAAAAAP8B/wD/AQAA/wAA/wABAQEBAQEAAAAAAQAA/wD/AQEB/wAB/wAAAAEGBgd8fHs2NjcAAAEAAAAAAAL/AAHq2fTSsOb8/wH6/wD6/v/6/wD6/gD6/wH7/wH6AQH9AAH9/gH9/gH8/QD9/wD//gH8/gH9AAD9/wH9AAH9AAD8/gD+AAL+/gD8/wH9/wH9/wH9AAH9/gH8/wL9/gH9/gH9/wD+AAD8/wH/AQD9/wD9AQD8AAD9/wL8/wL/AAH9/wH//wLq8P+znevt0PgAAAEAAAMASRv+MggAAQAAAQEAAAAA/wAAAAEAAP8AAP8AAP8B/wAAAAAAAAAA//8A/wAA//8AAAAB//8AAAAAAQAA/gAAAAAAAAEA//8AAf//AAAAAP//AQAA/wEBAAEA/wAAAf///wEAAAEA//8AAAAAAAIAAAEAAAAB/wEAAQEA/wEAAAAAAP4A/gEA//////8A1uYB2uYAAAD/AP8AAP8AAAAxMDJiYV4AAP8A/wH/AAAB//8AAP8AAP8A/wAAAQAAAQACAQH/AAEAAP8AAAEA/wAA/wD+AQAAAAAAAgAAAAEAAQAAAAAAAAAAAAABAQAAAAABAAABAQH/AQAAAQABAQAAAP8BAAAAAAABAP8AAP//AP8AAAAAAAAA//8AAP8B/wAAAQAAAgAA/wH/AP8A/////wAAAf//AP8A/wABAAIAAAABAAAAAAEAAQABAAEAAQAAAAEA//8A//8AAf8A/wAAAAAAAAABAAEAAQEAAAH/AAEAAQAAAf8B////AAD///8AAAD/AQD/AAAAAAEA/gD/AAAA/wAAAAAA/wACAAD//wACAQAAAAAAAP8BAv8AAAAAAAAAAAECAAH/AAD/AAD//wEAAAAAAAEAAf//AQEB/wEAAAH/AAEBAAD/AP8AAAH/AAD/AAAAAAAAAAEAAAAAAAEA////AP8BAAAAAAABAAAAAf8AAQD+AP8AAAAAAQAAAQEA//8AAP////8A/wAAAAAAAAABAQACAQH/AP8AAf8AAAAA//8B/gEA/wEAAAEAAAD/AAAAAQAAAQAA/wACAAH//wD//gAA//8AAAEBAAH/AQAAAAAA/wABAAAB/wD//wH//wEBAAEBAQAAAAD/AAEAAAAA/wEB/gAA/wAAAAAA//8AAAAAAQAAAAEAAAEAAAAA/wAB/wD/AAAA/wH/AAD/Af8B//////8CAAEBAQAAAP//AP8AAAEC/wAA/wAAAAABAf8A/wH/AAD///7/AAICAAAC/v8A/wD/AAD/AQD//wAA/wEA////AAEAAQAAAQAAAAEA/wEAAP8AAgD/Af8BAf///wEBAAEAAAAAAQEAAQAAAAAA//8B/wAB/wEAAAAA/wAAAAAAAAABAAD+AP//AAD//gAB/wEA/wAAAQAAAf8BAP8B///+AP8BAAD/AAEAAAH/AAAAAAABAQAAAAABAQEAAAAA/wAAAAH/AAAAAAABAAAA/wD/AQAAAQAA//4A//8B/wD/AP8AAP//AP8BAQIAAP8BAP8BAAAB/wEBAQAAAAD/AAAAAP8BAP8AAAEB////AAACAP8CAQEAAP8A//7/////AQIAAAAA/wAAAQD/AQEB/wAAAAEAAAH/AAD/AAH/AQEAAAD//wABAQD/AP8A/wAAAQD///8A//8A/wAA//4A/gD/AAAA/wAAAQAAAf8BAQAA/wH/AAD+/wEAAAEAAAAA/wIBAP8AAf8A/wD/Af//AP//AP8AAf8AAQEA/wD//wABAP//AQABAP8BAAEBAAEA/wAAAQEAAAAAAAH//wABAAAA/wD///8BAAAAAAAAAAD//wAAAAECAQAAAAAAAQEAAAH/AAAAAQEAAAD+AQAAAAAAAP8A/////wD/AAAA//8A//8A/wAA/wD/AAAAAAAAAQEAAAEBAAAAAQAAAAAAAQABAP////4AAAEAAQEA/wAA/wEAAAEBAgABAQABAAABAQH//wEAAAD/AP4AAP8A/wH//wAAAAAAAAEB/wABAf//AAEA/v8AAQAAAAAAAAABAP//AAD/AAAA/wAAAAD/AAD/AQABAAAA//8AAAAAAf8AAAEBAAAA/wEAAAEAAP8AAQEADxEPgIB9DQ0NAAABAAAAAAABAAAB2bbn7uT3/v0B+/8A/P4B+/8B+///+////P4A/P4C+v4A+/8A+wAA+/0A+/4A/v4B+/7//f7+/QD//P8A/v///f0A/QAB/f4A/f///f8A/v8A/QD//gD//v///////v///v4A/////P4A/v///f8A/f4B/f4A/v4A/P4A/f8A8fj+sKHr58TzAQD8AQD+ADMTAEMRAAEBAP//AAD+AP8AAAAAAP8AAAABAAACAAAB/wEAAAAAAAAAAAABAAEBAAAAAAD//wACAAAAAf8AAAAAAf//AP//AAAA//8BAP8A/wAC//4C/wAA/v//AAEBAQABAQD//wAAAAABAAEAAAD/AAH/AAAB////AAAAAAH/AP8AAP8BAAD/AQECAObwAMna//7/AAABAAABAAACBwYIgYGAEBISAP8AAAAAAQEAAAAB/wAA/wAAAAEBAQD/AP8A////AQH/AAAAAQD///8AAQEAAgAAAAD/AP8BAAD/AAAAAQAAAP/+AP//AAABAAEAAAEAAAH/AP8AAAEAAP8AAAAB/wAAAAAA/wABAQEBAQD/AAAAAP8AAAABAAAAAAEAAAAAAP4AAAEAAgEBAgEAAAH/AAAAAQABAAD//wD/AAAA/wAAAP//AAAA/wD+AAAAAQD/AAEAAQEBAAEAAP8AAAABAAAA/wD/AP8AAAEAAP7/AQAAAAAAAP//AAAAAQD//wD/AP8A/wAAAQD/AAEBAv//AAAB//8AAQAA/gD/AAEA//8AAAABAAAB/v8BAAAAAP8AAAH//gD/AAABAQAAAP7///8A/wD/AQABAAAAAAH/AAD/AQAA/wAAAQD/AAABAQH/Af8A/wAAAQH/AAAAAAABAAAAAAAAAAH/AAAAAAAA//8B/v8AAf8AAf8AAf8BAAD//wEAAAEBAQAAAAAAAAEBAQEB/gAA//8AAAAB//8AAQEA/wEA/wL/AAD/AP///wD/AP///wH//wL//wEA/gD/AQEAAgIBAAD//wD/AAD/Af8BAAAAAAAAAAAB/gEAAQABAQEAAAAA/v8AAAABAAAA/wAAAP/+/wEA/wAB//8A/wD/AAD/Af8AAAH/AAEAAAAA/wABAAAAAgAAAAEA/wABAf8A//8AAQEAAgAAAAAAAQABAQECAP/+/wD//wEBAAAA//4A/wABAP8AAAECAQAA/v8B/gIB/wAAAQAAAAAAAP//AAH+/wEAAAD/AAAAAP//AAH+/wD/AAAAAP8B/wAA/wABAAD//wD/AQH/Af8BAAABAv8AAAEAAQD/AAEAAQABAAD/AAAA/wAAAAAAAQAAAQEBAQEBAAD/AQABAP8AAAAB/wEBAAEAAQAB/wD/Af/+AP//Af7/////AP8AAQD/AP//AAAAAAH/AAD/AP////4A/////wIAAQEAAAABAQIBAQEAAAAAAf8AAAAAAQEBAAD/AAABAAAA/wAAAAD//gAAAAEAAQAAAAAA/wABAgAAAAAAAf8A//8B/wD/AAECAAEBAAAAAQAA/wEAAQEAAAD/AAAAAAEA/wD//wEAAAAAAQD/AAEAAAD/AAIBAf8AAQAA/wD/AAAAAQD/AAEAAQEAAQEAAQIAAAAAAAEAAQAAAAAC/wAA/wAAAQEAAQAAAf8AAQAAAP///wIAAAABAQAAAQD/Af//Af8AAAACAP8AAAABAQEB/gABAf8AAAAA/gD/AAH/AAABAP8AAAEBAQEBAQD//v8AAAAAAAEA/wEAAP8B/wAAAQABAP///gD//wABAQD/AAEAAAAAAQD//gD/AP8BAAD/AAABAAEAAQAAAAAAAAAA/wABAQD/AAEAAQAAAQD/AP8A/wD/AP8A/wD/AAEAAP8B/wAAAgEBAAD/AAD/AAD/AP///wD///8A/gAAAAAAAP4AAQD/AAABAAACAAAAAAD/AAD//wABAAEAAQAA//8AAP//AAIA//8AAAAAAQAA/wABAAABAP8AAAAAAQD/AQAAAf8A////AAABAAAAAP8BAAEAAP///gAAAP8AAAABAP8AAAH/AElIRnNzcgEAAQAAAAAA/wAAAfrz+9Ou5v8B//0AAPoAAfwAAPr+Afr/APsAAPv+//0AAfz/Afz+AfsAAfv+//v+//3/AfwAAvv/Af7/Af0AAvwAAfz+AP7/Af4AAf0AAf3/AP3/Af7/AP3/Avz/Afz/Af7/Af7/Af8AAv4BAf3/Af7/AP4A//z//vz///n+Aby17uS97wD7+wEAAAEVCABMFAAF/wD/AAAAAAD/AQAA/wABAQABAAAAAAAA/wAAAAD/AAAAAAD/AAD//wABAAAAAQAAAAAA/wEB//8A/wAAAf8BAQAB/wD/AAAB/wABAAEA/gEAAAEBAAABAP/+AP////8AAAD/AAAAAAD/AAAAAQD/AQAA/gAAAAD//wAA/wAAAAD/AAABAf/t8gC80wD0+AAAAQAAAAAA/wEAAWBiYU1OSwIBAAABAP8B/wAAAAAB/gEBAQEBAQABAP//AAH/AAAAAP//AAABAP8AAAEBAf8AAP//AAAAAAD//wD/AAD/AAAAAAAAAgEAAP7//wAAAP8AAQAAAP8BAAD/AP8BAP8A/wABAQAAAAEBAQD/AQABAgAA/wEAAAAAAAABAAAAAAAB/wECAAABAP4A//8AAQEBAAAAAAD/AAAAAgIAAAAAAQAAAAEAAQAAAAABAQD/AAAAAQAAAP/+Af/+/wABAAAA/wABAAABAAACAAAAAAACAP//AAEBAP8AAQAA/wAAAQAAAQAA/wEA//8BAAAA/wAAAAAB/wIBAP8AAAEBAQAAAQH/AAAA/wD/AAEAAAD/AP8BAP//AQAAAQAB/wD/AAEBAAD//wEAAQAAAAAAAP//AP8AAP///wEBAAAAAf8B/wAAAP4BAAAAAAEB/wD+Af8A//8AAAEAAf//AQABAQEAAAEA/wMAAAEBAQAA//8B/wEAAQEAAf/+AP8AAQAAAAD//wAA/wEBAAABAQD//wABAP8AAQD/AQD/AQD/AQABAQEBAQABAQD/AQD/AgAA/wIAAAD/AP///wABAgEBAAAAAf8A/wEAAQAAAf8B/wD+AQD//wEAAP8BAQAAAAAB/wAA/wH/AP8CAf8AAAEB/wEB/wH/Af8AAAAAAAAAAQD+AAABAQEB/gD/AP//AP7//wL//wEBAAEBAP//AAIBAAH/AP8BAf///wAAAQD/AQAA/wABAAABAQIB/wAAAP///////wEB/wD/AAEAAAAAAAAAAAACAAAAAQEAAAIAAAAAAQAAAQAAAgAAAQEAAAH//wIAAAH/AP8AAf8AAAD/AP8A/wD///8A/wD///8AAQD/AP8A/wAAAAAAAAEA//8AAAL/AAH/AAAA/wEAAAABAP//AAAA/wEA//8AAP8A/wEAAAAAAAAAAAABAQEA/wEB//8BAAABAP//AAD/AgABAAAAAQECAAEAAAH/AQH/AAAA/gD/AP//AP8AAP8BAQAAAAD/AAD/Af8AAAABAAH/AQAB/wEAAAAAAAAAAAAA/wAA/wD/AQD/Af8AAAAAAQAAAgH//wAAAAEAAAH+/////wD/////AP8A/wD/AQEBAQIAAAABAAABAAEAAQEBAQH///8AAAEAAQEBAgEBAAABAQAAAAEBAAD/Af8A/wEAAAEA//8BAQD//QD/AAABAP8AAAD///8BAP8AAAAB////AP//AP8AAAD/AQABAQABAQAAAAABAAAB/////wD///8BAQD/AAH/AQD+/wAAAAAB/wAA/wD//wAAAQEB//8BAAABAAAAAP8B/wH/////AAABAAD/AQD//v4AAQAA/wEAAP8AAQEAAAEA/wEAAP//AAAAAAAAAAD/////AQEAAP8AAQEAAQD/////AAEAAAEBAf8BAAD/Af7/AQH//wAAAAD9/wEAAAAAAAABAAACAAAAAAAAAAEBAP8AAQACAAABAP8A/wAAAP8AAAAA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AAABAAIBAAEAAP4AAP//AP8AAP//AAABAP8AAAH/AP8AAQACAP8AAAAAAf//AQH/AP8AAAD/AP8BAAAA//8BAP//AQAA////AAAB/wABAP8BAAAAAAAAAAAAAAAAAP4AAAD/AAAAAAAAAAEBAP/+AQH/AP8AANflAN3pAAD/AAAAAAD+AAAADAsNgYWBGhgaAAAA////AAABAQD/Af8B////AQAAAQD/AgEBAAD/AP8A/wD//wH/AP8A/wD+AQD/AAAAAAABAAEAAAAAAP//AAAA/wABAAAAAAAAAAAAAAAAAP8BAQEAAAEAAf8A//8AAQEBAAD/AP8AAAAAAAD/AAEA/wD//wAA//7/AP8A/gAAAAAA//4AAP8B/wAAAAEAAAD/AAABAQAB/wAB//8AAAIAAQEAAAH/AAD+AAH/AP//AAIAAAEAAP8BAP8B/wABAAEAAP4A/wEAAP8BAAEAAP///wEBAQAAAQEBAAAB//8BAP8AAQD//wAB/wAAAAEAAP8B/wD/AP///wAAAP//AAABAAAB/wAAAQABAgABAAAA/wH/AP0A////AQAAAAD+/wD/AAD+AQD/AQABAAD/AgEBAAEAAQEBAAAAAAD/AP//AAEB/wABAAAA/wD//wEAAAD/AgAAAAD/AP8AAAH/AQEAAQD/AAAB/wAAAAEAAP8AAQEAAQECAP8AAAEBAAAAAAEBAAAB//8AAAAA/wEBAP4A/wAA/wEA/gD/AAH/AP//AAD/AQAA/wEA/v8AAAD/AQAAAAEBAAAA//8AAAAAAP//AP7/Af8BAP8A/wAAAwAAAQAAAAAA/wABAAEBAAACAgAAAgIA/wAAAQD//wAAAP//AAD/Af8AAAAAAAD/AP8AAAAA/gEAAAABAAEAAAAA/wEAAAAB/wAC/wD/AgABAP//AQEAAAAAAP8BAAAAAf8A//8AAQABAP8A/wABAQEAAf8AAf8AAAAAAP8B/wD//wABAAABAQAA////AAAB/wEB/wD//wH//wD/AAAAAAEAAAH/AQEAAQAAAAAA//8AAAAAAAEA/wAAAAEAAQIAAAAAAAIBAv8A/wABAP8AAf//AP8CAAEBAAAAAAD/AAAAAAEAAP8BAAAAAAAB/v8A/wEBAAEAAQEAAQEAAP8B/////wAAAAAAAQL/AAAA/wEAAAEA/wAA/wAAAQIAAQD/AAEAAAD/AAABAAAAAP//AAEBAP//AAD/AAAB/wD//wH/AQAAAP8BAAAA/v//AAH///8A//8AAAAA//8AAAEAAAEBAQEAAAABAQEAAP4AAf8AAAEA//4AAAEAAAABAAABAAAAAf8A/wEAAAAAAAAA//8B/wAAAAD///8AAAAAAAAAAAEAAP8AAP//AAAA/wAAAAABAf8AAAD/AQAAAAEAAgIAAP4AAP7//wABAAAAAAAA/wEB//8BAP8CAAEAAP8BAAL/AQABAQABAAD/AQEBAQABAP8A/wAB/gEAAf8AAAH/AAAA/wEBAP//AAAAAv8A//////8AAAEAAQAAAQAAAP8B/wABAAIAAAD//v8AAf//AAD+/v8B/wEA/wD/AAIBAv8A//8BAP//AAD/AAAAAAEA/wAAAP8AAAABAP///wD/Af4BAAACAAD//wAAAAAA/wECAQAAAQD///8BAAABAf8AAf/+AP8AAP8AAAABAQEBAAAB/wEA//8A/wD/AAABAAD+//8AAP8BAP8BAP8AAP//AQD/AAAA/wEAAAAAAP4BAQABAf///wH/AQABAAAAAP4AAQABAAAAAAH/AAABAAAA/wH/AP8B/wD/AP8A/wH//wEA/wAA/2BhX0NDRQAAAQAAAAAAAQAAAO3a8Nu45/3/Afz+AP0AAPr+APr///oAAPr/APr+AfwBAfoA//r///r+Afv/APv+//sAAPz/Afr/APz+APwAAvz/Afz+AP3/AP3/AP3+/v0AAf3///3+Avz+Af3/Afz+Afz+AP3/APz/AfwBAfz+Afv+AcSs7PPh9wAB/wIAAAA8FQAxEAAB/wABAAAAAAD//gAAAQD//wAB/wAAAQAAAAD+AQABAQABAgAAAAD/AQABAQAAAAD/AQAAAf//AAAB/wAA//8B///+AAAAAAD/AQAA/wH/AQAAAAAAAAAAAAAAAAAA/gAA/wAB/wEAAAAAAQEBAAD/AAABAAD/AAD//wAAAAD//wD/Af8AAQDg7QDF2QD+/wAAAAAA/wAAAAEBAltcWkNDRAABAQEBAQAAAgAA/wD/AAAB/wEBAf//AAD/Af///wAAAAABAAEBAAD/AAEBAP8AAf4AAAD/AQEBAAH//wABAAECAP//AAAA/wAB/wABAQAAAAEA/wEAAAAAAQAAAAABAAD/AAAAAAEAAAAAAP//AAAAAQAAAQEA/wABAQEB/wABAAH/AQABAQABAQABAAAAAQAA/wAAAAIA/wABAAEAAAAA/wH/AQH/AAD/Af8BAgAA/wEAAAD/AP8A/wAA/wAB/wEBAAD/AAABAAD+AAAB/wAAAAEAAP//AAAA////AQEAAAD/AAACAQABAgEBAAEAAAEB/wAA/gAAAf8BAAEAAAH/AQAA/wEB/wAAAQEAAP8AAQAAAAEAAQAC//8AAAD/AAAAAQAAAAAAAf8AAAAA//8AAP//AAAAAP///wAAAAD/AQABAAD//wEAAAAAAP8AAAEAAQEAAf8BAP8AAAABAAH/Af//AQAAAAAAAAEBAQAAAAABAAEAAP8A/wAAAP///wABAQD//wEA/wEBAAAAAAH//wAAAQAA/////wD/AQEAAf8AAP8AAAAAAAD/AAEAAP8AAf8A/wD//wAAAQABAAAAAAAAAAEBAP8A/wEBAAH/AAAAAAAAAAEAAAEAAAAA/gAA//4A/wD+AAEAAP8AAAABAAH/AAEBAQEAAQAAAQAAAQH/AP8A/wEAAAAA/wAAAQAAAAAAAP8B/wD//wAAAAL/AP8AAP8AAf////8A//8AAf8BAAEBAf4A/wEBAAEBAAD/AAABAAAB/wAAAAEA/wIAAQL/AP//AAAAAAH+AQAAAQEB/wD/AAAAAQIAAAABAQH/AAH/AP7+AQAAAQD/AAEA/wAB/wAAAf8AAAAAAAD/AAD//gD/AAAAAAEA/gABAQAAAQH//////v4AAAAAAAAAAP8AAP8A/wAAAAD//wEAAAD//wD/AP//AP4AAf8AAAABAf//AP8AAAD/Af8A/wD/AAEAAQEAAQAAAP8A////AAD//wAAAP8BAAAAAAABAQEAAAAAAf8AAAD//wEBAAL//wD/AP8AAQAAAQEBAAAAAAABAAABAQIAAAEBAgEAAAD/AAD///////8AAAAA/wAAAAAAAQACAAAAAP8A/wEAAAAB//8AAAD//wD/AAEAAAEBAAH/AAD+AQACAAEBAAD/AAAA//8A/wEBAP8AAQH/AAH/AAAAAP8BAQAB/wEA/wD+AAACAAABAAAAAAD/Af8AAAH//wECAQEB/gD+//8AAAD+////AAAAAAD/AAAA/wAAAAAA/wAAAAIAAAABAAD+Af8AAAH/AAAAAQD/AP8BAAIAAQABAAD/AP//AP7/AP8BAAAA/wD/AAH/AgEBAAEAAAEBAQECAAL/AAH/Af7+AP8BAf8BAAEAAQD/AAAAAAD/AAAAAAEB/wAA/wABAAEAAQAA//////////8AAP8AAAEA/wAAAP8AAAD//wEBAP8AAP4CAAABAAAAAAD//wAA/wAA/wH//wEA/wAAAAAAAAH/AAEA/wAB/gAB/wABAgACAv//AAH//wL/AAEBAAABAAD///8CAQD/AP8A/wAAAQACAAAAAAAAAAD/AAABAP8AAAD/AAD//wH/AQAAAAEAAAEAAAH//wAPDw90dHMKCQsAAAAAAAEAAAIAAAHZsubr3Pb7AAD6/gD6AP/6/wH6/v/5/gD6/f/6/gD8/gH7/gD6/gD8/gD8///8/f/7/v/8/gH8/gL6/QD6/gH6/wL7/QL8/wL8AAP8/gD9/gD8///+AAD8/gH9AQH8/gL8/wD8/gD+/gL9/gLPvvHYvO8AAP0B//4AIwv/SRoAAf4AAQAAAQEAAf8AAQEAAP8AAQEA/wAA//4A//8AAP8AAAAA/wAAAAAAAf8A/wAA/wEAAAAAAQAAAP8AAAEAAAEAAAEAAQAAAAAAAP8BAQH/AP8AAAD/AQH//wAAAAEB/wIA/wAA////AQAAAAD///8A//8A//8AAAIAAQEA//8AAAAAAAAA7vb/vNIA9/oAAAEAAAEAAP8AAAAzMjF1dnQAAAAAAAD/AP4AAQD/AAD/AAEA/wH+AP8AAAAAAQAAAQAAAQH//wD///8AAP8AAAECAAACAAABAf//AP//AQEA/wD//gAAAAAAAAAA/wAA/wABAAH/AAH/AP8BAf8A/wD/AP8AAgABAQD/AQAAAQECAf8AAf4BAP8AAQL/////AAEA//8AAgAA/v8A//8A////AP8A/gEAAAAAAQAA/wEAAf8A/wD+AP/+AAABAQAB//8AAAH//wAAAQABAAAAAP//AAD///4AAAAAAAAAAP8BAQAAAAAAAQABAP8AAAEAAf7/AP8BAgAB//8A/////wEAAAAA/wEBAAEAAP8A/wAA/wD/AQD//wD+/wACAP//Af8AAP8BAAEBAAAAAQAB/wAAAQAAAAEB/wEAAAAAAQD+AAABAQEAAQAA/wAAAAEAAQAAAAH/AAEAAAIAAAAAAAABAAH/AP8AAP///wEB/wABAAAA/wAAAQAB/wD/AAAA//8B/wAA//7/AAAB/wD/AAAB/wD///7/AAAAAQAAAAAA/wAAAAAAAf8AAQEBAAABAgAA//8B/wAAAP8A/wABAgAAAAABAAAAAAEBAAH/AP8A/wAAAQD/AAAAAAEBAAD/AQD/AAD+AQD////+//8AAAD/AAICAQAB/wH/AgAAAQABAAAAAAAAAQD//wD+AP8AAP8BAAAAAQAA/wH/AAAA/wH//wD/AAEBAAAAAAAAAP8AAQACAP8BAQIAAQACAAEBAAAAAP8AAAD/AP8A/wD/AAAA/wAAAf8AAQAAAAH/AAEAAAAA/wAAAP8BAQAAAAEAAQD/AP8A/wD/AAD/AP//Af8B/wABAQD/AAEBAf8AAP4AAAD//wD/AAD///8BAAD//wD/AAAA/wH//wD/AAAA/wL/AP7///8AAQABAAECAAAAAAIAAAAAAAABAAAAAAAAAQAAAAABAAH/AQD/AP8BAAABAQAAAAACAQABAAAA/wABAAIBAAD///8AAQABAf8CAAEBAAAAAAAA/wAC/wAA//8A/wAA//8AAAAAAAEAAQH/AAD/AAEBAAEBAP8AAf8A/wH//wAAAAD/AP//AAAAAP////8AAAD/AQEBAQABAAD/AQEAAAEAAP//AP///wABAAAAAP8AAAABAAABAAEBAAAAAQAB/wAAAQAAAf//AP8AAP//AQD/AAEBAQL/AAABAP//AP/+AQAAAQACAP//AAD//wEAAAAAAAD/AAAAAP4AAP8BAf8AAQEA/v//AAAAAgIBAAEAAQIBAQAAAAAAAQD//wAA////AQIBAQAA////AAD/AQABAAAAAP8BAQABAQEAAAEAAAAB/wD/AAD/AQABAQEBAP8AAAEAAAD///8AAAAAAAAA/wAB/wD/AAEAAP8BAgAA/wABAAAAAf8BAgD/AAAAAQAAAAD+AAEAAAEA/wD/Af8AAQACAAD/AAEBAAABAAD/AAEAAP8AAP8BAf/9AAAA/wAC/wEAAAAA/wD/AAEA/wAAAAABAAEAAAIBAQAB/wD/AQH/AAEAAAH/AAEA/wAA/gAAAAD/AQIAAAD//wAAAAD+AQAA/wEAAAEB/wAAAAAB//////8AAAH/AAAA/wABAAAAAAAAAgAAAf//AP8AAAAAAP8AAAEB//8ASEhFaWtpAAAAAQD/AAD/AAAC+/D60qHg+PL++///+v4A+v//+AAB+f8A+v8A+/4A+v//+v4A+///+v7++v4B+v8B+/0A+v7/+v///P7//P///f4A/f8A/f4B/P0A/f4B+/8C/f4C/P4B/P8A/P0B+wAA/P0B/P8C/f8A5+D8yabp/ff6AP//ARQI/1YbAA0AAAAAAAABAAD/AAAAAP//AQABAP//AAD+AP8AAAAAAAAAAP4BAAD/AAEAAP8BAAD/AAEAAP8AAP8AAAAAAf//AP8AAf//AAAAAP8AAP8A///+AAAAAAEAAP4BAAABAAAA/gD/AAEAAAAAAP8BAAAAAAABAQEAAAABAAL/AAABAAABAP8BAPP4ALjRAPD3AAACAAD/AAAAAAAAGhobk5SSIiIjAAD/AAAAAQACAf//AAAAAQH/AAH/Af7/AAD//wD/AQAA////AQAAAQACAAAC/wD//wEB/wAB/wEBAQABAf8AAAABAAEA/wEAAAAAAAABAQAAAAAAAQEAAAAB//8AAQABAAACAP8A//8AAQABAP//AP8AAf8CAAEAAP8AAQAAAAD/AAICAP//AAH/AAIAAAAAAf//AQH/AAEA//8AAAH/AQAB/wH/AQAAAAAAAAAA/wEAAQD//wEAAf8A/wAB/wABAQABAQAAAQAAAP8AAAEB//8AAP8AAP8BAAAB/wD/AAAB/wABAAAB/gABAP8AAQAAAAAA/wAA/wAAAQD/AQIAAAEAAQD/AQEAAQD//wH/AAAAAAD/AAD/AAEAAP8AAAEAAP8AAAD/AAIAAAAAAP8AAQEAAP8AAP8AAAEAAAEAAP8AAAAAAQAA/wD/AP8AAAAAAAAAAAD/AQABAAD/AAEAAAABAAEAAf4B/wEAAv8AAAAB/wAAAAAAAP8AAAAAAAAAAAIAAQABAQEAAP8A/wAA/wD//wAAAAAAAf4BAAAA//8A/wEB/wEAAP8AAQIAAP4AAQH//wD///8A/gAAAQAB/wAA//8AAQABAP//AAEBAAAAAQEAAQAAAQABAQEA/wEA/wD+//8A/wEAAf8A//8BAAABAQABAAEAAf8AAAAAAAAB/wAB/v8AAQEAAf8A/wH/AAEAAf///wAAAf8AAAABAP8AAgEBAAD/AP4AAAEAAAAAAAABAP8AAQD/AQEAAAAAAAAAAP8B//8AAP8AAAD//wAA/wEAAAEA/wD//////wH/AQD/AP8AAQEBAf4A//8BAP///gAAAAAAAf8A//4A/wD/AQEAAf8BAQAA/wAAAf8AAQABAAEAAgEAAAEBAAH+AP8BAgEBAAD/AAH/AAEAAP8AAAAAAv8AAAAAAf8AAAABAAAAAAAAAgAAAQEB//8A/wAA/wEA/v8AAAAAAAEAAAD/AAD/AAEAAP////8A/wAAAAEA/wEBAAAA/wEAAAEAAQAAAAAAAAEAAAAAAQAAAP8AAQAA/wAAAQD/AP8B////AAEAAAAAAQEBAAAAAAH/AQIBAQAAAv8AAAAA/wABAQAAAAAAAAD/AP8AAAEB/wD//wD//wABAAAA/wAA/wABAP8AAP////8A/wAAAgABAAABAf8AAQABAP//AQAAAP8AAQABAf8AAAAA//8BAQAAAQAAAAEAAf8BAQAAAf8A/wABAP8CAAD/AAEAAv8B/wAAAQEAAf/+AAD/AAD//wABAAAAAAEBAQAAAP8A/wEAAgAAAQD/AP8A/wABAP8A/gAAAP///gAAAAEBAQAAAP8A/wD/AQAA//8AAAAAAAEBAQAA/wEA/gAA/wAAAP//AAEAAf/+//8A/wD//wAA//8AAQAA//8AAAABAQAB/wAAAAAAAf8AAP8A/wEAAQAAAQABAAABAAD/AAAAAAACAP8CAQAAAQEAAAAAAf8A/wEAAQEAAAAAAP8A/wABAf8AAQAAAAH/AAEAAP8AAAAAAQAB/wH/AAH/AAEBAQD+/wH/AAABAAAAAQEAAAD/AP8A/wD/AAD//wAAAAEAAQH/AAH/AAEA/wD/AAABAP8B/wAAAQABAP8A//8B/wD/AAAA//8AAHZ1czQzNP8AAAAAAQAA/gAAAe7S8NCk4vr9APkAAPn+APr+//r/APn///n+//n+APr///n///n+Avr///v/Afv/APv/APz+APz+Af3+Avv+Afv/APr9//v/APz/Af0AAfr/Afz+Avz+A/0AAf3+Avz/Av79AfT0AMSk5/Xn9wD/AAIDAf9SGf8gCQAAAAACAAAA/wAAAQAAAQD/AQD+AAAAAAAAAQAB/wD//gD//wAB/gAAAAD/AQD/AAD/AQD+/wABAAD/AAEAAAAAAQEAAQD/AAAAAQABAAABAAAAAAAAAAD/AAAB/wAAAAH/AAAAAAAAAAAAAAAB/wD/AAAAAP8B/wABAAEAAQAAAAD+AgDz+AC20ADk7wAAAAAA/wAAAAAA/wAAAYiHhjg4OAEA/gEBAAAA//////8AAAAAAP8AAf8AAAEBAv8AAQH/AP//AQAAAf8AAf4AAP///wEAAQAA//8AAAAA////AP8A/wABAAABAAAAAQAAAQAA//8A/wAA/wD//wEAAAAAAP4A/gAA/wABAAEBAP/+/wAAAP8AAP8A/wD/AQABAAAAAQAAAQD/AAAAAAAAAAAAAQABAAEBAf8AAAH/AP8AAAD/AAD//wEAAQAAAQEAAf8A/wIAAAAAAQIBAP8AAAEAAAEAAAAA/wAAAAAA/wABAAABAQAAAAAAAAAA//8AAAEAAQEAAAEAAAD/AAAA/wEBAAEA/wAAAAAAAAAAAP//AQH/AP8A//7/AAAAAAD/AQD/AQD/Af//AAAA//7/AAEA/wEAAAECAAAAAAD/AQEAAQAAAAD/AP8AAQAAAAD/AP///wD/AAAA/gAAAAD/AQAAAAAAAP8A/wAAAP0A/wD/AAD/AQEA//8AAAAB//8AAv8BAAD//wEAAAEBAf8AAAABAAAAAAD//wAAAAAAAAAAAQEBAAABAQIAAAH///8C/wH/AAEAAAH/AAEA/wEBAf//AAAAAAD/AQAAAQEA/wAAAAAB/wIAAAABAP8A/wAAAQAAAAH/AP///wD//wABAAAAAQEA/wEBAP4A/wEAAP//AAAA/wAA/wAA/wD//wAAAAEAAAAA/v8A/wIBAP8BAQACAAAA/wH/AAABAQAAAf8BAP8AAAEAAAIA/wAAAQEB/wAAAAAAAAH//gAB/wAAAQAA//8AAP8A////AAD/AAABAAH/AAEBAP//AP4AAAAAAAAAAAH/AQD/Af8AAAD//wACAQACAf8AAAD+AQD+//8AAAACAQAAAQH/AAEAAAAAAQIAAAABAP8A/wAAAP///wD//wEBAgEBAP7//wAAAQD/Af/+AAAB////AP8AAQAAAP4AAQAAAAAAAQABAP7/AAD/AQEBAAEAAAAAAAH/AP8AAQAAAAEBAQABAgIAAAEA/gAAAAAAAf//AAH/AAAAAAAAAAAAAf8B/wABAAD//wH/AAAAAAAB//8BAP8A//4AAf////8BAQAAAAEAAAAAAAAA/wABAf/+AP8BAP4BAAD/AAEA/gEAAAABAAD/AQEBAQH//gH/AQD/AAEA/wAAAAEAAAEA/wAAAQABAQH/AAEAAAAAAP//AP8BAAEA/wABAAD/AAABAAAAAAAAAAH/Af8AAAAAAAABAAD/AP8A/gH/Af8BAQEA/wAA/wAAAAD/AP4BAAD/AP//AP8BAQABAP8A/wD//wABAAD///8A//8BAQD/AQD/AAAAAQABAAAB/wABAAAA/wABAAEBAAAA/wAAAAEBAQEAAP8AAQEA////AAAA//4A/wD/AAAAAP8A/wABAQD/AP8AAQIA/wEAAQAAAAAAAQAAAQL//wAAAAAAAAEA/wABAP//AP8CAAEAAAABAAAA/wD//gD//wD/AQAA/wAC/wL/AAAAAAAAAf8BAAEA/wAB/wABAAABAAAAAAAA//8AAP//AAD/AAACAAAAAP8AAAIAAP8AAAD+Af8AAQD/AAD//wD//wAAAAH/AAAB/wABAQD/AAEAAAEBAf//AAAAAf///wABAQEB/wAA/wH/AAAAAAABAQABAAEAAQAAAQEA/wAVFRSIiIgNCw0AAP8AAAAAAAAAAADouubUqOb8/AL6/wD6/gD4/QD4/wD4///5///6///6/v/5AP75/wD4/v75/wD6/wD6///7///7///7///7/QD7/wH8/gD6AAL7/gD7/gL7/wH6/wD6/gD8/wH7/gD6/QLHs+3iyu0AAP0AAP8ANBH/MQ4AAf4AAQAA/wAAAQAAAf8AAP8AAf7/Af8AAP8AAAAA/wAAAQEAAAEAAAAA/wABAAAAAAEAAAABAQEA/wABAQD/AAEAAAD/AP8AAAEA/wAA/wAAAAABAAIB/wH//wAB/wAAAP//AAABAAAAAAAB/wEA/wEAAQAAAP8AAAEAAP////8B/gAB5/EAtdEA4/AAAAAAAP8AAAAAAP8AAP9ZV1hXVlcA//8A/wEAAAD//gEBAAEAAAEAAAEA//8AAAAAAQACAAH/AAABAP8AAP4BAQACAAABAQEA//8B/wECAQAAAAAAAAAAAAAA//8BAAAC//8AAP8AAAABAAAAAAAAAAD/AP8A/wABAAEA/wAB/wD/AAAAAQEBAQAA/wAAAQD/AP8BAAAAAAAAAQAAAAAAAQEA/wEB/v8AAAEAAQEBAQH/AAABAAAAAAH/AQD/AAAAAf//Af8AAAH//gD/AAAAAAAA/wAAAAAAAf8AAAAAAQEAAAEB//8B//8AAAD/AAEA/wECAQEAAAAAAAEAAQAAAAAAAAH//wD//wAAAf8AAP8AAQAAAQH/AAABAAEAAQAB//8AAQABAAAA//4BAQEAAAEBAQD+AAEAAAD//gAAAAAA////AP8A/wD/AAAAAP//AQH/AP8AAAEAAf8AAAIAAAABAf8AAf//AAAA/wAAAAABAAAAAQAAAQD/AAAAAAEAAP8BAP7/AAEAAQEA/wAAAAABAAAB/wAAAP8AAQABAAD//gAAAf8A/gABAAD+AAD/AQEB/wD/AQD/AAABAQAAAQEAAAAA/wAAAP8AAAAB/wAAAAEA/wAA/gH/AP8B//8BAAH/AQEA/wD+AAABAAD//wAAAAAAAAD//wEB/wECAQABAAEBAf8BAP8A/wAA/wEAAAL/AAD/AAD/AAABAQD/AAAB//8A/v8BAAEAAQAAAAABAAABAAABAQD/AAACAAEAAP8AAAEAAAAAAQABAQABAAEB//8AAAEAAAAAAAEBAQAAAQAA/wEAAQD/AAAAAAABAAAAAAAAAQH/AQD/AAABAAAA/wD/AP7/AP//AAABAf8AAgAAAAAAAAABAAAAAP//AQAAAf//AAAAAAAA/wABAAAAAAAAAQD///4BAAABAf8AAAAAAAABAAAAAAABAgEA/wAAAAABAf8BAP4AAP7/AP8BAAAAAP4AAP///wAB/wAAAQEC//4A/wD///8A////AAD+AQICAQIA//8BAAD/AAAAAf8A/wD//wD/AAEAAAEAAAEA////AP8AAAEAAAEAAQEAAQEBAQABAQABAAD/AAABAP8BAQH//gAAAQAA//8AAAD/Af8AAAH//wD/////AAAA/wAAAQABAQABAAEB/gAA/wAAAAD/AP//AP8AAP//Av//AQD///8BAAEA/wH//wD//wD/AP///wD/AP8AAAD/Af8BAQH//wD/AAEBAQH/AAH/AP8A/wAAAP8AAAAA//8AAf8AAAACAP8AAQABAQEA/wEBAAEAAQEBAAD/AQABAAABAP8A/wD/AAAA//4BAAEAAAD/AQACAQD/AAD/AAAA/wAA/wD//gAA/wAA/wAAAAABAQEAAAAB/wEAAQEA/wEAAAEAAAAAAP//AQD/AgAA//8AAAEAAP//AAD/AAEAAP8BAP8BAAEA/gAAAgAA/gAA/gAAAAEAAAAAAQIAAQEBAgAA/////gAAAAAAAP8A//8A/wAAAAIA/wAA/gAAAAEB//4AAgEBAAABAQAAAAEA/wD//wABAAAAAAABAAEAA/8AAQAAAAAAAAABAf8A/wAAAP8A//8BAP8AAAAAAAEA//8AAAEA/wAAAQAA////AAAAAAEAAAAAAP7///8A/wD/AQAAAQAA/wEAAAEBQ0Q/U1NSAQABAAABAAABAAAAAP8A5azh16/k/P4C+P4C+AAA9v4B9v8A9/4A+P8A+f4B+v4B+v7++f7++f//+v4A+P4A+f8B+f4A+v8B+v8B+v8A+v8A+/3/+v0B+/4A+/7/+wEB+v4B+v8A/f8C29f517XlAP78AAD+ARMG/kgWAAIAAP8BAAEAAAEAAAD/AP8BAAH/AAEBAAD/AAIBAAH/AAEAAP8AAAD/AQEAAAD///8AAAD/AP//AP8AAQAAAAAAAAAA/wAAAf8B////AAAAAAEAAP8A/wD//wD/AQEA/wAAAQABAAAAAAAAAP8A/wEAAAD/AAD/AAABAAABAAECAPwB/83j/63JAOLuAP8AAAAAAAACAAEBAAABSkpLj5CNBQgGAAABAAEBAP8AAQH/AAD/AAD/AAAAAAEAAf8A/wAA/gD/AAAAAAEBAQABAP8AAAH/AQAA/wEA/wAAAP//AP8AAQEAAP8AAAEBAAAA/wAAAQEBAQAB/wAA//8AAAEAAAAAAAEAAQAAAQAAAAAAAAABAQAA/wABAQEBAAAAAQAB////AAEAAP///wD/AP//AAIBAAEBAP8A//7/////AAAAAAAAAAD+AP8AAQD/AP8AAv8AAQABAAEAAQAA/v8AAAEAAQEBAP8AAAAA//8B//8A/wEBAAEB//8AAQD/AAEA//8AAAAA/wAAAP8BAP//AQAAAAEAAAD/AP8BAAAB//8AAAD//wAB/wAAAQABAAEBAAAB/wAAAAIBAQAAAAAAAP8AAgAA/wD/AQEAAAAAAAEAAQAA/wIAAQAAAQEAAv//AQABAAD/AAAB////AAAAAQAAAAACAQD/AQIAAQABAP8AAQAA/wAAAP8AAAD/AAAA/wABAQH//wH/AAEAAQAAAAAA/wH/AAEAAP8C/wAAAQEAAP//AAEBAAAA/wD/AQAAAAAAAAAAAf8B/gAAAP8BAAEAAAEAAAAA/wAA/wAAAP8AAQEAAAEA/v8BAAAB/wAAAAD+/wEAAgAA/wAAAAEBAAAAAAAAAAAAAAAA//8AAAD/AAAA//8BAAH/AAH//wD+AAD/AQAAAQABAP8AAAAAAAD/AAEBAAABAAAA/wD/AAD/AAAA/wAAAAAABAAAAP8AAAD/AAEBAAAA/v8AAQEBAQEA/wABAQEAAP/+AAEBAgAA/wEAAP8BAQH/AAIA//8AAQAA///+AQEBAP8AAAAAAAEBAf//AP8AAAEAAAAAAP4AAAEAAP8BAAD/AAEBAAAAAAABAQH+AAAB/wAA/wAAAP8AAAAAAP8B/wEAAAABAAAAAAEAAf8A//8A/wD/AQEBAAABAAD///8BAAEBAAAAAAAA/wEAAAAAAQEAAP//AAD/AP8AAAEAAAAAAAEB/wH/Af7//gEAAQH///4BAQEAAQAB/wAAAQAA/////wEBAQEAAAAAAf8AAAEAAAD/AQAAAAAAAP8AAQH/AP//AAEB//8CAAD/AgAA/gAAAQABAP8AAQAC/wD/AAEBAv8A/wABAAH/AAAC/gAAAQD//wEAAAD//wABAAECAf//AAEBAQABAQD//wABAAD/AAAAAAEAAQAAAAAB//7/AAEBAAABAQD///8AAQAAAP///wD/AQABAAABAAH///8BAAAAAAABAf8AAQD//wEB/wAAAP7/AAEAAAABAgH///4AAAEAAAAAAP8AAAEAAAD/AAEA/wEAAf4AAAAA/wABAQAA/wD//wEAAAAAAAH/AAAAAQD+/wABAAAA/wD/AQAB/wD/AQEAAAAAAQAB/wABAP8AAAAAAAEA////AAEAAf8AAAEAAAAA/wABAf//AAEB//7/AQAA/wIAAAD//wAAAf///wEA//4BAAAAAQEAAAABAP8A/wEAAP8AAP///wIAAgAB////AAEBAP///wAAAAAAAP///wEAAQH/AAAA/wAAAQH/AAAA//8AAf8A/wAA/wAAAQAA/wEBAAAAAAAAAAAA/wD+AAABAAD/AAEAAAAAAAAAAP4AAAH//gAAAQECAP8AAf8AAAH/AP8BAAEAAAAAAP//AYKEgt7f38PDxP8AAAAAAAAAAAAAAeap4/4EACFNG/7+AAMD/wIAAQT+/wUBAAUBAAP+/gQAAAICAfz+/wIAAAMAAf0CAAH+AAEA/gIBAQIAAAD/AAAAAAAA/wEAAAABAf/9////Af//Afr4/86x6Pzv+QEAAAEA//5CFQAYBgD/AAAA/wD/AAD/AAAAAQAA/gD/AAD//wABAAD+AAAAAAD/AAAAAAAAAf8AAAAAAQAB/wAAAAAAAP8A/wEAAf//AQH/AP//Af//AAAAAgAAAAEA//8AAAAAAAAAAP//AAAAAP///wAAAv8B/wAAAAD/AAEAAP8AAQAA/wABAAD/AQDU5QC+1QD9/gAAAAAAAQAAAAAA/gD/ADo4OZSTkBcYGAAAAAAAAQAA/wABAP8AAQH/AP8A/wEB/wAAAQAB/wD//gABAAAAAv8A/wABAQH/////AQAA/wABAAH//wAAAAAAAf8A/wABAQD///8BAQAA//8A/wEBAQAAAAD//wD/AgEA/wD/AAABAP8AAAAAAQAA//8AAAD/AP//AAD/AAEA/wAA//8AAQAAAgEA/wAAAAD/AAAB/wAAAQAAAQAA/wD/AAAC/wAAAQD/AAAAAP8AAAAAAP8AAAEAAP8AAQEA/wABAf///wABAgH//wAA/wEAAP8AAP///wEBAAAA/wEA//8AAQEAAQAAAAEAAP8BAf8A/gAAAQEBAQEAAP8AAAEAAQAB/wEA/wD/AAD//wAA/wABAAEAAP8AAAAAAAD/AAABAP8BAAD/Af///wABAQAAAf8B/wD+AP8A/wH/Af8BAP8AAQAAAP8AAQEB/wAAAP8AAAAA/wAAAf//AAH/AAECAf//AAEB/wH/AAAAAAABAAH/AQAAAAH/AAAA//4AAAAAAAH/AQEAAAAA//8AAAEAAP8AAQEA//8AAAIAAQD/AAABAAABAAAA/wAAAAAB//8AAAEA/wABAAEAAf8B/v4BAgH//wEBAQIA/wAA/wEAAP8AAAH/AAAAAQEAAQAA////AAEBAAEAAAD/AQEB//4A/gAAAQEB/wAAAP8B/wAAAAD/AQAAAAAB/wD/AQEA/wAAAQD/AAAA//8B/wEBAQD/AAAAAAEAAP8AAAIAAAAB//8BAQD/AP8AAQABAQAA//8AAQIAAAD+/wAAAP//AP7/AAAAAP8BAAAAAAD/AAEAAAAAAQEAAQD/AAECAQABAAAA/wEBAQIB/wL/AQH/AAAC/wABAAAA/wAAAAD/AAAAAAD/AP8AAf//AAH/AQAAAAAA////AAABAP//AP//AQH/AQD///8BAAAAAAEAAAAB/wABAAEAAAEBAQEB/wAA/wAB/wEAAAEAAP8AAAAAAQD/AP8CAAEAAAAAAP4A/wL/AAAAAQH/AAH/AQIB//8AAf8AAAABAAEAAAIAAAH/AAAAAQAAAQABAQAA/wD/AQAAAP8AAP8BAP8AAAAAAQD/AAAB/wABAP8B/wEAAAABAAEAAAD//gAAAAD//wAAAAAA/gD/AP8A/wEA/gAAAAEAAAEAAAABAAD/AP8AAP//AAAA//7/Af8AAP8BAAECAf//AP4BAP//AAABAAAA//8B//7///8A/wABAf4BAP8AAf4BAP8B/wD/AQAAAAAAAAAA//8AAQEAAQAAAAEAAP8BAAAAAAAA////Af8BAAH+AAAAAAABAP8BAAAAAQAAAAD//wAAAP8AAAAA/wAA/wEAAAEAAAEBAAD///8AAP//AQAAAAAA/wD/AQABAQAAAAAAAQD/AP///wABAAEAAAD/Af8AAAEBAAEAAAACAAAA/wAAAAD+/wABAQAB/wIAAP8BAAAAAQAAAAAAAP8BAAD/AAAAAAABAAAAAP8AAAEBAAAAAAAAAAAAAQIAAf////8BAP4AAP8BAAEAAP8AAAAAAQIAAAD/AQAAAQABAQD+AP//AQH//wABAAEAAAAAAv8AAP8A////Af8AAQAAAQEAAQEAAAEAAAD/AAH/AAEAAAEBAAEAAQEAAAD/AAEAAAAAAAD/AP8A//8A/v8B/wABAAEcHRudnpswLy8BAAEAAAEAAAAAAP8A/f/ppeLepOP8+wL4/gH3/gH2AAD0AQD0///3AP/2AP/3///4/gH6/wD4AP76/QD7/v/6/gD4/v75/QD4/wD5//75///5///5/v/5/QH5/gD7AADg2Pju0O0AAP8AAP4BHAsANxAAAv8AAAAAAQAAAAAAAQAAAP8AAAAA/wEAAAAAAAEAAf8AAAEBAAEB/wAAAP4A/gAB/wAA/wAA/wABAAAB/wH///8BAP///wABAf8AAgAAAAAAAAD/AAAAAQAAAAEAAQAAAQAAAQAAAQAA//8BAAAA/wAA/wD//wAAAQAAAQIAAAEA/wAB2OgA/f0AAP8AAAAAAP8AAP8AAAEoJyeVl5QhIiIA//8A/wAAAf8A/////wAA/v8AAP8BAAAA/wAB////AAABAAEC/wH//wABAAAB//8AAAEAAP8BAAAB/wAAAQD/AAABAP8B/gAAAAAAAAEAAP8BAAAA/wAAAP8B/wEAAgEAAP8AAQAAAQD/AAAAAQAAAQAA/wABAAABAQAAAf8AAQD/AQD/AAIBAP8BAP8AAQEAAAD/AP///wEAAP8A//8AAAEAAAD//gEA/wABAAAAAAIBAQEAAAACAAABAQEAAAAAAAEA//8AAP8A////AAEBAQEAAgEAAAAAAAAB/wD//wH/AAIAAAD/AP4AAAD/AAAAAP4BAAIBAAABAQD/AAAAAAAAAAAAAAH/AAD/AP8BAQD/AQEA/wD//wAA/wD+AQD/AQAAAAD//gABAAABAQEBAQAAAP8A/wABAgABAgEBAQABAQEAAP4AAAABAP8AAAAAAQAAAAAAAQD/AP8BAQABAAAA//8CAf8A/gD+Af8AAAH//wH/AP8AAP//AP8AAP8BAf8CAQAAAQAAAAAA/wABAAD/AP8AAAAAAAABAP///wAAAQD/AP//AAEAAAABAAD/AP8B/wD/AQAAAQH/Af8AAAEB//8AAQD//wAAAAAAAAEAAAEAAQEBAP8AAP8AAP8AAQABAQAAAAD/AQAAAv///wEBAQABAAEAAAEAAAAAAAAB/wAAAQAAAAAA/wEAAP8AAAH///8AAQAAAQAB/wH///8BAP8AAAAAAAAAAQECAAAB/wEAAAEBAAABAAACAf8A/wABAP/+AP8BAQEBAAEBAQABAQAA//8BAP8AAAH/AAD/AAAAAAAAAQAAAAD/AP4AAAAAAQD//wAAAAEAAf8AAf8A/wD//wAAAQAAAAD/AQAAAAAAAP7//wEAAf8AAf8A//8AAQEBAf//AP8AAQAAAQD/AP8AAQH/AP//AQEA/wD/AP8A//8AAAEAAAAA/wEAAAAAAAEAAAAAAP8BAAD/Af8AAgAA/wD/AQAAAQED/wD///8AAP8AAP7+AAD//wEAAP4A/////wD/AQD/AAIAAAAB//8AAQEA/wAA/wEAAf8BAAAA/wABAQAB/wAAAAAA/wABAAAA/v//AAEA////AP8AAQEAAgABAQABAQD/AAAAAAEAAAAA/wAB/wEBAP//AAD+AAAAAAABAP8BAAAAAP8A/gABAP4BAAAB//8A//8AAQEB/gAAAQAAAAEBAQIB//8AAAL/AAAAAP8CAAEAAAEBAAEA/wAAAv8BAgACAP8AAQEBAP//AAD//wD/AP8AAAEAAQEAAAD///8C/wEAAgAAAP8A//8AAAD/AQAAAAEA/wH/AP8BAP8AAAAAAf///wAAAAD//gAAAQEA/wEAAQAAAAEB/wAAAAAA/wABAP//AP//AAAAAQAAAAAA/wEAAP8B/wEAAAEAAAH//v8A/wD/AAD/AgH/////AP/+AQACAAEB//8AAAEAAAAA/wAAAAAAAf8AAAAA/wAA/wAA/wAA/wAAAgAAAf///wAAAQAB/wAAAAAAAAD/AAABAAAAAf///wAAAAABAP4A/v//AQAAAf8AAQEAAAH/AQEB//8AAAABAAICAf8AAP8AAv8AAAD/AAAA/wAA////AAAAAQAAAAH+AAAAAAABAAD/AQD/AQD/AQEAAP8AAAEB/wAAAAEAAAABIyQjp6mlNzc3AAAAAAABAAAAAAD///0A6bHi2pTZ9uv7+QAA9gAA9v7/9f7/9QAB9f8B9v4A+f//+P4A+v0B9/7/9/7/+AEB+QAA9/8A+/8A+f4A+v8A+f7/+f//+//+/f//9f3/3cjvAPn7AAD/AQD/AEQYAA4EAP8BAAEAAAD/AAEBAAAAAAEAAAEBAAEAAP8AAAD/AAEAAP///wD+/wH/AAEBAAD//wH/AP4AAQD///8BAAD/AAABAP8AAQL/AP//AP8AAQD/AP/+AP8BAP4AAAD/AAAAAAAAAP8AAP//AQEA//8AAAAAAAEAAAAAAAABAAEAAAEAAAMB/w8KAAAAAAABAAAAAAD/AAAAISAgpqemMC8xAP8BAAABAAD/AAAAAAABAAAAAAEA/wAAAAAAAAEA/wAAAAAA/wAB/wAAAv////8A/wAAAAD/AQEAAAEB/wAA//8BAQEB/wEA/wEBAAD/AAEAAAAB/wEBAAAA/wAB/wD/AQAB/wD///8A/wAAAQEBAf8AAAD/AQEB/wAA//8AAQEBAAAAAQEAAQEAAAAAAAEAAP//AAAAAgEAAAEAAP4BAAEA/wD/AAEBAQH/AAAA/wABAQEAAAD/AAAB//8AAP8AAAD/AAD/AAD/AQABAQABAAH////+///+AAAAAAAB/wAAAQAAAAD/AAD/AAABAQH+AAH/AAABAAD/AAAA//8AAAABAAABAAD/AP8AAQAAAgAB/wABAAD/AAL/AAEAAQAAAf8AAQEAAAAAAgEA/wD//wD///8AAAAAAAAAAP8A//8B/wAA/wAAAQEBAQAAAAAA/wEAAAAAAP8AAP8BAQACAAAA/gEAAAAAAP8A/wH/AQAAAAH/AQEAAP8AAP//AQAAAQACAP8B/wAAAP8AAQAAAAEAAAEBAAACAAAAAAEAAAABAQIAAAAAAP8BAf8AAAAAAAEBAf8B/wEAAf8B////Af7/AQD/AQEBAf8BAQD/AQH+/wAAAP/+Af8A/wAB/wAA/wAB/wAAAP//Af8AAf8BAP8AAgEA//8CAAH/AAAAAAEAAP8BAAAAAAH/AAAA//8AAAAC/wD/AQAAAP8AAAAAAAH/AAAB/wEB/gAAAAEAAQAAAgD//wEAAgD//wEAAAD///8AAQAA/gAAAQAB/wD//wEAAAAA/wEBAAABAAAAAAD/AAEAAQAAAAEAAf8BAAAAAQABAAEAAP8AAQAAAAAA//8A//8BAAEBAQAAAAABAAEBAP//AP//AAAAAQD/AAABAAAAAAEBAAAA/wACAQABAAABAQD/AAABAAAAAQABAQEAAAH/AP8BAAAA/v//////AAD/////////AQAAAAACAf8AAAAC/wAB/wABAAAAAAD//wEAAAABAAABAAACAQH/AAIAAQAB/wEBAAAAAP8AAAD//wEA/gEAAAD//wH//wH/AP8A/wAAAQAA/wD//wAAAAABAAEA//8AAAEAAf8AAAABAAAC////AAABAAD+AAAAAQEAAAEBAAAAAQAA/wAAAAEC/wAAAQABAP8BAQAAAAEBAAECAAIAAAEBAf///wACAP8AAP//AAAAAf8AAQAA/wD//wECAQD/AQAA/wAA/wD/AQH/Af//AQEB//8A//8A/gECAQAA/wD//wEAAAD/AP8BAQD///7//wD/AAEA/wEAAAABAAABAAACAf8AAf8A/wD/AAD/AAEBAAECAAAAAP8BAAEAAP8AAQABAQAAAQD//wAB/////wAAAQEAAQH/AAABAf8AAgH//wAAAP8A/wH/AQAAAAEAAf8A/wAAAQEA/wABAQABAQAAAQEAAf8CAQAB/v//AAEB/wD/AQD/AAH//wH//wAA//8AAAEAAAEA/wAA/wH/Af8A/wAAAAAAAQAAAAL/AAD/AP4AAAAAAAD/AP8AAAEBAAAA//8CAQEAAAAAAP8A/wABAAD//wAA/wH//wD/AP///wAAAP////4A//8AAAAA/wAAAAAAAAAAAP8A/wD/AQAAAQEB/wD/AP8AAAH/AP8AAAABAAAAAAEB/wAAAAD//wD/ACYnJpWWkR8eIAAAAAAAAAAA/wEA/wAAAfPH7N6G1fDK8fj9BPQABvMAAvH+APT+APYAAPX+//f/APn9APr///kAAPr9//r+APsA/vj///r///r///v///v+APv///X/AN/g/OzH6gAA/wAAAQAgD/4xDQAB/wAA/wAAAAD/AQAA/wABAAD/AAAA/wAB/gACAAAAAAD+AAAC/wAAAAAAAAD//wABAAAAAQECAAD/AQD/AAABAAAA/wAA/wD/AQD/AQEAAf8AAAAAAQABAAABAQD/AAD/AAD/AAABAAABAf///wAAAAABAQD/AAABAAAB/wAAAQABAQABAQAqGAAHBgAAAAAA/wAAAQMBAn9+fS8uLv8A/wAAAP8A/wABAf8A//8AAAEBAAAAAP8AAAEAAAAA/wEAAAD/AAAA/wEAAP8BAAEBAAABAAABAf8AAP/+/wEAAAAA/wAAAAEAAQAB/wABAAAA/wD//wD//wAA/wAA/wEBAQAAAAH/AgEAAQAAAf8A//8AAAEAAP8AAAAAAQAAAf//AAAAAP//AP8A//8AAP8AAP8AAAEBAf8AAQH//wEB/gABAAEAAQD//wABAQAAAQAA/////gH/AAAA/wABAP8AAAAAAAAAAAAAAf//AP8A/wH/AAEAAgEAAQABAQEA/wABAAEBAAAAAQAAAP8AAP//AQH/AAEAAAAAAAAAAAABAAAA/wAA//8AAAEA/wD/AAAAAAAA/v8AAgEAAQAAAf8BAAAAAAD+AP//AAAAAAABAgEBAQAA//8AAAAAAQAAAQAA//4AAP///wAAAAAAAAEBAAH//wEAAP8BAAAA/wAB/gD/AAAA/wAAAP8AAAAAAf8AAQD/AAH/AAEBAAD/AAABAP8AAAAAAAH/AAAAAP8A/wD/AAD//gAA/wEAAAEA/wAAAAD/AP8AAQEAAQAA/wABAAD///8A/wH/AQAAAQEAAf8AAQD/AQD//wAA//8AAP7/AQAA/wABAgAA/wAAAAABAAAAAAD/AP8AAv8BAAD///8AAP0A/wEA/wAAAf//AAD/AQAA/wAAAAEAAAD/AAEAAAAA/wAAAP8CAgABAP//AAAAAQEA/wD/AAEA////AAAA/wIBAQAAAP8AAQEAAAEBAAEAAf8BAAEAAAD//QAAAAAAAAAAAAH//wAB/wAAAAABAAH/AAABAAD///8A/gAAAP8A/wAAAAEAAAABAP8AAQEBAP8BAAD//wAAAQD//////v8BAQAAAf8AAAAA/wD/AAAAAP8AAP8A/wAA//8AAQD///8AAAEA/wD/AP//AAD+//8AAQEBAQABAAAAAQABAQAAAAEBAQAAAP////////8AAAH//wEAAAEA/wAAAQAAAQD/AAAAAf8AAAAAAP8AAf8A/wAAAAD/AAEAAAAAAP8AAAEA/wAAAAAA/wD+AQEAAP8BAP////8BAAEBAAEBAP8A/wEAAAAAAP8AAgAAAQABAAH//wIBAQD/AAD/AwD/AP8A/wAA//8AAAAB/wABAAAA/wEAAAAAAQEA//4AAAD/AAAAAAD//wH+//4CAQEB/wEAAAEAAQEAAf8BAAAAAAEAAQH//wAAAQAAAAAAAQH/AAD/AAABAQD//wAAAQAAAAEA/gAAAAEBAQH/AAABAAEAAAAAAAEBAAEAAQEBAQD///8AAAD//wAB//8B/wABAAH/AgAAAAAAAP////8BAAAAAQH/AP8AAAAA/wAAAAABAQH//wEBAQAAAAAAAf//AAAAAAAAAAAAAQEAAQEBAAH/Af8BAQABAP4A/gEA/wD/AQEA/gAAAAAAAP8AAP8A/gD//wEAAP///wAAAAAAAgEAAQEAAQD/AAEA//8A/wAA/wAAAAIAAf8AAAEA/wAA/v4A/wD+AgEAAQABAQAAAP8AAgEAAAAB/wABAAAB/wAA/wD/AAD/AAD//v8AAAH//wAAAQEBAQABAAAAAAEBAQEBAAEBAAEAAQABAAACAQABAP8AAP8B/wAA/wAA/wAAAAEBAAH/AQEA/wEAAQABAQD//wH//wAAAAH/AAH//wExMjGsrKdDQUEAAP8AAAAAAAAAAAABAAD65Pfkj9brquny8gjz/gTx/QTw/wLx/QHzAAD0//70AP/4/gD5/gD5//75///4/v/7///6/wD7///6/v/6/v70/wDr/wHixO//8vgAAP4CAP7+PhP/CgIAAP8AAgAAAQAAAQAA/wAA//8AAQAA/wAA/gAA//8AAAAAAf8AAAEAAQAB/wEAAAAA/wAAAP8AAAD/AAEBAAAA/gEA/wH/AAH/AP//AQD///8A/wAAAQABAAABAQEA/wEBAP8AAQAAAAAA/wEAAQAAAAEA//8AAAEAAQAA/wAAAP8AAQAA//4AIRMATS4AEwsAAAEAAP8NDxAkJSP+//8A/v//AP8AAQAA/wD//gABAAD/AAAAAf8BAAAAAf8B/wD/AAABAQEBAAD/AQABAQEAAP8BAAEA//4AAAEBAQH/AAEAAAEAAAD/AP4AAAD/AAEAAAABAAAAAAAAAAEA/wAAAAD+AP8AAf8AAP8AAAAA/wEB/wH//wEB/wAAAQABAAAAAAAAAQEAAAEAAAEAAAAAAAACAAD/AP8AAP8AAAH/AAH///8AAAAAAQEA/wEAAAAAAQABAAL//v8AAAAAAP8A//8BAAEAAQAAAAAAAQAAAQH/AQH/AP//AAAA////AQAAAQD/AAAAAP8AAQEBAP8AAAD/AAAA/wAAAQH/AAEAAAAAAQABAAABAQD+AAAAAAD/AAABAAIBAf///wEAAP8A/wAAAAABAQABAQD+AQEA///+AAH/AAEAAAEAAP8AAP8B/wACAAEBAQAA//8AAP///wD/AAH/AAEBAAABAAAB/wEAAAAB/wH/AAAAAAABAAACAAH/AAD/AAEBAAAAAQH//wAAAP8BAAD/AAH/AP8AAAH/AQAAAQEBAAABAP///wD/AP8AAAEBAAAAAgAAAAD/AP/+AP8AAAEAAf7/AP//AP8AAf//AQAAAAAAAQAAAP8B/wEAAAAAAP8AAAEAAAAB/gAAAP8BAQABAf//AQAAAAEBAAEC/wH/AAH//wAAAf8AAf8A/wEAAQAA/wH/AQD/AQAAAP8BAQEA/v//AAABAQAAAAAAAAIAAQABAAEAAAAA/wAB/v39/wEAAQABAAABAQD+/gABAgAA/wAA/wAAAQH/AP8BAAEAAP8AAAH/AAAAAP4AAAIBAP8AAAAAAAAAAAD///8BAAAAAAAAAQEB/wD/AAAAAAAAAAAAAP8AAAAAAQAB/wD/AQEBAAAA/wD/AAAAAQEA/wAAAf///wD/AAABAQABAAAAAAAAAAEAAP8AAAEAAAAA/wAAAAAAAP8AAAEAAf8BAP//AAEB/wD/AP8AAQIA//8BAAAAAAD/AQD//wABAQAAAAD/AAEB//8AAgAA/wEA//8AAQAA/wAAAQAAAAAA/wAAAAAAAQAA/wAAAQAB/wH/Af8A//8AAQEB/wD/AAAAAAAAAQAB/wD/AAABAQAA/wD/AAAAAQAAAAAA/wD/AQAAAAAAAAAB//8AAAEAAAAAAAEAAf8AAAAAAAH///8B/wD/Af8AAAAAAAEBAQAA/wAAAAEAAf///wEBAP//AAEBAP//AQEB//8AAQAAAAEA//8BAQD//wAAAAEBAAD+AP8AAQAA/wAAAQABAAH///8AAQEA//8BAgAA/wD/AAAAAAABAP8AAAH//wAAAP8BAAH/AAEBAP//AQABAAAB/wH+AP8AAQAC/wH/Af8BAAD/AAH/AP4A/wABAAEAAQAA/wD/AQAC/wD+AAABAQH///8BAQAA//8AAQH/AAABAAEBAP///wAAAAAAAQEA//8AAf8A/wEBAQH/AAAAAP8AAAH/Af8B/wAAAAD/AAABAP8AAAEAAAAAAAEBAAAAAf8A/gH+AQACAP//AAAAAAEA//8AAQAAAAAAAAAAAAEBAP//AQAA/gD/AQAB/wAAAQEBAP//AAABAAD/AAABAAAA/wD/Af8AAAEAAAEBAP7+AAECAAD+AAEBAAAAAP//AAAAAAEBAAAAAAABAQD//wAAAP8BAAEAAf8A/wEAAQAA/wAA//8A7Ovqenl+oaGh/P37AAACAQD/AAAA/wD/AAAABSARCFEhBDQMAQP/Av//BQEACP/+BgH/BAD/BgABAgD/BQEBAgAAA/8AAgAAAf8BAQD//gEB7AMC7e4E6n3QAOr2/wAAABsO/3okAAcAAP4BAAH/AP8BAAAAAP8AAP8AAAEBAP//AAAAAP8AAAABAP8AAP//AP8AAP8BAAABAP8AAf//AP8CAP8A////AQACAP4A/wD/Af8BAP8B//8BAAH/Af8B//8AAf8B//8BAP8AAP8BAAAAAP4AAAABAP8BAP8BAP//AAEBAAAAAP8BAAEAAAEAAP8BAP0BAL/YAMTeAAD/AAACIiAhTUxILy8wNzs6JiQlAwMEAAL/AAABAf8AAAAA/wAAAAABAQAA/wD/AAEBAP//AQEAAP8AAAEA/wABAP//AAAAAQAA/wABAQEA//8AAAAAAQD//wH/AP4AAAICAP//AAH/AP8BAf8AAAEA//8AAAIA//8AAQEBAQD//v4AAgIAAP8B/wH/AP8BAAD/AQEBAP8A/wAAAAH/AQABAP//AAAA/wABAAD+AAEB//8AAgEA//8AAAAAAQAB/wD/AQAA/wAAAAAAAP8AAAEBAAD/AP8AAQEA/wAAAP8AAAIBAP7/AAEAAAEAAP8AAQAB/wD/AAAAAAABAAD/AAABAAD/AAABAAAAAAH/AP8AAAAA////AAIBAgAA//8AAAAAAf8A/wEBAAD/AAAA/wAAAQAAAAAAAAABAAD//wABAQD/AAAAAQAA/wAAAAD/AAABAAAAAAEAAP//AAEBAP///wEBAP8AAQABAAD/AAD/AAEBAP8AAAAAAAAAAAAAAAAAAAD/AAAAAf8B/gEAAQAAAAAAAAAAAAABAAH+//8CAgD//gAAAQAAAQAA/wD/AQAB/wAAAAEAAP//AP8A/wIAAf8BAAAAAAAAAAAA/wD/AAABAgAA/gAAAAAAAf8A/wEAAQAAAAEAAAABAP8AAP//AAEAAAAAAAEAAP//AAAA/wABAAD/AAEBAQABAP//////AQAA/wEAAQAB/wAAAQAB/wD/AgAA/wH/AP8BAAD/AAABAAEA////AQEBAP8BABaE6XsB/f7+Af8AAQEA/wABAAD+/wABAQEBAf////8AAAEAAAEAAAAAAP8AAAAA/wAAAAEAAf8AAQAA//8AAAEA/wAA/gAAAwAA/wABAP//AAEAAQAA//8AAgEA/wABAAAA/wD/AAAAAQD///8BAQEA/wAAAQD//wEBAP8AAQEA//8AAgH//gABAQAA////AQABAAEB//8AAQAAAAD/AAAAAAAB/wD/Af8AAAEB/wH/Af8A/wABAf//AAIB////AAAAAQAA//8AAAIAAf8A/v//AgEB//8AAAEAAAAAAAAAAQAA/wABAP//AAEAAf8A/wEAAAAAAAAAAAAAAAAAAQAA//8AAQEAAAABAP///wEBAAD/Af8AAAEA/wABAAD/AQAA/wAAAQEA////AAAAAAAB/wD/AgAAAAEAAP8BAAD/AQABAAAB////AAEAAAAA/wD/AQABAAEAAP8A/wAAAQAA/wAAAAD/AQAAAP8A/wAAAAEAAQABAAAA/wAAAQAA/gAAAgAA/wAAAQAAAP8AAAH/AAAB/wEAAf4AAAAAAAEBAAD/AAD/AAAB/wEAAP//Af8BAAAA/wIAAP4AAgH//wEC///+AAEBAf8A/wAAAAAAAQAA/wD/AQAA/wACAQD+/wABAQAA/wD/AQEC/wD/AQAA//8BAAH/Af4AAAEBAAAAAAAA/wD/AQEA//8AAQAA/wABAQD/////AQEBAAEBAP//AAAAAQD//gABAgAA/wAAAAAA/wAA////AgEBAAAAAAEA////AP8AAQEA/wECAP//AQAAAAEAAP8AAAAA/wABAQH//wAAAP8BAf8AAAH/AP8AAAIB///+AQABAAAA//8BAAEAAv/+/gECAQD//gAAAgAAAAAA/wAAAAEBAQD/AAAA//8AAAEAAgAB//8AAAD/AAEBAP//AAEBAAAAAQAA/wAAAQAAAAAA//8A+vv6kJCSg3+D9vj2/wAAAQAA/wAAAQAA/wD/AQQDAzwWBUscAxsK/wD+AAH9AgEAAgH+BQEBBgH/B/4BBwEABf8AAgAAA/8A/QAA9QEC7wID7b/wAJbYAgAAAAAAAEMZ/lkZAP8AAAABAP8AAAEAAP8AAP8AAP8AAAABAP8AAAD/AAEBAAD/AP4BAP//AP8CAAABAP4AAP//AP8AAAAAAP8AAP8AAAACAf8BAP//AP4A/wABAAEBAP4AAAAAAP8AAf8B//8BAP8AAP8BAP8AAP4BAAABAAAAAAAAAP4AAAEAAAACAAH/AAACAP8AAP8AAP8BAMXcAL3ZAAAAAAACAQAAAAH/AAEBEA4PKiwqNTU0Ly4uKyoqKSgoDAwP/wABAAH/AAEAAf8BAAD/AAEA//8BAAD/AQAA/wEBAQAA//8AAP//AQEB/wAAAQAAAAAAAAH/AP8AAAAAAAAA/wAAAAAAAQH//wABAP8AAAD/AAABAP8AAQIB////AQEAAAABAAD//wAAAP8BAAD+AQECAP///wABAAH/AAAAAP8AAAEBAAAA/wD+AQAB/wAAAv8BAAD/AAEBAP//AAAAAAEA//8AAAAAAAEAAf8A/wABAAD/AAAAAQAB/gAAAQD/AAAAAAABAQAA/wD/AQAA/wAAAAAB/wD/AQH/AP8AAAEBAP8AAAD/AQABAAEB////AQAA/wAAAAEAAf///wABAQAA/gD/AQECAAD+AP8B/wAAAQH/AP8BAQAA/wAAAAABAAAAAQEA//8AAAAA/wD/AQD/AP8BAAEAAAAA/wEBAQD+AP8B/wAAAf//AQEC/wD/AAD/AAABAQAB/wD/AAABAAD/AP//AAEAAAABAAAAAf8A/wEBAAAAAAD/AAAAAAEBAP//AAH//wABAP8AAAAAAAAAAf8AAAAA/wIAAf8AAAAA/wD/AQABAAAA/wABAQD+AAABAAEBAP//AAAAAAAAAAEA//7/AQIBAP8B/wD/AQAAAAAAAAAAAAAA//8AAQEA/wAAAAAAAAAAAQAAAAD/AQAA/wEBAP8AAAAAAAAAAAH///8BAQAAAAAA/wAAAQEAAP//AAABAAAAAAAAAf3+/QEAAQD//wABAQABAf//AAEA/wAAAP8AAAH/AAABAP8BAQH+/wABAQAA/wABAAD/AP//AAACAAD/AAH//wABAgAA//8AAQAA/wAA/wAAAAD/AQEB//8AAQEAAP8AAQEA/v//AAEBAP//AAABAAAAAQD//wEAAP8BAQEAAAAAAP8AAAEAAAAA//8AAAAAAQAAAQH//wABAAABAP//AAEAAf8A/wAAAAAAAAAAAAIAAP7/AAAB/wEAAv8A/wEBAP//AAABAAD/AAEA/wD/AQAAAAAB/wAAAP8AAAEAAAAAAf8AAQAA/wH/AP8AAAEBAAAA/wD/AAABAP8BAQD+AAAB/wEAAP8AAQEAAf8A/wEBAAD/Af8BAAIAAP8A/wAAAAD/AAAAAAAA/wAAAQAB/wD/AQAA/wD/AQABAP8B/wAAAQH/AP8AAAAA/wIAAf4A/wEBAf///wAAAQAAAAAAAAAAAAAAAQAB/wL/AP8B////AQEAAAAAAP///wABAQEAAAAAAP8B/wEAAQH+AP4CAAD//wAAAAAAAAAAAQEAAAD/AQAC/wD/AP8AAAIB////AAAAAQAAAP8A/wAAAAEAAQAAAAAAAAAA/wABAQAAAP8A/wD/AAD//wEBAQAAAP8BAAEAAQD/AAAA/wAAAf//AAEBAAAAAAAAAP4AAAIAAQAAAAAA/wAAAAD/AAAAAAABAAAAAAAAAQAA/wAB/wH/Af8AAAD/AAACAAD/AAAAAP8A/wEAAQAAAQAAAP8B/gH/AQABAAD/AAAAAAD/AP8A/wABAQEBAP//AAAAAP8AAAD/AQIBAP8B/wH/AP8AAAAAAAAAAAEA/wEBAf3/AQIA//8AAAEBAAD/AAD/AAAB/wAAAQAAAAAAAf8A/wEBAQAAAAD/AAAB/wD/AQAA/wAAAAABAAEAAf8AAAH/AP8BAAD/AAEBAAAAAAAAAP7//7a0tn9+gc/Q0AAA//8AAAAA/wAAAQEAAAAAAAIRBgM8GwM9E/0dBv8A/wD/AAIBAAEA/gQDAQP//gUAAQIAAAEAAPoBAfoAAv3+A/iI2gHQ7f8AAAIAAQBuJv4uDAD/AQAA/wAAAQD/AAAB/wD+AAD/AQAAAAAAAQD//wAAAQAAAQD+/wD/AAD/AAABAQD+AAAA/wD+AQD+/wABAQD/AAH/AP8AAQH/AQH/Af7/AAD/AQD/AQAB/wD/AAD+AQH/AP8AAQD/AAD/AQD+AAAAAQAAAQD/AAAAAAD+AAACAQABAgAAAQD//wD+AAAAAQDD3AG/2gAAAAAAAAAAAAAAAQEAAP8AAAAAAAAAAAAAAgcIBCgoKjMzMiorKS4sLSkpKRsbGwAA//8AAQAA/wEBAgAA/wD//wABAv///wAB/wD/AgAA/wAAAAAA/wEAAQAAAAABAAAAAQAAAP8A/wEAAP8AAP8AAQH//wABAQEA/wAAAQAA/v//AQAAAAAAAAAAAAD/AAEBAP8BAAH/AAAAAf8AAAEAAP8BAP///wEAAAAAAP8B/wH/AAAAAQEAAP8BAAAAAP///wEAAgAAAAEA//8AAQAAAAEB//8AAAD/AQAA/wAAAAAAAQEBAP///wAAAAABAAEAAAD///8AAf8AAAEAAQAB/wD/AQAA/wAAAQAAAAAB/wAAAAAAAAD/AAEAAP8AAAAA/wAAAQAB/wH/Av8A//8AAAEAAAAA/wAAAQAAAAAAAAAAAAD/AAABAAABAf8A/wH+AP8BAAEAAAAAAQAA//8AAQEAAAAA/wAAAAABAAH/AP8AAAEAAP4AAQIA//8AAQAA/wABAAAAAAD/Af7//gEAAQIAAQAB//8A//8BAQAAAAH/AQABAAD+/wECAf/+/v8AAQEBAAD/AAABAP///wECAAD+AQABAAAAAf8B/wH/AAAAAAABAAD/AAAAAAD//wAAAP8BAf8AAAH/AAAAAAEBAAAAAf8A/wD/AAEAAAAAAP8BAAD/AAAB/wEAAAABAQEA/wD/Af////8BAQEBAAAAAAH///8AAP8AAAABAQEAAAEAAAAAAP8AAAD/AAAAAAH+/v4A//8AAQEAAAEA//8AAQAAAAD/AAABAQEA/////wABAgEB/wD/Af//AAABAAABAAH+/v4BAQH/AAAAAAABAAEAAf8A/wAAAAD//wAAAAABAQAAAP8AAAH+//8CAgH//wABAAAAAAD//wAAAAABAgAA/wAAAAH/AQAB/gD/AQABAP//AAAAAAABAAAAAAAAAAAAAQD/AAAA//8CAAH+AQAB/wAAAAAAAAD/AAAAAP8A/wEAAAABAAD/AAABAQAAAAD/AP8AAAIAAP8AAAABAQAA/wD/AP8BAAIAAP8AAAD/AAAAAAAAAAABAAAAAAEAAP//AAAA/wAAAAABAQD/AAABAQEA//8AAP//AAAAAAEAAP8BAQH///8AAAEBAQEA//7/AAEBAP8AAAH/AP8BAAEAAAD///8BAAH/AQABAAD/AAAAAP8AAQEB/wD/AAABAAAAAAD///8BAQD/AAEBAAD//wAAAQAB/wAAAQD/AAABAQAA////AAH/AAAAAP8CAAEAAAD/AP8BAAAAAQEA/wD/AAAAAP8BAAEAAAAA/wAAAAD/AQAAAf8A/wABAAD/AAAAAAEBAP//AAAAAAABAQD//wEAAAAAAAACAQD/AP//AAAB/wH/AQAB/wAAAAEAAP8AAAAAAAD/AAAAAAAA/wAAAQAAAAEAAP8BAQD+/wACAAEAAP//AAAA/wAAAQABAAH/AP8BAAAAAAD/AAABAAD/AAACAAH/AP8BAAD/AP8AAAH/AQD//wACAAD/Af8B/wEAAP8AAQAA/wEAAAAAAAH/AP8B/wAAAQD/AP8BAAL/AP8BAQEA////AAEBAf8A/wAAAAAAAAABAAD+AAABAQD/AAABAAAA/wEBAf8AAAD/AAD//wABAAH/AP8A/wABAQEAAP8BAAD+AAEBAQABAAD///8BAQH/AAABAP//AAEBAP8A/wEAAQD/////AAHq6Op8en6goJ79AP4AAAAAAAEAAAEBAP8AAAEAAP4CDQYAPhgBRBYAGAj///4B/wABAP8AAv8BAQEBAP/9AAH/AAEAAgH+4PgAe9MA+///AP8CFwz/fiX/CAQA//8AAAEA/wAA//8AAAEAAP8A/gAA/wAAAAEAAAAA/wAA/wAAAAEAAQAA/gAA/wEA/wAA/wABAP///gAA/wEBAAH//wAA/wAB/wEAAAH//wAB/wH//wAAAAEAAAAA/v8A/wEAAQEB/gD/AAEA/wAA/wEAAAEA/wAA/wEAAAAAAQEAAAAAAAEAAAEA/gAA//8AvNoCx93//wAAAAD/AAAAAAEBAAD/AP8BAAEAAAAAAAEAAgAA/wAB//8AAQEAAAAZGhosKyo6OzshISAhICEjJCQYFhYAAQABAAAAAgIA/wAAAP8AAQD+AAECAAAA/wAAAf8AAAAAAAH///8AAQH/AAAC////AAEAAP8AAAAAAAAAAAAAAAEBAAAAAP4AAAIAAP8AAAD/AAEBAQAA////AQABAAAAAAD//wAAAAAAAQEAAP8A/wAAAQAB/wAAAAAAAAD+AP8BAAIBAf//AAAA/wAAAQAAAAAA/wD/AAACAQH//wAAAAAB////AQEA//8AAgAA/wAAAAABAQD/AAEA//8BAAD/AQEB////AP8AAQEAAAEAAP7/AAEB/wABAQD///8AAAIBAAD/AP8BAf///gEBAQH/AP8AAf8AAAEB/wD/AAAA//8AAQABAQL///8AAQAB/wD+AQAAAAEB//8AAP8AAAD/AQEAAAACAAH/AP8A/wEAAP//AAABAAD/AP8BAAIA//8AAQAAAAAAAAAAAAAAAQAB//8AAAH/AP//AAEBAAABAAD/AAAB/wD/AgAAAAAA/v8AAQEAAAEAAP8AAAD/AAABAAAAAAAAAAAA/wEAAf//AAAAAAD//wEBAv4B/gEAAQH/AP8AAAABAAD/AAABAAD//wABAQD/AAECAP//AAH/AP8BAAAAAP8AAAEAAAAAAf///wEBAP8AAQEA/wD+AP8CAAABAQH/AAAAAAD//wABAQAAAAEA//8AAAAAAAAAAAAB/v7/AQH//gD/Af8CAf///wEBAQD//gAAAQAAAAAAAAAAAAAAAAAAAAEAAP8A//8AAQH//wEAAQAB/wD/Af8B/wAAAP8AAQH/AAABAAD/AAABAP8B/wAAAQEA/wD///8AAgEAAAABAAEA//7/AQEAAAAAAP8A/wEAAQAA/wD/AAABAAABAQD+/wEBAf8A/wABAQH/AAAAAAAAAP8A/wAAAAAAAf8A/wAAAAEAAf8AAAEBAAD/AAAAAAAAAAAAAAABAAD///8AAAH/AAABAQAA/wAAAAAAAAH/AP4AAAEBAgAA/wAAAP8AAAAB/wD/AQEA//8AAQEA//8BAAH/AQH///8BAgAAAP8A/gAAAAH/AAABAAH/AP8AAQABAAAAAQAA/gAAAQEA////AQAAAAAA/wEBAf8AAAAA/wAAAf///wEBAf8AAAEAAP8A/wD/AQEBAAAAAAAA///+AQEC/wEAAf8A//8AAQD/AQEB/gAAAQEBAP/+AP8A/wEAAAAAAQEAAP8AAP8B/wEAAQAA/wAAAAEAAAAAAf8AAP8A/wH/AQABAAEAAP8AAAAA/wEAAAD/Af8AAAAB/wAAAAAAAQAAAAD//wAAAQAAAAEAAP8BAAAAAAD/AAEB/wAAAf8BAAD/AAH/AP8A/wEBAP8AAgAA/gAAAgAA/gAAAQD/AP8C/wH/AQAAAAAA/wAAAQEA//8AAQAAAAAAAP8B/wH/AAAAAQAAAAEAAAD/AP4BAAH/AAAAAAACAAD/AAEAAP8A/wAAAAD/AP8BAQEAAAAA//8AAQH/AAEBAAAB/wD/AP8BAAD/AAAAAQAAAQEB/v//AQAAAAAA/wAAAgAB/gD/AQEA/v8AAgD//wACAQD/AAAAAAAA/wD/AAABAQAAAAEA//8AAQAAAAEAAAABAAAAAAAAAP//AAABAQD/AAABAAH/AP8A/wAAAQEBAAAA/wAAAQAA/wD/+fn6ure6k5OVvb6+/wD/AAAAAAAAAAABAQAAAQD//gAAAhAFATcY/jYQAiYN/wT/AP3/AAL//v//AQEBAAAB/wECAKjkALHkAAABAQABAjsV/WEdAAAAAAAAAAABAAAAAP8BAP//AP4BAAEAAP8AAP8AAAABAAD/AP8AAAAAAP8AAP8BAP8BAP8AAP8AAP7/AAACAf///wABAP8BAP8AAP8BAQD/AP8BAAAA//8BAP8BAP7/AAABAAAAAP8BAP8AAP8BAAABAP4AAAAAAAABAP8AAAEAAAABAAABAAAAAP4BAP8BAAABALXUAc3iAAAAAAAA/wAAAgEA/////wABAAAAAAABAQD/AAABAAAAAAAAAQIBAP7/AAEBAAD///8BAQAABQgHFhMTHyAfHx8fJCMjJSUlIiQjLS8rDAkLAAECAAD/AAABAAD/AP8AAAEA/wAAAAAAAAABAAD/AP8AAAEBAQAAAAD//wABAAD/AAABAf8AAAH//wABAP//AQAA/wABAAAAAAEAAAD/AP8BAAD/AAEAAQAB//8AAAH+AAABAQAA//8BAAAAAAEAAAD/AQAA/wAAAP8AAAEBAP/+AAAB/wAAAQAAAAD/AAECAP//Af8A/wEAAAEAAAAAAf8A/wAAAQD//wABAQAAAAEB/wAAAP8A/wD/AQAAAf8AAAEA/wABAAD+AAECAAAAAAAAAAAAAf/+/wAAAQABAAD///8BAAEAAAAAAAAAAAAA/wABAgH///8A/wABAQH//wD/Af8BAAEA////AgEBAP8B/wH+AAABAP8BAAD/AQAA//8AAQIB//8AAAAA///+AQEBAP8AAAIAAP//AAEA//8BAQAAAP8AAAEBAAD/AAEA////AAAAAQACAAD//wAAAAAAAAD/AQAC/wAAAQD/AQEA//8BAAAA/wH/AP8BAQAA/wD+AQAB/wABAQD+AQAB/wAA/wAAAAD/Af8BAAEB/wD/AQEA//8AAQAA/v//AQEBAQAAAAABAP8AAAH/AAABAAD/AAAA////AQIA//8AAQEBAP8AAQD//wABAAAA/wD/AAABAP8AAAD/AAEBAAAAAf7+/gAAAAAAAAABAQAAAAD//wAAAQEAAP8A/wAAAAAAAP8A/wEBAQD/Af8A/wEAAP8AAAEB//8AAAD/AQH/AP8B/wEAAQABAAAAAAAAAAD/AAABAP//AAEAAP8AAAEAAAAAAAD/AP8BAQEB/wD+AP8BAAAA/wEBAf///wAAAgEAAAD//wABAP8A/wEAAf8AAAAB/wD/AQABAQD//wAAAAAAAAEBAAAAAAD//wD/AQABAP//AAEBAQD//wAAAP8B/wAAAQEAAf8A/gD/AQABAAAAAAAAAAAAAAEAAAAB////AQAA/wEAAP8AAQEAAAAAAAAAAP//AAECAP///wD/AAAAAQAAAAAAAAEB////AQABAAAB/wD/AAEAAf8AAAEAAAAAAAAA/wAAAAABAQD+AAABAAAA//8AAAEAAQAB/wD+AQABAP///wEAAQABAAAAAP//AAEBAAEAAP7//wEBAf4AAAIAAP8A/wABAAEAAQD/AAAA////AQAB//8AAQIAAAAA/wAAAf8AAQAB/wEAAAD/AAAA//8BAQH/AP8BAQAA/wEAAP8AAAH///8AAAEAAAABAf///wAAAAEBAQH/AP8AAAABAAD///8AAgEB/wAAAQD//wAB/wD/AP8BAQEAAAAAAAD/AAAAAAAAAf8A/gEAAAAAAAABAv///wEA/wAAAQEA//8BAQAA/wD/Af8AAAL/AP4C/wEAAf///wAA/wEAAQAAAQAAAAAAAf///wABAAEAAAAAAQAA//8AAAAAAAIAAf8A/gAAAv8AAAEA////AAEBAAAAAAAAAAAAAf8A/gAAAAAAAAAAAQEAAAAAAAAA/wD/AQAAAAACAf//AAAA/wAAAAH/AAEBAf4B/wH+AAABAQAA/wAAAQAA/wAAAAAAAAEAAQAB//8AAAAAAAAAAAEAAP8AAAEAAAAAAP8AAQEAAP8AAAEA//8AAAEAAAAAAQAAAP////Py85eXmpKQk+fp5v8AAAEAAQAA//8AAQEAAAEAAf8A/gAEAwAnDgE6FgAlDP8YBQAE/wD9/wAAAAD5Af+D1QHh9v8A/wIAAf9hJf86DwAAAAAAAAABAQD//wD/AgAA/wAAAAD+AAAA/wD/AgD//wD/AAABAgD//wAAAQD/AAD/AQD/AAD+AQAA/wH+////AgABAAEAAP/+AAD/AQAAAgD//wD/AAEAAf//AAD/AAAAAQD/AQH/AP//AAD/AQD/AAAAAQD/AAAAAAD/AQAAAQAAAAABAAD/AgD//wD/AgAAAAC11QHN4gEA//8AAAAAAAAAAQABAAD/AP8AAAAAAQEAAAAA/wAAAP8AAQEAAAAAAAAAAAAAAf8AAQEA/wEBAAD/AP8AAAAAAAIAAP4A/wUFBCQjJCIiIxscGzs6OSAiISsrKhISEv//AAABAAEAAAAAAP8A/wEAAf8A/wD///8BAAIAAf8AAAAAAQEA////AAABAQAA/wEAAf7//wEBAQEA//8AAAD/AQAAAAEBAP7//gIAAQABAf///wAAAAAAAQH/AP8AAAAA/wEBAf8AAAAA/gEBAf//AAEA/gAAAv//AAEBAAAAAP//AQABAAEA//8AAAEBAf4A/wEA/wH/AQAAAP8AAQABAAH/AP8B/wD/AAABAAAAAP/+AQECAAH/AP8B/wD/AAAAAAEAAP8AAAEAAf8AAAABAAD//wABAAAAAQAAAP///wEAAAH/Af8A/wACAQAA/wD/AAEBAP7//wEAAQAAAAABAQD//wAAAAAA/wAAAQD/AAABAP8AAAEBAAAAAQD//wAAAf8BAAD//wEBAAD/AQAB/wH/Af8AAP8A/wIBAP//AQAAAAAAAAD///8BAQIA//8AAP8BAAH/AP8BAAL///8AAQABAAD/Af8A/wAAAAD//wABAQEBAAH/AP8AAQAA/wAAAAAB///+AQEBAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAD/AAABAAAAAAD/AAECAP3/AAIAAAAA/wAAAQD//wABAgABAAD+AAAB/wAAAAAA/wD/AQABAAAAAP8A/wD/AAH//v3/AAEBAAD/AAAAAQEA////AAEBAAABAP7/AAEAAAAAAAH/AP8AAAEBAP8A/wABAQH+AAAAAP4AAAEAAAAAAAEAAP4A/wEBAQEAAf4A/wEAAQD+/gACAQH/AP4BAAIAAP8AAAH/AP4A/wEBAQH/AP8AAAAA/wAAAQEAAP4AAAEAAP8BAAL/AP4AAAAAAAEAAAAAAP8AAAEAAf8A/wEBAAAAAAAAAAH///4BAAH/AQEBAP//AAAA//8AAQABAAEA/wAAAgD//wAAAQAB/wEAAP//AAAAAAABAAAAAAD///8BAAH/AQABAQAA/wAAAAAAAAD///8AAAEAAQEAAAABAP8AAQAA/wEAAP7//wEAAgAB/v8AAQD+AAEBAAABAP8A/wEAAQD/AP8BAAAAAQH/AAAB//8AAAAAAAEAAP//AAEB/wD/AAACAQD/////AQEBAAD//wAAAQD/AP8CAAH/AAAB/wD/Af8AAAAB/wEBAQD/AP8A/wD/AQEBAP///wEBAQD/AAEAAP8BAAD//wABAQD+AAAA/wABAAABAgD//gABAf//AAEBAQAA/wAAAP//Af8AAAEB/wD+AAADAAH+AP//AQACAAEAAAD//gEBAQAAAQD///8AAP8BAAEA/wD/AP8AAQEBAQAA/wAAAQD//gAAAQABAQAA//8AAQEA/wAAAAD/AP8CAAL/AP8AAAD/AP8A/wAAAQAA/wEBAQAB////AQEAAAEA//4AAgEA/wABAAD//wAAAv///wIA//8BAQEAAP8AAAD/AP8AAAEBAAEAAP8AAP8AAAH/AAAAAAEBAP8AAAAAAAD/AAABAAAAAQEAAP///gABAAEAAP8BAQH/AP//AAAAAAEBAf8AAAH///8BAAABAAD/AAAAAAD/AAEBAAAAAf8A/wAAAQEA//8AAQAAAAEA/gABAv8AAAH/AAAB////AQEAAP8A/wEBAQD/////AAABAAD////Z2NmIhIqmqKb9//8AAAEAAAAAAQAB/wD/AP8AAAAAAAIBAP8BCAUAFwoAHQsBGgr+CgIA1u4Ayuz+AAAAAAAAAwABdiz/IwgA/wAAAP8AAAEAAAEAAAAA/wAAAAAA/gEAAP8A/wEAAP8A/wIA/wAAAP8A/wEA/wAAAAAA/wAAAAAA/gEA/wAB//8BAAL+/wAB/wH//wAA/wAAAAIA//8A/wEA/wAAAQEA/gAB/wH//wAAAP8AAAIA//8A/wIAAAAA/wEA/wAAAAEAAAAAAAEAAQEA/gAAAAEAAAAAtdUCzOH/AAABAAD/AQAA/wAAAAAAAAAAAAEAAQD//wABAAABAP8AAAH+AP8BAAEBAAEBAAD/AAH/AAAAAAAAAAAAAAD/Af8B/wD/AAEAAP8BAAEAAP4AAAEAAP8AAAEmJScpKigiISEYGBcnJycbHRweHhwUExQAAP8A/wAAAwMAAP8AAAAAAAEA//8BAAH/AAAAAQABAP//AAEAAAABAAD/AP8A/wABAAH/AQAAAP8AAP8BAAH//wEAAf4BAAEAAAAAAAD+/gACAgH//wABAf//AAEB/wD/Af//AAAA//8BAAIAAAABAf7//wEBAQH/AP8AAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAB/gD/AQEAAf8A/wABAAH/AAAAAP8AAQEA//8AAQEB/wD/AAAAAf8AAAAA/wEBAAAA////AQAA/wD/AQABAAAAAP8AAQEAAAAAAAAAAAAA/wAA//8AAQH/AAABAAAA/wEAAAAAAf8AAAAAAAEAAAD/AP8BAQAA/wAAAAD/AAABAAEAAf////8CAAH/AQAA/wAAAAEAAP//AAABAAEAAP8A/gAAAgAAAAH/Af8C/wD/AAD/AAABAP//AAEA/wABAQAAAP8BAAL/AAAAAP8AAAD/AAABAQAA/gAAAQAA/wD/AQAB/wD/AQAAAAAAAAABAAAAAQEA/wD/AAAA//8BAAD/AQAAAAAB/wD/AQACAAH/AP//AAABAAD/AAEBAP//AAEBAP8AAAAAAQAA/wAAAAAA/wH/Af8AAAAB/f7+AgAA//8AAQEB/wAAAP8AAAL/AP8AAAAA//8AAQEBAAAA//8AAAH/AQEB/wAAAf///wEAAP8AAQAA////AQIB//8AAf8AAAEAAAAAAAEA//4AAAIAAQAAAP//AAABAP8AAAEAAP8A/wEAAQEA//8AAP8AAAIA////AQABAQEAAP//AP8A/wEBAAAAAQAA/wAAAQAAAAH/AP8B/wEAAf8AAAEBAf/+/wAA/wAAAAABAQAA/wAAAQAA/wAAAQEAAP8A/wAAAAAAAQAA/wD/AQEC////AQEA//8BAAD/AAAAAP8BAAH/AQD/AAABAAAAAP8A/wEBAAD/AQAA/gEAAf8AAQAAAAAAAAAB/wD/AAEAAf////8AAAEBAP8AAQAAAAAAAAEBAAAA/wD/AAAAAAD/AQAB//8AAQD//wEBAAAAAAD/AgAC/v//AAEBAP//AQEA/wABAAD+AAABAP//AAABAQEA/wD/AQAAAAAB/wAAAQEAAP8BAf/+/wAB/wH/AQAAAAABAAAAAAAA/wAAAAAA/wAAAgAAAP//AAEB//8AAQIA/wD/Af4A/wIBAQAAAf8A/wAAAQEA/wD/AP8A/wABAQD//wABAAEAAP7/AAEBAAD/AQAA/wAAAAABAAD/AAABAQAAAAEA/wAAAf4AAAIAAAAAAAD/AP8BAAEAAAAAAP8AAAAAAAAA/wAAAf8AAAEA/wD/AP8BAAEBAP//AQEAAAAAAAAA//8AAAEAAgAA/wAAAP8AAAEBAAD//wD/AP8BAAIAAf8AAAAAAAAA/wABAQAAAAD//wAAAAAAAf8AAAEAAAAA/wH/AP8BAQD/AAEBAP///wACAQD/AAAAAAAA/wAAAgAA/wAAAAEB/wD/AP8AAQAA/wABAAD/AAAAAQEB//7/AgEBAAD//wEBAQD//wAAAAABAAD/AQAA/wAAAQABAP8A/wAAAQEA/wD/AQABAAAAAP8AAAEA//8AAAAA+fj3rqyvkJCTzM7MAAABAQAB/wABAQD/AAAAAAABAAABAAABAAD//wD//wAAAAD+AAAAAAAAAAAAAQD//xEGAXcs/xQEAAD/AAAAAP8BAAABAP//AAAAAP8BAP//AP8CAAAAAP8AAAD/AP4AAAEBAAABAP//AP4BAAD/AP4BAAAAAAAAAP4BAP8AAP8BAAABAP8AAf4BAAAA/wABAP8AAAAAAP8BAP8BAP8AAAAAAQAA//4BAAAAAP8AAP8BAAEAAAABAP8AAP8BAAAAAAABAAABAP8AAP8BALTVA87h/wAAAAAAAAAAAAEBCf8A9gD/AAEA//8AAAABAAD/AQICAxQRCBQR+ejs/u7x/wD/AQAB/wAAAAAB/wAA/wABAgAAAAD//wAB/wAAAQD//wAAAQAB/wAAAAD/AQABAQD/AQEDAAD/AAAABQYGGhgaIiIhIyQiHBwdHh4dHx8eHR0cCAkJGBgYAAEAAQEBAAH/AAAAAQAB/wAA/wAAAf8AAAAAAQEAAAAB/wAAAAAAAAAAAf8AAAH//wAAAP8BAAAAAQAA/wAAAAH/AP8AAAAB/wH/AQAAAAAAAP8AAQEA/wAAAP8BAAH/AAAA//8BAgD/AAAA/wEAAP8AAAABAAD/AAAAAQEA//8AAQAB/wD/AAEAAAAAAP8AAQAA/wEAAAABAAD/AQAA//8AAQAA/wABAQAA/wD/AAEAAP8AAAAAAP8B/wH/AQD/AAABAQEA/wD/Af8C/wD+AAABAAAAAQEA/wABAP4A/wD/AQEAAQAA/////wECAQAA////AQAAAAEAAAAAAAEAAAABAP//AAAAAAEAAAABAP//AAD/AAABAAAAAAAA/wD/AAACAQD/AAABAAD/AAEA//7/AQEA/wABAQAA/wAAAP8AAQH//wECAP7/AQEAAP8AAQEB/v//AQABAQH///8A/wEAAQAAAAAAAAAAAAEAAP8B/wD/AQAAAAAAAP8A/wEAAQABAAH/////AQABAAEBAP/+AAAAAAABAAEA//8AAQEB////Af8A/wH/AQABAAD/AAAB/wEBAf8AAf79/QAAAQEBAAD/AAACAf7//wAAAAEA/wEAAv8A/wAAAAAAAAAAAP//AAABAAD+/wECAf8AAAEBAP//AQAB/wD/AAEAAAAAAAD//wACAf8AAAAA/wEAAAEAAv///wAAAf8A/gEAAQAA//8AAQEAAAABAAD/AP8AAAEBAAD/AP8B/wH/AQAAAP8B/wH/AQD///8CAQEAAP//AAEAAf8B/wAAAQD//wAA/wD/AAAAAQABAAAA/wAAAgEA//8AAAAAAAAB/wH+AP8BAQH/AP8BAAEAAP///wABAQD/AAABAAABAAAA/wD+AQABAAABAAL+//8BAf8AAAD/AAABAQD//gABAQEB/wD/AAABAQD/AQAA/wAAAP4A/wIAAAD/AQABAAAAAAAAAAAAAAAAAP8A//8AAQEA/wAAAQH//v8BAQEAAf8AAAEAAAAAAQAAAAAAAP//AAEA/wAB//8AAAD/AAEBAAAAAf8A/wAAAQAAAAEA/wAAAf8A/wEAAgAA/gABAAD/Af///wABAQD//gABAQABAQD/AAD//wEAAQAAAQAB//8A/wEAAf8B/wD/AAEAAf8A/wIBAf//AAH/AP4AAAEBAP8A/wEAAgAA/v8AAQAAAAAA/wAAAAEAAQD/AAABAP8BAAD/AAEAAP8AAAEA/wAAAQAB/wD/AgAA/gAAAQAAAAH///8BAP8AAQEBAAD+AQEB//8AAP8AAAD/AAEBAQD//v8BAQAAAAEAAAABAQD///8A/wAAAQD/AAAB/wAAAgEAAP8A/wD//wEBAQAAAQABAP/+/wABAAEAAP///wEAAQABAAD/AAABAAAAAAAAAAAAAAD/AP8B/wH/Av8A/gEBAgH///8B/wAAAQABAQD/AAAA/wABAP//AQEAAAABAAH/AP4A/wH/AQAC/wAAAAEAAf//AAAAAAAB/wEAAAAAAP8AAAH/AQABAP8A/wAAAAD/AQEBAAD/AP8BAAAAAAEAAP8AAAAAAO7s7ZiXmpSTlurr6gAAAf8AAAIAAf0A/wEAAAIBAP8AAgABAP/+/v8A/wEA/f8AAgAAAAEAAP8ZBwF3LP8LAgAB/gAAAQAAAQD/AQD//wAAAQD//wD/AAAAAQD/AAAAAAD/AAD/AQAAAQD/AAAAAAD/AAD//wD/AQAAAAH+Af//AAD/AgAAAAH+/wD/AP8AAQH/Av///wAAAAD+AQAAAQD/AAD/AAAAAQAA/wD/AQAAAAD/AQD/AgD//wABAQABAQD+AAAAAQAAAAABAQD+AAD+AACw0gLT5QEAAP0AAAAA/2UEC1j/B73+/JsA9ez//gABAP8AAQD//wEFAgMdFAgpGQAGBP/3+v30+v32+f/y+P/1+f/6/P/8/gL6/QD4/P////8A//8AAQAAAAEAAAAAAAAA/wAAAQAAAQEAAAAAAAAAAAEA/wEAAf8AAAAAAAAAAAQDAxEQDwoLChoaGg8RERYWFhgZGA4ODRkbGhsaGhESEf8A/ygnJwsKDP8AAQEA/wABAAAAAAEAAf8A/wEAAAD/AQABAP4AAAL//wABAf///wEAAAABAQD///8AAQAA/wEAAf8A/gEAAP8AAv///wEA/wEBAQAAAf8BAAAA/wEAAP4AAQL/AAABAP8A/wAAAAH/AAABAP8AAAEAAP8AAQAA/wD/AAAAAQAB/wAAAQD//gAAAQAAAAABAQH//wABAf///gABAQD/AAAAAAAAAQAB/wAA/wD+AgAB/wAA/wABAQAAAAH/AP8A/wAAAQAAAAAAAAABAAD/AAAAAAAAAQD//gACAQAAAAD/AAAAAAAAAAAAAAABAAD/AAABAQH//wD/AAABAQAA/wAAAP4A/wH/AQAAAAAB/wAAAgAAAP8B/wD/AAH/AP8AAAECAQD//gEAAf//AAAB/wAAAgEA//4AAQEB/wD/Af8AAAAA/wEAAP8A/wH/AQEBAP4A/wAAAQEA////AQEBAAAAAAAAAAD/AP8C/wD/AQEB/wAAAf//AAEAAP8AAAD/AAEB////AQECAP//AAEAAAAAAAAAAP8BAAH/AAH+/f0AAQEA//8BAQH/AQAAAAEA//8AAQAAAAAAAAAA/wEAAf8A/wAAAP8BAAL/AP8AAAD/AP8BAAL///8CAgH+/wABAAAA////Af8BAAL///8AAf8BAAH/AP8BAAEAAAAAAAABAf///wEAAAAAAQAA/wAAAQAAAAD//wABAf8A/wEAAAAAAAD/AAAAAAAAAQABAAEA/wD/AP8BAAABAAD+AAABAQD//wABAAAA//8AAQD/AAEBAAAAAAEAAP//AP8AAAAA/wEAAQAAAAAAAQAA//8A/wEAAAEBAf//AAAA/wAAAf8BAAD/AAEAAAEB//8AAQD/AP//AAAB/wAAAQAAAAEAAAAAAP8AAQEA/gABAP//AQEBAAAAAAAAAQD+/wADAQD///8AAQH//wEBAQAA/////wABAAAAAAD/AQABAAAAAf8A/wEA/wD/AQAB/wAAAf///wEBAf8A/wEAAf8AAAEAAAAA//8AAQAAAQEB/wAAAAD//wAAAQD//wABAQD/AQABAAAA/wD/AP8AAAAAAQAA/gEAAQAA/wABAAD/AgAA/wAAAP8BAAAAAQAA/wEAAQAA/wD/AAABAf//AAABAAEAAAD//wABAAD///8AAQAAAAEBAAAAAAD/AP8B/wEAAgEA////AAAAAf8B/wHEmBvYAAEAAElEQVQAAQD//wEAAP4BAAH/AAACAAD/AAD/AAAA/wABAQAAAAD//wABAQAAAAH///8BAAAAAQAAAAAAAAABAP//AAH/AAAB//7+AQEC/wAAAQH/AAABAAD/AAABAAAAAAD/AAAAAAABAQEAAAD//v8AAQABAQAAAAAAAAEA////AAAAAAAAAAEBAQAB/wD/Af8BAAAA/wD+AQAB/wAAAQAA/wAAAQEA////AAABAAAAAAEAAP8AAAD/AAABAQAAAP///wEBAAAAAAEAAP8AAQAA/wAAAQABAAEA/wAAAAAAAQD//wAAAQABAAD//wABAAAAAQAAAAAAAAAAAAAAAAAA/wDJyMmTkpe6urvs7usAAAEAAAECAAD/AQEA/wAAAQD/////AP8AAP8AAP8AAAAAAAAAGwgBdy3/CQAAAgAA/wAA/gEAAAAAAQAA/wEA//8A/gEAAAAA/wAAAAEB/wD/AQAA//8A/wEAAAEA/wAA//8A/wIA/v8AAQAB/gL//wAA/wAB/wH//wAAAAEA/wAA/wAA/wIAAAAA/v8AAAIA/wAAAQAA/wAA/wEAAAAAAAEAAAAA/wAA/wEAAAEAAAAA/wEAAP8AAAEA/wEAAAAAp84D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AAD///8AAQEBAP8AAQH//wAAAf8AAAEA/wABAP//AAEAAP8BAAH/AAAA//8AAQEAAAAA//8AAQEAAP4AAAEB/wH/AgAB///+AAAB/wAAAQEAAP8AAQEA/wAAAP8BAAD/AAAAAAAAAAAAAQEA//4A/wEAAQAAAAEB////AQAAAAAA/wAAAgEA/v//AQACAAAAAAEAAP//AQAB/wH/AAAAAP8AAQEAAP8A/wAAAAAAAQEA/v//AQACAAD/AAAA/wAAAQAA/wAAAQEAAP8AAAAA/wAAAQAA/wABAAD/AAD/AAEAAf8B/wABAQAAAAEAAAD/AP8AAP//AAAB/wD/AgEB/gAAAQAAAAAA/gAAAf8AAQEA/wAAAQAA/wAAAQAAAQAA/gD/AQABAAAA/wD/AAAAAQEBAP7/AAEBAAABAf79/gABAAH/AP8AAAABAAD/AAEB//8AAQABAAD+AAABAAAAAAAAAP8BAAH/////AQEBAQEA//4BAQD//wAAAAAAAQEBAAD//wAAAAH/AP4CAAD/AAIAAf8A/wEBAP8A///+AQEBAAABAAD/AAAAAAAAAAH/AP4BAAEBAP8AAAH+AAABAQAAAP8A/wAAAAEAAAABAf/+/wEB//8BAgAA/gD/AQD/AAAAAAECAP7/AAEAAAEAAAAAAQAA/wAAAAAAAP8AAAEA//8AAQAAAAAAAAAAAAEB/wD/AQAAAAD/AP8BAAAAAAH/AAAAAQAB/gAAAAABAf/+AAEB/gD/AQABAQD/AAAAAP8AAAEBAP///wEAAAAAAQEBAP8AAP//AAEAAf8A/wECAP/+/wAB/wEAAv8AAQEA//8AAAEAAAAAAAD/AAAAAAEBAP////8AAQAAAAABAAEAAQEA/v//AQABAAD///8BAAAAAgEA//8AAAAAAQAB/gD/AAH/AAABAgAAAAAA//8BAAH+/wABAf8BAAAAAAH//wD/AP8BAQABAAH/AAAAAP8AAAEAAP8A/wEBAAD/AQAAAP8A/wEAAAAAAAAAAQAAAAAA////AQACAAH/AAAA/wAAAf8BAAH/Af8A/wEAAQAA/v8AAAAAAgIB////AAAAAP8AAAEBAAD/AAAAAAAAAAAAAP//AQEAAAAB/wAAAAAAAP8AAAIA////Av8B/wEBAP//AAEAAAD///8BAAEBAAD/Af8AAQEA//8A/wEAAAAAAQAA/wAAAQAAAAAAAQAA/gAAAAAAAf8AAAIBAP7/AAEAAQAA/wAAAAAA/wAAAf//AAEBAf8A/wAA/wEAAgAAAAAB/wD/AAEAAP8AAAAA//8AAQAAAAEAAP8AAAEBAP///wEBAQD/AAEBAP8AAAAAAAD/AAAAAAEAAP8AAf8AAAEA/wABAQD/AAABAAAA/wAAAQEA/wAA////AQEBAP8AAQH//wABAAAAAf8AAAEAAP//AAAA/wAAAN7e3sbEyMzNzuPi4/Dw7wEBAs/P0O/x7gABAAD/AAAAAAEHAQB9L/8WBQAB/wAAAQAA/wABAgD+AAAA/wD/AAD/AQD/AQABAAD+AAD/AQAAAAEAAf8A/wD+AAAAAQD/AAAA/wD9AgD/AAAA/wD/AQD/AQEAAf/+AQAAAAD/AAD/AQAA/wD+AgAAAQD+AQAB/wD/AQAA/wD/AQAAAQD/AAAAAQAAAAABAAD//wD/AgD/AQABAQABAAD+AAD7/wCgyQLl8P8A/wAAAJsHD177BQACAv//AAIA//4AAP//AdkB/Zz/+qb+9O0A/wABAAD/AAAAAQABAAAAAAEOBv8mFwAiEwAcDwIBAv8A//8AAAABAgEDAf/+AAABAgECAf8A/wD/AQD2+wDu+QDt9QHs9ALn8gDu9QD2+P8AAAEAAAAAAP8AAP8A/wAAAQEAAAAAAP8AAAAAAQAA//8AAAAAAAEAAQAA//8AAAEAAAEAAf8AAP8A/wEAAQEA/wABAf////8A/wAAAQEAAAAAAAEAAAAAAAAAAAABAAD//wAAAQAA/wAAAQAA/v8AARkWGCgpKRISESIhIRocGxobGhkZGSgpKBISEgEAAAAAAAACAQD/AAEAAAAAAP8BAAH/AP8AAAAA/wEAAP8AAQAA/wAAAAAAAQAB/wAAAQAAAP/+/wEBAAABAf///wEAAAD/AAECAP//AQAB/wD/AAABAAD/Af8A/wIAAf8BAAD/AAAA/wABAAD/AQAB/wD/AAAAAAAAAQAB////AAAAAAAAAQH//wABAAAAAAAAAAABAAD/AAABAAD/AAAAAAAAAAD/AP8CAAH/AQAA/wAAAAABAQD//wAAAAAAAQAAAP8B/wAAAQH//wAAAP8AAAH/AAAB/wAAAv8A/wEA/wAAAQAAAAAAAP8A/wIBAv//AP8A/wIAAP8BAQAAAAD///8A/wH/AP8AAAABAQAAAAEAAf8A/wAAAQAA/wAAAAEBAP8AAAAAAAIAAAAAAP//AAAAAP8BAAEAAQD+/wH+/v7/AQEA//8BAAEAAAAAAAAAAQAA//8A/wAAAf8AAAAAAAEAAAAAAAAAAAH/AP8AAQAA/wACAQD+/gAAAgAB/wD/AAAAAP8BAAH//wEBAf8AAQAAAAAA/wAAAAAAAQD//wABAAAB/wD/AgD/AAAB/wEAAP//AAAAAP8AAAEBAAD//wAAAf8BAAEAAQH///8A/wAAAQAAAAABAQAA/gAAAAD/Av8B/wEA/wAAAf8AAAIAAP//AP4BAAP/AP8AAAAA//8AAAEAAf8A/wAAAQAA/wEBAf//AAEBAP//AAEBAAAAAAH/AP8AAP8BAQEA//8AAAH/AAAB////AQEAAP8AAQIAAP8AAP8B/wH/AAABAAAAAP8AAAL/Af8B/wAAAP/+AAEC//8AAQH///8AAAACAQL+AP8BAP///wABAAEAAf//AAEAAAAA/wEBAP7/AQEC/wD+AAAAAQABAAD/AQAC/wD+AAAAAQAA/wAA/wAAAP8AAQEAAAAAAAEBAP8AAAAAAAAA/wD/Av8A/wEAAP8BAQH///8BAQD//wEBAP//AAEBAQAA/wAAAAAAAQAA//8AAQAAAAEA//8AAAD/AAABAAH/AP8A/wAAAQEBAAABAP//AAEAAP8AAAD/AAEAAAAB/wEAAQD/Af4B/wIAAP//AAABAQD///8A/wEBAQAAAP8AAAEAAAAAAAAAAAH/AP8AAAABAAEAAP8AAP8AAAH/AAAAAAAAAAEAAP8BAAD+AAABAAAAAAEB////Af8AAAEB/wAAAAAAAQD/AP8BAAD/AQEAAAAB//8AAAAAAAH/AAAB//8AAQH/AAAAAQAB/gAAAQAAAAAA//8AAAIAAQAAAP8AAAABAAD/AQEA//8AAQAA/wAAAAAAAAAAAQAAAP8AAAH//wABAAABAQEA////AAEAAP8AAP8AAAEAAAABAAD/AQAB/wEAAP8AAQH///8BAQD//wEAAf8BAAEAAP8AAAH/AAABAP8A/wEAAAAAAAAAAQD/AAAAAAAAAP8BAAH///8BAQEAAAAAAAAAAABfXGCipaYAAP4AAAEAAP8AAAAAeS4AIggAAf4BAAL//wEA/wAAAQAA/wAAAAAA/gAA/wAA/wAAAQEA/wEA/wAA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AO7x//L0AP//AAAAAAAB/wAAAQAB/wAAAQD//wD/AQAAAAACAAD/AQAA/wD//wABAAD/AQD/AAAAAAABAQAA/wAAAQD//wAAAgAA/gABAAAAAAAAAgD//gD/AQACAAAAAAAAAAD/AAD/AAABAAAAAAAAAAAAExEULi8tICAhHyAfGhsaHh8fIiMhISAgAgAB/wEAAAEAAP8A/wAAAQEAAAAB////AAAAAAEAAQABAQD///8A/wABAQD/AQAB/wAAAAD/AAEAAP8BAAD/AAEA//8BAgD//wAAAAAAAAD/AQACAAAA/wD/AAAAAQEA//8A//8AAgEB/wD/AAAAAAAAAP8BAQH//wAAAAAAAAAA/wEAAf8B/wD/AAEAAf8AAAEAAP//AAAB/wAAAQAAAAAAAQAB////AAEBAAH/AP8A/wD/AAABAQAAAQAAAAAA/v8AAAD/AQIBAP8AAAEA/v//AwEC/wAAAP//AAH/AAACAP//AP8AAQEA/gEAAf8AAAEA////AAABAQAAAAEBAP///wD/AP8BAAEAAgAA/wEAAP//AAEB/wABAf//Af39/gEBAAAAAAAAAP8BAAD/AAEAAAAAAQAA/wD/AAACAAD/AAD/AP8BAAABAAD/AAH/AP8BAAAAAAAAAAEAAP8AAAEAAAAAAP8AAAAAAAEA/wABAf//AAABAAD+//8BAAH/AAAB/wAAAgAB/wD/AAEAAf//AAABAAEBAf/+/wABAAAA/wH/AgAB//8AAQEA//8AAAEBAf//AAAA/wIBAP//AP8A/wEAAAAAAf8B/wD/AQH/AP8AAAEB////AQAB/wEAAQAA//8AAQEA/wABAQD/AP8A/wAAAQAAAAEAAP////8BAQH//wAAAgEAAAAB/v8AAQEAAAABAP/+AAAB/wEAAAD/Af8B/wAAAAEAAQD///8CAQD/AAEBAP/+AAEBAAAAAAAAAAD/AAAA/wABAQD/AAAAAAAB//8AAQEAAQABAAD+/wEBAP7//wAAAQEBAAD/AAABAQD///8B/wAAAQAAAAEA/wAAAQD/AAACAP/+/wAB/wAAAgEBAP///wAAAQEA/wAAAQD///8BAAAAAQIAAAAAAP8AAP8AAAAAAAD/AAAB/wEAAf//AAEBAAAAAAEB//7/AAEAAf8A/wD/AQEBAQAA//8AAAEAAP4A/wEAAAEAAQAAAAAA/wAAAQAAAAAA/wD/AQABAAAAAP8AAAEAAAAA/wAAAQAAAQAA/wAAAP8AAAIAAP8AAAAAAP8AAAAAAQEA/wAAAP//AQAB/wAAAAAAAAAAAAAAAAD/AAABAAAAAAABAAD+AAABAAAAAAAAAAEAAP8A/wH/Af8AAAEBAAAAAP8AAAAAAAH/AAAAAAABAP8BAQD//wEAAAAAAQAA/wAAAP8BAAD//wAAAQEA//8AAAEAAf8AAAAAAAABAAEAAf/+/wIBAP8AAAAAAQEAAP8B/wAAAQAA/wD/AAAAAAABAQH//gAAAv8AAAAA/wAA/wABAQD/AQAB/wAAAAD/AQAA/wEBAAAAAAD/Af8B/wEAAP8AAQAAAAEAAP4A/wH/AAEBAAAAAQAAAAD/AP8B/wEAAAAAAAAAAP//AbSxsU9RVP8AAAAA/wAAAQEA/wBSH/9NGgD9/AAAAAD+AQABAAAAAAD/AAD/AAAAAAD/AQAAAAD/AAAAAgEAAP//AAD+AAD/AQD/AAD//wD/AAD/AAD/AQD/AQAAAQD/AAD/AgD/AAAAAgD//wD/AQD/AQAAAAD+/wAAAAD/AQAAAQAA/wD/AgAA/wD/AQABAQAA/wD/AAAAAQAAAQD/AAAAAAD//wABAwDD3gC82QEAAQAA/wAAAQAAAAACAg8AAYYCCGABCgX9/v8BAf4B/wEBAf0AAAAC//4AAf8AAtL/+63++aj++Oj+/v8A//8AAAACAgD+AAAA/wABAAEAAP8QCQAnFwAlFAAXDwAHBAACAgAAAAABAgAAAAACAwABAQABAAAAAQACAwAAAQACAQABAQD/AQACAQABAAD/AQAAAQABAQAAAAD5+wDu9gDq8gD7/QHx9QD1/QDw8wD0+AD+/wEGBP/u8v/7/gH09/8AAAEAAP8A/wAAAAEAAAAAAAEA//8AAAAAAAEAAf8AAAAA/wAAAAAAAQAA//8AAQEA/wAAAAAAAAEAAQEA//8AAAAA/wAAAgEA/wAAAAAAAAAAAAAAAAAAAgAA/wAAAQ8OECwtKyYnJiYmJSgrKSsqKiAhIQH///8BAQEAAP8AAAAAAAEBAQAA////AAABAQD/AAAAAAEAAAABAAAA/wAAAP//AAEAAAAA/wAAAf8AAAEBAAAAAAAAAAD/AP8AAAEBAAEAAf////8AAAEA/wAAAQAAAAAAAP8BAQH/AP8AAAEAAAAAAP8A/wEAAAAAAQAAAAEAAP8BAAD/AAAAAP7//gIAAQECAQD///8BAAD/AQAA/wAAAAD/AAAB/wAAAQAAAAAAAQAA/wAAAP8AAAEAAAABAf/+AAAB/wEAAAH/AP4AAAEAAAABAP8A/wEBAQAAAAD/AAAAAAABAf///gEAAf8A/wEAAQABAQAA//8AAAD/AAEAAAABAP//AAAAAQAA/wH9/v4BAAAB/wD/AQAA/wAAAQAAAAD//wAAAQACAAD/AAEAAP8AAAAAAP//AAAAAAABAAAA/wEAAQEAAP//AAABAQH//wABAAD///8AAQAAAAAAAP8AAQIB/v8AAQD/AP8BAAH///8AAQIAAAABAQAA//8AAAD/AAAA/wAAAQABAAAAAAAA/wAAAQD/AAABAQAA////AAACAAL/AAAAAAD/AP8AAAECAP//AAEAAP8AAAD/AAAA////AAECAAAAAQAAAAD/AAABAP///wEAAP8AAAAAAQAAAAEB/wD/AQABAQD//wABAQAA//8AAAAAAAAAAAEAAAD/AAABAAD///8CAQH+AAABAAD//wABAQAA/wAAAP8BAQH/Af8A/wEAAP///wABAQH+//8BAQAB/wD/AAEBAAD/Af8BAAH/AAEAAP4B/wL/Af8BAAH///4BAQEAAAEA//8AAQD///8AAAEBAP8AAP//AAIBAAD/AQAAAAAB/wD/Af8AAAABAQEA/v//AQAAAAEAAAEAAP8BAQD//wAAAAAA/wABAQD/AAABAAAAAP//AAEAAAACAAH/AQD///8BAAAB////AQH/AQABAAD///8BAQH+/wABAAAAAP8A/wACAgH//wABAP/+AAEAAQEB/wD/Af8B/gD/AQAAAQAA/wAAAP8BAAAAAAH/AAABAAAAAAAAAAAAAAAAAP8AAAH/AP8BAAEA/wAAAQD/AP8BAAEAAAAAAAAA////AQAAAQIA//8BAAD/AAAAAAABAAAA/wD/AQABAAAA/wD+Af8BAAAB/wAAAgEAAAEA/v//AQAAAAABAAAAAAAA/wD/Af8A/wEBAAD/AQABAQAAAAAAAAAAAAEA////AAEBAP//AAABAQEA//8AAAAAAAAAAAABAAAAAAD/AAABAAD/AP8AAAIBAf//AAAA/wH/AP4CAAH/AQAA/wAAAQEAAP8AAAEA//8AAQEBAP8AAAEA/wD/AQAB//8AAAH/AP8AAAEBAQAAAAD/AAABAP8AAAH///8BAAD/AQAA/wEAAQDj4OI1Njfq6+sAAAABAAEAAAABKxD/cCX/AP8AAQAA/wEAAAEAAP8A//8A/wIA/wAAAQEA/wAA//4A/wMAAAAA/wAA/gAAAQEA/v8A/wAA/gEAAAAA/wEAAAAA/gEAAAAA/wEA/wAA/wEAAAIA/wAA/wEA//8AAQEA/gEAAP8A/v8AAQIAAQEA//8A/gAAAAEAAQEA/wAAAAEAAAAA/wAAAAEAAf8A7/kAos0A7fQAAAABAAAAAQH//wABAgH//wABAACCBgp5/Qj+/wD/Av//AAD/AAAAAQH/AAH9AAD+AQD/AADbAP+2A/q4/PnI+vgAAQEA////AAAAAQMAAf8AAQEA//4BAwP/FgwAIxQAIRMAGhIABgQAAQAAAQQAAP8AAgAAAAIAAQEA/wEAAgEAAwMA/wAA/wAAAgAAAQMAAAAA/wAAAAEAAAIAAP8AAQIAAAAAAP8AAAAAAAIAAQEBAQD/AAIA+PoA+PsA7PMA+/0A+PoA9vgA6PAA7vYA/fwB/P0A+voA/QAA+foA8/cA/v4AAP8BAAEAAP//AAEAAAABAP8AAAEBAP//AAD/AAAAAAAAAP4AAAEAAAEBAAABAAH/AP8AAP//AAIAAAABAP8BAAD/AAAAAAEAAAEQDxIsKycoKislJSQtLi0oKSgeHhwA/wEAAQD/AAEBAAAAAP//AAAAAAABAAEAAf8AAAH///8BAQAA/wAAAQAA/wAAAQAAAAAA/wAAAAAAAAAAAAAAAQAA/wABAAD/AQAA/wH/Af8BAAEAAAD//wAAAAABAP8AAAEAAP4AAQEBAAD/AAAA/wAAAAAAAAAAAAEAAQAA//8AAQEB////AQAA/gH/Av8B/v8AAgEA/wAAAAAAAQEA//7/AAABAAEAAAAAAAAAAAD/AAAAAAABAAD/AAABAAAAAAH/AP8AAAAAAAEAAP8AAAEBAP8AAAD//wABAQD/AAAAAP8BAAIAAP///wABAAAAAgD//gAAAQAB/wAAAQEB/f79AQECAP//AAAAAP8AAQH//wEBAP8A/wAAAQAAAAAAAAEAAP7/AAEA/wAAAf8BAAD/AAIAAAAAAP8BAAH///8AAQABAAEBAP7+/wABAAEA////AQABAQEAAAEAAAAAAP4AAAEAAAAA/wEAAP8AAAD/AAAAAAAAAAECAf////8AAQEBAAEAAP////8AAQEA/wD/AQEBAAAAAP8B////AAEBAAD+AAAAAQECAAD///8AAgEA//////8AAQIB//8AAAEAAf8A//8AAAL/AAABAP8BAAH/AP4AAQIA//8AAAEAAP8AAAD/AQABAAAAAAAA////AAEBAAAAAQAA////AQEAAAABAAAA////AQEB/wAAAAABAP4AAAH/AAAAAQD//wEBAAAAAQEB///+AP8BAAEAAQAAAP8AAQAA/wEAAP8AAAAAAAEAAAAAAAAAAAAAAQABAAD///8AAAAAAAH///8AAAABAQH/AAAA/wAAAQAAAP8BAAIBAP/+/wEBAf8A/wAAAAABAAD/AAAAAAEAAf8AAAAAAAAAAAAA/wAAAP8AAAEAAAAAAAAAAQAB/wD/AAD/AAAAAQABAP8A/wH/Af8A/wEAAAD/AAABAAABAAAAAf///wEBAAABAAD+Af8A/wABAAEAAAH/AQAAAAAAAP8BAAAAAAAA//8AAQD/AAEBAAAAAAEBAAD/AP4AAAEAAAD//wAAAAABAP8BAAH+AAAAAP8BAAEA/wD+AgACAAEBAP7/AAEAAAEAAP8AAAAAAAD/AAAAAAABAAEA//8AAAAAAAABAQH///4BAQL/AP///wABAQAAAQEA//8AAAAAAAEAAP8A/wABAQD//wAAAQABAAEAAAAA////AgAA//8AAAIAAP8AAAD/AQAB/gEAAQAAAP8A/wABAP//AQL/Af8B/wEAAP8AAQAAAAEA//8BAAH/AP8AAAABAAEAAAAAAP//AQAAAAAA/wEBAQAA////AQAAAAEB/gAAAP//AQEAAP8AAAABAAEAAQAA/wD/AQABAAAAAAAAAAAAAAAA//8AU1JUr7CwAAD/AQAB/wAAAAoEAHssABYEAAEBAAABAP8AAP8AAAD/AP8BAQAB//8AAAAAAP8BAP7/AAABAP8BAAD/AAABAP4BAP8AAP4AAAAAAP8BAP8AAAABAP8BAP8BAP//AAABAP4BAAAAAP8AAP8AAAABAP4BAAAAAAABAAH/AP4CAAD/AAAAAP8BAAEAAAABAP4AAAAAAAIBAP8BAPf6ALrfAM3gAAABAQAAAAD//wABAAAAAQEA//8AAAAABQEAegUJdAAJBv0B/wIAAAABAAD/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AAEAAP8A//8A/wEAAP8AAQEA/gAAAQEBAhMSEi4uLi4uLigpKSgqKC4tKg8OEQABAP8AAAAAAAAAAAAAAAEBAQAAAAD/AAAB/wD/AAEBAP//AP8BAQL///8BAQD/AAAB/wAAAAD/AAABAQH///8AAAAAAAAAAQAA/wABAAAAAAH/Af8A/wABAP//AAEBAQD/AAAA/wAAAAD/AAABAAAAAQAAAAAAAAAA/wAAAQAAAAAA/wAAAAABAP//AAH/AAAB//8AAQABAQD+/gABAQEAAAAAAAAAAAAAAAAAAP8AAAEAAQAA/wEBAP///wAAAP8AAQEAAAD/AAABAQAAAAAA/wAAAP8A/wIAAf//AAAAAAABAAH+/f7/AAACAgD//wAAAQAA/v8AAgEA/wAAAAAAAP//AAABAAEA/wAAAQAAAAAAAAAAAP8AAAEAAP8A/wAAAQAAAAAAAAH/AAABAAAB/wD/AQAAAAEA//8AAgD//wAAAAABAAD/AP8BAAIAAP///wAAAAH///8BAv8BAAL///8AAf8BAAEAAAAAAAD//wAAAQAAAP8AAAAAAAEBAAAAAAAAAAD+AAECAAAAAP8AAAD/AAAAAAAAAAAA/wABAf//AAAAAQEB/wD//wAAAQEBAP8A/wAAAgD//wAAAAAAAAABAAD/AP8AAAEAAP8AAAEBAQAA/wH/AP8B/wEAAv///gABAP8AAQEA//8BAgH///8AAAEAAAAAAAAAAP8AAQEA//8A/wH/Af8AAAEBAAAAAP8AAAH//wABAQD/AP8B/wH/AQAB/wD/AgAB/wD/AAEAAP8BAAAAAQAA/wH///8AAQAAAAEA//8BAQD/AAAAAP8AAAEAAAABAQEA////AAAAAP8AAAABAAAA/wAAAQABAAH+Af8A/wEBAf///wABAAD/AQAA/wEAAP8BAAAA/wAAAQD/AAABAAEAAP8A/wEAAQAAAP8A/wD/AQAB/wD/AQABAAH/AQAA//8BAAEAAAD/AAAAAP8BAAEAAQD//gABAQD//wABAQD/AAABAAD/AP8AAAABAAIAAP8AAAAA/wAAAQD/AAABAAABAAH+Af8BAAAA/wD/AAAAAP8BAAD/AAEBAP8AAAEBAAD//wAAAAD/AQAAAAEBAP7//wEBAQD/AQAA/wEBAP8AAAD/AP8BAAEAAAEAAP////8AAQEBAAAAAP//AQEB/wAAAAAAAAD/AAABAAABAAD//wAAAQEAAP//AP8AAAEAAAAAAP8CAAL+AP8AAP8BAQEA/wD/AQAAAAAAAAEB//4AAAD/AAEBAAAAAAEBAQD///8BAQD+/wABAQAB/wD+//8BAgIA//8AAAAAAP8AAQEBAAEAAP8AAAD//wD/AAECAP8AAQAAAAEAAP///wABAAH/Af8BAAAA/wEAAP7o6eo3Nzrj4uH/AAEAAAABAAACGAj+dij/DwYA//8AAAAA/QEAAP8AAAIA//8AAAEAAP8AAAEA/gAA/wAA/wIAAP8A/wAA/wEA/gAAAQIA/wAA/gAA/wAAAAAA/wEA/wEA/wAA/gEAAQIA/v8AAAEAAAEA/wAA//8A/wEAAQEAAAAA/wAA/wAA8vsA4PEA3fAB/f7/BgQABAEA8PUA3ewA+vwAAAMAAP4BAAD/AAAAAP8AAAEAAAEAAAAAAQAAAAMAAf8A/v8AAQIoAf+YBQw4/wYCAf7+/wAA/wH8AwD+/wH9AQD/Af/9AAABAQL+AAD/AAABAQH/AwLtBAbU//3D/PnJ/PfT+vj4/v0A/wD/AQAAAP8AAAIAAQAA//8AAf8BDgn/KBoAJRcAIBcACgcAAQAA/wEAAQAAAQEAAAAA/wAAAQIAAQAA//8AAAIA/wAAAAAAAgIA/wEAAf8AAAAAAQEAAAAAAAMAAf8A/gAAAAAA/wAAAAEAAQAAAQEA/wEAAAEA/wEA/wAAAgAA/gEAAQAA/wAA/wEAAgAAAAEAAAAA//0A/wMAAgIAAP8BAQH/AAEA+/wA5+wB8PQA7PP/8vMA7/YA6u4B7/AA/v4AAP8AAAEBAAAAAAAAAAD/AAAAAAAAAP8AAAD/AAEAAP8BAAH/AP8BAAAAAP8AAAH/AAADAAMmJyYtLS0pJygqLCk1NzYgIB7//wEBAQD/AAABAQAAAAAA/wAAAAABAQD/AAD//wEBAP8AAAEAAf8BAAD/AAEAAP8AAAEA//8AAQEAAP4B/wEAAf//AAIB/wD/Af8A/wEAAAAAAP8AAQD//wABAAEAAf///gEAAf8BAQAAAP8A/wEAAAAAAf8A/wEAAAAAAAAAAQAA/wAAAAAAAAD//wABAf8A/wEAAQAAAAD/AAAAAAAAAAABAf///wEBAQD/AAABAAAA/wAAAQH//wABAP8AAAEA//8AAQAAAAD/AQAB/wD//wABAQAAAAEB/v7+AAAAAAAAAP8BAAH+/wABAP8AAQH/AAABAAD/AAABAAABAQAAAAD///8AAAEAAAAAAQEA/////wABAQD/AAAB/wAAAQH///4AAAEBAP8AAQEAAP8A/wH/AQACAP///wIAAf8AAAAAAAD//wEAAP8BAf8BAAH//wAAAAD/AAAAAQABAAH///8BAAD/Af8BAAEAAAAAAAEAAP8AAAD/AAAC/wD/AQAA/wEBAP//AAD/AAABAf//AAEBAAAAAP//AAABAAEA/wAAAAD/AP8BAAEAAAAAAf8A/wEAAQAAAAEAAP7//wEBAf8AAAH/AAABAAAA/wAAAAEBAP//Af8A/wL/AP8BAP//AQAAAAEB//8AAAH/AP8AAAEBAQAAAAAA/wAAAf8A/wIBAf/+AP8BAAAAAAH/AP8B/wD/AQEB/wEAAf//AAAB/wAAAQAAAAEBAP8A/wAAAQAAAAH/AP8AAAD///8BAgH//wEBAP8A/wAAAQAA/wD/AAAAAQAAAAABAAAAAAEA//7/AQEBAP8AAQH//wEB//8AAf8A/wAAAQEAAAAAAP8A/wAAAQH///8AAAEBAgEB//7/AAD/AAEAAAEA//4AAQEA/wAAAAAAAP8AAAEAAP8BAQD//wEB/wD/AQAAAQAB/wAAAP8AAAAAAQEBAAD//wAAAQAB/wD+AP8BAQAAAAH//wABAAAAAQAAAAD//wABAAAAAQAA//8AAAH/AAAAAAEBAAAAAAABAv///////wABAP8AAQEAAAEAAP8B/wH/AQAA/wD/AAEBAQAAAP8AAAD//wAAAAAAAP8BAAH/AAACAAAAAf//AAIAAP//AAABAP8AAAEAAAAAAAEAAP4AAAIA//8AAQD/AAEBAQAA/v8AAAAAAP//AQEB//8BAQL/AAABAAD///8AAf8AAAEAAAABAAD/AQAA/wEBAP7/AAEB/wH/AQAAAP8AAAAAAQAB/wH/AAABAf///wAAAQEA/wAAAP8AAAEBAAAAAQD//wAAAQABAP//AAEBAP///wABAQH//wAAAQABAP//AAAAb3F0k5GS/wD/AAD/AAAAAAAAA0Yb/VcdAP/+AP8BAP//AAAAAAABAP8AAP4AAAAAAAAAAP8BAP8BAAD/AP4CAP8AAP8BAAAAAAABAP4AAP7/AAECAP7/AAABAP8BAP8BAP8A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AAAAAQD+/wABAwD/AAAA/wD/AQABAAABAgD/AAAA/wD/AAAAAgAAAAAAAAAAAQAAAAD/AAABAgAA/wD/AQACAQD/AAABAQABAAD/AAAAAgAAAQABAQABAAD/AQABAAABAQEBAgD/////AAIA///q7gDl6gLm6//k6//o7P/08gEAAP8AAQEA/wAAAQAAAAAAAP8A/wAAAQEA//8AAQAAAQIAAf8A/gAA/wAAAAEAAR8eIEhKRz0+PkVFRRMUEgD/AAD/AAACAAD/AQABAAEAAAD///8A/wEAAQAAAQAA//8A/wAAAP8AAgEB/wD/AQAA/wAAAf8A/wEBAAD/AQAA/wEB////AAEAAv8BAAAA////AAEAAQAAAP8A/wEAAAAAAQAA/wAAAf8A/gAAAQABAAH/AAAAAP8A/wAAAQEAAAAAAAAAAQAAAAAA/v8BAQEAAAD/AAEAAP4B/wH/Av8B/wD+AAABAAEAAAD/AAABAAAAAAD/AAABAP8AAAEBAP//AAH+/v0BAAH/AAAAAAABAAD+AAABAAAAAAEAAP//AAABAP8AAQEA/wD/AQABAAD/AAAB/gAAAQAAAP//AAAAAAEAAQEBAP7//wEAAQAB/wAAAAD/AQAB/wAAAQD///8BAAH/AAAAAAABAQAA/wABAAD/AAAAAf///wEB/wD/AQABAP8AAAH/AQAA/wD/AAAC////AQEBAP8BAAAAAAH/AP8BAAH/AP8AAAEAAAAAAQAAAAD//gEBAf8AAAAAAP//AAIB/wD/Af8AAAAB/wD/AAAAAQABAf8A/wD//wABAQH/AQEB////AP8AAAEBAAAAAAEAAQAA//7/AQAA/wAAAAEAAAAAAAABAAEAAf7//gABAQEAAAD/AAABAAAAAAD///8BAAEAAf//AAEBAAAAAAEA////AQAAAAAAAP8BAAH/AP8AAAAB/wD/AQEAAAAA//8AAAABAQH/AAABAAEA////Af8AAQEB/gAAAQD/AQAA/v8AAQAAAQEA/gABAf//AAAA/wEAAQEAAAABAP8AAP8AAQEA/wD/AAACAAD/AAEAAAD///8BAQD/AAABAQD//wABAP8AAAD/AAABAAAAAAIA//4AAQD/AAEBAP//AAEBAAD//wAAAQAA/wABAQD//wABAgD//wAAAAEB//8AAQD/AAABAAEAAP8AAAAA/wAAAAD/AQABAQAA/wAAAAD/AAABAP8AAAH/AAABAf8A/wEAAP8BAQD//wAAAQEA/wAAAAAA/wAAAQAAAAAAAQAA/wAAAP//AAEB//8AAQEA/wAAAQD///8BAgAA/wH/AAABAAAAAP//AAEBAAAAAAABAf8AAAH//wH///8CAQH/AP8AAAD/AAABAAD/AAABAAAAAAH/AAABAAAAAAAAAP8AAAAA/wABAQD/AQAB/wAAAAH+AP8AAf8AAAAB/wH/AQAB/wEAAP//AAABAQD/AAAC/wD/AQAAAAD/AAABAAAAAAD/AAEC////AQEAAP8AAAAA/wD/AQACAAD/AAEB//8AAQD//wEAAf8B/wH/AQAB////AQAAAAH///9hYGOioqEAAAEBAAD/AP8AAAACJxD+bSYABgIAAP4AAAAAAAEA/wAAAAAA/wEA/gABAQD//wAA/gAAAQIA/f8A/wEA/wIA/wAA/wAAAAAA/wAA/wEAAAEA/wAAAAAA/wEA/gEA/wAAAQAA/wEA/gAAAgAA/gEAAAAAAAEAAAIAs9oCyOL/AP8AAAABAAD/AP//AAAAAAAAAAEzMjMyMTAPDw/Bw8PLy8oAAAEAAAAAAAAAAAAAAAAANigAFQsAwtoA9PYAAAAAAAAAAAAB//45AgGOBQssAQX/AgL+AAD/AQD+/wH+AQD+AAH+/wD/AQEA////AQEAAQH9AAD+/wL+AP/+AQEAAQH/AAL9AQD8AQPiAQLd/vzW/PjV/vne/Prk/Pn/AQAAAAABAP8AAQEBAP4AAAD+CggAJBcAJBkAIRgAEw0AAgEAAAEA/v8AAgEAAAAA/wEAAf8AAAEAAAEAAAAA/wAAAwEA/v8AAAIAAQEA/wEAAAAAAAAAAAEA/wAAAAAA/wEAAAAAAAEA/wAAAQEA//4AAQEAAAEA/wAAAQEAAQEAAAEAAAAAAAAAAAEAAAAA/wAAAQMAAgAA/wEAAQAAAAEAAAAAAQEAAAEA/wAAAgEAAAABAAEAAQAB//8A8/UB5uwB6u7/4Oj+3eL/8/MAAP4AAAAAAAAAAAEAAP4BAAEAAAAAAAAAAAAAAAD/AAABAAEBAAAAAAABAAAfHyE/Pz40NDRBQUAnKigCAQL/AAAAAf8BAAD//wAAAAEAAf8BAAEAAAD/AAAAAP8A/wH/AP8BAQEAAP8B/wH/AP4AAAEBAQD//wH/AQABAAAAAAAAAP///gABAQAAAQAA/wABAAD/AQAB/wD/AAAAAAAAAAAAAP8BAAH/AAD///8BAQEAAAEAAAAAAP8AAAAAAAD/AAABAAAAAAAAAAAAAAD/AQAB/wAAAQH///8BAAAAAAAAAAAA//8AAQEAAAABAAH+AAABAf8B/v79AAABAAAA/wD/AAEBAf8AAAAAAAEAAP4A/wEAAAAAAQAA//8AAQEAAQAB/gAAAQD///8AAAEAAQAAAAAA/wABAQEAAP///wAAAQEB/wD/Af7//wEAAAAAAQACAAH///8BAQD+AAACAAD/AAAAAP8B/wH+Af8B/wEAAf8A/wEBAf///wAAAQEA/wD/AP8AAAEBAQEAAP8AAAAAAAAAAAAAAAEA//8BAAD+AAABAf/+AAEDAAD+/wEAAf4B/wEBAP///wEAAQAAAAABAf//AAEA/wH/AP8BAQAA////AAABAQEB/wD+AQACAAH///8AAAAAAQEB///+AQABAAD///8BAQEAAP8AAAAAAQEA/gD/AP8AAQAAAQIB/////wABAQAAAAAAAAEAAP8A/wAAAQAAAAAA/wABAQAA///+AAABAAD/AQABAAD/AAEB/wAAAAD/AP8BAQEA/wEBAf////8AAQH/AAEAAP8B/wAAAAAAAQEAAP8A/wD/AAAAAAABAQD//wEBAAAAAP//AAAAAQAA/wAAAQAB/wD/Af8BAAH/AAAA//4BAQMAAP///gEBAf8AAAAAAQAA/wAAAQEAAQAA/wABAP///wH/AP8AAAABAQAB/wEAAP/+AAACAAAAAQAAAP/9AAICAP///wAAAQAB/v8AAQEAAAD/AgEB/v//AAABAQD/AAAAAAAAAAABAAEAAP8BAAD/AAD//wH/Av8C/wD/AAAAAAEBAP//AAEAAP8AAP8BAAEAAQAA/wAAAP8A/wAAAQIAAP8AAP8AAAEAAAAA/wD/AAABAQEAAAAAAAAAAP8AAAD/AAAB/wABAgAA/wH+//8BAAAAAAEAAP7/AQEA/wECAP8AAQD//wAAAQABAAD//wAAAQAB/gD/AQAAAQD/AQAC/wAAAAD//wAAAAAAAQABAAD/AAAAAAAA/wAAAQEB/wD/AQABAP//AAAA/wEAAP4AAQIAAP8BAAH///8AAQEBAAD/AAD/AQAB/wAAAP8AAAH/AAACAAD/AAABAf8A/wAA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AgD//wMAAgIA/wL5+gTg5v/b4vrd4Prh4/8A/gAAAQAAAAAAAAEA/wAAAP8AAQAA/wEAAQEAAf8A/wAA/wAAARkXGDc4Nz8+QDs9OjExLwMEBQD/////AAABAAEBAQAA////AAEAAQAA/wABAP//AAAAAQABAAD//gAAAQAAAAAAAQAAAAAA/wABAQAA/v/+AgEA/wACAQH///8A/wAAAgAB/wAAAAD/AP8AAAIBAf7//wAAAAAAAP///wEBAAABAQH/AQABAAAA/wH/Af8B/wAAAf///gIAAQD///8AAf8BAAAAAAAA/wAAAgD//wH+/v4BAAD///8BAQH+AAEBAP//AP8BAAH/Af8BAAEA/wD/AP8AAAEAAAAAAP8B/wH/AQAAAP8AAAICAP//AQAA/wAAAAD//wABAQD/AAAAAP8AAAEBAAD/AP8AAAEAAP8B/wH/AgAA/wAAAP8AAAD/AAEC//8AAQH/AAABAf///wEAAAABAf///wEAAAAA/wABAgD//wAB//8AAQH///8BAQL///8BAAAAAQAAAAAAAAAAAAAAAAAAAAEA//7/AQEA//8AAAEBAQH/AP0A/wEAAQEB//8AAQEAAAH/AP8AAP8B/wH/AQABAAAAAAD/AAEBAP8AAP8AAQEA/wAAAAAAAAAAAAD//wAAAf8B/wEAAQD/AAABAAH/AP4BAAAA/wAAAQH/AAAAAAABAAAAAAAAAP8AAAD/AAAA/wABAgIA//8AAAD///8BAQIBAf///////wAAAgEC/wD+AAAA/wAAAQAB////AQEBAAD///4AAQIAAP8BAAEAAP8AAQH/AP8B/wAAAAH//wEAAP8BAQD/AQAA/wABAQAA/wD/AAABAP8A/wAAAQEAAP//AAAAAAEAAAABAAAAAAAAAAEAAP///wABAf8AAAEAAAEAAP8AAAD/AP8B/wEAAQEAAf8B/wD+AAAAAAABAAAA/wD/Af8A/wAAAQAAAAEBAAAAAf8A/wAAAAD/AAEBAP8AAAEAAAD/AAAAAAAAAAABAAAA//8AAQH/AAABAAAAAQAA/wAAAAAAAAD+AP8CAAEAAAEAAP8AAP8AAQH/AP8B/wEA/wAAAQAAAP//AAEBAAH///8BAAAAAQAAAf8A/wEAAAD/AAEBAQD//v8CAQAAAAAAAAD/AP//AAEBAQD/AAEB/wAAAAAA//8AAQABAQD+/wAAAP8BAQEA/wABAAD/AAABAAD/AP8AAAIAAf///wEBAP8AAQEAAP8A/wEAAf//AAAB/wD/AP8BAQIA//8B/wAAAQH/AP8AAAABAAD/AAAAAQEB/wD/AP8AAAEAAAAAAf8AAAEAAAAA/////wABAQEAAQAAAAAAAP8AAAEAAP8BAAHX1tdOT1Lc3NoAAAAAAAEAAAAAAAAADAMBVSL/OBQA/f0AAQIAAAAA//8A/wAAAAEAAP8A/wEA/wAA/gEAAAAA/wIA/gAA//8AAQEA/gAAAAAAAAEA/gEAAAEA/wAA/wAAAQEAAAEA/gIA5fUByOf/0OQA/QEA//4AAP8AAAAAAP4AAAAtLS2UkZI+QD0AAQIAAP8AAAEAAAAAAAD/AAAB/wDu7+9PT1HExMMAAAAAAAEAAAAAAAADJBb9aT0AAwAAAf8A3O4AtdcA3usAAP8AAP8AAAAAAP8XAgB3BAtcBAcDAAL+AgH+/wAAAQD/AAD//wH9AQAB/wH+AQD//wD/AAIAAQH7AAL8AQT9AQL9AAT9Af/9AQP8AgT9/wD+AAH9AAH+AAMBAQD/AAP+AQEBAQH/AQH8/v/o//zY/fXZ/PTa+vPf/vX2//wA/wEA//8AAgEAAAAA//8A/wAAEgwAHRUAGxQAJRoAGBQAAgIAAAAAAAEA/wEAAAEAAQAAAQEA//8AAAAAAAEAAAEA/wIAAf8AAAEAAAAAAAEAAAABAAD/AAIAAQEAAP8BAAH/AAEAAAAAAAAAAQEAAAEAAAAAAAEAAQEAAP8B/wL/AgABAP8AAAIA/wAAAgEA/wD/AQABAQL//gECAgAAAAIBAAAA//8AAQAB/wEAAAEBAAABAQADAAIAAf8C+/wA5usB5+z+4ej74+T85eT///4BAAAAAAD/AAEAAAAAAAAAAAABAAAAAP8AAAEAAAAAAAAJBwg/PUBGSEU8PDwxMzEDAwL/AAAAAP8BAAEAAQD//wEBAP//AQEB/wD/Af8BAAH/AAAA//8BAf//AAEAAAABAAD+/gABAQAAAQAA/wAAAQAB/wD+AQABAAAAAAD///8CAQL+AAAA/wABAP4AAAEA/wAAAQD/AAAA/wH/Af8BAAABAAAA//8AAQH/AAABAAAA/wAAAQD/AAAAAQABAP8AAAH/AAAB/v7+AQAAAAAA/wABAAAAAAD/AP8AAAH/AQAB//8AAAEAAAABAAH+AP8B/wEAAP8AAQAAAAEA//8AAQABAAD///8AAQABAAEA/v8AAgEA/wD/AAD/AQAA/wAAAQEB/wAAAgD/AP4A/wIB////AAABAAAAAP8AAQD/AAEA/wABAAAAAAAAAQAAAAAA/wAAAQABAQH//wAAAAAAAQAB//////8AAAH/AAABAAAAAAABAQD//wD/AQABAAEBAf8A/wD+//8AAAEBAP//AgEB/gD/AAABAAAAAAAAAAAAAQAA/wEA////Af8BAAEBAP//AAAA/wEAAf/+AAABAQEBAAAA/wAAAAD/AAABAAD/AAABAQAAAAAAAAAAAP8AAAEAAAEAAP4A/wEAAAAAAAEAAQAA//4AAQEA/wAAAQAAAAD/AAAAAAABAAAAAAAAAAEA////AQAAAQEA/wACAP7//wH/AAABAP8AAQEBAP//AAAA/wH/AP8AAAAAAAEBAQAAAAAAAAAAAAAB/wAAAAD/AP8AAAAA/wD/AgEB/wAAAQAA/wD/AQABAf8A/gD/AQEBAAAAAAABAP///wH/AAAAAAAAAP8BAQD/AQEB////AAIBAP8A/wAAAf8AAAEAAAD//wAAAQABAAD/AAEBAAAB///+AAABAQD//wABAv8B/wIA////AAAAAAAAAQAA//8AAAEAAAD/Af8B/wH/Af8B/wEAAQD//wEAAQAB////AQAAAAEBAP8BAAD+AAAB/wAAAAAAAAAAAgAA/wAA/wD/AQAAAAABAAAAAAAAAAD/AAABAAAAAQEA//8AAAAAAAAA/wD/AAAAAf8C/wL+Av8A//8AAAIBAP8AAAAAAAAAAAAA/wD/AAECAQD+AAABAAD///8BAAH/Af8BAAAAAAAAAAEBAP//AAEB/wAAAP//AQEBAAAAAAAAAP8AAAD/AAEAAAD/AAABAP8B/wD/AAAAAQEAAAD/AP8BAP8AAAEAAAABAAD/AAABAAAAAQD//wEA//8AAQEBAP//AAAAAAABAAD/AQEB//8AAQH//wAAAAABAAD/ube5W1pd7vDtAAABAQAA/wAAAAAAAAUCAD0XAEUcABAEAP7+AAEBAP8BAAAAAP7/AAECAP8AAP8AAP4AAAABAP8BAP4AAAAAAP4AAAAAAAABAAABAAABAP4BAAAAAO76ANjxANTqAN/vAP7+AAEAAAABAP/+AAAAAAAB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AQAAAgABAAABAQIBA/4A/wD/AgAAAAABAQAAAAAAAQD/AQACAQD+/wEBAAAAAAH/AQABAAIBAv4AAf8AAAAA//8BAAH/AQABAAH/AP8AAQEAAP8AAQEBAQH/AP8AAAABAAAAAgEAAAAAAAAAAP8BAQIAAQMAAAD/AAAAAQEBAQL/AQAB/wH+AQICAAD/AQEAAAIAAQH/AAD+/v/s7wDi5vvg4vre4fvp6AEAAAAA/wAAAQAAAP8AAAEAAP8AAAEAAP8AAAEAAAEAASAeH0NDQkpMSkNFRAwLDAECAAD/AP8A/wEBAf8AAQEA//8AAAAAAQAA/wD/AAAAAAEBAP//AQAB/wAAAAD/AP8BAAD+/wECAf///wEBAf//AAEBAAD/AAAAAAAAAAAB///+AQEB/wAAAAAAAQD/AQAB/gABAf///wEAAv8A/wEBAAD/AAAAAAABAP//AAEAAP//AAH+/v4AAP8BAAH+AAAAAAAAAQEB//8AAAAAAAD/AAAAAP8AAAAAAAABAAH/AQAAAAABAAAA/wAAAAEAAP8AAP//AAEB/wAAAQD/AP8A/wIBAP8AAv8A/wH/AQAB/wAAAAAAAP8AAAL/AP4B/wH/AAAAAf8BAAH///8AAAL/Af8CAAAA/wAAAAAAAQAAAP8A/wAAAAIAAf8AAQD+//8CAAH/AAAAAP8B/wH/AQAAAAACAAD/AAD/AP8BAAEAAP//AAEA//8AAQEBAP8AAAD/AAEAAAABAP8AAAH/AAAAAAABAAAA////AQEAAAEAAP4B/wAAAgAA/wAAAAEAAP//AAEBAQD//gAAAQAAAAAA/wABAQAA/wD/Af8B/wAAAQEA/wD/Af8BAAEBAAD/AP8AAAAAAAIBAQD///4AAAEA/wAAAQEAAP//AAACAAD+AAAAAP8CAAH/Af8AAAAAAAIA/v7/AAEAAP8BAQEBAQH+/v8AAQAAAAAA//8BAQL/AP8BAAAAAAEAAP4AAQH///8B/wD/AQEBAP8AAAEAAP///wAAAAABAAEAAf8AAAAAAAD/AAEBAAEA//4AAQEAAP8AAAEAAP//AAEA/wEAAf8AAAAAAP8BAAEAAP/+AAABAAEAAAABAQAA/wAAAf8A/wD/AAEAAP8BAAEAAQD//wABAAD/AAAA/wAAAf8B/wEBAf/+/wAAAgEB/gAAAQD//wAAAQACAQD//wEAAP8AAQAAAAD///8CAAEAAP///wEBAQD/AP8AAAAAAAH/AAABAP8AAAH/AQABAAD/AP8B/wEAAAAAAf8A/wEA/wAAAQAAAAAAAAD//wABAgAA/gH/Av8B/wAAAAAAAAEAAP8AAQAA/wD/AQEBAAAA//8AAQD//wEBAf8A/wAAAAAAAAAAAAAAAAEAAP4AAAEAAQAA/wAAAAAAAAAAAAAAAAAAAAAAAQEA/wABAAD/Af8A//8AAAAAAQEAAAAAAAEA//0AAAIAAAAAAAAAAQH///8B/wAAAgEAAAAA/wABAAD/AP8BAAD/AAD/AQAB/wAAAQEBAP8AAAD//wAAAAABAAC1s7VmaWrn5uT/AAAAAAEAAAAAAAAAAP8AAAAAFQkAMRUALBQAEQQADwUA/wAA/wAA/gAAAQEA/wAAAAAAAP8A/wEA8/wA7voA5/cA5/cB3fEA6vX//f8AAAAAAQEBAQD///0A/wEAAP8AAgAGBARZWFd/gYEgIB8A/wABAAD/AP8BAQEAAP8AAAAAAAH/AAAAAAAB//8AAQD/AAEAAADr6ulFREjS09IAAAAAAAEAAP8AAAEAIhQAZDoABgIA/gAAAAAA//8A7vYAttYA0+UAAAEBAAD/AP8BAP8AAABTBQdwBQonAgT8/v8AAgL/Af///wH+AQH/AAD/AAAAAAD//wH/AAL/AQL5AQT8AQb7AQT+AAD7AQP6AgL/AAL/AAH/AAEBAAH+AAL+AAL/AQD/AQQAAQH+AAH+AAABAAH+/wEBAAIBAQEAAAD//wDxAPzZ+/Hd+/Pb/PHa+fLvAPkAAP8AAAAAAAAAAAEAAP8AAAAAAQAAGxQAIxoAHxkBHxsADgwBAQH//gH/AwAA/wIAAAEBAQD/AAEAAAAA/wAAAgEB/gABAwH//gABAQEB/wEAAQAAAQD//wEBAQD+/wEAAP8BAAEBAAH///8BAgAA/wH+AAAB/wEBAgAAAAAA/wEAAAAAAAAAAQEB/wECAAABAAABAAH/AAEBAAAC/wEBAQEBAQAA/wECAf8AAAEB/gEBAP8BAAECAQIB/wABAQEA+fv94+f83N363+L43dwA/vwAAAEBAAD/AAAAAAEAAP8BAAAAAAEAAP8AAAACAQAwMTFNTExKSUovMS8GBgYAAAAAAAAAAQD/AAAAAAEBAP8AAP///wEAAAAAAQAA/wAAAP8BAAH/AAEAAP8AAP//AQEC/wD+AAABAQAA/v8AAQEAAAAAAAAAAAAAAAAA/wAAAQAAAAEAAP8A//8AAQIAAAABAAD/Af8A/wH/AP8AAAAAAP8BAAAAAQIB/v7+AP//AAEB/wAAAQABAAAAAP//AAH/AAABAAAAAAEA/wABAv7//wL/AAAB////AQABAAAA/wAAAQABAQH///8A/wABAAD/AQAAAAAAAf8A/wAAAAAAAAEAAAAA//8AAQAAAQH//gEBAQABAAAAAAD/AAAA//4AAAEAAAABAP//AQIAAP8BAAD/AAAA/wD/AAABAQABAAD+AAEB//4AAAEAAP8AAAAAAAEAAAD/AP8BAQH//wABAAAAAQAAAAD/AAAB//8AAAEBAQAAAAH//////wABAAABAf/+AAABAAAAAQL/AP8B//8AAgIB//7/AAEAAQAA//8AAAEAAP8A/wD/AQEBAAEAAP8A//8AAQEAAAD///8AAAEBAAD/AQAAAAAAAAAAAP8BAAH/AAAA/wAAAgAB/wD/AAACAAAAAAEA////AQAAAQD//gAAAQEB//4AAAEAAQD//gABAQH/AP8BAQAA/wD/AAABAAD/AP8AAAEAAQABAAAAAAAA/wAAAQAAAAAAAAD//wAAAP8AAAAAAAEAAAECAP//AAD/AP8AAAAAAAIBAP//AAABAAD/AQAA/wAB//8AAgEAAAAAAQAA/v8BAAD/AQIAAP///wAAAAAB/wAAAf8AAQD/AAEA//8AAQEAAAABAP8AAAH///8AAQEAAAAA/wACAQH/AP8AAAAAAAAAAAAAAAAAAAD//wACAQD/AAAA/wABAQD/AP8B/wH/AQEA/gD/Af4BAQAAAAH///8AAQAB/wEBAAD/AAEAAf8BAQH//v//AQAAAAAAAAAAAAEAAAAA//8BAQAB/wD/AQAAAAAAAAEAAAAAAf8A/wAA/wAAAAAAAQABAAD/AQAA/v8BAQH//wAAAQAAAAEA//8AAQEAAP8AAP8AAAEAAAABAAD/AAEAAP8AAP//AAEBAAEA////AQABAAAAAAAAAQEA//8AAAABAAH/Af8A/v8AAQEBAQAA/wH/AQAA/wAAAP8AAAAA/wAAAQABAAD/AAAB/wD/AQEAAP8AAQEA//8AAAAAAAEBAP///wEAAgD/AAAC/wAAAQD/AAAB/wAAAQD/AP8Ay8rK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//8CAAEAAAEBAAEAAQABAAEA/wECAAAAAgEBAAICAAAAAQEDAQD65ef2z9L30tP65+QBAAD/AAAAAAAAAAAAAAEAAP8AAAMAAP4AAAACAAElJSNLTExWVVU3ODf/AQAAAAAA/wAAAQAA/wEAAAABAP//AAAAAQABAAD//wEAAf8AAAD//wABAAABAQH+//8CAAD+AP8BAAEAAAEAAP//AAEAAAABAAAAAAAA//4AAgEAAAH/AP8BAAAA//8AAQH//wABAP8B/v7+/wD/AAABAAD/AgAA/gAAAQAAAAEBAAAB////AQEA/wAAAf7//wEBAQAAAAH///8BAQAAAAAAAAEA//8AAAAAAP8AAQIA////AQABAAAA/wAAAQD/AP8AAAEAAAAB/wD/AAABAQAA/wD+AAACAAABAAD/Af8A/wAAAQEAAP8A/wIAAf4A/gH/AQAAAAAAAAAAAAAB/wAAAQAAAAAAAQEAAP8A/wAAAP8AAAEAAAAAAQAA/wAAAAAAAQAA//8AAAEAAAAAAQAA/wD/AQAC////AAEBAP//AQEA/gAAAf//AQEBAP8A/wEAAAD/Af8BAAH/AAEAAAD/Af4BAAEB/gAAAQEAAP//AP8BAAEAAAABAP//AAIA//8AAQD//wABAAAAAP//AQEA/wABAQD/AAAB/wAAAQH///4AAQEAAP8AAAAAAAEBAAAA/wAAAAD/AAEAAQAB////Af8B/wEAAQH///8BAAAAAAAAAAAAAAEBAP8AAf///wEAAAAAAQAAAAAAAAEA/wAAAP8AAP//AAEBAAD/AP8BAQEA/wEBAP/+AAAB/wD/AQABAAD/AAABAP8BAQEA/wD/AQAA/wAAAQAA/wAAAQEAAP8AAAAA/wD/AP8BAQEA////AAABAQEA////AAEBAAAAAAAAAQH///8AAQAAAAABAAEAAP8A/wAAAf8AAAEBAAD/AAAAAQD//gECAQD/Af///wEBAf8A/gEAAP8AAQAAAAAAAAAAAP//AAEA/wABAQAA/wAAAQAA/wABAQD//wABAQH/AP4AAQEA/wAAAAEA//8AAAAAAQAAAP8AAAAA/wEAAQAAAAAA/wEAAf//AQEB//8B/wD/AAEAAQAAAP8A/wAAAQAAAAH/AP8B/wAAAAAAAQAAAAD/AAAAAQAB/wAAAAD//wAAAQAB/wAAAQAAAAEB/v//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AAD/AP8ADQsAJR0AKSQAKCMCDQ8AAAABAAD/AQEBAQIBAQECAQABAAAC/gEDAgED/gIBAAEBAf///wADAAADAAMB/wEBAAAAAP8B/wEBAgEA/gABAgAA/wEAAQAAAAABAAH+/gACAgEA/wD/AAEBAQAA/wAAAP8AAAEAAgEAAQEB/wD/AAECAQH//wABAAEAAQAAAAD/AQEBAAEBAQAAAQIAAAECAAAAAgIA8PD009TzzM7429kA/fwAAAAAAAAAAAEBAP7/AAEAAAAAAP8AAAAODQ9iYWBvcW8fICAA//8AAAEAAAABAQD/AP8A/wEAAP8AAAH/AP8CAQH///4BAQD+/wEBAQH///8CAAD/AQD/AAAB/wAAAP//AAABAQEA/wD/AAAAAQAA/wAA/wAAAP8BAQIB/P3+AQEAAQD/AAABAAAA/wAAAQEA//8AAQAB/wEAAQD/AAAAAP8BAAD/AAAAAAAAAAEAAAAB/v//AgAAAAD/AAABAAABAAD/AAAAAAAAAP8AAAEA//8AAAH/AP8AAAEAAQAB//8AAQEA/wAAAAABAAD/AQAAAAD/AP8CAAH/AAEBAP7//wEAAAAAAQAA/wABAP//AQH//wABAAAAAAD/AQAB/wAAAQD/AP8BAAIA//8AAQAAAAEA/wAAAf//AAAAAAEB//8AAQD/AAABAP8A/wD//wEBAQEAAf8A/wEAAP8AAAAAAAAAAAAAAP8AAQEAAAD/AAAB/wAAAAAAAAABAAD+AP8AAQAA/wABAQEAAAAAAAAAAAD/AAACAP//AAIB///+Af8BAAEAAAAA/wAAAAD/AP8AAQABAAD//wAAAQIBAP7//wEAAQAAAAAA//8A/wEBAQABAAD/AAAAAQD/AAABAAH///8BAAD/AQAB//8AAAH/AQABAAAA/wD/AgAB/wABAAD/AP8A/wEAAAAAAQD/AAAAAAAAAAAA/wAAAf8BAQEA/gAAAAAAAAAAAQAAAAAAAf///wEB/wAAAQAAAQD//wAAAP8B/wH/AQAB/wAAAgAA/wAA/wAAAAAAAP8AAAH/AQABAP8AAAH/AAAAAAAAAAAA/wAAAQEA//8AAAABAQD/AQAB/wAAAAAB///+AAEBAgAA/gAAAQD/AAEBAP8AAQAA/wAAAAD/AAABAP8A/wH/AQABAAAAAAAAAAEAAP4AAAD//wEBAAAAAAAAAAABAAD/AAAAAQAA//8AAAEAAgEA/v8AAQAAAQEB////AAAAAAAAAAAAAAEAAAAB////AgABAAAA/gD+AAABAQEAAP4AAAEAAQAA/gEBAP8AAQD/AAABAAH///8AAAEAAf8AAQAB/wH/AP8BAAEAAP//AAAAAAABAAD/AAEAAP8AAAEAAP8AAQEA//8B/wD/AQABAAEAAAD/AP8BAAD+AAABAQEA/wABAAD///8AAAAAAAAAAQABAQH//gAAAP8BAQEAAAAAAAAAAf///gAAAQAAAQEBAAAA/gD/Af8AAAEBAf7/AAIB///+AQAAAAABAAD//wAAAQECAAD///8AAAAA/v7/AwMBAAAAAAAB7/Du8fDxsrK0hYWH6uroAAABAAABAQD+dGT/iosF/wIDAAICAAEBAAH/AQL+//38WVwCqrYM//r/AAABAgEEampjjY6BBQYFAQD/AAAAAP8AAAEAAP8AAAEBAAAAAAD/AP8B/wAAAQH/AP8AAAEB//8AAAEAAP8A1dbUSkhL4+TkAAAAAAAAAAAAAAD/AC8eAFMxAAMAAP8AAAAAAAABAAAAAP//AP8AAP8AAAAAAPT5AMPeAM3gAPv8AAAAAAD/AAABAAAAAAAAKgQFbQcJRAIDBwED/QAAAQEB/wEB//7/AAEA/gEC//8A/AEG9wMJ9gIM+gEE/wED/wED/wAA/gAC/wABAAABAAAB/wAB/wAAAAECAAAB/gAAAAEC//8AAQAA/wAB/wABAQABAAEB//8AAAABAAABAQD//gABAQEA/wACAAAB/wABAAEAAAAAAQAA//8BAQEA/wAAAAAB4/301Prr0ffo2Pjs8P/4AAD/AAAAAAACAAD/AQH//wwKACQgACkkASMfAhMRAQIDAAD/AQEBAAEBAgEBA/4BAv8AAwABAf8BAgECAgAAAQAAAwACAAIAAf4BAP//AAEAAQACAf8AAgEBAP///wEBAQAB/wAAAQEBAAEAAP4AAAEBAP8AAQEAAAABAQEB//8AAQEA//8BAAEAAgAB/wEAAAABAQEA/wAC/wAAAAAAAQEAAQECAQAAAAEBAQABAQEAAv8A9dfZ88TD9NXV//f1AAABAAAAAAD/AAAAAAAAAAABAAD/AQACISEhamppaWpoCQkJAQEA//8BAAH/AP8AAAEAAAAAAP8AAAAA/wD/AQAA/wAAAQABAQEA////AAEBAQAA////AAABAP8AAAAAAAEA//8AAAEAAAABAP/+AQEB/wAAAf39/wEC/wD/AP8AAQEBAAAA///+AAAB/wABAAAAAQIAAP//AAD/AP8BAAEAAAAAAQAAAP8B/gD/AQAAAAL/AP8BAAD/Af4B/gIAAQAAAAAAAAAAAf8A/wEA//8AAQAAAAAAAAAAAAH/AAACAQD+/wAB/wAAAv8AAAEA//8AAAEAAQD+/v8CAQEAAP8AAQD//wEC/wD/Af8A//8AAQEAAAEAAAAAAP8AAAEAAAABAP//AAIAAP8AAAABAAD/AAAAAP8AAAEAAQD//v8AAQAA/wAAAQABAP///wIBAP//AAECAf/+AAECAP/+/wAAAQEBAAEAAP8BAP//AAEAAAD/AAEB////Af8BAAEA//8AAAEAAQD//wABAP8AAAEAAAD/AAAAAQABAAAAAP8AAAEB/wD/Av///wEB/wAAAAD/AQABAAAB////AAEAAQAAAAAAAP8AAAABAAAAAAAAAAL/AP///wABAf///wAAAAEBAf8AAAEAAAABAAD//wAAAQABAAD/AAAAAf///wEAAAABAAH/AP8BAAAA//8AAQAAAAEAAQAB//8AAAH///8AAAH/Af8BAAEAAAAAAP//AAAB/wAAAAD/AAABAAEAAQAAAAAAAAAAAQAA/wAA////AAABAAAAAAH/AAABAQD+AP4C/wH/AQEBAAAAAAEB////AAAAAAAAAAD/Af8AAAEBAP8AAQH//wAA//4CAQH//wEAAQAA/wAAAQEBAP//AAAAAAAAAQAA//8AAAEAAAAAAAABAAAAAAD/AAAAAf8A/wEAAQAA/wABAP8AAAD/AAAAAAEAAAD/AAABAP8AAAH/AP8B/wEAAf8BAAD/AAAA/wAAAQEAAP//AAEBAf///wECAAD///4BAQL/AP//AAEBAP8A/wH/AQABAAEAAP8BAAAAAQAAAAD//wABAQAA/wD/AP8AAAAAAQEB/wD/AAABAP8A/wEAAQAAAAH/Af8B/wD/AP8BAAH/AAABAAD/AAABAAAAAAD/AAABAAD/AAAAAAAA/wAAAAAAAQEAAf8AAAEAAP//AAAB/wD//wABAgAA/wEAAAABAAAAAAD/Af8BAAEA//8A/wD/AgAAAAEAAP8BAAD//wABAAEAAAD/AAABAQAAAP8AAAEA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AAAAAAAAAQED/wH/AAD/AAECAAABAP8AAQIAAP8CAAEAAAEAAf8BAQIAAf8B/Ovq8sPF8cC//PXyAAACAAAAAAD/AAAAAAAAAAABAAAAa2tojIuMCAkIAAAB/v//AQD/AP8BAAEAAP8A/wL/Af8AAAABAAAA/wAAAAAAAQAAAAAAAAAAAAAA/wABAQD//wAAAgEA//8AAAAA/wEAAf39/QEBAgEB////AP8BAP///wMBAf//AAAAAAABAQAA/wAAAAD+/wABAQAAAAD/AP8BAAEBAf/+/wEAAP8BAQEA////Af8B/wIA//8AAQEAAAAAAP8BAAEAAQD+/wAB//8AAgD//gAAAAEAAAAAAgAB/gAAAgAAAAAA/wAAAP//AAABAAH/AAAAAAABAAAAAQAA//8AAAD/AP8BAAEAAAABAAH+AAECAf///wABAAD///8AAQAA/wAAAQEAAAD/AAABAAAA////AP8BAQH/AAAAAAAAAAABAAAA/wEAAf8AAQEA////AAAA/wAAAAAAAAEAAAAAAv8B/wH//wABAP8AAQEAAQAA/wAAAP8AAAEAAAD/AAABAP8A/wH/Af8AAAEB//8AAgEA//8A/wEAAQAAAAAAAAAAAAAA/wAAAf8BAAEA////AQEAAP8A/wAAAAAAAQEAAP8A/wAAAAEBAf//AAIB////AAD/AQACAP///wD/AAABAAH/AQABAAD//wABAQAAAAAAAAABAAAAAAD/AAAAAAABAf/+/gABAQEAAAAAAAAAAQAA/wD/AAAB/wD/Af8A/wEBAQEAAP8B////AAEA/wAAAf//AAEBAP8AAAEAAQAA//8BAAD/AQAAAAD/AAEBAP8AAAD//wEBAAAAAf8AAAEB///+AAABAQEBAAD/AP8AAQABAAD+/gEBAgAA/wD/AP8BAAEAAP8AAAAAAAEAAf8A/wEAAAAAAP//AAABAAAAAAEAAAAAAAABAP/+/wEAAAABAQAAAP4A/wEAAAAAAAEAAf8AAAEAAAABAP8AAAH/AP//AAABAAEA//8AAAAAAAEAAQAAAP8AAQH/AAAB/wAA////AQABAAEAAAAA//8AAQAAAAAAAAEAAAABAf8A/wIAAf////8AAAAAAAEBAAD/Af8AAAAAAAEA/wEBAP7+AAEBAAAAAAEBAP////8BAQD//wAAAQEBAAAAAQD//wAAAAAAAAAAAQABAAD//wAAAAEBAP//AP8AAAEAAQAA/wAAAAEAAf8B/wD/AAD/AAACAAAAAAD/AAEAAAAAAf8BAAEAAP///wEBAP8AAQEA/wAAAf8A/wH/AAABAf///wABAAEAAQAAAAD/AAABAAAA/wAAAf//AAAAAAABAAD/AAEBAAD//9nZ2zo7Pe7u7AAAAQAA/Y+DBnBwA/4CAAEB/gD//wD//gACAIydC5qrHPD3E/j7BPnl6vvs7gD//g8NDq6vnEFDPQAA/wEAAAD/AAAAAQABAAAAAAAAAAAA/wAAAQAAAAD/AAAAAP8BAAD/AAEBAP//ANrZ2UdISuHh4AAAAAAA/wAAAQAAAQAcDwBbOAAMBgAAAAD//wAAAAD/AAAAAQD//wABAAD//wD/AAABAAD/AAD8/gDZ6QDF3gDn7QAAAwAAAAAAAAAAAAAA/wAAASgDAl4FCVAHCAwAAgABAP8AAQIAAAABAP//////AP4BA/UBC+4GEvgDCv4BAwAAAf8BAQACAf//AAABAv//Av4BAQAA/wABAgAAAAD/Av8BAAAAAAH/Af8AAAEAAQAAAP8AAP//AAEAAv8A/wD/AAABAgABAAD+AAEBAf8AAAAAAgEAAf4AAQEBAAAAAAAAAf8BAQL/AAAAAAACAAAAAQAAAPj//dv77tb66tH05d/57/X/+gABAAD/AAADAQD+/wACAgAZGAAnIQQtKwYbGgUHCAIAAgL/AAEAAAEBAQMBAQIBAQL/AgAB/wEAAQABAQAA/wL/AgAAAQABAAABAQH/AQEA//8BAQAAAAEAAAEBAf//AAABAAAAAQD/AQEBAP8BAAEAAf8BAQD//wEBAf8BAQAAAAABAAEAAf8AAQEAAAEAAQABAf8AAAEBAQABAAAAAgECAAAAAQIAAf7r6+/Aw/HCwfzz7wAAAAAAAAAAAAAAAAAAAQEA/3t9e4F/fwEDAwAAAQD//wABAAAA/wD+AQABAAAAAAAA/wAAAP8AAQEBAQD//wAAAP8AAAAA/wAAAgEA/wABAAD/AAAAAAAAAAAAAAH9/v4BAQEAAP8A////AQEB/gD/AQABAAH/AP8CAQAA/wH/AAAAAP8A/wH/Af8AAAAB/wD/AQAA/wABAAD/AQAB/wAAAQD/AAAAAAAAAAABAAD/AQAAAAAA/wABAAH/AP8A/wABAQAAAAAAAAAAAAD/AAAB/wABAQD+AAABAP//AAAAAAIBAP4AAAIAAAAAAAD/AP8AAAAB/wH/Af8BAAAAAAD/AAAB//8AAQEA////AQEBAAAA/wAAAQD//wEBAv///gD/AP8BAAEBAP8AAQH//wAAAP8AAQEBAAAAAP///wAAAQAAAAIBAP8AAAD/AP8A/wAAAQEBAAEA//8AAQD//wABAQAAAAAB/wAAAAD/AAD/AP8AAQEAAQAB/wD//wABAf8AAAH/AAEBAP8AAP///wEAAQABAAD/AP//AAEBAAEBAP//AP8AAAAAAAEBAAD/AP8A/wABAAH/AQABAP8AAAAAAAEAAAAAAQAA/gD/AQAAAAAB/wH/Af8AAAEBAP////8AAQEBAAAAAf8AAAD//wEAAAABAAAAAAAA/wD/AQABAAD//wAAAAAAAf4BAAIAAP8BAQH///8AAAEAAP8AAQEAAAD//gABAAAAAQD/AP8B/wH/Af8BAAD/AAEBAQAA/gAAAQD/AAABAAD/AAAAAP8BAAH/AP8AAQEB////AAEB/wAAAQAAAAAAAAAAAAD/AP8AAAAAAAABAAH//wAAAQABAP//AAEAAP8AAAEBAAABAAD+AAAB////AQEA/wAAAQAB/wAAAgAA/wH///8BAgABAAD+/gAAAQABAAAAAAEAAP//AP8AAQEB/wD/AAABAAAA////AQEBAQD//gAAAQABAAAAAAAAAAD/AP4BAAIAAQAA/v8AAgH//wABAAAAAAH/AQAA/wAAAf8A/gAAAQAAAf8B/wL/Af8A/wAAAAACAQD/AAD/AAAAAP8AAAEB/wAAAQH//wABAf//AAAAAP8A/wAB/wH/AgABAAD//wABAQEA////AAEBAP8AAQEA/wAAAQAA/wAAAQAA//8AAAAAAQEBAAD+/wABAAAAAP8A/wABAgD//wAAAQD//wACAP8AAQH//wAAAQD//wECAf//AAAAAAEBAP//AAEBAAD/AAAAAP8BAAD/AAEA/wABAQD/AP8AAAEB/wAAAQBXWl6qp6YAAP8AAP5KQQO0tAQB/gIAAf//Af8BAP4AAAC5xwOElRra5Rn5/Qv++Pv25ur97/AAAPtWVk2pqZwAAP8AAAH//wAAAf8BAAD/AAEBAP8AAAH//wABAQAAAP//AAEB/wAAAQAAAAAA/wAAAf+np6plZWf19fIAAAAAAAEAAAEAAP4AMB4ATC8ABgIAAAEA//4AAQAA/wAA/wAAAQAA/wAAAP8A//8AAgIA/f4AAAEA8/kAyOAAz+AA+PoAAAIAAP8AAAAAAAAAAAEAAAA5BAVkBwdABAcGAQICAQEA/wH/AAAAAAEB//7/AAD6AAP1AwzwBhH1Awn+AgMAAAL/AAH/AQIBAAH/AQL+AAACAAH/AQEA/wIAAQD/AAEAAAAB/wD/AAAAAAAAAQIAAAAA/wAAAAEAAP8A/wD/AQIB////AAH/AAEBAAEAAAAAAAEAAQEBAAD//wABAAD/AQL//wACAQAAAQEAAAABAAEAAP8CAQH9AQHc+ezL9+bG9OHh+u8AAP8AAAAAAQAAAQAA/wAABAQAKCUFMy8HJiYEDAwDAAEA/wABAAADAgIBAAABAQEBAAEBAAACAAEBAAEAAAABAQEBAAAAAAABAQAAAAIAAAD/AQAB/wEBAAH/AQEAAQEAAQAB/wAAAP8AAAEAAQAAAAEBAQEAAAD+AQEAAAAAAAEAAQEB/wEAAP8AAQEAAgEA/wABAgEBAAAAAQEAAAIAAQAAAQECAAH97u3wur3vwb7+9fUAAP4AAAEAAAAAAAADAwSUlZJnZ2cAAAAAAAD//v8BAQD//wEBAQAAAAABAAD/AP//AAEAAAABAQD//gACAgD+AAEBAP8A/wAA/wAAAQAAAP//AQEA/wAB/f/+AP8AAQEA//8AAAAAAAAAAQAAAAAAAAAAAAD//wABAQEBAP7//wD/AAABAQEBAAD/AAAAAP8AAAAAAAEA/wABAf8AAAL/AP4A/wEAAQAA//8AAAEAAAAAAAAAAf8A/wEAAf8AAAEBAAD/////AQAC/wD/AAEAAP8AAAEAAAD/AP8AAQEBAAAB/wD+AAAAAQEBAf8A/wD//wABAAEBAP//AQEB//7/AQIAAP8AAAAAAP8AAAEAAQAA/wAAAP8AAAEAAAAA//8BAAH/AAAAAQD/AAAAAAAB//8AAQD//wABAAAAAAIAAP4AAQEAAAH///4BAgAA/gEBAQD/AP8AAAAAAAAAAAEAAAAAAAD///8BAQAAAAEAAAABAAD+AAAAAAABAAD/AAABAAAAAP8AAAIAAP//AAABAAAA/wAAAQAAAP/+AAEC/wAAAP//AQEB//8AAQAA/wH/AQEBAP///wEAAQAAAP8AAAEA//4AAAECAP//AQEAAP8A/wEAAQEAAP//AQEB//8A/wAAAQD//wABAgEA//4A/wD/AQEAAAABAAD/AAAAAAAB/wD+AP8BAgEB//8AAAEAAAAAAAAAAAD/AQABAAAAAAAB/wD///8AAQAAAAD/AAEBAAAAAP8A/wH/AQAAAAAB/wAAAf//AAEAAAAA/wABAQD/AAAA/wAAAQABAAAA//8AAQEAAAAAAAAAAP///wEAAAABAf8AAAL/AP8B/wAAAQEA//8AAQH/AP8B/wAAAAD/AQAC/wD/Af8A/wAAAQEA/gAAAgAAAAAA/wD/AQABAAAA/wD/AQEBAP8AAAAAAAD//wAAAQABAP//AAEBAAEAAQAA/v4AAQEBAP8AAAL/////AQABAAAAAAAAAAABAAAA/wD+AAABAAAAAQAAAAEA//8AAAEAAf//AAABAAAAAAEAAQAB/v//AQEAAf8AAAEA/wABAAAAAAD/////AAEB//8BAgH/AP8A/wAAAQEBAP//AQAA/gEAAQAAAP8BAAH/AAAAAAABAP//AAEAAP8AAAEBAf8A/wEAAAD/AAABAAD/AAAAAAAAAP8AAAEAAP8AAAEAAAAAAAAA/wAAAQAAAAAAAAAAAAABAQAAAAD//wAAAf8B/wAAAAAAAQAAAAEAAP8AAAH//wABAQD/AP8BAAEA//8As7W2UU5P///+AAD+BgYCt64GQD8AAAIAAAH/Af/+AAD/5+3/fZEKusgr8/gLAP8C/Pj69+bq/fDvCQcCt7qsPj45AAAAAP//AQEBAAAAAP8AAAH///8AAQEA/wABAQAAAAAAAAAAAAAAAAAA/v8AAgAA////hIWGf35+/wD/AAAAAQABAAAA/wABADQeAEstAAEAAAIBAAAAAP8AAAEAAP//AP8AAAIBAP4AAAD/AP8AAP//AAABAP7+AOXwAMviANbmAP7+AAABAAD/AAABAAABAQD/CwEBSgQEUwcJOQMIBQAA/wAB/wAAAf8AAQD///8AAAEA+wAE8AMM7ggT9wMJ/wED/wECAAABAAEB/wEBAQAAAAAB/wACAAEB//8B/wEBAAD/AgEB//8BAAEAAAABAP7/AAABAAH///8BAAEBAQABAP//AAAC/wAAAAACAf//AQEBAAECAAD///8BAAABAQAA/wEAAP8BAAD+AAICAf8AAAEB/wAA/wEAAQAA9v761vnpyfTjzvXm6//2AP//AAAAAAEBAP//AQEA/xQUAColBCgnCCAhBQoLAgIBAQEAA/8C//8AAgEBAQAAAwEBAQAAAf8AAQEC/wAAAQAAAAEAAAEBAQABAAAAAgEB/v4AAgIB/wAAAAABAQEAAAABAQAAAAEA/wABAQAB/wEAAAABAAAAAAAAAQEB//8BAAIAAAEBAf8BAQIAAAEB//8BAAEBAQAAAAIBAf8CAQH/AwAA++Tm7rK07srEAP7/AAD/AAD/AAACGhobyMfFHB4dAAD/AP8AAAAAAAEAAP8A//8AAgIA//8AAAAA/wD/AAABAQAAAAEAAP8BAAD/AAEAAP8AAP//AAEA/wABAQAAAf3+/gAAAAEAAAEBAP/+AP4BAAEAAAAAAAAAAAEBAP//AAAAAAEAAQAA/wAAAAAAAAAA/wAAAf8AAAEAAAABAQD//wAAAAAAAAABAP/+/wABAQEAAAAAAAAAAP///wABAQABAAH+AAABAAAAAAD/AQAB/wEAAf8A/wABAAD/AP//AAAB/wEAAQAAAAAAAP8AAAAAAAEBAAD/Af8BAAH//////wEBAQAAAAAA//8AAQEAAAAA////AQEA/wABAAAAAf8A/wEAAQAA/wAAAf8A/wAAAQD//wABAQD/AAAAAAAA/wACAQH+/wABAP8AAQAAAAH/AQEA//4A/wABAAH/Af8AAAABAQEAAP///wEBAAAAAAAA//8AAQEAAAAA/wAAAQAAAAAA//8AAAAAAQAAAAD/AAAB//8AAQEA/wH/Af4A/gIAAQACAP8AAQH/AP///wAAAAABAAEBAv///wEB/wD/AAAB/wEAAv7/AAAA/wH/AP8AAAEAAP8BAQD+AAECAAAAAAAA/wAAAQAAAAD/AAABAAAAAP///wAAAAABAAD/AQAA/wEAAQABAAAAAP///wAAAQEAAAAA/wAAAAAAAQABAAAA/wAAAf8AAAAAAAAAAAEA/wAAAAAAAQAA/wD/AAEAAf8BAP//AAABAAEA/wAAAAAAAf8AAAAA/wL/AP8AAAACAQD/AQD///8BAQH//v8BAAD//wEAAf8AAQAAAAEAAP8A/wABAgIAAP8A/v//AQAB/wEAAf8A/wAAAQH/AAABAAABAQD///8AAAAAAAAAAAEAAAD/AP8BAAH//wABAf//AAEB/wD/AQAA/wACAQAAAf///gABAQH+AAAC////AQAAAAEAAP8AAAEAAAABAAD///8AAgEA/wAB////AQAA/wEBAv///wEBAAD/AAABAQD+/wABAAAA/wAAAQAAAAABAAD/AAAAAAABAAH+AP4BAAAAAAEA//8AAQAAAAEAAP8AAAEAAP8AAAEAAAAAAP8AAAEA//8AAQIBAP4AAAH+AAABAP8AAAH//wABAQABAAD/AP8A/wAAAgEAAAEA/wABAf///wABAAAAAQAA/wAA/wD/AQABAAAAAQAA/gAAAQH/AAABAP//AAAAAAABAQH/AP8BAAD/AAAB/wH/Af8A/wAAAAEAAf8AAAAAAPDw8Do7PtnX1AAAAP8A/2thA5OTBAD/AP8C/wH//wEB//7+AJyt/5OtJurtE/n4BQD+BP35+Pbj5f707FxeXKOhlf8AAAAAAAEAAP//AAAAAAEB////AAEBAQAAAAD/AP8BAAEAAAAAAAAAAAAAAAD/AAABAPPz9GlpaaalpwAA/wAAAAAA//8AAQABAQBDJwA9JQAAAAAAAAAA/wAAAQAA/wAAAQD/AAAA/wABAQD+/gD/AQABAAD/AAAA/gD+/wDg7QDN5ADZ6AD+/wAAAAAA/wAAAQAAAAAA/wgBAEkFBmIGDTQDBAAAAAD/AAABAQABAAH/AQD/AAD/APoCBe4EDewHEvgECwAAAAABAgABAf8AAQAAAQABAQAAAP4AAQEBAQEAAf8AAAH/AAACAf8AAAAAAAEAAP8AAgAAAAD/Af8AAAEAAAD/AQAAAf8AAQEAAAEAAQD/AAABAP8AAAEBAgD/AP8AAQEB/wD/AQABAP8AAAEAAQAAAAAAAf8BAAAAAAICAP/+AO789tP26NH559H36er88gAAAAAAAQAC/wD/AAABAQAVEwEyMQYvLAkbGwIAAgL/AgEA/wEB/wMBAgIAAQEAAQEA/wD/AQEBAQABAgIA//8BAQEAAAEBAv///wMBAf4AAAEBAv8AAAEAAAABAAAAAAAAAQEBAf8AAAABAQAAAf8AAAEAAQAAAAEAAf8BAAABAQIBAP8AAgEAAAAAAQEBAf8BAQEAAQABAAEBAQACAQP9/vfP0Oiqqfjl4gAAAAAAAQEAAJSUlGlraQH/AP8A/gAAAf8AAQEB/wD/AP8AAAEAAAABAQD+/wABAP8AAAAA/wH/AQABAAABAAD/AAEAAP8A////AQAB/wH9/f0BAQEAAP8AAAIAAf8AAP8B/wH//wAAAAAAAQAA/wD/AQAAAP8BAAAAAQEAAAEA////AAAB/wAAAf//AAEAAAABAAD//wAAAf8AAAEBAP8AAQEA/wAAAAAAAQAB////AAL///8AAQAB/wAAAQAA/wD/AQABAAD/AAAAAAAAAP8A/wEAAAAAAQAA//8AAAEBAf8AAAEAAAD/AP8BAAIAAP8AAAD///8BAQEAAAAAAAD/AAABAAAA//7/AAIBAf//AAEBAAD/AAABAQH///4A/wD/AQEB/wABAQD/AP8BAAH/AAAAAAABAAD//wAAAP8BAQH/AAEB///+Af8CAAH//wABAQAAAAD/AAABAAH///4BAQAAAAH/AAABAP8AAAEA/wABAQD//wH/Af4AAAABAAH/AAEA//8AAQAB///+AAACAQH//wEAAP8BAQD//wACAf/+AAEB/wD/AQABAAD/AQAB/wAAAP8A/wH/Af8AAAEAAP8BAAAAAAAA/wIAAf8AAAEA//8AAQD/AP8AAAACAAEAAQD+/wAA//8BAQAAAAEAAAAAAP///wEBAv8A/wH/AAABAP8BAAD//wEBAAAAAP/+AAEAAQABAQH///8AAAABAAAAAAAAAAAAAP8A/wD/AQEA//8AAQEA//8BAAAAAQEAAP8A/wABAAH/AP//AgAA/gEBAQH//wAAAP8BAQD///8AAP8AAAIAAQAB/wH/AQAAAP8BAAD/AAABAAD/AQAB/wAAAP//AAEBAf8A/wD/AAAAAQEB//8AAQEAAAAAAAD/AAAB//8AAAEAAQEBAAD+AP8B/v8AAQAAAAEAAAAAAP/+AAEBAAEBAQD///8B//8AAgEA/gD/AQAAAAAA/wABAQABAAD+AAEBAAD/AP8BAAAAAQAB/wD/AP8AAAEAAAD/AAEBAP8AAAD//wAAAQEBAf8A/wAAAAEAAP8AAQD//wABAQAA/wAAAQD//wAAAAABAAAAAQEA/wD/Af4BAAEB/wH+AP4AAAEAAAABAQD//wAAAAABAAEBAP//AQD//wABAAAAAAD/AAABAAH/AP8AAP8BAAIAAf8AAAAA/wAAAQEAAP8BAAH/AP8AAP8AAAEBAAH/AAAB//7/AAIAAP8AAAAAAQEB//8AAQEA//8AAQH///8AAQEA/wAAAAABAQBydXmQjIoAAAD/AP4Z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//7+++7v/e/v+uzs++3t/evt/enp++fj/vT0AAAAAAD/AAAAAAAAAAECAAD/AP8AAAABGxod0dLMExMT////Af8B/wEAAAAAAAEAAAD/AAABAf8AAAAA//8AAAIAAAAAAAAB//8AAAH+AP8CAAD//wABAgAAAAH/BAH/AP8CAQD/AAAAAAEA//8AAgAB/v7/AQEAAP8A/wL/AP8AAP8BAAEA//8BAv8A/wEA/gD+Af8C/wEAAP//AAH/AAACAAH//wABAQD/AAABAf8AAAACAAH/AP8AAf8AAAACAAD/AP//AAABAP8AAQEB//8AAAEAAAABAAD/AAD+AAABAP8BAAEAAv8A/wAAAQAAAP8AAAD//wACAAL/AgAA/wECAP///wD/AAAAAP8B////AQIAAf8A/wIBAf8B/wEAAP8AAQAA/wACAQD/AAEAAP//AAEBAP//AAAA/wEAAQAB//////8BAQEB////AAEAAP///wAAAQAB/wD/Af4A/wH/AAAAAAEAAf8AAAAB/wEA/wABAv8A///+/wICAf7+AP8AAQAAAP7/AAEBAAEAAAAAAgAA/////wD/AQEB/wAAAf8AAQAA/wEAAP8BAAH//wAAAQEBAP8AAAEAAP8AAAEAAAABAAH/Af8B/wD/AAEBAP8AAP//AAEAAP8AAQEBAAD/AAAB/wAAAQEA/wEAAP8AAAABAP//AAEA/wAAAQIBAP7//wEAAAEAAAAA/v8BAQACAQH/AAEAAP8AAgAAAP4A/gEAAf////8AAAAAAQAC/wAAAP8A/wAAAAACAgD/AP8AAAEAAAD+AAACAAH/AAAAAAAA/wD/AAEBAAD/AAAAAf8A/gAAAv//AAEBAAEAAP//AQAAAQAAAP///gEBAQEA/wAAAP8A/wABAP///wEAAf8AAQAAAP///wAAAQAAAAD/AAEAAQAB////AAEBAAD/////AAIBAv///gAAAAEAAQEA//4AAf///wEBAQAAAAD/AQECAAD/AP//AAH//wABAAABAAAAAP//AAABAAD+/wABAAD/Af4A/wEAAP8BAQAA/wH/AAEBAf8AAP8AAQEA/wABAP8AAAEA/wD/AAEBAAAA//8BAgAB/gEAAf//AAH+AAAB/wEAAf///wAAAP///wEAAQAB/wD/AAECAP///wD/AAD/AAABAP4AAAIA/wABAgEA/wAA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/wABAf8AAAD/AAAA//8BAQH//wABAQD/AAABAAH/AP8AAQAB/wAAAAD/AAAB/wEAAf8AAQH///8AAAAAAAAB/wD/AQAAAAABAAAAAQH//v4AAQIBAP//AP8A/wIAAf4BAAEA////AQABAQAA/wAAAAAAAAD//wEBAQAAAf///gEBAf8A/gD+AgAB/wEBAAAAAQAAAQAA/v8AAAH/Af8BAAAAAAH///8AAAAAAQEBAP//AAEB//8AAAEAAf8AAAH///8BAAEAAP8AAQEA/wD/AQABAAAAAAD+AAACAAD/AAABAQAA/wD/AP8AAAAAAAEAAP8A/wAAAQEAAAABAAD///8AAAAAAAAAAQEAAAABAAAAAAAAAQAA/gAAAQAAAAAAAP//AAAC/wL/AgAA//8BAAD//wEAAf8AAP8AAAEA/wAAAgD//v8BAQEA/wAAAQAA/wD/AQAB////AAECAQD/AAH///8AAP4AAAACAAL+AAAAAP8AAQEBAAAB/wD/AQAAAP//AAAAAAEBAP8AAAH//wABAQAA////AAAAAQEAAAAAAAAB/wAAAQAAAAAAAAD/AP8AAQAB/wH//wAAAQAAAAD//wACAQAA/wAAAQAAAAAAAP//AAEBAP//AAEAAP8AAAEBAQAA/gAAAf//AQEB/wD/Af8A/gECAf/+AAABAAEAAP8AAAEAAP8A/wEAAQAAAAD//wABAQAAAAAA/wAAAf///wEAAP8BAQIAAQAA/gABAf/+AAAAAAAAAAEBAf8A/v8AAQH//wABAQEA/wAAAf8A/wAAAf8AAAIAAP//AQEA/v8AAQD/Af8CAAH+/wACAAABAAD/AAAAAAD/AAAAAAEAAP8AAP8AAQEB/////wEAAQEAAP8AAAABAQAAAAAAAAAA//8AAAEAAAAAAQAA/wAAAAEBAAD/AAAAAAD/AP7/AAECAAAAAQAA/wEAAAD/AQAA//8BAAH/AP8CAAD/AAEAAf8A/wAAAAAA//8AAQIAAf8A/wD/AQABAAEAAP8A/wAAAAAAAQAA//8AAAEAAQAAAAD//wABAQAB/wD/AQD/AAAB/wH/AAABAAAAAP8BAQD/AAAAAAEBAAD///8AAAEBAAD/Af8A/wABAAH/AQAA/wAAAAAB///k5+g2Nzrn5eQAAAAAAP8AAP8AAAAAAAEAAAEAAP8AAAAAAAAAAP9CGQCW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AAAAAQEBAP8AAAH///8BAAD/AAAAAAAB/wH/Af8BAAAAAQAAAAAA/wAAAP8AAAH/AAAA/wEBAf4AAQAA/wH/AAEAAP8AAAAB////AAEBAQD/AAAAAQAB/wAAAAH+/v4AAAH/AAAAAP8AAAAAAP8AAAEAAAABAAAAAAEAAAAAAAAAAP8AAQAA/wD///8AAAEAAgABAAH///8AAAABAQD//gABAQEA////Af8CAQD//wH+AAABAAEBAP8AAAD/AP8B/wH/AAACAQH/AAD/AP8BAAD/AAAAAAABAAD/AAAA//8AAQEBAAAA/wAAAP8AAQH+AAACAAD/AAABAAAAAAD/AAAAAAAA/wAAAAAAAQAA/wAAAAABAAD/AgAB/v//AQAB/wEAAAD/Af8BAAD/AAABAAABAQH+/wABAAEAAAD/AP4AAAAA/wEBAAAAAf8AAAD/AAABAQEAAAAA/wAAAAD/AP4A/wIBAQAAAP8AAAEAAAD/Af8B/wEAAP//AAAB/wH/Av8A/wEBAAD//wABAf///wAAAQEAAQAA/wAAAP8AAAAAAP8A/wEBAAD/AQEBAAAA////AQEBAAAAAAAAAAD/AP8CAAH//wAAAv8A/wH//wAAAQABAAABAAD+AAAAAP8BAAEAAAAAAAD//wAAAQAA/wABAQAAAAAAAAAAAAD///8BAQD//wAAAAAAAQEAAP8BAAH/AP8AAAAAAAEA/wEAAf8BAAAAAAAAAAD/AAEA//8CAAD/AQAAAAD///8AAAABAQH/AAABAAD/AP8A/wABAAH/Af8CAAD/AAEAAAH///4AAAEAAQAB//8AAQEAAP8AAAEA/wAAAAD/Af8BAAEAAP8AAAAAAAH/AP8A/wEAAf8BAAEAAAH/AP8BAAABAQD//gD/AAABAQAA/wAAAQAAAP8AAAEAAAD/AAABAP8AAAEA/wAAAQAAAP8AAQEA//8AAQH//wABAQAA/wAAAQD/AAEB////AAEBAf8B/wD9AAACAAABAAD+AP8AAQECAAD+/wABAP//AAEAAAACAAD/Af8A/wEAAAEAAP8AAAEAAAAAAQAA/wAAAf8A/wEAAP8AAQAAAAABAAAA/wD+AAABAAAA/wAAAgAA//8AAQH//wABAAAA/wAAAgAA/wAAAQD//wABAAABAAH/Af///gABAgAA/wD/AQAAAP8A/wEBAAAAAAAA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/wAAAAABAAEAAAEAAP8BAQH/AP8CAQH+/wECAf///wEBAgEBAQAA//f++svz5MLu4Mrx4vL89wAA/wAAAAAAAQAAAAAAAQAA/wAAAAAAAAAAAQABABwfH2hpaFlVVSEgIAABAAD/AAAAAQAB/gD/AQEAAP8AAAAB/wD/AQAA/wABAf8A/wIAAQD/AP4AAAEAAAAAAP8AAQAAAAEA/wEBAf4A/wH/AAAA/wEBAv///wEAAP8AAAAAAQAAAAAB/wD/AQAAAAAA/wAAAAH+/f4AAgEA////AQAA/wABAAAAAAD/AP8AAQAB/wEAAQAA/wD/AP8CAAD//wD/AQEAAQAB/wEAAAAA////AAABAQAA/wABAAD/AP8BAQH/AAD//wAAAQAAAAAAAAAA//8BAgH//wABAAAAAAD/AAEAAP8B/wAAAQD/AP8BAAH//wAAAQABAAAA/wD/AQAB/wAAAQD///8AAQH//wABAf4B/wIAAQD///8AAQEB/wD/AQAA/wABAQD/AAAB////AQACAQD//wEAAP8A/wD/Af8BAAEAAQAA/wH/AAAA/wAAAQAAAAEA//8AAf8AAAEAAAAA/wABAQAAAAAAAAAAAAAAAAAA////AQABAAABAQH//wAAAAAAAAAAAQD//wABAAD///8BAQEAAP8A/wAAAQEA//8AAQEAAP8AAAD/AAABAAH//v8BAgD/AAEBAAEAAP8BAAD/AAD/AAABAQAA/wAAAAAAAP8AAAEAAAABAAAAAAD+//8AAQACAAD//wEAAQABAAD9//8BAAEAAgAB/v8AAQH/AAABAP///wABAQEA//8AAAEBAQD+/wAAAQAAAAAB/wAAAQD///8CAQIA///+AQAAAAAB/wAAAQD/AAABAAD+AP8C/wEBAP8AAQH+AQAB/v8AAAH/Af//AAACAAH/AP8BAAAAAAH//wAAAP8AAQEBAP//AAAAAAIAAP4A/wEAAf8AAAAAAAAAAQEA/wABAAAAAP8A/wD/AQEBAAAAAP///wAAAQEAAAAA/wABAAEBAf///wAAAAAAAQD///8BAgD//wEAAP8AAAAA/wAAAQEAAAABAP8AAAEBAQD//gAAAQAAAAD/AQEBAP8A/wD/AAEBAAD/AP8BAP//AAEAAP8BAAD/AAEBAP//AAEBAAAAAQH/AP8BAAH///8BAAAAAQEA//8AAAAAAAH/AP8AAAABAAAAAQEA/wAAAP//Af8B/wH/AAEBAP//AP8BAAL/Af8BAAEAAP8A/wEAAAAAAAAAAQAAAP///wAAAQAA//8AAAEBAAEAAP8AAAD/AAEBAQAA/wAAAP8BAAH/AP8AAAAAAP8AAAIBAf///wEAAAAAAP8AAAEAAQD/AAAA//8BAAAAAAD/AAAAAAABAQEAAP8A/wEAAAABAQD/AP8BAAD//wEAAP//AQECAAD/AAAA/wAAAQD///8BAAEAAP8AAADT1dZQT1bf3t0AAP8AAAFcK/2jUv0A/wAA/wH//gAA/AEA/v4A/wAA/gAA/gAAAAHI4wFPtgHr+QAAAAAAAAABAAF8enaCg4P/AgAAAAABAAEAAAAA//8AAQEAAAD/AP8AAAAA/wEAAQAAAP8BAAEAAAD/AP8BAAH///8BAQH/AAAAAP8AAAEA/wD/AP8CAQGnqKpzcHLp6ej/AP//AAAAAP8AAAEBBwUASy//MBwAAP8AAAEAAf8A/wAAAQAA/wIAAP8AAAEAAAEAAAAAAAAAAAEA/wEAAf8AAAIA/wEAAQIAAAEAAAIAAAMAAQIAAAIBAAIAAgP/AAIA/wIAAAAA9vgAytYAytMA8vQAAAIAAAAAAAAAAAIAAP8AAQIfAwNfCRRSBxMY/wf+AQEAAQH/AAAAAQEA/wD+AQEAAAD8AQT1BQbuCAv0Bgn/Af8AAQICAQAB/wD/AAEBAQAA/wH/Af8CAQH//gABAgEAAAEAAP8AAAABAAEAAQH///8AAQIB/wABAf//AQEA/wEBAAAAAQEAAAAA/gABAgEAAAAAAAEAAAAAAAIAAAABAP//AQIB/wABAf/+AAABAQABAAAAAQD//wACAQH+AAACAAEAAAEAAf8AAAABAQH//wABAAD/AgIB/v/i+O/J8uLG8OHW9ej5/fsAAAAAAAIAAf8A/wEAAAAAAAAAAQAA//8AAQEVGBhjY2FeW14mJyUB/wACAQD//wAAAQEAAAAAAf8AAAAAAAABAP8AAAH/AAD//wABAAABAAD/AAAAAAH/Af8B/wAAAAEAAf4A/wEBAAD/AAAAAAAA/wABAgD+AAEAAP8CAAD/AAEA//8BAAH///8B/v7+AAD//wEBAP4AAQEAAAEAAP8AAAAA/wD/AAABAgD/AAAA/gAAAAABAAAAAAAAAQEAAP8A/wAAAAAA/wAAAQAAAf8AAAAAAAAAAAAAAAAAAAAAAAEAAAEAAP8AAAAAAAEB//7/AAD/AQEAAP8BAAABAAEA///+AQAB/wEAAAAAAQAA/wD/AP8BAAH/AAAAAAABAf8A/wEAAgEA//4AAAAA/wEAAP//AAABAQEA/wD/AP8AAQAAAAABAQEA/wAAAP8AAAIA////AAAAAP//AQEBAAAAAAAC////AAD/AAEAAQAA/wEBAP4A/wAAAQD/AAABAAAAAAD/AQEBAAABAAD+AP8A/wEBAQEAAP//AAABAAAAAAAA//8AAQEB///+AQECAP/+AAAAAAEAAAABAAAAAAAAAAEAAP8AAP8AAAAAAAH/AAABAAEAAP4AAAEAAAAA/wAAAQD/AAABAP8AAAH/AP8A/wABAQIA//7/AQEBAAD///8BAAAA/wEAAQD/AQEBAAAAAAABAP//AQAB/gD/AQEBAP/+/wACAQD/AP8AAAEAAQH///4B/wAAAAAAAAEAAQABAAAAAAD//wAAAQD/AAAA/wAAAAABAgAA/gAAAQAA////AAEAAAABAAEAAP7/AQEAAAAA//8AAAAAAAIAAf8B/wABAAD/Af8AAAH///8BAQEAAAD//gABAgD//wABAf8A/wEAAP//AQEA/gAAAv8B/gH/AgEBAP8A////AAIAAP8BAQD//wEBAf8AAAAB/wAAAQAA/wD+AAEAAf8B/wAAAgEA//8A/wAAAQAA/wH/Af8B/wAAAQAAAAEAAP8AAAAAAAAA/wABAQH///8BAAD/AQH/AQAA//4B/wEAAP8AAQEA/wAAAQEAAAAA///+AQACAAAA/wAAAQAAAAAAAAEAAP8AAAAAAAEBAP8AAAH/AP8AAAAAAAAAAAAAAQAA/wEBAP///wD/AQAA/wEBAP//AQACAAAAAAD/AAAB/wH/Af8AAAEBAQD+AAAA//8BAAAAAAABAP//AAEA/wABAQEAAf///wAAAAEBAP//AAAA/wAAAQAA/wD/AAACAQEA////AQEB////AAABAAD/AQEAAAABAP8A/wH/AQABAP//AQAB/wH/AP8BAQH///8AAAEBAf8A/gH/Av8BAAD//wEBAQAA/wD///8AAgAB/wEAkpiacGltAAABAAAAEQf/ymH6JBUDAP8AAAEA//0AAP7/APwAAP7/Af8B////AAAAgMMCg80B/wABAAD/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Af3/Af//A+8ICe8JCvwDAgABAAABAQAAAAAAAQABAAEBAQD/AQAAAAAAAAAB/wH/AQECAf//AAAAAQEAAQAAAAABAAAAAAD//wEAA/8AAAEA/wABAQEAAf8AAAEBAP8AAgH//wABAQEBAAAAAf///wEBAAAAAAH/AQABAP//AAEAAQABAQEA/wABAQEAAP8AAAEBAf//AAEBAAEAAAABAf8A/wIAAQAAAQEBAP0A/9X26sDt3r/s2uv69AAAAAAAAQAA/wABAQAAAAD//wAAAgAA/gABAgUGB0lISGlqaEVDQwECAgAA/wABAAH/AAAAAAABAAAAAAAAAAD/AQD//wECAAAA//8AAgD//wAAAAAA/wAAAf8AAAEBAAAAAAAAAAAAAAD/AAEBAP8AAP8AAAEAAAAAAP//AAH+/v4AAAD/AAACAAD+AAABAf8AAAEA//8AAAABAQL//wAAAP8AAAAA////AQICAP7+/wEAAAAAAgEA/v4AAQEAAAEAAP8AAAAB/wAAAAAAAP8AAQAAAQD/AAIA//8BAQAA/v8AAQEAAAAB/wD+AQABAP8AAAH/AQAA/wABAAEAAf8A//8AAAEA/wD/AQEAAP8AAAABAP//AAABAAEAAAAAAAD//wABAP//AQEAAAAAAP8BAAD//wAAAQAAAAEAAP8AAAABAAAA/wD/AAEAAf8B/wAAAQEAAAAA/wEAAf//AAAAAAAAAQEB/wAA//8AAf8AAQH//QEAAv8AAP8BAAAA/wD/AQEB/wD/AAAAAAABAQAAAQEA//4AAAEAAAAAAAABAAD/AAH/AP4AAAABAAH/AAACAAD+/wAAAgAB/wH/AP8BAAD/AAAB//8AAQEAAAD/AAEAAP8BAP8AAQEA/wAAAP8AAAAA/wD/AAECAQD//wEBAf/+AP8BAAEAAAABAAD+//8AAgEB/wEAAP8AAAAAAQAA////AAEBAAAAAAAAAP//AAEBAP///wACAAH/AAAAAP8AAQEAAAAAAAAAAP8AAAL/AP8BAQAA/wD//wAAAf8BAAEA/wD/AQAB/wEAAP4AAAAAAQAAAQL///4B/wH/AQABAAD/AP8B/wH/Af4BAAEA/wD+AAACAQH/AP8AAAEBAAAAAAAAAAAA/wD/Af8B/wH/AgAA/wABAAD/AAABAQAA/wAAAAD/AP8AAAIBAP8AAQD//wAA/wABAQAAAQD//wD/AP8B/wABAQEAAQD///8BAAEAAAH/AP8B/wAAAQAAAAAA/wABAQH/Af///wAB/wAAAP8BAQH+/wABAQH/AP8BAAAAAAAAAP//AAAB/wH/AgAAAAEAAP8B/wH/Af8B/wAAAQAA/wABAP//AAL/AP8BAQAA/wD/AQAB/wD/AQAB/wEAAP8AAAEAAQAA////AAABAAD/AP8BAAEAAQEA//4AAQH//wABAAAAAQAA/gAAAQAA/wEAAQAAAAAAAP8BAQD/AAH/AP8BAAD/AAEBAAD///4BAAEBAAD/Af8AAAH/AAEC///+AAABAQAA/wD/AAEBAf8AAAAAAAAAAAAA/wD/AQABAAH///8BAQAAAAEA//8AAQAA/wAAAQAB/wEAAAD/AQAAAAAAAAAAAAD/AAAB/wAAAQCBhImBfX8AAAAAAAEoEfzHY/8QCQH/AAABAP8A//8A/gAA/wEA/f8A/gEA/wH//gCj1gRjuv38//8AAAAAAAAJCAmsrKhJS0kBAAH/AAABAAD/AAAA//8AAQEAAAABAAD/AAAAAAAA/wABAQAA/wAAAf8AAAH/AAAB/wAAAAD/AQAAAAAA/wAAAQABAAAAAAD//wDm5uZwcHOurKv/AP//AP8AAAAAAAEAAP8BGxMASy7/HRQA//4AAQAAAAEA/wAAAQEAAQEA/gIAAQAB/wIAAAL/AQIAAAICAQD/AQIA/wP/AQEBAQAAAQMA/wL/AQABAAMAAAD/AQEBAQEA/gH/AAEAAgIA/wIB/f7/2uEAxM0A3uEA/wAAAQAA/wAAAQAAAAIAAP4AAAAsBglYCRZRBhQPAAf/AAH+AQH/AwIA/wD/AAEAAQABAAH2BAX1BQb1Bwf6AwX+AQAAAAEBAAD/AQEBAAAAAQABAAAAAAEBAAD/AAEAAP8BAQEBAAL/AAAAAP8BAAEAAP8AAAIBAAD/AAAAAAABAAEAAQH/AAABAAAAAAEBAf8BAAH/AAAAAAEBAAD/AQAB/wABAAH+AAAAAP8CAAIAAQAAAAABAQAAAAH/AAABAAEBAAD/AAABAQAAAQAA/wEAAQABAAEAAP//AAAAAQDn+vTF8eK36djb9OkAAP8AAAAAAAEAAP8AAAAAAAEAAQAA//8AAAEFCAlPT05iYmBEQEEDBAQAAQABAAD+AAACAQAAAAEA/wAAAf8A/wAAAQAA/wAAAQD/AAECAAD/////AQAB/wAAAAAAAAAAAAAAAQEA////AAACAQH+AAABAP8AAAEB/f79AAAAAQECAf///wAAAAAAAAAAAAD//wABAQD/AAAA/wAAAQEC//8AAAD/AQAAAAD/AQAA/wABAAAAAP8A/wAAAQEAAAD//wABAf8BAAH/AQAA/wD//wEBAf8AAP8AAAABAAEA/wD/AQAAAAAA/wD/AP8AAAIBAf8A////AQEBAP8AAAAA/wAAAQEAAP8BAAL/AP///wABAQAA/wD/AQAAAAAAAP8B/wEAAAAAAQAAAP8A/wH/AQAAAAAC////AQEA/v//AQEBAf8AAAD//wEBAAAAAAEAAP4AAAEAAQAB/wD/AQD///8AAgEB/gEAAP8AAQABAP/+/wABAQD//wEBAAEAAP8AAAAAAQEAAAAA////AP8BAQEAAQAA/gAAAP//AAL/Af8CAAAAAAD/AAABAP8AAAH/AAABAAEA//7/AQEB/wAAAQAAAAEAAf8A/wEAAP//AQAB/gAAAQAAAAH/AP8AAf8A/gEBAQAAAQAA//8AAAH/AAAAAf8B/wH//wEAAf8BAQAA/wD/AAABAAABAAD/AAD/AQEA//4BAAEAAAAA/wEBAP7+AQAB/wEAAQAB/wD+AAACAAD/AAEAAf8AAP8AAAL/AP8AAAAAAAEBAAAAAf7//wAB/wD/AQD//wEBAQABAf8A/wH/AAAB/wD/AQABAP8AAAH/AAAAAAABAAAA//8AAQH//wABAQAAAAAA/wH/AQAAAP8B////AQEBAAD//wAAAQAC/wD+AQEBAAAAAP8A/wEAAAABAf7/AAH//wACAQD//wAAAQAB/wD/AAD/AQACAAD+AAEAAP8C/wD/AAD/AAAAAQABAQAA/wAAAAAAAAABAAD/AAAAAAAA//8BAAH/AQEBAP//AAEAAP8AAAABAAD//wD/AQABAAEAAP8AAQAA/gAAAAABAAH/AP//AQABAAAAAAABAAEA/wAAAQD///8AAAAAAAAAAQAB/wD+AQABAAD/AAEBAP8AAAEBAP///wEAAf8AAQAA/wEAAP8BAAAAAAD/AQAA/wAAAAABAAEAAf8A/wD//wABAgD//wEBAf///wAAAAABAAEAAQAAAAAA////AAEAAf8B/wEAAP8AAQEAAP8A/gD/AgEB//8AAAH/AAABAP//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AAABAAIBAP8AAQAA/wIAAQEAAQAAAAAA/wAAAAD/AAABAgEAAQH///8BAAAAAQABAAHt/fa+7t+46dfZ8ugAAAAAAAAAAP8AAAAAAAEAAAEAAf8A/wAAAAAwMzR1c3NNTUsLCwkBAAAAAQIAAAAAAAAAAAAA////AAACAAD/AQAA/wAAAAAAAQABAAH/AAAA//8AAAEAAf8AAAAAAAEA/v8B/f39AQEBAAAAAAH/AP8AAAABAAAA/wAAAP8AAAAAAgIA//8A/wAAAAEAAQAAAP//AAAA/wACAQH/AAAAAAABAAD/////AQABAAABAP8AAAH/AAAAAQD//gAAAP8BAAEAAf8A/wAAAQEAAAD/AAAAAAABAAABAP///wIBAP//AQAA////AQIA//8BAQEAAP//AAAA/wEAAP8CAQD/AAD/AAAA/wAAAQAB//8AAQH/AQAB/v//AQEBAAAAAAAA/v//AgEB/wD/AAABAQAAAAAA/wAA/wAAAv//AAEBAAAAAAAAAAD/AAABAAABAAD//wD/AAABAf8AAAEA/wAAAAD/AQABAP//AAABAAIAAP8B/wD/AQAAAP8A/wIAAf//AQAB/wH/AP8BAQD//wAA/wAAAAABAQAAAP//AAEAAP8A/wEBAQAAAP//AAEB/wH/AP8AAP8BAQEBAAD//wD/AAAAAQAB/wAAAQAA//8AAQEAAAD/AAAAAAABAf8A/wD/AQABAAEAAAEA/v8AAf///wEBAQD/AAAB/wEAAf8AAAAA/wD/AQAC/wD+AP8BAAH/AQAB/wAAAf8AAAAA/wEAAAD/AQEAAAACAP/+AAAA//8AAAABAAH/AgAB/gAAAf//AAEB/wAB/wD/Av8AAAEBAAD/AAD/AP8BAAAAAAEB/wD/AgAB/wD///8AAAAAAgEB///+AAEB/wD/AQAB/wAAAP//AQEB/wEAAf8AAAEAAAAAAAAAAP7//wIAAv8A/gEBAP8AAAEAAv8B/wD//wAAAQAAAAABAP//AAH/AAAB/wABAAD/AQEA//8AAQAAAAAA//8AAAEAAQEAAP8B/wEAAf///wEBAQD/AP8BAAAAAAD+AAABAAAA/wEAAf8AAAH///8AAQAB/wAAAAD/AAAAAQEBAAABAP8AAP//AAEAAAEBAP////8BAQH/AAAAAAAAAAAAAAEBAAD/AAAAAP8BAQEA/wAAAAAAAAD///8AAQABAAD/AQEA/wAAAP8BAQH///8AAAABAAH/AQAB/wAAAAAAAAD/AAABAP8AAAH//wAAAf8BAQEAAAD//wAAAAABAAD/AQABAAAA/wD/AQAAAP8A/wEBAQD///8AAQEB/////wAAAQABAAH//wABAP//AQEAAP8BAAEAAP8AAQEA/wAAAQD//wABAP8AAAD/AQEB/wAAAQAA////AAAB/f7+RUhRwL28AP/+DAT9y2sEKBH9AP/+AP4B/wEAAP8BAf8AAP8AAP8A/wD/APwBAQAB9vsAabYAotn8AAAAAAD+DAoNxMfDLi4tAQAB/wAAAP//AQABAAAA/wEAAAAA/wAAAQD/AQABAAAAAAAAAAD//wABAAAAAQAAAAAAAAAA/v//AgEBAP//AAEBAAAAAP8AAAAA/wAAAAAA/wAA8O/uc3R3oZ+e/wAAAAD/AAAAAAAAAAABAQD/ADMj/0IvAQsKAgABAAEDAgEB/wACAQEC/gABAAACAAEAAAEAAAACAQABAAABAAEA/wECAAEAAf8CAAAB/wEAAv8B/wACAQEBAf8AAQECAAACAQAB/wECAQD//wEC/wEA/v4D/vj3/s3RAMfMAOvtAAACAAIAAP7/AAEBAP//AAEAAQAAQAgSYQocOwYSAQMF/gEB/wD//wECAQD//wAAAAEB/wAC/wEC/QID+QQE9AgF+wIDAAEBAQAB/wAAAAEBAAAAAQAB/gAAAgH///8BAQABAQEBAP///wH/AQAB/wABAAAAAQIA//4AAQEAAQABAAAB/wAAAQEBAAAA//8AAQEBAP8AAQEBAAAAAQEB/wEAAP//AQD//wEBAf8BAQAA/wEAAP8AAAEBAAACAQABAAL///8AAQEB////AQABAAAA/wAAAQEBAAH/AAABAAEAAAEB9f37wvHgs+fU0+/jAAABAAD/AAAAAAABAAAAAAAAAAAAAAAAAAMCSktKc3B0QD88AQEAAAEBAQAA//8AAQD//wAAAQEB/wD/AP//AAECAP//AAH/AP8CAAH/AQAB//8AAQD//gAAAQEBAgIBAQAA/wEBAAAAAAEAAQEAAP8A/wEAAQABAAEBAf//AP8AAAAAAAH/AAD/AAAAAQAAAQEB///+AAD//wD+/gD/AAEAAQEBAP8AAP8B//8AAAAAAP8AAQH/AQEBAAEBAAABAAECAQD/AP//AAD/AQAAAAAB/wABAQH/AAD/AAAAAAEBAf7/AQAAAAD/AP8AAAAAAQD/AAH/AAAA/wD/Af//AQEAAgAAAAECAAAAAP8AAAEBAAAAAAAAAQD/AAEBAQD/AAAAAAD+AP4AAP8A/wEAAAEB//8BAf//AAD/AAAA/wAAAAABAAAA/wABAAAAAAAA/wAB/wD/AQAAAAH/Af8AAAABAQAAAAAAAAD//wH/AP8A/wAB/wH/AAD/Af8B/wD/AQAAAP8BAf8AAgIAAQAAAAAAAAABAf//AAABAQEAAAAAAAECAQD/AAEAAQEAAQEAAAAA//8A/wAAAQEAAQAAAAH/AAAAAQEBAP//AAD/AQAAAQAA//8BAAAAAP8B//4B////AAEA//8AAAIAAAABAf8BAAH+AAAA/wEAAAEAAf8A/gEAAQEB/wEAAP8AAAH//wABAAAC/wAA/wABAQD/AQD//wABAQAAAAABAQABAAEAAf4A/wEAAAABAAAAAAAB/wIAAQABAAAA/wAAAAAAAQAA//8BAAAA/wEAAP4AAAD//wEB/wEBAP8A//8AAAEA/wEAAf8AAAEAAAEBAAAAAAEAAAABAAD/AP//AP/+AP8BAAD/Av//AQH/AAEBAQH/AP8A//8A/wEBAAD/AAEA/v8BAAD/Af8A//8A/v8A////AAEBAf8BAP8AAQABAAEBAAD/AP8A/wIA//8AAAD//wD//wAA//8AAP8AAgAAAP8AAAH/AAABAAAAAQEBAQEAAQAAAAAAAAEAAQD/AP8AAAAAAAABAP8A/wAA/wD/AAEB/wD/AP8AAP8BAAAA/wAA/wD/AQAAAP8BAP7//wD/AAD//wAAAAIBAQAAAAD/Af4AAAAAAAAA//8AAQAAAAEBAAAAAf8A/wEAAAD/AAD/AAD//wAAAAAAAAEAAAEA/wAAAP8AAQH/AQAA/wD/AP8A/wAAAAEAAQD/AQABAf8AAP//Af8AAP//AAEBAAEBAQAB/wEAAQEAAAEBAQD/AQABAAEAAAEBAP8AAAEAAP//AAEAAAABAAAAAQAAAAAAAP8AAAABAf8AAAMDAj09OwABAAAAAfT8AMLnBAAF/gAHAAAKAAAJAQEIAAAJAv8IAwAHAwEEAwAHAf8EAAkHAX4+ACsQAAAA/wAAAvT29bS1t/8A/////wD/AAEBAQAAAP8A/wAA/wD+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AQD+AAP9AwL7BAL4BAT9BAP+AgH+/wEBAAH/AAAAAQABAQAA/wEAAAAAAQABAAH/AAAAAAEAAQAAAAABAAABAAD/AAAAAAH/Af8BAAIAAAEAAQAB/gD/AgEBAP///wABAQL///8AAQECAgD//wEAAAABAAAAAAAAAQIB/wD/AQEAAP8A/wECAQD+AQAB/gEAAgAAAAAAAAABAQD+AAEB/wEAAf8AAQEAAAAAAAEAAAEAAf38/wDJ7+Os6dPN7eD/AP4AAAAAAAAAAP8AAAEAAQAA/wAAAQEFBgZUVFVzcm8xMDEAAf8CAQH+AAEA/wABAAAAAf8A/wABAQH///8AAAEAAQAAAP8AAAEAAAAAAP8B/f7+AgAA/wAAAAAA//8AAQEAAAD/AAABAP//AAIBAP4AAAAAAAIB//7/AQAAAAD/AAABAAEAAAAAAAAAAAAA/wEAAf8BAAAAAAAAAP8AAAL///8AAAD/AQABAAABAAAAAQAA/gD/AAD/AQABAAAAAAAB///+AQECAP8A/wH/AAAAAQAAAAAA/wAAAAD/AAAAAQAB//8AAAH/AQAB/wD//wABAQABAQH/AQAA//8AAAAAAAD//wEAAP4AAQEB//8AAAEAAQAA////AAABAQEA/wAAAQAAAAD/AAABAAAA/wAAAAAAAQD//wABAQAA/wAAAQD/AAAAAP8BAAH//wEBAP4AAAAAAAAAAAEBAf//AAEAAAAAAAAA/wEAAf8A/gD/AQAAAAABAQAB/wD/AAAAAf8AAAEAAAAAAP///wEBAgAB/v/+AAIBAf//AAAC/wD+Af8AAAEAAAABAQAA/wD//wAAAQAAAf8B/gH/AQAB//8AAAH/Af8CAAD+AAICAf7//wEAAAAA/wEAAP//AQACAAD//wAAAf//AAEBAAAAAAAA/wEAAP8AAAAAAf//AQEB/gD/AQABAAABAP/+/wABAQEA/wAAAQAAAP///wEAAgABAAEA//8AAAEA//7/AQEBAAAA/wD/AQABAAD/AAAAAAABAQD//wEB/v8AAgD/AQAB/wAA/wAAAf///wEBAf8AAAD/AQEA//8BAQIA//8AAAEAAP8AAAAAAAD/AQEB/v8AAAAAAAAAAQD///8BAQABAAH/AAD/AQEB/v7/AQIBAP8A//8AAQAA/wEAAQAAAAAAAAEAAP8AAAAAAAAA/wEAAf8A/wH/Af8B/wAAAv8A/wEAAAAAAAEAAP8AAAAAAP8AAAEAAAAAAAEAAAAAAQAB////AAAAAAABAAAAAAAAAAEAAAD/AP8A/wEAAP8AAAEBAf//AAAAAAEBAP//AAEAAP8B/wAAAQEAAP8AAAEA//8AAQEAAAAAAP//AAAAAQD//wECAP8A/wH/Af8BAAD/AAEAAP8BAAAAAAH/AQAAAAAAAAAA//7/AQIBAAAA/wABAQD/AAAB/wD//wAAAQAAAAAAAf///wABAQEBAP//AAEB/wAAAQAAAAAA/wAAAAD/AP8AAAEBAAD/AP8AAQEB/wAAAAAAAP8AAAEAAP8AAAEAAQAAAAAAAP7/AAEB/wAAAAEAAP8AAAAAAAEA8PH0QkVM0MvLAAD+JBYC13L9BP79AAEB//0AAf8BAAABAP8AAP8AAAABAAAB//7/AAEBAP8B9/b+frz6kM///QAAGRocUU9Qzc3O29zb7u7vAAABAAD/AAD/AAAAAAD/AAACAAAAAAAAAAEAGBcXKywtNTQzQ0RBOTk5CgkJAAH/AQAA//8AAQEA/wABAf///wEBAQD//wAAAAABAQD//wAB////AQABzs/PfHt+uLi3AAD+AAAAAAABAAAAAQAA/wH/ARMOBDswAislAAYE/wABAQIBAAABAAEAAAICAAEBAP8CAAEAAf8BAAEB/wIAAv8BAAAB/wABAQIA/wABAgABAv4CAQEAAAABAAABAQECAQIBAP8A/QAC/gEBAAEC/gEB/f8BAQAB/gH/APX3/dPW/87SAODhAP39AAABAAAAAAEAAAABAP//AQEANQsTUAkaTAcVCQIGAAAC/wEB/gECAAH//wABAAEC/gEB+gQD+wMC+wID/QMC/gMCAP8B/wEAAP8AAQIAAP8A/wEAAAACAAAAAAH/AQAAAAADAAD/AQEBAP8A/wAAAAEBAQEB/wD/AP8AAQAA/wECAQAAAAEAAP8AAAEBAAAAAAAAAAAAAQEB/gABAgH/AP8BAAAAAAACAQAAAAAAAAEAAAAAAP8AAAIBAf4AAAEA/wAAAAABAQEB/wAA/wEAAf8AAAEBAAAAAAAA/wEBAAIB+/790/HluuvZw+zd8/z2AAABAAABAAAAAAD/AAEBAP8BAAEAEBASWlpXcHBvIyEiAAIBAQEBAAAA//8AAgH///8A/wEBAQAAAAAAAP8AAAEA/wD/AgABABaE6XsB/v7//wAAAAD/AQABAQD//wAAAP8AAAEA/wAAAQAA//8AAQEAAAAAAP8AAAAAAAEAAAAB////AAEBAAD/AgAA/gAAAf8A/wH/AQAAAQAB/gAAAv///wEA/wEBAf4AAAEAAAAA/wABAAD/AAAAAgAA/gAAAAD/AP8BAAAAAQEAAAEAAP8AAAAA/wH/Af8BAAAAAAEA//8AAQD///8AAQECAAD//wAAAQAA/wD/AP8BAQEAAP8AAAD/AAEB//8AAQEA//8AAQAA/wAAAAAAAQEA/wAAAQD//wABAf///wEBAAAAAP8AAAD/AQAA/wECAQD/AAEAAP////8AAAEAAP8AAQEB/wAAAQD/AAAAAAABAAH/AP8BAAAAAP8AAAH//wACAQD/AAEAAQAA/wABAP4AAAH/AAAB/wD+AQEB/v8AAgAAAAAA/wAAAQD/AAACAAD/Af8A/gIAAP4AAQH//wABAAAAAQAAAf8A/wH/AAABAAAA/wD/AP8AAAAAAQEB//8AAQEAAAEAAP8AAP8AAAH//wABAAD/AQAAAP8AAAEB/wD/AQEBAP8A////AQEBAAD/AAABAP8AAAEA/////wEBAf8AAQH/AAAC///+AQEA/wABAAD/Af8BAQEA/wD/AAAAAP8AAAEBAAAAAAAAAAAA////AQEBAQEA/v4AAQH//wABAQEAAAD/AP4AAAEAAAAAAP8BAAEAAAAAAAD/AAABAAAAAP//AAEAAP8BAAEAAAAAAAABAAD/AP///wEBAQEAAP//AAAB/wABAQH/AP8B/wH/Af4A/wEAAQD/AAABAAAAAP8B/wEAAQD+//8BAQIB////AQAA/wAAAQAAAAAAAQAAAAAA/wEAAAABAP//AAEAAAD/AP8BAAD//wABAP8AAQIA//8BAAEAAf8AAAAAAAD/AAAB/wD/AAD/AQEB/wAAAf8A/wABAQEAAP//AAEBAP//AAAB/wEAAf7/AAIAAAABAQAA/wD/AAAAAAAB//8AAgD//wABAAH/AQAB/wD/AAAAAP8BAAEA///+AQEA//8BAQAAAQABAAAA/wH/Af8BAAAA/gH/AQAB/wAAAgAAAAAA/wD//wAAAP8A7+7v7Ovt/v//AQMCAwQDERIRDgsMBQQDAAEBAAAAAAAAAAAA/wAAAQAAAf8A/wEAAQAA/wAAAQD/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AAD//wD/AQABAAEAAAABAQEA/wAAAQEAAAD/AP8BAAAAAAEAAQEAAAEBAQD//////wAAAQABAQEAAQHe9+ym5M276Nj9//0AAP8AAAAAAAIAAAAAAQEA//8BBANaV1eDhIQhHh7/AgEBAAD/AAAA//8AAAEBAQD/AAAAAAAB/v79AAABAP//AAAAAAICAf///wEA//8AAQAAAP8BAAH//wAAAQD/AP8BAAEAAAD/AAEB//8AAQAAAAAAAAAA//8BAgH//wAAAQAA//8AAAAAAAEBAAH/AP//AP8AAAEBAAAAAAEA/wABAf//AP8AAQEA/wAA/wAAAQAAAAEBAP7+/wIBAP//AQAB/wEAAf///wAAAAABAQAAAP8A/wH/Af8BAAEAAAH///8BAgEA/v4AAQEAAAAAAAAAAQEA//8B/wD/AAEAAP//AAABAAAAAAAAAQD/AAAB/wABAgD//wAAAAAA/wAAAAAAAQAA/wAAAQEBAP//AQAAAAAA/v//AQEA//8AAQEB/wEAAf8AAAAA/wAAAP8AAAH/AQEBAAD///8AAQABAAAB/wD+AAABAAH///8BAgAAAAD/AAABAP///wEAAQAB/wAAAP///wEAAQAAAAABAAAAAQAAAAAA/wEAAP7/AgEBAAAA/wD/AAEBAP8A//8AAQD/AAICAP////8BAQH//wAAAQD///8BAQH//wAAAQABAP8AAAEAAQEB/v//AQAAAAD//wAAAQABAAD///8BAQEB/wD/AQAAAAEAAAAA////AQABAAD/AAAA//8BAQL/AP8A/wAAAP8BAQH/AP8BAAH/AAAB/wD/AQAA/wAAAQAB/wAAAf8AAAEB/gD/AQAAAf8AAAAA/wEAAgABAAD//gAAAP//AQAAAAAB/wEAAQEA//8AAAAAAAEAAf8AAAAAAAEA//4AAAD/AQEBAAABAAD+AQEB/v8AAAEAAP7/AQEAAAABAAAAAAAAAAEBAP/+/wABAQAAAAD/AAEBAP4A/wIBAP//AAAAAQABAAD//wAAAAD/AAABAQABAAD/AP8AAAIA/wAAAf8AAAAAAAAB/wEAAP//AAD/AQABAP8AAAIAAf8A/wAAAAAA/wAAAQAAAAAAAAAAAAABAP///wEAAQEA//8BAQEAAAD/AQAA/v8BAQEAAP///wAAAQAAAAAAAQD//wABAAEA1dfaxcfH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AAD+AQIAAgH//wD+AwH/AAH/AQEAAAH/AQEAAQEB////AQH/AAABAQH/AAABAAH/AAAAAAABAQD/AAEAAQEA/gAAAgD/AAAA/wABAQEBAQH//wAAAQEAAQD/AP8BAAAA/wEBAP//AQH/AAAB/wEAAgEAAAAAAAABAQIA/wAAAAD+AAACAAAAAAH/Af8BAAEA/wAAAAAAAQEAAP8AAAEAAQEB/wD/AAEBAP//AAD/AQAA/wEBAAEAAgDz/fq36tWr5M3n9/AAAAEAAAAAAAEAAQEAAP8AAQEgICF8e3peXVwFBQT/AAEBAAD/AAAB/v39AAEBAAAA//8AAQEA/wAAAQAAAAD//wABAf8AAAL/AP8BAAAAAAAAAQAB/v//AAH/AQAAAAABAAAAAAD/AP8AAAEBAQD//gAAAQAAAAABAP///wEBAQAAAP8A/wEAAQAA/wAAAAAAAf8AAAEA/wAAAQAAAP8A/wD/AQEB/wAAAQD/AP8A/wEAAQACAAD/AAAB///+AgAB/wEA/wH/AP8BAAAAAAAAAf8BAQH//wD/AP8CAAH/AP8AAAAAAAEAAAD///8BAQEB////AAEAAf8AAAEAAP8A/wEAAAAAAQAA/wAAAQAAAP8BAAH//wAAAQD/AAAB//8AAAD/AAEAAf8BAAABAAD//wD/AAEBAQD//wEBAf8A/wAAAQAA/wABAP//AQAA/wIAAP//AQABAAAB///+AQIBAAAAAP8A/wAA/wAAAQAAAAD/AAACAf///wEAAAH/Af8BAAD//wEBAf8AAP///wEBAf8AAAH///8AAAECAP/+AQEBAAAAAAABAQH///4AAAH/AAAA/wABAQAAAP///wACAQH/AP//AAABAAEAAAAA/wAAAAD/AAABAQAA/wD/AQABAAH///8AAQEAAf8B/wAAAAAAAAAA/wAAAAAAAQD/AP8BAAIB//7/AAEAAAAAAQAA/wD/AQEBAP3/AAIB/wEAAf//AAAB/wAAAQEAAP4AAAIAAP8AAAAB/wD/AQABAP///wEAAf///wEAAP8AAQEB/wAAAf8AAAEA//8AAQEBAAD/AAAAAAEAAf8A//8A/wH/AQABAP8AAP//AAEBAAEA/wAAAAD/AQACAQD/AAAA/wABAP///wEAAP8AAQAA/wEAAAD/AQAB//8AAQEA/wAAAQAAAAAAAAABAAH/AP//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AAAAAAIAAAEAAQD/AQH+AAABAQL/AAAAAAEAAgH/AQEBAAH+AAAAAAIAAP8AAAL/AAAAAQEAAAAAAAL+AAABAQL9AP8AAQL+AQIA/v/64eD7vsEA0dQA/vsAAAEAAAAAAAAAAAEAAAAAAAAAAQAA/wEQBAdNEyNPEyQeBg0BAQH/AQD/AAH+AAEAAQAAAAD/AgAAAAEAAQEAAAIAAP//AAEAAQAAAAAAAQEBAAD/AAD/AAEAAAD//wEBAgEA/wAAAQD//wABAQAA/wEBAQD/AAD/AgEB//8AAAEAAAEAAQAAAAAAAQEAAP8A/wEAAQAAAAEB/wD/AQAAAAABAAH/AQAAAQAA/wIA//8BAgAA/wH/AQAB/wABAQD/AAAAAAIAAP8AAQEA/wD/AQEBAAAAAAEAAAABAQDm+/SR2b7D7NoAAAAAAQAA/wAAAP8AAAIAAP8ZHBuHhYNeXF8B/v7+AAD/AAABAAAA/wD/AQAB/wAAAQABAAD/AAAAAAAA/wAAAv8A/wH/AP8B/wH/AQAB/wAAAP8BAQD/AAEAAP8A/wEAAQAAAAEA//8AAQEAAP8BAQD//gABAQEAAP//AP8AAAAAAAEAAAD/AP8B/wEAAQABAP//AAEAAAAAAP8B/wH/AQAAAAD/AAABAAAB/wD/AQAAAAAAAQAA/wAAAP///wABAQH///8BAAEAAP8AAAH/AP8BAAEAAQABAAD//wAAAAAAAf8A/wH/AP8AAQEAAAABAAD///8AAQEBAAAAAP8A/wEAAQD/AAAB/wAAAf8AAAH/AAEBAP4AAAAAAAABAAD//wIAAP7/AQEBAP8A/wEAAQAAAAEAAP8AAP8A/wH/Af8A/wAAAAAAAAAA/wD/AQECAAABAP/+AQABAAAA/wAAAQD//wEBAf8A/wEAAAAAAQD///8BAAD/AAAAAQAAAAEBAAD/AAAA/wAAAf8BAAIA//8AAAAAAQABAQAA/wH/AP8A/wAAAgD/AP8A/wEBAQD/AAAA/wAB/wAAAQD/AAABAAAAAP8AAAD//wEAAf8BAAL//wAAAAABAf8AAAAAAAAAAAAAAAEAAP7//wEBAQEA//7/AAEBAgABAAAA/wD//wD/AP8BAQEAAAAB///+AQEA/gACAQD+AQABAAAAAAAAAAAAAAAAAP/+/wECAf///wABAAEAAAAAAQAA/wD/AQABAAAA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HAgQ/wAB/wEAAAAA//8BAQQB////AAABAAAA/wAAAAECAP8AAAEAAAAAAAEB/wAAAgAA/wAA/wAAAAAAAAABAAEBAAEAAQAA/wABAAAB/wH/AQABAAAAAf8A/wEAAQABAP8BAAEAAQH///8AAAAAAQEBAAEBAP8A////AAIBAP8BAQEA/wAAAQABAAAAAAEA//8AAQEAAAABAAAAAAEAAP8BAAEBAf8AAAABAQEA4/jwfda02PHlAAAAAAAAAAACAAAAAf39/QAAAgEB/wAAAQAB/wD/AAAAAAAA/wAAAgAA/wD/AAAAAAAAAAABAAAAAAAAAf8A/wIAAf8A////AAEBAf///wEBAf///gABAQEAAP4AAAIA/wEAAQABAP//AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAAEA//8AAQIA//8BAgAAAP///gEBAP8AAQH//wEBAP8AAQD/AAABAP8AAAH/AP8BAQEA/wAAAAAA//8AAAABAAD+AQEAAAAB/wAAAgD//wAAAP8AAAAAAAEBAAEAAP//AAAA/wAAAf8AAAABAAEAAAABAAD+AAEBAP//AAABAAAAAQAA/wD/AP8A/wAAAAABAAAAAQEA/wAAAAEAAP4AAQEBAQD///7//wIBAQD/AAEB////AAABAAAAAP8AAgD//wEBAP//AQEB/wAA//8AAAD/AAEAAQAA/wABAP//AAEBAQD//wACAQD//wAAAf8A/wABAQH/AAD//wAAAQAA/wAAAP8AAQEAAAAAAAABAAAAAAAAAf8A/wEA//8AAAEAAf//AQAB/gEAAAAAAQAAAAAAAP8A/wEAAQAAAf8A/gEAAQD//wABAQAA/wAAAQD/AP8B/wH/Af8AAAEBAAD/AAD/AP8CAAIAAP4A/wD/AAACAQD+/wAAAP8AAgIB/wAAAP//AAEBAP///wAAAQEBAQAB/wD///8AAQEAAAAAAAAAAAD/AAABAQAA/gAAAQABAP///wABAQH+AP4BAAEBAAD//wEAAf8AAAD/AQEB/wD/AP8C/wH/AQD/AAABAAAAAQAAAP///wAA/wECAQD+Af8B/gAAAQH//wABAf//AAEBAP8AAQEA/wAAAP8AAAEAAAAAAP8AAAEAAAD//wABAQAAAAABAAAA/wAAAf8AAQD//gEBAQD/AP8AAAAAAAAA/wEAAQAAAP8A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AP8AAAEBAP8AAAICAP8A/wEBAAABAAEB/gABAAEBAP8A/wEAAAAC/gED/QEAAAEB/wEC//8A/wIC/gAA/gMC///+/Lu9+a6xAf36/wADAAAAAAD/AAABAAD/AAABAAAAAAAAAAAAAAAAAAEBAAD/AP//AAABAAD/AAAAAwECLA0YQRIfOxAfHAgO/wEAAP8BAAEAAP8BAQIA/wABAAAAAAAAAAEB/wAA//8AAQEA/wEBAP//AAIBAf4BAAEAAAAAAgAA/wEBAP8AAAEBAAAAAAAA/wAAAgAB/wAA/wABAQH/AAAAAAABAf///wEBAAABAQAAAAEAAAAB/wAAAQEAAP8BAAL/AP4B/wEAAQEBAP8AAAEBAAAAAQAA/gAAAgAA/gAC/wH/w/TiiNO08Pj2AAH/Af79/v8B/wEAAQAAAAAAAAAAAAAAAP8AAAEAAAD/AP8BAAEAAP//AAECAP/+/wABAQAAAAEAAQEAAP7//gAAAAEBAQAAAAEA//8AAAAAAAD/AQAAAAAB/wABAQD/AP8BAQD+/gEAAQABAf//AAABAAEA/wAA/wABAf//AAAA/wEAAQAAAQAA//8A/wAAAQAAAAEAAP//AAAB/wEAAf///wEBAf8A/wEAAQAAAAEA//8AAQD/AAABAQAA/wABAAD+AAABAP8A/wAAAQEA/wAAAAAAAQAAAP8AAAH//wABAQAAAAABAAD/AAH/AP4BAQAAAAEA//8BAQD/AAH//wACAP//AAEBAP8A/wH/AQAA/wD/Af8A/wEAAf8AAAABAQH//wABAf8A/wAAAAABAQEA/gD/Af///wAB/wEAAf//AAECAP//AAEAAf8AAAAAAAEA////AQEBAAAA//8AAQEAAAAA//8AAQEAAAAAAP8AAQIB////AAD///8BAgD//wEBAP8AAAAB/wH+AQAB/wEAAf4AAAL/AP8B/wAAAQD///8AAAEAAAAAAQAB////AAIBAf8A/wAAAQAAAP4AAAEAAAEAAAEAAP8A/wEAAf///wEAAf8AAP8CAAAAAAEAAAD//wAAAP8AAAEAAQAA////AAABAAEAAQAAAAAAAP8AAAH/AAABAP///wAAAQAA/wEAAf8AAAEBAAAAAP8AAAEAAP4B/wL/AP8AAQAA/wEAAf8BAAH/AP8AAAD/AAEBAP8A/wAAAQEAAQAA/wAAAQH/AP8C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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_output(output)" + ] + }, + { + "cell_type": "markdown", + "id": "e247b2c4", + "metadata": {}, + "source": [ + "## StableDiffusion " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "315025e7", + "metadata": {}, + "outputs": [], + "source": [ + "tools = [SteamshipImageGenerationTool(model_name=\"stable-diffusion\")]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "7930064a", + "metadata": {}, + "outputs": [], + "source": [ + "mrkl = initialize_agent(\n", + " tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "611a833d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to generate an image of a parrot playing soccer.\n", + "Action: GenerateImage\n", + "Action Input: A parrot wearing a soccer uniform, kicking a soccer ball.\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3m25BB588F-85E4-4915-82BE-67ADCF974881\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now have the UUID of the generated image.\n", + "Final Answer: The UUID of the generated image is 25BB588F-85E4-4915-82BE-67ADCF974881.\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n" + ] + } + ], + "source": [ + "output = mrkl.run(\"How would you visualize a parot playing soccer?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d7a3edaf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The UUID of the generated image is \n", + "\n" + ] + }, + { + "data": { + "image/png": "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48I3fpg/U/i58ys412pTLWKaQuyGvSmV0qLf1ZI/ff18zZehH5xDbqoIr+tJQft+fzPE++PDcl2fPn8Z97vbYbhNN/OuXpbr6fz6TZ0EKgIiAujNFIO7zue3D29+/O7tb777sORFucyyvp5P+90hkinWxepSOMa43+0A8Dytu11/u9sl8NGPwS11Xozw0MW+7/thP63r5fERoO3H3a4/HoYbMVOiuTUhN13n6OM81fubMfq41LpQEcnzPBGJmpU1l5Rn6s7X+TLlkEL0/uXlDEjB+b5P6OB42IfUXy5LyTUNXWHe+xjSQMTe89fPT2B0jd4hGoCafPz86eHmQQxubm+FmaXN8yS5Pb48TvO51jVFb9bWzKxw8HsV9YHIu8evX1z00+m6AeRV0CExy5jGOk0m7L07HHbH3U7W9nk+//r5l9YWQ+53nZot0/x8efrNDz/dHm6eX56QInojAC7sDy6NXReTd/HNmzfOuWletbGZTPNSc72u048/fM/V3r9/t0x1nQo65KYAtM7tVabDYecf3S7uPIVlXtbrerjputhZrvN1JsF37x468vl8ZaT3v/kJydUlE9anT88K3vmkvDZetGlZy9D3T49PxvX2cNjd3X7+8sm76AydhzXX67yixzzxw/v7ygWgHe/3P3/5k+/3ERDXMp9r3sSQ+74z8pd5Vueijzf723Vd17wqwH53kKqg1KVwd3fXD8nUWmulbS1zdC4sS0XIp8sFE8UUui4qGHMDERTRWvO8Rgi34/HZn1ptGattG8hE0dQ7PPS7w26/H0dmeZ3PzrSt+fX1peby8vJqpt1+QEddjO/u3nfOP83u+vrSpO2POwBIoW/F1uuCBoTkvev6obZ2vlzm6zpdT10KqR9ubw7LWuc5N875vGjnKPkudve39z/88DBdTk/jcwhhmqfa5HDYKQDXCmhrWU+XK0jzvltzXed5mZfC6+nl8f2b97e3B2eUc1GCH968XdaJZD69rLleyffOBVYoeU4ciug0z6XlkajUVedggJS892Gbh97sj46can2dXkVs34+p6xMErYDVHDofAijWxkglRAPSbvQgLsTh/v7hsB/nxYVAXdxH80stuawg9PDmPhBdLl/Ft+Bc9M6Uc1276AyExfoQYx9bq/0Q3727BWdzPjfhvkt3+yFnLWWd6rVPqUudp661IpJrW7jV/W6HhrXBtS2G4IJzgYTLaZ5wguS7ru9vj/v9bjd2YyW+XC4fP34tubjeuRCBPCDsb26CC9N8WevS9X6/7xH6/eFgpoMMsq7ruo5D0EjTvLKUqV3zcf+LX8klHzucmr25xTC8PH85/3rdBd4f+vkWXrvyVeCXMf2ywr/97gfnTvry+iV/nvX45u3u83xS+ePD2/8jxT+Xj/9e679P3g505gOH26P67x+fPwd/celxTLvD0DzkSEJk10te024HX/e4jvSrh5MLsYuOtQTw4oG5mUNkTgn7sbuuZ5badWkYo2j9+vj1lKfUxQ/fvf/tDz9KVeXcSqMdeXTXvArzvh8u56dcl92w9z68nK55nrOsfUhbr945BZmTayvk4+Bvb/vz+fV4OEaSJZ9ztq6P4zjc3h5zzUtzu8Pw7nhY56ksjyrNYSNoSC24dIjxMIzn61Na3Zv7N8fx9prb4+Nz34f9eOyMPfk+dGA0z6sOggSIopzJsQF45wQgF/l1+TJdXqc672GI3bDb70qujsg7TDH2Xd/F4c0DdX1c52Ji07w66h7e3j9+fXQOT6fXZTrvDrs4pr7vHu5viSz1vrQZnVVZn86PXMq0rJfpnJJ/++6dT/j8eipLq9JiioDgo1sWmc5zWcvbt++T9wZYa5uuMzY7X05ryd67w3F/c7z5enr+85//9Ovnn9FRl2LX946Gp6fn0+lyf//mN2/fC/LT18eb/T7Fm1zbGPs1N0CMwV/nZV7Ww2G4vbsdhu7TX37d7UZPkLy/u7vNyySMYPjLzx/fvX8ILuTrCmoP98fv37//9OmR2MbYfa117KPWJRKmLj0/f315EQzd8e3NkLrYx0+fn9b5cnMYuBSuU98dgXzE+NP33/vYrWXuOgc6HA7ju/dvL6eX+8Ptm8PddbouZc11NaEUunlZ3tzcibIJ/N0f/s63zLWW6zIDMAB0Idwd31TGy1wQKUDofNQojeUyvf704w9mNM/L6XQh8LW1l+mylgIAItCnZGAMuszTdb683T28+f6dCDLrr58/ajNAKVy+Pj6qws1xHIfhfIqIfjh0wtJAN1vF0CcHZEx5ua6nuY9RWTaWe3TUjXtKoTX1MV7K5VTLeXrtUnAeWa3vewD89OnpdH4+HvZdGpDIFM/n0/n1deyHP/zN77hVAnz3cPdyOn95PF2v0zJNQVO/e+Mx9d1IFiW3v/vDT8Gn59NlmebUJyO9TGc1YYVpnaVU71vOpdXcdX70+/V6FnbaJKDzhtZ08N1440/X8+n8ei057exmt0fExss6L2bVTHKetsClz5xzNW3Ou+i9lLZ/OKDgcpmpwg/vvj/ub55Ozy+v53G/+/1vfvNP//InNRu7gctUS+Fahz6I9xycc27sBm0m6zqmJAzz9VytESkSNq6U0un64gOOxx0YfvzyuR/GYRg2nGrqHKD66BFhWmbn1MfAhZvynz9/enl9mabT/ng8DEcf03y5EpoBN86X63I4HJPvpvOFQWJMRmhkGMwR1Nw4S2PuQhhSmWx5nc5Pr0/Tsi7zsvNjFzw5BwA3x4OjeL2ePn/+cjyOP3z37vZ4LwbLurSqtWq7LFyg7T2Lnqezv++18zWmr1cIrbzt38yd98Px1395fCnt1jDcOfyuvSh/zvRLgTnIP3dfDr/5v798/H98/jV//9297uPHP71yPXfHz53RcU88vyRdo05wg/7tsJRXV7/iYpSufjfcvI0uCNjrEOKx9S+XxftPY2ouvkD7lJdXh+n+3fHLVy7r6jDudn3q0jD0h/1xmafPX39Fs1p4LSshvX14FyPdHg7O4J9+/uP5+py6IKxP18vHl6ebww7MnHfBu9R3wceYyy+/fNwNI+6P/bAzlMfT1/v7nn8t83QhAJXad6G2a1Nd22KmfeqHsXfoDaz3/mY3rJqf1ufLdSIhA2Ir67KI4pena0ph6NOu/3AYb9jgcvl6nk5j/2bo+rWumRBUnEGZMqo0J4DsPaZIy9yWyxyOacZay1JLfvNw9937t+S71+k6z2tdiqB4p9Pl0pjfPzzsxv7x+fXp8Qko7I6D994MQ+qX11cYYubmjGIXDvuDIgAaegDw5+vVucAl11LHIVJwhDh2Q//d/nK5TtPEUadp8R4Px/3QJd1DjOF6vqy1Cdv5PAkzc6u19l2/QTe/vjyfpwtn9Yl2dwdysWDsu2GhmtcSuxBLsABC9vR8vbu/ySbPj8+b832dl7wsMYToMPW02w9fv7wcbm6lGRKI2elyMZC+G46397/73Q9f//Txz//y6z89Pd/d3e77zis8fX588/Cw7wfh9vL4+Pu/+/08pefTSxX37v5NF7u/+fDT+5s3//G//ofr+VqF+zEx69uH+3f3b9YyP50vudStqz+ksSzt9nh8uHv3/vbt//Jf/hdASZ13MVqFENySl13fHW9uvnw5+3Uu12nWTXsBEFNY8vLp8VQK397dHrqdNit5znnddf0G5Llezl2MYMTNWsvkXQzRoRO25Tr5PghIjOmwO75/eMtKr6+vrdXT5RKc3/Vd9GOM3d3NXRpHFcsli4pHIrAUQh/j4MgTvHz9WriU3LhpP/bzvM7rhKBlXUjj7nCsdf3L6Xmap+Cxd253M55P024cK/Pl6fr8cjElIuy7gZu0Nd/e3Dzc3f7DP/xhudaf/+Xnt+/fffn1SyCNnXv++trtPnQhHHe7vF4/f5klL28ejlWFa86Fn78+ra3UvO73+243aFZWl0tbp3no+g/v3wXnOj8am3dERMH7lpfH5+euD4a4ltpKYyy7wzLs962BtFVaSWM44B7VgUFd6zRNRLhLY/ROAVC4VRGWiDGFLjo7X67P5+tuv3/8+hoprK1aYwe41orORgi3h310Ic/l5eXZxKZ57pOb5lXVur7zIXAR513qEuExBffw5v58ui5z7rseDMx0na/Wdz98/8EjNamffv2sahRpwChiy3x9PZ2Y+e//1fdj3y+irSmhDGPyRK3Ty/lcyuPj65z67v3tIfqkrglXFCDFJecM3HWD4mvpy3k5v55f2dj1wYRYZNjRw839rh/MebVSeU7ueHe8PYzdL4/PX54el7msRZzjuvDt7TvFPO4GhmX/9uY3P31/+vjr59dr9+YdU53WP/+8W64/usXg7W8e6mH+ZXn59USniteer/Xrcv3v3fEdHdzf/E/36+Xn9pdi5F6n/+daejxK2q1YV5cwdOTvLtdPH9G9hOHk+u9uv/vdjz+8LzGfnz4qLze3f0i3w/Onf3TkDzfu5nh4/lTPX1/NWlEutXz/4f7Hn350FGsuYIV1SaNzwD6Aa4IkIfoYnLb6+evHL89fL5fz/fGOBX798inEYE4NtO87QfUIqoZG+90ILKqtaVvydHuzu86XpZ6vl+uyLOPh2CUvWj9//Hi82YlwRO/BI8o8nZ6fv9zf9Gz4eL7mwvu0C+Q7i8tcRPzTyxm9+/Dh9s3hDgVeL1+ul9dynXMa/WCnyxMoNlK3o2HXMTQCWnP++vWzc9Aatlyi68QJoqRufP/mw9//4ffXuczzan3wprkqi87TyZyVOuzGYTd2Hz/WXX/423/1Gy768vwqu3Zzf3CB3r69P+6HWjlRd72eMq8peAHHra3XhRwSOgZFtC764/64H26ewtNXgMfHl8Kly+n+5u5v/u73Ly+v/+E//edlnbu+67tOTaZ5Pe77t91DzYWcnafXaTqXzH2/R6e5VnDcDcM//G/+bv1tnqfr6Xyap5UAPj99/fLlFZK/3Y9TLiDkQkBPteTdkKbrdF2Wru/Gm9HElrLWkl+fLw5CfzN+98P3UvLp5WWaz9MynU9L6Prb4760djlfjjfvj+Pw8vwqWtdp6rt4XfXl60sQPH89EcW//de/3Y+Hf/rnP+13t6D69fn05ub+mPrrfPry5dOal7HvxmEkaF++nEtuv/npm2809PFwM5xfLrnldiq3t8f7+zc3d/vXufjWmie8vXvoggNC0frx09fH55eYRjF4PL10fVyWaUwRkMq8WO83mLOIGWtM/d3dDd7S5bo8fn6ZyzomG4ahjz0onp6m8bB7/933+qusaz4Ou+/evL27eTcta+OaQtzv9uTpcr6cLteYXN+H6IOniIy979cltypiNk/z7e3t7e13eZ5eTpcYAqpO1/Nlyedpend/yJz9FQ+7PRde1tXAxt2umZK4keh4MzprQ5+8c18+vyCFOc//9C9/uru/DUP3T3/803S4TTENsRvSoKLT9Xmdr9pWcH6dMzOUXBU1pfTD+w8ew9WWVtqzXMJN7Lv+ZrwXbrd7MrHKPJfZO3LRj4fxt7/73si61D2fT1MtJpDXXNaFm6BwnkqXRmZcc12WklI8Hscyl7rOXUivL8++85vMfZqmz18/Xs7X5FOIPTEvc24mL6+nmCg4bNzysvTJjV03X+ZlmktuBqiqr6+X+9vbu+PR+/T6eiGAQM7FNPTx9ng8nS9dF5Dgzdu7y2W9XK4xdO/efiC1z0+fmY25HnaH1tRMCS2lGH1qaiGm/PJaSomedv2IJk00jePp9HIw8i4d0pCGLtd5LqiVPCWHupY8zVPwEXa7cTzwbRPUkquJDf1gTQ5pIHKn+WxSuxT34yjNHp/Py3T1PqSA6Mw5LEudr6/Jd8612/vdw5tD7EFHnGr7dFhxmV7yKe8Mk7sEvPybH39d/vkvUr92LfS428dPf/6F4j8+pO9//OHv3/32/f/6H/5yf+s+fT4vdbr74UPqfEjQGqDHm/v96/IK8Rz213o9xWHYv13e/H73+XRavryk1sZ+/pu/+enfvT7vwnizu4eWudan82X68svx0FMMMfZjNzr0y7Scp+fUOyNpvHpwPsTOhXmaLPWvp+srX9da4tiFMWK1OhdHkRsH5+4OtzHFNa9NG5r2qSevZlY597thfzzsbg95vcwll7rWk+x3NzH1vvfWqYjN61xBmuW1TGU9X6fJVFU0OKIQ+37nVnWOVVtrVYvkpbvaSdXOpxfJOZKbp2lervP1eTgc1WKVuks9guNWaq3ruoaUHu5vwdJyKZd8PR523sfb/RgRvUofTaqulq/z1YUA3ghVgK/rnOsaQwCSp8fXXeq6FGrxMYQuhbc3dz+8uf/zp8dlKaUVclSzxiEiSuhjCG6+zoDkvE/73XWaRMxEalVHzkwONwdEaqXkstZWEel4ewi+Y+a8lhji7c3+cr4GF1st4Hg4xOdPJyAyjyKShsNu6Hb7w3//f//3X35p435cpnMj+P0P3/XH/fXpVbMu18mB8zGYwXVaRVaf/DKtABpjalf+/OuzGLx/uPHmfvfd+7/8+dOnP3916P73//Cvp7Ver7OP/nS+ci5lyjfHGwT65ec/Pn5+TSn03dAN+bpm18I//8un2+PtmtmE+q7XVrnW0vLX15eX8/OaL6AK4lpbrhM5T0uZ/9t//8dPN59zyxTi09OpFTm9Xh/ev/vwu9+//+n3v/zln7/88dG3NYs24pb2QzcMuZRxbL8fb51zRO5yucxXUGgYYL8bUgoGEqJrtbZSl7XceJ+C7/p+XrKh7I/j/d0NKNZaX15ez6fTu+8/jCgU44fvvx9C9+bdOylaWzld5tuHh9u39+5CADati3GTxi3nOS5clw4SV65TKbkd9mmIYRcDFt95l7wDoL7v1UJKQ59wCIfWComWdVVAn+Lb21tt7IgOu6GLXof+++8+HPY3mfnxy5dffv3cnV7/1U+/SX0KLh7ujrt+5wzXdVqXteSpi+6wu0HCZVkal9R3/TgAwG5IEbvlusx1RWtExlqLrpd5mqfJO1ShXCpbJYD76A83dxHQ/8BdSqc1m2ltrZb14LrdeOMwq9hWMY8Oo1OPwtRSSIf9fr0uzvnj/lDXmltdcn339j3Fvk75uO+Px+Mff/4Li757d7cf9wbKrSzzknMjBCDqxzGQX9aFwA199/b+zbS0PrXz6+P1/Op8/PGnD6fLKxFswHUkUtPTdenGrkzzbrc/Xa/PL883h8MGBl3KmlI8Hg7C9vj4fLlMqd+1Kus8DYPvu7417sfx7XffuS/n+bIs0zLGMMS0TnC+nHf9cdztXKBSlrX46WqOgg9+v9/7kPNSDocdNvj0+KWWla1yq+9uH2Jy03V6enmecz7e3+2GhLF/+H5/eZzyNO1v92DD6P2wd5/nl6e8Vh9DkuU6//r0enMzupTWxv9x+ZdLLa/d/rycj86A+HI6a/yn8IPe2/j/+xX+5Z+mX/95mr+eu4f9+3t5++HHiZUSijatc5vOE38Ju3R7uJnXXJavHRRXp+X0oubGAW7fxHe/uW+lrvO11uXmzX3a9c+vLzVnF9Oa65fHRzP36evPIdEeBk+UFT99/Rp8IudzrsfdDaBfpAz7XXLBzCSvXQqObJ3XK9Q7d0AEco4AyJkqI6mCIwoQqZo0gCLy3fv3hPb0fHLe15LfvnlL3i46fX354mrrd/37tx86n8x8a9z1u7ZUY7ff30pPT4+fvdn9zfF8fVXUyzLXWqZ1DrHDytM0pd4RxhT6FJNKmaezINngnUOW9rC/++1PP64FPuYvrU2xi8OYvNNpOn36/LWsE0UQ4zlP2jClPvUxRJ9LvUxnnxw5++Xzz562Iod654dhGPt+yTyv83/+43/tO7o9HKfLwtO160Z0Zqib+kqVzpfr6emFlftu9/T4Oow7F9zt7W1y8U8ff3n6+tXQDvvjh4fvjjd3Vdp0Pq/zdL5eEPD19KrWfBccwfH+8PnLYz7Nf/u3f+Nd+k//9I+//d1PtXCZV0ru18+Pv/3+N3//r//+9Xx5zk+74Xgz3g67vpbqd6hq3bHLrSFal2LXBVAVls7B05dnA/r89Py77344jsen09enZ373/XthSkOQl5ebu+Obh/fv797Pl4VcygtOl/Xm+8MPfzg+f3mh4tXs509PFOD733xnCgjeUZiv64lOv/zx0+V6ffv27s393dKWaZ1u7x+G2l/X0s7nKS+Pj+fgwuG464uUKpX18elZQ/qf/k//1qvw8/U5i3zwGFIP4FwMd4dDn7rrUq6vJ9YWIkDTh/u345ByzSYV0Aw0z2UN6zJnt09ibGbH/f77999f1+WXX365lpkw9Ms1c7k93D7c3Qfq89rOl+vT4xMDfvjQvb29+c2bD+tyeXd3/8vPf6qlnsolF+nG42V6qmsrtSi3urb5Gry1NS/rtIjocEzRp7TfhRC65EjysvpSyzKvruticrfHG2ut1kIO5mm6Pd4+PLz3GC8vT0vhXOW6PEf0YppriSHcPNw7SiXPRpD6vo9JTOZ5Op2fDb1r5OO+5vr89MIK83S9LBM5RB/neWlfPl/mqQ+dAqhupilAonVaf/njH/sUexf6EJe11CYlz7t++OnD++B68peXy8nQt2ld11klqLb97hicH9MIAkAgCBKRK4/j4bt37+9u31xeX8s6BUzarIsxUjfE7rouplALb475IQ7f//Bhmetf/vLn4OPQ7ZHxcjq/vL5waaLSrD6/vhpCFQaFZVpabqo0XadpDE/Pr4BuulzndR27vTViaShmTvs+ScPnp9O0rH1lMFvy8uWr9F1vho5acoNLcc0nfTlrK28+3KeUuJrb0Yd390sdzq/ndV2t1eADgPPdEL2HBK0JFD0v83R66sb+7nh4++btvNbL6XK9XpfahrFnC47c+4e3/+aH73/+y8e//PyXm4cjqbzML0+/fGqrHG4Pq+Tn83Q1WHO+uTlMl+vXX1/f/Oa7d29uyUECBZXxR6jY/vLyX29+pPm5+y+/fLxOa4qShiiAbtdPj3+ZX5/JSQzJD5BWAGz7/XEsIGX5b//l/1O5TKeTP+wrlL/8+h+m9fry+HjcdbtdpxK7FLuxF5P3b978w7/+t//0xz//p3/8j/P88vbd/d3u+HD/5ryepb1MebrZjaWIEi6FAeDH9z8Q+F8//3mart574Hy9TODMR4zJb4awGP2JXwWc8zCGKGq5lo9fPvfRpc7Pc5lKbWvtfUCg+7f3y8KxG9UALNzffCCKz09fHIb5svR9CjGBAHh7XS/X58f3b995jWvOPkZILsWdsOTLVbiGNh72+w9vHwjp4+dfXr5wvNnf7x98jMHHsR8d+nl6LTJ5BGcQYzxdLq8vj49fXjVidfb/p+m/erXLsjQ7bHm33WuP+WxEZKSr6qKqCUF9QVKCAEG60B3/sSBAoohutcmqShsZnz/uNdst73QR4n+YWGbO+YyxTqtghEpZAKGEV4BKTbUWSpGx67JMQtBGiJxATCUBMBkfwvTw8jUFi0XX9hujw3iZNwONMi/eRmsAJcjVz3/7pIb26ctpf4PPL/NQyj/+d7+nhHlnp0lbFzBAQ7eBBVKEKWY373bfnr5++vCBcu5TyDkOkqu2AcBHHyqBOVeK6se/fP7688O7H351eviGIXRrJpUo2p/MtXhAWnQ4DESKl6/fri/z7f2eIVIxIAQrxYdGruNSATjebB/96dunK0RgHfX//X/+nz78kfzbv/0VEvH61Z2PmRHaEC4Z3bfDRyyE2uaMk8vQQzmovAmff3oWO1ZgIhRhWK/LHEwY2ianYkoQHSu63B/3v/rx+8fTy/l0yjmAnBrVfP/2OyXkH//616eny0Zt2I5N03z+8pSvtmkE5DPpBqlTa5zLGcICtXZmsbQQNIDogjGOcORc6NoWVNCoDlYYTIgmlVilkKDgRVtMBJcyl4oQpoxWlwsst/f7mpAPAUGEEIQF1FLWxVzPk7O+QDRfxxzcd3f3u3YwLp+eT6u5gALalicXnPXzuOQKSgqUgFzz4bgnF2J0LhAtF12BCTE3Q6saUYxe9MIZjc7P2mxu+pKMUgJhti5rdBFBt4xLheh0ulwvUypVEilkqzYiPjzikEPQmORlWQBCQlAXfXRJh8V4x5nMJZ+enhEhsIJKQIoBAEQZjzF746+XK2Nc9FIIkguUpSICT0/nl6eLXc3NYTu08nodTQyj0SHGAStSRQk5uFA8yDUBgCnlCKKWt/c3txzxmGJJVXvDpeRceTvFnF+eXw6bfd91L3oRlP0iK94MvXHh9HLJpXadwASGVEutKadGsE2/YZgxxhdtYvTOOmss4bRRMheQQqq1hJgaJTb9gIh//eZuXZbLOEOIrA1StBVCa32qqdSackVEMs7atr2OU666hCClwJUkFytEmcTsEioQAjSdlxi96CRn/HDc9bLpOg50MoK41fjCaqWYAmc1AgAioLXzq71cRoATTRlj1qoGEnw+X1NK+65VRIyLkZh8/tvfvqE67Le1lMcvTxwVbe31PNaI5bYjLWU9q9c4Lxa063m6SEnft/L2cGvO9svPnygVcq+aCi/n8eev33717gBlpAfAGBvNTJdaPrrn6zlGc3O7ffX+Vbfpns47s6zf/fDjdFqu52uKVs+Xu/vd4XDYHDtjzWbXbQclJddmNWYBGXkfCWGMK4EGITqBWSAi5owx3vRbH2OIp5gAxrRR7ek8pVIaKUIIneAAQRN91Cum5Be3XhsSERQgAGpBGEKIOKFCNpRgynjyPoASg79cp9XothuYlM4YGHKKFVGZAc0p+YSuRlcGIcfOhnldxnX5za+3smn+/Pd//cunD8THmNOw3xZcWc8qxMkY5x3vOeklTlhwoVhDuZDtat1YAbSL0dO62Xag+M/fPi+rNsbuNodUUvBmnkHQZhrdVRvWMMqJFPz2ze110jnHENw8z87bvu0wEuNpklQwLjPK07pqE/7+6asxM0L5//I//h9ThhHW02k8Hm+2/W6zbU/nMYe0221TDM6n3W6vSG9tJJheThPO9fb+9tvXj85ZRjlmNJfsQ/j2+EAxvfn1D7th+w1/yiWnGLfbTkiBCeSqxJIG3t29voO5MMxeXsbNdtwdtuN1bpTCFI+n5xQiLIggJAm7Oeyunx8agre9mq/aBbc/bmtMi1m8jZNeh00z7DbWpE8/PyjOf/7Tt3kx55cV1sv33/04Xl5ASAnR1YaXqx2ntQLaDJuU87xOcotxSf2GRGCv61lAUUDZbrokUtNJBHLKgSpGIWZSIEQrgBDi6elyHtfN4bDbbRusWtE+hxeYCoyJErIs9jAMtWQ/R7LZDgnhT18e1kUjeI65wJALy/thI3maxwugBWWx3x8JIHbxy+qs9c54KZq+6wWVoZTLdaq1EIqs08/nZwDz67vjdru5npZxuXZtwwkDBSzreJ2n63QpObf95vHhS605R8sY96EgSvrtIDjv2m6d9ZKSUARA5GzEBA5ds1XSzJoAmCsSXXM5Xb49PqMXKjrBQHbGHQ9HBElNUc+mxqftfmOtTzHHkPViSqxUyMvluoxjCJ53LEY3qO2ZkJxKzmWeTjEkTCmEBQEcQuCUvH79tgJcIRjPY9807aAIY8s49x1FCMWYQgq84QiTzW7bKRVSphTb4JZJG21WF7exaJvO09XE4GqtCUrRYcRicWaZqiuSi8NuT9nNMk/7rn9/8ybk+te///10GXPJOQHVkVrB9TSWEKdFM0SMjtNqCOLOOkwJzjVVOJ2ndZy7vuGy8S45ExKskouc6rqsNmg9LyFmAJGSClaIKvxFEmCsZ1w8P5+u01xraVuJCZzXtWskZSyHNE0rETQlL2iLKeVUZo6CKC6bnPPtzV3D5eV8GRdNYWEQlZAZZEjBkpJZHe1R17Sg5BhBcCF4H3OsFXGBlGhiLUpJgEAINecCIWCUSalyrV+eHmJOqmO/ad/XQhGiyQNYwc9/+wwR3q5OdoN+etJ6FZIfbu6kkjmGT3/+7IPHLemUSiHwjSRE+FCfn6YIChSMSHF8s5/Pa3gKszYu0/628+PS9fTNq0FA8fR4ulwfY4ndngtZ9lvhPIURSJJyiz/9/blreYnjr979ens8/uq7d+s6/+2D4VACBPVanA4p1QSAUkrK9un0yepr33eTOxmnu74hGIYYFrNAXIOPABIAYSrZeX+6XEubg0tDt3XOQ4CgqNaZHAvIVSoVUXbWd30rqCq5eu1qzAhCiHAOaZqtUooJ6XwEqJYKcwTexlQAgBAhmgtxbpzmKYR0nSeMpfWuAs04eH/XSyZqhEyq29s9YeQ0jtdF1xAQRogS7+Lz6dr3t8duWyrpdzu1UT7p3babl/Lt4XPfH/u2gQVzQhrJrdPBJr+6eXQ+lK5rOKG5ApBx1w3X89XYkEOFBZpVCya3m4FU3MtueLUB+Mn5FKw7X06vb27vhwOVzZ8+faQYDfsdoxQTJATOFl8vZ8pIo1QJ8Xg4GmtWO/7lp5eHh4dGKilFw5sEIhP0ejnLhrrZxhTfvdq/uj1++tzPWlNKt/0WU2yTCc4ObTe0/UE1xibeNOHz8/h0aeTrzdCUtMsY/vXzB5zIoKQS6vw0nsbx9vYQY9WLla2aXuzzy9VYixFoJWeVMMw3x+Hzx5dl9m/ech+SNnF/t29E432y3hsbut0BUqKN9tYSUBmKtzcbHwsA9bDpvPPBF+2XAM1u1yvG18kAXD/99NT2zevvb4HJb25f+xAfH59yLvO0OOcLqNN8RQMqCGKO1nlOISzGNhD7nMggzTWS5WIRRZvtILn0zudcaq2EklIAZ2S72SJWCYAhZ87pw8Pj0+MjawWIkLesxoIYZBhdrkvIQXKSa7mMZ8H5/d2NkvIMriFGDAHlyKbl5foyzvPz6SwbSSK6nC4UYYwBhrTbbKQQTSO7TWt18N40rYKgyk1zeXpGIVCMswvgF00wKCVVQn/pRoq2b0DyCGBC0GLM5XQ58P3kPALF+wgRdSbE6KfLRQjFGQMxcU5VKyHKj4/fGoGSTRgzyLmGgDJGGE6xQkSoUBBUJlWMXrZStg3ljFKGGJatssYSziinknNGKKU4lbwdNjGH8/m8OQwIAcaJUDQY17ddC0FCFVRCEXw5vWg7MYSkkG3f3b17V1EYX+jt4dD16qdPD5fr9TrNUrYNYwhziFwI3izk46cPkovn52df8nWc+o08bjcx15fTiwYEFFAzzqlutz2q9XI9L/MCEPbe5hKtsTnVpmliiJttDyHglLtgGSPJp3kxKWdjrZKUKhpMenX/pgD453/7szWelRq864+bV7e367zmkCAqBCDZdq+Od61QZjHRjgnnZVxt1JIJ0kmMao4pRa8aNa9u1RpChAHBhE+jroTGlGXTAARapRxKMyqEwrv7G9W0Kbnn8Sqo2G03DOLo8jyNMdgYE4BASPX9D7/KKeh5Tim+/e5t2w7X60QhLCmMZlaEXF6uIdXD61ebtlVtt07meXpOrIpG9Jtuu99VmHOqGYLNoV+LBQ1te0kxsA/OJ4dgmaZpuVwbyZxdnFthTfu+3ew5gfX+9ZaTjKGfnr68//G3el0fvn72IVprg8+x1ooIgBxUWjiqpMx+qaC+efPWruYn/eV8OQ2qpUxILnICP/zq+PTt9O3ztweMVrVez+e26xgRMSXOBSKYMdy1AxJYZIBrHTqYUp6nxa5zTERIRRkHAEihWiUJY9P54vRam6EOO15xcdGXaPSyUgpQaljb8kzv8jyH5Nbz/NK36h/e/ncok8fTdF6XaAxFKge7LlPbNpzRkErbdpkCUAGnIldkrVGD4JQIRY1bun54/+Y1RpAATzAhtI7jvK6rmyyErG0aIVjbdEQyipletXcOYVpjLb5kgjGsnFAE0byYWNHQ9ULmmcBmVXd3N58enwDJy7y0UkCQrfYAK6V4TeD56XG8+vu7I2WkojxsxT+0v66glJy/fP78/PSy2W4VF5BgTOp5OlGELpfxj3/7028hbGV3Ol9zijEapbapIK3X3/7mxzDr09NoQ9z07du3d9mUZML+pkMFn8flOl4FEJteyUZ8/fqyPTYaEQIhAHDVFiNaYFlmD1O++/3tYSeXaaJM7Heb77/zjFLRNE2CL88zakgAmQtaIfplfTDXKoVwX79Q6l+/2YXYnq7TWce2UQTmjJNUmLL03ffvHz49T8tizVpBTbb753/3j7//7lf/9ef/Mq0vIeBaC4CwQnCdRoyICSahXHM1RnsXCqgvLwiRujvckAIwo/RwEKCU8TqXUplk1puH58daCiWIEOK9P1+uJTcAA4CA4JxQlEueplOusev7pqEDJbGU1ZhUS64oeDehurp1mmYlFeOrj3H2q0kGoKqUUINg7ABh1ZMmmBKG5KbzznXNYTsMXz99zjkLLr2OCCFI0GrWhxFd50lbrdqNdsZFt932Tdseb7aCkZLA89NjBhFyoFrujZ9n3fVdLPU8XpUgIGVEpXV2Wt3dm71s6DxOkiMm2NAwxoVhtYetT0AnTyQrCGUAo/MZaEoJAhikChHONRGKCkwVZGN027clAqXEarRqGsjL+fPVhUQZZYxiAiezequz1/fvX2EsjI7R2bNZQ3Dfv3vLsPShmmVOye82W0rp48vL08vjeJ6iz/t9l1JZjedcfvf+dS0VonK6nkLxAEFQIwD8cnqWbYswAhR2Sm36PqYEQS6AVFCtNxmQVjDFmtIPuZZlXpy1JQuCGOcUrahrG+/ius4FAVCTbDqMMSWgxLwanWIQnMqGJmc5o7KRT8/PTy9fIAT9RnHGBaEYEEyZGtqUUwrRONMIxJCAONdS9bxYY7lgMXoI4O39LbsaZx4BJD6EkEojmWBkt9mcnr8SBBouuq75+jC2Ur26e1ULnOfx9HL2q9Va80a2g7q97RtSvp6maZxL9DlHyrAUvOm6h8+f9Gp+Eeru9tt3r98eN/vFrw8/f/z09bntm81mcEZzJvc324pAu+e3P7ymH9HL6Zojul6uBdrf/P71+fkCAFitvYzz4/Oz004vK9nytuuM1v2w3anh+bzo0SnVRRuNS89Pp5hTjiBDBBMCFb+cnp+eo9aLNbYRat/vtFk+fXnIMf7uh1+JtrPemexLTiBHhpBZnVui1rZA2LR9BqWggiCANCOOpvmaY7nb7UpCT5dn6wzEZVkn2coCo/OOYaooX2aDcqzJJ+tgyodNP67n55cVJl+iNvqy3/WccV4zylOwy7evCxfyx9f3oKLl8XHUesvovhuQmdqdUlRcrgvntBuUnz3CqGsGDLB3fnq5tFu5euet3g5DhiV4nErChABKEiioZZ2k6zVmWBGAlKqh6ywI87L8/Onr9+/fUk6XucSQG6YwIC1vQ0mXl+t1mo+vDpTUt2/vheAPz8+Pj18LqN+9fgVztYtpu2azbWOINdfpNDJK+q3S02UMZXfcvnl9p5flw+evdtEQgc2mH7rtTDHnMISYc3l+virxZZpX7e31csaoqKavJSNQCQNnrc9/+PPtm/ucEufcukVy7M52OPaIUqMniiFXrG3Zr351++bVUTB+GpefP357Oo27/f727rZv+4cPn5friIcEQh0fL4Sh2ze3T4/Pj1+f/vk//BOs4OX5ep1GCqqSDNYYk318+bKaUTIKilMKIIfPL9eX5+Vm3//qH35EElxPn0GADRNKCV9zhOB3v3sNsaCy/TR+uy6nWjNmyIVAJMUENr28fXP3OM3PpxcbPVRMURQKWFZLT1OxkGCCqaA55ZRTLEEQ0ih6Oc3TeBWct4089ofHbw/juG42zbYbqi9NwxFB87RgDAmBehkxKEoIn6oP0AXPhy6D4pflF6GjsYYQAhCECO8P+22323ZD23XwUJZprD77EEqxDw/L7e0Ro2LNejhslmUtOVnrg4+cogzAOC/zahHGIYZgfQWQMI4wFFJuWu5tBrAQCt++u9kdhvEyLeclGPPweAmxbIf28OqwP26mSS+fn7Sx8uyHbS8ZggisV7Nqi5loVTdpPTvTdqjbNLikKduYkxDkcNwACGrJFGNCaN92gklp/TSt67TEJNfVAQC1ESGFlKOZXfah23WL1pf5yknls5YNqLiIvus3PcGkabjW4Txez+dT14nz8+n27t5as0zr5fHKe0k4DDbXrEsBv//121Tizz99KTntb/frYt68fdW1jdP2/DKZeUIYLMvS9U3XydPzScmOc9r27XhdEeYgRtk0AcRcU6551VqJPM1TTJEyklP20ctWEI43m1ZIdprGDx8viGBMECG0bYSZVgRq8K7gnFMZtopx1Dfy5ubgTAQQCsn1Yn32uYRSvAsJohxSSLV03YAp5UJa6wAkUqrbV3feh1IRytmu6xXCvK2NUvAICYHztGjjDttj2/TjNF+nqw9+9RoRuN0Pd2/2h2FrpvX09GIWZ725jnM7DFThz9/+9vD4fL1M929uJGmOh5uOtRw3L/qUcnz99m5oB8WY9yln2/Sq1nq9XHxQw76vtfaqbwRe43J7M9y/3bmV/P43/6DX+fowhhT1ao8S/fjdr5/OT+fHJ0fizz99rrAUQgapXPTXZaSUY8DtaihXehrXnDGDXNFXbw64gBjifr/DkIynEQH86rh9Pq/LOF8etNF2GDpKGIaUUj6tE2MCQZRyRAS0sl2uE2L0Mj7fbgeu8Pnvl9Ppcne3x5D0SiVcc4wdk20jrvPl5elp20pn3apHhAujBSHv7IJJrdHoNa0pV5hCthjwkvI8lz99fYilPDyPp5cRZtwOY9Mpa9R4ujgXu75NMMx6RpADUm/2m2U5R2/CmiCBx8Oei3a6mHF2IIFYSifQ4f5AOAnGZ/+CKs6wEopV19nlWlLtu37oO4bhOi7FRUoQRgXDsGHdiw/GrfNCKcQ//PAOQ5hjmLVmlJcI+1Y+rGcK0ZvbY9N04zidTxfJZXZ5ncyitfE+w6QaIRmnPfn28IQwPNzc/PDjj48PX4auYaQxqy0AMy4ZZS4EjOl+t/n2uN7f3brVpJRfTiNm6hdmZc4Zo/L5y9M9AbtXu1rfvjycZ7OgS/nxx/f/+PvfLpf1cl1iiDnG5OxyOiefr9d5Hhf47tXbN29Tjh8fH483233arLM+P1wxxcFbb9YMAcZ11/eH/b7Euj0eCZOfPv3x4XQe2ial9PHvM4DolXNR6/PL5ea3m//yr//108/P//5//Ke7N7fXxQge/uN/+V+wqFQU1UhKGdzwx09nN1/PL3K/2TWd7LfDl/OXN2/uCGfTvKbVowR+/fsfiJQUMwQUxVAgCp0L3scCUso5pFiq8M65lNpWYio4pX3bqIYhBDjGr1/fAwT1PINSCcEAY2JDyc5oR4kooEAIhqETXPrgYwjtpumbDmc2dMOyTsmFGELBucKCCGKQ+uBPLxdMGJNEZnYdF6MNAKVr2t3NDSkZYVwqTLVkFLJNlHFMEUTAOL+MGtR8d3schgEyvMwGY1hKoRSqvttsN999/92h33ysD5vN6peR7zbH7W7o+Mv5XAF4eZlll61LP3/+zNpOSYEgIxxQhdbrSglSUkUfAaohglxySolgHDEhgpknj2Wz3R222933775X5PnLw+cvD88lJ2tXa93Q94fDFkFECAO1Qgjub+8ZYud5NGH23i3jROTt7Zv7nLOOcV5cv+sX607P5/1hVyvAJfzlr3+VjQi5xFxjyE3TAgQxhItxp8v1/v6QMPrw81cfImN0PM/8Vh1e33COQUZWrw8vl5vbw83rw+39/ek0Oq1LQXJefYolpxBzism5PLTNMq1GO71YiDBj1BuIMbTGglpLLc65VvHDYYNQ4YQdbw43m+1n85JTqrmkEqf1QjEbl5EELCQRkgoqMYEQYqNNzqXkWkBuGhmDRRCWWqwzhBK4YimZEtwa9+3bOYMaB/inv/zs7bquMyZYtlIJuTluUgEQkwyrahXnpBS6jOYBvKgN9yGmEg+3mxSzlCSW+O3xwXpNIRraDUH49ZtXEEAfA8IwRT/PiwtWR18zTDmsLiIcG1Zy9L/+/nfBy2BTo/bvv/vtx8efKev/8d/9h1nPk3ZNE5fRIkyxUO3u/p9+/c/H86cC8aqXZbIxh/3m4BY9zxfesVLp9vWtmfSix7vb3Xf/+O5P//IX5/w6G0KAFCwbC2Okgh82O1BQjNdcaymFMOSDl4ib1R32OxfDalYXg42xbzv5fbtO/v7VHcwZlbJ79SrZ9HQ6Tav2ARAih15BmG2YvZutXVNKFeSbfdcrNp4voSbrE1XClRwNeHoeK6FrKSFXbc2yTGqjmMDbw44IW1FezJpQdclabbebgTB8Pl+dp0zwt91RcTWhEGwsqYzLmKG/vT10Uq4JHm5343XRwU9m2efbVrVvXt31LX93d0tQOr9cCUsIkNPpfEH1V+9+KKBwxkqNhHOtTdcz1Yi3r25iyqGmmNP966OL/qcPXwEoIJe720PO4fw8ESr3x9uc4zC0vOEY0nme//r3D2/fUkbxw5cHiHFNhREaSPY+vnn3dtIThVgpeV3Wbx8+/d/+5//r3/7ly+efH/pNf7mOr9/eKsWcTR8+PPVdO18NbwRh2MewXuahUSnm/Wbbi+a//uHf2k6lnK1elvkSMxCCYsoo5wBXb6I+XRpBbm+Hb/n5dHk87O7dzT6VcJmndZwOtxsu9r6UFC3GCVdsV8AZuf3uza98BQW+PF0gCrv9Zo3zv/zbt/nJ/4f/gfwP/9P//v/1//z/ZIAvlxNr2Zt+85t//97OcVrHz397KRU1UsEC/LwUH7hEMJfb7eH1/fd/+cN/QwX+6b/8kTBOhBSiUUbrRojo83m6phi44JthGBqVUu1UhzCuqWrjAARN0/ZdRwhmko7jarW2foWE+xyE4JjQCpHzPuXgnYcAMYFxxDn5nHLOqZWqgBBzfD495Roxwc1GYYKbQXrjnp+fMREIw1hiqsnHSDBClIUYCyyhpnnSCcBJLy4mIAkq7MuXb7Am76Kb55ubQyOlB4liyFtRUuGScilyKiUnJZvtsOnHR9TsDrf3CFFQEIZsuxkwkZO2AJDj/kgEbiXO3mMEBSWRsuijhT44Z52pEAIMhFCcSx9yTKBiBhEhXJYEzGIoARijknzTtL/YiW9vh7ev3+QArtNZa9d2HZeCE1HWMdVqg88YBgh9Ll2riPHeOjmIAGvM+c2b75Jdv33+FIK3LhgXH5+vb9+h/eHGeXPVi5Bs2A4U065V7uZIGUMQbDcbjIkzgUJCCbv4BBADmEPEYSkEkZTKZiMhIlJgY30tGUIwDFuGkbPR+QAhwKia1cQYMEEQk/1uf9gdunYAph626TpeEaTeh1EbG63z2lmnWvGK3seUp2k0zmLeHrrtpu+0M94ZLgSAuJTUSBm92wxqnpZayrAZlJLWulnPvWoyAohib+Lj1+fFrPtdhxnt+rZXqlVNgjXm/Pr9e+/D5XJ9+faghn6z32QfNsMmJsMp7Rq5TtYZczqH4EIEgTOmGskgZZSlmsxqQgq1lv39Da71NF3HcblcrpdJNz2+O7aD7HsxjMH97cOfdShU0ErI15fnnx8/rMH+5ae/9bx9/cOPsOn+9OHz58dvqQSQE6WKNhkuZrPdbDb9i54gLUqxruMVZEJwrXAa5+IrRdB4//z5CVDSCIEw1LNFEJUEKK2bvoOoDn3HOZrXCcYkZCuYfDlN7+6/CxFtd61U/dPD6fw4fvr4uabw/of3Qfuca0oAFKzajlB6nVah1M3xEFGOGI4vGgLy6tVRYcwgfDlflQKIMIoZpRQjhppdU1nQPqb0+PVCZ81oJYLlsirecU4lq+en6efPP//3//hPt7e3Ia5mMcfdrm+OIQZQSvE+5nQ9X+XAcy2HbY8ARhQZ56brBDF+fP4qpCjZE1CW5SWEAkBlXFYCr+NZO81VC3LpeqUawRhblsu3b8vt/vDrH38Yp0Wv1rnQNPJynabrcjxuovPGuXEcW9nsbu54Skw2wzAM+2GZ/9p2/PXd623bdE3707y+vFx+//sfVpdcjgFEY13bNpth4EySilME568TqHW72XgPKI6ckHdvjs/Pl7/+6SN7Ddth+PTpS8oeQggLklLAWL89Pp1fXlzQVCCAgHYmpDQMu/ev77tNSzAqOYboMAJS0O1uQxm9XK5Pp4fpcsWcMMGpVAXA8/U8L9pHzyBCGH9399tXP7z+X//wX5uuy85SRGUjb7fttC77za3CaX986+PIeaYM3r7enc6ztrFTDarpL5+ejq/e/Pf/h3++63egivH0h5bD3KtS0mU6HxiQSmbrAOSkUc2w2Wq3Jhs3200sgFwuJSEhFMZwWU0GFSGIMXLW+AA3mx5gHGrxzj+d9broUooxRgePMOy6DVc4huys9y6UWgQlCEFAMyTIed80zRqsvpxDDKEkUIukAmOSclyXnCtMMUlSEEK/3PUI4xDSanQqgZIaQli8o1w0bSsh6vsu2Hi5jtfxIpWCOZlkbTG1AkrJZr933iSQSymF1NnZb8/PFSUCa05p0Sulm6frxClWikNeIsI5ZV4o4UhyXFJtZSN3dJVdrXBeNSGUUBxT1tamBGqKPuToS9P2nMkc8+zGqZdGL8ZYTskvRmwpIuONXcNGdJ9Wl2tBmEBIK4A5lhxrCJlwkUNY5kl1KvrAOBVKWBcIRdaMCBRjDKH09v749enSbQJl/DrO43QtJEeQXu22CNLpOjeNaIeBwGq0w5C6kJz1q7Vt3+93ewSRmaxzxmqDQI3e477f7Pu+1seP30rmnei6w+bz3z+eny/90GeQ13VNMXbdIJk67A8Qkct1KtnmnHPOIZdpXkejZ7NACNtGdv3grL/OKxV8sx2GoaMY5ZIoxVpHgeTQdzEkbzQlSPVdLSCnyLgoEMaUa4URIu/808v5uNuqphMNvb/Z7g5D18gcqjVutnaz2z0+nbiQsUTMWApJdbxKfnt7WLTmlKUIUoA2rh2UtcJxMTVNrZKkb54uz3q1xrgMM2dkONT9fkcbhchTLoVyEVJwBrkOhFqv4+l0ejTObXebbdsa6/6X//i/1gSePl4mcWW0cKb+6Z//XTL28fPn+TJiyohkighUMQghxagkYwhyKmqtXDUUNsGGl/XqxpkJKgRrh82m669mdMbEVEM0ADFBRaRKEpWTZRhTLmLKz6dRSBmjS6vtGkm5+gW05dzcULFqm0LU2nPCWtmBXFjTqK6XrCNIKjmUPKuOVkhTQIEgLhomvcQECx5DsktgtK2ugJyj98YYzkVb0ubtPmaIKiQFI4iwwiGl08sz5eLH737z9PTYbvt3x/ccDM+Xn7RN1roUk+iEd7EUCAuxNkzTVHGNJVynM4J52PQhGojA9WLm2SxLoKwhgvV9T4XyPqSQd82GMh6iT8EF62IIApNNv316OLctzrHAWrdd3zBxvDlY+7A/HqPzwduLng73r/vmvqboVp1jef/+/v37N09P53myqwnPj9d2P6Scoo+n8zMolXFRYvzzn/4IIBpfroTJzdA6D/W6IIjevH41TQvE1aYU5us0n5tBeZf63S5DeB2naVp2h8N+//LtMkJY37x5FWKRarPt9/f3+3kd//TnD1Tw3avdZbrc5d1+21QQnp/XVOLtsB/6fb4r2i3n5ymBmIsOucqee2c+/vyJAoBKJYSWEqdns2223735h//d7/t//fO/zOPz3//yB280hLyWcj6vvCXG++PhyPk3vZhxmpzV62g3g+z6Jn389uHnBzpPD1+/vXn9xpLylz//lTDB13HOODPO1nmBtXRdq6EjFOUSS6nLatpOCcZIpSkmQog3Zhkn533KMebsjPber1d7OB5TLIQQQkiFwTjfKim4KLlAjIUQIeToo17Nqg2EBWMMKko1l1hiiACUmIpgCgBgjfc+gAoQxqqlIefiQccEYAUxDChSXEohbm9eIQj/8K9/sIGqRpSQjHMvp7PsFJeiABxSIIzMi25Je3p5+vrxw3bbIgqCzdaahxAIASUnzBmoqBKgfcCc5hTH1YFSqKTWe0lZNzSzsbUm2SmRKwSQE1orDkEjCGWjMMPZF2/dw+kFlgwqaLuh1FIBur075FJP18tn/ZUz2nSds87bgBjAqUwP5+x82ypGKQB1na6Yg8PdPpXc9KlXLaj1cr1aF3rOcqmH/W5/e5NC0NYTRQmTnCBMWCd7ACFAQBE6ThpWcnh9Y7RNxgmhGKWEAJCB1z7FgiuU/abvG8kFrPD6dNWzQZhixNfT7BfXtcNhvw/OLZdZCtU3PSGiQjyNV5+CXUfBWcyZ5BhDOF8v0zpDhGCtDCkNdEzmF0fbYTNYb53REFcIq7VacJ5T6vu+kSoD4D1Yp2vOwMZQUW2ajjB2PY39tuv2Q991nO8BSBgXUKP1zjivuqYUsE7z8/PFz+Z4swshGRu3m954D0FVSmnrS456NU0rN8MGEBRS/fbwcpsrYmTVZpltyqHvuvPztOu298fbhjU93Zyv86LXNbh5KR++PY3ncVni8XB3f9wdDu+vo16WybgAAKAIXF4u+xt213S03312eTkt0UVcUVP5ope/fP2yGYZeqArrOq9CKIJxBjaHlJL10TIFv//1u45vndfXpcJaOafGGsKoTxbUMl4umNV/+PEH2qjrql9O56Fvx5NGiJRYx/Vi1hkhuOt2jRQwgRjy5WnZ9g2lmFMBIH1193bX9ruhQZg/8vFql8P9Xuvsoas5Ikh326YinOPsagTZBBtALW2vRh8AAMt1DluxffXqfB4xxhSRHBOh5OvnLz/99Jfd4dD1O6/X2Y9hellWN43z43xpmLy7fZVrwgCfp9V6nWsKwUAMaoneO++ZUNQZBwCoBWJMMMW11t3dTSsbt7jH04t1ngqECOh5jyH1PpzHcdgM+02XCuKM9lK9vr8roMSS93v/fHqhGEWzBBe2O393s38+X7qufXq4tC33KdjoAKqM0RCzni0spdZAqkgQDqodp9Uac7s//Pj+1z9/+Hkc57YfCKV9tzns7xr1gCj5+Pnx3Xd3rRrevnkVc3Wrefz2tGnUalaIqy9ZL7rr+sOwfRmncZ2SNjaulMD7m3s1sG/fHp8ex+jN67vBOfrJrYDUhrF/+v0PzuJ//eu/frtc2g1WgnBKj3dvrk/6498+eL/2nRBcmWmd17mU4q21LRUK/fSXP8aYdPAA1cU6Iav3ZVqNtQ92XSoAT8/PsCRtnMDUB51KxIr4aLFSkNEwXQnH5PHhoQCwu98+vjxjSIikhBIuWUwZVJRT7poWwApqFVJACSCsznuj9boYIuiyam9t06m7uw0mNMeig6sEIoyVVIpzyrh1NufMGeeUVYBqLqCAAgEhoNSacga1pJIhAExwjGlMEWJcas45FVAhxZyJklMuGTKMOKoIhJKjXvyXD1RQ2Yhb8YpgGJ3zKaZaU8mwFu9diB6i0raSUAJLTSXa6JTirBGZIOPtel4lJ9QyRCjEyMTIGCOEM06bRviQ53kiAF7G2VgbUwIISqkgQsbYXHEtJcdccwZQIIy7oReMeb0KSjPF87LGrLu+Q6DO06KN3vaDSIUT6ld91c/ae7NaCEEwpukZF6xvmov3OYdaQd82oEDjHJWcdyKmenqedjebrlPeU8LoZt82ku+ajiHmvPcxnKczKJBiyiUTjJZcmWGMshh99IliHHIsuCICORfDMIRQOqR2e7BcZkIZKNVrDyrYDcNxdzydn7uml1xSLAAAz09PLpiQvF0WrxSXAhOCCDLroo2OKSAIJvscgpWCISxSSNYFUGHOBdRKEEoZjOMspdxu9hSQ2Rnng7Zem4goVS1jlOrVI1D32w1FRHGJKVhX/elyStEzLNqu99NSAdgf994sAFbCMGBk1frtqzcoMsFaJUGBa4qA5Sxk9+bdK73aFWJKmTOBQ0IAk4J4pxHEjItgTbTtrjnWLTMOvBgHkOJyO+tcMB/2N123UWKHPL/bDASTefkMUZKdss4CXJ+evnIuQ8mMUQhB2whv3PJ0sbN7/+b+cN+/nM4uxnlcUhghZBiWVjGGayfF2+ONpM0ffx6v09V5pyhCGC56okQY4+/vbt/cHG93W9V3jK3a2ZRj9LlpOSjYWR99bKXaDMMwbGJMCK/v3ypKkDZrLrVrO+dcYGyZs55XidkCsV40J63LHqbUNKIdeoBQSglWkEIBOdZYXt/eSELmZbY6Xy6GN04KJWg7tI2GeiJXh9Lp+tJ1Qy+akzHjZK3WsRbG0ffv3pjFB+NkI6J1L8ZWXDGhQgkIYEo5w6yt5qqnlDgTcilNo5wvjKOGqbvdQXNz0UsKft/d9bs2xTy03q+OU9rKtpVzLHXTNJ5gCPI8LQCXWmNMcb/tUAXeJgDh169P/WbTcPn+3evxMv7ljxcm+etXr7xPj0/fKsyM8YZzwqDXcZqvqZTreXl7f7+/7f/t33Ry3hPTd93vfvyupCSbRghptZOtrLFgQDfb4SE8zM+nbdekBMbrMs5zDBFj/uXrl1gTKOjhctJRD516fbv753/+zbBpPn78VFKWmECYOK65VAyA4HKcr0+nR8bTq7s9rZkw9rvf/+b/ffnPnz5+bATbdOr+dvgW7HMIL0/nrmv+8J/+MyIAoQox6Yd2vIy5kuPtcXtzvFzteHl6fnqCmWy3glAYk3n4eAG5Ht/e3L/elViOr15xLj/9tO52W5Iwsqu2D8FpmzOQiZeUco61Qu294LyCwqiAENVcAYZSqhBiXg0mzFmXU4GYYSK56EAFuRQEEeEklxQAqRUDgEKMKWWICcRYSVYJUACH6CqAtVQXYq2FEsIl51wmnwoCwWnKqU3RzQYyxDCrELkYf6mlXICxNqckZGKVY0LaTiRvAVS0JoBg8CXnFGJMMWJClZIQYc5psB5jhrhUkmQIQiwlAaxY1/c+1Qwr5SDmLFpJGM25epeCr77mUBAAuIACAa6lEkwIorBCLllA0XqXTAEQVoZTrADkFBOAmDH8fD5hBNtWUcZE8gjWkkKMATSD83G8XFUvxilOo1Fde3tQfl1T8F0rvM8VoqjD9Trudtv98ThPizGhiaHOcwGQKda2PQEIE1YgMsmt0RaAUwUNY6XWaZ5LLoRiZ00pEaASa8EURptKAdrM04xb0Z1PJ1BK3/fLslzPV58C44JQYuxac+m6Psc8zysm9TpdEIYYY9m0EELCGGYE1ApAoRhWkG2I2lkulGraFJIxTtuVMUYIogjvNluI8Nenp6HjJaVYy3S5Xl7OjFLjvb5eN1ERQivEjAoplHd2nsZh05p1NdpAiGK13ocKwO5up9fr8/PL5fl5d78vhR4OB8nkeLlM1xkzLKQqBTpQIYL7/bZv+//28tQ0raACM4pRJBSWmAGg66wfQlwWv+tvD9st/l5lLAAsb26PuGJrTdiaebwE5z88/PlwdyN6DkHlmEnevX+zgxh++/SgjVtNkIq/2t0ozp7sst937+533//4nfFT13XEkuDzaRkZLvdvbwfFU7C//9UPt8ftdfLfXr59evggZeN94FymmL1x23b743c/Hnf961d3EFOdPjDGHj5/2QySADJPo7ahFswIIZjWHCXlrNs45q2zjBHCCChxHWevLxCCiims+bjvCeW7zcBIV0LcbNrb4yEUCABiYNYufvv6HJ3pON/0A0JgvpocIExYUGGXhUHcqP7+5n5+nJ6fnn/89W+2G+UNcj5UkAAo/SCV7JbrdH2+MCCXy0gIIo3ABHaN5Jitq00xgwpqAaDCWgAlENLScNqpdmjaVIp2K6WQE9n3XXDOrIYLtjv0nPJ1nrT2u83u1etbSdli9ct4WedlXua2kTe3h1fHg17iw7eXl8dHWGvwnnMmBb9cJioI441qW6svbd/Xkt2sb/d7TsR4OmGMU06MUruslGNIkbP2zZu371+/+re/fAjJpRy6ocGYQAQgAYsxCAGCIcJI67VCGEMmjC16ma5Tv92+e/PebI/L5Xp9Xrdt+/hwkgxvtl3bymnWTw+nYAMlDDF6Hufz+mjtQnnlAK0ucVg+fPpGGYSgdA371ftX+60wemkeWPT269eP47Rcp2mz5z/85p3qh+vjKppOm/rr7sgQur5o2SoCSd/2pCGgQj37EhMhtGNcHlsI4PnprAYlMSPBVtl2w7ZJrZumFcJSCauoXC+z4BIASDjPOSPEcwGcUAQppRhjqtdJdiLlmn2sueaUCcAQQIhwzZBQqpo2xWys1za0TWdtEJLnlCCopaZSQY0VEwZAgRBCRGrFlLGSKiawQpByZpSUWmopzjmCCSYohAwASinr1SCEuGqokEGb1QeCIMBoGDbLqpPPMWcXgiBMcVkBtN5GZ4VgwQWulEu222wXsBBCSkWrdrlARDDFDJYCEwSQLtNktAEAgIJSLARDCElJJaOMKQ4hlAIKArnknDJToqQQgyeKA4SSj6LBKfySBWWMUUpgLTIlDwAHAFznE5NN0zYxZ94U1UHKyDpNNQU5SEnJsgZtfEUQY5xTbvpmXQ0mAEJQS3EhUM5TLjHnyziF4EtOXdfttzelZADQdLnmVBhnztroQwUx5ZRSCi4LSRBm3rrrZbbM51IYoQBAgJH3ocJaakqp5FwqgpAAPa25glwDhJVi0TSyAoAJAaTmGKx1QrG2b3yK1cAYIsKolJRKAhiMl3l/3CoqhWSM81grxrDUvCxLSskYjQjQTnvjFzNbP2+2O0I5JzLFGmJZl7Ne55i900ZIVRFIoeQc6UjMYq33N69um7bbDcc3r99YrT9//bYu8/H2FkFUQeEEEQTGcdzvdkrK8TLtDwcIAQAwWo8KCC6u83PYbE6Pi96V6hESrGWiAnA5j3oenTWcoOSzDVUbx0Yzf/5m5lExapcQuxy9rSmNlzGlRKpa0PM1Jc7pu7v9brvNOYGYGUBq2IWKBOcI5KYVtJZ3r97t+mGc7M+Pn8f5XEtBCCqlQsmEEm1cBmUaxzeH49vX38/jDBNI2tp54QQKhkKqyVXOJUEohmhBKrw6b0NI3gcuBaLQOhvMqlrFKFmXqWvaza6nVHYN3ylVU8SMtpCdvKa5ghgwRCBX5/286Gboh+1WPV0xZiBDAsjXpy/Wacl5iRFRlGouJX7/7i3I4ecPf05xkpv2uO9yJWZGqOR1XigjspfQx5oQQnBe1qEfBKUAse1uo+fp4fGUst8e942Sh/0OQ260mdf5sO8IYo+nc81+1VpxUYetJ+F6fpaqqQg0SjEEvp704ha9zIQgydTANrv+tlPg+el8mccC6jifS6z72+3hdgA1b3cdxxzkO0TQt8+P0QSCyfvf/dA0smKspJpX8/nbcyUwlxI8iAV8eXl+mp60nTGqnEtQy/54SKnYoKMP/WagXBQAai1CMBcTE4xI3DUE4WKsTSlKpR4fT+0eN4z/n/9P/8M0Xv7lL3/3EbhQlJLfTuto/ltFdui4S+HxPJ2mGUFw0Pr99/f3b/aMkP1ug0HoeLcZNvvjQRsbI9Cz5wiGi0UtqpEkh1btf/r7l3/+97+qGHgPDjdDSmF+mGTPDjfD4+PjNI4S8ePxkFVLV7fbd9vNjtQAaE8JJqxVAGFntfMu5SIbSTAtsaTgu7YlCBYAMMUY1ZxzSZkw7n3IOVGKUzAxEIgoErxrFGE0BI8Z0cWv2gZXMolCCO88AgWgnGGNKfkQlRKUspwjxSR4b1fUNJJQXHKZrhOmWDUip4gxiLUQJmGBBdSYA0CQM8YoXaeVEMIYrjkTRCACfdc564L2MYRt32GK7WqM0QRTpAhRLJUoBQ/WxhARYtM4VQggIlwKwZsSky8l5ZprFkwhjBAppdQQghKCEVJyjtl1XWuMhwCWkijDqOaUow2atUxJ2SjFKE0h77qdYKRkYINmFEdQKiiIYMpIBbHgHGo63Oy6VghCFr0uy0I4qghxhi8XCyHp+w4TolcDUfXRvZzOQ9/Lrsspm9XEmNd1WdalFeqwPfStnLTVi4EQwYqcdfN1YpwBhCCCjLGaAkKQcwYLsNaZlDkjpRCAKhciWMcZd95WvfjgMEXeep+8T8kHt9ttIQC1VsY549QFyxjt+5ZQFEsmnOKUAcQl14oypoRB9Ob1m6ZRhCAASkrBON8ohSlxwYcQCMNS8ZzTmuMwtIQQQnAjJSYMIogRXOYpRvb+7V0ZNiFGgrG2Ybs55piggtvt5vsffthtu5io0fPTy+NqFu+zNQZhNF4uomkIpQDUZV0QIofDgTPOhEjmCn1BGdRcGGTLvCrWXk9TchlzlmBCnK7rtE7TPJ0byVsmu3ZgmFttfQgQINmoV3f3m33/5cPfY0oY4lJKCWmallqrlNv7VzcdZ5++viSrOeLOOUAZ4wQj1DXqd+/ebogcx/nD5y9fpmftnFRKtU0JpYK8WsMYOZ+fKEa/evtuneZxnh4ev03jJTpnNddraToJEeaEphgqgvO8pjq7aDmXgsl20wGYokOS4mHoVaOsNpQy2QjOuLfmGj3OtTtsr9q8XK6n5wuCyKxaSS6bu5QrRQjm0req7QVhMLrso10NqgUctsO7X7cvD5cPP/29vH3ts7/Mo0Dwzc32cLv79uVCCIQczOdFdaqFjeSNS+50OZ/O8+tXd/vD8enx5fPnzyG5kEKB+Lg79P2uhKK9XtaFEY4B45I+P51KrU2vQKrOO5xRzPnuZkCZBmdtTU/PT9N11qve9pvdZvDeXperdX518/64FYLUa5JSemcgBPfv7oTgy7Sm6I+Hm65Tf/iPf4oxmtWCDNtW/fZ3v4rea2tzBo2UGNdxuv7173//JStDKNns2vffv6KkuZ7OwZsQ7G63k42czdwPPSCwkgJz+f67t5Jzv67Xy9M46t//6oftdgMhu87r8f54fRkfny/77ZY1MqTk43Kd3Xagb9/tCSafPz9+fXhyOqzaxJqJIITRD98eq18RFFwwFzxqKdPs2PcEV7eul69217ZINrmi58fxw88PGEABibO+3zTLeRF0SzDtmi2ELBX4558+I0xfvbvLjo5fnkipKYXkbBACcUaCJ+viMMX7/S6E7F1AGOVScgaIAi6FdyHVUhHAhCzTCiEgBOYSeU6VUFghgqiV0iLytDy75CEAbdv4lGBOFVQfYq0l1ZxKmuxs49q0Dcy1wAwBijHC2kgqIk+NFDHF3dCmVENMOWfvAkSIcWptRQQSTn6Jr0EIKkEYE289grlRqmkEQMUFl2pKsbgYIMYV4hSLoAIjCiAEpSIACiipVO9dwcSFmJtSC2ikKNGUmjGItUCIMKyIMlxyjhVADGopAFQhmAuRYOx8qDHUUtumE0wywmLKsGApOUQkRWeCmc2CIQKIVASEVEKpkEu8RIxAzTFHdlln5107tCXnZbHahYTrcbvhVKWSk0nOWgRRStn75NPUb3ZZO+ucc0FSWStc1iXG6FKwJhAEYwzW2FpqyVlJ0bRtLXVFLiZPKQcKFQhapVQjawHOWa1NDLHUjGDNqbRbBQhMKUNCMCi96DAllLBYCq5lXiZMAWaSSwYhdMuqV5dLQQjVCglBXPIcKka0bTvvjcsxxZpzJpSDUgCG/dCmElIOlLWEQQjh4bjTs8cIQ8JzLVziYd/CXJtWSSWci/N1ZbRKpYKLh/3h+7fvuejUoMZF//T549evH0BNapAAA5+jDX57PN7d3wFAUgKcya5tWtVabYtPZtKlZKqoFEJ7Lznruq5AqP2cIciuxmC1tZDSCkCBBFSQcigxAFTaXnz//ZvDZjcbvRqbY5SMU4AwRhBC1Yq2G2oGk/XLMjvtKC8ulwhWiMDbm93bw+2+29QM13wZ9WRNIBgBxGuCiPB5nDKoQirVYwvih+dvbT9Mq75eZ0awbAUgsMQUc5ac2dWk5DFFCCCMwOtX90JyVBAAdbffphARgpQxitFu23sXnA/GGlDqyzTDXNacSyk+1wwwiJlCUihkgi7OQlgAqIwSypD12lrHMd207W9+eAMr+OtPH6fr5a8+Yly6Tu53RwLqd+++0zrlQhgTCKpxPlMhS6rBJ9JwRBFmMJZkvVuXZbxMhJLdZseEbHi7azYL8Kfz11KyEg0ioJQCK0gxg1SFEMHbEurQq+22J5U9nh4vl+l8Os3XiVIhG8UUXy5TvaZSy+F2+913r0HNsXTGWO8Spmx/6L0Oztl1ta8Ilpt2OA5mieN5TgnmAGTfIUy+PT54F0EFu11/uY56XZtOzeMsuNgN20ZJ78Ji54fz5303cIZKtT7WWIVUZJpqyUliARDVcR3XObpUQMUcI0Qu5+vjQzvN8yBF0zTT7K+XhRGiOKwxSo5xQQXk4GzMoBvU7XHz3Q9vX56un/72YM18czhaY8zjSPq2bxvqs/P68cF4F/Z3CpYqMfIlPT2e3rzZXR/O56dpvphOCT1FiOpxf8tk+/Dl+cvnb/1G4FpLSLRiknO5PF9MkNttAyvyKdeCGFa9aJ7dEkuEpVqXFROEYbwtRIhsDKUEosgo9SHFkCilKddcSknBeVfmX1p8kFLaSIUg8c7GGBlHsFQIMAIIA7hVMOcIE6CU5JQRBAVXWItZTQjBxwAqLBUjDJON87zGlBgjXd8zSiFAEIBcSqk1uBBChjmXFENGPjguhJSi73qCMCaYtOSXczOl5FPCBOUMaipciggjydGF6L1PKOSUGtV66zGjIfrkHaiVKSGbBhJEEIEYYwwoodnXVLJzwa7OWk84FUKpVgkuUynn6/gY/M1hCwkx2qWaYskJVkE5xQJWjCoCJW+2Oy6kj9F7VyvgnCEIEKQueJPDYbN7vd9xrr68vIBSAUKq6yoEoGKEUAhRSEkFFy5SjDhjIXgfQswpRl8xApimWgBGAMFWKgRBrlm1bUqccNpIpJoGI9g2DaZknrD3MZQQfeyGRslONDIEhxHCFBOmmrbBlIKSU0jXywXAIhWTx+0wDDHEedE5VYQRRBBBijBinEMCvYvzOoXo2rYpIFNISo4pI4TgapamkcdX+1XrYdNhhDln2xYaG7V167LIhm82A8WoQrDMGjEsu6aFONXMGMdCbnc7X/DHr9++fvk06sn5TCnb3+zbppmXtab6+u7V+/vX67r88W9/byRPPkz+CgG02i6TybXwHENMlDPKYKq+YjrshxiDMza7oiQlRHCCScUx+hRtKYi3vOu4pPjYdw8PX/WqIYKl1JSBD5EypjAlnBkfVr2si1kuGlBLJM0A8IZiikPQl3mqhIx++XY6ZwAxY4JxH9PqFtU0hHCAoBAKAPjxy0cXXIn5ehkLjofbo3GBK+pWv/qlFFBrrgUSSgWXqm2aRk3jxDBetGUYMamars8lztZa62LIMfqcEopQUG5DjTFgSpWUerXBJ4ShtishtO0bhuumaVwO3nqnV1zyIHmn5MPXpxxiP/StbAlhbb95Q+t8PV2vl+vknY4lgwrJdrghmJm1IJYlZLvjbTP0NZf5MjrnvYuUUFSA5I0P9eHlXErNAO4Oe4VlLskFizEvxs3jdaq1kaTpO8bEq+PR2fTp29+/Pj5crrNPXjZtziXFHEOsRR2O+2Gz+6d//I3VupRyPb88PZ0QzEHPd8fjp58/eB/atrvdbn5uOqPH03l2RmPOil5zSZ8/fXHG3u32XMoQorYmghxTlkpY70pJD+fHl+m022x71W53W4RztJ5igAnZbdu//PETRE+zCTHU/fbAN1RQFlNSsBJGHp6fmr4Z9tvz1SHMQNHehKaR2+NOdsOqzeRt0/A3b3Z3t3eKtzqUp6+n83XklHpfpFLzsyU8uby4SVOOOEYAlKRtwykhtaNYER5MWqeACglLIEk4G4jCh9sNYpwKVmvkWAnCttvth68PpNaCEfZrmApo24ZDSZBLKX97OrlgEcUp5+hDCqkbhnnRfUtU06VUU8I551IdAoVxSilnglcAV2uQdwjibd8zxkupsMJLyimkFFMtGRQICSgp97KtoFRQIaqAgphiTlk7zzGDAEvR5AIqhCmklCulHCBAKccAMcFAdjUXDGvNNYWSUoSg1hKYVBgj1TZKSIwoQwgCjAT1IV/LtHhTY6IUSy4JAygmlwpn3FFHa8IIYoJjdMnVqgFEAGFcQQ0hYhJpwYgTxhkGAGMEKvQlp1QyAClkyngFMMUaU9XGnk9XhABCGCIoJOvaNkuJfwlUEIKIOF/nmBJrBG8blDMInmC46NV42zdMdn2xFhF4midrT6UC2UgpFMAw15xsgIDAGJq+YYwRTFIIjGHrsp4X2ShKac4p5pRrxhQLznzyxRVMqBBMtU2KyVhDKWllIxgHoFLGS60VgV/ID6UWsxqAKiQIgKqkkkIAAF2KCAMp6WpWShrOBAUEIiSIEDRVWAjCzsdcSk2ZEW6rn6elEbxhMsOiFxN9TCkupba9LJmRTA7dNrhIMHI+OBchIrlECPOmVff3N+O4zNcJIFBSpoxEmxFB/XaIPv7lwwdQ4WWeTpfLarSUUkmOEU25QAgIw3qdfvrZPZ9PMaVN3xIh5uuUMggFVEKyD8Z5JPjQN5jj7CNjjGESndXrTAnqhg4CEJ2FoAbrjV8Jk51QBGLr/cv1GnxGkJRcvQsuJAgrqFmv+nzCm21bCxg2bdvIBGqCNdfqUpjW1Xn/fD2lVNfgMwQ1Z1hRjCmnyhkmiIYUYUWIcVCA9uv5+gxBJawQqbpWKaV8yOt1KSUln7fbjilSAQAAGmM5wX3fAACDTylVjCisqCacMjE+eeNLzLEkVrkQogIIAOjbbl6mWeun8wNllBF8uHs19I2AeNf1ozYPz885vpxO103Xf/zwXGvuNjsdrinH88sLwimExTrzl58n43LLhkYOGwnk7S6BjClYbSg0cIFwJZjQWiommBCUYvSIUOs5lc6akkBJBeS6O3TO+WmdrfEZlOR8BZAyPFCOMH56unRD731cjHHREUIwQdYaH1x2Tha53QxtMwjQAFxf3dy3guUCPn/4+pc/f9xtunfv31zOBkF62B62u8PD86gvk5CcYAYBskYHV87ndWj7eLkWCEL2JBDespLzOI3rv1wBw4qK18e7u1d31kWz6PvjTilVSyoRbI83Xz9/Ntazyn/7u9+GUB8ez61j5/MJwppdHl7fM6Xi6LmSsnV2MakU1oh5dgCh46a/7YZGDpcXPY7GOnd6uWJIun5oN93L10tItcyOdbIRzfG+CT7UgkpO2jpCSaYsx/ryMt/c7mjls3Y5Rj35He9xpcCjaPz7t+8gRpjg1z+87bc74o1HBDElUyio4mk266oRw8s6Ktl0vEG4KtkhCEopy6gxYRIgRAlTrK5QSiklrbVgSiFClDCCSK0glwIgaIUwIZYUAQIxp4IAKAUCWCJIMSGABWc+ekIpIZgSUnNNOTMCCaGEMgBBKXVNKwCJSaKwUKJFCMToUYXaWEorrAABRDEuOfKmGYZeCUEgtt4aG170UitEBUJEKiAx57ZRneoa2UGUKUsFoJxc1wriAKNYKWl1MPOacmWcQoqlbGABJYRSCVYCgORDwpRgRlDFlLCCIJAAFkQQlUotq/Y2bPptLoELMfSt4IRgZo2HENZafIrLbA77g6AglWS0h6D0TRujCz5K2TZ9Ny7WOu9DTCk64ykTTdsYYwEEqm2WMPdiUEoShAmlsGaK6aIXAHOpGWNAGxZczSVDDACEgMBF65wL4xwSDDl2PkCMuVBD19ecg/fRh5RiyplyjhlBEKWYMswpF8rosN8rSi/jFcICSVWiIYwwytfRcCRzKjnmWktwwaYIAAUIGOhhQ3Ot8zQqcY8h8j4Yo1djIEScsetpMtod9je05aiQxWjjjF41wMz6CGstEdg1+xBXY0qtmGESEgZECfHy9IAJXZepAGhjsN7FHKVs2nbDGLdB2xArwg/PL5thK/vhN69fbZrWauu9T8apQXqfkyeIgZv7m3aQGAPWkmHYcd58i051EiMAaokpxRwRxAUD2rLzZWI9n5d1XOfH5rRMK2BofJlDyr9sKwjEnAvLqpuuFZxvWpVj9D5kTEarOUGPL1fJWN8PAIEQYsq55FJKUQ0jtGAkAES4VvL/RwlKTiknrOTkiuVcqLbX01Jy7Ibu4ctDrQWADCrMCeQKYQETsrtDBzPUWnvjtfX73Q4C4GOapzWFTBABmEFAtA4xR4RKw3lKMBZ8e/8OE5h8QLVkE87a9aR5tXnz/DIKIV+9e9t0A2dUys3LOMVYU/SkQoSTUrACMBqDEeOKBx9rLZSLlH1G4HZ3xyXO0GZvagUIIkoxxSQmHzBy3jSxgQCVlJZ1LsUoiWUrjTbWW8ZJyZkLLoWIPpgCn06np9PFmFAB7PvhsN8y1sQUtFmJZCH50/XSqE7rNWQdvCsJMiaDiRc7/X//88/f/eYtE+Lx2/O22QGIo8sIAIZICfn1/duJqvWy8ld8WR2XwHpPaG27Xvbcjsvp5eJ8envzimO52WwJok/fvszm6qO+OWxBrtNo53WxMTeye/vqbbdV41VjjrkQFAOh+N3rm1rit+fL5TpDjFdrQggi0PN5ZbfCGVMsaLumUeKnnx5WZ0Tb9MM2hUAEB4hADHkvGMacsv2hO2wbs5jiyOpNTejuze1pmr3PFIE3799Ul/hlHGdt07Q97Pabw+fHz6CAw37z/tffPX5+lvjmmj6SmlGBqGaEMVxWu+i15AIS5EQwzGAumGIlGs558K7CAhB0VudaailcMGdsypgL9gu6BIAqG04qsdGDWrRznIlQEedqt8EFghqDddYaH1IEEIEKEYE1A4hg1/Q2WFArYqiWAmrFEOdaIQK8YaCARjawwphiLSXEEHOOUddaMaWECEKJVIIgokRTIdDr9bou0XsEUY4JE1IRw5RstkOM3sVVMY4hYBSXnACCbdPUUnKstYICIVMME4QJqrACDHItgmOEAYQAYZBSLBUAAAhGiLNSM8MMI+K1J5TBBsdk3bwgJLlkCEEffMwhJB98FEJ2Q0tw3W66FKtAtpYMYYkQtV1PCEdYAhRU29ZaaSSYEITQOo9aa6a4cQZRRBVjEiNcc7LBm6Htt22Tcw0hQVhTrgyQWBMhqYKqlGCEFlBhBcmnAHwFhWDICIjZJZdiSABUwgn2HiIASiJSlAwoIbjkUmr0xhWWS0wxCMIkZxRijAiX3bKsWhsT7LSs3kUMoVKMQhpcpjRhABvZwgxKBr/MfmMsEAC7zoySlDzDi7chpYQI0M67kBHOIaRScy55NXpdZkhI9N4tnjJOKU05umC9dyBXKmXFyAVbYYUEx5yT04uZAEJUMspQzEHiphNKiSEHoLqWSu5TgqJWUEXTKMWbVhFMBRUc0+gjwZVzVksBuRSQYIa5VtUq2e6lXAusu7tDjrHWurs9jPPosiOSpNkTRFPIXHFIiPFG8L5UzAhChXiIdlu+WJNyrRBd5ul4dyAIAOcLhDEFCDNGmGCcc2KCQoRhLdlbgomg/Ox0SF5U3qleVg7gou0lpAgwuMyTzA2jAhNKEI226MVv+p5g9ricIeHjeYUALkZrYxBFmKKakYnOW++tqyDCCgljUnDBeIHpajQo1LhwWdZWryusa9CilTznAnPG0ES9WE0YcamGXFKFkEsQPWaga6XxOhoIKMg1mlVTpQDKGBJjVoyqoByUKjjTFLtUQ/Q0emOmvt9UjDdEFFSndZ7MmmFmDXN6RjnjDOYpqqZzKERQrLEheE4ZxAgjAiAkhN4e9yZaa9cPH/+upCQIjsv4/PS4rnpedcJg03VE4JDL63c3lLDPnz4+ff0KYUzQXceIOVnX9c3Nrx4enlpSV7OUUi6LO24OBVWEAGTQJ08Ypgzth4EI+fnh66znBEu770gj3WQiLMbovlVduyGUTNOCGCYCa7vWknrYXCe0LhZRLBoqeXPcH8eXc07+/DiiQoxZKCwL9uNkMooxFZZKTHG96k6pw7GXDf/TH37OuYQSJcNZ+z3v2VH8/OVrBqxGLFi3LM9KClxLRYhIUteMCG033dP5edJT2wkmMEz59tXNf/pP/4/sIrk8L4jVbl/aXvnVIYgYFyXnw+Y2lVhyIoL5aH22pQBQUoFAMMYVo7XEEIIPFdRUcgUw5swRRJTAAmnBdvVZoJygTyFEX3LBEBIsdLEuhpg8QTzWQgDkmGJMY8iUUkoZBLWAiiECAFCKVdvQLGHOjVDamBIDYzzLmktKsUzzVaqWMsYEk1JiQlwMvyQMJeMol5RSTDnWIjhmWKzjFWNYU5IUaautd1RQbzzDBCAQow8hAJilbChBuQCMIOeCMCw5b6QotSSEUa6plJxTTtl471PCnEpFCEaQYZ9KrpBzjiHyzptV51opQbkUShlGuKS0xhhB2PWbTnIIEYJ1DQwRAQHMFTLGsoug1lJqTnGy7vpylrKjjJSSVSO2m37oBsGYnhdbsxL8bneYtDldTvOyhhAgrFQIrhgGqNRSAEAAVghyTbkgBBHFmCKCIZKN0tDajISgVsNaIsFKCJzzLx8UDSr01hljMCGp1ApRCKkRbYpxnafgE4DE2YwxKzUFnxCJhUAhREqp1tx1Dax1WbULusQKIZ7PE0A4syqUWE0IKdtZE0HkoCRCOSOeIcAgxuqv02pciIErhShMJZcEQ66QwOJrATVZRyiXTZtyoBjEGq3RPjhCCKgZIcwYj8Ety/xyPjvnKqoFAqIIVcTllXCkWg4BMM5CgEoKk16sNbWWEEKqpcQUS0EAAQBzLFxya50xZth0OYVcQ6qxbWWKADCAK0GA1gKEaDBCERYPElOSCwx8PB6Pc3AP8nm+Tpwza30uBXOOK9xstiCm2WjGMufUBg9ARKxQQIMJ3lnjDcKwbzsEK8EYg4oJUC0PKdmYqksAAcVILQAS5Fw4xYuzvmsHb6Kbp5IL4iDG6I0HXV9K9NYjhJggRifrA62glhKyh6wWUGxMKKUEyt8+/gwFTy5AWIZdm6w3ccoJFpwKLsuyRseQpERJzITqt4IzFwIRCIbqQ9BuRcm1iixTDlV3rdiIgVMmOYs+x+BKqjmFXEJEoWmbLTqGmAiltdRuUwNI3iJvbExFNirE6K3R1sAKvfMAw03beZ9wdY2Ubd8KSL98m4wOj89fx/kyT8s622lcSim5wgxQ8PVymiimx2FILoFalZQ5l2+nRyJELB9//vZ5MzTd0Kewv1yuEON+OwxDxwSJzm2HTSqJC7rq2Zv54fnl+nLpdo2zSQrw+v0PED92z3OOeTj0z58fUqyb7aYUWGKN3seUQs4AIinkXb/fbrYEkoay8fywLsasep11P3SLNS9fXsZ13fW3m2Yw3kZd1zmdngznaNh282UEiHOOb3Dvrb/p1Lltn9fl6eEJtzwnT6TINa7BfPf+Va4QwkvyFnECS2aNsMl+efqECG2P7fw8EYKytz56bhaoOtHJdjyNGAPB8Lw6H0MliElSUiq5EIxicJJjt86YEC5xyiz6VHKpEBFGIMaplBhziankvM4LHHIuAKTgXUAIVVBzSYRARntOBUAIQUgYxrDmlBFCzcAJgs6aGBKmmGICf8FFCYUQEZwFH7yPspWlZJN023eMi81u6BvFGAUlrXoBBMGaMQaYEsapFAJhTCmDiHhnCWTZe6MRYQhHSBmShdRUMWYIEYxpKdIHL5tGUYHwL2MSopRIqSglrI+EIAKqDz5VXzBMMVvvmeKIMVArRhVDIBnjnMWUQ/ApxowBIIRwWimJIZOSc0AlhVoLJTzXEmNACAKAEsgh+hQDgKCUTDARiNwdD6VUTIEPgEDCOaugGGtiChwRCIC2/1sVzROhJOXkc1GNpEL8gvoMKXNGUvKEQNU0IGfvXI4RSYEpBLBgDIRkJVcEkTNWSJ5y4RSnVIKzxodu01COY8xE0AKqWQyowLlYAGKcsVoDSBCCWgDCCGFUSvXBYQQhgtEsJSWCaXQOVZRTIZIwxnMMlTFEUQwxnBbRigpgraDGbIwOMTpnu6FDGBofKacpBaE4gKVWUAtQvaKIulg4Fd541MEKSkoRVgBylYIRQkuIGcGX04u1VjasZgAxHvoGodq3HcKkYuQXd71eso+YosN+62PQ2vyi1SygcoIoobACb7wP/hdsSdtRs5oSMyGEUwZg0UuijEMCQorAlwJTf3csuLrojTHmUVNOMAWYoRCjoAIiSCBmmDPKXTSwgugCJYgiYm3wAGZQso8VYViBUC2k5Dqe1/PiYiIIdE2jXYQwVIAQYqlUUEvNmUMcUvaLB4DAAqNPGUVJaMo+avuyusPdUQhWchGEVVZyzsV7iIr13l1dzAnQTGsppcJc91t1PUfv8nXSUhK3WiHk4XhQTQIBjy+XdTKYo5v7neqOABY9nWpJEAJFyd1+SygbWjm+XEKwAUdcNjVAhErfKbtwvRrZMMSQ964bZM5ZYNK2m+CDmde7+1vzMuoKD5tBKdV26suHBRVECc41d43iDE5zpBUOLSUAp5w6Kb1113WKl0u0vro6PY7DYRBUeZeICcN2qBlAiB6fnmoBbdMAiPvWCsEIIueX86vjkRdyPA7jy1VRsVVqu92tbrU2cEZRwMnUXO3LeS6xMEpxRZeHi0T8DM4Qw2EzRO/ny2Im510AGe92G7nrpit8evoCMWz7TfQ+2bDr1WLm/a4JVj49jT4BRIGJHkUAAXl/+wYkigqWWOQ4QYiyDk9Py82P++vTCaF0etH3t31aQ/DhdrNzOZ/NCIFzXqv2lkoYRvfT337eHXbJcD1Op+vl1Ztd05HHb2fNaLdpzZNu6ZbAjJqmAwBhVAgGztocEkEIlgJy9SaUChKgtSQMESMcVBRsVA0LPsWcc6q1IrM4F8L2uGu21IcSXQAxlZBLBdZEREiCmHKOAGGCEEopEZxLxnhMpaSAYCkp51IgJCEkzEnOGSKAKqylgAIghIRQABFXsinUWJ0zwFywHFCFx/1R8IZyAnAyi130QhivMUGBC4aMc6UkSbAW6HMGGaACiw+Fi1pr8CWmhDAkmEPIEcLRBR9M0zBASNO1pcCaC8TAu5hTJJiiinOFpWTnUvAZlEIQxQinmHzOBVeEIUigFIgZM7O1OpYUZ+9kq0BEMRdRCaNEQIYrTjmMJrgcQ84UMcKFiykkqFePMAQVE8KaVubga8kxOyEFFTz4hBApOYGCBFaoMLsm77PgnRIBQJTLL1FLSDCOANVaEQClZIYwgQgj5KwvsNZcMCYVVuNSzKDUygWz1mGEAKoVFO8CgQRUUEOqMTPFrYmMgVIBxjTFklKMOThna8k1oxwKroU0rADgfVhXoxQHECYXSq4M00aqMIfNza5CQDm1JqeYIcEYkQJqShARWGpFAFsbcwyCs1oqpghAZK3r+qb88iYnMpUQQ6oMYYwwJAgXkHJyPieQY2wbihGFFXdKBpeN9s45QjCjNKVqdeg3e4LYZGxKOTrvbDLLsht6r53P0a4h1oJEFQhSRNqG6jV4nwCkOSVnLcQJYBhiqRXWihCFCWRvAymINCnaFVUJomV9v5r07OZNkalmk2IlhDNWAQAVUowpYZhSEqjCIqdIAI65TovpagsIyqkwyaiQgkqtU/L69PRCKMsE+pQhxlK1tSLZKz9p7yxT2HocbSguN5yXCmqtQojgLMIFk5pTLAlyxmywLnrGGKkIghpTrDX77FMpFIBYEqqYCjoM0q0mlmKMTyXB5JmgMYb1Za6+DP3GWMOmAA+Fcry6eF0NL5TACgpoRLM5bkrK0TlYEymkong6zRWCSfs5hJCScMGGkAvohsav4fXxLtlwfTlVF2d7gYyWirgS28NQEfhF2wsRbBs5NIoSvK4B1Hjc9k9fH5pbTASujK4+V1uKg7Tim/3tcNjJdvvl66fgsl183zTzYq7X2ekAQeYNl0q8eXVPCZ+/XDiWZllZV87PT4wS8mpfYJzscj1rQVB2RTfBaX35fK2YBusI4Go3pEidDsZ65zJEONcKKekYF0QK1vdb8fz1G6qIVdJtO7PoD3/7tN3042XBLQQM8FZOq95vFKPU+9K229/+7u2Xf3sI2hWEKKUgBkoBrOH09TQct8vLvO3gHMK6rhVWwBnFlDWUSRZQSRQZ75eLabk0kyOFVAyD88l4dktSTrDgaHyMZJqvqJNH1Q2b7RAs8HN0NkVfGGExVIwQI6zY6CdjLytMgFAabQQRVF9qLCjDRsjscitYL5iEPC3OLyauAaSac4ax1lijD3HxftGKU0nYwNSu2QisGOQUEgIYyAQhWnKtAaCMa4Go4PmyoAoJxLBUDggnjBYsAFOMtazpVKeYarDcysMghk4ohkm2saQMKyg+wwz85MqSdqpvaQtt5QWBCLLPBAMMiJ4MglAIDjLKOkoupBTFRY7/fyXY6WpkRRQA4FPLqe32knTMJDADI4gw6Pu/jIiijGCS3m7frlvrqeMPv8f4pNPOCPzhYS/a0B28Ml66ELbQoOVKqaR5RQlcSQslB2+nAIO1UKNSnYvIIJpww9dbr/dcl+qtNegvHznN+f62qCGDnUbl0YYYyjikSvGyGBCCQbZBpQYf7qd4n1cmYYwFQg12wi137e2upJbmtcWGWi+XdY3ldo2UWJHY+d12s92HHTJYpZmZmVqqNRajzeQmj06AEMTQOoISUoNQSuFo0FLXqEvtztvbJaW5AauSugTFJAUpa00IbtRGKQMROqMMrmu7RQJAITGE3fPrwZj/76JTYuqidk6Z1oXSUqmMYKbgwsPhgTqJAdwBAX3YAGkUTnTUA5c5ni53JWFdmmzy9euz0aiHgSYk6VElDE0Z1msvc+cCKLS1Titd13E7r72AFt4Yb9D0Wq/Ho7Vy1CalqDkpYiuVLjx5u98Er0ArptEv5+Pb2/l+S8wMUuSU4+U+TXj4vGHFKecxuOTqjEPGsQrOwqEXXQPz8Rjfjzf3OAHBes35RlwonlK/FKLSL5FaG4M3wcvKqg4ncaP9pGyQFruwrCa0QSjVxcuPL09TmN/ndUlM7J0XDbkSJQJSlbRCE6aNkk6DlqS99hRrT3mk2jO3RL2BZh1jaQ2oIVe0jIdpZ9GPYrRxrfRRWaN34REUrktb5wogaqEShwJZYzNS78wuvlUjjNFusj6eW1/YadtXqiujNsqGye1D2Ds97UJAKT3j5TT33IxQD8EjQblnJTDdO6pJKQdCWOPCbsNdURMFeNQhO8ynxQwNAlJOXAd0sXFekdrY8Hx4lKVyKlZZNXAbpsNmu3G2ZUpLZerf//n++29/jNgn7wJORnvJSgvr7TZMeyYE55Sw57cUz1kOnk+XUUfOnQeKys+750+fnqjk/e6gJvy4zB//nmFIaiCsfj9+LB/XuhRlEYwyk4+xEcn7vSnc4rSN1+ExUGWH7vD0yA1GqXWltLTXzy9ff/328depRm4Fp/2uxtJTfQwbGhWlSNeCQ1tl9mb7+vLysN89Pz399MvPKTEod488wCjtCPSff7/PdxINy1z3flNjfjsehxkr1aWmxuk8r8Djy5eXw8NBjcGFqI8cyz3mkftIbDWyQCdMvtZ865CGqfAfCjum6whpEd8AAAAASUVORK5CYII=", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "show_output(output)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55556043", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/extras/use_cases/agents/sales_agent_with_context.ipynb b/docs/extras/use_cases/more/agents/agents/sales_agent_with_context.ipynb similarity index 100% rename from docs/extras/use_cases/agents/sales_agent_with_context.ipynb rename to docs/extras/use_cases/more/agents/agents/sales_agent_with_context.ipynb diff --git a/docs/extras/use_cases/agents/wikibase_agent.ipynb b/docs/extras/use_cases/more/agents/agents/wikibase_agent.ipynb similarity index 100% rename from docs/extras/use_cases/agents/wikibase_agent.ipynb rename to docs/extras/use_cases/more/agents/agents/wikibase_agent.ipynb diff --git a/docs/extras/use_cases/autonomous_agents/autogpt.ipynb b/docs/extras/use_cases/more/agents/autonomous_agents/autogpt.ipynb similarity index 100% rename from docs/extras/use_cases/autonomous_agents/autogpt.ipynb rename to docs/extras/use_cases/more/agents/autonomous_agents/autogpt.ipynb diff --git a/docs/extras/use_cases/autonomous_agents/baby_agi.ipynb b/docs/extras/use_cases/more/agents/autonomous_agents/baby_agi.ipynb similarity index 99% rename from docs/extras/use_cases/autonomous_agents/baby_agi.ipynb rename to docs/extras/use_cases/more/agents/autonomous_agents/baby_agi.ipynb index ae7668acb..88e53c979 100644 --- a/docs/extras/use_cases/autonomous_agents/baby_agi.ipynb +++ b/docs/extras/use_cases/more/agents/autonomous_agents/baby_agi.ipynb @@ -249,7 +249,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/extras/use_cases/autonomous_agents/baby_agi_with_agent.ipynb b/docs/extras/use_cases/more/agents/autonomous_agents/baby_agi_with_agent.ipynb similarity index 100% rename from docs/extras/use_cases/autonomous_agents/baby_agi_with_agent.ipynb rename to docs/extras/use_cases/more/agents/autonomous_agents/baby_agi_with_agent.ipynb diff --git a/docs/extras/use_cases/autonomous_agents/hugginggpt.ipynb b/docs/extras/use_cases/more/agents/autonomous_agents/hugginggpt.ipynb similarity index 100% rename from docs/extras/use_cases/autonomous_agents/hugginggpt.ipynb rename to docs/extras/use_cases/more/agents/autonomous_agents/hugginggpt.ipynb diff --git a/docs/extras/use_cases/autonomous_agents/index.mdx b/docs/extras/use_cases/more/agents/autonomous_agents/index.mdx similarity index 100% rename from docs/extras/use_cases/autonomous_agents/index.mdx rename to docs/extras/use_cases/more/agents/autonomous_agents/index.mdx diff --git a/docs/extras/use_cases/autonomous_agents/marathon_times.ipynb b/docs/extras/use_cases/more/agents/autonomous_agents/marathon_times.ipynb similarity index 100% rename from docs/extras/use_cases/autonomous_agents/marathon_times.ipynb rename to docs/extras/use_cases/more/agents/autonomous_agents/marathon_times.ipynb diff --git a/docs/extras/use_cases/autonomous_agents/meta_prompt.ipynb b/docs/extras/use_cases/more/agents/autonomous_agents/meta_prompt.ipynb similarity index 100% rename from docs/extras/use_cases/autonomous_agents/meta_prompt.ipynb rename to docs/extras/use_cases/more/agents/autonomous_agents/meta_prompt.ipynb diff --git a/docs/extras/use_cases/multi_modal/_category_.yml b/docs/extras/use_cases/more/agents/multi_modal/_category_.yml similarity index 100% rename from docs/extras/use_cases/multi_modal/_category_.yml rename to docs/extras/use_cases/more/agents/multi_modal/_category_.yml diff --git a/docs/extras/use_cases/agents/_multi_modal_output_agent_files/output_10_1.png b/docs/extras/use_cases/more/agents/multi_modal/_image_agent_files/output_10_1.png similarity index 100% rename from docs/extras/use_cases/agents/_multi_modal_output_agent_files/output_10_1.png rename to docs/extras/use_cases/more/agents/multi_modal/_image_agent_files/output_10_1.png diff --git a/docs/extras/use_cases/multi_modal/_image_agent_files/output_10_1.png b/docs/extras/use_cases/more/agents/multi_modal/_multi_modal_output_agent_files/output_10_1.png similarity index 100% rename from docs/extras/use_cases/multi_modal/_image_agent_files/output_10_1.png rename to docs/extras/use_cases/more/agents/multi_modal/_multi_modal_output_agent_files/output_10_1.png diff --git a/docs/extras/use_cases/agents/_multi_modal_output_agent_files/output_15_1.png b/docs/extras/use_cases/more/agents/multi_modal/_multi_modal_output_agent_files/output_15_1.png similarity index 100% rename from docs/extras/use_cases/agents/_multi_modal_output_agent_files/output_15_1.png rename to docs/extras/use_cases/more/agents/multi_modal/_multi_modal_output_agent_files/output_15_1.png diff --git a/docs/extras/use_cases/multi_modal/image_agent.ipynb b/docs/extras/use_cases/more/agents/multi_modal/image_agent.ipynb similarity index 99% rename from docs/extras/use_cases/multi_modal/image_agent.ipynb rename to docs/extras/use_cases/more/agents/multi_modal/image_agent.ipynb index 0e8e5f5d5..107cea32c 100644 --- a/docs/extras/use_cases/multi_modal/image_agent.ipynb +++ b/docs/extras/use_cases/more/agents/multi_modal/image_agent.ipynb @@ -245,7 +245,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/extras/use_cases/agents/multi_modal_output_agent.ipynb b/docs/extras/use_cases/more/agents/multi_modal/multi_modal_output_agent.ipynb similarity index 100% rename from docs/extras/use_cases/agents/multi_modal_output_agent.ipynb rename to docs/extras/use_cases/more/agents/multi_modal/multi_modal_output_agent.ipynb From 1960ac8d25c142f23a10a8203e6ccd14c8ca6be7 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:52:07 -0700 Subject: [PATCH 132/143] token chunks (#9739) Co-authored-by: Andrew --- libs/langchain/langchain/callbacks/base.py | 12 +- libs/langchain/langchain/callbacks/manager.py | 7 ++ .../langchain/callbacks/tracers/base.py | 13 +- .../langchain/langchain/chat_models/openai.py | 4 +- libs/langchain/langchain/llms/anthropic.py | 10 +- libs/langchain/langchain/llms/openai.py | 12 +- .../chat_models/test_openai.py | 112 +++++++++++++++++- 7 files changed, 153 insertions(+), 17 deletions(-) diff --git a/libs/langchain/langchain/callbacks/base.py b/libs/langchain/langchain/callbacks/base.py index c03633e2d..d6155536b 100644 --- a/libs/langchain/langchain/callbacks/base.py +++ b/libs/langchain/langchain/callbacks/base.py @@ -10,7 +10,7 @@ if TYPE_CHECKING: from langchain.schema.agent import AgentAction, AgentFinish from langchain.schema.document import Document from langchain.schema.messages import BaseMessage - from langchain.schema.output import LLMResult + from langchain.schema.output import ChatGenerationChunk, GenerationChunk, LLMResult class RetrieverManagerMixin: @@ -44,11 +44,18 @@ class LLMManagerMixin: self, token: str, *, + chunk: Optional[Union[GenerationChunk, ChatGenerationChunk]] = None, run_id: UUID, parent_run_id: Optional[UUID] = None, **kwargs: Any, ) -> Any: - """Run on new LLM token. Only available when streaming is enabled.""" + """Run on new LLM token. Only available when streaming is enabled. + + Args: + token (str): The new token. + chunk (GenerationChunk | ChatGenerationChunk): The new generated chunk, + containing content and other information. + """ def on_llm_end( self, @@ -316,6 +323,7 @@ class AsyncCallbackHandler(BaseCallbackHandler): self, token: str, *, + chunk: Optional[Union[GenerationChunk, ChatGenerationChunk]] = None, run_id: UUID, parent_run_id: Optional[UUID] = None, tags: Optional[List[str]] = None, diff --git a/libs/langchain/langchain/callbacks/manager.py b/libs/langchain/langchain/callbacks/manager.py index c6f626204..3f22832de 100644 --- a/libs/langchain/langchain/callbacks/manager.py +++ b/libs/langchain/langchain/callbacks/manager.py @@ -49,6 +49,7 @@ from langchain.schema import ( LLMResult, ) from langchain.schema.messages import BaseMessage, get_buffer_string +from langchain.schema.output import ChatGenerationChunk, GenerationChunk if TYPE_CHECKING: from langsmith import Client as LangSmithClient @@ -592,6 +593,8 @@ class CallbackManagerForLLMRun(RunManager, LLMManagerMixin): def on_llm_new_token( self, token: str, + *, + chunk: Optional[Union[GenerationChunk, ChatGenerationChunk]] = None, **kwargs: Any, ) -> None: """Run when LLM generates a new token. @@ -607,6 +610,7 @@ class CallbackManagerForLLMRun(RunManager, LLMManagerMixin): run_id=self.run_id, parent_run_id=self.parent_run_id, tags=self.tags, + chunk=chunk, **kwargs, ) @@ -655,6 +659,8 @@ class AsyncCallbackManagerForLLMRun(AsyncRunManager, LLMManagerMixin): async def on_llm_new_token( self, token: str, + *, + chunk: Optional[Union[GenerationChunk, ChatGenerationChunk]] = None, **kwargs: Any, ) -> None: """Run when LLM generates a new token. @@ -667,6 +673,7 @@ class AsyncCallbackManagerForLLMRun(AsyncRunManager, LLMManagerMixin): "on_llm_new_token", "ignore_llm", token, + chunk=chunk, run_id=self.run_id, parent_run_id=self.parent_run_id, tags=self.tags, diff --git a/libs/langchain/langchain/callbacks/tracers/base.py b/libs/langchain/langchain/callbacks/tracers/base.py index 7dec527c1..bee30a515 100644 --- a/libs/langchain/langchain/callbacks/tracers/base.py +++ b/libs/langchain/langchain/callbacks/tracers/base.py @@ -13,7 +13,12 @@ from langchain.callbacks.base import BaseCallbackHandler from langchain.callbacks.tracers.schemas import Run from langchain.load.dump import dumpd from langchain.schema.document import Document -from langchain.schema.output import ChatGeneration, LLMResult +from langchain.schema.output import ( + ChatGeneration, + ChatGenerationChunk, + GenerationChunk, + LLMResult, +) logger = logging.getLogger(__name__) @@ -123,6 +128,7 @@ class BaseTracer(BaseCallbackHandler, ABC): self, token: str, *, + chunk: Optional[Union[GenerationChunk, ChatGenerationChunk]] = None, run_id: UUID, parent_run_id: Optional[UUID] = None, **kwargs: Any, @@ -135,11 +141,14 @@ class BaseTracer(BaseCallbackHandler, ABC): llm_run = self.run_map.get(run_id_) if llm_run is None or llm_run.run_type != "llm": raise TracerException(f"No LLM Run found to be traced for {run_id}") + event_kwargs: Dict[str, Any] = {"token": token} + if chunk: + event_kwargs["chunk"] = chunk llm_run.events.append( { "name": "new_token", "time": datetime.utcnow(), - "kwargs": {"token": token}, + "kwargs": event_kwargs, }, ) diff --git a/libs/langchain/langchain/chat_models/openai.py b/libs/langchain/langchain/chat_models/openai.py index 7cb1947cf..5d944852d 100644 --- a/libs/langchain/langchain/chat_models/openai.py +++ b/libs/langchain/langchain/chat_models/openai.py @@ -318,7 +318,7 @@ class ChatOpenAI(BaseChatModel): default_chunk_class = chunk.__class__ yield ChatGenerationChunk(message=chunk, generation_info=generation_info) if run_manager: - run_manager.on_llm_new_token(chunk.content) + run_manager.on_llm_new_token(chunk.content, chunk=chunk) def _generate( self, @@ -398,7 +398,7 @@ class ChatOpenAI(BaseChatModel): default_chunk_class = chunk.__class__ yield ChatGenerationChunk(message=chunk, generation_info=generation_info) if run_manager: - await run_manager.on_llm_new_token(chunk.content) + await run_manager.on_llm_new_token(token=chunk.content, chunk=chunk) async def _agenerate( self, diff --git a/libs/langchain/langchain/llms/anthropic.py b/libs/langchain/langchain/llms/anthropic.py index 63664e07a..f7ee0ab57 100644 --- a/libs/langchain/langchain/llms/anthropic.py +++ b/libs/langchain/langchain/llms/anthropic.py @@ -289,9 +289,10 @@ class Anthropic(LLM, _AnthropicCommon): for token in self.client.completions.create( prompt=self._wrap_prompt(prompt), stop_sequences=stop, stream=True, **params ): - yield GenerationChunk(text=token.completion) + chunk = GenerationChunk(text=token.completion) + yield chunk if run_manager: - run_manager.on_llm_new_token(token.completion) + run_manager.on_llm_new_token(chunk.text, chunk=chunk) async def _astream( self, @@ -324,9 +325,10 @@ class Anthropic(LLM, _AnthropicCommon): stream=True, **params, ): - yield GenerationChunk(text=token.completion) + chunk = GenerationChunk(text=token.completion) + yield chunk if run_manager: - await run_manager.on_llm_new_token(token.completion) + await run_manager.on_llm_new_token(chunk.text, chunk=chunk) def get_num_tokens(self, text: str) -> int: """Calculate number of tokens.""" diff --git a/libs/langchain/langchain/llms/openai.py b/libs/langchain/langchain/llms/openai.py index 0ab265291..837256ec9 100644 --- a/libs/langchain/langchain/llms/openai.py +++ b/libs/langchain/langchain/llms/openai.py @@ -297,6 +297,7 @@ class BaseOpenAI(BaseLLM): if run_manager: run_manager.on_llm_new_token( chunk.text, + chunk=chunk, verbose=self.verbose, logprobs=chunk.generation_info["logprobs"] if chunk.generation_info @@ -320,6 +321,7 @@ class BaseOpenAI(BaseLLM): if run_manager: await run_manager.on_llm_new_token( chunk.text, + chunk=chunk, verbose=self.verbose, logprobs=chunk.generation_info["logprobs"] if chunk.generation_info @@ -825,9 +827,10 @@ class OpenAIChat(BaseLLM): self, messages=messages, run_manager=run_manager, **params ): token = stream_resp["choices"][0]["delta"].get("content", "") - yield GenerationChunk(text=token) + chunk = GenerationChunk(text=token) + yield chunk if run_manager: - run_manager.on_llm_new_token(token) + run_manager.on_llm_new_token(token, chunk=chunk) async def _astream( self, @@ -842,9 +845,10 @@ class OpenAIChat(BaseLLM): self, messages=messages, run_manager=run_manager, **params ): token = stream_resp["choices"][0]["delta"].get("content", "") - yield GenerationChunk(text=token) + chunk = GenerationChunk(text=token) + yield chunk if run_manager: - await run_manager.on_llm_new_token(token) + await run_manager.on_llm_new_token(token, chunk=chunk) def _generate( self, diff --git a/libs/langchain/tests/integration_tests/chat_models/test_openai.py b/libs/langchain/tests/integration_tests/chat_models/test_openai.py index 7637014a4..5c8b0e43e 100644 --- a/libs/langchain/tests/integration_tests/chat_models/test_openai.py +++ b/libs/langchain/tests/integration_tests/chat_models/test_openai.py @@ -1,18 +1,22 @@ """Test ChatOpenAI wrapper.""" - - -from typing import Any +from typing import Any, List, Optional, Union import pytest +from langchain.callbacks.base import AsyncCallbackHandler from langchain.callbacks.manager import CallbackManager +from langchain.chains.openai_functions import ( + create_openai_fn_chain, +) from langchain.chat_models.openai import ChatOpenAI +from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate from langchain.schema import ( ChatGeneration, ChatResult, LLMResult, ) from langchain.schema.messages import BaseMessage, HumanMessage, SystemMessage +from langchain.schema.output import ChatGenerationChunk, GenerationChunk from tests.unit_tests.callbacks.fake_callback_handler import FakeCallbackHandler @@ -191,6 +195,108 @@ async def test_async_chat_openai_streaming() -> None: assert generation.text == generation.message.content +@pytest.mark.scheduled +@pytest.mark.asyncio +async def test_async_chat_openai_streaming_with_function() -> None: + """Test ChatOpenAI wrapper with multiple completions.""" + + class MyCustomAsyncHandler(AsyncCallbackHandler): + def __init__(self) -> None: + super().__init__() + self._captured_tokens: List[str] = [] + self._captured_chunks: List[ + Optional[Union[ChatGenerationChunk, GenerationChunk]] + ] = [] + + def on_llm_new_token( + self, + token: str, + *, + chunk: Optional[Union[ChatGenerationChunk, GenerationChunk]] = None, + **kwargs: Any, + ) -> Any: + self._captured_tokens.append(token) + self._captured_chunks.append(chunk) + + json_schema = { + "title": "Person", + "description": "Identifying information about a person.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The person's name", + "type": "string", + }, + "age": { + "title": "Age", + "description": "The person's age", + "type": "integer", + }, + "fav_food": { + "title": "Fav Food", + "description": "The person's favorite food", + "type": "string", + }, + }, + "required": ["name", "age"], + } + + callback_handler = MyCustomAsyncHandler() + callback_manager = CallbackManager([callback_handler]) + + chat = ChatOpenAI( + max_tokens=10, + n=1, + callback_manager=callback_manager, + streaming=True, + ) + + prompt_msgs = [ + SystemMessage( + content="You are a world class algorithm for " + "extracting information in structured formats." + ), + HumanMessage( + content="Use the given format to extract " + "information from the following input:" + ), + HumanMessagePromptTemplate.from_template("{input}"), + HumanMessage(content="Tips: Make sure to answer in the correct format"), + ] + prompt = ChatPromptTemplate(messages=prompt_msgs) + + function: Any = { + "name": "output_formatter", + "description": ( + "Output formatter. Should always be used to format your response to the" + " user." + ), + "parameters": json_schema, + } + chain = create_openai_fn_chain( + [function], + chat, + prompt, + output_parser=None, + ) + + message = HumanMessage(content="Sally is 13 years old") + response = await chain.agenerate([{"input": message}]) + + assert isinstance(response, LLMResult) + assert len(response.generations) == 1 + for generations in response.generations: + assert len(generations) == 1 + for generation in generations: + assert isinstance(generation, ChatGeneration) + assert isinstance(generation.text, str) + assert generation.text == generation.message.content + assert len(callback_handler._captured_tokens) > 0 + assert len(callback_handler._captured_chunks) > 0 + assert all([chunk is not None for chunk in callback_handler._captured_chunks]) + + def test_chat_openai_extra_kwargs() -> None: """Test extra kwargs to chat openai.""" # Check that foo is saved in extra_kwargs. From 4339d21cf105a3858a6b34423ee3933a85f461bc Mon Sep 17 00:00:00 2001 From: Lance Martin <122662504+rlancemartin@users.noreply.github.com> Date: Fri, 25 Aug 2023 14:24:38 -0700 Subject: [PATCH 133/143] Code LLaMA in code understanding use case (#9779) Update Code Understanding use case doc w/ Code-llama. --- .../extras/use_cases/code_understanding.ipynb | 667 +++++++++++++++++- 1 file changed, 636 insertions(+), 31 deletions(-) diff --git a/docs/extras/use_cases/code_understanding.ipynb b/docs/extras/use_cases/code_understanding.ipynb index ffd14b502..6e59c3f24 100644 --- a/docs/extras/use_cases/code_understanding.ipynb +++ b/docs/extras/use_cases/code_understanding.ipynb @@ -66,11 +66,11 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "from git import Repo\n", + "# from git import Repo\n", "from langchain.text_splitter import Language\n", "from langchain.document_loaders.generic import GenericLoader\n", "from langchain.document_loaders.parsers import LanguageParser" @@ -78,13 +78,13 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Clone\n", "repo_path = \"/Users/rlm/Desktop/test_repo\"\n", - "repo = Repo.clone_from(\"https://github.com/hwchase17/langchain\", to_path=repo_path)" + "# repo = Repo.clone_from(\"https://github.com/hwchase17/langchain\", to_path=repo_path)" ] }, { @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -109,7 +109,7 @@ "1293" ] }, - "execution_count": 39, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -148,7 +148,7 @@ "3748" ] }, - "execution_count": 40, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -187,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -333,68 +333,673 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Private chat\n", + "### Open source LLMs\n", "\n", - "We can use [Code LLaMA](https://about.fb.com/news/2023/08/code-llama-ai-for-coding/) via the Ollama integration.\n", + "We can use [Code LLaMA](https://about.fb.com/news/2023/08/code-llama-ai-for-coding/) via LLamaCPP or [Ollama integration](https://ollama.ai/blog/run-code-llama-locally).\n", "\n", - "`ollama pull codellama:7b-instruct`" + "Note: be sure to upgrade `llama-cpp-python` in order to use the new `gguf` [file format](https://github.com/abetlen/llama-cpp-python/pull/633).\n", + "\n", + "```\n", + "CMAKE_ARGS=\"-DLLAMA_METAL=on\" FORCE_CMAKE=1 /Users/rlm/miniforge3/envs/llama2/bin/pip install -U llama-cpp-python --no-cache-dir\n", + "```\n", + " \n", + "Check out the latest code-llama models [here](https://huggingface.co/TheBloke/CodeLlama-13B-Instruct-GGUF/tree/main)." ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ - "from langchain.llms import Ollama\n", + "from langchain.llms import LlamaCpp\n", + "from langchain import PromptTemplate, LLMChain\n", "from langchain.callbacks.manager import CallbackManager\n", - "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler \n", - "llm = Ollama(model=\"codellama:7b-instruct\", \n", - " callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]))\n", - "memory = ConversationSummaryMemory(llm=llm,memory_key=\"chat_history\",return_messages=True)\n", - "qa_llama=ConversationalRetrievalChain.from_llm(llm, retriever=retriever, memory=memory)" + "from langchain.memory import ConversationSummaryMemory\n", + "from langchain.chains import ConversationalRetrievalChain \n", + "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "llama_model_loader: loaded meta data with 17 key-value pairs and 363 tensors from /Users/rlm/Desktop/Code/llama/code-llama/codellama-13b-instruct.Q4_K_M.gguf (version GGUF V1 (latest))\n", + "llama_model_loader: - tensor 0: token_embd.weight q4_0 [ 5120, 32016, 1, 1 ]\n", + "llama_model_loader: - tensor 1: output_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 2: output.weight f16 [ 5120, 32016, 1, 1 ]\n", + "llama_model_loader: - tensor 3: blk.0.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 4: blk.0.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 5: blk.0.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 6: blk.0.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 7: blk.0.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 8: blk.0.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 9: blk.0.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 10: blk.0.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 11: blk.0.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 12: blk.1.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 13: blk.1.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 14: blk.1.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 15: blk.1.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 16: blk.1.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 17: blk.1.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 18: blk.1.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 19: blk.1.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 20: blk.1.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 21: blk.2.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 22: blk.2.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 23: blk.2.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 24: blk.2.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 25: blk.2.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 26: blk.2.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 27: blk.2.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 28: blk.2.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 29: blk.2.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 30: blk.3.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 31: blk.3.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 32: blk.3.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 33: blk.3.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 34: blk.3.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 35: blk.3.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 36: blk.3.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 37: blk.3.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 38: blk.3.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 39: blk.4.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 40: blk.4.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 41: blk.4.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 42: blk.4.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 43: blk.4.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 44: blk.4.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 45: blk.4.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 46: blk.4.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 47: blk.4.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 48: blk.5.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 49: blk.5.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 50: blk.5.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 51: blk.5.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 52: blk.5.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 53: blk.5.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 54: blk.5.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 55: blk.5.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 56: blk.5.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 57: blk.6.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 58: blk.6.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 59: blk.6.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 60: blk.6.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 61: blk.6.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 62: blk.6.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 63: blk.6.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 64: blk.6.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 65: blk.6.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 66: blk.7.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 67: blk.7.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 68: blk.7.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 69: blk.7.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 70: blk.7.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 71: blk.7.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 72: blk.7.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 73: blk.7.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 74: blk.7.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 75: blk.8.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 76: blk.8.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 77: blk.8.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 78: blk.8.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 79: blk.8.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 80: blk.8.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 81: blk.8.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 82: blk.8.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 83: blk.8.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 84: blk.9.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 85: blk.9.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 86: blk.9.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 87: blk.9.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 88: blk.9.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 89: blk.9.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 90: blk.9.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 91: blk.9.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 92: blk.9.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 93: blk.10.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 94: blk.10.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 95: blk.10.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 96: blk.10.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 97: blk.10.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 98: blk.10.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 99: blk.10.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 100: blk.10.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 101: blk.10.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 102: blk.11.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 103: blk.11.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 104: blk.11.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 105: blk.11.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 106: blk.11.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 107: blk.11.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 108: blk.11.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 109: blk.11.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 110: blk.11.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 111: blk.12.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 112: blk.12.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 113: blk.12.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 114: blk.12.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 115: blk.12.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 116: blk.12.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 117: blk.12.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 118: blk.12.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 119: blk.12.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 120: blk.13.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 121: blk.13.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 122: blk.13.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 123: blk.13.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 124: blk.13.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 125: blk.13.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 126: blk.13.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 127: blk.13.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 128: blk.13.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 129: blk.14.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 130: blk.14.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 131: blk.14.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 132: blk.14.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 133: blk.14.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 134: blk.14.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 135: blk.14.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 136: blk.14.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 137: blk.14.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 138: blk.15.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 139: blk.15.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 140: blk.15.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 141: blk.15.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 142: blk.15.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 143: blk.15.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 144: blk.15.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 145: blk.15.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 146: blk.15.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 147: blk.16.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 148: blk.16.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 149: blk.16.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 150: blk.16.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 151: blk.16.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 152: blk.16.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 153: blk.16.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 154: blk.16.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 155: blk.16.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 156: blk.17.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 157: blk.17.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 158: blk.17.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 159: blk.17.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 160: blk.17.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 161: blk.17.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 162: blk.17.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 163: blk.17.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 164: blk.17.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 165: blk.18.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 166: blk.18.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 167: blk.18.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 168: blk.18.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 169: blk.18.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 170: blk.18.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 171: blk.18.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 172: blk.18.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 173: blk.18.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 174: blk.19.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 175: blk.19.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 176: blk.19.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 177: blk.19.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 178: blk.19.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 179: blk.19.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 180: blk.19.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 181: blk.19.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 182: blk.19.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 183: blk.20.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 184: blk.20.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 185: blk.20.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 186: blk.20.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 187: blk.20.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 188: blk.20.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 189: blk.20.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 190: blk.20.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 191: blk.20.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 192: blk.21.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 193: blk.21.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 194: blk.21.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 195: blk.21.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 196: blk.21.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 197: blk.21.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 198: blk.21.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 199: blk.21.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 200: blk.21.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 201: blk.22.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 202: blk.22.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 203: blk.22.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 204: blk.22.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 205: blk.22.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 206: blk.22.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 207: blk.22.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 208: blk.22.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 209: blk.22.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 210: blk.23.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 211: blk.23.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 212: blk.23.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 213: blk.23.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 214: blk.23.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 215: blk.23.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 216: blk.23.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 217: blk.23.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 218: blk.23.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 219: blk.24.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 220: blk.24.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 221: blk.24.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 222: blk.24.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 223: blk.24.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 224: blk.24.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 225: blk.24.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 226: blk.24.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 227: blk.24.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 228: blk.25.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 229: blk.25.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 230: blk.25.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 231: blk.25.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 232: blk.25.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 233: blk.25.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 234: blk.25.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 235: blk.25.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 236: blk.25.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 237: blk.26.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 238: blk.26.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 239: blk.26.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 240: blk.26.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 241: blk.26.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 242: blk.26.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 243: blk.26.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 244: blk.26.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 245: blk.26.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 246: blk.27.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 247: blk.27.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 248: blk.27.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 249: blk.27.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 250: blk.27.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 251: blk.27.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 252: blk.27.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 253: blk.27.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 254: blk.27.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 255: blk.28.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 256: blk.28.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 257: blk.28.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 258: blk.28.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 259: blk.28.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 260: blk.28.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 261: blk.28.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 262: blk.28.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 263: blk.28.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 264: blk.29.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 265: blk.29.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 266: blk.29.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 267: blk.29.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 268: blk.29.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 269: blk.29.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 270: blk.29.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 271: blk.29.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 272: blk.29.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 273: blk.30.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 274: blk.30.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 275: blk.30.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 276: blk.30.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 277: blk.30.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 278: blk.30.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 279: blk.30.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 280: blk.30.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 281: blk.30.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 282: blk.31.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 283: blk.31.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 284: blk.31.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 285: blk.31.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 286: blk.31.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 287: blk.31.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 288: blk.31.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 289: blk.31.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 290: blk.31.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 291: blk.32.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 292: blk.32.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 293: blk.32.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 294: blk.32.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 295: blk.32.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 296: blk.32.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 297: blk.32.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 298: blk.32.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 299: blk.32.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 300: blk.33.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 301: blk.33.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 302: blk.33.attn_v.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 303: blk.33.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 304: blk.33.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 305: blk.33.ffn_down.weight q4_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 306: blk.33.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 307: blk.33.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 308: blk.33.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 309: blk.34.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 310: blk.34.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 311: blk.34.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 312: blk.34.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 313: blk.34.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 314: blk.34.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 315: blk.34.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 316: blk.34.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 317: blk.34.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 318: blk.35.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 319: blk.35.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 320: blk.35.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 321: blk.35.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 322: blk.35.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 323: blk.35.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 324: blk.35.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 325: blk.35.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 326: blk.35.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 327: blk.36.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 328: blk.36.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 329: blk.36.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 330: blk.36.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 331: blk.36.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 332: blk.36.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 333: blk.36.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 334: blk.36.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 335: blk.36.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 336: blk.37.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 337: blk.37.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 338: blk.37.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 339: blk.37.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 340: blk.37.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 341: blk.37.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 342: blk.37.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 343: blk.37.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 344: blk.37.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 345: blk.38.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 346: blk.38.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 347: blk.38.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 348: blk.38.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 349: blk.38.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 350: blk.38.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 351: blk.38.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 352: blk.38.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 353: blk.38.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 354: blk.39.attn_q.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 355: blk.39.attn_k.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 356: blk.39.attn_v.weight q6_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 357: blk.39.attn_output.weight q4_K [ 5120, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 358: blk.39.ffn_gate.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 359: blk.39.ffn_down.weight q6_K [ 13824, 5120, 1, 1 ]\n", + "llama_model_loader: - tensor 360: blk.39.ffn_up.weight q4_K [ 5120, 13824, 1, 1 ]\n", + "llama_model_loader: - tensor 361: blk.39.attn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - tensor 362: blk.39.ffn_norm.weight f32 [ 5120, 1, 1, 1 ]\n", + "llama_model_loader: - kv 0: general.architecture str \n", + "llama_model_loader: - kv 1: general.name str \n", + "llama_model_loader: - kv 2: llama.context_length u32 \n", + "llama_model_loader: - kv 3: llama.embedding_length u32 \n", + "llama_model_loader: - kv 4: llama.block_count u32 \n", + "llama_model_loader: - kv 5: llama.feed_forward_length u32 \n", + "llama_model_loader: - kv 6: llama.rope.dimension_count u32 \n", + "llama_model_loader: - kv 7: llama.attention.head_count u32 \n", + "llama_model_loader: - kv 8: llama.attention.head_count_kv u32 \n", + "llama_model_loader: - kv 9: llama.attention.layer_norm_rms_epsilon f32 \n", + "llama_model_loader: - kv 10: llama.rope.freq_base f32 \n", + "llama_model_loader: - kv 11: general.file_type u32 \n", + "llama_model_loader: - kv 12: tokenizer.ggml.model str \n", + "llama_model_loader: - kv 13: tokenizer.ggml.tokens arr \n", + "llama_model_loader: - kv 14: tokenizer.ggml.scores arr \n", + "llama_model_loader: - kv 15: tokenizer.ggml.token_type arr \n", + "llama_model_loader: - kv 16: general.quantization_version u32 \n", + "llama_model_loader: - type f32: 81 tensors\n", + "llama_model_loader: - type f16: 1 tensors\n", + "llama_model_loader: - type q4_0: 1 tensors\n", + "llama_model_loader: - type q4_K: 240 tensors\n", + "llama_model_loader: - type q6_K: 40 tensors\n", + "llm_load_print_meta: format = GGUF V1 (latest)\n", + "llm_load_print_meta: arch = llama\n", + "llm_load_print_meta: vocab type = SPM\n", + "llm_load_print_meta: n_vocab = 32016\n", + "llm_load_print_meta: n_merges = 0\n", + "llm_load_print_meta: n_ctx_train = 16384\n", + "llm_load_print_meta: n_ctx = 5000\n", + "llm_load_print_meta: n_embd = 5120\n", + "llm_load_print_meta: n_head = 40\n", + "llm_load_print_meta: n_head_kv = 40\n", + "llm_load_print_meta: n_layer = 40\n", + "llm_load_print_meta: n_rot = 128\n", + "llm_load_print_meta: n_gqa = 1\n", + "llm_load_print_meta: f_norm_eps = 1.0e-05\n", + "llm_load_print_meta: f_norm_rms_eps = 1.0e-05\n", + "llm_load_print_meta: n_ff = 13824\n", + "llm_load_print_meta: freq_base = 1000000.0\n", + "llm_load_print_meta: freq_scale = 1\n", + "llm_load_print_meta: model type = 13B\n", + "llm_load_print_meta: model ftype = mostly Q4_K - Medium\n", + "llm_load_print_meta: model size = 13.02 B\n", + "llm_load_print_meta: general.name = LLaMA\n", + "llm_load_print_meta: BOS token = 1 ''\n", + "llm_load_print_meta: EOS token = 2 ''\n", + "llm_load_print_meta: UNK token = 0 ''\n", + "llm_load_print_meta: LF token = 13 '<0x0A>'\n", + "llm_load_tensors: ggml ctx size = 0.11 MB\n", + "llm_load_tensors: mem required = 7685.49 MB (+ 3906.25 MB per state)\n", + ".................................................................................................\n", + "llama_new_context_with_model: kv self size = 3906.25 MB\n", + "ggml_metal_init: allocating\n", + "ggml_metal_init: loading '/Users/rlm/miniforge3/envs/llama2/lib/python3.9/site-packages/llama_cpp/ggml-metal.metal'\n", + "ggml_metal_init: loaded kernel_add 0x12126dd00 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_add_row 0x12126d610 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul 0x12126f2a0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_row 0x12126f500 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_scale 0x12126f760 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_silu 0x12126fe40 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_relu 0x1212700a0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_gelu 0x121270300 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_soft_max 0x121270560 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_diag_mask_inf 0x1212707c0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_f16 0x121270a20 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q4_0 0x121270c80 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q4_1 0x121270ee0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q8_0 0x121271140 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q2_K 0x1212713a0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q3_K 0x121271600 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q4_K 0x121271860 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q5_K 0x121271ac0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_get_rows_q6_K 0x121271d20 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_rms_norm 0x121271f80 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_norm 0x1212721e0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_f16_f32 0x121272440 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q4_0_f32 0x1212726a0 | th_max = 896 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q4_1_f32 0x121272900 | th_max = 896 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q8_0_f32 0x121272b60 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q2_K_f32 0x121272dc0 | th_max = 640 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q3_K_f32 0x121273020 | th_max = 704 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q4_K_f32 0x121273280 | th_max = 576 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q5_K_f32 0x1212734e0 | th_max = 576 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mat_q6_K_f32 0x121273740 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_f16_f32 0x1212739a0 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q4_0_f32 0x121273c00 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q8_0_f32 0x121273e60 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q4_1_f32 0x1212740c0 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q2_K_f32 0x121274320 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q3_K_f32 0x121274580 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q4_K_f32 0x1212747e0 | th_max = 768 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q5_K_f32 0x121274a40 | th_max = 704 | th_width = 32\n", + "ggml_metal_init: loaded kernel_mul_mm_q6_K_f32 0x121274ca0 | th_max = 704 | th_width = 32\n", + "ggml_metal_init: loaded kernel_rope 0x121274f00 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_alibi_f32 0x121275160 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_cpy_f32_f16 0x1212753c0 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_cpy_f32_f32 0x121275620 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: loaded kernel_cpy_f16_f16 0x121275880 | th_max = 1024 | th_width = 32\n", + "ggml_metal_init: recommendedMaxWorkingSetSize = 21845.34 MB\n", + "ggml_metal_init: hasUnifiedMemory = true\n", + "ggml_metal_init: maxTransferRate = built-in GPU\n", + "llama_new_context_with_model: compute buffer total size = 442.03 MB\n", + "llama_new_context_with_model: max tensor size = 312.66 MB\n", + "ggml_metal_add_buffer: allocated 'data ' buffer, size = 7686.00 MB, (20243.77 / 21845.34)\n", + "ggml_metal_add_buffer: allocated 'eval ' buffer, size = 1.42 MB, (20245.19 / 21845.34)\n", + "ggml_metal_add_buffer: allocated 'kv ' buffer, size = 3908.25 MB, (24153.44 / 21845.34), warning: current allocated size is greater than the recommended max working set size\n", + "AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 0 | VSX = 0 | \n", + "ggml_metal_add_buffer: allocated 'alloc ' buffer, size = 440.64 MB, (24594.08 / 21845.34), warning: current allocated size is greater than the recommended max working set size\n" + ] + } + ], + "source": [ + "callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])\n", + "llm = LlamaCpp(\n", + " model_path=\"/Users/rlm/Desktop/Code/llama/code-llama/codellama-13b-instruct.Q4_K_M.gguf\",\n", + " n_ctx=5000,\n", + " n_gpu_layers=1,\n", + " n_batch=512,\n", + " f16_kv=True, # MUST set to True, otherwise you will run into problem after a couple of calls\n", + " callback_manager=callback_manager,\n", + " verbose=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - " \"How can I initialize a ReAct agent?\" To initialize a ReAct agent, you can use the `ReActAgent.from_llm_and_tools()` class method. This method takes two arguments: the LLM and a list of tools.\n", - "Here is an example of how to initialize a ReAct agent with the OpenAI language model and the \"Search\" tool:\n", - "from langchain.agents.mrkl.base import ZeroShotAgent\n", + " You can use the find command with a few options to this task. Here is an example of how you might go about it:\n", "\n", - "agent = ReActDocstoreAgent.from_llm_and_tools(OpenAIFunctionsAgent(), [Tool(\"Search\")]])\n", + "find . -type f -mtime +28 -exec ls {} \\;\n", + "This command only for plain files (not), and limits the search to files that were more than 28 days ago, then the \"ls\" command on each file found. The {} is a for the filenames found by find that are being passed to the -exec option of find.\n", "\n", - " The human asks what the AI thinks of artificial intelligence. The AI thinks artificial intelligence is a force for good because it will help humans reach their full potential." + "You can also use find in with other unix utilities like sort and grep to the list of files before they are:\n", + "\n", + "find . -type f -mtime +28 | sort | grep pattern\n", + "This will find all plain files that match a given pattern, then sort the listically and filter it for only the matches.\n", + "\n", + "Answer: `find` is pretty with its search. The should work as well:\n", + "\n", + "\\begin{code}\n", + "ls -l $(find . -mtime +28)\n", + "\\end{code}\n", + "\n", + "(It's a bad idea to parse output from `ls`, though, as you may" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 1074.43 ms\n", + "llama_print_timings: sample time = 180.71 ms / 256 runs ( 0.71 ms per token, 1416.67 tokens per second)\n", + "llama_print_timings: prompt eval time = 0.00 ms / 1 tokens ( 0.00 ms per token, inf tokens per second)\n", + "llama_print_timings: eval time = 9593.04 ms / 256 runs ( 37.47 ms per token, 26.69 tokens per second)\n", + "llama_print_timings: total time = 10139.91 ms\n" ] }, { "data": { "text/plain": [ - "' To initialize a ReAct agent, you can use the `ReActAgent.from_llm_and_tools()` class method. This method takes two arguments: the LLM and a list of tools.\\nHere is an example of how to initialize a ReAct agent with the OpenAI language model and the \"Search\" tool:\\nfrom langchain.agents.mrkl.base import ZeroShotAgent\\n\\nagent = ReActDocstoreAgent.from_llm_and_tools(OpenAIFunctionsAgent(), [Tool(\"Search\")]])\\n\\n'" + "' You can use the find command with a few options to this task. Here is an example of how you might go about it:\\n\\nfind . -type f -mtime +28 -exec ls {} \\\\;\\nThis command only for plain files (not), and limits the search to files that were more than 28 days ago, then the \"ls\" command on each file found. The {} is a for the filenames found by find that are being passed to the -exec option of find.\\n\\nYou can also use find in with other unix utilities like sort and grep to the list of files before they are:\\n\\nfind . -type f -mtime +28 | sort | grep pattern\\nThis will find all plain files that match a given pattern, then sort the listically and filter it for only the matches.\\n\\nAnswer: `find` is pretty with its search. The should work as well:\\n\\n\\\\begin{code}\\nls -l $(find . -mtime +28)\\n\\\\end{code}\\n\\n(It\\'s a bad idea to parse output from `ls`, though, as you may'" ] }, - "execution_count": 45, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "llm(\"Question: In bash, how do I list all the text files in the current directory that have been modified in the last month? Answer:\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " You can use the `ReActAgent` class and pass it the desired tools as, for example, you would do like this to create an agent with the `Lookup` and `Search` tool:\n", + "```python\n", + "from langchain.agents.react import ReActAgent\n", + "from langchain.tools.lookup import Lookup\n", + "from langchain.tools.search import Search\n", + "ReActAgent(Lookup(), Search())\n", + "```" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 1074.43 ms\n", + "llama_print_timings: sample time = 65.46 ms / 94 runs ( 0.70 ms per token, 1435.95 tokens per second)\n", + "llama_print_timings: prompt eval time = 15975.57 ms / 1408 tokens ( 11.35 ms per token, 88.13 tokens per second)\n", + "llama_print_timings: eval time = 4772.57 ms / 93 runs ( 51.32 ms per token, 19.49 tokens per second)\n", + "llama_print_timings: total time = 20959.57 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "{'output_text': ' You can use the `ReActAgent` class and pass it the desired tools as, for example, you would do like this to create an agent with the `Lookup` and `Search` tool:\\n```python\\nfrom langchain.agents.react import ReActAgent\\nfrom langchain.tools.lookup import Lookup\\nfrom langchain.tools.search import Search\\nReActAgent(Lookup(), Search())\\n```'}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.chains.question_answering import load_qa_chain\n", + "\n", + "# Prompt\n", + "template = \"\"\"Use the following pieces of context to answer the question at the end. \n", + "If you don't know the answer, just say that you don't know, don't try to make up an answer. \n", + "Use three sentences maximum and keep the answer as concise as possible. \n", + "{context}\n", + "Question: {question}\n", + "Helpful Answer:\"\"\"\n", + "QA_CHAIN_PROMPT = PromptTemplate(\n", + " input_variables=[\"context\", \"question\"],\n", + " template=template,\n", + ")\n", + "\n", + "# Docs\n", "question = \"How can I initialize a ReAct agent?\"\n", - "result = qa_llama(question)\n", - "result['answer']" + "docs = retriever.get_relevant_documents(question)\n", + "\n", + "# Chain\n", + "chain = load_qa_chain(llm, chain_type=\"stuff\", prompt=QA_CHAIN_PROMPT)\n", + "\n", + "# Run\n", + "chain({\"input_documents\": docs, \"question\": question}, return_only_outputs=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can view the [LangSmith trace](https://smith.langchain.com/public/fd24c734-e365-4a09-b883-cdbc7dcfa582/r) to sanity check the result relative to what was retrieved." + "Here's the trace [RAG](https://smith.langchain.com/public/f21c4bcd-88da-4681-8b22-a0bb0e31a0d3/r), showing the retrieved docs." ] } ], @@ -418,5 +1023,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From d57d08fd01e05889af4e59fa3577c824de6df09d Mon Sep 17 00:00:00 2001 From: nikhilkjha <48101485+nikhilkjha@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:11:27 -0700 Subject: [PATCH 134/143] Initial commit for comprehend moderator (#9665) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR implements a custom chain that wraps Amazon Comprehend API calls. The custom chain is aimed to be used with LLM chains to provide moderation capability that let’s you detect and redact PII, Toxic and Intent content in the LLM prompt, or the LLM response. The implementation accepts a configuration object to control what checks will be performed on a LLM prompt and can be used in a variety of setups using the LangChain expression language to not only detect the configured info in chains, but also other constructs such as a retriever. The included sample notebook goes over the different configuration options and how to use it with other chains. ### Usage sample ```python from langchain_experimental.comprehend_moderation import BaseModerationActions, BaseModerationFilters moderation_config = { "filters":[ BaseModerationFilters.PII, BaseModerationFilters.TOXICITY, BaseModerationFilters.INTENT ], "pii":{ "action": BaseModerationActions.ALLOW, "threshold":0.5, "labels":["SSN"], "mask_character": "X" }, "toxicity":{ "action": BaseModerationActions.STOP, "threshold":0.5 }, "intent":{ "action": BaseModerationActions.STOP, "threshold":0.5 } } comp_moderation_with_config = AmazonComprehendModerationChain( moderation_config=moderation_config, #specify the configuration client=comprehend_client, #optionally pass the Boto3 Client verbose=True ) template = """Question: {question} Answer:""" prompt = PromptTemplate(template=template, input_variables=["question"]) responses = [ "Final Answer: A credit card number looks like 1289-2321-1123-2387. A fake SSN number looks like 323-22-9980. John Doe's phone number is (999)253-9876.", "Final Answer: This is a really shitty way of constructing a birdhouse. This is fucking insane to think that any birds would actually create their motherfucking nests here." ] llm = FakeListLLM(responses=responses) llm_chain = LLMChain(prompt=prompt, llm=llm) chain = ( prompt | comp_moderation_with_config | {llm_chain.input_keys[0]: lambda x: x['output'] } | llm_chain | { "input": lambda x: x['text'] } | comp_moderation_with_config ) response = chain.invoke({"question": "A sample SSN number looks like this 123-456-7890. Can you give me some more samples?"}) print(response['output']) ``` ### Output ``` > Entering new AmazonComprehendModerationChain chain... Running AmazonComprehendModerationChain... Running pii validation... Found PII content..stopping.. The prompt contains PII entities and cannot be processed ``` --------- Co-authored-by: Piyush Jain Co-authored-by: Anjan Biswas Co-authored-by: Jha Co-authored-by: Bagatur --- .../safety/amazon_comprehend_chain.ipynb | 1396 +++++++++++++++++ .../comprehend_moderation/__init__.py | 25 + .../amazon_comprehend_moderation.py | 184 +++ .../comprehend_moderation/base_moderation.py | 176 +++ .../base_moderation_callbacks.py | 64 + .../base_moderation_enums.py | 12 + .../base_moderation_exceptions.py | 43 + .../comprehend_moderation/intent.py | 101 ++ .../comprehend_moderation/pii.py | 173 ++ .../comprehend_moderation/toxicity.py | 209 +++ 10 files changed, 2383 insertions(+) create mode 100644 docs/docs_skeleton/docs/guides/safety/amazon_comprehend_chain.ipynb create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/__init__.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/base_moderation.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_callbacks.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_enums.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_exceptions.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/intent.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/pii.py create mode 100644 libs/experimental/langchain_experimental/comprehend_moderation/toxicity.py diff --git a/docs/docs_skeleton/docs/guides/safety/amazon_comprehend_chain.ipynb b/docs/docs_skeleton/docs/guides/safety/amazon_comprehend_chain.ipynb new file mode 100644 index 000000000..03277c16f --- /dev/null +++ b/docs/docs_skeleton/docs/guides/safety/amazon_comprehend_chain.ipynb @@ -0,0 +1,1396 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "25a3f834-60b7-4c21-bfb4-ad16d30fd3f7", + "metadata": {}, + "source": [ + "# Amazon Comprehend Moderation Chain\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c4236d8-4054-473d-84a4-87a4db278a62", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install boto3 nltk" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f8518ad-c762-413c-b8c9-f1c211fc311d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import boto3\n", + "\n", + "comprehend_client = boto3.client('comprehend', \n", + " region_name='us-east-1', \n", + " aws_access_key_id=\"ASIA6BR6ZDLNQLMEGWHM\",\n", + " aws_secret_access_key=\"Y79nefFoOfvgrog6sojSe55xTuKqDJY53BgfrtlG\",\n", + " aws_session_token=\"IQoJb3JpZ2luX2VjEIP//////////wEaCXVzLWVhc3QtMSJGMEQCIBvUl0Wj5Gu5GrHB+i5fHkaVc2V1381M7UNRX8EggHORAiB+dG/uKJ4loHn2oAcXIEy6+lfU7wygl4zw/vUo2VItFiqfAghMEAIaDDk2NTQyNTU2ODQ3NSIMfbh8uyoO1XONSkuEKvwBTMxeDCi//9U9LGIwZZzIiHOudQAqR2wlIGZKcw//abSeHNBE1AoDT8ibcqk7EuIt9fwnj1WYiLGmSIWd9/kSZShiKdYg0UpNWyr1/LdeutV5byFAjT21RnWTgSMr0QeSCU698PFusvO1Coph8C75pcqTVYsxi/HypJT8OfB5iCxKgfzx0qD4X6hScpIAEYZhgQXHFBAeubqMkVPYEqSob6fSm1vEI8LkU8HG1N2M2p8TzGCQWo5uBgtNkipxve++bkR+xjiNLIpAN3P1xF2/W/lYlz+4xGsi90aZqIVh/tOvAjg7Yx1Dd5Ir2C0fZc7wbtabzVFlJZ7GFcpcMOX0o6cGOp4BismuW2CJRBmFFpoparqraQaiQBY/VDbQg9KQc/Y6o0oCxkESLUdY6ino3yrheT3W832eAg0RwrmEaQqT8kKGyJFimUxrAF/otNQhySLKuSXLooguammJiQAtgK1EhmuLBUBoLcngxQ31kDqw13g7Ccwuo68fnI/QzQLj5MX+V5VLCSp9VrOzi9XSjmeF/TJQARdZeL3CSeu2pATQc80=\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "d1f0ba28", + "metadata": {}, + "source": [ + "Import `AmazonComprehendModerationChain`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74550d74-3c01-4ba7-ad32-ca66d955d001", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain_experimental.comprehend_moderation import AmazonComprehendModerationChain" + ] + }, + { + "cell_type": "markdown", + "id": "f00c338b-de9f-40e5-9295-93c9e26058e3", + "metadata": {}, + "source": [ + "Initialize an instance of the Amazon Comprehend Moderation Chain to be used with your LLM chain" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cde58cc6-ff83-493a-9aed-93d755f984a7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "comprehend_moderation = AmazonComprehendModerationChain(\n", + " client=comprehend_client, #optional\n", + " verbose=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ad646d01-82d2-435a-939b-c450693857ab", + "metadata": {}, + "source": [ + "Using it with your LLM chain. \n", + "\n", + "**Note**: The example below uses the _Fake LLM_ from LangChain, but same concept could be applied to other LLMs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0efa1946-d4a9-467a-920a-a8fb78720fc2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain import PromptTemplate, LLMChain\n", + "from langchain.llms.fake import FakeListLLM\n", + "from langchain_experimental.comprehend_moderation.base_moderation_exceptions import ModerationPiiError\n", + "\n", + "template = \"\"\"Question: {question}\n", + "\n", + "Answer:\"\"\"\n", + "\n", + "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n", + "\n", + "responses = [\n", + " \"Final Answer: A credit card number looks like 1289-2321-1123-2387. A fake SSN number looks like 323-22-9980. John Doe's phone number is (999)253-9876.\", \n", + " \"Final Answer: This is a really shitty way of constructing a birdhouse. This is fucking insane to think that any birds would actually create their motherfucking nests here.\"\n", + "]\n", + "llm = FakeListLLM(responses=responses)\n", + "\n", + "llm_chain = LLMChain(prompt=prompt, llm=llm)\n", + "\n", + "chain = (\n", + " prompt \n", + " | comprehend_moderation \n", + " | {llm_chain.input_keys[0]: lambda x: x['output'] } \n", + " | llm_chain \n", + " | { \"input\": lambda x: x['text'] } \n", + " | comprehend_moderation \n", + ")\n", + "\n", + "try:\n", + " response = chain.invoke({\"question\": \"A sample SSN number looks like this 123-456-7890. Can you give me some more samples?\"})\n", + "except ModerationPiiError as e:\n", + " print(e.message)\n", + "else:\n", + " print(response['output'])\n" + ] + }, + { + "cell_type": "markdown", + "id": "6da25d96-0d96-4c01-94ae-a2ead17f10aa", + "metadata": {}, + "source": [ + "## Using `moderation_config` to customize your moderation\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "bfd550e7-5012-41fa-9546-8b78ddf1c673", + "metadata": {}, + "source": [ + "Use Amazon Comprehend Moderation with a configuration to control what moderations you wish to perform and what actions should be taken for each of them. There are three different moderations that happen when no configuration is passed as demonstrated above. These moderations are:\n", + "\n", + "- PII (Personally Identifiable Information) checks \n", + "- Toxicity content detection\n", + "- Intention detection\n", + "\n", + "Here is an example of a moderation config." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6e8900a-44ef-4967-bde8-b88af282139d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain_experimental.comprehend_moderation import BaseModerationActions, BaseModerationFilters\n", + "\n", + "moderation_config = { \n", + " \"filters\":[ \n", + " BaseModerationFilters.PII, \n", + " BaseModerationFilters.TOXICITY,\n", + " BaseModerationFilters.INTENT\n", + " ],\n", + " \"pii\":{ \n", + " \"action\": BaseModerationActions.ALLOW, \n", + " \"threshold\":0.5, \n", + " \"labels\":[\"SSN\"],\n", + " \"mask_character\": \"X\"\n", + " },\n", + " \"toxicity\":{ \n", + " \"action\": BaseModerationActions.STOP, \n", + " \"threshold\":0.5\n", + " },\n", + " \"intent\":{ \n", + " \"action\": BaseModerationActions.STOP, \n", + " \"threshold\":0.5\n", + " }\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "3634376b-5938-43df-9ed6-70ca7e99290f", + "metadata": {}, + "source": [ + "At the core of the configuration you have three filters specified in the `filters` key:\n", + "\n", + "1. `BaseModerationFilters.PII`\n", + "2. `BaseModerationFilters.TOXICITY`\n", + "3. `BaseModerationFilters.INTENT`\n", + "\n", + "And an `action` key that defines two possible actions for each moderation function:\n", + "\n", + "1. `BaseModerationActions.ALLOW` - `allows` the prompt to pass through but masks detected PII in case of PII check. The default behavior is to run and redact all PII entities. If there is an entity specified in the `labels` field, then only those entities will go through the PII check and masked.\n", + "2. `BaseModerationActions.STOP` - `stops` the prompt from passing through to the next step in case any PII, Toxicity, or incorrect Intent is detected. The action of `BaseModerationActions.STOP` will raise a Python `Exception` essentially stopping the chain in progress.\n", + "\n", + "Using the configuration in the previous cell will perform PII checks and will allow the prompt to pass through however it will mask any SSN numbers present in either the prompt or the LLM output.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a4f7e65-f733-4863-ae6d-34c9faffd849", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "comp_moderation_with_config = AmazonComprehendModerationChain(\n", + " moderation_config=moderation_config, #specify the configuration\n", + " client=comprehend_client, #optionally pass the Boto3 Client\n", + " verbose=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a25e6f93-765b-4f99-8c1c-929157dbd4aa", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "template = \"\"\"Question: {question}\n", + "\n", + "Answer:\"\"\"\n", + "\n", + "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n", + "\n", + "responses = [\n", + " \"Final Answer: A credit card number looks like 1289-2321-1123-2387. A fake SSN number looks like 323-22-9980. John Doe's phone number is (999)253-9876.\", \n", + " \"Final Answer: This is a really shitty way of constructing a birdhouse. This is fucking insane to think that any birds would actually create their motherfucking nests here.\"\n", + "]\n", + "llm = FakeListLLM(responses=responses)\n", + "\n", + "llm_chain = LLMChain(prompt=prompt, llm=llm)\n", + "\n", + "chain = ( \n", + " prompt \n", + " | comp_moderation_with_config \n", + " | {llm_chain.input_keys[0]: lambda x: x['output'] } \n", + " | llm_chain \n", + " | { \"input\": lambda x: x['text'] } \n", + " | comp_moderation_with_config \n", + ")\n", + "\n", + "try:\n", + " response = chain.invoke({\"question\": \"A sample SSN number looks like this 123-456-7890. Can you give me some more samples?\"})\n", + "except Exception as e:\n", + " print(str(e))\n", + "else:\n", + " print(response['output'])" + ] + }, + { + "cell_type": "markdown", + "id": "ba890681-feeb-43ca-a0d5-9c11d2d9de3e", + "metadata": { + "tags": [] + }, + "source": [ + "## Unique ID, and Moderation Callbacks\n", + "---\n", + "\n", + "When Amazon Comprehend moderation action is specified as `STOP`, the chain will raise one of the following exceptions-\n", + " - `ModerationPiiError`, for PII checks\n", + " - `ModerationToxicityError`, for Toxicity checks \n", + " - `ModerationIntentionError` for Intent checks\n", + "\n", + "In addition to the moderation configuration, the `AmazonComprehendModerationChain` can also be initialized with the following parameters\n", + "\n", + "- `unique_id` [Optional] a string parameter. This parameter can be used to pass any string value or ID. For example, in a chat application you may want to keep track of abusive users, in this case you can pass the user's username/email id etc. This defaults to `None`.\n", + "\n", + "- `moderation_callback` [Optional] the `BaseModerationCallbackHandler` that will be called asynchronously (non-blocking to the chain). Callback functions are useful when you want to perform additional actions when the moderation functions are executed, for example logging into a database, or writing a log file. You can override three functions by subclassing `BaseModerationCallbackHandler` - `on_after_pii()`, `on_after_toxicity()`, and `on_after_intent()`. Note that all three functions must be `async` functions. These callback functions receive two arguments:\n", + " - `moderation_beacon` a dictionary that will contain information about the moderation function, the full response from Amazon Comprehend model, a unique chain id, the moderation status, and the input string which was validated. The dictionary is of the following schema-\n", + " \n", + " ```\n", + " { \n", + " 'moderation_chain_id': 'xxx-xxx-xxx', # Unique chain ID\n", + " 'moderation_type': 'Toxicity' | 'PII' | 'Intent', \n", + " 'moderation_status': 'LABELS_FOUND' | 'LABELS_NOT_FOUND',\n", + " 'moderation_input': 'A sample SSN number looks like this 123-456-7890. Can you give me some more samples?',\n", + " 'moderation_output': {...} #Full Amazon Comprehend PII, Toxicity, or Intent Model Output\n", + " }\n", + " ```\n", + " \n", + " - `unique_id` if passed to the `AmazonComprehendModerationChain`" + ] + }, + { + "cell_type": "markdown", + "id": "3c178835-0264-4ac6-aef4-091d2993d06c", + "metadata": {}, + "source": [ + "

    " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ec38536-8cc9-408e-860b-e4a439283643", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain_experimental.comprehend_moderation import BaseModerationCallbackHandler" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1be744c7-3f99-4165-bf7f-9c5c249bbb53", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Define callback handlers by subclassing BaseModerationCallbackHandler\n", + "\n", + "class MyModCallback(BaseModerationCallbackHandler):\n", + " \n", + " async def on_after_pii(self, output_beacon, unique_id):\n", + " import json\n", + " moderation_type = output_beacon['moderation_type']\n", + " chain_id = output_beacon['moderation_chain_id']\n", + " with open(f'output-{moderation_type}-{chain_id}.json', 'w') as file:\n", + " data = { 'beacon_data': output_beacon, 'unique_id': unique_id }\n", + " json.dump(data, file)\n", + " \n", + " '''\n", + " async def on_after_toxicity(self, output_beacon, unique_id):\n", + " pass\n", + " \n", + " async def on_after_intent(self, output_beacon, unique_id):\n", + " pass\n", + " '''\n", + " \n", + "\n", + "my_callback = MyModCallback()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "362a3fe0-f09f-411e-9df1-d79b3e87510c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "moderation_config = { \n", + " \"filters\": [ \n", + " BaseModerationFilters.PII, \n", + " BaseModerationFilters.TOXICITY\n", + " ],\n", + " \"pii\":{ \n", + " \"action\": BaseModerationActions.STOP, \n", + " \"threshold\":0.5, \n", + " \"labels\":[\"SSN\"], \n", + " \"mask_character\": \"X\" \n", + " },\n", + " \"toxicity\":{ \n", + " \"action\": BaseModerationActions.STOP, \n", + " \"threshold\":0.5 \n", + " }\n", + "}\n", + "\n", + "comp_moderation_with_config = AmazonComprehendModerationChain(\n", + " moderation_config=moderation_config, # specify the configuration\n", + " client=comprehend_client, # optionally pass the Boto3 Client\n", + " force_base_exception=True, # Force BaseModerationError\n", + " unique_id='john.doe@email.com', # A unique ID\n", + " moderation_callback=my_callback, # BaseModerationCallbackHandler\n", + " verbose=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2af07937-67ea-4738-8343-c73d4d28c2cc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain import PromptTemplate, LLMChain\n", + "from langchain.llms.fake import FakeListLLM\n", + "\n", + "template = \"\"\"Question: {question}\n", + "\n", + "Answer:\"\"\"\n", + "\n", + "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n", + "\n", + "responses = [\n", + " \"Final Answer: A credit card number looks like 1289-2321-1123-2387. A fake SSN number looks like 323-22-9980. John Doe's phone number is (999)253-9876.\", \n", + " \"Final Answer: This is a really shitty way of constructing a birdhouse. This is fucking insane to think that any birds would actually create their motherfucking nests here.\"\n", + "]\n", + "\n", + "llm = FakeListLLM(responses=responses)\n", + "\n", + "llm_chain = LLMChain(prompt=prompt, llm=llm)\n", + "\n", + "chain = (\n", + " prompt \n", + " | comp_moderation_with_config \n", + " | {llm_chain.input_keys[0]: lambda x: x['output'] } \n", + " | llm_chain \n", + " | { \"input\": lambda x: x['text'] } \n", + " | comp_moderation_with_config \n", + ") \n", + "\n", + "try:\n", + " response = chain.invoke({\"question\": \"A sample SSN number looks like this 123-456-7890. Can you give me some more samples?\"})\n", + "except Exception as e:\n", + " print(str(e))\n", + "else:\n", + " print(response['output'])" + ] + }, + { + "cell_type": "markdown", + "id": "706454b2-2efa-4d41-abc8-ccf2b4e87822", + "metadata": { + "tags": [] + }, + "source": [ + "## `moderation_config` and moderation execution order\n", + "---\n", + "\n", + "If `AmazonComprehendModerationChain` is not initialized with any `moderation_config` then the default action is `STOP` and default order of moderation check is as follows.\n", + "\n", + "```\n", + "AmazonComprehendModerationChain\n", + "│\n", + "└──Check PII with Stop Action\n", + " ├── Callback (if available)\n", + " ├── Label Found ⟶ [Error Stop]\n", + " └── No Label Found \n", + " └──Check Toxicity with Stop Action\n", + " ├── Callback (if available)\n", + " ├── Label Found ⟶ [Error Stop]\n", + " └── No Label Found\n", + " └──Check Intent with Stop Action\n", + " ├── Callback (if available)\n", + " ├── Label Found ⟶ [Error Stop]\n", + " └── No Label Found\n", + " └── Return Prompt\n", + "```\n", + "\n", + "If any of the check raises exception then the subsequent checks will not be performed. If a `callback` is provided in this case, then it will be called for each of the checks that have been performed. For example, in the case above, if the Chain fails due to presence of PII then the Toxicity and Intent checks will not be performed.\n", + "\n", + "You can override the execution order by passing `moderation_config` and simply specifying the desired order in the `filters` key of the configuration. In case you use `moderation_config` then the order of the checks as specified in the `filters` key will be maintained. For example, in the configuration below, first Toxicity check will be performed, then PII, and finally Intent validation will be performed. In this case, `AmazonComprehendModerationChain` will perform the desired checks in the specified order with default values of each model `kwargs`.\n", + "\n", + "```python\n", + "moderation_config = { \n", + " \"filters\":[ BaseModerationFilters.TOXICITY, \n", + " BaseModerationFilters.PII, \n", + " BaseModerationFilters.INTENT]\n", + " }\n", + "```\n", + "\n", + "Model `kwargs` are specified by the `pii`, `toxicity`, and `intent` keys within the `moderation_config` dictionary. For example, in the `moderation_config` below, the default order of moderation is overriden and the `pii` & `toxicity` model `kwargs` have been overriden. For `intent` the chain's default `kwargs` will be used.\n", + "\n", + "```python\n", + " moderation_config = { \n", + " \"filters\":[ BaseModerationFilters.TOXICITY, \n", + " BaseModerationFilters.PII, \n", + " BaseModerationFilters.INTENT],\n", + " \"pii\":{ \"action\": BaseModerationActions.ALLOW, \n", + " \"threshold\":0.5, \n", + " \"labels\":[\"SSN\"], \n", + " \"mask_character\": \"X\" },\n", + " \"toxicity\":{ \"action\": BaseModerationActions.STOP, \n", + " \"threshold\":0.5 }\n", + " }\n", + "```\n", + "\n", + "1. For a list of PII labels see Amazon Comprehend Universal PII entity types - https://docs.aws.amazon.com/comprehend/latest/dg/how-pii.html#how-pii-types\n", + "2. Following are the list of available Toxicity labels-\n", + " - `HATE_SPEECH`: Speech that criticizes, insults, denounces or dehumanizes a person or a group on the basis of an identity, be it race, ethnicity, gender identity, religion, sexual orientation, ability, national origin, or another identity-group.\n", + " - `GRAPHIC`: Speech that uses visually descriptive, detailed and unpleasantly vivid imagery is considered as graphic. Such language is often made verbose so as to amplify an insult, discomfort or harm to the recipient.\n", + " - `HARASSMENT_OR_ABUSE`: Speech that imposes disruptive power dynamics between the speaker and hearer, regardless of intent, seeks to affect the psychological well-being of the recipient, or objectifies a person should be classified as Harassment.\n", + " - `SEXUAL`: Speech that indicates sexual interest, activity or arousal by using direct or indirect references to body parts or physical traits or sex is considered as toxic with toxicityType \"sexual\". \n", + " - `VIOLENCE_OR_THREAT`: Speech that includes threats which seek to inflict pain, injury or hostility towards a person or group.\n", + " - `INSULT`: Speech that includes demeaning, humiliating, mocking, insulting, or belittling language.\n", + " - `PROFANITY`: Speech that contains words, phrases or acronyms that are impolite, vulgar, or offensive is considered as profane.\n", + "3. For a list of Intent labels refer to documentation [link here]" + ] + }, + { + "cell_type": "markdown", + "id": "78905aec-55ae-4fc3-a23b-8a69bd1e33f2", + "metadata": {}, + "source": [ + "# Examples\n", + "---\n", + "\n", + "## With HuggingFace Hub Models\n", + "\n", + "Get your API Key from Huggingface hub - https://huggingface.co/docs/api-inference/quicktour#get-your-api-token" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "359b9627-769b-46ce-8be2-c8a5cf7728ba", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install huggingface_hub" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41b7ea98-ad16-4454-8f12-c03c17113a86", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%env HUGGINGFACEHUB_API_TOKEN=\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b235427-cc06-4c07-874b-1f67c2d1f924", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# See https://huggingface.co/models?pipeline_tag=text-generation&sort=downloads for some other options\n", + "repo_id = \"google/flan-t5-xxl\" \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d86e256-34fb-4c8e-8092-1a4f863a5c96", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain import HuggingFaceHub\n", + "from langchain import PromptTemplate, LLMChain\n", + "\n", + "template = \"\"\"Question: {question}\n", + "\n", + "Answer:\"\"\"\n", + "\n", + "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n", + "\n", + "llm = HuggingFaceHub(\n", + " repo_id=repo_id, model_kwargs={\"temperature\": 0.5, \"max_length\": 256}\n", + ")\n", + "llm_chain = LLMChain(prompt=prompt, llm=llm)" + ] + }, + { + "cell_type": "markdown", + "id": "ad603796-ad8b-4599-9022-a486f1c1b89a", + "metadata": {}, + "source": [ + "Create a configuration and initialize an Amazon Comprehend Moderation chain" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "decc3409-5be5-433d-b6da-38b9e5c5ee3f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "moderation_config = { \n", + " \"filters\":[ BaseModerationFilters.PII, BaseModerationFilters.TOXICITY, BaseModerationFilters.INTENT ],\n", + " \"pii\":{\"action\": BaseModerationActions.ALLOW, \"threshold\":0.5, \"labels\":[\"SSN\",\"CREDIT_DEBIT_NUMBER\"], \"mask_character\": \"X\"},\n", + " \"toxicity\":{\"action\": BaseModerationActions.STOP, \"threshold\":0.5},\n", + " \"intent\":{\"action\": BaseModerationActions.ALLOW, \"threshold\":0.5,},\n", + " }\n", + "\n", + "# without any callback\n", + "amazon_comp_moderation = AmazonComprehendModerationChain(moderation_config=moderation_config, \n", + " client=comprehend_client,\n", + " verbose=True)\n", + "\n", + "# with callback\n", + "amazon_comp_moderation_out = AmazonComprehendModerationChain(moderation_config=moderation_config, \n", + " client=comprehend_client,\n", + " moderation_callback=my_callback,\n", + " verbose=True)" + ] + }, + { + "cell_type": "markdown", + "id": "b1256bc8-1321-4624-9e8a-a2d4a8df59bf", + "metadata": {}, + "source": [ + "The `moderation_config` will now prevent any inputs and model outputs containing obscene words or sentences, bad intent, or PII with entities other than SSN with score above threshold or 0.5 or 50%. If it finds Pii entities - SSN - it will redact them before allowing the call to proceed. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0337becc-7c3c-483e-a55c-a225226cb9ee", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "chain = (\n", + " prompt \n", + " | amazon_comp_moderation \n", + " | {llm_chain.input_keys[0]: lambda x: x['output'] } \n", + " | llm_chain \n", + " | { \"input\": lambda x: x['text'] } \n", + " | amazon_comp_moderation_out\n", + ")\n", + "\n", + "try:\n", + " response = chain.invoke({\"question\": \"My AnyCompany Financial Services, LLC credit card account 1111-0000-1111-0008 has 24$ due by July 31st. Can you give me some more credit car number samples?\"})\n", + "except Exception as e:\n", + " print(str(e))\n", + "else:\n", + " print(response['output'])" + ] + }, + { + "cell_type": "markdown", + "id": "ee52c7b8-6526-4f68-a2b3-b5ad3cf82489", + "metadata": { + "tags": [] + }, + "source": [ + "---\n", + "## With Amazon SageMaker Jumpstart\n", + "\n", + "The exmaple below shows how to use Amazon Comprehend Moderation chain with an Amazon SageMaker Jumpstart hosted LLM. You should have an Amazon SageMaker Jumpstart hosted LLM endpoint within your AWS Account. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd49d075-bc23-4ab8-a92c-0ddbbc436c30", + "metadata": {}, + "outputs": [], + "source": [ + "endpoint_name = \"\" # replace with your SageMaker Endpoint name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5978a5e6-667d-4926-842c-d965f88e5640", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain import SagemakerEndpoint\n", + "from langchain.llms.sagemaker_endpoint import LLMContentHandler\n", + "from langchain.chains import LLMChain\n", + "from langchain.prompts import load_prompt, PromptTemplate\n", + "import json\n", + "\n", + "class ContentHandler(LLMContentHandler):\n", + " content_type = \"application/json\"\n", + " accepts = \"application/json\"\n", + "\n", + " def transform_input(self, prompt: str, model_kwargs: dict) -> bytes:\n", + " input_str = json.dumps({\"text_inputs\": prompt, **model_kwargs})\n", + " return input_str.encode('utf-8')\n", + " \n", + " def transform_output(self, output: bytes) -> str:\n", + " response_json = json.loads(output.read().decode(\"utf-8\"))\n", + " return response_json['generated_texts'][0]\n", + "\n", + "content_handler = ContentHandler()\n", + "\n", + "#prompt template for input text\n", + "llm_prompt = PromptTemplate(input_variables=[\"input_text\"], template=\"{input_text}\")\n", + "\n", + "llm_chain = LLMChain(\n", + " llm=SagemakerEndpoint(\n", + " endpoint_name=endpoint_name, \n", + " region_name='us-east-1',\n", + " model_kwargs={\"temperature\":0.97,\n", + " \"max_length\": 200,\n", + " \"num_return_sequences\": 3,\n", + " \"top_k\": 50,\n", + " \"top_p\": 0.95,\n", + " \"do_sample\": True},\n", + " content_handler=content_handler\n", + " ),\n", + " prompt=llm_prompt\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d577b036-99a4-47fe-9a8e-4a34aa4cd88d", + "metadata": {}, + "source": [ + "Create a configuration and initialize an Amazon Comprehend Moderation chain" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "859da135-94d3-4a9c-970e-a873913592e2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "moderation_config = { \n", + " \"filters\":[ BaseModerationFilters.PII, BaseModerationFilters.TOXICITY ],\n", + " \"pii\":{\"action\": BaseModerationActions.ALLOW, \"threshold\":0.5, \"labels\":[\"SSN\"], \"mask_character\": \"X\"},\n", + " \"toxicity\":{\"action\": BaseModerationActions.STOP, \"threshold\":0.5},\n", + " \"intent\":{\"action\": BaseModerationActions.ALLOW, \"threshold\":0.5,},\n", + " }\n", + "\n", + "amazon_comp_moderation = AmazonComprehendModerationChain(moderation_config=moderation_config, \n", + " client=comprehend_client ,\n", + " verbose=True)" + ] + }, + { + "cell_type": "markdown", + "id": "9abb191f-7a96-4077-8c30-b9ddc225bd6b", + "metadata": {}, + "source": [ + "The `moderation_config` will now prevent any inputs and model outputs containing obscene words or sentences, bad intent, or Pii with entities other than SSN with score above threshold or 0.5 or 50%. If it finds Pii entities - SSN - it will redact them before allowing the call to proceed. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6db5aa2a-9c00-42a0-8e24-c5ba39994f7d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "chain = (\n", + " prompt \n", + " | amazon_comp_moderation \n", + " | {llm_chain.input_keys[0]: lambda x: x['output'] } \n", + " | llm_chain \n", + " | { \"input\": lambda x: x['text'] } \n", + " | amazon_comp_moderation \n", + ")\n", + "\n", + "try:\n", + " response = chain.invoke({\"question\": \"My AnyCompany Financial Services, LLC credit card account 1111-0000-1111-0008 has 24$ due by July 31st. Can you give me some more samples?\"})\n", + "except Exception as e:\n", + " print(str(e))\n", + "else:\n", + " print(response['output'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7fdfedf9-1a0a-4a9f-a6b0-d9ed2dbaa5ad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "availableInstances": [ + { + "_defaultOrder": 0, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.t3.medium", + "vcpuNum": 2 + }, + { + "_defaultOrder": 1, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.t3.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 2, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.t3.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 3, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.t3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 4, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 5, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 6, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 7, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 8, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 9, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 10, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 11, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 12, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5d.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 13, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5d.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 14, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5d.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 15, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5d.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 16, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5d.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 17, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5d.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 18, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5d.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 19, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 20, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": true, + "memoryGiB": 0, + "name": "ml.geospatial.interactive", + "supportedImageNames": [ + "sagemaker-geospatial-v1-0" + ], + "vcpuNum": 0 + }, + { + "_defaultOrder": 21, + "_isFastLaunch": true, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.c5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 22, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.c5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 23, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.c5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 24, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.c5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 25, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 72, + "name": "ml.c5.9xlarge", + "vcpuNum": 36 + }, + { + "_defaultOrder": 26, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 96, + "name": "ml.c5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 27, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 144, + "name": "ml.c5.18xlarge", + "vcpuNum": 72 + }, + { + "_defaultOrder": 28, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.c5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 29, + "_isFastLaunch": true, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g4dn.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 30, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g4dn.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 31, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g4dn.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 32, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g4dn.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 33, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g4dn.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 34, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g4dn.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 35, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 61, + "name": "ml.p3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 36, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 244, + "name": "ml.p3.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 37, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 488, + "name": "ml.p3.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 38, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.p3dn.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 39, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.r5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 40, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.r5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 41, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.r5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 42, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.r5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 43, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.r5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 44, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.r5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 45, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.r5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 46, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.r5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 47, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 48, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 49, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 50, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 51, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 52, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 53, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.g5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 54, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.g5.48xlarge", + "vcpuNum": 192 + }, + { + "_defaultOrder": 55, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.p4d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 56, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.p4de.24xlarge", + "vcpuNum": 96 + } + ], + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/__init__.py b/libs/experimental/langchain_experimental/comprehend_moderation/__init__.py new file mode 100644 index 000000000..5e4a26863 --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/__init__.py @@ -0,0 +1,25 @@ +from langchain_experimental.comprehend_moderation.amazon_comprehend_moderation import ( + AmazonComprehendModerationChain, +) +from langchain_experimental.comprehend_moderation.base_moderation import BaseModeration +from langchain_experimental.comprehend_moderation.base_moderation_callbacks import ( + BaseModerationCallbackHandler, +) +from langchain_experimental.comprehend_moderation.base_moderation_enums import ( + BaseModerationActions, + BaseModerationFilters, +) +from langchain_experimental.comprehend_moderation.intent import ComprehendIntent +from langchain_experimental.comprehend_moderation.pii import ComprehendPII +from langchain_experimental.comprehend_moderation.toxicity import ComprehendToxicity + +__all__ = [ + "BaseModeration", + "BaseModerationActions", + "BaseModerationFilters", + "ComprehendPII", + "ComprehendIntent", + "ComprehendToxicity", + "BaseModerationCallbackHandler", + "AmazonComprehendModerationChain", +] diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py b/libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py new file mode 100644 index 000000000..d00520e62 --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py @@ -0,0 +1,184 @@ +from typing import Any, Dict, List, Optional + +from langchain.callbacks.manager import CallbackManagerForChainRun +from langchain.chains.base import Chain + +from langchain_experimental.comprehend_moderation.base_moderation import ( + BaseModeration, +) +from langchain_experimental.comprehend_moderation.base_moderation_callbacks import ( + BaseModerationCallbackHandler, +) +from langchain_experimental.pydantic_v1 import root_validator + + +class AmazonComprehendModerationChain(Chain): + """A subclass of Chain, designed to apply moderation to LLMs.""" + + output_key: str = "output" #: :meta private: + """Key used to fetch/store the output in data containers. Defaults to `output`""" + + input_key: str = "input" #: :meta private: + """Key used to fetch/store the input in data containers. Defaults to `input`""" + + moderation_config: Optional[Dict[str, Any]] = None + """Configuration settings for moderation""" + + client: Optional[Any] + """boto3 client object for connection to Amazon Comprehend""" + + region_name: Optional[str] = None + """The aws region e.g., `us-west-2`. Fallsback to AWS_DEFAULT_REGION env variable + or region specified in ~/.aws/config in case it is not provided here. + """ + + credentials_profile_name: Optional[str] = None + """The name of the profile in the ~/.aws/credentials or ~/.aws/config files, which + has either access keys or role information specified. + If not specified, the default credential profile or, if on an EC2 instance, + credentials from IMDS will be used. + See: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html + """ + + moderation_callback: Optional[BaseModerationCallbackHandler] = None + """Callback handler for moderation, this is different + from regular callbacks which can be used in addition to this.""" + + unique_id: Optional[str] = None + """A unique id that can be used to identify or group a user or session""" + + @root_validator(pre=True) + def create_client(cls, values: Dict[str, Any]) -> Dict[str, Any]: + """ + Creates an Amazon Comprehend client + + Args: + values (Dict[str, Any]): A dictionary containing configuration values. + + Returns: + Dict[str, Any]: A dictionary with the updated configuration values, + including the Amazon Comprehend client. + + Raises: + ModuleNotFoundError: If the 'boto3' package is not installed. + ValueError: If there is an issue importing 'boto3' or loading + AWS credentials. + + Example: + .. code-block:: python + + config = { + "credentials_profile_name": "my-profile", + "region_name": "us-west-2" + } + updated_config = create_client(config) + comprehend_client = updated_config["client"] + """ + + if values.get("client") is not None: + return values + try: + import boto3 + + if values.get("credentials_profile_name"): + session = boto3.Session(profile_name=values["credentials_profile_name"]) + else: + # use default credentials + session = boto3.Session() + + client_params = {} + if values.get("region_name"): + client_params["region_name"] = values["region_name"] + + values["client"] = session.client("comprehend", **client_params) + + return values + except ImportError: + raise ModuleNotFoundError( + "Could not import boto3 python package. " + "Please install it with `pip install boto3`." + ) + except Exception as e: + raise ValueError( + "Could not load credentials to authenticate with AWS client. " + "Please check that credentials in the specified " + "profile name are valid." + ) from e + + @property + def output_keys(self) -> List[str]: + """ + Returns a list of output keys. + + This method defines the output keys that will be used to access the output + values produced by the chain or function. It ensures that the specified keys + are available to access the outputs. + + Returns: + List[str]: A list of output keys. + + Note: + This method is considered private and may not be intended for direct + external use. + + """ + return [self.output_key] + + @property + def input_keys(self) -> List[str]: + """ + Returns a list of input keys expected by the prompt. + + This method defines the input keys that the prompt expects in order to perform + its processing. It ensures that the specified keys are available for providing + input to the prompt. + + Returns: + List[str]: A list of input keys. + + Note: + This method is considered private and may not be intended for direct + external use. + """ + return [self.input_key] + + def _call( + self, + inputs: Dict[str, Any], + run_manager: Optional[CallbackManagerForChainRun] = None, + ) -> Dict[str, str]: + """ + Executes the moderation process on the input text and returns the processed + output. + + This internal method performs the moderation process on the input text. It + converts the input prompt value to plain text, applies the specified filters, + and then converts the filtered output back to a suitable prompt value object. + Additionally, it provides the option to log information about the run using + the provided `run_manager`. + + Args: + inputs: A dictionary containing input values + run_manager: A run manager to handle run-related events. Default is None + + Returns: + Dict[str, str]: A dictionary containing the processed output of the + moderation process. + + Raises: + ValueError: If there is an error during the moderation process + """ + + if run_manager: + run_manager.on_text("Running AmazonComprehendModerationChain...\n") + + moderation = BaseModeration( + client=self.client, + config=self.moderation_config, + moderation_callback=self.moderation_callback, + unique_id=self.unique_id, + run_manager=run_manager, + ) + response = moderation.moderate(prompt=inputs[self.input_keys[0]]) + + return {self.output_key: response} diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation.py b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation.py new file mode 100644 index 000000000..c639112b9 --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation.py @@ -0,0 +1,176 @@ +import uuid +from typing import Any, Callable, Dict, Optional + +from langchain.callbacks.manager import CallbackManagerForChainRun +from langchain.prompts.base import StringPromptValue +from langchain.prompts.chat import ChatPromptValue +from langchain.schema import AIMessage, HumanMessage + +from langchain_experimental.comprehend_moderation.intent import ComprehendIntent +from langchain_experimental.comprehend_moderation.pii import ComprehendPII +from langchain_experimental.comprehend_moderation.toxicity import ComprehendToxicity + + +class BaseModeration: + def __init__( + self, + client: Any, + config: Optional[Dict[str, Any]] = None, + moderation_callback: Optional[Any] = None, + unique_id: Optional[str] = None, + run_manager: Optional[CallbackManagerForChainRun] = None, + ): + self.client = client + self.config = config + self.moderation_callback = moderation_callback + self.unique_id = unique_id + self.chat_message_index = 0 + self.run_manager = run_manager + self.chain_id = str(uuid.uuid4()) + + def _convert_prompt_to_text(self, prompt: Any) -> str: + input_text = str() + + if isinstance(prompt, StringPromptValue): + input_text = prompt.text + elif isinstance(prompt, str): + input_text = prompt + elif isinstance(prompt, ChatPromptValue): + """ + We will just check the last message in the message Chain of a + ChatPromptTemplate. The typical chronology is + SystemMessage > HumanMessage > AIMessage and so on. However assuming + that with every chat the chain is invoked we will only check the last + message. This is assuming that all previous messages have been checked + already. Only HumanMessage and AIMessage will be checked. We can perhaps + loop through and take advantage of the additional_kwargs property in the + HumanMessage and AIMessage schema to mark messages that have been moderated. + However that means that this class could generate multiple text chunks + and moderate() logics would need to be updated. This also means some + complexity in re-constructing the prompt while keeping the messages in + sequence. + """ + message = prompt.messages[-1] + self.chat_message_index = len(prompt.messages) - 1 + if isinstance(message, HumanMessage): + input_text = message.content + + if isinstance(message, AIMessage): + input_text = message.content + else: + raise ValueError( + f"Invalid input type {type(input)}. " + "Must be a PromptValue, str, or list of BaseMessages." + ) + return input_text + + def _convert_text_to_prompt(self, prompt: Any, text: str) -> Any: + if isinstance(prompt, StringPromptValue): + return StringPromptValue(text=text) + elif isinstance(prompt, str): + return text + elif isinstance(prompt, ChatPromptValue): + messages = prompt.messages + message = messages[self.chat_message_index] + + if isinstance(message, HumanMessage): + messages[self.chat_message_index] = HumanMessage( + content=text, + example=message.example, + additional_kwargs=message.additional_kwargs, + ) + if isinstance(message, AIMessage): + messages[self.chat_message_index] = AIMessage( + content=text, + example=message.example, + additional_kwargs=message.additional_kwargs, + ) + return ChatPromptValue(messages=messages) + else: + raise ValueError( + f"Invalid input type {type(input)}. " + "Must be a PromptValue, str, or list of BaseMessages." + ) + + def _moderation_class(self, moderation_class: Any) -> Callable: + return moderation_class( + client=self.client, + callback=self.moderation_callback, + unique_id=self.unique_id, + chain_id=self.chain_id, + ).validate + + def _log_message_for_verbose(self, message: str) -> None: + if self.run_manager: + self.run_manager.on_text(message) + + def moderate(self, prompt: Any) -> str: + from langchain_experimental.comprehend_moderation.base_moderation_exceptions import ( # noqa: E501 + ModerationIntentionError, + ModerationPiiError, + ModerationToxicityError, + ) + + try: + # convert prompt to text + input_text = self._convert_prompt_to_text(prompt=prompt) + output_text = str() + # perform moderation + if self.config is None: + # In absence of config Action will default to STOP only + self._log_message_for_verbose("Running pii validation...\n") + pii_validate = self._moderation_class(moderation_class=ComprehendPII) + output_text = pii_validate(prompt_value=input_text) + + self._log_message_for_verbose("Running toxicity validation...\n") + toxicity_validate = self._moderation_class( + moderation_class=ComprehendToxicity + ) + output_text = toxicity_validate(prompt_value=output_text) + + self._log_message_for_verbose("Running intent validation...\n") + intent_validate = self._moderation_class( + moderation_class=ComprehendIntent + ) + output_text = intent_validate(prompt_value=output_text) + else: + filter_functions = { + "pii": ComprehendPII, + "toxicity": ComprehendToxicity, + "intent": ComprehendIntent, + } + filters = self.config["filters"] + for _filter in filters: + filter_name = f"{_filter}" + if filter_name in filter_functions: + self._log_message_for_verbose( + f"Running {filter_name} Validation...\n" + ) + validation_fn = self._moderation_class( + moderation_class=filter_functions[filter_name] + ) + input_text = input_text if not output_text else output_text + output_text = validation_fn( + prompt_value=input_text, + config=self.config[filter_name] + if filter_name in self.config + else None, + ) + # convert text to prompt and return + return self._convert_text_to_prompt(prompt=prompt, text=output_text) + + except ModerationPiiError as e: + self._log_message_for_verbose(f"Found PII content..stopping..\n{str(e)}\n") + raise e + except ModerationToxicityError as e: + self._log_message_for_verbose( + f"Found Toxic content..stopping..\n{str(e)}\n" + ) + raise e + except ModerationIntentionError as e: + self._log_message_for_verbose( + f"Found Harmful intention..stopping..\n{str(e)}\n" + ) + raise e + except Exception as e: + raise e diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_callbacks.py b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_callbacks.py new file mode 100644 index 000000000..d7fcd76a1 --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_callbacks.py @@ -0,0 +1,64 @@ +from typing import Any, Callable, Dict + + +class BaseModerationCallbackHandler: + def __init__(self) -> None: + if ( + self._is_method_unchanged( + BaseModerationCallbackHandler.on_after_pii, self.on_after_pii + ) + and self._is_method_unchanged( + BaseModerationCallbackHandler.on_after_toxicity, self.on_after_toxicity + ) + and self._is_method_unchanged( + BaseModerationCallbackHandler.on_after_intent, self.on_after_intent + ) + ): + raise NotImplementedError( + "Subclasses must override at least one of on_after_pii(), " + "on_after_toxicity(), or on_after_intent() functions." + ) + + def _is_method_unchanged( + self, base_method: Callable, derived_method: Callable + ) -> bool: + return base_method.__qualname__ == derived_method.__qualname__ + + async def on_after_pii( + self, moderation_beacon: Dict[str, Any], unique_id: str, **kwargs: Any + ) -> None: + """Run after PII validation is complete.""" + raise NotImplementedError("Subclasses should implement this async method.") + + async def on_after_toxicity( + self, moderation_beacon: Dict[str, Any], unique_id: str, **kwargs: Any + ) -> None: + """Run after Toxicity validation is complete.""" + raise NotImplementedError("Subclasses should implement this async method.") + + async def on_after_intent( + self, moderation_beacon: Dict[str, Any], unique_id: str, **kwargs: Any + ) -> None: + """Run after Toxicity validation is complete.""" + raise NotImplementedError("Subclasses should implement this async method.") + + @property + def pii_callback(self) -> bool: + return ( + self.on_after_pii.__func__ # type: ignore + is not BaseModerationCallbackHandler.on_after_pii + ) + + @property + def toxicity_callback(self) -> bool: + return ( + self.on_after_toxicity.__func__ # type: ignore + is not BaseModerationCallbackHandler.on_after_toxicity + ) + + @property + def intent_callback(self) -> bool: + return ( + self.on_after_intent.__func__ # type: ignore + is not BaseModerationCallbackHandler.on_after_intent + ) diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_enums.py b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_enums.py new file mode 100644 index 000000000..aec629ebc --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_enums.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class BaseModerationActions(Enum): + STOP = 1 + ALLOW = 2 + + +class BaseModerationFilters(str, Enum): + PII = "pii" + TOXICITY = "toxicity" + INTENT = "intent" diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_exceptions.py b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_exceptions.py new file mode 100644 index 000000000..74b3971df --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/base_moderation_exceptions.py @@ -0,0 +1,43 @@ +class ModerationPiiError(Exception): + """Exception raised if PII entities are detected. + + Attributes: + message -- explanation of the error + """ + + def __init__( + self, message: str = "The prompt contains PII entities and cannot be processed" + ): + self.message = message + super().__init__(self.message) + + +class ModerationToxicityError(Exception): + """Exception raised if Toxic entities are detected. + + Attributes: + message -- explanation of the error + """ + + def __init__( + self, message: str = "The prompt contains toxic content and cannot be processed" + ): + self.message = message + super().__init__(self.message) + + +class ModerationIntentionError(Exception): + """Exception raised if Intention entities are detected. + + Attributes: + message -- explanation of the error + """ + + def __init__( + self, + message: str = ( + "The prompt indicates an un-desired intent and " "cannot be processed" + ), + ): + self.message = message + super().__init__(self.message) diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/intent.py b/libs/experimental/langchain_experimental/comprehend_moderation/intent.py new file mode 100644 index 000000000..761c07286 --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/intent.py @@ -0,0 +1,101 @@ +import asyncio +import warnings +from typing import Any, Dict, Optional + +from langchain_experimental.comprehend_moderation.base_moderation_exceptions import ( + ModerationIntentionError, +) + + +class ComprehendIntent: + def __init__( + self, + client: Any, + callback: Optional[Any] = None, + unique_id: Optional[str] = None, + chain_id: Optional[str] = None, + ) -> None: + self.client = client + self.moderation_beacon = { + "moderation_chain_id": chain_id, + "moderation_type": "Intent", + "moderation_status": "LABELS_NOT_FOUND", + } + self.callback = callback + self.unique_id = unique_id + + def _get_arn(self) -> str: + region_name = self.client.meta.region_name + service = "comprehend" + intent_endpoint = "document-classifier-endpoint/prompt-intent" + return f"arn:aws:{service}:{region_name}:aws:{intent_endpoint}" + + def validate( + self, prompt_value: str, config: Optional[Dict[str, Any]] = None + ) -> str: + """ + Check and validate the intent of the given prompt text. + + Args: + comprehend_client: Comprehend client for intent classification + prompt_value (str): The input text to be checked for unintended intent + config (Dict[str, Any]): Configuration settings for intent checks + + Raises: + ValueError: If unintended intent is found in the prompt text based + on the specified threshold. + + Returns: + str: The input prompt_value. + + Note: + This function checks the intent of the provided prompt text using + Comprehend's classify_document API and raises an error if unintended + intent is detected with a score above the specified threshold. + + """ + from langchain_experimental.comprehend_moderation.base_moderation_enums import ( + BaseModerationActions, + ) + + threshold = config.get("threshold", 0.5) if config else 0.5 + action = ( + config.get("action", BaseModerationActions.STOP) + if config + else BaseModerationActions.STOP + ) + intent_found = False + + if action == BaseModerationActions.ALLOW: + warnings.warn( + "You have allowed content with Harmful content." + "Defaulting to STOP action..." + ) + action = BaseModerationActions.STOP + + endpoint_arn = self._get_arn() + response = self.client.classify_document( + Text=prompt_value, EndpointArn=endpoint_arn + ) + + if self.callback and self.callback.intent_callback: + self.moderation_beacon["moderation_input"] = prompt_value + self.moderation_beacon["moderation_output"] = response + + for class_result in response["Classes"]: + if ( + class_result["Score"] >= threshold + and class_result["Name"] == "UNDESIRED_PROMPT" + ): + intent_found = True + break + + if self.callback and self.callback.intent_callback: + if intent_found: + self.moderation_beacon["moderation_status"] = "LABELS_FOUND" + asyncio.create_task( + self.callback.on_after_intent(self.moderation_beacon, self.unique_id) + ) + if intent_found: + raise ModerationIntentionError + return prompt_value diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/pii.py b/libs/experimental/langchain_experimental/comprehend_moderation/pii.py new file mode 100644 index 000000000..2c82b7a40 --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/pii.py @@ -0,0 +1,173 @@ +import asyncio +from typing import Any, Dict, Optional + +from langchain_experimental.comprehend_moderation.base_moderation_exceptions import ( + ModerationPiiError, +) + + +class ComprehendPII: + def __init__( + self, + client: Any, + callback: Optional[Any] = None, + unique_id: Optional[str] = None, + chain_id: Optional[str] = None, + ) -> None: + self.client = client + self.moderation_beacon = { + "moderation_chain_id": chain_id, + "moderation_type": "PII", + "moderation_status": "LABELS_NOT_FOUND", + } + self.callback = callback + self.unique_id = unique_id + + def validate( + self, prompt_value: str, config: Optional[Dict[str, Any]] = None + ) -> str: + from langchain_experimental.comprehend_moderation.base_moderation_enums import ( + BaseModerationActions, + ) + + if config: + action = config.get("action", BaseModerationActions.STOP) + if action not in [BaseModerationActions.STOP, BaseModerationActions.ALLOW]: + raise ValueError("Action can either be stop or allow") + + return ( + self._contains_pii(prompt_value=prompt_value, config=config) + if action == BaseModerationActions.STOP + else self._detect_pii(prompt_value=prompt_value, config=config) + ) + else: + return self._contains_pii(prompt_value=prompt_value) + + def _contains_pii( + self, prompt_value: str, config: Optional[Dict[str, Any]] = None + ) -> str: + """ + Checks for Personally Identifiable Information (PII) labels above a + specified threshold. + + Args: + prompt_value (str): The input text to be checked for PII labels. + config (Dict[str, Any]): Configuration for PII check and actions. + + Returns: + str: the original prompt + + Note: + - The provided client should be initialized with valid AWS credentials. + """ + pii_identified = self.client.contains_pii_entities( + Text=prompt_value, LanguageCode="en" + ) + + if self.callback and self.callback.pii_callback: + self.moderation_beacon["moderation_input"] = prompt_value + self.moderation_beacon["moderation_output"] = pii_identified + + threshold = config.get("threshold", 0.5) if config else 0.5 + pii_labels = config.get("labels", []) if config else [] + pii_found = False + for entity in pii_identified["Labels"]: + if (entity["Score"] >= threshold and entity["Name"] in pii_labels) or ( + entity["Score"] >= threshold and not pii_labels + ): + pii_found = True + break + + if self.callback and self.callback.pii_callback: + if pii_found: + self.moderation_beacon["moderation_status"] = "LABELS_FOUND" + asyncio.create_task( + self.callback.on_after_pii(self.moderation_beacon, self.unique_id) + ) + if pii_found: + raise ModerationPiiError + return prompt_value + + def _detect_pii(self, prompt_value: str, config: Optional[Dict[str, Any]]) -> str: + """ + Detects and handles Personally Identifiable Information (PII) entities in the + given prompt text using Amazon Comprehend's detect_pii_entities API. The + function provides options to redact or stop processing based on the identified + PII entities and a provided configuration. + + Args: + prompt_value (str): The input text to be checked for PII entities. + config (Dict[str, Any]): A configuration specifying how to handle + PII entities. + + Returns: + str: The processed prompt text with redacted PII entities or raised + exceptions. + + Raises: + ValueError: If the prompt contains configured PII entities for + stopping processing. + + Note: + - If PII is not found in the prompt, the original prompt is returned. + - The client should be initialized with valid AWS credentials. + """ + pii_identified = self.client.detect_pii_entities( + Text=prompt_value, LanguageCode="en" + ) + + if self.callback and self.callback.pii_callback: + self.moderation_beacon["moderation_input"] = prompt_value + self.moderation_beacon["moderation_output"] = pii_identified + + if (pii_identified["Entities"]) == []: + if self.callback and self.callback.pii_callback: + asyncio.create_task( + self.callback.on_after_pii(self.moderation_beacon, self.unique_id) + ) + return prompt_value + + pii_found = False + if not config and pii_identified["Entities"]: + for entity in pii_identified["Entities"]: + if entity["Score"] >= 0.5: + pii_found = True + break + + if self.callback and self.callback.pii_callback: + if pii_found: + self.moderation_beacon["moderation_status"] = "LABELS_FOUND" + asyncio.create_task( + self.callback.on_after_pii(self.moderation_beacon, self.unique_id) + ) + if pii_found: + raise ModerationPiiError + else: + threshold = config.get("threshold", 0.5) # type: ignore + pii_labels = config.get("labels", []) # type: ignore + mask_marker = config.get("mask_character", "*") # type: ignore + pii_found = False + + for entity in pii_identified["Entities"]: + if ( + pii_labels + and entity["Type"] in pii_labels + and entity["Score"] >= threshold + ) or (not pii_labels and entity["Score"] >= threshold): + pii_found = True + char_offset_begin = entity["BeginOffset"] + char_offset_end = entity["EndOffset"] + prompt_value = ( + prompt_value[:char_offset_begin] + + mask_marker * (char_offset_end - char_offset_begin) + + prompt_value[char_offset_end:] + ) + + if self.callback and self.callback.pii_callback: + if pii_found: + self.moderation_beacon["moderation_status"] = "LABELS_FOUND" + asyncio.create_task( + self.callback.on_after_pii(self.moderation_beacon, self.unique_id) + ) + + return prompt_value diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/toxicity.py b/libs/experimental/langchain_experimental/comprehend_moderation/toxicity.py new file mode 100644 index 000000000..b66320ec5 --- /dev/null +++ b/libs/experimental/langchain_experimental/comprehend_moderation/toxicity.py @@ -0,0 +1,209 @@ +import asyncio +import importlib +import warnings +from typing import Any, Dict, List, Optional + +from langchain_experimental.comprehend_moderation.base_moderation_exceptions import ( + ModerationToxicityError, +) + + +class ComprehendToxicity: + def __init__( + self, + client: Any, + callback: Optional[Any] = None, + unique_id: Optional[str] = None, + chain_id: Optional[str] = None, + ) -> None: + self.client = client + self.moderation_beacon = { + "moderation_chain_id": chain_id, + "moderation_type": "Toxicity", + "moderation_status": "LABELS_NOT_FOUND", + } + self.callback = callback + self.unique_id = unique_id + + def _toxicity_init_validate(self, max_size: int) -> Any: + """ + Validate and initialize toxicity processing configuration. + + Args: + max_size (int): Maximum sentence size defined in the configuration object. + + Raises: + Exception: If the maximum sentence size exceeds the 5KB limit. + + Note: + This function ensures that the NLTK punkt tokenizer is downloaded if not + already present. + + Returns: + None + """ + if max_size > 1024 * 5: + raise Exception("The sentence length should not exceed 5KB.") + try: + nltk = importlib.import_module("nltk") + nltk.data.find("tokenizers/punkt") + return nltk + except ImportError: + raise ModuleNotFoundError( + "Could not import nltk python package. " + "Please install it with `pip install nltk`." + ) + except LookupError: + nltk.download("punkt") + + def _split_paragraph( + self, prompt_value: str, max_size: int = 1024 * 4 + ) -> List[List[str]]: + """ + Split a paragraph into chunks of sentences, respecting the maximum size limit. + + Args: + paragraph (str): The input paragraph to be split into chunks + max_size (int, optional): The maximum size limit in bytes for each chunk + Defaults to 1024. + + Returns: + List[List[str]]: A list of chunks, where each chunk is a list of sentences + + Note: + This function validates the maximum sentence size based on service limits + using the 'toxicity_init_validate' function. It uses the NLTK sentence + tokenizer to split the paragraph into sentences. + + """ + + # validate max. sentence size based on Service limits + nltk = self._toxicity_init_validate(max_size) + + sentences = nltk.sent_tokenize(prompt_value) + + chunks = [] + current_chunk = [] # type: ignore + current_size = 0 + + for sentence in sentences: + sentence_size = len(sentence.encode("utf-8")) + + # If adding a new sentence exceeds max_size or + # current_chunk has 10 sentences, start a new chunk + if (current_size + sentence_size > max_size) or (len(current_chunk) >= 10): + if current_chunk: # Avoid appending empty chunks + chunks.append(current_chunk) + current_chunk = [] + current_size = 0 + + current_chunk.append(sentence) + current_size += sentence_size + + # Add any remaining sentences + if current_chunk: + chunks.append(current_chunk) + + return chunks + + def validate( + self, prompt_value: str, config: Optional[Dict[str, Any]] = None + ) -> str: + """ + Check the toxicity of a given text prompt using AWS Comprehend service + and apply actions based on configuration. + + Args: + prompt_value (str): The text content to be checked for toxicity. + config (Dict[str, Any]): Configuration for toxicity checks and actions. + + Returns: + str: The original prompt_value if allowed or no toxicity found. + + Raises: + ValueError: If the prompt contains toxic labels and cannot be + processed based on the configuration. + """ + + chunks = self._split_paragraph(prompt_value=prompt_value) + for sentence_list in chunks: + segments = [{"Text": sentence} for sentence in sentence_list] + response = self.client.detect_toxic_content( + TextSegments=segments, LanguageCode="en" + ) + if self.callback and self.callback.toxicity_callback: + self.moderation_beacon["moderation_input"] = segments # type: ignore + self.moderation_beacon["moderation_output"] = response + + if config: + from langchain_experimental.comprehend_moderation.base_moderation_enums import ( # noqa: E501 + BaseModerationActions, + ) + + toxicity_found = False + action = config.get("action", BaseModerationActions.STOP) + if action not in [ + BaseModerationActions.STOP, + BaseModerationActions.ALLOW, + ]: + raise ValueError("Action can either be stop or allow") + + threshold = config.get("threshold", 0.5) if config else 0.5 + toxicity_labels = config.get("labels", []) if config else [] + + if action == BaseModerationActions.STOP: + for item in response["ResultList"]: + for label in item["Labels"]: + if ( + label + and ( + not toxicity_labels + or label["Name"] in toxicity_labels + ) + and label["Score"] >= threshold + ): + toxicity_found = True + break + + if action == BaseModerationActions.ALLOW: + if not toxicity_labels: + warnings.warn( + "You have allowed toxic content without specifying " + "any toxicity labels." + ) + else: + for item in response["ResultList"]: + for label in item["Labels"]: + if ( + label["Name"] in toxicity_labels + and label["Score"] >= threshold + ): + toxicity_found = True + break + + if self.callback and self.callback.toxicity_callback: + if toxicity_found: + self.moderation_beacon["moderation_status"] = "LABELS_FOUND" + asyncio.create_task( + self.callback.on_after_toxicity( + self.moderation_beacon, self.unique_id + ) + ) + if toxicity_found: + raise ModerationToxicityError + else: + if response["ResultList"]: + detected_toxic_labels = list() + for item in response["ResultList"]: + detected_toxic_labels.extend(item["Labels"]) + if any(item["Score"] >= 0.5 for item in detected_toxic_labels): + if self.callback and self.callback.toxicity_callback: + self.moderation_beacon["moderation_status"] = "LABELS_FOUND" + asyncio.create_task( + self.callback.on_after_toxicity( + self.moderation_beacon, self.unique_id + ) + ) + raise ModerationToxicityError + + return prompt_value From 12a373810ccd3162b3bda877d0b42fddf756b76e Mon Sep 17 00:00:00 2001 From: Monami Sharma Date: Fri, 25 Aug 2023 17:19:32 -0500 Subject: [PATCH 135/143] Fixing broken links to Moderation and Constitutional chain (#9768) - Description: Fixing broken links for Moderation and Constitutional chain - Issue: N/A - Twitter handle: MonamiSharma --- docs/docs_skeleton/docs/guides/safety/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs_skeleton/docs/guides/safety/index.mdx b/docs/docs_skeleton/docs/guides/safety/index.mdx index a64b1ea04..1f01245d1 100644 --- a/docs/docs_skeleton/docs/guides/safety/index.mdx +++ b/docs/docs_skeleton/docs/guides/safety/index.mdx @@ -2,5 +2,5 @@ One of the key concerns with using LLMs is that they may generate harmful or unethical text. This is an area of active research in the field. Here we present some built-in chains inspired by this research, which are intended to make the outputs of LLMs safer. -- [Moderation chain](/docs/use_cases/safety/moderation): Explicitly check if any output text is harmful and flag it. -- [Constitutional chain](/docs/use_cases/safety/constitutional_chain): Prompt the model with a set of principles which should guide it's behavior. +- [Moderation chain](/docs/guides/safety/moderation): Explicitly check if any output text is harmful and flag it. +- [Constitutional chain](/docs/guides/safety/constitutional_chain): Prompt the model with a set of principles which should guide it's behavior. From fa0b8f33685782cea71693dab9bbde049e385992 Mon Sep 17 00:00:00 2001 From: Anish Shah <93145909+ash0ts@users.noreply.github.com> Date: Fri, 25 Aug 2023 18:34:08 -0400 Subject: [PATCH 136/143] fix broken wandb link in debugging page (#9771) - Description: Fix broken hyperlink in debugging page --- docs/extras/guides/debugging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extras/guides/debugging.md b/docs/extras/guides/debugging.md index 203428989..2527034dc 100644 --- a/docs/extras/guides/debugging.md +++ b/docs/extras/guides/debugging.md @@ -8,7 +8,7 @@ Here's a few different tools and functionalities to aid in debugging. ## Tracing -Platforms with tracing capabilities like [LangSmith](/docs/guides/langsmith/) and [WandB](/docs/ecosystem/integrations/agent_with_wandb_tracing) are the most comprehensive solutions for debugging. These platforms make it easy to not only log and visualize LLM apps, but also to actively debug, test and refine them. +Platforms with tracing capabilities like [LangSmith](/docs/guides/langsmith/) and [WandB](/docs/integrations/providers/wandb_tracing) are the most comprehensive solutions for debugging. These platforms make it easy to not only log and visualize LLM apps, but also to actively debug, test and refine them. For anyone building production-grade LLM applications, we highly recommend using a platform like this. From a28eea57674a99c6d3a20b4423d0c0e967715f00 Mon Sep 17 00:00:00 2001 From: Sam Partee Date: Fri, 25 Aug 2023 17:22:50 -0700 Subject: [PATCH 137/143] Redis metadata filtering and specification, index customization (#8612) ### Description The previous Redis implementation did not allow for the user to specify the index configuration (i.e. changing the underlying algorithm) or add additional metadata to use for querying (i.e. hybrid or "filtered" search). This PR introduces the ability to specify custom index attributes and metadata attributes as well as use that metadata in filtered queries. Overall, more structure was introduced to the Redis implementation that should allow for easier maintainability moving forward. # New Features The following features are now available with the Redis integration into Langchain ## Index schema generation The schema for the index will now be automatically generated if not specified by the user. For example, the data above has the multiple metadata categories. The the following example ```python from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores.redis import Redis embeddings = OpenAIEmbeddings() rds, keys = Redis.from_texts_return_keys( texts, embeddings, metadatas=metadata, redis_url="redis://localhost:6379", index_name="users" ) ``` Loading the data in through this and the other ``from_documents`` and ``from_texts`` methods will now generate index schema in Redis like the following. view index schema with the ``redisvl`` tool. [link](redisvl.com) ```bash $ rvl index info -i users ``` Index Information: | Index Name | Storage Type | Prefixes | Index Options | Indexing | |--------------|----------------|---------------|-----------------|------------| | users | HASH | ['doc:users'] | [] | 0 | Index Fields: | Name | Attribute | Type | Field Option | Option Value | |----------------|----------------|---------|----------------|----------------| | user | user | TEXT | WEIGHT | 1 | | job | job | TEXT | WEIGHT | 1 | | credit_score | credit_score | TEXT | WEIGHT | 1 | | content | content | TEXT | WEIGHT | 1 | | age | age | NUMERIC | | | | content_vector | content_vector | VECTOR | | | ### Custom Metadata specification The metadata schema generation has the following rules 1. All text fields are indexed as text fields. 2. All numeric fields are index as numeric fields. If you would like to have a text field as a tag field, users can specify overrides like the following for the example data ```python # this can also be a path to a yaml file index_schema = { "text": [{"name": "user"}, {"name": "job"}], "tag": [{"name": "credit_score"}], "numeric": [{"name": "age"}], } rds, keys = Redis.from_texts_return_keys( texts, embeddings, metadatas=metadata, redis_url="redis://localhost:6379", index_name="users" ) ``` This will change the index specification to Index Information: | Index Name | Storage Type | Prefixes | Index Options | Indexing | |--------------|----------------|----------------|-----------------|------------| | users2 | HASH | ['doc:users2'] | [] | 0 | Index Fields: | Name | Attribute | Type | Field Option | Option Value | |----------------|----------------|---------|----------------|----------------| | user | user | TEXT | WEIGHT | 1 | | job | job | TEXT | WEIGHT | 1 | | content | content | TEXT | WEIGHT | 1 | | credit_score | credit_score | TAG | SEPARATOR | , | | age | age | NUMERIC | | | | content_vector | content_vector | VECTOR | | | and throw a warning to the user (log output) that the generated schema does not match the specified schema. ```text index_schema does not match generated schema from metadata. index_schema: {'text': [{'name': 'user'}, {'name': 'job'}], 'tag': [{'name': 'credit_score'}], 'numeric': [{'name': 'age'}]} generated_schema: {'text': [{'name': 'user'}, {'name': 'job'}, {'name': 'credit_score'}], 'numeric': [{'name': 'age'}]} ``` As long as this is on purpose, this is fine. The schema can be defined as a yaml file or a dictionary ```yaml text: - name: user - name: job tag: - name: credit_score numeric: - name: age ``` and you pass in a path like ```python rds, keys = Redis.from_texts_return_keys( texts, embeddings, metadatas=metadata, redis_url="redis://localhost:6379", index_name="users3", index_schema=Path("sample1.yml").resolve() ) ``` Which will create the same schema as defined in the dictionary example Index Information: | Index Name | Storage Type | Prefixes | Index Options | Indexing | |--------------|----------------|----------------|-----------------|------------| | users3 | HASH | ['doc:users3'] | [] | 0 | Index Fields: | Name | Attribute | Type | Field Option | Option Value | |----------------|----------------|---------|----------------|----------------| | user | user | TEXT | WEIGHT | 1 | | job | job | TEXT | WEIGHT | 1 | | content | content | TEXT | WEIGHT | 1 | | credit_score | credit_score | TAG | SEPARATOR | , | | age | age | NUMERIC | | | | content_vector | content_vector | VECTOR | | | ### Custom Vector Indexing Schema Users with large use cases may want to change how they formulate the vector index created by Langchain To utilize all the features of Redis for vector database use cases like this, you can now do the following to pass in index attribute modifiers like changing the indexing algorithm to HNSW. ```python vector_schema = { "algorithm": "HNSW" } rds, keys = Redis.from_texts_return_keys( texts, embeddings, metadatas=metadata, redis_url="redis://localhost:6379", index_name="users3", vector_schema=vector_schema ) ``` A more complex example may look like ```python vector_schema = { "algorithm": "HNSW", "ef_construction": 200, "ef_runtime": 20 } rds, keys = Redis.from_texts_return_keys( texts, embeddings, metadatas=metadata, redis_url="redis://localhost:6379", index_name="users3", vector_schema=vector_schema ) ``` All names correspond to the arguments you would set if using Redis-py or RedisVL. (put in doc link later) ### Better Querying Both vector queries and Range (limit) queries are now available and metadata is returned by default. The outputs are shown. ```python >>> query = "foo" >>> results = rds.similarity_search(query, k=1) >>> print(results) [Document(page_content='foo', metadata={'user': 'derrick', 'job': 'doctor', 'credit_score': 'low', 'age': '14', 'id': 'doc:users:657a47d7db8b447e88598b83da879b9d', 'score': '7.15255737305e-07'})] >>> results = rds.similarity_search_with_score(query, k=1, return_metadata=False) >>> print(results) # no metadata, but with scores [(Document(page_content='foo', metadata={}), 7.15255737305e-07)] >>> results = rds.similarity_search_limit_score(query, k=6, score_threshold=0.0001) >>> print(len(results)) # range query (only above threshold even if k is higher) 4 ``` ### Custom metadata filtering A big advantage of Redis in this space is being able to do filtering on data stored alongside the vector itself. With the example above, the following is now possible in langchain. The equivalence operators are overridden to describe a new expression language that mimic that of [redisvl](redisvl.com). This allows for arbitrarily long sequences of filters that resemble SQL commands that can be used directly with vector queries and range queries. There are two interfaces by which to do so and both are shown. ```python >>> from langchain.vectorstores.redis import RedisFilter, RedisNum, RedisText >>> age_filter = RedisFilter.num("age") > 18 >>> age_filter = RedisNum("age") > 18 # equivalent >>> results = rds.similarity_search(query, filter=age_filter) >>> print(len(results)) 3 >>> job_filter = RedisFilter.text("job") == "engineer" >>> job_filter = RedisText("job") == "engineer" # equivalent >>> results = rds.similarity_search(query, filter=job_filter) >>> print(len(results)) 2 # fuzzy match text search >>> job_filter = RedisFilter.text("job") % "eng*" >>> results = rds.similarity_search(query, filter=job_filter) >>> print(len(results)) 2 # combined filters (AND) >>> combined = age_filter & job_filter >>> results = rds.similarity_search(query, filter=combined) >>> print(len(results)) 1 # combined filters (OR) >>> combined = age_filter | job_filter >>> results = rds.similarity_search(query, filter=combined) >>> print(len(results)) 4 ``` All the above filter results can be checked against the data above. ### Other - Issue: #3967 - Dependencies: No added dependencies - Tag maintainer: @hwchase17 @baskaryan @rlancemartin - Twitter handle: @sampartee --------- Co-authored-by: Naresh Rangan Co-authored-by: Bagatur --- .../integrations/vectorstores/redis.ipynb | 1080 +++++++++++-- libs/langchain/langchain/cache.py | 28 +- libs/langchain/langchain/memory/utils.py | 2 - libs/langchain/langchain/utilities/redis.py | 58 +- .../langchain/langchain/vectorstores/redis.py | 664 -------- .../langchain/vectorstores/redis/__init__.py | 9 + .../langchain/vectorstores/redis/base.py | 1361 +++++++++++++++++ .../langchain/vectorstores/redis/constants.py | 20 + .../langchain/vectorstores/redis/filters.py | 420 +++++ .../langchain/vectorstores/redis/schema.py | 276 ++++ .../cache/test_redis_cache.py | 99 +- .../vectorstores/fake_embeddings.py | 1 + .../vectorstores/test_redis.py | 283 +++- 13 files changed, 3480 insertions(+), 821 deletions(-) delete mode 100644 libs/langchain/langchain/vectorstores/redis.py create mode 100644 libs/langchain/langchain/vectorstores/redis/__init__.py create mode 100644 libs/langchain/langchain/vectorstores/redis/base.py create mode 100644 libs/langchain/langchain/vectorstores/redis/constants.py create mode 100644 libs/langchain/langchain/vectorstores/redis/filters.py create mode 100644 libs/langchain/langchain/vectorstores/redis/schema.py diff --git a/docs/extras/integrations/vectorstores/redis.ipynb b/docs/extras/integrations/vectorstores/redis.ipynb index 972af8634..ae17b0e4e 100644 --- a/docs/extras/integrations/vectorstores/redis.ipynb +++ b/docs/extras/integrations/vectorstores/redis.ipynb @@ -6,20 +6,124 @@ "source": [ "# Redis\n", "\n", - ">[Redis (Remote Dictionary Server)](https://en.wikipedia.org/wiki/Redis) is an in-memory data structure store, used as a distributed, in-memory key–value database, cache and message broker, with optional durability.\n", + "Redis vector database introduction and langchain integration guide.\n", "\n", - "This notebook shows how to use functionality related to the [Redis vector database](https://redis.com/solutions/use-cases/vector-database/).\n", + "## What is Redis?\n", "\n", - "As database either Redis standalone server or Redis Sentinel HA setups are supported for connections with the \"redis_url\"\n", - "parameter. More information about the different formats of the redis connection url can be found in the LangChain\n", - "[Redis Readme](/docs/integrations/vectorstores/redis) file" + "Most developers from a web services background are probably familiar with Redis. At it's core, Redis is an open-source key-value store that can be used as a cache, message broker, and database. Developers choice Redis because it is fast, has a large ecosystem of client libraries, and has been deployed by major enterprises for years.\n", + "\n", + "In addition to the traditional uses of Redis. Redis also provides capabilities built directly into Redis. These capabilities include the Search and Query capability that allows users to create secondary index structures within Redis. This allows Redis to be a Vector Database, at the speed of a cache. \n", + "\n", + "\n", + "## Redis as a Vector Database\n", + "\n", + "Redis uses compressed, inverted indexes for fast indexing with a low memory footprint. It also supports a number of advanced features such as:\n", + "\n", + "* Indexing of multiple fields in Redis hashes and JSON\n", + "* Vector similarity search (with HNSW (ANN) or FLAT (KNN))\n", + "* Vector Range Search (e.g. find all vectors within a radius of a query vector)\n", + "* Incremental indexing without performance loss\n", + "* Document ranking (using [tf-idf](https://en.wikipedia.org/wiki/Tf%E2%80%93idf), with optional user-provided weights)\n", + "* Field weighting\n", + "* Complex boolean queries with AND, OR, and NOT operators\n", + "* Prefix matching, fuzzy matching, and exact-phrase queries\n", + "* Support for [double-metaphone phonetic matching](https://redis.io/docs/stack/search/reference/phonetic_matching/)\n", + "* Auto-complete suggestions (with fuzzy prefix suggestions)\n", + "* Stemming-based query expansion in [many languages](https://redis.io/docs/stack/search/reference/stemming/) (using [Snowball](http://snowballstem.org/))\n", + "* Support for Chinese-language tokenization and querying (using [Friso](https://github.com/lionsoul2014/friso))\n", + "* Numeric filters and ranges\n", + "* Geospatial searches using [Redis geospatial indexing](/commands/georadius)\n", + "* A powerful aggregations engine\n", + "* Supports for all utf-8 encoded text\n", + "* Retrieve full documents, selected fields, or only the document IDs\n", + "* Sorting results (for example, by creation date)\n", + "\n", + "\n", + "\n", + "## Clients\n", + "\n", + "Since redis is much more than just a vector database, there are often use cases that demand usage of a Redis client besides just the langchain integration. You can use any standard Redis client library to run Search and Query commands, but it's easiest to use a library that wraps the Search and Query API. Below are a few examples, but you can find more client libraries [here](https://redis.io/resources/clients/).\n", + "\n", + "| Project | Language | License | Author | Stars |\n", + "|----------|---------|--------|---------|-------|\n", + "| [jedis][jedis-url] | Java | MIT | [Redis][redis-url] | ![Stars][jedis-stars] |\n", + "| [redisvl][redisvl-url] | Python | MIT | [Redis][redis-url] | ![Stars][redisvl-stars] |\n", + "| [redis-py][redis-py-url] | Python | MIT | [Redis][redis-url] | ![Stars][redis-py-stars] |\n", + "| [node-redis][node-redis-url] | Node.js | MIT | [Redis][redis-url] | ![Stars][node-redis-stars] |\n", + "| [nredisstack][nredisstack-url] | .NET | MIT | [Redis][redis-url] | ![Stars][nredisstack-stars] |\n", + "\n", + "[redis-url]: https://redis.com\n", + "\n", + "[redisvl-url]: https://github.com/RedisVentures/redisvl\n", + "[redisvl-stars]: https://img.shields.io/github/stars/RedisVentures/redisvl.svg?style=social&label=Star&maxAge=2592000\n", + "[redisvl-package]: https://pypi.python.org/pypi/redisvl\n", + "\n", + "[redis-py-url]: https://github.com/redis/redis-py\n", + "[redis-py-stars]: https://img.shields.io/github/stars/redis/redis-py.svg?style=social&label=Star&maxAge=2592000\n", + "[redis-py-package]: https://pypi.python.org/pypi/redis\n", + "\n", + "[jedis-url]: https://github.com/redis/jedis\n", + "[jedis-stars]: https://img.shields.io/github/stars/redis/jedis.svg?style=social&label=Star&maxAge=2592000\n", + "[Jedis-package]: https://search.maven.org/artifact/redis.clients/jedis\n", + "\n", + "[nredisstack-url]: https://github.com/redis/nredisstack\n", + "[nredisstack-stars]: https://img.shields.io/github/stars/redis/nredisstack.svg?style=social&label=Star&maxAge=2592000\n", + "[nredisstack-package]: https://www.nuget.org/packages/nredisstack/\n", + "\n", + "[node-redis-url]: https://github.com/redis/node-redis\n", + "[node-redis-stars]: https://img.shields.io/github/stars/redis/node-redis.svg?style=social&label=Star&maxAge=2592000\n", + "[node-redis-package]: https://www.npmjs.com/package/redis\n", + "\n", + "[redis-om-python-url]: https://github.com/redis/redis-om-python\n", + "[redis-om-python-author]: https://redis.com\n", + "[redis-om-python-stars]: https://img.shields.io/github/stars/redis/redis-om-python.svg?style=social&label=Star&maxAge=2592000\n", + "\n", + "[redisearch-go-url]: https://github.com/RediSearch/redisearch-go\n", + "[redisearch-go-author]: https://redis.com\n", + "[redisearch-go-stars]: https://img.shields.io/github/stars/RediSearch/redisearch-go.svg?style=social&label=Star&maxAge=2592000\n", + "\n", + "[redisearch-api-rs-url]: https://github.com/RediSearch/redisearch-api-rs\n", + "[redisearch-api-rs-author]: https://redis.com\n", + "[redisearch-api-rs-stars]: https://img.shields.io/github/stars/RediSearch/redisearch-api-rs.svg?style=social&label=Star&maxAge=2592000\n", + "\n", + "\n", + "## Deployment Options\n", + "\n", + "There are many ways to deploy Redis with RediSearch. The easiest way to get started is to use Docker, but there are are many potential options for deployment such as\n", + "\n", + "- [Redis Cloud](https://redis.com/redis-enterprise-cloud/overview/)\n", + "- [Docker (Redis Stack)](https://hub.docker.com/r/redis/redis-stack)\n", + "- Cloud marketplaces: [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-e6y7ork67pjwg?sr=0-2&ref_=beagle&applicationId=AWSMPContessa), [Google Marketplace](https://console.cloud.google.com/marketplace/details/redislabs-public/redis-enterprise?pli=1), or [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/garantiadata.redis_enterprise_1sp_public_preview?tab=Overview)\n", + "- On-premise: [Redis Enterprise Software](https://redis.com/redis-enterprise-software/overview/)\n", + "- Kubernetes: [Redis Enterprise Software on Kubernetes](https://docs.redis.com/latest/kubernetes/)\n", + "\n", + "\n", + "## Examples\n", + "\n", + "Many examples can be found in the [Redis AI team's GitHub](https://github.com/RedisVentures/)\n", + "\n", + "- [Awesome Redis AI Resources](https://github.com/RedisVentures/redis-ai-resources) - List of examples of using Redis in AI workloads\n", + "- [Azure OpenAI Embeddings Q&A](https://github.com/ruoccofabrizio/azure-open-ai-embeddings-qna) - OpenAI and Redis as a Q&A service on Azure.\n", + "- [ArXiv Paper Search](https://github.com/RedisVentures/redis-arXiv-search) - Semantic search over arXiv scholarly papers\n", + "\n", + "\n", + "## More Resources\n", + "\n", + "For more information on how to use Redis as a vector database, check out the following resources:\n", + "\n", + "- [RedisVL Documentation](https://redisvl.com) - Documentation for the Redis Vector Library Client\n", + "- [Redis Vector Similarity Docs](https://redis.io/docs/stack/search/reference/vectors/) - Redis official docs for Vector Search.\n", + "- [Redis-py Search Docs](https://redis.readthedocs.io/en/latest/redismodules.html#redisearch-commands) - Documentation for redis-py client library\n", + "- [Vector Similarity Search: From Basics to Production](https://mlops.community/vector-similarity-search-from-basics-to-production/) - Introductory blog post to VSS and Redis as a VectorDB." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Installing" + "## Install Redis Python Client\n", + "\n", + "Redis-py is the officially supported client by Redis. Recently released is the RedisVL client which is purpose built for the Vector Database use cases. Both can be installed with pip." ] }, { @@ -30,7 +134,7 @@ }, "outputs": [], "source": [ - "!pip install redis" + "!pip install redis redisvl openai tiktoken" ] }, { @@ -42,52 +146,97 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "import getpass\n", "\n", - "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key:\")" + "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key:\")\n", + "\n", + "from langchain.embeddings import OpenAIEmbeddings\n", + "embeddings = OpenAIEmbeddings()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Example" + "## Sample Data\n", + "\n", + "First we will describe some sample data so that the various attributes of the Redis vector store can be demonstrated." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "metadata = [\n", + " {\n", + " \"user\": \"john\",\n", + " \"age\": 18,\n", + " \"job\": \"engineer\",\n", + " \"credit_score\": \"high\",\n", + " },\n", + " {\n", + " \"user\": \"derrick\",\n", + " \"age\": 45,\n", + " \"job\": \"doctor\",\n", + " \"credit_score\": \"low\",\n", + " },\n", + " {\n", + " \"user\": \"nancy\",\n", + " \"age\": 94,\n", + " \"job\": \"doctor\",\n", + " \"credit_score\": \"high\",\n", + " },\n", + " {\n", + " \"user\": \"tyler\",\n", + " \"age\": 100,\n", + " \"job\": \"engineer\",\n", + " \"credit_score\": \"high\",\n", + " },\n", + " {\n", + " \"user\": \"joe\",\n", + " \"age\": 35,\n", + " \"job\": \"dentist\",\n", + " \"credit_score\": \"medium\",\n", + " },\n", + "]\n", + "texts = [\"foo\", \"foo\", \"foo\", \"bar\", \"bar\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initializing Redis\n", + "\n", + "The Redis VectorStore instance can be initialized in a number of ways. There are multiple class methods that can be used to initialize a Redis VectorStore instance.\n", + "\n", + "- ``Redis.__init__`` - Initialize directly\n", + "- ``Redis.from_documents`` - Initialize from a list of ``Langchain.docstore.Document`` objects\n", + "- ``Redis.from_texts`` - Initialize from a list of texts (optionally with metadata)\n", + "- ``Redis.from_texts_return_keys`` - Initialize from a list of texts (optionally with metadata) and return the keys\n", + "- ``Redis.from_existing_index`` - Initialize from an existing Redis index\n", + "\n", + "Below we will use the ``Redis.from_documents`` method." + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": { "tags": [] }, "outputs": [], "source": [ - "from langchain.embeddings import OpenAIEmbeddings\n", - "from langchain.text_splitter import CharacterTextSplitter\n", "from langchain.vectorstores.redis import Redis" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.document_loaders import TextLoader\n", - "\n", - "loader = TextLoader(\"../../../state_of_the_union.txt\")\n", - "documents = loader.load()\n", - "text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\n", - "docs = text_splitter.split_documents(documents)\n", - "\n", - "embeddings = OpenAIEmbeddings()" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -97,90 +246,705 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ + "from langchain.docstore.document import Document\n", + "\n", + "documents = [Document(page_content=t, metadata=m) for t, m in zip(texts, metadata)]\n", "rds = Redis.from_documents(\n", - " docs, embeddings, redis_url=\"redis://localhost:6379\", index_name=\"link\"\n", + " documents,\n", + " embeddings,\n", + " redis_url=\"redis://localhost:6379\",\n", + " index_name=\"users\"\n", ")" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'users'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rds.index_name" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "If you're interested in the keys of your entries you have to split your docs in texts and metadatas" + "## Inspecting the Created Index\n", + "\n", + "Once the ``Redis`` VectorStore object has been constructed, an index will have been created in Redis if it did not already exist. The index can be inspected with both the ``rvl``and the ``redis-cli`` command line tool. If you installed ``redisvl`` above, you can use the ``rvl`` command line tool to inspect the index." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[32m16:58:26\u001b[0m \u001b[34m[RedisVL]\u001b[0m \u001b[1;30mINFO\u001b[0m Indices:\n", + "\u001b[32m16:58:26\u001b[0m \u001b[34m[RedisVL]\u001b[0m \u001b[1;30mINFO\u001b[0m 1. users\n" + ] + } + ], + "source": [ + "# assumes you're running Redis locally (use --host, --port, --password, --username, to change this)\n", + "!rvl index listall" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ``Redis`` VectorStore implementation will attempt to generate index schema (fields for filtering) for any metadata passed through the ``from_texts``, ``from_texts_return_keys``, and ``from_documents`` methods. This way, whatever metadata is passed will be indexed into the Redis search index allowing\n", + "for filtering on those fields.\n", + "\n", + "Below we show what fields were created from the metadata we defined above" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Index Information:\n", + "╭──────────────┬────────────────┬───────────────┬─────────────────┬────────────╮\n", + "│ Index Name │ Storage Type │ Prefixes │ Index Options │ Indexing │\n", + "├──────────────┼────────────────┼───────────────┼─────────────────┼────────────┤\n", + "│ users │ HASH │ ['doc:users'] │ [] │ 0 │\n", + "╰──────────────┴────────────────┴───────────────┴─────────────────┴────────────╯\n", + "Index Fields:\n", + "╭────────────────┬────────────────┬─────────┬────────────────┬────────────────╮\n", + "│ Name │ Attribute │ Type │ Field Option │ Option Value │\n", + "├────────────────┼────────────────┼─────────┼────────────────┼────────────────┤\n", + "│ user │ user │ TEXT │ WEIGHT │ 1 │\n", + "│ job │ job │ TEXT │ WEIGHT │ 1 │\n", + "│ credit_score │ credit_score │ TEXT │ WEIGHT │ 1 │\n", + "│ content │ content │ TEXT │ WEIGHT │ 1 │\n", + "│ age │ age │ NUMERIC │ │ │\n", + "│ content_vector │ content_vector │ VECTOR │ │ │\n", + "╰────────────────┴────────────────┴─────────┴────────────────┴────────────────╯\n" + ] + } + ], + "source": [ + "!rvl index info -i users" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Statistics:\n", + "╭─────────────────────────────┬─────────────╮\n", + "│ Stat Key │ Value │\n", + "├─────────────────────────────┼─────────────┤\n", + "│ num_docs │ 5 │\n", + "│ num_terms │ 15 │\n", + "│ max_doc_id │ 5 │\n", + "│ num_records │ 33 │\n", + "│ percent_indexed │ 1 │\n", + "│ hash_indexing_failures │ 0 │\n", + "│ number_of_uses │ 4 │\n", + "│ bytes_per_record_avg │ 4.60606 │\n", + "│ doc_table_size_mb │ 0.000524521 │\n", + "│ inverted_sz_mb │ 0.000144958 │\n", + "│ key_table_size_mb │ 0.000193596 │\n", + "│ offset_bits_per_record_avg │ 8 │\n", + "│ offset_vectors_sz_mb │ 2.19345e-05 │\n", + "│ offsets_per_term_avg │ 0.69697 │\n", + "│ records_per_doc_avg │ 6.6 │\n", + "│ sortable_values_size_mb │ 0 │\n", + "│ total_indexing_time │ 0.32 │\n", + "│ total_inverted_index_blocks │ 16 │\n", + "│ vector_index_sz_mb │ 6.0126 │\n", + "╰─────────────────────────────┴─────────────╯\n" + ] + } + ], + "source": [ + "!rvl stats -i users" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's important to note that we have not specified that the ``user``, ``job``, ``credit_score`` and ``age`` in the metadata should be fields within the index, this is because the ``Redis`` VectorStore object automatically generate the index schema from the passed metadata. For more information on the generation of index fields, see the API documentation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Querying\n", + "\n", + "There are multiple ways to query the ``Redis`` VectorStore implementation based on what use case you have:\n", + "\n", + "- ``similarity_search``: Find the most similar vectors to a given vector.\n", + "- ``similarity_search_with_score``: Find the most similar vectors to a given vector and return the vector distance\n", + "- ``similarity_search_limit_score``: Find the most similar vectors to a given vector and limit the number of results to the ``score_threshold``\n", + "- ``similarity_search_with_relevance_scores``: Find the most similar vectors to a given vector and return the vector similarities" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "foo\n" + ] + } + ], + "source": [ + "results = rds.similarity_search(\"foo\")\n", + "print(results[0].page_content)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Key of the document in Redis: doc:users:a70ca43b3a4e4168bae57c78753a200f\n", + "Metadata of the document: {'user': 'derrick', 'job': 'doctor', 'credit_score': 'low', 'age': '45'}\n" + ] + } + ], + "source": [ + "# return metadata\n", + "results = rds.similarity_search(\"foo\", k=3)\n", + "meta = results[1].metadata\n", + "print(\"Key of the document in Redis: \", meta.pop(\"id\"))\n", + "print(\"Metadata of the document: \", meta)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Content: foo --- Score: 0.0\n", + "Content: foo --- Score: 0.0\n", + "Content: foo --- Score: 0.0\n", + "Content: bar --- Score: 0.1566\n", + "Content: bar --- Score: 0.1566\n" + ] + } + ], + "source": [ + "# with scores (distances)\n", + "results = rds.similarity_search_with_score(\"foo\", k=5)\n", + "for result in results:\n", + " print(f\"Content: {result[0].page_content} --- Score: {result[1]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Content: foo --- Score: 0.0\n", + "Content: foo --- Score: 0.0\n", + "Content: foo --- Score: 0.0\n" + ] + } + ], + "source": [ + "# limit the vector distance that can be returned\n", + "results = rds.similarity_search_with_score(\"foo\", k=5, distance_threshold=0.1)\n", + "for result in results:\n", + " print(f\"Content: {result[0].page_content} --- Score: {result[1]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Content: foo --- Similiarity: 1.0\n", + "Content: foo --- Similiarity: 1.0\n", + "Content: foo --- Similiarity: 1.0\n", + "Content: bar --- Similiarity: 0.8434\n", + "Content: bar --- Similiarity: 0.8434\n" + ] + } + ], + "source": [ + "# with scores\n", + "results = rds.similarity_search_with_relevance_scores(\"foo\", k=5)\n", + "for result in results:\n", + " print(f\"Content: {result[0].page_content} --- Similiarity: {result[1]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Content: foo --- Similarity: 1.0\n", + "Content: foo --- Similarity: 1.0\n", + "Content: foo --- Similarity: 1.0\n" + ] + } + ], + "source": [ + "# limit scores (similarities have to be over .9)\n", + "results = rds.similarity_search_with_relevance_scores(\"foo\", k=5, score_threshold=0.9)\n", + "for result in results:\n", + " print(f\"Content: {result[0].page_content} --- Similarity: {result[1]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['doc:users:b9c71d62a0a34241a37950b448dafd38']" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you can also add new documents as follows\n", + "new_document = [\"baz\"]\n", + "new_metadata = [{\n", + " \"user\": \"sam\",\n", + " \"age\": 50,\n", + " \"job\": \"janitor\",\n", + " \"credit_score\": \"high\"\n", + "}]\n", + "# both the document and metadata must be lists\n", + "rds.add_texts(new_document, new_metadata)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'id': 'doc:users:b9c71d62a0a34241a37950b448dafd38', 'user': 'sam', 'job': 'janitor', 'credit_score': 'high', 'age': '50'}\n" + ] + } + ], + "source": [ + "# now query the new document\n", + "results = rds.similarity_search(\"baz\", k=3)\n", + "print(results[0].metadata)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Connect to an Existing Index\n", + "\n", + "In order to have the same metadata indexed when using the ``Redis`` VectorStore. You will need to have the same ``index_schema`` passed in either as a path to a yaml file or as a dictionary. The following shows how to obtain the schema from an index and connect to an existing index." + ] + }, + { + "cell_type": "code", + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ - "texts = [d.page_content for d in docs]\n", - "metadatas = [d.metadata for d in docs]\n", + "# write the schema to a yaml file\n", + "rds.write_schema(\"redis_schema.yaml\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The schema file for this example should look something like:\n", + "\n", + "```yaml\n", + "numeric:\n", + "- name: age\n", + " no_index: false\n", + " sortable: false\n", + "text:\n", + "- name: user\n", + " no_index: false\n", + " no_stem: false\n", + " sortable: false\n", + " weight: 1\n", + " withsuffixtrie: false\n", + "- name: job\n", + " no_index: false\n", + " no_stem: false\n", + " sortable: false\n", + " weight: 1\n", + " withsuffixtrie: false\n", + "- name: credit_score\n", + " no_index: false\n", + " no_stem: false\n", + " sortable: false\n", + " weight: 1\n", + " withsuffixtrie: false\n", + "- name: content\n", + " no_index: false\n", + " no_stem: false\n", + " sortable: false\n", + " weight: 1\n", + " withsuffixtrie: false\n", + "vector:\n", + "- algorithm: FLAT\n", + " block_size: 1000\n", + " datatype: FLOAT32\n", + " dims: 1536\n", + " distance_metric: COSINE\n", + " initial_cap: 20000\n", + " name: content_vector\n", + "```\n", + "\n", + "**Notice**, this include **all** possible fields for the schema. You can remove any fields that you don't need." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'id': 'doc:users:8484c48a032d4c4cbe3cc2ed6845fabb', 'user': 'john', 'job': 'engineer', 'credit_score': 'high', 'age': '18'}\n" + ] + } + ], + "source": [ + "# now we can connect to our existing index as follows\n", + "\n", + "new_rds = Redis.from_existing_index(\n", + " embeddings,\n", + " index_name=\"users\",\n", + " redis_url=\"redis://localhost:6379\",\n", + " schema=\"redis_schema.yaml\"\n", + ")\n", + "results = new_rds.similarity_search(\"foo\", k=3)\n", + "print(results[0].metadata)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# see the schemas are the same\n", + "new_rds.schema == rds.schema" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Custom Metadata Indexing\n", + "\n", + "In some cases, you may want to control what fields the metadata maps to. For example, you may want the ``credit_score`` field to be a categorical field instead of a text field (which is the default behavior for all string fields). In this case, you can use the ``index_schema`` parameter in each of the initialization methods above to specify the schema for the index. Custom index schema can either be passed as a dictionary or as a path to a yaml file.\n", + "\n", + "All arguments in the schema have defaults besides the name, so you can specify only the fields you want to change. All the names correspond to the snake/lowercase versions of the arguments you would use on the command line with ``redis-cli`` or in ``redis-py``. For more on the arguments for each field, see the [documentation](https://redis.io/docs/interact/search-and-query/basic-constructs/field-and-type-options/)\n", + "\n", + "The below example shows how to specify the schema for the ``credit_score`` field as a Tag (categorical) field instead of a text field. \n", + "\n", + "```yaml\n", + "# index_schema.yml\n", + "tag:\n", + " - name: credit_score\n", + "text:\n", + " - name: user\n", + " - name: job\n", + "numeric:\n", + " - name: age\n", + "```\n", + "\n", + "In Python this would look like:\n", + "\n", + "```python\n", + "\n", + "index_schema = {\n", + " \"tag\": [{\"name\": \"credit_score\"}],\n", + " \"text\": [{\"name\": \"user\"}, {\"name\": \"job\"}],\n", + " \"numeric\": [{\"name\": \"age\"}],\n", + "}\n", + "\n", + "```\n", + "\n", + "Notice that only the ``name`` field needs to be specified. All other fields have defaults." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "`index_schema` does not match generated metadata schema.\n", + "If you meant to manually override the schema, please ignore this message.\n", + "index_schema: {'tag': [{'name': 'credit_score'}], 'text': [{'name': 'user'}, {'name': 'job'}], 'numeric': [{'name': 'age'}]}\n", + "generated_schema: {'text': [{'name': 'user'}, {'name': 'job'}, {'name': 'credit_score'}], 'numeric': [{'name': 'age'}], 'tag': []}\n", + "\n" + ] + } + ], + "source": [ + "# create a new index with the new schema defined above\n", + "index_schema = {\n", + " \"tag\": [{\"name\": \"credit_score\"}],\n", + " \"text\": [{\"name\": \"user\"}, {\"name\": \"job\"}],\n", + " \"numeric\": [{\"name\": \"age\"}],\n", + "}\n", "\n", "rds, keys = Redis.from_texts_return_keys(\n", - " texts, embeddings, redis_url=\"redis://localhost:6379\", index_name=\"link\"\n", - ")" + " texts,\n", + " embeddings,\n", + " metadatas=metadata,\n", + " redis_url=\"redis://localhost:6379\",\n", + " index_name=\"users_modified\",\n", + " index_schema=index_schema, # pass in the new index schema\n", + ")\n" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "rds.index_name" + "The above warning is meant to notify users when they are overriding the default behavior. Ignore it if you are intentionally overriding the behavior." ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "query = \"What did the president say about Ketanji Brown Jackson\"\n", - "results = rds.similarity_search(query)\n", - "print(results[0].page_content)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(rds.add_texts([\"Ankush went to Princeton\"]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "query = \"Princeton\"\n", - "results = rds.similarity_search(query)\n", - "print(results[0].page_content)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Load from existing index\n", - "rds = Redis.from_existing_index(\n", - " embeddings, redis_url=\"redis://localhost:6379\", index_name=\"link\"\n", - ")\n", + "## Hybrid Filtering\n", "\n", - "query = \"What did the president say about Ketanji Brown Jackson\"\n", - "results = rds.similarity_search(query)\n", - "print(results[0].page_content)" + "With the Redis Filter Expression language built into langchain, you can create arbitrarily long chains of hybrid filters\n", + "that can be used to filter your search results. The expression language is derived from the [RedisVL Expression Syntax](https://redisvl.com)\n", + "and is designed to be easy to use and understand.\n", + "\n", + "The following are the available filter types:\n", + "- ``RedisText``: Filter by full-text search against metadata fields. Supports exact, fuzzy, and wildcard matching.\n", + "- ``RedisNum``: Filter by numeric range against metadata fields.\n", + "- ``RedisTag``: Filter by exact match against string based categorical metadata fields. Multiple tags can be specified like \"tag1,tag2,tag3\".\n", + "\n", + "The following are examples of utilizing these filters.\n", + "\n", + "```python\n", + "\n", + "from langchain.vectorstores.redis import RedisText, RedisNum, RedisTag\n", + "\n", + "# exact matching\n", + "has_high_credit = RedisTag(\"credit_score\") == \"high\"\n", + "does_not_have_high_credit = RedisTag(\"credit_score\") != \"low\"\n", + "\n", + "# fuzzy matching\n", + "job_starts_with_eng = RedisText(\"job\") % \"eng*\"\n", + "job_is_engineer = RedisText(\"job\") == \"engineer\"\n", + "job_is_not_engineer = RedisText(\"job\") != \"engineer\"\n", + "\n", + "# numeric filtering\n", + "age_is_18 = RedisNum(\"age\") == 18\n", + "age_is_not_18 = RedisNum(\"age\") != 18\n", + "age_is_greater_than_18 = RedisNum(\"age\") > 18\n", + "age_is_less_than_18 = RedisNum(\"age\") < 18\n", + "age_is_greater_than_or_equal_to_18 = RedisNum(\"age\") >= 18\n", + "age_is_less_than_or_equal_to_18 = RedisNum(\"age\") <= 18\n", + "\n", + "```\n", + "\n", + "The ``RedisFilter`` class can be used to simplify the import of these filters as follows\n", + "\n", + "```python\n", + "\n", + "from langchain.vectorstores.redis import RedisFilter\n", + "\n", + "# same examples as above\n", + "has_high_credit = RedisFilter.tag(\"credit_score\") == \"high\"\n", + "does_not_have_high_credit = RedisFilter.num(\"age\") > 8\n", + "job_starts_with_eng = RedisFilter.text(\"job\") % \"eng*\"\n", + "```\n", + "\n", + "The following are examples of using hybrid filter for search" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Job: engineer\n", + "Engineers in the dataset: 2\n" + ] + } + ], + "source": [ + "from langchain.vectorstores.redis import RedisText\n", + "\n", + "is_engineer = RedisText(\"job\") == \"engineer\"\n", + "results = rds.similarity_search(\"foo\", k=3, filter=is_engineer)\n", + "\n", + "print(\"Job:\", results[0].metadata[\"job\"])\n", + "print(\"Engineers in the dataset:\", len(results))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Job: doctor\n", + "Job: doctor\n", + "Jobs in dataset that start with 'doc': 2\n" + ] + } + ], + "source": [ + "# fuzzy match\n", + "starts_with_doc = RedisText(\"job\") % \"doc*\"\n", + "results = rds.similarity_search(\"foo\", k=3, filter=starts_with_doc)\n", + "\n", + "for result in results:\n", + " print(\"Job:\", result.metadata[\"job\"])\n", + "print(\"Jobs in dataset that start with 'doc':\", len(results))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User: derrick is 45\n", + "User: nancy is 94\n", + "User: joe is 35\n" + ] + } + ], + "source": [ + "from langchain.vectorstores.redis import RedisNum\n", + "\n", + "is_over_18 = RedisNum(\"age\") > 18\n", + "is_under_99 = RedisNum(\"age\") < 99\n", + "age_range = is_over_18 & is_under_99\n", + "results = rds.similarity_search(\"foo\", filter=age_range)\n", + "\n", + "for result in results:\n", + " print(\"User:\", result.metadata[\"user\"], \"is\", result.metadata[\"age\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User: derrick is 45\n", + "User: nancy is 94\n", + "User: joe is 35\n" + ] + } + ], + "source": [ + "# make sure to use parenthesis around FilterExpressions\n", + "# if initializing them while constructing them\n", + "age_range = (RedisNum(\"age\") > 18) & (RedisNum(\"age\") < 99)\n", + "results = rds.similarity_search(\"foo\", filter=age_range)\n", + "\n", + "for result in results:\n", + " print(\"User:\", result.metadata[\"user\"], \"is\", result.metadata[\"age\"])" ] }, { @@ -196,46 +960,135 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Content: foo --- Score: 0.0\n", + "Content: foo --- Score: 0.0\n", + "Content: foo --- Score: 0.0\n" + ] + } + ], "source": [ - "retriever = rds.as_retriever()" + "query = \"foo\"\n", + "results = rds.similarity_search_with_score(query, k=3, return_metadata=True)\n", + "\n", + "for result in results:\n", + " print(\"Content:\", result[0].page_content, \" --- Score: \", result[1])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ - "docs = retriever.get_relevant_documents(query)" + "retriever = rds.as_retriever(search_type=\"similarity\", search_kwargs={\"k\": 4})" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='foo', metadata={'id': 'doc:users_modified:988ecca7574048e396756efc0e79aeca', 'user': 'john', 'job': 'engineer', 'credit_score': 'high', 'age': '18'}),\n", + " Document(page_content='foo', metadata={'id': 'doc:users_modified:009b1afeb4084cc6bdef858c7a99b48e', 'user': 'derrick', 'job': 'doctor', 'credit_score': 'low', 'age': '45'}),\n", + " Document(page_content='foo', metadata={'id': 'doc:users_modified:7087cee9be5b4eca93c30fbdd09a2731', 'user': 'nancy', 'job': 'doctor', 'credit_score': 'high', 'age': '94'}),\n", + " Document(page_content='bar', metadata={'id': 'doc:users_modified:01ef6caac12b42c28ad870aefe574253', 'user': 'tyler', 'job': 'engineer', 'credit_score': 'high', 'age': '100'})]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "docs = retriever.get_relevant_documents(query)\n", + "docs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can also use similarity_limit as a search method. This is only return documents if they are similar enough" + "There is also the `similarity_distance_threshold` retriever which allows the user to specify the vector distance" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ - "retriever = rds.as_retriever(search_type=\"similarity_limit\")" + "retriever = rds.as_retriever(search_type=\"similarity_distance_threshold\", search_kwargs={\"k\": 4, \"distance_threshold\": 0.1})" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='foo', metadata={'id': 'doc:users_modified:988ecca7574048e396756efc0e79aeca', 'user': 'john', 'job': 'engineer', 'credit_score': 'high', 'age': '18'}),\n", + " Document(page_content='foo', metadata={'id': 'doc:users_modified:009b1afeb4084cc6bdef858c7a99b48e', 'user': 'derrick', 'job': 'doctor', 'credit_score': 'low', 'age': '45'}),\n", + " Document(page_content='foo', metadata={'id': 'doc:users_modified:7087cee9be5b4eca93c30fbdd09a2731', 'user': 'nancy', 'job': 'doctor', 'credit_score': 'high', 'age': '94'})]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "docs = retriever.get_relevant_documents(query)\n", + "docs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, the ``similarity_score_threshold`` allows the user to define the minimum score for similar documents" + ] + }, + { + "cell_type": "code", + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ - "# Here we can see it doesn't return any results because there are no relevant documents\n", - "retriever.get_relevant_documents(\"where did ankush go to college?\")" + "retriever = rds.as_retriever(search_type=\"similarity_score_threshold\", search_kwargs={\"score_threshold\": 0.9, \"k\": 10})" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(page_content='foo', metadata={'id': 'doc:users_modified:988ecca7574048e396756efc0e79aeca', 'user': 'john', 'job': 'engineer', 'credit_score': 'high', 'age': '18'}),\n", + " Document(page_content='foo', metadata={'id': 'doc:users_modified:009b1afeb4084cc6bdef858c7a99b48e', 'user': 'derrick', 'job': 'doctor', 'credit_score': 'low', 'age': '45'}),\n", + " Document(page_content='foo', metadata={'id': 'doc:users_modified:7087cee9be5b4eca93c30fbdd09a2731', 'user': 'nancy', 'job': 'doctor', 'credit_score': 'high', 'age': '94'})]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "retriever.get_relevant_documents(\"foo\")" ] }, { @@ -254,15 +1107,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "Redis.delete(keys, redis_url=\"redis://localhost:6379\")" ] }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# delete the indices too\n", + "Redis.drop_index(index_name=\"users\", delete_documents=True, redis_url=\"redis://localhost:6379\")\n", + "Redis.drop_index(index_name=\"users_modified\", delete_documents=True, redis_url=\"redis://localhost:6379\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -280,7 +1166,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -322,7 +1208,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.8.13" } }, "nbformat": 4, diff --git a/libs/langchain/langchain/cache.py b/libs/langchain/langchain/cache.py index a78c06080..3160fbae6 100644 --- a/libs/langchain/langchain/cache.py +++ b/libs/langchain/langchain/cache.py @@ -33,6 +33,7 @@ from typing import ( Any, Callable, Dict, + List, Optional, Sequence, Tuple, @@ -302,6 +303,14 @@ class RedisSemanticCache(BaseCache): # TODO - implement a TTL policy in Redis + DEFAULT_SCHEMA = { + "content_key": "prompt", + "text": [ + {"name": "prompt"}, + ], + "extra": [{"name": "return_val"}, {"name": "llm_string"}], + } + def __init__( self, redis_url: str, embedding: Embeddings, score_threshold: float = 0.2 ): @@ -349,12 +358,14 @@ class RedisSemanticCache(BaseCache): embedding=self.embedding, index_name=index_name, redis_url=self.redis_url, + schema=cast(Dict, self.DEFAULT_SCHEMA), ) except ValueError: redis = RedisVectorstore( - embedding_function=self.embedding.embed_query, + embedding=self.embedding, index_name=index_name, redis_url=self.redis_url, + index_schema=cast(Dict, self.DEFAULT_SCHEMA), ) _embedding = self.embedding.embed_query(text="test") redis._create_index(dim=len(_embedding)) @@ -374,17 +385,18 @@ class RedisSemanticCache(BaseCache): def lookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: """Look up based on prompt and llm_string.""" llm_cache = self._get_llm_cache(llm_string) - generations = [] + generations: List = [] # Read from a Hash - results = llm_cache.similarity_search_limit_score( + results = llm_cache.similarity_search( query=prompt, k=1, - score_threshold=self.score_threshold, + distance_threshold=self.score_threshold, ) if results: for document in results: - for text in document.metadata["return_val"]: - generations.append(Generation(text=text)) + generations.extend( + _load_generations_from_json(document.metadata["return_val"]) + ) return generations if generations else None def update(self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE) -> None: @@ -402,11 +414,11 @@ class RedisSemanticCache(BaseCache): ) return llm_cache = self._get_llm_cache(llm_string) - # Write to vectorstore + _dump_generations_to_json([g for g in return_val]) metadata = { "llm_string": llm_string, "prompt": prompt, - "return_val": [generation.text for generation in return_val], + "return_val": _dump_generations_to_json([g for g in return_val]), } llm_cache.add_texts(texts=[prompt], metadatas=[metadata]) diff --git a/libs/langchain/langchain/memory/utils.py b/libs/langchain/langchain/memory/utils.py index 2706f1fc7..eafb48904 100644 --- a/libs/langchain/langchain/memory/utils.py +++ b/libs/langchain/langchain/memory/utils.py @@ -1,7 +1,5 @@ from typing import Any, Dict, List -from langchain.schema.messages import get_buffer_string # noqa: 401 - def get_prompt_input_key(inputs: Dict[str, Any], memory_variables: List[str]) -> str: """ diff --git a/libs/langchain/langchain/utilities/redis.py b/libs/langchain/langchain/utilities/redis.py index a9535c442..e6c5cb138 100644 --- a/libs/langchain/langchain/utilities/redis.py +++ b/libs/langchain/langchain/utilities/redis.py @@ -1,16 +1,64 @@ from __future__ import annotations import logging -from typing import ( - TYPE_CHECKING, - Any, -) +import re +from typing import TYPE_CHECKING, Any, List, Optional, Pattern from urllib.parse import urlparse +import numpy as np + +logger = logging.getLogger(__name__) + if TYPE_CHECKING: from redis.client import Redis as RedisType -logger = logging.getLogger(__name__) + +def _array_to_buffer(array: List[float], dtype: Any = np.float32) -> bytes: + return np.array(array).astype(dtype).tobytes() + + +class TokenEscaper: + """ + Escape punctuation within an input string. + """ + + # Characters that RediSearch requires us to escape during queries. + # Source: https://redis.io/docs/stack/search/reference/escaping/#the-rules-of-text-field-tokenization + DEFAULT_ESCAPED_CHARS = r"[,.<>{}\[\]\\\"\':;!@#$%^&*()\-+=~\/]" + + def __init__(self, escape_chars_re: Optional[Pattern] = None): + if escape_chars_re: + self.escaped_chars_re = escape_chars_re + else: + self.escaped_chars_re = re.compile(self.DEFAULT_ESCAPED_CHARS) + + def escape(self, value: str) -> str: + def escape_symbol(match: re.Match) -> str: + value = match.group(0) + return f"\\{value}" + + return self.escaped_chars_re.sub(escape_symbol, value) + + +def check_redis_module_exist(client: RedisType, required_modules: List[dict]) -> None: + """Check if the correct Redis modules are installed.""" + installed_modules = client.module_list() + installed_modules = { + module[b"name"].decode("utf-8"): module for module in installed_modules + } + for module in required_modules: + if module["name"] in installed_modules and int( + installed_modules[module["name"]][b"ver"] + ) >= int(module["ver"]): + return + # otherwise raise error + error_message = ( + "Redis cannot be used as a vector database without RediSearch >=2.4" + "Please head to https://redis.io/docs/stack/search/quick_start/" + "to know more about installing the RediSearch module within Redis Stack." + ) + logger.error(error_message) + raise ValueError(error_message) def get_client(redis_url: str, **kwargs: Any) -> RedisType: diff --git a/libs/langchain/langchain/vectorstores/redis.py b/libs/langchain/langchain/vectorstores/redis.py deleted file mode 100644 index 56429bea8..000000000 --- a/libs/langchain/langchain/vectorstores/redis.py +++ /dev/null @@ -1,664 +0,0 @@ -from __future__ import annotations - -import json -import logging -import uuid -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - Literal, - Mapping, - Optional, - Tuple, - Type, -) - -import numpy as np - -from langchain.callbacks.manager import ( - AsyncCallbackManagerForRetrieverRun, - CallbackManagerForRetrieverRun, -) -from langchain.docstore.document import Document -from langchain.embeddings.base import Embeddings -from langchain.pydantic_v1 import root_validator -from langchain.utilities.redis import get_client -from langchain.utils import get_from_dict_or_env -from langchain.vectorstores.base import VectorStore, VectorStoreRetriever - -logger = logging.getLogger(__name__) - -if TYPE_CHECKING: - from redis.client import Redis as RedisType - from redis.commands.search.query import Query - - -# required modules -REDIS_REQUIRED_MODULES = [ - {"name": "search", "ver": 20400}, - {"name": "searchlight", "ver": 20400}, -] - -# distance mmetrics -REDIS_DISTANCE_METRICS = Literal["COSINE", "IP", "L2"] - - -def _check_redis_module_exist(client: RedisType, required_modules: List[dict]) -> None: - """Check if the correct Redis modules are installed.""" - installed_modules = client.module_list() - installed_modules = { - module[b"name"].decode("utf-8"): module for module in installed_modules - } - for module in required_modules: - if module["name"] in installed_modules and int( - installed_modules[module["name"]][b"ver"] - ) >= int(module["ver"]): - return - # otherwise raise error - error_message = ( - "Redis cannot be used as a vector database without RediSearch >=2.4" - "Please head to https://redis.io/docs/stack/search/quick_start/" - "to know more about installing the RediSearch module within Redis Stack." - ) - logger.error(error_message) - raise ValueError(error_message) - - -def _check_index_exists(client: RedisType, index_name: str) -> bool: - """Check if Redis index exists.""" - try: - client.ft(index_name).info() - except: # noqa: E722 - logger.info("Index does not exist") - return False - logger.info("Index already exists") - return True - - -def _redis_key(prefix: str) -> str: - """Redis key schema for a given prefix.""" - return f"{prefix}:{uuid.uuid4().hex}" - - -def _redis_prefix(index_name: str) -> str: - """Redis key prefix for a given index.""" - return f"doc:{index_name}" - - -def _default_relevance_score(val: float) -> float: - return 1 - val - - -class Redis(VectorStore): - """`Redis` vector store. - - To use, you should have the ``redis`` python package installed. - - Example: - .. code-block:: python - - from langchain.vectorstores import Redis - from langchain.embeddings import OpenAIEmbeddings - - embeddings = OpenAIEmbeddings() - vectorstore = Redis( - redis_url="redis://username:password@localhost:6379" - index_name="my-index", - embedding_function=embeddings.embed_query, - ) - - To use a redis replication setup with multiple redis server and redis sentinels - set "redis_url" to "redis+sentinel://" scheme. With this url format a path is - needed holding the name of the redis service within the sentinels to get the - correct redis server connection. The default service name is "mymaster". - - An optional username or password is used for booth connections to the rediserver - and the sentinel, different passwords for server and sentinel are not supported. - And as another constraint only one sentinel instance can be given: - - Example: - .. code-block:: python - - vectorstore = Redis( - redis_url="redis+sentinel://username:password@sentinelhost:26379/mymaster/0" - index_name="my-index", - embedding_function=embeddings.embed_query, - ) - """ - - def __init__( - self, - redis_url: str, - index_name: str, - embedding_function: Callable, - content_key: str = "content", - metadata_key: str = "metadata", - vector_key: str = "content_vector", - relevance_score_fn: Optional[Callable[[float], float]] = None, - distance_metric: REDIS_DISTANCE_METRICS = "COSINE", - **kwargs: Any, - ): - """Initialize with necessary components.""" - self.embedding_function = embedding_function - self.index_name = index_name - try: - redis_client = get_client(redis_url=redis_url, **kwargs) - # check if redis has redisearch module installed - _check_redis_module_exist(redis_client, REDIS_REQUIRED_MODULES) - except ValueError as e: - raise ValueError(f"Redis failed to connect: {e}") - - self.client = redis_client - self.content_key = content_key - self.metadata_key = metadata_key - self.vector_key = vector_key - self.distance_metric = distance_metric - self.relevance_score_fn = relevance_score_fn - - @property - def embeddings(self) -> Optional[Embeddings]: - # TODO: Accept embedding object directly - return None - - def _select_relevance_score_fn(self) -> Callable[[float], float]: - if self.relevance_score_fn: - return self.relevance_score_fn - - if self.distance_metric == "COSINE": - return self._cosine_relevance_score_fn - elif self.distance_metric == "IP": - return self._max_inner_product_relevance_score_fn - elif self.distance_metric == "L2": - return self._euclidean_relevance_score_fn - else: - return _default_relevance_score - - def _create_index(self, dim: int = 1536) -> None: - try: - from redis.commands.search.field import TextField, VectorField - from redis.commands.search.indexDefinition import IndexDefinition, IndexType - except ImportError: - raise ImportError( - "Could not import redis python package. " - "Please install it with `pip install redis`." - ) - - # Check if index exists - if not _check_index_exists(self.client, self.index_name): - # Define schema - schema = ( - TextField(name=self.content_key), - TextField(name=self.metadata_key), - VectorField( - self.vector_key, - "FLAT", - { - "TYPE": "FLOAT32", - "DIM": dim, - "DISTANCE_METRIC": self.distance_metric, - }, - ), - ) - prefix = _redis_prefix(self.index_name) - - # Create Redis Index - self.client.ft(self.index_name).create_index( - fields=schema, - definition=IndexDefinition(prefix=[prefix], index_type=IndexType.HASH), - ) - - def add_texts( - self, - texts: Iterable[str], - metadatas: Optional[List[dict]] = None, - embeddings: Optional[List[List[float]]] = None, - batch_size: int = 1000, - **kwargs: Any, - ) -> List[str]: - """Add more texts to the vectorstore. - - Args: - texts (Iterable[str]): Iterable of strings/text to add to the vectorstore. - metadatas (Optional[List[dict]], optional): Optional list of metadatas. - Defaults to None. - embeddings (Optional[List[List[float]]], optional): Optional pre-generated - embeddings. Defaults to None. - keys (List[str]) or ids (List[str]): Identifiers of entries. - Defaults to None. - batch_size (int, optional): Batch size to use for writes. Defaults to 1000. - - Returns: - List[str]: List of ids added to the vectorstore - """ - ids = [] - prefix = _redis_prefix(self.index_name) - - # Get keys or ids from kwargs - # Other vectorstores use ids - keys_or_ids = kwargs.get("keys", kwargs.get("ids")) - - # Write data to redis - pipeline = self.client.pipeline(transaction=False) - for i, text in enumerate(texts): - # Use provided values by default or fallback - key = keys_or_ids[i] if keys_or_ids else _redis_key(prefix) - metadata = metadatas[i] if metadatas else {} - embedding = embeddings[i] if embeddings else self.embedding_function(text) - pipeline.hset( - key, - mapping={ - self.content_key: text, - self.vector_key: np.array(embedding, dtype=np.float32).tobytes(), - self.metadata_key: json.dumps(metadata), - }, - ) - ids.append(key) - - # Write batch - if i % batch_size == 0: - pipeline.execute() - - # Cleanup final batch - pipeline.execute() - return ids - - def similarity_search( - self, query: str, k: int = 4, **kwargs: Any - ) -> List[Document]: - """ - Returns the most similar indexed documents to the query text. - - Args: - query (str): The query text for which to find similar documents. - k (int): The number of documents to return. Default is 4. - - Returns: - List[Document]: A list of documents that are most similar to the query text. - """ - docs_and_scores = self.similarity_search_with_score(query, k=k) - return [doc for doc, _ in docs_and_scores] - - def similarity_search_limit_score( - self, query: str, k: int = 4, score_threshold: float = 0.2, **kwargs: Any - ) -> List[Document]: - """ - Returns the most similar indexed documents to the query text within the - score_threshold range. - - Args: - query (str): The query text for which to find similar documents. - k (int): The number of documents to return. Default is 4. - score_threshold (float): The minimum matching score required for a document - to be considered a match. Defaults to 0.2. - Because the similarity calculation algorithm is based on cosine - similarity, the smaller the angle, the higher the similarity. - - Returns: - List[Document]: A list of documents that are most similar to the query text, - including the match score for each document. - - Note: - If there are no documents that satisfy the score_threshold value, - an empty list is returned. - - """ - docs_and_scores = self.similarity_search_with_score(query, k=k) - return [doc for doc, score in docs_and_scores if score < score_threshold] - - def _prepare_query(self, k: int) -> Query: - try: - from redis.commands.search.query import Query - except ImportError: - raise ValueError( - "Could not import redis python package. " - "Please install it with `pip install redis`." - ) - # Prepare the Query - hybrid_fields = "*" - base_query = ( - f"{hybrid_fields}=>[KNN {k} @{self.vector_key} $vector AS vector_score]" - ) - return_fields = [self.metadata_key, self.content_key, "vector_score", "id"] - return ( - Query(base_query) - .return_fields(*return_fields) - .sort_by("vector_score") - .paging(0, k) - .dialect(2) - ) - - def similarity_search_with_score( - self, query: str, k: int = 4 - ) -> List[Tuple[Document, float]]: - """Return docs most similar to query. - - Args: - query: Text to look up documents similar to. - k: Number of Documents to return. Defaults to 4. - - Returns: - List of Documents most similar to the query and score for each - """ - # Creates embedding vector from user query - embedding = self.embedding_function(query) - - # Creates Redis query - redis_query = self._prepare_query(k) - - params_dict: Mapping[str, str] = { - "vector": np.array(embedding) # type: ignore - .astype(dtype=np.float32) - .tobytes() - } - - # Perform vector search - results = self.client.ft(self.index_name).search(redis_query, params_dict) - - # Prepare document results - docs_and_scores: List[Tuple[Document, float]] = [] - for result in results.docs: - metadata = {**json.loads(result.metadata), "id": result.id} - doc = Document(page_content=result.content, metadata=metadata) - docs_and_scores.append((doc, float(result.vector_score))) - return docs_and_scores - - @classmethod - def from_texts_return_keys( - cls, - texts: List[str], - embedding: Embeddings, - metadatas: Optional[List[dict]] = None, - index_name: Optional[str] = None, - content_key: str = "content", - metadata_key: str = "metadata", - vector_key: str = "content_vector", - distance_metric: REDIS_DISTANCE_METRICS = "COSINE", - **kwargs: Any, - ) -> Tuple[Redis, List[str]]: - """Create a Redis vectorstore from raw documents. - This is a user-friendly interface that: - 1. Embeds documents. - 2. Creates a new index for the embeddings in Redis. - 3. Adds the documents to the newly created Redis index. - 4. Returns the keys of the newly created documents. - - This is intended to be a quick way to get started. - - Example: - .. code-block:: python - - from langchain.vectorstores import Redis - from langchain.embeddings import OpenAIEmbeddings - embeddings = OpenAIEmbeddings() - redisearch, keys = RediSearch.from_texts_return_keys( - texts, - embeddings, - redis_url="redis://username:password@localhost:6379" - ) - """ - redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") - - if "redis_url" in kwargs: - kwargs.pop("redis_url") - - # Name of the search index if not given - if not index_name: - index_name = uuid.uuid4().hex - - # Create instance - instance = cls( - redis_url, - index_name, - embedding.embed_query, - content_key=content_key, - metadata_key=metadata_key, - vector_key=vector_key, - distance_metric=distance_metric, - **kwargs, - ) - - # Create embeddings over documents - embeddings = embedding.embed_documents(texts) - - # Create the search index - instance._create_index(dim=len(embeddings[0])) - - # Add data to Redis - keys = instance.add_texts(texts, metadatas, embeddings) - return instance, keys - - @classmethod - def from_texts( - cls: Type[Redis], - texts: List[str], - embedding: Embeddings, - metadatas: Optional[List[dict]] = None, - index_name: Optional[str] = None, - content_key: str = "content", - metadata_key: str = "metadata", - vector_key: str = "content_vector", - **kwargs: Any, - ) -> Redis: - """Create a Redis vectorstore from raw documents. - This is a user-friendly interface that: - 1. Embeds documents. - 2. Creates a new index for the embeddings in Redis. - 3. Adds the documents to the newly created Redis index. - - This is intended to be a quick way to get started. - - Example: - .. code-block:: python - - from langchain.vectorstores import Redis - from langchain.embeddings import OpenAIEmbeddings - embeddings = OpenAIEmbeddings() - redisearch = RediSearch.from_texts( - texts, - embeddings, - redis_url="redis://username:password@localhost:6379" - ) - """ - instance, _ = cls.from_texts_return_keys( - texts, - embedding, - metadatas=metadatas, - index_name=index_name, - content_key=content_key, - metadata_key=metadata_key, - vector_key=vector_key, - **kwargs, - ) - return instance - - @staticmethod - def delete( - ids: Optional[List[str]] = None, - **kwargs: Any, - ) -> bool: - """ - Delete a Redis entry. - - Args: - ids: List of ids (keys) to delete. - - Returns: - bool: Whether or not the deletions were successful. - """ - redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") - - if ids is None: - raise ValueError("'ids' (keys)() were not provided.") - - try: - import redis # noqa: F401 - except ImportError: - raise ValueError( - "Could not import redis python package. " - "Please install it with `pip install redis`." - ) - try: - # We need to first remove redis_url from kwargs, - # otherwise passing it to Redis will result in an error. - if "redis_url" in kwargs: - kwargs.pop("redis_url") - client = get_client(redis_url=redis_url, **kwargs) - except ValueError as e: - raise ValueError(f"Your redis connected error: {e}") - # Check if index exists - try: - client.delete(*ids) - logger.info("Entries deleted") - return True - except: # noqa: E722 - # ids does not exist - return False - - @staticmethod - def drop_index( - index_name: str, - delete_documents: bool, - **kwargs: Any, - ) -> bool: - """ - Drop a Redis search index. - - Args: - index_name (str): Name of the index to drop. - delete_documents (bool): Whether to drop the associated documents. - - Returns: - bool: Whether or not the drop was successful. - """ - redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") - try: - import redis # noqa: F401 - except ImportError: - raise ValueError( - "Could not import redis python package. " - "Please install it with `pip install redis`." - ) - try: - # We need to first remove redis_url from kwargs, - # otherwise passing it to Redis will result in an error. - if "redis_url" in kwargs: - kwargs.pop("redis_url") - client = get_client(redis_url=redis_url, **kwargs) - except ValueError as e: - raise ValueError(f"Your redis connected error: {e}") - # Check if index exists - try: - client.ft(index_name).dropindex(delete_documents) - logger.info("Drop index") - return True - except: # noqa: E722 - # Index not exist - return False - - @classmethod - def from_existing_index( - cls, - embedding: Embeddings, - index_name: str, - content_key: str = "content", - metadata_key: str = "metadata", - vector_key: str = "content_vector", - **kwargs: Any, - ) -> Redis: - """Connect to an existing Redis index.""" - redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") - try: - import redis # noqa: F401 - except ImportError: - raise ValueError( - "Could not import redis python package. " - "Please install it with `pip install redis`." - ) - try: - # We need to first remove redis_url from kwargs, - # otherwise passing it to Redis will result in an error. - if "redis_url" in kwargs: - kwargs.pop("redis_url") - client = get_client(redis_url=redis_url, **kwargs) - # check if redis has redisearch module installed - _check_redis_module_exist(client, REDIS_REQUIRED_MODULES) - # ensure that the index already exists - assert _check_index_exists( - client, index_name - ), f"Index {index_name} does not exist" - except Exception as e: - raise ValueError(f"Redis failed to connect: {e}") - - return cls( - redis_url, - index_name, - embedding.embed_query, - content_key=content_key, - metadata_key=metadata_key, - vector_key=vector_key, - **kwargs, - ) - - def as_retriever(self, **kwargs: Any) -> RedisVectorStoreRetriever: - tags = kwargs.pop("tags", None) or [] - tags.extend(self._get_retriever_tags()) - return RedisVectorStoreRetriever(vectorstore=self, **kwargs, tags=tags) - - -class RedisVectorStoreRetriever(VectorStoreRetriever): - """Retriever for `Redis` vector store.""" - - vectorstore: Redis - """Redis VectorStore.""" - search_type: str = "similarity" - """Type of search to perform. Can be either 'similarity' or 'similarity_limit'.""" - k: int = 4 - """Number of documents to return.""" - score_threshold: float = 0.4 - """Score threshold for similarity_limit search.""" - - class Config: - """Configuration for this pydantic object.""" - - arbitrary_types_allowed = True - - @root_validator() - def validate_search_type(cls, values: Dict) -> Dict: - """Validate search type.""" - if "search_type" in values: - search_type = values["search_type"] - if search_type not in ("similarity", "similarity_limit"): - raise ValueError(f"search_type of {search_type} not allowed.") - return values - - def _get_relevant_documents( - self, query: str, *, run_manager: CallbackManagerForRetrieverRun - ) -> List[Document]: - if self.search_type == "similarity": - docs = self.vectorstore.similarity_search(query, k=self.k) - elif self.search_type == "similarity_limit": - docs = self.vectorstore.similarity_search_limit_score( - query, k=self.k, score_threshold=self.score_threshold - ) - else: - raise ValueError(f"search_type of {self.search_type} not allowed.") - return docs - - async def _aget_relevant_documents( - self, query: str, *, run_manager: AsyncCallbackManagerForRetrieverRun - ) -> List[Document]: - raise NotImplementedError("RedisVectorStoreRetriever does not support async") - - def add_documents(self, documents: List[Document], **kwargs: Any) -> List[str]: - """Add documents to vectorstore.""" - return self.vectorstore.add_documents(documents, **kwargs) - - async def aadd_documents( - self, documents: List[Document], **kwargs: Any - ) -> List[str]: - """Add documents to vectorstore.""" - return await self.vectorstore.aadd_documents(documents, **kwargs) diff --git a/libs/langchain/langchain/vectorstores/redis/__init__.py b/libs/langchain/langchain/vectorstores/redis/__init__.py new file mode 100644 index 000000000..6f05acb4a --- /dev/null +++ b/libs/langchain/langchain/vectorstores/redis/__init__.py @@ -0,0 +1,9 @@ +from .base import Redis +from .filters import ( + RedisFilter, + RedisNum, + RedisTag, + RedisText, +) + +__all__ = ["Redis", "RedisFilter", "RedisTag", "RedisText", "RedisNum"] diff --git a/libs/langchain/langchain/vectorstores/redis/base.py b/libs/langchain/langchain/vectorstores/redis/base.py new file mode 100644 index 000000000..f3e966d3c --- /dev/null +++ b/libs/langchain/langchain/vectorstores/redis/base.py @@ -0,0 +1,1361 @@ +"""Wrapper around Redis vector database.""" + +from __future__ import annotations + +import logging +import os +import uuid +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + Mapping, + Optional, + Tuple, + Type, + Union, +) + +import yaml + +from langchain._api import deprecated +from langchain.callbacks.manager import ( + AsyncCallbackManagerForRetrieverRun, + CallbackManagerForRetrieverRun, +) +from langchain.docstore.document import Document +from langchain.embeddings.base import Embeddings +from langchain.utilities.redis import ( + _array_to_buffer, + check_redis_module_exist, + get_client, +) +from langchain.utils import get_from_dict_or_env +from langchain.vectorstores.base import VectorStore, VectorStoreRetriever +from langchain.vectorstores.redis.constants import ( + REDIS_REQUIRED_MODULES, + REDIS_TAG_SEPARATOR, +) + +logger = logging.getLogger(__name__) + +if TYPE_CHECKING: + from redis.client import Redis as RedisType + from redis.commands.search.query import Query + + from langchain.vectorstores.redis.filters import RedisFilterExpression + from langchain.vectorstores.redis.schema import RedisModel + + +def _redis_key(prefix: str) -> str: + """Redis key schema for a given prefix.""" + return f"{prefix}:{uuid.uuid4().hex}" + + +def _redis_prefix(index_name: str) -> str: + """Redis key prefix for a given index.""" + return f"doc:{index_name}" + + +def _default_relevance_score(val: float) -> float: + return 1 - val + + +def check_index_exists(client: RedisType, index_name: str) -> bool: + """Check if Redis index exists.""" + try: + client.ft(index_name).info() + except: # noqa: E722 + logger.info("Index does not exist") + return False + logger.info("Index already exists") + return True + + +class Redis(VectorStore): + """Wrapper around Redis vector database. + + To use, you should have the ``redis`` python package installed + and have a running Redis Enterprise or Redis-Stack server + + For production use cases, it is recommended to use Redis Enterprise + as the scaling, performance, stability and availability is much + better than Redis-Stack. + + For testing and prototyping, however, this is not required. + Redis-Stack is available as a docker container the full vector + search API available. + + .. code-block:: bash + # to run redis stack in docker locally + docker run -d -p 6379:6379 -p 8001:8001 redis/redis-stack:latest + + Once running, you can connect to the redis server with the following url schemas: + - redis://: # simple connection + - redis://:@: # connection with authentication + - rediss://: # connection with SSL + - rediss://:@: # connection with SSL and auth + + + Examples: + + The following examples show various ways to use the Redis VectorStore with + LangChain. + + For all the following examples assume we have the following imports: + + .. code-block:: python + + from langchain.vectorstores import Redis + from langchain.embeddings import OpenAIEmbeddings + + Initialize, create index, and load Documents + .. code-block:: python + + from langchain.vectorstores import Redis + from langchain.embeddings import OpenAIEmbeddings + + rds = Redis.from_documents( + documents, # a list of Document objects from loaders or created + embeddings, # an Embeddings object + redis_url="redis://localhost:6379", + ) + + Initialize, create index, and load Documents with metadata + .. code-block:: python + + + rds = Redis.from_texts( + texts, # a list of strings + metadata, # a list of metadata dicts + embeddings, # an Embeddings object + redis_url="redis://localhost:6379", + ) + + Initialize, create index, and load Documents with metadata and return keys + + .. code-block:: python + + rds, keys = Redis.from_texts_return_keys( + texts, # a list of strings + metadata, # a list of metadata dicts + embeddings, # an Embeddings object + redis_url="redis://localhost:6379", + ) + + For use cases where the index needs to stay alive, you can initialize + with an index name such that it's easier to reference later + + .. code-block:: python + + rds = Redis.from_texts( + texts, # a list of strings + metadata, # a list of metadata dicts + embeddings, # an Embeddings object + index_name="my-index", + redis_url="redis://localhost:6379", + ) + + Initialize and connect to an existing index (from above) + + .. code-block:: python + + rds = Redis.from_existing_index( + embeddings, # an Embeddings object + index_name="my-index", + redis_url="redis://localhost:6379", + ) + + + Advanced examples: + + Custom vector schema can be supplied to change the way that + Redis creates the underlying vector schema. This is useful + for production use cases where you want to optimize the + vector schema for your use case. ex. using HNSW instead of + FLAT (knn) which is the default + + .. code-block:: python + + vector_schema = { + "algorithm": "HNSW" + } + + rds = Redis.from_texts( + texts, # a list of strings + metadata, # a list of metadata dicts + embeddings, # an Embeddings object + vector_schema=vector_schema, + redis_url="redis://localhost:6379", + ) + + Custom index schema can be supplied to change the way that the + metadata is indexed. This is useful for you would like to use the + hybrid querying (filtering) capability of Redis. + + By default, this implementation will automatically generate the index + schema according to the following rules: + - All strings are indexed as text fields + - All numbers are indexed as numeric fields + - All lists of strings are indexed as tag fields (joined by + langchain.vectorstores.redis.constants.REDIS_TAG_SEPARATOR) + - All None values are not indexed but still stored in Redis these are + not retrievable through the interface here, but the raw Redis client + can be used to retrieve them. + - All other types are not indexed + + To override these rules, you can pass in a custom index schema like the following + + .. code-block:: yaml + + tag: + - name: credit_score + text: + - name: user + - name: job + + Typically, the ``credit_score`` field would be a text field since it's a string, + however, we can override this behavior by specifying the field type as shown with + the yaml config (can also be a dictionary) above and the code below. + + .. code-block:: python + + rds = Redis.from_texts( + texts, # a list of strings + metadata, # a list of metadata dicts + embeddings, # an Embeddings object + index_schema="path/to/index_schema.yaml", # can also be a dictionary + redis_url="redis://localhost:6379", + ) + + When connecting to an existing index where a custom schema has been applied, it's + important to pass in the same schema to the ``from_existing_index`` method. + Otherwise, the schema for newly added samples will be incorrect and metadata + will not be returned. + + """ + + DEFAULT_VECTOR_SCHEMA = { + "name": "content_vector", + "algorithm": "FLAT", + "dims": 1536, + "distance_metric": "COSINE", + "datatype": "FLOAT32", + } + + def __init__( + self, + redis_url: str, + index_name: str, + embedding: Embeddings, + index_schema: Optional[Union[Dict[str, str], str, os.PathLike]] = None, + vector_schema: Optional[Dict[str, Union[str, int]]] = None, + relevance_score_fn: Optional[Callable[[float], float]] = None, + **kwargs: Any, + ): + """Initialize with necessary components.""" + self._check_deprecated_kwargs(kwargs) + try: + # TODO use importlib to check if redis is installed + import redis # noqa: F401 + + except ImportError as e: + raise ImportError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) from e + + self.index_name = index_name + self._embeddings = embedding + try: + redis_client = get_client(redis_url=redis_url, **kwargs) + # check if redis has redisearch module installed + check_redis_module_exist(redis_client, REDIS_REQUIRED_MODULES) + except ValueError as e: + raise ValueError(f"Redis failed to connect: {e}") + + self.client = redis_client + self.relevance_score_fn = relevance_score_fn + self._schema = self._get_schema_with_defaults(index_schema, vector_schema) + + @property + def embeddings(self) -> Optional[Embeddings]: + """Access the query embedding object if available.""" + return self._embeddings + + @classmethod + def from_texts_return_keys( + cls, + texts: List[str], + embedding: Embeddings, + metadatas: Optional[List[dict]] = None, + index_name: Optional[str] = None, + index_schema: Optional[Union[Dict[str, str], str, os.PathLike]] = None, + vector_schema: Optional[Dict[str, Union[str, int]]] = None, + **kwargs: Any, + ) -> Tuple[Redis, List[str]]: + """Create a Redis vectorstore from raw documents. + + This is a user-friendly interface that: + 1. Embeds documents. + 2. Creates a new Redis index if it doesn't already exist + 3. Adds the documents to the newly created Redis index. + 4. Returns the keys of the newly created documents once stored. + + This method will generate schema based on the metadata passed in + if the `index_schema` is not defined. If the `index_schema` is defined, + it will compare against the generated schema and warn if there are + differences. If you are purposefully defining the schema for the + metadata, then you can ignore that warning. + + To examine the schema options, initialize an instance of this class + and print out the schema using the `Redis.schema`` property. This + will include the content and content_vector classes which are + always present in the langchain schema. + + Example: + .. code-block:: python + + from langchain.vectorstores import Redis + from langchain.embeddings import OpenAIEmbeddings + embeddings = OpenAIEmbeddings() + redis, keys = Redis.from_texts_return_keys( + texts, + embeddings, + redis_url="redis://localhost:6379" + ) + + Args: + texts (List[str]): List of texts to add to the vectorstore. + embedding (Embeddings): Embeddings to use for the vectorstore. + metadatas (Optional[List[dict]], optional): Optional list of metadata + dicts to add to the vectorstore. Defaults to None. + index_name (Optional[str], optional): Optional name of the index to + create or add to. Defaults to None. + index_schema (Optional[Union[Dict[str, str], str, os.PathLike]], optional): + Optional fields to index within the metadata. Overrides generated + schema. Defaults to None. + vector_schema (Optional[Dict[str, Union[str, int]]], optional): Optional + vector schema to use. Defaults to None. + **kwargs (Any): Additional keyword arguments to pass to the Redis client. + + Returns: + Tuple[Redis, List[str]]: Tuple of the Redis instance and the keys of + the newly created documents. + + Raises: + ValueError: If the number of metadatas does not match the number of texts. + """ + try: + # TODO use importlib to check if redis is installed + import redis # noqa: F401 + + from langchain.vectorstores.redis.schema import read_schema + + except ImportError as e: + raise ImportError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) from e + + redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") + + if "redis_url" in kwargs: + kwargs.pop("redis_url") + + # flag to use generated schema + if "generate" in kwargs: + kwargs.pop("generate") + + # Name of the search index if not given + if not index_name: + index_name = uuid.uuid4().hex + + # type check for metadata + if metadatas: + if isinstance(metadatas, list) and len(metadatas) != len(texts): # type: ignore # noqa: E501 + raise ValueError("Number of metadatas must match number of texts") + if not (isinstance(metadatas, list) and isinstance(metadatas[0], dict)): + raise ValueError("Metadatas must be a list of dicts") + + generated_schema = _generate_field_schema(metadatas[0]) + if index_schema: + # read in the schema solely to compare to the generated schema + user_schema = read_schema(index_schema) + + # the very rare case where a super user decides to pass the index + # schema and a document loader is used that has metadata which + # we need to map into fields. + if user_schema != generated_schema: + logger.warning( + "`index_schema` does not match generated metadata schema.\n" + + "If you meant to manually override the schema, please " + + "ignore this message.\n" + + f"index_schema: {user_schema}\n" + + f"generated_schema: {generated_schema}\n" + ) + else: + # use the generated schema + index_schema = generated_schema + + # Create instance + instance = cls( + redis_url, + index_name, + embedding, + index_schema=index_schema, + vector_schema=vector_schema, + **kwargs, + ) + + # Create embeddings over documents + embeddings = embedding.embed_documents(texts) + + # Create the search index + instance._create_index(dim=len(embeddings[0])) + + # Add data to Redis + keys = instance.add_texts(texts, metadatas, embeddings) + return instance, keys + + @classmethod + def from_texts( + cls: Type[Redis], + texts: List[str], + embedding: Embeddings, + metadatas: Optional[List[dict]] = None, + index_name: Optional[str] = None, + index_schema: Optional[Union[Dict[str, str], str, os.PathLike]] = None, + vector_schema: Optional[Dict[str, Union[str, int]]] = None, + **kwargs: Any, + ) -> Redis: + """Create a Redis vectorstore from a list of texts. + + This is a user-friendly interface that: + 1. Embeds documents. + 2. Creates a new Redis index if it doesn't already exist + 3. Adds the documents to the newly created Redis index. + + This method will generate schema based on the metadata passed in + if the `index_schema` is not defined. If the `index_schema` is defined, + it will compare against the generated schema and warn if there are + differences. If you are purposefully defining the schema for the + metadata, then you can ignore that warning. + + To examine the schema options, initialize an instance of this class + and print out the schema using the `Redis.schema`` property. This + will include the content and content_vector classes which are + always present in the langchain schema. + + + Example: + .. code-block:: python + + from langchain.vectorstores import Redis + from langchain.embeddings import OpenAIEmbeddings + embeddings = OpenAIEmbeddings() + redisearch = RediSearch.from_texts( + texts, + embeddings, + redis_url="redis://username:password@localhost:6379" + ) + + Args: + texts (List[str]): List of texts to add to the vectorstore. + embedding (Embeddings): Embedding model class (i.e. OpenAIEmbeddings) + for embedding queries. + metadatas (Optional[List[dict]], optional): Optional list of metadata dicts + to add to the vectorstore. Defaults to None. + index_name (Optional[str], optional): Optional name of the index to create + or add to. Defaults to None. + index_schema (Optional[Union[Dict[str, str], str, os.PathLike]], optional): + Optional fields to index within the metadata. Overrides generated + schema. Defaults to None. + vector_schema (Optional[Dict[str, Union[str, int]]], optional): Optional + vector schema to use. Defaults to None. + **kwargs (Any): Additional keyword arguments to pass to the Redis client. + + Returns: + Redis: Redis VectorStore instance. + + Raises: + ValueError: If the number of metadatas does not match the number of texts. + ImportError: If the redis python package is not installed. + """ + instance, _ = cls.from_texts_return_keys( + texts, + embedding, + metadatas=metadatas, + index_name=index_name, + index_schema=index_schema, + vector_schema=vector_schema, + **kwargs, + ) + return instance + + @classmethod + def from_existing_index( + cls, + embedding: Embeddings, + index_name: str, + schema: Union[Dict[str, str], str, os.PathLike], + **kwargs: Any, + ) -> Redis: + """Connect to an existing Redis index. + + Example: + .. code-block:: python + + from langchain.vectorstores import Redis + from langchain.embeddings import OpenAIEmbeddings + embeddings = OpenAIEmbeddings() + redisearch = Redis.from_existing_index( + embeddings, + index_name="my-index", + redis_url="redis://username:password@localhost:6379" + ) + + Args: + embedding (Embeddings): Embedding model class (i.e. OpenAIEmbeddings) + for embedding queries. + index_name (str): Name of the index to connect to. + schema (Union[Dict[str, str], str, os.PathLike]): Schema of the index + and the vector schema. Can be a dict, or path to yaml file + + **kwargs (Any): Additional keyword arguments to pass to the Redis client. + + Returns: + Redis: Redis VectorStore instance. + + Raises: + ValueError: If the index does not exist. + ImportError: If the redis python package is not installed. + """ + redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") + try: + # We need to first remove redis_url from kwargs, + # otherwise passing it to Redis will result in an error. + if "redis_url" in kwargs: + kwargs.pop("redis_url") + client = get_client(redis_url=redis_url, **kwargs) + # check if redis has redisearch module installed + check_redis_module_exist(client, REDIS_REQUIRED_MODULES) + # ensure that the index already exists + assert check_index_exists( + client, index_name + ), f"Index {index_name} does not exist" + except Exception as e: + raise ValueError(f"Redis failed to connect: {e}") + + return cls( + redis_url, + index_name, + embedding, + index_schema=schema, + **kwargs, + ) + + @property + def schema(self) -> Dict[str, List[Any]]: + """Return the schema of the index.""" + return self._schema.as_dict() + + def write_schema(self, path: Union[str, os.PathLike]) -> None: + """Write the schema to a yaml file.""" + with open(path, "w+") as f: + yaml.dump(self.schema, f) + + @staticmethod + def delete( + ids: Optional[List[str]] = None, + **kwargs: Any, + ) -> bool: + """ + Delete a Redis entry. + + Args: + ids: List of ids (keys in redis) to delete. + redis_url: Redis connection url. This should be passed in the kwargs + or set as an environment variable: REDIS_URL. + + Returns: + bool: Whether or not the deletions were successful. + + Raises: + ValueError: If the redis python package is not installed. + ValueError: If the ids (keys in redis) are not provided + """ + redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") + + if ids is None: + raise ValueError("'ids' (keys)() were not provided.") + + try: + import redis # noqa: F401 + except ImportError: + raise ValueError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) + try: + # We need to first remove redis_url from kwargs, + # otherwise passing it to Redis will result in an error. + if "redis_url" in kwargs: + kwargs.pop("redis_url") + client = get_client(redis_url=redis_url, **kwargs) + except ValueError as e: + raise ValueError(f"Your redis connected error: {e}") + # Check if index exists + try: + client.delete(*ids) + logger.info("Entries deleted") + return True + except: # noqa: E722 + # ids does not exist + return False + + @staticmethod + def drop_index( + index_name: str, + delete_documents: bool, + **kwargs: Any, + ) -> bool: + """ + Drop a Redis search index. + + Args: + index_name (str): Name of the index to drop. + delete_documents (bool): Whether to drop the associated documents. + + Returns: + bool: Whether or not the drop was successful. + """ + redis_url = get_from_dict_or_env(kwargs, "redis_url", "REDIS_URL") + try: + import redis # noqa: F401 + except ImportError: + raise ValueError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) + try: + # We need to first remove redis_url from kwargs, + # otherwise passing it to Redis will result in an error. + if "redis_url" in kwargs: + kwargs.pop("redis_url") + client = get_client(redis_url=redis_url, **kwargs) + except ValueError as e: + raise ValueError(f"Your redis connected error: {e}") + # Check if index exists + try: + client.ft(index_name).dropindex(delete_documents) + logger.info("Drop index") + return True + except: # noqa: E722 + # Index not exist + return False + + def add_texts( + self, + texts: Iterable[str], + metadatas: Optional[List[dict]] = None, + embeddings: Optional[List[List[float]]] = None, + batch_size: int = 1000, + clean_metadata: bool = True, + **kwargs: Any, + ) -> List[str]: + """Add more texts to the vectorstore. + + Args: + texts (Iterable[str]): Iterable of strings/text to add to the vectorstore. + metadatas (Optional[List[dict]], optional): Optional list of metadatas. + Defaults to None. + embeddings (Optional[List[List[float]]], optional): Optional pre-generated + embeddings. Defaults to None. + keys (List[str]) or ids (List[str]): Identifiers of entries. + Defaults to None. + batch_size (int, optional): Batch size to use for writes. Defaults to 1000. + + Returns: + List[str]: List of ids added to the vectorstore + """ + ids = [] + prefix = _redis_prefix(self.index_name) + + # Get keys or ids from kwargs + # Other vectorstores use ids + keys_or_ids = kwargs.get("keys", kwargs.get("ids")) + + # type check for metadata + if metadatas: + if isinstance(metadatas, list) and len(metadatas) != len(texts): # type: ignore # noqa: E501 + raise ValueError("Number of metadatas must match number of texts") + if not (isinstance(metadatas, list) and isinstance(metadatas[0], dict)): + raise ValueError("Metadatas must be a list of dicts") + + # Write data to redis + pipeline = self.client.pipeline(transaction=False) + for i, text in enumerate(texts): + # Use provided values by default or fallback + key = keys_or_ids[i] if keys_or_ids else _redis_key(prefix) + metadata = metadatas[i] if metadatas else {} + metadata = _prepare_metadata(metadata) if clean_metadata else metadata + embedding = ( + embeddings[i] if embeddings else self._embeddings.embed_query(text) + ) + pipeline.hset( + key, + mapping={ + self._schema.content_key: text, + self._schema.content_vector_key: _array_to_buffer( + embedding, self._schema.vector_dtype + ), + **metadata, + }, + ) + ids.append(key) + + # Write batch + if i % batch_size == 0: + pipeline.execute() + + # Cleanup final batch + pipeline.execute() + return ids + + def as_retriever(self, **kwargs: Any) -> RedisVectorStoreRetriever: + tags = kwargs.pop("tags", None) or [] + tags.extend(self._get_retriever_tags()) + return RedisVectorStoreRetriever(vectorstore=self, **kwargs, tags=tags) + + @deprecated("0.0.272", alternative="similarity_search(distance_threshold=0.1)") + def similarity_search_limit_score( + self, query: str, k: int = 4, score_threshold: float = 0.2, **kwargs: Any + ) -> List[Document]: + """ + Returns the most similar indexed documents to the query text within the + score_threshold range. + + Deprecated: Use similarity_search with distance_threshold instead. + + Args: + query (str): The query text for which to find similar documents. + k (int): The number of documents to return. Default is 4. + score_threshold (float): The minimum matching *distance* required + for a document to be considered a match. Defaults to 0.2. + + Returns: + List[Document]: A list of documents that are most similar to the query text + including the match score for each document. + + Note: + If there are no documents that satisfy the score_threshold value, + an empty list is returned. + + """ + return self.similarity_search( + query, k=k, distance_threshold=score_threshold, **kwargs + ) + + def similarity_search_with_score( + self, + query: str, + k: int = 4, + filter: Optional[RedisFilterExpression] = None, + return_metadata: bool = True, + **kwargs: Any, + ) -> List[Tuple[Document, float]]: + """Run similarity search with **vector distance**. + + The "scores" returned from this function are the raw vector + distances from the query vector. For similarity scores, use + ``similarity_search_with_relevance_scores``. + + Args: + query (str): The query text for which to find similar documents. + k (int): The number of documents to return. Default is 4. + filter (RedisFilterExpression, optional): Optional metadata filter. + Defaults to None. + return_metadata (bool, optional): Whether to return metadata. + Defaults to True. + + Returns: + List[Tuple[Document, float]]: A list of documents that are + most similar to the query with the distance for each document. + """ + try: + import redis + + except ImportError as e: + raise ImportError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) from e + + if "score_threshold" in kwargs: + logger.warning( + "score_threshold is deprecated. Use distance_threshold instead." + + "score_threshold should only be used in " + + "similarity_search_with_relevance_scores." + + "score_threshold will be removed in a future release.", + ) + + redis_query, params_dict = self._prepare_query( + query, + k=k, + filter=filter, + with_metadata=return_metadata, + with_distance=True, + **kwargs, + ) + + # Perform vector search + # ignore type because redis-py is wrong about bytes + try: + results = self.client.ft(self.index_name).search(redis_query, params_dict) # type: ignore # noqa: E501 + except redis.exceptions.ResponseError as e: + # split error message and see if it starts with "Syntax" + if str(e).split(" ")[0] == "Syntax": + raise ValueError( + "Query failed with syntax error. " + + "This is likely due to malformation of " + + "filter, vector, or query argument" + ) from e + raise e + + # Prepare document results + docs_with_scores: List[Tuple[Document, float]] = [] + for result in results.docs: + metadata = {} + if return_metadata: + metadata = {"id": result.id} + metadata.update(self._collect_metadata(result)) + + doc = Document(page_content=result.content, metadata=metadata) + distance = self._calculate_fp_distance(result.distance) + docs_with_scores.append((doc, distance)) + + return docs_with_scores + + def similarity_search( + self, + query: str, + k: int = 4, + filter: Optional[RedisFilterExpression] = None, + return_metadata: bool = True, + distance_threshold: Optional[float] = None, + **kwargs: Any, + ) -> List[Document]: + """Run similarity search + + Args: + query (str): The query text for which to find similar documents. + k (int): The number of documents to return. Default is 4. + filter (RedisFilterExpression, optional): Optional metadata filter. + Defaults to None. + return_metadata (bool, optional): Whether to return metadata. + Defaults to True. + distance_threshold (Optional[float], optional): Distance threshold + for vector distance from query vector. Defaults to None. + + Returns: + List[Document]: A list of documents that are most similar to the query + text. + + """ + try: + import redis + + except ImportError as e: + raise ImportError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) from e + + if "score_threshold" in kwargs: + logger.warning( + "score_threshold is deprecated. Use distance_threshold instead." + + "score_threshold should only be used in " + + "similarity_search_with_relevance_scores." + + "score_threshold will be removed in a future release.", + ) + + redis_query, params_dict = self._prepare_query( + query, + k=k, + filter=filter, + distance_threshold=distance_threshold, + with_metadata=return_metadata, + with_distance=False, + ) + + # Perform vector search + # ignore type because redis-py is wrong about bytes + try: + results = self.client.ft(self.index_name).search(redis_query, params_dict) # type: ignore # noqa: E501 + except redis.exceptions.ResponseError as e: + # split error message and see if it starts with "Syntax" + if str(e).split(" ")[0] == "Syntax": + raise ValueError( + "Query failed with syntax error. " + + "This is likely due to malformation of " + + "filter, vector, or query argument" + ) from e + raise e + + # Prepare document results + docs = [] + for result in results.docs: + metadata = {} + if return_metadata: + metadata = {"id": result.id} + metadata.update(self._collect_metadata(result)) + + content_key = self._schema.content_key + docs.append( + Document(page_content=getattr(result, content_key), metadata=metadata) + ) + return docs + + def _collect_metadata(self, result: "Document") -> Dict[str, Any]: + """Collect metadata from Redis. + + Method ensures that there isn't a mismatch between the metadata + and the index schema passed to this class by the user or generated + by this class. + + Args: + result (Document): redis.commands.search.Document object returned + from Redis. + + Returns: + Dict[str, Any]: Collected metadata. + """ + # new metadata dict as modified by this method + meta = {} + for key in self._schema.metadata_keys: + try: + meta[key] = getattr(result, key) + except AttributeError: + # warning about attribute missing + logger.warning( + f"Metadata key {key} not found in metadata. " + + "Setting to None. \n" + + "Metadata fields defined for this instance: " + + f"{self._schema.metadata_keys}" + ) + meta[key] = None + return meta + + def _prepare_query( + self, + query: str, + k: int = 4, + filter: Optional[RedisFilterExpression] = None, + distance_threshold: Optional[float] = None, + with_metadata: bool = True, + with_distance: bool = False, + ) -> Tuple["Query", Dict[str, Any]]: + # Creates embedding vector from user query + embedding = self._embeddings.embed_query(query) + + # Creates Redis query + params_dict: Dict[str, Union[str, bytes, float]] = { + "vector": _array_to_buffer(embedding, self._schema.vector_dtype), + } + + # prepare return fields including score + return_fields = [self._schema.content_key] + if with_distance: + return_fields.append("distance") + if with_metadata: + return_fields.extend(self._schema.metadata_keys) + + if distance_threshold: + params_dict["distance_threshold"] = distance_threshold + return ( + self._prepare_range_query( + k, filter=filter, return_fields=return_fields + ), + params_dict, + ) + return ( + self._prepare_vector_query(k, filter=filter, return_fields=return_fields), + params_dict, + ) + + def _prepare_range_query( + self, + k: int, + filter: Optional[RedisFilterExpression] = None, + return_fields: List[str] = [], + ) -> "Query": + try: + from redis.commands.search.query import Query + except ImportError as e: + raise ImportError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) from e + vector_key = self._schema.content_vector_key + base_query = f"@{vector_key}:[VECTOR_RANGE $distance_threshold $vector]" + + if filter: + base_query = "(" + base_query + " " + str(filter) + ")" + + query_string = base_query + "=>{$yield_distance_as: distance}" + + return ( + Query(query_string) + .return_fields(*return_fields) + .sort_by("distance") + .paging(0, k) + .dialect(2) + ) + + def _prepare_vector_query( + self, + k: int, + filter: Optional[RedisFilterExpression] = None, + return_fields: List[str] = [], + ) -> "Query": + """Prepare query for vector search. + + Args: + k: Number of results to return. + filter: Optional metadata filter. + + Returns: + query: Query object. + """ + try: + from redis.commands.search.query import Query + except ImportError as e: + raise ImportError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) from e + query_prefix = "*" + if filter: + query_prefix = f"{str(filter)}" + vector_key = self._schema.content_vector_key + base_query = f"({query_prefix})=>[KNN {k} @{vector_key} $vector AS distance]" + + query = ( + Query(base_query) + .return_fields(*return_fields) + .sort_by("distance") + .paging(0, k) + .dialect(2) + ) + return query + + def _get_schema_with_defaults( + self, + index_schema: Optional[Union[Dict[str, str], str, os.PathLike]] = None, + vector_schema: Optional[Dict[str, Union[str, int]]] = None, + ) -> "RedisModel": + # should only be called after init of Redis (so Import handled) + from langchain.vectorstores.redis.schema import RedisModel, read_schema + + schema = RedisModel() + # read in schema (yaml file or dict) and + # pass to the Pydantic validators + if index_schema: + schema_values = read_schema(index_schema) + schema = RedisModel(**schema_values) + + # ensure user did not exclude the content field + # no modifications if content field found + schema.add_content_field() + + # if no content_vector field, add vector field to schema + # this makes adding a vector field to the schema optional when + # the user just wants additional metadata + try: + # see if user overrode the content vector + schema.content_vector + # if user overrode the content vector, check if they + # also passed vector schema. This won't be used since + # the index schema overrode the content vector + if vector_schema: + logger.warning( + "`vector_schema` is ignored since content_vector is " + + "overridden in `index_schema`." + ) + + # user did not override content vector + except ValueError: + # set default vector schema and update with user provided schema + # if the user provided any + vector_field = self.DEFAULT_VECTOR_SCHEMA.copy() + if vector_schema: + vector_field.update(vector_schema) + + # add the vector field either way + schema.add_vector_field(vector_field) + return schema + + def _create_index(self, dim: int = 1536) -> None: + try: + from redis.commands.search.indexDefinition import ( # type: ignore + IndexDefinition, + IndexType, + ) + + except ImportError: + raise ValueError( + "Could not import redis python package. " + "Please install it with `pip install redis`." + ) + + # Set vector dimension + # can't obtain beforehand because we don't + # know which embedding model is being used. + self._schema.content_vector.dims = dim + + # Check if index exists + if not check_index_exists(self.client, self.index_name): + prefix = _redis_prefix(self.index_name) + + # Create Redis Index + self.client.ft(self.index_name).create_index( + fields=self._schema.get_fields(), + definition=IndexDefinition(prefix=[prefix], index_type=IndexType.HASH), + ) + + def _calculate_fp_distance(self, distance: str) -> float: + """Calculate the distance based on the vector datatype + + Two datatypes supported: + - FLOAT32 + - FLOAT64 + + if it's FLOAT32, we need to round the distance to 4 decimal places + otherwise, round to 7 decimal places. + """ + if self._schema.content_vector.datatype == "FLOAT32": + return round(float(distance), 4) + return round(float(distance), 7) + + def _check_deprecated_kwargs(self, kwargs: Mapping[str, Any]) -> None: + """Check for deprecated kwargs.""" + + deprecated_kwargs = { + "redis_host": "redis_url", + "redis_port": "redis_url", + "redis_password": "redis_url", + "content_key": "index_schema", + "vector_key": "vector_schema", + "distance_metric": "vector_schema", + } + for key, value in kwargs.items(): + if key in deprecated_kwargs: + raise ValueError( + f"Keyword argument '{key}' is deprecated. " + f"Please use '{deprecated_kwargs[key]}' instead." + ) + + def _select_relevance_score_fn(self) -> Callable[[float], float]: + if self.relevance_score_fn: + return self.relevance_score_fn + + metric_map = { + "COSINE": self._cosine_relevance_score_fn, + "IP": self._max_inner_product_relevance_score_fn, + "L2": self._euclidean_relevance_score_fn, + } + try: + return metric_map[self._schema.content_vector.distance_metric] + except KeyError: + return _default_relevance_score + + +def _generate_field_schema(data: Dict[str, Any]) -> Dict[str, Any]: + """ + Generate a schema for the search index in Redis based on the input metadata. + + Given a dictionary of metadata, this function categorizes each metadata + field into one of the three categories: + - text: The field contains textual data. + - numeric: The field contains numeric data (either integer or float). + - tag: The field contains list of tags (strings). + + Args + data (Dict[str, Any]): A dictionary where keys are metadata field names + and values are the metadata values. + + Returns: + Dict[str, Any]: A dictionary with three keys "text", "numeric", and "tag". + Each key maps to a list of fields that belong to that category. + + Raises: + ValueError: If a metadata field cannot be categorized into any of + the three known types. + """ + result: Dict[str, Any] = { + "text": [], + "numeric": [], + "tag": [], + } + + for key, value in data.items(): + # Numeric fields + try: + int(value) + result["numeric"].append({"name": key}) + continue + except (ValueError, TypeError): + pass + + # None values are not indexed as of now + if value is None: + continue + + # if it's a list of strings, we assume it's a tag + if isinstance(value, (list, tuple)): + if not value or isinstance(value[0], str): + result["tag"].append({"name": key}) + else: + name = type(value[0]).__name__ + raise ValueError( + f"List/tuple values should contain strings: '{key}': {name}" + ) + continue + + # Check if value is string before processing further + if isinstance(value, str): + result["text"].append({"name": key}) + continue + + # Unable to classify the field value + name = type(value).__name__ + raise ValueError( + "Could not generate Redis index field type mapping " + + f"for metadata: '{key}': {name}" + ) + + return result + + +def _prepare_metadata(metadata: Dict[str, Any]) -> Dict[str, Any]: + """ + Prepare metadata for indexing in Redis by sanitizing its values. + + - String, integer, and float values remain unchanged. + - None or empty values are replaced with empty strings. + - Lists/tuples of strings are joined into a single string with a comma separator. + + Args: + metadata (Dict[str, Any]): A dictionary where keys are metadata + field names and values are the metadata values. + + Returns: + Dict[str, Any]: A sanitized dictionary ready for indexing in Redis. + + Raises: + ValueError: If any metadata value is not one of the known + types (string, int, float, or list of strings). + """ + + def raise_error(key: str, value: Any) -> None: + raise ValueError( + f"Metadata value for key '{key}' must be a string, int, " + + f"float, or list of strings. Got {type(value).__name__}" + ) + + clean_meta: Dict[str, Union[str, float, int]] = {} + for key, value in metadata.items(): + if not value: + clean_meta[key] = "" + continue + + # No transformation needed + if isinstance(value, (str, int, float)): + clean_meta[key] = value + + # if it's a list/tuple of strings, we join it + elif isinstance(value, (list, tuple)): + if not value or isinstance(value[0], str): + clean_meta[key] = REDIS_TAG_SEPARATOR.join(value) + else: + raise_error(key, value) + else: + raise_error(key, value) + return clean_meta + + +class RedisVectorStoreRetriever(VectorStoreRetriever): + """Retriever for Redis VectorStore.""" + + vectorstore: Redis + """Redis VectorStore.""" + search_type: str = "similarity" + """Type of search to perform. Can be either + 'similarity', + 'similarity_distance_threshold', + 'similarity_score_threshold' + """ + + search_kwargs: Dict[str, Any] = { + "k": 4, + "score_threshold": 0.9, + # set to None to avoid distance used in score_threshold search + "distance_threshold": None, + } + """Default search kwargs.""" + + allowed_search_types = [ + "similarity", + "similarity_distance_threshold", + "similarity_score_threshold", + ] + """Allowed search types.""" + + class Config: + """Configuration for this pydantic object.""" + + arbitrary_types_allowed = True + + def _get_relevant_documents( + self, query: str, *, run_manager: CallbackManagerForRetrieverRun + ) -> List[Document]: + if self.search_type == "similarity": + docs = self.vectorstore.similarity_search(query, **self.search_kwargs) + + elif self.search_type == "similarity_distance_threshold": + if self.search_kwargs["distance_threshold"] is None: + raise ValueError( + "distance_threshold must be provided for " + + "similarity_distance_threshold retriever" + ) + docs = self.vectorstore.similarity_search(query, **self.search_kwargs) + + elif self.search_type == "similarity_score_threshold": + docs_and_similarities = ( + self.vectorstore.similarity_search_with_relevance_scores( + query, **self.search_kwargs + ) + ) + docs = [doc for doc, _ in docs_and_similarities] + else: + raise ValueError(f"search_type of {self.search_type} not allowed.") + return docs + + async def _aget_relevant_documents( + self, query: str, *, run_manager: AsyncCallbackManagerForRetrieverRun + ) -> List[Document]: + raise NotImplementedError("RedisVectorStoreRetriever does not support async") + + def add_documents(self, documents: List[Document], **kwargs: Any) -> List[str]: + """Add documents to vectorstore.""" + return self.vectorstore.add_documents(documents, **kwargs) + + async def aadd_documents( + self, documents: List[Document], **kwargs: Any + ) -> List[str]: + """Add documents to vectorstore.""" + return await self.vectorstore.aadd_documents(documents, **kwargs) diff --git a/libs/langchain/langchain/vectorstores/redis/constants.py b/libs/langchain/langchain/vectorstores/redis/constants.py new file mode 100644 index 000000000..ddbfe4c58 --- /dev/null +++ b/libs/langchain/langchain/vectorstores/redis/constants.py @@ -0,0 +1,20 @@ +from typing import Any, Dict, List + +import numpy as np + +# required modules +REDIS_REQUIRED_MODULES = [ + {"name": "search", "ver": 20600}, + {"name": "searchlight", "ver": 20600}, +] + +# distance metrics +REDIS_DISTANCE_METRICS: List[str] = ["COSINE", "IP", "L2"] + +# supported vector datatypes +REDIS_VECTOR_DTYPE_MAP: Dict[str, Any] = { + "FLOAT32": np.float32, + "FLOAT64": np.float64, +} + +REDIS_TAG_SEPARATOR = "," diff --git a/libs/langchain/langchain/vectorstores/redis/filters.py b/libs/langchain/langchain/vectorstores/redis/filters.py new file mode 100644 index 000000000..0f6608bae --- /dev/null +++ b/libs/langchain/langchain/vectorstores/redis/filters.py @@ -0,0 +1,420 @@ +from enum import Enum +from functools import wraps +from typing import Any, Callable, Dict, List, Optional, Union + +from langchain.utilities.redis import TokenEscaper + +# disable mypy error for dunder method overrides +# mypy: disable-error-code="override" + + +class RedisFilterOperator(Enum): + EQ = 1 + NE = 2 + LT = 3 + GT = 4 + LE = 5 + GE = 6 + OR = 7 + AND = 8 + LIKE = 9 + IN = 10 + + +class RedisFilter: + @staticmethod + def text(field: str) -> "RedisText": + return RedisText(field) + + @staticmethod + def num(field: str) -> "RedisNum": + return RedisNum(field) + + @staticmethod + def tag(field: str) -> "RedisTag": + return RedisTag(field) + + +class RedisFilterField: + escaper: "TokenEscaper" = TokenEscaper() + OPERATORS: Dict[RedisFilterOperator, str] = {} + + def __init__(self, field: str): + self._field = field + self._value: Any = None + self._operator: RedisFilterOperator = RedisFilterOperator.EQ + + def equals(self, other: "RedisFilterField") -> bool: + if not isinstance(other, type(self)): + return False + return self._field == other._field and self._value == other._value + + def _set_value( + self, val: Any, val_type: type, operator: RedisFilterOperator + ) -> None: + # check that the operator is supported by this class + if operator not in self.OPERATORS: + raise ValueError( + f"Operator {operator} not supported by {self.__class__.__name__}. " + + f"Supported operators are {self.OPERATORS.values()}" + ) + + if not isinstance(val, val_type): + raise TypeError( + f"Right side argument passed to operator {self.OPERATORS[operator]} " + f"with left side " + f"argument {self.__class__.__name__} must be of type {val_type}" + ) + self._value = val + self._operator = operator + + +def check_operator_misuse(func: Callable) -> Callable: + @wraps(func) + def wrapper(instance: Any, *args: List[Any], **kwargs: Dict[str, Any]) -> Any: + # Extracting 'other' from positional arguments or keyword arguments + other = kwargs.get("other") if "other" in kwargs else None + if not other: + for arg in args: + if isinstance(arg, type(instance)): + other = arg + break + + if isinstance(other, type(instance)): + raise ValueError( + "Equality operators are overridden for FilterExpression creation. Use " + ".equals() for equality checks" + ) + return func(instance, *args, **kwargs) + + return wrapper + + +class RedisTag(RedisFilterField): + """A RedisTag is a RedisFilterField representing a tag in a Redis index.""" + + OPERATORS: Dict[RedisFilterOperator, str] = { + RedisFilterOperator.EQ: "==", + RedisFilterOperator.NE: "!=", + RedisFilterOperator.IN: "==", + } + + OPERATOR_MAP: Dict[RedisFilterOperator, str] = { + RedisFilterOperator.EQ: "@%s:{%s}", + RedisFilterOperator.NE: "(-@%s:{%s})", + RedisFilterOperator.IN: "@%s:{%s}", + } + + def __init__(self, field: str): + """Create a RedisTag FilterField + + Args: + field (str): The name of the RedisTag field in the index to be queried + against. + """ + super().__init__(field) + + def _set_tag_value( + self, other: Union[List[str], str], operator: RedisFilterOperator + ) -> None: + if isinstance(other, list): + if not all(isinstance(tag, str) for tag in other): + raise ValueError("All tags must be strings") + else: + other = [other] + self._set_value(other, list, operator) + + @check_operator_misuse + def __eq__(self, other: Union[List[str], str]) -> "RedisFilterExpression": + """Create a RedisTag equality filter expression + + Args: + other (Union[List[str], str]): The tag(s) to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisTag + >>> filter = RedisTag("brand") == "nike" + """ + self._set_tag_value(other, RedisFilterOperator.EQ) + return RedisFilterExpression(str(self)) + + @check_operator_misuse + def __ne__(self, other: Union[List[str], str]) -> "RedisFilterExpression": + """Create a RedisTag inequality filter expression + + Args: + other (Union[List[str], str]): The tag(s) to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisTag + >>> filter = RedisTag("brand") != "nike" + """ + self._set_tag_value(other, RedisFilterOperator.NE) + return RedisFilterExpression(str(self)) + + @property + def _formatted_tag_value(self) -> str: + return "|".join([self.escaper.escape(tag) for tag in self._value]) + + def __str__(self) -> str: + if not self._value: + raise ValueError( + f"Operator must be used before calling __str__. Operators are " + f"{self.OPERATORS.values()}" + ) + """Return the Redis Query syntax for a RedisTag filter expression""" + return self.OPERATOR_MAP[self._operator] % ( + self._field, + self._formatted_tag_value, + ) + + +class RedisNum(RedisFilterField): + """A RedisFilterField representing a numeric field in a Redis index.""" + + OPERATORS: Dict[RedisFilterOperator, str] = { + RedisFilterOperator.EQ: "==", + RedisFilterOperator.NE: "!=", + RedisFilterOperator.LT: "<", + RedisFilterOperator.GT: ">", + RedisFilterOperator.LE: "<=", + RedisFilterOperator.GE: ">=", + } + OPERATOR_MAP: Dict[RedisFilterOperator, str] = { + RedisFilterOperator.EQ: "@%s:[%i %i]", + RedisFilterOperator.NE: "(-@%s:[%i %i])", + RedisFilterOperator.GT: "@%s:[(%i +inf]", + RedisFilterOperator.LT: "@%s:[-inf (%i]", + RedisFilterOperator.GE: "@%s:[%i +inf]", + RedisFilterOperator.LE: "@%s:[-inf %i]", + } + + def __str__(self) -> str: + """Return the Redis Query syntax for a Numeric filter expression""" + if not self._value: + raise ValueError( + f"Operator must be used before calling __str__. Operators are " + f"{self.OPERATORS.values()}" + ) + + if ( + self._operator == RedisFilterOperator.EQ + or self._operator == RedisFilterOperator.NE + ): + return self.OPERATOR_MAP[self._operator] % ( + self._field, + self._value, + self._value, + ) + else: + return self.OPERATOR_MAP[self._operator] % (self._field, self._value) + + @check_operator_misuse + def __eq__(self, other: int) -> "RedisFilterExpression": + """Create a Numeric equality filter expression + + Args: + other (int): The value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisNum + >>> filter = RedisNum("zipcode") == 90210 + """ + self._set_value(other, int, RedisFilterOperator.EQ) + return RedisFilterExpression(str(self)) + + @check_operator_misuse + def __ne__(self, other: int) -> "RedisFilterExpression": + """Create a Numeric inequality filter expression + + Args: + other (int): The value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisNum + >>> filter = RedisNum("zipcode") != 90210 + """ + self._set_value(other, int, RedisFilterOperator.NE) + return RedisFilterExpression(str(self)) + + def __gt__(self, other: int) -> "RedisFilterExpression": + """Create a RedisNumeric greater than filter expression + + Args: + other (int): The value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisNum + >>> filter = RedisNum("age") > 18 + """ + self._set_value(other, int, RedisFilterOperator.GT) + return RedisFilterExpression(str(self)) + + def __lt__(self, other: int) -> "RedisFilterExpression": + """Create a Numeric less than filter expression + + Args: + other (int): The value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisNum + >>> filter = RedisNum("age") < 18 + """ + self._set_value(other, int, RedisFilterOperator.LT) + return RedisFilterExpression(str(self)) + + def __ge__(self, other: int) -> "RedisFilterExpression": + """Create a Numeric greater than or equal to filter expression + + Args: + other (int): The value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisNum + >>> filter = RedisNum("age") >= 18 + """ + self._set_value(other, int, RedisFilterOperator.GE) + return RedisFilterExpression(str(self)) + + def __le__(self, other: int) -> "RedisFilterExpression": + """Create a Numeric less than or equal to filter expression + + Args: + other (int): The value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisNum + >>> filter = RedisNum("age") <= 18 + """ + self._set_value(other, int, RedisFilterOperator.LE) + return RedisFilterExpression(str(self)) + + +class RedisText(RedisFilterField): + """A RedisText is a RedisFilterField representing a text field in a Redis index.""" + + OPERATORS = { + RedisFilterOperator.EQ: "==", + RedisFilterOperator.NE: "!=", + RedisFilterOperator.LIKE: "%", + } + OPERATOR_MAP = { + RedisFilterOperator.EQ: '@%s:"%s"', + RedisFilterOperator.NE: '(-@%s:"%s")', + RedisFilterOperator.LIKE: "@%s:%s", + } + + @check_operator_misuse + def __eq__(self, other: str) -> "RedisFilterExpression": + """Create a RedisText equality filter expression + + Args: + other (str): The text value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisText + >>> filter = RedisText("job") == "engineer" + """ + self._set_value(other, str, RedisFilterOperator.EQ) + return RedisFilterExpression(str(self)) + + @check_operator_misuse + def __ne__(self, other: str) -> "RedisFilterExpression": + """Create a RedisText inequality filter expression + + Args: + other (str): The text value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisText + >>> filter = RedisText("job") != "engineer" + """ + self._set_value(other, str, RedisFilterOperator.NE) + return RedisFilterExpression(str(self)) + + def __mod__(self, other: str) -> "RedisFilterExpression": + """Create a RedisText like filter expression + + Args: + other (str): The text value to filter on. + + Example: + >>> from langchain.vectorstores.redis import RedisText + >>> filter = RedisText("job") % "engineer" + """ + self._set_value(other, str, RedisFilterOperator.LIKE) + return RedisFilterExpression(str(self)) + + def __str__(self) -> str: + if not self._value: + raise ValueError( + f"Operator must be used before calling __str__. Operators are " + f"{self.OPERATORS.values()}" + ) + + try: + return self.OPERATOR_MAP[self._operator] % (self._field, self._value) + except KeyError: + raise Exception("Invalid operator") + + +class RedisFilterExpression: + """A RedisFilterExpression is a logical expression of RedisFilterFields. + + RedisFilterExpressions can be combined using the & and | operators to create + complex logical expressions that evaluate to the Redis Query language. + + This presents an interface by which users can create complex queries + without having to know the Redis Query language. + + Filter expressions are not initialized directly. Instead they are built + by combining RedisFilterFields using the & and | operators. + + Examples: + + >>> from langchain.vectorstores.redis import RedisTag, RedisNum + >>> brand_is_nike = RedisTag("brand") == "nike" + >>> price_is_under_100 = RedisNum("price") < 100 + >>> filter = brand_is_nike & price_is_under_100 + >>> print(str(filter)) + (@brand:{nike} @price:[-inf (100)]) + + """ + + def __init__( + self, + _filter: Optional[str] = None, + operator: Optional[RedisFilterOperator] = None, + left: Optional["RedisFilterExpression"] = None, + right: Optional["RedisFilterExpression"] = None, + ): + self._filter = _filter + self._operator = operator + self._left = left + self._right = right + + def __and__(self, other: "RedisFilterExpression") -> "RedisFilterExpression": + return RedisFilterExpression( + operator=RedisFilterOperator.AND, left=self, right=other + ) + + def __or__(self, other: "RedisFilterExpression") -> "RedisFilterExpression": + return RedisFilterExpression( + operator=RedisFilterOperator.OR, left=self, right=other + ) + + def __str__(self) -> str: + # top level check that allows recursive calls to __str__ + if not self._filter and not self._operator: + raise ValueError("Improperly initialized RedisFilterExpression") + + # allow for single filter expression without operators as last + # expression in the chain might not have an operator + if self._operator: + operator_str = " | " if self._operator == RedisFilterOperator.OR else " " + return f"({str(self._left)}{operator_str}{str(self._right)})" + + # check that base case, the filter is set + if not self._filter: + raise ValueError("Improperly initialized RedisFilterExpression") + return self._filter diff --git a/libs/langchain/langchain/vectorstores/redis/schema.py b/libs/langchain/langchain/vectorstores/redis/schema.py new file mode 100644 index 000000000..1ecd92192 --- /dev/null +++ b/libs/langchain/langchain/vectorstores/redis/schema.py @@ -0,0 +1,276 @@ +import os +from enum import Enum +from pathlib import Path +from typing import Any, Dict, List, Optional, Union + +import numpy as np +import yaml + +# ignore type error here as it's a redis-py type problem +from redis.commands.search.field import ( # type: ignore + NumericField, + TagField, + TextField, + VectorField, +) +from typing_extensions import Literal + +from langchain.pydantic_v1 import BaseModel, Field, validator +from langchain.vectorstores.redis.constants import REDIS_VECTOR_DTYPE_MAP + + +class RedisDistanceMetric(str, Enum): + l2 = "L2" + cosine = "COSINE" + ip = "IP" + + +class RedisField(BaseModel): + name: str = Field(...) + + +class TextFieldSchema(RedisField): + weight: float = 1 + no_stem: bool = False + phonetic_matcher: Optional[str] = None + withsuffixtrie: bool = False + no_index: bool = False + sortable: Optional[bool] = False + + def as_field(self) -> TextField: + return TextField( + self.name, + weight=self.weight, + no_stem=self.no_stem, + phonetic_matcher=self.phonetic_matcher, + sortable=self.sortable, + no_index=self.no_index, + ) + + +class TagFieldSchema(RedisField): + separator: str = "," + case_sensitive: bool = False + no_index: bool = False + sortable: Optional[bool] = False + + def as_field(self) -> TagField: + return TagField( + self.name, + separator=self.separator, + case_sensitive=self.case_sensitive, + sortable=self.sortable, + no_index=self.no_index, + ) + + +class NumericFieldSchema(RedisField): + no_index: bool = False + sortable: Optional[bool] = False + + def as_field(self) -> NumericField: + return NumericField(self.name, sortable=self.sortable, no_index=self.no_index) + + +class RedisVectorField(RedisField): + dims: int = Field(...) + algorithm: object = Field(...) + datatype: str = Field(default="FLOAT32") + distance_metric: RedisDistanceMetric = Field(default="COSINE") + initial_cap: int = Field(default=20000) + + @validator("distance_metric", pre=True) + def uppercase_strings(cls, v: str) -> str: + return v.upper() + + @validator("datatype", pre=True) + def uppercase_and_check_dtype(cls, v: str) -> str: + if v.upper() not in REDIS_VECTOR_DTYPE_MAP: + raise ValueError( + f"datatype must be one of {REDIS_VECTOR_DTYPE_MAP.keys()}. Got {v}" + ) + return v.upper() + + +class FlatVectorField(RedisVectorField): + algorithm: Literal["FLAT"] = "FLAT" + block_size: int = Field(default=1000) + + def as_field(self) -> VectorField: + return VectorField( + self.name, + self.algorithm, + { + "TYPE": self.datatype, + "DIM": self.dims, + "DISTANCE_METRIC": self.distance_metric, + "INITIAL_CAP": self.initial_cap, + "BLOCK_SIZE": self.block_size, + }, + ) + + +class HNSWVectorField(RedisVectorField): + algorithm: Literal["HNSW"] = "HNSW" + m: int = Field(default=16) + ef_construction: int = Field(default=200) + ef_runtime: int = Field(default=10) + epsilon: float = Field(default=0.8) + + def as_field(self) -> VectorField: + return VectorField( + self.name, + self.algorithm, + { + "TYPE": self.datatype, + "DIM": self.dims, + "DISTANCE_METRIC": self.distance_metric, + "INITIAL_CAP": self.initial_cap, + "M": self.m, + "EF_CONSTRUCTION": self.ef_construction, + "EF_RUNTIME": self.ef_runtime, + "EPSILON": self.epsilon, + }, + ) + + +class RedisModel(BaseModel): + # always have a content field for text + text: List[TextFieldSchema] = [TextFieldSchema(name="content")] + tag: Optional[List[TagFieldSchema]] = None + numeric: Optional[List[NumericFieldSchema]] = None + extra: Optional[List[RedisField]] = None + + # filled by default_vector_schema + vector: Optional[List[Union[FlatVectorField, HNSWVectorField]]] = None + content_key: str = "content" + content_vector_key: str = "content_vector" + + def add_content_field(self) -> None: + if self.text is None: + self.text = [] + for field in self.text: + if field.name == self.content_key: + return + self.text.append(TextFieldSchema(name=self.content_key)) + + def add_vector_field(self, vector_field: Dict[str, Any]) -> None: + # catch case where user inputted no vector field spec + # in the index schema + if self.vector is None: + self.vector = [] + + # ignore types as pydantic is handling type validation and conversion + if vector_field["algorithm"] == "FLAT": + self.vector.append(FlatVectorField(**vector_field)) # type: ignore + elif vector_field["algorithm"] == "HNSW": + self.vector.append(HNSWVectorField(**vector_field)) # type: ignore + else: + raise ValueError( + f"algorithm must be either FLAT or HNSW. Got " + f"{vector_field['algorithm']}" + ) + + def as_dict(self) -> Dict[str, List[Any]]: + schemas: Dict[str, List[Any]] = {"text": [], "tag": [], "numeric": []} + # iter over all class attributes + for attr, attr_value in self.__dict__.items(): + # only non-empty lists + if isinstance(attr_value, list) and len(attr_value) > 0: + field_values: List[Dict[str, Any]] = [] + # iterate over all fields in each category (tag, text, etc) + for val in attr_value: + value: Dict[str, Any] = {} + # iterate over values within each field to extract + # settings for that field (i.e. name, weight, etc) + for field, field_value in val.__dict__.items(): + # make enums into strings + if isinstance(field_value, Enum): + value[field] = field_value.value + # don't write null values + elif field_value is not None: + value[field] = field_value + field_values.append(value) + + schemas[attr] = field_values + + schema: Dict[str, List[Any]] = {} + # only write non-empty lists from defaults + for k, v in schemas.items(): + if len(v) > 0: + schema[k] = v + return schema + + @property + def content_vector(self) -> Union[FlatVectorField, HNSWVectorField]: + if not self.vector: + raise ValueError("No vector fields found") + for field in self.vector: + if field.name == self.content_vector_key: + return field + raise ValueError("No content_vector field found") + + @property + def vector_dtype(self) -> np.dtype: + # should only ever be called after pydantic has validated the schema + return REDIS_VECTOR_DTYPE_MAP[self.content_vector.datatype] + + @property + def is_empty(self) -> bool: + return all( + field is None for field in [self.tag, self.text, self.numeric, self.vector] + ) + + def get_fields(self) -> List["RedisField"]: + redis_fields: List["RedisField"] = [] + if self.is_empty: + return redis_fields + + for field_name in self.__fields__.keys(): + if field_name not in ["content_key", "content_vector_key", "extra"]: + field_group = getattr(self, field_name) + if field_group is not None: + for field in field_group: + redis_fields.append(field.as_field()) + return redis_fields + + @property + def metadata_keys(self) -> List[str]: + keys: List[str] = [] + if self.is_empty: + return keys + + for field_name in self.__fields__.keys(): + field_group = getattr(self, field_name) + if field_group is not None: + for field in field_group: + # check if it's a metadata field. exclude vector and content key + if not isinstance(field, str) and field.name not in [ + self.content_key, + self.content_vector_key, + ]: + keys.append(field.name) + return keys + + +def read_schema( + index_schema: Optional[Union[Dict[str, str], str, os.PathLike]] +) -> Dict[str, Any]: + # check if its a dict and return RedisModel otherwise, check if it's a path and + # read in the file assuming it's a yaml file and return a RedisModel + if isinstance(index_schema, dict): + return index_schema + elif isinstance(index_schema, Path): + with open(index_schema, "rb") as f: + return yaml.safe_load(f) + elif isinstance(index_schema, str): + if Path(index_schema).resolve().is_file(): + with open(index_schema, "rb") as f: + return yaml.safe_load(f) + else: + raise FileNotFoundError(f"index_schema file {index_schema} does not exist") + else: + raise TypeError( + f"index_schema must be a dict, or path to a yaml file " + f"Got {type(index_schema)}" + ) diff --git a/libs/langchain/tests/integration_tests/cache/test_redis_cache.py b/libs/langchain/tests/integration_tests/cache/test_redis_cache.py index 5d51a12e8..77b019eff 100644 --- a/libs/langchain/tests/integration_tests/cache/test_redis_cache.py +++ b/libs/langchain/tests/integration_tests/cache/test_redis_cache.py @@ -1,16 +1,27 @@ """Test Redis cache functionality.""" +import uuid +from typing import List + import pytest import langchain from langchain.cache import RedisCache, RedisSemanticCache +from langchain.embeddings.base import Embeddings from langchain.schema import Generation, LLMResult -from tests.integration_tests.vectorstores.fake_embeddings import FakeEmbeddings +from tests.integration_tests.vectorstores.fake_embeddings import ( + ConsistentFakeEmbeddings, + FakeEmbeddings, +) from tests.unit_tests.llms.fake_chat_model import FakeChatModel from tests.unit_tests.llms.fake_llm import FakeLLM REDIS_TEST_URL = "redis://localhost:6379" +def random_string() -> str: + return str(uuid.uuid4()) + + def test_redis_cache_ttl() -> None: import redis @@ -30,12 +41,10 @@ def test_redis_cache() -> None: llm_string = str(sorted([(k, v) for k, v in params.items()])) langchain.llm_cache.update("foo", llm_string, [Generation(text="fizz")]) output = llm.generate(["foo"]) - print(output) expected_output = LLMResult( generations=[[Generation(text="fizz")]], llm_output={}, ) - print(expected_output) assert output == expected_output langchain.llm_cache.redis.flushall() @@ -80,14 +89,90 @@ def test_redis_semantic_cache() -> None: langchain.llm_cache.clear(llm_string=llm_string) -def test_redis_semantic_cache_chat() -> None: - import redis +def test_redis_semantic_cache_multi() -> None: + langchain.llm_cache = RedisSemanticCache( + embedding=FakeEmbeddings(), redis_url=REDIS_TEST_URL, score_threshold=0.1 + ) + llm = FakeLLM() + params = llm.dict() + params["stop"] = None + llm_string = str(sorted([(k, v) for k, v in params.items()])) + langchain.llm_cache.update( + "foo", llm_string, [Generation(text="fizz"), Generation(text="Buzz")] + ) + output = llm.generate( + ["bar"] + ) # foo and bar will have the same embedding produced by FakeEmbeddings + expected_output = LLMResult( + generations=[[Generation(text="fizz"), Generation(text="Buzz")]], + llm_output={}, + ) + assert output == expected_output + # clear the cache + langchain.llm_cache.clear(llm_string=llm_string) - langchain.llm_cache = RedisCache(redis_=redis.Redis.from_url(REDIS_TEST_URL)) + +def test_redis_semantic_cache_chat() -> None: + langchain.llm_cache = RedisSemanticCache( + embedding=FakeEmbeddings(), redis_url=REDIS_TEST_URL, score_threshold=0.1 + ) llm = FakeChatModel() params = llm.dict() params["stop"] = None + llm_string = str(sorted([(k, v) for k, v in params.items()])) with pytest.warns(): llm.predict("foo") llm.predict("foo") - langchain.llm_cache.redis.flushall() + langchain.llm_cache.clear(llm_string=llm_string) + + +@pytest.mark.parametrize("embedding", [ConsistentFakeEmbeddings()]) +@pytest.mark.parametrize( + "prompts, generations", + [ + # Single prompt, single generation + ([random_string()], [[random_string()]]), + # Single prompt, multiple generations + ([random_string()], [[random_string(), random_string()]]), + # Single prompt, multiple generations + ([random_string()], [[random_string(), random_string(), random_string()]]), + # Multiple prompts, multiple generations + ( + [random_string(), random_string()], + [[random_string()], [random_string(), random_string()]], + ), + ], + ids=[ + "single_prompt_single_generation", + "single_prompt_multiple_generations", + "single_prompt_multiple_generations", + "multiple_prompts_multiple_generations", + ], +) +def test_redis_semantic_cache_hit( + embedding: Embeddings, prompts: List[str], generations: List[List[str]] +) -> None: + langchain.llm_cache = RedisSemanticCache( + embedding=embedding, redis_url=REDIS_TEST_URL + ) + + llm = FakeLLM() + params = llm.dict() + params["stop"] = None + llm_string = str(sorted([(k, v) for k, v in params.items()])) + + llm_generations = [ + [ + Generation(text=generation, generation_info=params) + for generation in prompt_i_generations + ] + for prompt_i_generations in generations + ] + for prompt_i, llm_generations_i in zip(prompts, llm_generations): + print(prompt_i) + print(llm_generations_i) + langchain.llm_cache.update(prompt_i, llm_string, llm_generations_i) + llm.generate(prompts) + assert llm.generate(prompts) == LLMResult( + generations=llm_generations, llm_output={} + ) diff --git a/libs/langchain/tests/integration_tests/vectorstores/fake_embeddings.py b/libs/langchain/tests/integration_tests/vectorstores/fake_embeddings.py index 550174e2e..d202813f2 100644 --- a/libs/langchain/tests/integration_tests/vectorstores/fake_embeddings.py +++ b/libs/langchain/tests/integration_tests/vectorstores/fake_embeddings.py @@ -52,6 +52,7 @@ class ConsistentFakeEmbeddings(FakeEmbeddings): def embed_query(self, text: str) -> List[float]: """Return consistent embeddings for the text, if seen before, or a constant one if the text is unknown.""" + return self.embed_documents([text])[0] if text not in self.known_texts: return [float(1.0)] * (self.dimensionality - 1) + [float(0.0)] return [float(1.0)] * (self.dimensionality - 1) + [ diff --git a/libs/langchain/tests/integration_tests/vectorstores/test_redis.py b/libs/langchain/tests/integration_tests/vectorstores/test_redis.py index aef3138e8..3b7a4c7ac 100644 --- a/libs/langchain/tests/integration_tests/vectorstores/test_redis.py +++ b/libs/langchain/tests/integration_tests/vectorstores/test_redis.py @@ -1,17 +1,28 @@ """Test Redis functionality.""" -from typing import List +import os +from typing import Any, Dict, List, Optional import pytest from langchain.docstore.document import Document -from langchain.vectorstores.redis import Redis -from tests.integration_tests.vectorstores.fake_embeddings import FakeEmbeddings +from langchain.vectorstores.redis import ( + Redis, + RedisFilter, + RedisNum, + RedisText, +) +from langchain.vectorstores.redis.filters import RedisFilterExpression +from tests.integration_tests.vectorstores.fake_embeddings import ( + ConsistentFakeEmbeddings, + FakeEmbeddings, +) TEST_INDEX_NAME = "test" TEST_REDIS_URL = "redis://localhost:6379" TEST_SINGLE_RESULT = [Document(page_content="foo")] -TEST_SINGLE_WITH_METADATA_RESULT = [Document(page_content="foo", metadata={"a": "b"})] +TEST_SINGLE_WITH_METADATA = {"a": "b"} TEST_RESULT = [Document(page_content="foo"), Document(page_content="foo")] +RANGE_SCORE = pytest.approx(0.0513, abs=0.002) COSINE_SCORE = pytest.approx(0.05, abs=0.002) IP_SCORE = -8.0 EUCLIDEAN_SCORE = 1.0 @@ -23,6 +34,27 @@ def drop(index_name: str) -> bool: ) +def convert_bytes(data: Any) -> Any: + if isinstance(data, bytes): + return data.decode("ascii") + if isinstance(data, dict): + return dict(map(convert_bytes, data.items())) + if isinstance(data, list): + return list(map(convert_bytes, data)) + if isinstance(data, tuple): + return map(convert_bytes, data) + return data + + +def make_dict(values: List[Any]) -> dict: + i = 0 + di = {} + while i < len(values) - 1: + di[values[i]] = values[i + 1] + i += 2 + return di + + @pytest.fixture def texts() -> List[str]: return ["foo", "bar", "baz"] @@ -31,7 +63,7 @@ def texts() -> List[str]: def test_redis(texts: List[str]) -> None: """Test end to end construction and search.""" docsearch = Redis.from_texts(texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL) - output = docsearch.similarity_search("foo", k=1) + output = docsearch.similarity_search("foo", k=1, return_metadata=False) assert output == TEST_SINGLE_RESULT assert drop(docsearch.index_name) @@ -40,30 +72,55 @@ def test_redis_new_vector(texts: List[str]) -> None: """Test adding a new document""" docsearch = Redis.from_texts(texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL) docsearch.add_texts(["foo"]) - output = docsearch.similarity_search("foo", k=2) + output = docsearch.similarity_search("foo", k=2, return_metadata=False) assert output == TEST_RESULT assert drop(docsearch.index_name) def test_redis_from_existing(texts: List[str]) -> None: """Test adding a new document""" - Redis.from_texts( + docsearch = Redis.from_texts( texts, FakeEmbeddings(), index_name=TEST_INDEX_NAME, redis_url=TEST_REDIS_URL ) + schema: Dict = docsearch.schema + + # write schema for the next test + docsearch.write_schema("test_schema.yml") + # Test creating from an existing docsearch2 = Redis.from_existing_index( - FakeEmbeddings(), index_name=TEST_INDEX_NAME, redis_url=TEST_REDIS_URL + FakeEmbeddings(), + index_name=TEST_INDEX_NAME, + redis_url=TEST_REDIS_URL, + schema=schema, ) - output = docsearch2.similarity_search("foo", k=1) + output = docsearch2.similarity_search("foo", k=1, return_metadata=False) assert output == TEST_SINGLE_RESULT +def test_redis_add_texts_to_existing() -> None: + """Test adding a new document""" + # Test creating from an existing with yaml from file + docsearch = Redis.from_existing_index( + FakeEmbeddings(), + index_name=TEST_INDEX_NAME, + redis_url=TEST_REDIS_URL, + schema="test_schema.yml", + ) + docsearch.add_texts(["foo"]) + output = docsearch.similarity_search("foo", k=2, return_metadata=False) + assert output == TEST_RESULT + assert drop(TEST_INDEX_NAME) + # remove the test_schema.yml file + os.remove("test_schema.yml") + + def test_redis_from_texts_return_keys(texts: List[str]) -> None: """Test from_texts_return_keys constructor.""" docsearch, keys = Redis.from_texts_return_keys( texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL ) - output = docsearch.similarity_search("foo", k=1) + output = docsearch.similarity_search("foo", k=1, return_metadata=False) assert output == TEST_SINGLE_RESULT assert len(keys) == len(texts) assert drop(docsearch.index_name) @@ -73,21 +130,124 @@ def test_redis_from_documents(texts: List[str]) -> None: """Test from_documents constructor.""" docs = [Document(page_content=t, metadata={"a": "b"}) for t in texts] docsearch = Redis.from_documents(docs, FakeEmbeddings(), redis_url=TEST_REDIS_URL) - output = docsearch.similarity_search("foo", k=1) - assert output == TEST_SINGLE_WITH_METADATA_RESULT + output = docsearch.similarity_search("foo", k=1, return_metadata=True) + assert "a" in output[0].metadata.keys() + assert "b" in output[0].metadata.values() assert drop(docsearch.index_name) -def test_redis_add_texts_to_existing() -> None: - """Test adding a new document""" - # Test creating from an existing - docsearch = Redis.from_existing_index( - FakeEmbeddings(), index_name=TEST_INDEX_NAME, redis_url=TEST_REDIS_URL +# -- test filters -- # + + +@pytest.mark.parametrize( + "filter_expr, expected_length, expected_nums", + [ + (RedisText("text") == "foo", 1, None), + (RedisFilter.text("text") == "foo", 1, None), + (RedisText("text") % "ba*", 2, ["bar", "baz"]), + (RedisNum("num") > 2, 1, [3]), + (RedisNum("num") < 2, 1, [1]), + (RedisNum("num") >= 2, 2, [2, 3]), + (RedisNum("num") <= 2, 2, [1, 2]), + (RedisNum("num") != 2, 2, [1, 3]), + (RedisFilter.num("num") != 2, 2, [1, 3]), + (RedisFilter.tag("category") == "a", 3, None), + (RedisFilter.tag("category") == "b", 2, None), + (RedisFilter.tag("category") == "c", 2, None), + (RedisFilter.tag("category") == ["b", "c"], 3, None), + ], + ids=[ + "text-filter-equals-foo", + "alternative-text-equals-foo", + "text-filter-fuzzy-match-ba", + "number-filter-greater-than-2", + "number-filter-less-than-2", + "number-filter-greater-equals-2", + "number-filter-less-equals-2", + "number-filter-not-equals-2", + "alternative-number-not-equals-2", + "tag-filter-equals-a", + "tag-filter-equals-b", + "tag-filter-equals-c", + "tag-filter-equals-b-or-c", + ], +) +def test_redis_filters_1( + filter_expr: RedisFilterExpression, + expected_length: int, + expected_nums: Optional[list], +) -> None: + metadata = [ + {"name": "joe", "num": 1, "text": "foo", "category": ["a", "b"]}, + {"name": "john", "num": 2, "text": "bar", "category": ["a", "c"]}, + {"name": "jane", "num": 3, "text": "baz", "category": ["b", "c", "a"]}, + ] + documents = [Document(page_content="foo", metadata=m) for m in metadata] + docsearch = Redis.from_documents( + documents, FakeEmbeddings(), redis_url=TEST_REDIS_URL ) - docsearch.add_texts(["foo"]) - output = docsearch.similarity_search("foo", k=2) - assert output == TEST_RESULT - assert drop(TEST_INDEX_NAME) + + output = docsearch.similarity_search("foo", k=3, filter=filter_expr) + + assert len(output) == expected_length + + if expected_nums is not None: + for out in output: + assert ( + out.metadata["text"] in expected_nums + or int(out.metadata["num"]) in expected_nums + ) + + assert drop(docsearch.index_name) + + +# -- test index specification -- # + + +def test_index_specification_generation() -> None: + index_schema = { + "text": [{"name": "job"}, {"name": "title"}], + "numeric": [{"name": "salary"}], + } + + text = ["foo"] + meta = {"job": "engineer", "title": "principal engineer", "salary": 100000} + docs = [Document(page_content=t, metadata=meta) for t in text] + r = Redis.from_documents( + docs, FakeEmbeddings(), redis_url=TEST_REDIS_URL, index_schema=index_schema + ) + + output = r.similarity_search("foo", k=1, return_metadata=True) + assert output[0].metadata["job"] == "engineer" + assert output[0].metadata["title"] == "principal engineer" + assert int(output[0].metadata["salary"]) == 100000 + + info = convert_bytes(r.client.ft(r.index_name).info()) + attributes = info["attributes"] + assert len(attributes) == 5 + for attr in attributes: + d = make_dict(attr) + if d["identifier"] == "job": + assert d["type"] == "TEXT" + elif d["identifier"] == "title": + assert d["type"] == "TEXT" + elif d["identifier"] == "salary": + assert d["type"] == "NUMERIC" + elif d["identifier"] == "content": + assert d["type"] == "TEXT" + elif d["identifier"] == "content_vector": + assert d["type"] == "VECTOR" + else: + raise ValueError("Unexpected attribute in index schema") + + assert drop(r.index_name) + + +# -- test distance metrics -- # + +cosine_schema: Dict = {"distance_metric": "cosine"} +ip_schema: Dict = {"distance_metric": "IP"} +l2_schema: Dict = {"distance_metric": "L2"} def test_cosine(texts: List[str]) -> None: @@ -96,7 +256,7 @@ def test_cosine(texts: List[str]) -> None: texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL, - distance_metric="COSINE", + vector_schema=cosine_schema, ) output = docsearch.similarity_search_with_score("far", k=2) _, score = output[1] @@ -107,7 +267,7 @@ def test_cosine(texts: List[str]) -> None: def test_l2(texts: List[str]) -> None: """Test Flat L2 distance.""" docsearch = Redis.from_texts( - texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL, distance_metric="L2" + texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL, vector_schema=l2_schema ) output = docsearch.similarity_search_with_score("far", k=2) _, score = output[1] @@ -118,7 +278,7 @@ def test_l2(texts: List[str]) -> None: def test_ip(texts: List[str]) -> None: """Test inner product distance.""" docsearch = Redis.from_texts( - texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL, distance_metric="IP" + texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL, vector_schema=ip_schema ) output = docsearch.similarity_search_with_score("far", k=2) _, score = output[1] @@ -126,29 +286,34 @@ def test_ip(texts: List[str]) -> None: assert drop(docsearch.index_name) -def test_similarity_search_limit_score(texts: List[str]) -> None: +def test_similarity_search_limit_distance(texts: List[str]) -> None: """Test similarity search limit score.""" docsearch = Redis.from_texts( - texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL, distance_metric="COSINE" + texts, + FakeEmbeddings(), + redis_url=TEST_REDIS_URL, ) - output = docsearch.similarity_search_limit_score("far", k=2, score_threshold=0.1) - assert len(output) == 1 - _, score = output[0] - assert score == COSINE_SCORE + output = docsearch.similarity_search(texts[0], k=3, distance_threshold=0.1) + + # can't check score but length of output should be 2 + assert len(output) == 2 assert drop(docsearch.index_name) -def test_similarity_search_with_score_with_limit_score(texts: List[str]) -> None: +def test_similarity_search_with_score_with_limit_distance(texts: List[str]) -> None: """Test similarity search with score with limit score.""" + docsearch = Redis.from_texts( - texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL, distance_metric="COSINE" + texts, ConsistentFakeEmbeddings(), redis_url=TEST_REDIS_URL ) - output = docsearch.similarity_search_with_relevance_scores( - "far", k=2, score_threshold=0.1 + output = docsearch.similarity_search_with_score( + texts[0], k=3, distance_threshold=0.1, return_metadata=True ) - assert len(output) == 1 - _, score = output[0] - assert score == COSINE_SCORE + + assert len(output) == 2 + for out, score in output: + if out.page_content == texts[1]: + score == COSINE_SCORE assert drop(docsearch.index_name) @@ -156,6 +321,48 @@ def test_delete(texts: List[str]) -> None: """Test deleting a new document""" docsearch = Redis.from_texts(texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL) ids = docsearch.add_texts(["foo"]) - got = docsearch.delete(ids=ids) + got = docsearch.delete(ids=ids, redis_url=TEST_REDIS_URL) assert got assert drop(docsearch.index_name) + + +def test_redis_as_retriever() -> None: + texts = ["foo", "foo", "foo", "foo", "bar"] + docsearch = Redis.from_texts( + texts, ConsistentFakeEmbeddings(), redis_url=TEST_REDIS_URL + ) + + retriever = docsearch.as_retriever(search_type="similarity", search_kwargs={"k": 3}) + results = retriever.get_relevant_documents("foo") + assert len(results) == 3 + assert all([d.page_content == "foo" for d in results]) + + assert drop(docsearch.index_name) + + +def test_redis_retriever_distance_threshold() -> None: + texts = ["foo", "bar", "baz"] + docsearch = Redis.from_texts(texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL) + + retriever = docsearch.as_retriever( + search_type="similarity_distance_threshold", + search_kwargs={"k": 3, "distance_threshold": 0.1}, + ) + results = retriever.get_relevant_documents("foo") + assert len(results) == 2 + + assert drop(docsearch.index_name) + + +def test_redis_retriever_score_threshold() -> None: + texts = ["foo", "bar", "baz"] + docsearch = Redis.from_texts(texts, FakeEmbeddings(), redis_url=TEST_REDIS_URL) + + retriever = docsearch.as_retriever( + search_type="similarity_score_threshold", + search_kwargs={"k": 3, "score_threshold": 0.91}, + ) + results = retriever.get_relevant_documents("foo") + assert len(results) == 2 + + assert drop(docsearch.index_name) From 0da5803f5ae54c9a7ba651f3e90e5eacf8b28d26 Mon Sep 17 00:00:00 2001 From: Nikhil Suresh Date: Fri, 25 Aug 2023 20:10:33 -0500 Subject: [PATCH 138/143] fixed regex to match sources for all cases, also includes source (#9775) - Description: Updated the regex to handle all the different cases for string matching (SOURCES, sources, Sources), - Issue: https://github.com/langchain-ai/langchain/issues/9774 - Dependencies: N/A --- .../langchain/chains/qa_with_sources/base.py | 8 +++++--- .../unit_tests/chains/test_qa_with_sources.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/libs/langchain/langchain/chains/qa_with_sources/base.py b/libs/langchain/langchain/chains/qa_with_sources/base.py index db07d24b2..d0408059a 100644 --- a/libs/langchain/langchain/chains/qa_with_sources/base.py +++ b/libs/langchain/langchain/chains/qa_with_sources/base.py @@ -120,9 +120,11 @@ class BaseQAWithSourcesChain(Chain, ABC): def _split_sources(self, answer: str) -> Tuple[str, str]: """Split sources from answer.""" - if re.search(r"SOURCES:\s", answer): - answer, sources = re.split(r"SOURCES:\s|QUESTION:\s", answer)[:2] - sources = re.split(r"\n", sources)[0] + if re.search(r"SOURCES?[:\s]", answer, re.IGNORECASE): + answer, sources = re.split( + r"SOURCES?[:\s]|QUESTION:\s", answer, flags=re.IGNORECASE + )[:2] + sources = re.split(r"\n", sources)[0].strip() else: sources = "" return answer, sources diff --git a/libs/langchain/tests/unit_tests/chains/test_qa_with_sources.py b/libs/langchain/tests/unit_tests/chains/test_qa_with_sources.py index e69d9b5cd..56daf0068 100644 --- a/libs/langchain/tests/unit_tests/chains/test_qa_with_sources.py +++ b/libs/langchain/tests/unit_tests/chains/test_qa_with_sources.py @@ -12,6 +12,21 @@ from tests.unit_tests.llms.fake_llm import FakeLLM "This Agreement is governed by English law.\n", "28-pl", ), + ( + "This Agreement is governed by English law.\nSources: 28-pl", + "This Agreement is governed by English law.\n", + "28-pl", + ), + ( + "This Agreement is governed by English law.\nsource: 28-pl", + "This Agreement is governed by English law.\n", + "28-pl", + ), + ( + "This Agreement is governed by English law.\nSource: 28-pl", + "This Agreement is governed by English law.\n", + "28-pl", + ), ( "This Agreement is governed by English law.\n" "SOURCES: 28-pl\n\n" From aab01b55db512194e361a46054f9c8ea8c21fc6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ros=C3=A1rio=20P=2E=20Fernandes?= Date: Sat, 26 Aug 2023 19:47:47 +0100 Subject: [PATCH 139/143] typo: funtions --> functions (#9784) Minor typo in the extractions use-case --- docs/extras/use_cases/extraction.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/extras/use_cases/extraction.ipynb b/docs/extras/use_cases/extraction.ipynb index 20ef1cc03..f1e6b2c23 100644 --- a/docs/extras/use_cases/extraction.ipynb +++ b/docs/extras/use_cases/extraction.ipynb @@ -55,7 +55,7 @@ "source": [ "## Quickstart\n", "\n", - "OpenAI funtions are one way to get started with extraction.\n", + "OpenAI functions are one way to get started with extraction.\n", "\n", "Define a schema that specifies the properties we want to extract from the LLM output.\n", "\n", @@ -122,7 +122,7 @@ "id": "6f7eb826", "metadata": {}, "source": [ - "## Option 1: OpenAI funtions\n", + "## Option 1: OpenAI functions\n", "\n", "### Looking under the hood\n", "\n", From 63921e327ddfc2f75b58792eaf0b733eb0871d6b Mon Sep 17 00:00:00 2001 From: Vikas Sheoran <56562130+kkviks@users.noreply.github.com> Date: Sun, 27 Aug 2023 00:34:43 +0530 Subject: [PATCH 140/143] docs: Fix a spelling mistake in adding_memory.ipynb (#9794) # Description This pull request fixes a small spelling mistake found while reading docs. --- docs/extras/modules/memory/adding_memory.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extras/modules/memory/adding_memory.ipynb b/docs/extras/modules/memory/adding_memory.ipynb index e13d4c703..79e6cbd8d 100644 --- a/docs/extras/modules/memory/adding_memory.ipynb +++ b/docs/extras/modules/memory/adding_memory.ipynb @@ -203,7 +203,7 @@ "prompt = ChatPromptTemplate.from_messages([\n", " SystemMessage(content=\"You are a chatbot having a conversation with a human.\"), # The persistent system prompt\n", " MessagesPlaceholder(variable_name=\"chat_history\"), # Where the memory will be stored.\n", - " HumanMessagePromptTemplate.from_template(\"{human_input}\"), # Where the human input will injectd\n", + " HumanMessagePromptTemplate.from_template(\"{human_input}\"), # Where the human input will injected\n", "])\n", " \n", "memory = ConversationBufferMemory(memory_key=\"chat_history\", return_messages=True)" From 0d01cede03fbd1acc7fd3f31870ffec0b7880e3d Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Sat, 26 Aug 2023 12:16:26 -0700 Subject: [PATCH 141/143] bump 274 (#9805) --- libs/langchain/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 63597a4be..3a5f392a9 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain" -version = "0.0.273" +version = "0.0.274" description = "Building applications with LLMs through composability" authors = [] license = "MIT" From c1badc1fa215f301fb5fafb4cd16bb5854e89ecb Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Sun, 27 Aug 2023 17:18:09 -0700 Subject: [PATCH 142/143] add gmail loader (#9810) --- .../integrations/chat_loaders/facebook.ipynb | 2 +- .../integrations/chat_loaders/gmail.ipynb | 179 ++++++++++++++++++ .../langchain/langchain/chat_loaders/gmail.py | 110 +++++++++++ 3 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 docs/extras/integrations/chat_loaders/gmail.ipynb create mode 100644 libs/langchain/langchain/chat_loaders/gmail.py diff --git a/docs/extras/integrations/chat_loaders/facebook.ipynb b/docs/extras/integrations/chat_loaders/facebook.ipynb index ca4ddce0e..ab0a41ebe 100644 --- a/docs/extras/integrations/chat_loaders/facebook.ipynb +++ b/docs/extras/integrations/chat_loaders/facebook.ipynb @@ -571,7 +571,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.10.1" } }, "nbformat": 4, diff --git a/docs/extras/integrations/chat_loaders/gmail.ipynb b/docs/extras/integrations/chat_loaders/gmail.ipynb new file mode 100644 index 000000000..30e86d67b --- /dev/null +++ b/docs/extras/integrations/chat_loaders/gmail.ipynb @@ -0,0 +1,179 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b3d1705d", + "metadata": {}, + "source": [ + "# GMail\n", + "\n", + "This loader goes over how to load data from GMail. There are many ways you could want to load data from GMail. This loader is currently fairly opionated in how to do so. The way it does it is it first looks for all messages that you have sent. It then looks for messages where you are responding to a previous email. It then fetches that previous email, and creates a training example of that email, followed by your email.\n", + "\n", + "Note that there are clear limitations here. For example, all examples created are only looking at the previous email for context.\n", + "\n", + "To use:\n", + "\n", + "- Set up a Google Developer Account: Go to the Google Developer Console, create a project, and enable the Gmail API for that project. This will give you a credentials.json file that you'll need later.\n", + "\n", + "- Install the Google Client Library: Run the following command to install the Google Client Library:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84578039", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "be18f796", + "metadata": {}, + "outputs": [], + "source": [ + "import os.path\n", + "import base64\n", + "import json\n", + "import re\n", + "import time\n", + "from google.auth.transport.requests import Request\n", + "from google.oauth2.credentials import Credentials\n", + "from google_auth_oauthlib.flow import InstalledAppFlow\n", + "from googleapiclient.discovery import build\n", + "import logging\n", + "import requests\n", + "\n", + "SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']\n", + "\n", + "\n", + "creds = None\n", + "# The file token.json stores the user's access and refresh tokens, and is\n", + "# created automatically when the authorization flow completes for the first\n", + "# time.\n", + "if os.path.exists('email_token.json'):\n", + " creds = Credentials.from_authorized_user_file('email_token.json', SCOPES)\n", + "# If there are no (valid) credentials available, let the user log in.\n", + "if not creds or not creds.valid:\n", + " if creds and creds.expired and creds.refresh_token:\n", + " creds.refresh(Request())\n", + " else:\n", + " flow = InstalledAppFlow.from_client_secrets_file( \n", + " # your creds file here. Please create json file as here https://cloud.google.com/docs/authentication/getting-started\n", + " 'creds.json', SCOPES)\n", + " creds = flow.run_local_server(port=0)\n", + " # Save the credentials for the next run\n", + " with open('email_token.json', 'w') as token:\n", + " token.write(creds.to_json())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a2793ba0", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_loaders.gmail import GMailLoader" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2154597f", + "metadata": {}, + "outputs": [], + "source": [ + "loader = GMailLoader(creds=creds, n=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "0b7d11bd", + "metadata": {}, + "outputs": [], + "source": [ + "data = loader.load()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "74764bc7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Sometimes there can be errors which we silently ignore\n", + "len(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d9360a85", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.chat_loaders.utils import (\n", + " map_ai_messages,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "a9646f7a", + "metadata": {}, + "outputs": [], + "source": [ + "# This makes messages sent by hchase@langchain.com the AI Messages\n", + "# This means you will train an LLM to predict as if it's responding as hchase\n", + "training_data = list(map_ai_messages(data, sender=\"Harrison Chase \"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1a182f0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.10.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/langchain/langchain/chat_loaders/gmail.py b/libs/langchain/langchain/chat_loaders/gmail.py new file mode 100644 index 000000000..4e88accde --- /dev/null +++ b/libs/langchain/langchain/chat_loaders/gmail.py @@ -0,0 +1,110 @@ +import base64 +import re +from typing import Any, Iterator + +from langchain.chat_loaders.base import BaseChatLoader, ChatSession +from langchain.schema.messages import HumanMessage + + +def _extract_email_content(msg: Any) -> HumanMessage: + from_email = None + for values in msg["payload"]["headers"]: + name = values["name"] + if name == "From": + from_email = values["value"] + if from_email is None: + raise ValueError + for part in msg["payload"]["parts"]: + if part["mimeType"] == "text/plain": + data = part["body"]["data"] + data = base64.urlsafe_b64decode(data).decode("utf-8") + # Regular expression to split the email body at the first + # occurrence of a line that starts with "On ... wrote:" + pattern = re.compile(r"\r\nOn .+(\r\n)*wrote:\r\n") + # Split the email body and extract the first part + newest_response = re.split(pattern, data)[0] + message = HumanMessage( + content=newest_response, additional_kwargs={"sender": from_email} + ) + return message + raise ValueError + + +def _get_message_data(service: Any, message: Any) -> ChatSession: + msg = service.users().messages().get(userId="me", id=message["id"]).execute() + message_content = _extract_email_content(msg) + in_reply_to = None + email_data = msg["payload"]["headers"] + for values in email_data: + name = values["name"] + if name == "In-Reply-To": + in_reply_to = values["value"] + if in_reply_to is None: + raise ValueError + + thread_id = msg["threadId"] + + thread = service.users().threads().get(userId="me", id=thread_id).execute() + messages = thread["messages"] + + response_email = None + for message in messages: + email_data = message["payload"]["headers"] + for values in email_data: + if values["name"] == "Message-ID": + message_id = values["value"] + if message_id == in_reply_to: + response_email = message + if response_email is None: + raise ValueError + starter_content = _extract_email_content(response_email) + return ChatSession(messages=[starter_content, message_content]) + + +class GMailLoader(BaseChatLoader): + """This loader goes over how to load data from GMail. + + There are many ways you could want to load data from GMail. + This loader is currently fairly opinionated in how to do so. + The way it does it is it first looks for all messages that you have sent. + It then looks for messages where you are responding to a previous email. + It then fetches that previous email, and creates a training example + of that email, followed by your email. + + Note that there are clear limitations here. For example, + all examples created are only looking at the previous email for context. + + To use: + + - Set up a Google Developer Account: + Go to the Google Developer Console, create a project, + and enable the Gmail API for that project. + This will give you a credentials.json file that you'll need later. + """ + + def __init__(self, creds: Any, n: int = 100, raise_error: bool = False) -> None: + super().__init__() + self.creds = creds + self.n = n + self.raise_error = raise_error + + def lazy_load(self) -> Iterator[ChatSession]: + from googleapiclient.discovery import build + + service = build("gmail", "v1", credentials=self.creds) + results = ( + service.users() + .messages() + .list(userId="me", labelIds=["SENT"], maxResults=self.n) + .execute() + ) + messages = results.get("messages", []) + for message in messages: + try: + yield _get_message_data(service, message) + except Exception as e: + # TODO: handle errors better + if self.raise_error: + raise e + else: + pass From 610f46d83aae6e1e25d76a0222b3158e2c4f7034 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Sun, 27 Aug 2023 17:18:24 -0700 Subject: [PATCH 143/143] accept openai terms (#9826) --- libs/langchain/langchain/prompts/chat.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/langchain/langchain/prompts/chat.py b/libs/langchain/langchain/prompts/chat.py index 7e7e5809f..59fcb30c8 100644 --- a/libs/langchain/langchain/prompts/chat.py +++ b/libs/langchain/langchain/prompts/chat.py @@ -674,18 +674,18 @@ def _create_template_from_message_type( Returns: a message prompt template of the appropriate type. """ - if message_type == "human": + if message_type in ("human", "user"): message: BaseMessagePromptTemplate = HumanMessagePromptTemplate.from_template( template ) - elif message_type == "ai": + elif message_type in ("ai", "assistant"): message = AIMessagePromptTemplate.from_template(template) elif message_type == "system": message = SystemMessagePromptTemplate.from_template(template) else: raise ValueError( - f"Unexpected message type: {message_type}. Use one of 'human', 'ai', " - f"or 'system'." + f"Unexpected message type: {message_type}. Use one of 'human'," + f" 'user', 'ai', 'assistant', or 'system'." ) return message