From e722f2e835b9484ada42c6c92e22a1dc706a04d8 Mon Sep 17 00:00:00 2001 From: Vaibhav Gupta Date: Wed, 13 Nov 2024 09:40:03 -0600 Subject: [PATCH] attempts at evaluting perf --- .../src/tracing/api_wrapper/mod.rs | 2 + .../fiddle-examples/classify-message.baml | 13 +- .../fiddle-examples/extract-receipt-info.baml | 29 +- integ-tests/python/app/perf_tests.py | 352 ++++ integ-tests/python/app/stats.ipynb | 576 ++++++ .../python/baml_client/async_client.py | 8 +- integ-tests/python/baml_client/inlinedbaml.py | 4 +- integ-tests/python/baml_client/sync_client.py | 8 +- integ-tests/python/cache/baml_results.pkl | Bin 0 -> 19995 bytes .../python/cache/json_object_results.pkl | Bin 0 -> 31317 bytes ...nai_chat_completion_prediction_results.pkl | Bin 0 -> 31437 bytes .../cache/openai_chat_completion_results.pkl | Bin 0 -> 31437 bytes .../cache/openai_structured_results.pkl | Bin 0 -> 17461 bytes .../cache/openai_structured_union_results.pkl | Bin 0 -> 17838 bytes .../openai_structured_with_schema_results.pkl | Bin 0 -> 17457 bytes integ-tests/python/cache/raw_curl_results.pkl | Bin 0 -> 36769 bytes .../python/cache_short/baml_results.pkl | Bin 0 -> 196 bytes .../cache_short/json_object_results.pkl | Bin 0 -> 196 bytes .../openai_chat_completion_results.pkl | Bin 0 -> 196 bytes .../cache_short/openai_structured_results.pkl | Bin 0 -> 196 bytes .../openai_structured_with_schema_results.pkl | Bin 0 -> 196 bytes .../python/cache_short/raw_curl_results.pkl | Bin 0 -> 196 bytes integ-tests/python/cache_win/baml_results.pkl | Bin 0 -> 19995 bytes .../python/cache_win/json_object_results.pkl | Bin 0 -> 31328 bytes .../openai_chat_completion_results.pkl | Bin 0 -> 31448 bytes .../cache_win/openai_structured_results.pkl | Bin 0 -> 23986 bytes .../openai_structured_with_schema_results.pkl | Bin 0 -> 23965 bytes .../python/cache_win/raw_curl_results.pkl | Bin 0 -> 36780 bytes integ-tests/python/poetry.lock | 1593 ++++++++++++++++- integ-tests/python/pyproject.toml | 5 + integ-tests/ruby/baml_client/client.rb | 12 +- integ-tests/ruby/baml_client/inlined.rb | 4 +- .../typescript/baml_client/async_client.ts | 8 +- .../typescript/baml_client/inlinedbaml.ts | 4 +- .../typescript/baml_client/sync_client.ts | 4 +- 35 files changed, 2588 insertions(+), 34 deletions(-) create mode 100644 integ-tests/python/app/perf_tests.py create mode 100644 integ-tests/python/app/stats.ipynb create mode 100644 integ-tests/python/cache/baml_results.pkl create mode 100644 integ-tests/python/cache/json_object_results.pkl create mode 100644 integ-tests/python/cache/openai_chat_completion_prediction_results.pkl create mode 100644 integ-tests/python/cache/openai_chat_completion_results.pkl create mode 100644 integ-tests/python/cache/openai_structured_results.pkl create mode 100644 integ-tests/python/cache/openai_structured_union_results.pkl create mode 100644 integ-tests/python/cache/openai_structured_with_schema_results.pkl create mode 100644 integ-tests/python/cache/raw_curl_results.pkl create mode 100644 integ-tests/python/cache_short/baml_results.pkl create mode 100644 integ-tests/python/cache_short/json_object_results.pkl create mode 100644 integ-tests/python/cache_short/openai_chat_completion_results.pkl create mode 100644 integ-tests/python/cache_short/openai_structured_results.pkl create mode 100644 integ-tests/python/cache_short/openai_structured_with_schema_results.pkl create mode 100644 integ-tests/python/cache_short/raw_curl_results.pkl create mode 100644 integ-tests/python/cache_win/baml_results.pkl create mode 100644 integ-tests/python/cache_win/json_object_results.pkl create mode 100644 integ-tests/python/cache_win/openai_chat_completion_results.pkl create mode 100644 integ-tests/python/cache_win/openai_structured_results.pkl create mode 100644 integ-tests/python/cache_win/openai_structured_with_schema_results.pkl create mode 100644 integ-tests/python/cache_win/raw_curl_results.pkl diff --git a/engine/baml-runtime/src/tracing/api_wrapper/mod.rs b/engine/baml-runtime/src/tracing/api_wrapper/mod.rs index 9bc334d28..dcd6b5567 100644 --- a/engine/baml-runtime/src/tracing/api_wrapper/mod.rs +++ b/engine/baml-runtime/src/tracing/api_wrapper/mod.rs @@ -35,6 +35,7 @@ impl APIConfig { Self::LocalOnly(config) => config.api_key.as_deref(), Self::Web(config) => Some(config.api_key.as_str()), } + .map(|s| s.trim()).filter(|s| !s.is_empty()) } pub fn stage(&self) -> &str { @@ -337,6 +338,7 @@ impl APIWrapper { pub fn project_id(&self) -> Option<&str> { self.config.project_id() + .map(|s| s.trim()).filter(|s| !s.is_empty()) } pub fn session_id(&self) -> &str { diff --git a/integ-tests/baml_src/fiddle-examples/classify-message.baml b/integ-tests/baml_src/fiddle-examples/classify-message.baml index 216ca59b7..70fd4cf76 100644 --- a/integ-tests/baml_src/fiddle-examples/classify-message.baml +++ b/integ-tests/baml_src/fiddle-examples/classify-message.baml @@ -8,7 +8,7 @@ enum Category { } function ClassifyMessage(input: string) -> Category { - client GPT4 + client "openai/gpt-4o" prompt #" Classify the following INPUT into ONE @@ -20,4 +20,13 @@ function ClassifyMessage(input: string) -> Category { Response: "# -} \ No newline at end of file +} + +test TestName { + functions [ClassifyMessage] + args { + input #" + hello world + "# + } +} diff --git a/integ-tests/baml_src/fiddle-examples/extract-receipt-info.baml b/integ-tests/baml_src/fiddle-examples/extract-receipt-info.baml index f177675d9..479807bdd 100644 --- a/integ-tests/baml_src/fiddle-examples/extract-receipt-info.baml +++ b/integ-tests/baml_src/fiddle-examples/extract-receipt-info.baml @@ -11,10 +11,10 @@ class ReceiptInfo { venue "barisa" | "ox_burger" } -function ExtractReceiptInfo(email: string, reason: "curiosity" | "personal_finance") -> ReceiptInfo { +function ExtractReceiptInfo(email: string, idx: int) -> ReceiptInfo { client GPT4o prompt #" - Given the receipt below: + {{idx}}: Given the receipt below: ``` {{email}} @@ -24,3 +24,28 @@ function ExtractReceiptInfo(email: string, reason: "curiosity" | "personal_finan "# } +test TestName { + functions [ExtractReceiptInfo] + args { + email #" + 04/14/2024 1:05 pm + Venue: Ox Burger + Ticket: 220000082489 + Register: Shop Counter + Employee: Connor + Customer: Sam + Item # Price + Guide leash (1 Pair) uni UNI + 1 $34.95 + The Index Town Walls + 1 $35.00 + Boot Punch + 3 $60.00 + Subtotal $129.95 + Tax ($129.95 @ 9%) $11.70 + Total Tax $11.70 + Total $141.65 + "# + reason "curiosity" + } +} diff --git a/integ-tests/python/app/perf_tests.py b/integ-tests/python/app/perf_tests.py new file mode 100644 index 000000000..298be450d --- /dev/null +++ b/integ-tests/python/app/perf_tests.py @@ -0,0 +1,352 @@ +""" +This script measures the performance of the BAML client compared to the OpenAI API. + +BAML_LOG=off python -m app.perf_tests +""" + +from baml_client.sync_client import b +import timeit +import os +from baml_py.baml_py import ClientRegistry +from pydantic import BaseModel +import requests +import openai +from baml_client.types import ReceiptInfo, ReceiptItem + +MAX_RUNS = 10 + +receipt = """ +04/14/2024 1:05 pm +Venue: Ox Burger +Ticket: 220000082489 +Register: Shop Counter +Employee: Connor +Customer: Sam +Item # Price +Guide leash (1 Pair) uni UNI +1 $34.95 +The Index Town Walls +1 $35.00 +Boot Punch +3 $60.00 +Burger Deluxe +2 $15.00 +Fries Large +3 $9.00 +Soda +4 $8.00 +Ice Cream Sundae +2 $10.00 +Coffee +5 $12.50 +Chicken Wings +6 $18.00 +Salad +2 $12.00 +Milkshake +3 $7.50 +Onion Rings +2 $6.00 +Nachos +1 $8.50 +Pizza +1 $14.00 +Pasta +2 $16.00 +Steak +2 $25.00 +Grilled Cheese +3 $5.00 +Fish Tacos +4 $20.00 +Burrito +2 $11.00 +Quesadilla +3 $9.00 +Hot Dog +5 $7.00 +Cheesecake +2 $8.00 +Brownie +3 $6.00 +Muffin +4 $4.00 +Tea +3 $3.50 +Lemonade +2 $4.50 +Smoothie +3 $5.50 +Water +6 $1.00 +Subtotal $739.45 +Tax ($739.45 @ 9%) $66.55 +Total Tax $66.55 +Total $806.00 +""" + +model = "gpt-4o-mini" + +instructions = f'Given the receipt below:\n\n```\n{receipt}\n```\n\n' +schema = 'Answer in JSON using this schema:\n{\n items: [\n {\n name: string,\n description: string or null,\n quantity: int,\n price: float,\n }\n ],\n total_cost: float or null,\n venue: "barisa" or "ox_burger",\n}' + +def openai_chat_completion(idx: int): + client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + res = client.chat.completions.create( + model=model, + temperature=0.0, + messages=[ + { + "role": "system", + "content": [ + { + "type": "text", + "text": f'{idx}: ' + instructions + schema, + } + ], + } + ], + ) + return res.choices[0].message.content + +def openai_chat_completion_prediction(idx: int): + client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + res = client.chat.completions.create( + model=model, + temperature=0.0, + messages=[ + { + "role": "system", + "content": [ + { + "type": "text", + "text": f'{idx}: ' + instructions + schema, + } + ], + } + ], + prediction={ + "type": "content", + "content": """ +{ + "items": [ + { + "name": "Water", + "description": null, + "quantity": 6, + "price": 1.00 + }, + { + "name": "Water", + "description": null, + "quantity": 6, + "price": 1.00 + } + ], + "total_cost": 739.45, + "venue": "barisa" +} + """.strip() + } + ) + return res.choices[0].message.content + +class UnionReceiptInfo(BaseModel): + value: ReceiptInfo | ReceiptItem + +def openai_structured(idx: int): + client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + res = client.beta.chat.completions.parse( + model=model, + temperature=0.0, + messages=[ + { + "role": "system", + "content": [ + { + "type": "text", + "text": f'{idx}: ' + instructions, + } + ], + } + ], + response_format=ReceiptInfo, + ) + return res.choices[0].message.parsed + +def openai_structured_union(idx: int): + client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + res = client.beta.chat.completions.parse( + model=model, + temperature=0.0, + messages=[ + { + "role": "system", + "content": [ + { + "type": "text", + "text": f'{idx}: ' + instructions, + } + ], + } + ], + response_format=UnionReceiptInfo, + ) + return res.choices[0].message.parsed + +def openai_structured_with_schema(idx: int): + client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + res = client.beta.chat.completions.parse( + model=model, + temperature=0.0, + messages=[ + { + "role": "system", + "content": [ + { + "type": "text", + "text": f'{idx}: ' + instructions + schema, + } + ], + } + ], + response_format=ReceiptInfo, + ) + return res.choices[0].message.parsed + + +def json_object(idx: int): + client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + res = client.chat.completions.create( + model=model, + temperature=0.0, + messages=[ + { + "role": "system", + "content": [ + { + "type": "text", + "text": f'{idx}: ' + instructions + schema, + } + ], + } + ], + response_format={"type": "json_object"}, + ) + return res.choices[0].message.content + + +def raw_curl(idx: int): + res = requests.post( + "https://api.openai.com/v1/chat/completions", + headers={ + "authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}", + "content-type": "application/json", + }, + json={ + "model": model, + "temperature": 0.0, + "messages": [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": f'{idx}: ' + instructions + schema, + } + ], + } + ], + }, + ) + return res.json() + + +def baml(idx: int): + cr = ClientRegistry() + cr.add_llm_client("GPT4oMini", "openai", {"model": model, "temperature": 0.0}) + cr.set_primary("GPT4oMini") + res = b.ExtractReceiptInfo(receipt, idx, { + "client_registry": cr + }) + return res + + +import statistics + + +def main(): + from prettytable import PrettyTable + import time + from tqdm import tqdm + import pickle + + def measure_performance(func, label): + + cache_dir = "cache" + os.makedirs(cache_dir, exist_ok=True) + cache_file = os.path.join(cache_dir, f"{label}_results.pkl") + + if os.path.exists(cache_file): + with open(cache_file, "rb") as f: + results = pickle.load(f) + else: + results = [] + for idx in tqdm(range(len(results), MAX_RUNS), desc=f"Measuring {label}"): + start_time = time.time() + val = func(idx) + end_time = time.time() + results.append({ + "time": end_time - start_time, + "value": val, + }) + with open(cache_file, "wb") as f: + pickle.dump(results, f) + times = [r["time"] for r in results] + mean_result = statistics.mean(times) + stdev_result = statistics.stdev(times) + min_result = min(times) + max_result = max(times) + total_result = sum(times) + return label, mean_result, stdev_result, min_result, max_result, total_result + + table = PrettyTable() + table.field_names = [ + "Label", + "Mean (s)", + "Std Dev (s)", + "Min (s)", + "Max (s)", + "Total (s)", + ] + + functions = [ + ("baml", baml), + ("openai_structured", openai_structured), + ("openai_structured_union", openai_structured_union), + ("json_object", json_object), + ("raw_curl", raw_curl), + ("openai_chat_completion", openai_chat_completion), + ("openai_structured_with_schema", openai_structured_with_schema), + ("openai_chat_completion_prediction", openai_chat_completion_prediction), + ] + for label, func in functions: + label, mean_result, stdev_result, min_result, max_result, total_result = ( + measure_performance(func, label) + ) + table.add_row( + [ + label, + f"{mean_result:.4f}", + f"{stdev_result:.4f}", + f"{min_result:.4f}", + f"{max_result:.4f}", + f"{total_result:.4f}", + ] + ) + print(table) + print() + + +if __name__ == "__main__": + main() diff --git a/integ-tests/python/app/stats.ipynb b/integ-tests/python/app/stats.ipynb new file mode 100644 index 000000000..75a74e5a5 --- /dev/null +++ b/integ-tests/python/app/stats.ipynb @@ -0,0 +1,576 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import TypedDict\n", + "from pydantic import BaseModel\n", + "import pickle\n", + "import os\n", + "\n", + "from baml_client.types import ReceiptInfo, ReceiptItem\n", + "class UnionReceiptInfo(BaseModel):\n", + " value: ReceiptInfo | ReceiptItem\n", + "\n", + "\n", + "cache_dir = \"../cache\"\n", + "\n", + "dirs = [\n", + " \"baml_results.pkl\",\n", + " \"openai_structured_results.pkl\",\n", + " \"openai_structured_union_results.pkl\",\n", + " \"json_object_results.pkl\",\n", + " \"raw_curl_results.pkl\",\n", + " \"openai_chat_completion_results.pkl\",\n", + " \"openai_chat_completion_prediction_results.pkl\",\n", + " \"openai_structured_with_schema_results.pkl\",\n", + "]\n", + "\n", + "class Result(TypedDict):\n", + " time: float\n", + " value: BaseModel | str | None\n", + "\n", + "results: dict[str, list[Result]] = {}\n", + "for dir in dirs:\n", + " with open(os.path.join(cache_dir, dir), \"rb\") as f:\n", + " results[dir[:-len(\"_results.pkl\")]] = pickle.load(f)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6kF27d/DkZSjLFq4iDtvu6PeY+nevTupqal8//33JCcn8/bbb7No0S8IgkqOk3E7nbhdpy53nZKSwmOPPcaGDRs4fuwYS775huQTJ+jZpQsYjER270lGWir79+5mT3I6R7OLcddyoh8xYgQGg4HHH3+c5ORkvv3222oZHCDFw3z33Xc8/fTTHDhwgN07dvHK669IM9UqkjonsXr1ajIyMsjPl9LeJ0yYQF5eHi+//DLJycm8++67/PHHHyAIaMJCpXVFUa68WsFVV11FeHg4cy6azY59mzmRdpx1G9Zw5x3/Ji0tDYB77rmHF198kUWLFnHw4EHuuOMOiqukep+KkJAQBgwYwDfffCMHlo4bN47t27dz+PDhOi/SSUlJpKSksHPnTvLz87HbmxajJ4oijz70OAsXLiLleDIHDx9gxdq/ZeF7xRVXEB0dzSW3XMX6LRs5lpzMz9//xIYNG+q1/YCAAB588EHuu+8+vvjiC5KTk9m+fTv/+9//+OKLLxo97pCQEMLCwvjoo484evQoy5cv5/7776+xnFqtwt+oJTBcT1gnI6GxRkyh/nJRubpwu1o3ieCMEB8AmnA9QdM6E3ZFL4KmdUYXF0D49f0wjavs3GndmkPeR7sbVeK5NvYs/4uD3o6qOr2BC+59VG4F7osugyLoPFCKVLeWOtj0y7EmjyHzSDE/vbCFwtQyknTeQjoqgZ7X9vEZkHQy2shITBMnAGAsK2Z4zgGg46Xcwknl1jtQp1uplLoUo6H116Pzr2mad1qs6Aoqf5MBI0dx1113MXr0aPr27cvo0aO56667aviemxNBo+Hld99h9rRp3PT444y6+GKO7N/HkkWLCAmp7L/y4osvcs899zBkyBCys7P59ddf5ViEAQMGsGrVKo4cPcI5F53LiGlj+c9rzxEdHIFYz4j+mTNnct9993HXXXcxaNAg1q9fz5NPPglAcHSsfCcretyYC+vO/DEYDBw8eJCLLrqInr17c+cTT3DL5Zdz81VX4Z8Qz+3XXcXESVO46bIZTBjYje+/+46jub6tKqGhoXz99dcsWbKE/v3789133zF37txqy0yYMIGffvqJxYsXM2jQICZNmcyWndsAUBs1/Oc//+H48eN07dpVdo307t2b9957j3fffZeBAweyefNmHnzwQQA0kZFyWrTodOI2V47NYDCwevVqEhISuOqa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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Draw line plot of results\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Plot each line in a different color\n", + "for i, (label, result) in enumerate(results.items()):\n", + " plt.plot([r[\"time\"] for r in result], label=label, marker='o', linestyle='-', linewidth=2, markersize=5)\n", + "\n", + "plt.legend()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------------------------------+----------+-------------+---------+---------+-----------+\n", + "| Label | Mean (s) | Std Dev (s) | Min (s) | Max (s) | Total (s) |\n", + "+-----------------------------------+----------+-------------+---------+---------+-----------+\n", + "| baml | 16.2446 | 4.6194 | 11.4008 | 24.5126 | 162.4455 |\n", + "| openai_structured | 3.6807 | 0.2585 | 3.2846 | 4.1065 | 36.8075 |\n", + "| openai_structured_union | 4.7104 | 1.1880 | 3.9130 | 7.8535 | 47.1039 |\n", + "| json_object | 16.2044 | 5.0108 | 12.3032 | 27.1691 | 162.0444 |\n", + "| raw_curl | 17.6533 | 2.1472 | 13.6537 | 21.1613 | 176.5326 |\n", + "| openai_chat_completion | 15.9312 | 3.3310 | 12.1581 | 22.2598 | 159.3119 |\n", + "| openai_chat_completion_prediction | 17.6721 | 3.7676 | 13.4465 | 24.5233 | 176.7208 |\n", + "| openai_structured_with_schema | 6.8911 | 0.8138 | 6.0212 | 8.4001 | 68.9111 |\n", + "+-----------------------------------+----------+-------------+---------+---------+-----------+\n" + ] + } + ], + "source": [ + "# pretty table\n", + "from prettytable import PrettyTable\n", + "import statistics\n", + "\n", + "table = PrettyTable()\n", + "table.field_names = [\"Label\", \"Mean (s)\", \"Std Dev (s)\", \"Min (s)\", \"Max (s)\", \"Total (s)\"]\n", + "for label, r in results.items():\n", + " result = [r[\"time\"] for r in r]\n", + " table.add_row([label, f\"{statistics.mean(result):.4f}\", f\"{statistics.stdev(result):.4f}\", f\"{min(result):.4f}\", f\"{max(result):.4f}\", f\"{sum(result):.4f}\"])\n", + "print(table)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/j1/hfmhf1496vv29mng9yq7wmy80000gn/T/ipykernel_3871/1885449317.py:4: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11.\n", + " plt.boxplot(values, labels=keys)\n" + ] + }, + { + "data": { + "image/png": "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ERFRtkh3oBo4cKBcvXpVNm7cqFMBxowZIxEREcp/Dx8+1On9iIiIiLJauoZN8Pf3l127dsmxY8ekZMmSynIbGxt58+aNhIeHa7VSPX36VGxsbFJ9r7x580revHnTUwwiIiIivZCmFioA4u/vL9u2bZNDhw5J2bJltV53d3eX3Llzy8GDB5VlN27ckAcPHoiHh0fGlJiIiIhIz6SphWrgwIGyfv162bFjh5ibmyv9oiwsLCR//vxiYWEhX375pXzzzTdiZWUlhQoVkkGDBomHhwef8CMiIqIcK02BasmSJSIi0rBhQ63lgYGB0qtXLxERmTt3rpiYmIivr6/WwJ5EREREOVWaAhWA/1wnX758smjRIlm0aFG6C0VERERkSDg5MhEREZGOGKiIiIiIdMRARURERKQjBioiIiIiHTFQEREREemIgYqIiIhIRwxURERERDpioCIiIiLSEQMVERERkY4YqIiIiIh0xEBFREREpCMGKiIiIiIdMVARERER6YiBioiIiEhHubK7AEREaXHr1i2JiopK83YhISFa/5se5ubm4ujomO7tiSjnYqAiIoNx69YtqVChgk7v4efnp9P2N2/eZKgiohQYqIgMlDG21Ki/79q1a8XZ2TlN28bGxsq9e/fE3t5e8ufPn+bPDgkJET8/v3TtcyLK+RioiAyQsbfUODs7S/Xq1dO8naenZyaUhoiIgYrIILGlhohIvzBQERkwY2ypsTFTSf7wmyKPs/Yh5fzhN8XGTJWln0lEhiNHBipj7FtCZCz6uecR52P9RI5l7ec6//9nExGlJscFKmPvW0KU0wUEv5HO360SZyenLP3ckNBQCZjdTdpm6acSkaHIcYGKfUuIcraw15BYywoidlWz9HNjw5Ik7DWy9DOJyHDkuEClZox9S4go52JXBiL9lmMDFRFRTsGuDET6j4GKiEjPsSsDkf5joCIiMhDsykCkv7J2IBciIiKiHIiBioiIiEhHDFREREREOmKgIiIiItIRAxURERGRjhioiIiIiHTEQEVERESkIwYqIiIiIh0xUBERERHpiIGKiIiISEcMVEREREQ6YqAiIiIi0hEDFREREZGOGKiIiIiIdJQruwtARPSxYmJiRETk/Pnzad42NjZW7t27J/b29pI/f/40bx8SEpLmbYjIeDBQEZHBCA0NFRGRPn36ZFsZzM3Ns+2ziUh/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IiIiHTFQEREREemIgYqIiIhIRwxURERERDriOFREBoiT5RIR6RcGKiIDxMlyiYj0CwMVkQHiZLlERPolxwUq3gohY8DJcomI9EuOC1S8FUKUfGGh/i28Sx38/+sCID2tX0RExirHBSreCiFKvrBwd3f/4Dp+fn4ffD04OJgtWEREHynHBSreCiFKvqAIDg5O9bWPvbXt5OSUWcWjDMYWSaLsl+MCFRGJFChQ4IMXBZ6enllYGspsbJEkyn4MVEREBo4tkkTZj4GKiMjAsUWSKPtx6hkiIiIiHTFQEREREemIgYqIiIhIRwxURERERDpioCIiIiLSEQMVERERkY6MbtgEjihMREREGc3oAhVHFCYiIqKMZnSBiiMKExERUUZTAUB2F0JTZGSkWFhYSEREhBQqVCi7i0NEREQfwdjP3+yUTkRERKQjBioiIiIiHTFQEREREemIgYqIiIhIRwxURERERDpioCIiIiLSEQMVERERkY4YqIiIiIh0xEBFREREpCMGKiIiIiIdMVARERER6YiBioiIiEhHDFREREREOkpzoDp27Ji0adNG7OzsRKVSyfbt27VeByDfffed2NraSv78+aVp06Zy69atjCovERERkd5Jc6CKjo6WKlWqyKJFi1J9/ccff5QFCxbI0qVL5cyZM1KwYEHx9vaWuLg4nQtLREREpI9ypXWDFi1aSIsWLVJ9DYDMmzdPvv32W2nXrp2IiKxZs0asra1l+/bt0qVLF91KS0RERKSHMrQP1d27dyUsLEyaNm2qLLOwsJDatWvLqVOnUt0mPj5eIiMjtf4jIiIiMiQZGqjCwsJERMTa2lprubW1tfLau6ZNmyYWFhbKf6VKlcrIIhERERFlumx/ym/MmDESERGh/Pfw4cPsLhIRERFRmmRooLKxsRERkadPn2otf/r0qfLau/LmzSuFChXS+o+IiIjIkGRooCpbtqzY2NjIwYMHlWWRkZFy5swZ8fDwyMiPIiIiItIbaX7K7/Xr13L79m3l77t378rFixfFyspKSpcuLUOGDJEpU6aIo6OjlC1bVsaPHy92dnbSvn37jCw3ERERkd5Ic6A6d+6cNGrUSPn7m2++ERGRnj17yqpVq2TkyJESHR0tffv2lfDwcKlXr57s27dP8uXLl3GlJiIiItIjKgDI7kJoioyMFAsLC4mIiGB/KiIiIgNh7Ofv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O+Du7o7GjRsrEx8DwOPHj1GmTBnl6V19tWfPHowdOxYAMGjQIGW+QSD5aVBbW1scPHgwRdieMmWKsuzKlStwd3c3qHHxPhYDlZE4d+4cVCoVWrdujWLFiqFnz55YvXo11q1bhyJFimi1XAH62cyclV68eIEePXrA2toaGzZsAJAcnqZNmwYPDw/0799fmVomPftqwIABGDFihPL3rVu34Obmpjzx8/LlS1y/fh3Tp0/H+fPnAST3v9i9ezd27txpMLPLk37RDFNTpkxB7969ldaSWbNmwcrKCosXL1ZaHqKiouDh4YEffvghW8qbU2ju919//RUNGzaEm5sb1q5di19//RWtWrVC5cqV9brVLzIyEt999x0cHBxQv359mJub49q1a1rrNGnSBCVKlEg1VGm6fft2Zhc3WzBQGQH1j/nQoUMYNGgQNm7cqPS9iYqKgru7Ow4fPpyNJcx+qbXyhISEwN/fHyVKlMD69esB/O/2X7169dC5c2dERkam6/O2b9+utDCFh4cjLCwMBQoUwIkTJ3DmzBn0798frq6uKFasGMqUKYMjR46keA99rnxJv40ePRrFixfHL7/8gsePHyvLx40bB2tra7Ro0QK9evWCl5eX1kMWlH6aF15btmxBlSpVkC9fPrRs2RJTpkxBXFwcAP37XXfp0kWZnDwqKgqenp5QqVRaTxlr9qlq2rQpypQpg927d6eoV3N6a7qJUI4A4L2vmZiYCABp1KiRzJs3Tzp37iyWlpYSFRUlnTp1krx584qXl1cWllb/mJgk/xQePHigLHNychJ/f39p166djBgxQjZt2iSmpqYyfPhw8fLyEgsLCylYsGCaPkf979SuXTvJnTu3rFmzRrp06SJxcXHi5+cn3t7e0rhxY8mTJ4/88MMP8uzZM8mbN68cP348xXuZmprq8I3JWJ04cUI2btwov/32m/j5+Ymtra0kJiaKiMiUKVNk/vz5UrlyZYmIiJDatWvLhQsXJFeuXMo6lD4qlUr5/fv6+sqECRPE09NTzMzMpHXr1pI3b1558+aNXv2ur127JgUKFJBChQqJiEjevHmlRo0a0r9/fzl+/LiMHz9eRETy5csnMTExIiLyxx9/SNGiRSUgIECpV9Xe/TvHyd48RxlBPdL5x4qPj8fcuXNRr1491KxZ06j74mh+5y1btiiPAGu6fv06unbtChsbG/z+++/KdhnxGP/ixYvh4eGBrl274sqVKzh58iROnDihdTXboEEDLF26NN2fQaRp9+7dcHR0xLNnz1I8SaZ53Gn+f7ZQZZx3x7Zr3LgxfHx8cPbs2Wws1fupy7tkyRKlr+3Tp08xceJEODs749tvv1XWTUhIUKbBMsbzSQ6Piznf8OHD5bvvvhORD7dSaTIxMRFXV1dp3LixnDx5UnLnzi0JCQk5/+rhHXFxccp3joqKEhcXF6ldu7YMGzZMDh06pKzn7OwsPj4+8vTpU2nXrp3s27dPTExMlCtOXfbbV199JX379pV//vlHpkyZIjY2NlK3bl15/fq13LhxQ9q0aSPh4eHy5Zdf6vx9iUREXr9+Lffu3VN+8wkJCcqxfOjQITl9+rQkJSWJSqVStsmVK1c2lli/JSUlpbr8fS16mi1V3bp1kwEDBsiDBw9k7ty5Eh8fn2nlTCt1+VUqlTx79kwWLFggnp6e8vjxYylevLh88cUX0qVLF9m2bZuMGjVK4uPjpWXLlkqrlYmJyXv3TY6VvXmOdHXy5Enl6lHdLyqtVwbGeCWxa9cuzJs3D0DyuDouLi4Akvdnly5d4Orqij///FNZ/8SJE+jevTt+/vnnDOvj8O5UQF5eXujUqRNCQkJw+PBh1K1bF15eXjliFnbSH0+ePEGdOnXg6+ur1X8qNjYWjRs3xvTp07OxdIZF8zf866+/IjAwUGuQyve17GkOlxIWFoZ169bh/v37mVvYdFI/sHT27Fk0atQIFSpUUFqhHjx4gBkzZsDGxgZlypRBlSpVDH6CY10wUOUQGzZsgKOjIy5fvgzgwyFJsxJIb6dqQ/fVV1/Bzs5OGZROvd+A5FDVtWtXVKhQAevXr8eNGzfQtm1bDBo0SNl3mRGqAgMD0aBBA3Tq1Al//PEHgoKClMqJt1woIy1duhReXl7w8vLCvn37sH79ejRv3hxVqlThsfaRNH+733zzDaysrFChQgWULFkSnTt3Vl57d39qbjdnzhxUrFhRCSj65siRI6hevboSqk6ePIkGDRpohaqXL18iNDQUv/32m9E/fcxAlUPs3LkT3t7eqFu3Lq5cuQIg9VCl+WNesGABBgwYoEzCaQw0v3+tWrWgUqkwevToFBXA2bNnMWDAAKhUKlSoUAFVq1ZVwk1GDymh+X4rVqxAw4YN0blzZ9y5cweA8VZOlPE0j7WtW7eiffv2KFiwIKpVq4a2bduyNTQdnj17hmbNmuHKlSv4559/sH37dhQvXhytW7dW1lHvT839v3TpUhQuXFh5glgfvHvOuHv3LqpVq4ZBgwYBSC7/iRMn0KBBAzg5OWm1cKoZ87HDQGWA3ndC37t3L1q2bIlatWqlGqo0twsICECBAgWwcePGzC2sHtHcFwkJCfjiiy/QpUsXlC9fHvPnz08xoGFiYiLOnTuHoKAgZdvMCjfvtlR5eXlh1KhRiI2NNfoxwejjfczJLLWT5qtXrzigbzrMmzcPHh4e6Ny5M6KjowEkTxuzd+9eFC9eHG3atFHW1bwVtnTpUr2ediU4OFgZKuHgwYPIlSuXEvySkpJw8uRJNG7cONX5RI0ZA5WB0awMr127hpCQENy8eVNZtnv37lRD1bsTUhYqVCjHDfv/IZrff8mSJcrTekDyiL9ly5ZNEao0R48HMv/KSzM4DR8+HPXq1dPr2eZJv6hP6EDyk6kf25dF87dhjP0p0ys+Ph6LFi1CmTJllD6Yam/fvsXevXtha2sLDw8PrdeWLVsGCwsLvQ1TK1euhEqlQrt27ZRzyHfffYcmTZpodY04evQoBg4caNQtUu9ioDIgmifc8ePHo0qVKrC2toaXlxfmzp2rvLZ79260atUKHh4eyijbasuWLdPrK6PMNnz4cJQqVQpjxozRmvpl0KBBcHBwwMyZMxEaGoomTZrA09MTQNaOGq/+rIkTJ6JcuXIIDw/Pss8mw/Xnn3/Cz88PSUlJGDRoEKpVq/ZR/SPfPbbZGvp+qYXN58+fIzAwEAULFkwxPc/bt2+xbds2tGrVStn2119/hUqlwtatW7OkzB/j3aEzzpw5g0qVKsHNzQ1WVlYICAjA/Pnz0bp1awQEBKR6jDBUJWOgMkATJ05EsWLF8Mcff+D69evo2bMnVCoVpkyZoqyzZ88e1KlTR+tHPm/ePOTLl0+vfsxZKTAwEMWKFdOaEV2zIhg2bBgcHR1Rrlw51KpVK9tah5KSkvDrr7/i4sWL2fL5ZHjmzJmDOnXqoEqVKrCyssKtW7f+cxvNE+POnTsREhKSmUU0aJph6saNG7h8+bIy9dTbt2+xYsUKFC1aVGv0cCBl0IiIiMAff/yR6eVNj9evXwNILuPgwYMxe/Zs/Prrr+jSpQs+//xzWFpawtXVNcU8o/Q/DFQG5q+//oKHh4cyFcm+fftgbm6ODh06oGDBglqPPJ88eVKrIpg/f75edYDMat98841S4aU2qTEABAUFac1Dxf4kZCg6dOgAlUqF9u3bKyfH993C0wxTS5YsQZEiRXDs2LEsKaeh0dxXY8aMQfny5WFjYwMrKytMnjwZ9+/fR1JSElasWAFra2sMGDAg1ffR57pk06ZNKFCgALZv3474+HiEhoaiWLFi2Lt3L6KiorBlyxZUrVoVKpUKw4YNy+7i6i0GKgMTHh6OH374AdHR0Th48CBsbGwQEBCAV69eoUmTJlCpVBg1apTWNvr8Q84s7zZjA4CPjw+aNWum/K1+LTY2FkePHk3xHmzGJkPw5s0bREdHY8aMGRg7diy8vLzQs2dPpSXh3d//u/0pLSwssHnz5iwts6HQrD9mz56NokWLYvfu3bhy5QqmT58OJycnDBo0CE+fPkVMTAwCAwOhUqnw448/ZmOp0+7evXsYMmQISpQogS+++ALnz5/HgQMHUK1aNaXl8vnz55g8ebJRnk8+FgOVHnvf1aV6Es0vvvgCgwcPVm5NDRgwAPXq1UOrVq2QlJTE/hCAcusjMTERU6ZMgaurq9ZgqADwzz//wMvLC4cOHcquYhKlyYc6j8+ZMwd169ZFr169tB6sOHfunNZtbH1/0iw7HT9+XOvvN2/eoGXLllrTrADA8uXLYWdnh9WrVwNIHpNp165dBnsxtn37dvTs2RN2dnbo0aMHPv30U8ycOVM556gxVKWOgUpPaVaYhw8fxubNm/Ho0SPlyZ2YmBhUq1ZNuYUVHR2Njh07YsOGDcp2xh6o9u/fD5VKhW3btgFInn+qXLlyaNiwIXbv3o1Xr17h7t27aN26NTw9PQ22EiTjolk3bN26FT/88AOWL1+O06dPK8vnzJmD+vXro0uXLrhw4QKaNWuGJk2aKHXCwoULYWFhYVRP+n4sf39/DBgwQKv+jI2NRf369TF27FgA0AoYX3zxBapVq5Yi5OpbffKh84Fm2Z88eYLt27ejdOnSUKlUKFiwoNYDPPR+DFR6bvjw4ShSpAiKFSsGOzs7LFiwAE+fPgUATJ06FSVKlECvXr3g6emJatWqpTqAnLF68uQJBgwYgNy5cysnjsePH6N27dpwcXGBmZkZqlWrhho1anBAQzIImr/rkSNHokSJEmjUqBG8vLzg4eGhXDwAwKJFi+Dp6Qk7Ozt4enoqx/j58+fh6uqKTZs2ZXXxDUJISIiyrzSHpBkwYABsbW0RFRUF4H+tNFOmTEHz5s2zvqBpoA5MaRkW4+nTpxgwYABatGjBevEjMVDpGc0K88iRI6hTpw6OHTuGly9f4uuvv0alSpXwww8/IDw8HE+ePMHUqVPxySef4PPPPzfqUPC+x7+fPn0Kf39/qFQqJVSFh4fj9OnTCAwMxP79+9kBnQzOggULUKZMGZw8eRJA8hO8efLkgaOjo9aDJ/fu3cPZs2e16oSXL1/ixo0bWV5mQ6C5n3755RfUqVNHeSr6xYsXqF69Otzc3BAWFoaYmBi8ffsWjRo1Qo8ePbKryP9p1KhR+Oqrr5T67WNClXo/xMXFZfh0WzmZCvj/aa9Jr6xZs0aCg4PF1NRU5syZoywfNWqU/P7779KzZ0/56quvxMLCQpKSksTExERERBISEox6Zvi5c+dK9erVpUGDBgJAmSl98uTJsmjRItm5c6e0atUqxXaJiYliamqaDSUmSpvo6Gjx9/eXatWqyeDBg2Xnzp3So0cPGThwoFy/fl0uXbokc+fOlXbt2mltx2P84z1//lyeP38uffv2FQsLC+nXr5+0bt1aLl68KF999ZXcuHFDypcvLwkJCfL27Vu5cOGC5M6dW6lz9EVcXJwMHz5cgoODpVGjRvL9999Lrly5tM4Z76P5XfTte+mt7Exz9H5t27aFSqVCo0aNEBsbq/XaqFGjULlyZYwZMwbPnz9XlhvjbT7Nq63Q0FB8+umnsLS0xKlTpwD8b588ePAA7u7uyJUrF/uNkMG7e/cu/v77b4SEhKBcuXKYN28eAGDNmjXIlSsXLCwssH///mwupeHYvHkzdu7cCSB5eJVOnToBSL492qhRI3h7e2Pv3r3K+osXL8asWbOwcOFCpeVH31q41XXf69evMW7cODRo0AAjR478qJYqYzyXZAQGKj3wvgO7b9++sLOzw7Jly5T79mr9+/dH9+7deeD/v/Hjx+Pbb7/FqVOn4Ofnh6JFiyq3Q9R69uwJBwcH1KtXL5tKSZQ2mifp1G65LF++HPXq1VPqh99//x0dOnTA4sWLeYvmI8XFxeGrr76CSqWCj48PChYsiAsXLiivq0NV8+bNtaas0qSP+1rzvHLkyBF069YNpUuXxsSJEz8Yqt6d85UXoB+PgSqbaR7Q58+fx/nz53HixAllmZ+fH5ycnLBy5UplsD419YFvjKFK8zvv3bsXpUqVUirBkJAQdO3aFcWKFcNff/0FILnS7NKlC/bt22eU+4sMy61bt7TC1Lx589CnTx98+eWXuHPnjvLa8uXLYWNjg8OHDyM+Ph5t2rTB6NGj2e8lHSpUqABTU1MsXLgQQHKYVdfP58+fR+PGjdG6dWuD68w/ZMgQ1K9fH23atEGZMmVgZ2eHMWPGpBqqNOvGZcuWafU9pf/GQJWNNA/esWPHwsXFBRUqVEDJkiXRt29f5TU/Pz84OzsjMDAwxfxcxh4Ofv75Z0yYMCHF+DDXr1+Hn58fVCoVfH19UaVKFbi7u793hHQifTF06FAULVpUuRj44YcfYG5uji+//BIlS5ZE+fLl8fvvv+Pt27e4fv062rRpg8KFC8PBwQEuLi7KidLY64a0UA874+vri1y5cmHHjh0AkgOpen+qn44cOnRodhY1TbZt2wYrKyucPXsWb9++RXx8PPz9/eHu7o5x48Yp9WFCQoLW8aIeo8xYpylLLwYqPTBjxgwUKVIEJ0+eRGxsLMaNGweVSqX0AwKAHj16oHDhwti1a1c2llT/VK9eXWmqfzckvXr1CosWLYKfnx+GDh1q1E9BkuF4+/YtqlatChcXF5w4cQI9evTQun3dokULODg4KH1+QkJCsHnzZgQEBPCJ1Y/0oVtd/fv3R65cuVLc3gsPD8fjx48Nqv5YsmQJKlSooNVl5OXLl+jevTusrKwwadIkpV5UCwgI4ICv6cRAlc0SExPRtWtXBAYGAkgeqM/S0hJLly4FAK0fwqRJkwzqx5zRrl69qvz/gIAAZRT01q1bw8LCAnv37k11/2ieXHiiIX2mGfpdXFxQrlw5uLu7p5i4uEWLFihfvjx27tyZYhJvY64jPoZmmFq2bBmGDBmCHj16YN26dYiNjUVSUhIGDhyIvHnzYsuWLYiIiECHDh3Qp08fZTt938fq8m3evBlOTk7K8aP+7tevX0eRIkVQunRp/PTTT8p2c+bMgaWlJW/zpRMDVTaLjo5GmTJlsGXLFhw+fBhmZmZYsmQJgOTK9dtvv8Xu3bu1ttH3H3NmuHz5Muzt7TFz5kwMHz4cefPmRWhoqPJ6/fr1YW9vj6NHj6Y6jx+RvkttpO169epBpVJhx44dKV5v3bo1zM3NOalxOo0YMQLFixfH+PHj0bNnT5QvXx69e/dGUlISXr16hWHDhkGlUsHV1RVOTk4pWnL0ybvHhvrC8cmTJ7C1tUW3bt3w6tUr5fWzZ8+ibdu2WLRokbJtTEwM2rVrh3Xr1mVZuXMaBqos9L5+O6NHj4a3tzcKFCiAn3/+WVkeFhaGFi1aKAHLmP3zzz+YMmUKrKysYGFhgb///htAciWg5unpiXLlyuHYsWNGGTrJcGnWDTt27FAeTElISED16tXh5OSEM2fOpLhIGDZsGI/1j6S57w4ePIjy5cvjzJkzAJL7GuXLl0+Zk0/tjz/+wIYNG/T6VqrmsfPTTz+hT58+aNCgAVasWIGEhAQEBwejYMGC8PX1xaZNm/DXX3/B29sbvXr1SvHwwrutnZQ2DFRZRPOgv3//Pu7cuaP8vWfPHpQsWRLNmjVTloeFhaFly5aoW7euUVeYmpXgypUrkSdPHpQpUwYzZ85UlmuO0+Xl5YV8+fLh4sWLWVpOovR6dzqZChUq4Pvvv8e///4LIPlk5+bmhkqVKqUaqtTrUOpmzpypdBdQ77sNGzagdu3aAJJvi5mbmysXrlFRUfjzzz9T7FN938cjR46EnZ0dRo8ejalTp0KlUmHQoEEAgAsXLqBmzZooW7Ys7O3tUadOHaXFjS35GYeBKouNHTsW9vb2KFasGFxdXfHLL78AANatWwdHR0e4uLigTp06qFWrFtzd3Y26I7VmCH3x4gVCQ0Nx4cIFTJkyBRUrVsTkyZOV1zX3j7+/v1HuLzJsc+bMQZEiRXDmzBnlIkHz0faqVavC1dUVQUFBPAl+pMOHD8PFxQWdOnXSmm5n06ZN6NChA3bu3AkzMzMsXrxYee3333/HkCFD8M8//2RHkdPl6NGjKFu2rPJk6Pnz56FSqZTzCwBERkbi/v37uHTpklK36mOLmyFjoMpkmqFg7dq1KFasGDZs2KAMtFapUiXMmDEDAHDq1CmsWLEC3377LdatW6fXzcyZTXO/TZo0CZ06dVL6TD148ADjx49HxYoVMXXqVGW9CRMmKB3VAeMMoWSYYmJi4Ovrq9QFqU1mm5iYCBsbG3Tv3j1bymioVq9ejUaNGqFjx45KHfLw4UMUKlQIKpUKK1asUNaNjY1F8+bN8dlnn+l1aH23+8ju3bvRsGFDAMDGjRu1QmJERIQStD70HqQ7BqossmXLFgQEBGhdCQHJHSPLli373o6lxh4KRo4cCVtbW6xatQqPHj1Slj969AjfffcdypUrh27duqFly5YoVaqU0e8vMkxxcXFwdXXF6NGjlWXqE3psbKxyyyoxMZHH+EfSDAxr1qxBw4YN4evrq+zLvXv3wsLCAl988QX27NmDXbt2oVmzZnB1dTWYsbwmTJiAc+fO4cCBA3B0dMSaNWtgYWGhdZ7Zvn07fHx8tOpPyhwMVFng4cOHMDMzg0qlUgag1Gx1qlu3Ljp06JBdxdNb+/fvh62trdJxFEi+9Xfx4kW8fv0aMTExCAgIwCeffIJu3bopt0d55UWGJiYmBq1bt4aPjw9evXqldSK/du0a/Pz8tJ5qZaj6MPX+06xnAwMD0aBBA/j6+ir7cvfu3XBwcECZMmVQo0YN+Pj46HU3C83jYt26dbCwsMDRo0fx8uVLtGrVCiqVClOmTFHWiY2NRZs2bdC1a1e9D4c5gQoAsnuC5pwmtZm8g4KC5OuvvxYTExM5evSoFCxYUFnvm2++kXv37snWrVuzqcT6adOmTTJ79mz566+/5MKFC7Jjxw5Zt26dREVFSZMmTWTOnDlibW0tIv+bDT0hIUFy5cqVzSUnSrtjx45JkyZNZNCgQTJ8+HCxtbWV8PBw+eyzzyQxMVF27dqVol6hlDTr34SEBAEguXPnFhGRNWvWyIoVK6R48eIyefJkcXJykvDwcAkPD5f8+fNL8eLFDaIeOXDggOzZs0eqVKkin3/+uYiIbNy4URYsWCB58uSRUaNGyfPnz2XdunXyzz//yIULFyRXrlypnpso4zBQZTDNA3bHjh3y5MkTyZ07t9SvX1+ePn0qX375pZQqVUo2bNggZmZmkjt3bvHy8pKKFSvKqlWrsrfweiY4OFhq1qwprVq1kjNnzkjLli2lcePGkitXLhk8eLDs2bNHatWqpayvDlVE+ua/jk11vbFz507p0qWLuLm5SXx8vOTNm1diYmLk3Llzkjt3bp4Q0+DHH3+UP//8U3LlyiVVq1aVH374QVQqlaxbt06WLVsmxYsXl0mTJkmlSpW0ttP3fXzixAkZOHCgPHjwQH766Sfp1q2b8tqvv/4qv/76q+zfv1+qVKkipUqVkjVr1kju3LklMTFRTE1Ns7HkOR8DVSYZPny4rF69WpycnOTChQtSpUoV8fX1lZo1a0rv3r0lNjZWHB0dxdraWi5duiQXL16U3LlzMxT8P3WldvjwYdm2bZt4enpK48aNpVixYvL69Wtp2LChzJo1Sxo2bJjdRSX6oDt37ki5cuX+cz31b//atWty9OhRefjwoZQpU0Z69+4tuXLl0vtWk+ymGYSmT58u06ZNk759+0p8fLz88ssv4ubmJr/88ouULl1aVq9eLWvWrBEAsmrVKildunQ2l/793j0nJCYmyqxZs2Tx4sXi4OAgmzdvFisrK61tHj58KNbW1pI7d26DaHHLKRioMsGWLVtk8ODBsnPnTqlevbpERETIiBEj5Pbt29KlSxepVKmSDBo0SJ4+fSqHDh0SZ2dnERGjO+j/KzyqX1dXlG/fvpW4uDj59NNPJTIyUoKCgvT6SpJo+PDhEhYWJmvXrv2oi6X3tY6wdeHjnTp1Snbs2CGNGjUSb29vEUkOGA0aNBBHR0fZv3+/iIgsWbJErl+/LvPnzzeIemThwoViZmYmn3/+uSQlJcncuXNlw4YNUqNGDZk2bZoULlxYOU40jyNepGehrO2yZRxmzJiB2rVr482bN0oH6bCwMPj4+MDb2xsAEBQUBDs7O7Rs2VLZzpg6DapHOv9Y8fHxmDt3LurVq4eaNWuyAzoZhJMnTyodo589ewbg445ZHtfpc+DAAdja2qJIkSLKaPPquuL69eswNzdPMRo6oP/7+8WLF+jRowesra2xYcMGAMmd5qdNmwYPDw/0799fmVrGmM4j+kb/Y7kBwf839uXKlUvi4uLkzZs3YmJiIgkJCWJtbS1jxoyRAwcOyJUrV8TT01M2bdok165dE09PTxERo7mKGD58uHz33Xci8r999l9MTEzE1dVVGjduLCdPnpTcuXNLQkKCQVxZkvHy8PCQXLlyycaNG8XT01OuXLkiJiYmkpSU9N5tACjH9evXr7OqqDmCtbW1dOjQQV6/fi1BQUEiIkrfMzs7OylbtqxERERobaO5v/XFu8eHlZWVjB07Vjp16iTDhw+XDRs2iKmpqYwYMULatWsnV69elf79+0tUVJTRnEf0kX4dRQZOfSA3b95crl69KrNmzRIRUW7jJSYmiouLixQoUEBUKpXUq1dPAgMD5dWrV/Lw4cNsK3dW8/X1VTrgP3/+XERSViDvypUrlzRp0kQmTZqkPK1iTLdHybCZmZlJuXLlpH///nL16tX3hipo3J5ZuHChjBo1SmJjY7O6uAYhtf3n5uYm/v7+8vnnn8uCBQskICBARJIvyAoUKCDx8fGSkJCgtY0+BhB1wHvw4IGyzMnJSfz9/aVdu3YyYsQI2bRpk5iamsrw4cPFy8tLLCwspGDBgtlVZBLhLb/MsmrVKuTOnRvffPMNTpw4gevXr6NFixaoX79+iuZlzQl+jcmGDRvg6OiIy5cvA/hws7tmM3ZkZGSml40ovd53y2Xv3r1o2bIlatWqhStXrgDQPuY1twsICECBAgWwcePGzC2sgdLcV8uWLcPkyZOVUeaB5LG7Bg4cCHNzc/Tp0wfjxo1D+/bt4eDgoNczT2geD1u2bEHJkiVx8OBBrXWuX7+Orl27wsbGBr///ruynXqf6Pvty5yMgSoT/fbbb7C1tYWdnR0cHBxQt25dvR40Lqvt3LkT3t7eqFu3bqonGDXNynPBggUYMGCA0YZQ0m+ax++1a9cQEhKCmzdvKst2796daqjS3G7p0qUoVKgQfvvtt6wruIEaP348ChcujPr166NEiRJwd3dHVFQUACAkJAT9+/eHpaUlPD09sX37dmU/62P9qznJe2RkJEJCQuDr64uqVaumCFWbN2+GSqWCSqXC3r17leXsP5W9GKgy2ZMnT3Dx4kX89ddfRj0hJa/aKafTPFbHjx+PKlWqwNraGl5eXpg7d67y2u7du9GqVSt4eHjg/PnzWu+xbNkyFCpUCFu2bMmqYhsUzbohISEBn332Gc6dO4e4uDicP38ebm5uqFy5MiIiIgAkh9rBgwfDzc1NmbMvKSlJ74LHrl27MG/ePABA37594eLiAiD5oYYuXbrA1dUVf/75p7L+iRMn0L17d/z88896GQ6NFQNVFjPG5lhetZMxmThxIooVK4Y//vgD169fR8+ePVNMCbJnzx7UqVMHvXv3VpbNmzcP+fLlw9atW7Oj2Hrv3Xrk9OnTaNu2rVZdcvXqVbi5ucHNzU0JVVeuXIG/vz9cXFzw008/ZXm5P8ZXX30FOzs7NGnSBEWLFlW6QQDJoapr166oUKEC1q9fjxs3bqBt27YYNGiQEgwZqvQDAxVlKl61kzH566+/4OHhgSNHjgAA9u3bB3Nzc3To0AEFCxbE9OnTlXVPnjypFRLmz5+P9evXZ3mZDc3IkSNRtGhRuLi4oGDBgjh69KjW61evXkW1atVgbW2N6OhoAMCNGzfQq1cv1KxZE+Hh4XrTQqVZjlq1akGlUmH06NEp7mKcPXsWAwYMgEqlQoUKFVC1alWl+4i+fBdioKIswqt2Mgbh4eH44YcfEB0djYMHD8LGxgYBAQF49eoVmjRpApVKhVGjRmltY4xdANJCM3Tu2rULzs7O2Lp1K7Zs2YJatWrByclJq5UKAC5cuIDPPvtMCR0AcPPmTYSFhWVZuf/Lu7cvv/jiC3Tp0gXly5fH/Pnz8fLlyxTrnzt3DkFBQUbdfUSfcaR0ynRnz56Vr7/+WqZNmyYNGjSQ/fv3S6dOnaRp06Zy4MABGT9+vIwaNUpEkkc5rl27tvLY8IIFC6RYsWLStWvX7PwKRCm8b1Rz9Rx8X375pZiZmcnMmTMlT548MnDgQLl8+bJYWFjIzp07RUQ/H9nXV4GBgfLo0SPJlSuXjBkzRkRE/v33X2nVqpVER0fL9u3bxdHRMcV2b9++VSZH1heax87SpUulRIkS0qZNGxERGTx4sOzatUuGDBkiPXr0kMKFC4uIyNOnT5XJ4EU4er5eyu5ERzkfr9opp9FsXTh8+DA2b96MR48eKS0iMTExqFatGvr16wcAiI6ORseOHZVRrgHeqkmrSpUqQaVS4bPPPtPad//++y9q1aoFV1dXXL9+PRtLmHbDhw9HqVKlMGbMGDx8+FBZPmjQIDg4OGDmzJkIDQ1FkyZN4OnpCYDHjT5jCxVlKF61kzEZMWKEBAYGiomJieTOnVtGjx4tnTt3luLFi8u0adNk0aJF0qxZM7l165bExMTI2bNnxdTUlPOr/Yf37R9vb2+5ePGibNy4Uby8vJQWmhcvXkiNGjXE09NT1q5dm9XFTZdVq1bJyJEjZd++fVK9enUR0W51Gj58uPz++++SmJgoRYsWlaCgIMmTJ092Fpn+A0dKpwyjGaaOHDkiW7ZskX/++Ufevn0refPmldjYWLlw4YLEx8dLnjx5JCYmRp49eyYDBw6UXbt28QRDek/z+vPo0aNy/Phx2bZtm9y4cUM6deokS5culeXLl0tERIR8/vnnMnDgQHn8+LFUqFBBzpw5I6amppKYmMhj/QOSkpKU/fPq1SuJiIiQuLg4ERHZv3+/2NvbS58+feTkyZOSmJgoIiJFihSRixcvyurVq7Ot3Gl15coV8fHxkerVqyvfQ/O4mDVrlqxcuVJ+/vlnOXnypOTJkyfFKO+kX9hCRRmOV+2U061Zs0aCg4PF1NRU5syZoywfNWqU/P7779KzZ0/56quvxMLCQutCIyEhgVMmfYBmHTB58mQ5cuSIhIaGyieffCJNmzaV7t27i4hI7dq15eXLl7Jq1SqpU6eOVl8ifexbpD4GNL+fr6+vREVFyYEDB0Tkf989Li5O/vrrL/Hy8tJ6D338XqSNLVSkM161k7H57bffZOHChXLx4kWl9UREZMaMGdKuXTtZt26dzJgxQ168eKGEKQAMU/9BXQd89913Mm/ePOnevbv4+/tLfHy8jB49WhYtWiQiImfOnJHixYuLt7e3XLt2Tes99DF0qI+Bv//+W0SSA1b16tUlLCxMTp06JQkJCcp3f/nypYwfP14OHz6s9R76+L3oHdnSc4typNWrV2Pw4MEYOnSo1vKRI0fCyckJ06ZNQ3h4OADtTr3sgE767H2D8fbt2xd2dnZYtmyZMt2JWv/+/dG9e3d2IE6HR48eoWbNmti8ebOy7M6dOxg3bhzKly+PP/74Q1net29fgxnUcv/+/VCpVNi2bRsA4OnTpyhXrhwaNmyI3bt349WrV7h79y5at24NT09Pg/le9D8MVJRh2rZtC5VKhUaNGmnNSwUAo0aNQuXKlTFmzBg8f/5cWc4TDukzzTB1/vx5nD9/HidOnFCW+fn5wcnJCStXrsTr16+1tlUf2zzGP+zd/fPw4UNYWloiMDBQa/nNmzdRq1atVEc7N4Tw8eTJEwwYMAC5c+dWZnx4/PgxateuDRcXF5iZmaFatWqoUaMG53w1UGx/pnRJ7Wm+HTt2SL9+/WTXrl3yyy+/SNeuXcXMzExERKZPny4RERHy4MEDsbKyUrbhbT7SVwCUY3zcuHGyY8cOefv2rcTExEjLli0lICBAfvnlF+nRo4fMnDlTVCqV+Pr6irm5uYgkH9tgv8AP0qxHXrx4IYUKFZKiRYtK7dq15dq1a/Lq1StlHCZHR0cpXLiwXLx4McX76NvtsHf/3QGIjY2NTJgwQUxMTKRjx46yZcsW8fHxkf3790toaKiEhISInZ2dNGnSRExNTdnfzhBlb54jQ8SrdjImM2bMQJEiRXDy5EnExsZi3LhxUKlUOHXqlLJOjx49ULhwYezatSsbS2pYNOuRKVOmoHfv3vjrr78AALNmzYKVlRUWL16stGhHRUXBw8MDP/zwQ7aUNz3mzJmjTEOkrvOePn0Kf39/qFSq9x4vbJkyTAxUlCaaQWjs2LFwcXFBhQoVULJkSfTt21d5zc/PD87OzggMDERkZOR734NInyUmJqJr167K7aetW7fC0tISS5cuBQCtvlOTJk3iiTAdRo8ejeLFi+OXX37B48ePleXjxo2DtbU1WrRogV69esHLywuVK1fW6z6XmiExNDQUn376KSwtLZXwra77Hjx4AHd3d+TKlYsTvucgDFSULrxqJ2MQHR2NMmXKYMuWLTh8+DDMzMywZMkSAMCbN2/w7bffYvfu3VrbMFR9vOPHj8Pe3h5BQUHKMs39t3HjRowYMQIdOnTAiBEjlDCl7/t4/Pjx+Pbbb3Hq1Cn4+fmhaNGiOHnypNY6PXv2hIODA+rVq5dNpaSMxhu0lGZJSUly8eJFmTVrlnh4eMi2bdtk0aJFsmTJEqlTp468fv1azMzMZM2aNfL9999L8+bNs7vIRP8ptX6BBQoUkK5du8rPP/8sQUFBMn/+fOndu7eIJD/eHhwcLCVKlNDaRt/68+iziIgIyZ07t1SsWFHZ/5rDTHTu3Fk6d+6s1SdJH/sWaZZv3759smrVKvn999+latWqYmlpKYmJidKuXTvZvXu31KxZU+Lj4yU+Pl5++ukn+eSTT7K59JRROA4VpVlcXJycPHlSzM3N5ciRI/LZZ5/JtGnTpF+/fvL27VuZMWOG7NmzR0SSx5NRjzNFpK80w9SDBw/k7t27ymteXl5y7do18fT0lCZNmohI8kS1X3zxhUREREifPn2ypcw5wevXr+XevXuSkJAgJiYmynhMAOTQoUNy+vRprZHTRUTvwpTI/x6uWb58uZw+fVp69uwpVatWFRERJycnGT9+vHh7e0vt2rWlY8eOUrt2bbl165Y0bdpUVCqVJCUlZWPpKaMwUNEHpfZD17xqb9WqlcydO1f69+8vIv+7an/w4IHWNrxqJ32m+TRfgwYNpHbt2uLm5iZr166VFi1ayIwZM+TevXvSpk0b8fDwkLZt28rTp0/lyJEjvGDQgZeXl7i7u8ugQYPkyZMnSliKj4+XqVOnytGjR1OdG1RfLVmyRL7//nu5fv26Vt3p7OwsCxculJ9++kny588vjRs3llOnTinHjiF9R3o/Tj1D7/XuVXtiYqKULVtWRET27t0rffv2FWdnZwkICJCyZcsqV+3h4eFy7NgxhijSe5rH+Lp162To0KGyYMECsbW1lWXLlsnFixelZ8+eMnLkSDl9+rRcv35d7t69K87OztK5c2c+3p4BAgICZP369SIiMnbsWHn58qWsWbNGnjx5IufOndPbfXvt2jVxcXEREZFly5ZJ48aNxcHBQdq0aSNBQUGyceNGadasWYp6UPN44bGTszBQ0X8aN26crF+/XqKjo8XGxkZGjhwpfn5+sn79epk4caLkyZNHzM3NJSkpSRITE+XUqVOSO3duzj1FBuO3336TFy9eSGJionz11VfK8pEjR8qWLVtk9erVUr9+/RTb8RhPP81+R9u2bZM1a9bIH3/8IRUqVJBSpUrJli1b9LYeuXLlirRt21YGDhwoT58+lYULF8qlS5ekYsWKIpLc8vbw4UNZvXq11KtXL8U8fpQzMVBRCrxqJ2Py6NEjcXZ2lujoaBk3bpxMnjxZ6/j19PQUa2tr2bp1azaX1LB8TBB690GAe/fuiaWlpVhYWIhKpdLbeuTx48cSGBgoc+bMkcTERDl//ryUK1dOYmNjJX/+/CIiUq9ePXny5ImsWrVK6tatq3ehkDIeAxW9F6/aKSdK7Wm+oKAg+frrr8XExESOHj0qBQsWVNb75ptv5N69ewxUaRATEyMFChQQEZGQkBBxcHCQ3Llz/+d2mv82qf07ZTfNVqbAwEDp37+/2Nrair+/vwwfPlxEkh/ayZcvn4iINGjQQP766y85ffq0VKlSJdvKTVlDv45W0huPHj2SXr16Sf/+/eXx48cikny/X0Tkxx9/FFtbW5k7d26q2zJMkb7SPEnv2LFDli5dKitWrBBra2uZP3++REZGStu2beXZs2cSFxcnb9++lVOnTkmhQoWyueSG4+DBg9KvXz8BIIMHD5bu3btLXFzcf24Hjal+RPRvWirNpw1fvnwpdevWlTNnzkifPn1k+fLlMmXKFBERyZcvn/KQwtGjR6V3795SuXLlbCs3ZR39a0ulbPHu1WDJkiVlz5498vXXX8vevXtl9OjRWlfttWvXlnv37mVfgYnSQX2MDx8+XFavXi1OTk5y4cIFqVKlivj6+sqKFSukd+/eUqNGDXF0dBRra2uJjIyUn3/+WURSztFGKV2+fFlu374t1apVk4cPH8qZM2eU+Q3fR3O/7tq1SxwcHMTJySkrivtRNOvH77//Xq5evSqTJ0+WqlWrSpEiRSQ+Pl7Wrl0rpqamMmbMGDE1NZWJEyeKn5+fLFy4UETYcm8M2EJFvGono7JlyxZZv3697Nu3T44dOyaPHj2SSpUqyc6dO+X69euyfPlysbKykuvXr8v48ePl2rVrkjt3bmWMJPqwoUOHiq2trVy+fFm8vLzE1tZWRFIfgkVEO0wtXbpUevXqJf/++2+WlfdjqOvHUaNGydKlS6VVq1bKxO+lSpWSfv36SefOnWX58uXSvXt3adWqlaxcuVJ5KlqELffGgH2oSPG+q/aaNWtK7969JTY2Vrlqv3Tpkly8eFFy587Nq3YyKD/++KNs3bpVgoKCxNTUVExMTOTp06cyYMAAiY6Oln379snx48elc+fOUrVqVdm9e7eIsHXqY7x9+1bevn0rP/30k0RERMjx48elbNmyMn36dLGxsUnRyVzzYi4gIEBGjRoly5cvl44dO2bXV3ivAwcOSK9evWT79u1Sq1YtEUm+9ffw4UNxcHAQExMT+eWXX+S3336TokWLyqpVqyR37tx62ReMMknWzXJD+mzz5s2wtbXFuXPnkJSUhFevXqF3795o2LAhli5dimPHjqFKlSqwsbHB9evXle30eaJSIk3qiWlnz56NKlWq4PXr1wD+dwyfPXsWKpUKly9fRlJSEoKCglCmTBnUrVs328psCDQnBH7XnDlzULduXfTq1QthYWHK8nPnziE+Pl75e+nSpShUqBC2bNmSqWXVxcaNG1GzZk0AwPnz5zFhwgQ4ODjA2toa3bp10/p+6mON9aNxYWwmERG5c+eOlC5dWtzc3ASAWFpaypQpU8TKykq2bdsm9evXl59++klMTEyUp1lE2IxNhkPdutS8eXO5evWqzJo1S0T+N5VJYmKiuLi4SIECBUSlUkm9evUkMDBQXr16JQ8fPsy2cuszzdaXbdu2ydSpU2XFihVy5swZEUm+/dexY0f5+++/ZciQIXLx4kX55JNPZNSoUcpTfz/99JOMGjVKAgMDxdfXN9u+y39xcHCQc+fOSZs2bcTb21vu3bsn48ePlzlz5sj+/fvl/v37yrrq6XP0ccgHykTZnegoe/GqnYzRqlWrkDt3bnzzzTc4ceIErl+/jhYtWqB+/fopWlxiYmKyqZT6TV13AMDIkSNRokQJNGrUCF5eXvDw8MC2bduU1xctWgRPT0/Y2dnB09MTb968AZDc0uPq6opNmzZldfHTRH1MHDp0CIMGDcLGjRvx7NkzAEBUVBTc3d1x+PDhbCwh6QMGKgIAXLt2Daamppg4caLW8tOnT6Ny5cq4ffu2suzQoUNwdnbGgwcPsrqYRBnmt99+g62tLezs7ODg4IC6desqJ/qEhIRsLp3hWLBgAcqUKYOTJ08CAObNm4c8efLA0dER69evV9a7d+8ezp49q7VvX758iRs3bmR5mVOjGRA/9Lo6XL158waRkZFo3rw56tat+8Fbn2Qc2CmdFKtXr5Y+ffrIoEGDxNfXVwoXLizDhg2T169fy5EjR7Q6VmqOCExkqMLCwuTp06fy5s0bcXd3FxMTE70dnVsfRUdHi7+/v1SrVk0GDx4sO3fulB49esjAgQPl+vXrcunSJZk7d660a9dOazt9G0Lgzp07Uq5cuY9e/82bN7J48WL57bffJD4+Xv6vvbuPqfK8/zj+hgNYEKtiFJxNm5rY1YdpG4stos7ElVisXSui1cosCgrFOqt46EI0arWCUJVaHIKAiJJu8hCFgC5Zi64WW2FAC2S6FRZ8mFIfhgIHeTj8/mi4B61u9ufmOejn9R/3ORe57oQcPue6vvf3OnnypArQRU/5SW+5ubmsWLECBwcH3NzcGDZsGMXFxXZ7ppbIf5P+If54f//737FarbS1tTFr1ixWrlzJr3/9azIzM1myZAn9+/fn97//PX5+frae6m1FRkZy6dIlDhw4cNdPcnZ0dHD8+HFOnDjBunXrcHJyUhAXBSr5IX1rF5Hv6/kZcLsvV6mpqezbt4+ioiLc3d3Jz88nPT2dF198kWXLltntl7GSkhK8vb1xcnLi22+/ZejQoT86WCuIC6ixp9yGl5cXEyZMwNvbG0dHR6xWq8KUyEPqb3/7W68wlZCQQHh4OCEhIdTV1RlHUnW/t7S0lLa2NlJSUvjpT39KWFgYJpPJOI7F3vj4+ODk5MTHH3+Mr68vX3/9tfG5dyc91yFu3rypMCWAApXcBX1YiDycVq9ejY+PD+Xl5QC8//77rFu3DqvVyrFjx3jxxRcpKiqio6ODyZMn4+3tzZw5cxg7diy1tbW89957RgsBe12h6ubu7s7IkSMJCwujqqrqjqGq57bgrl27ePfdd7FYLPd7umKHtOUnIiK31dHRgbe3N+3t7SQnJ5OUlER4eDg+Pj4A+Pv789e//pUdO3bw8ssv85e//IWqqiquXbvG0qVLMZlMdlkucKdaqaNHj7Jr1y6uXLlCamoq48aN67Wd13NccnIy77zzDmlpacyfP/++zl/skwKViIj8QHt7u/EwyoQJE7BYLAwePJgDBw70OrjY39+fs2fPsnPnTvz8/HBxcTFes8cHWXoGpJqaGhwdHTGZTIwaNQqAwsJCEhMTfxCqgF7H5JjNZtLT05kzZ45tbkTsjvZyRESkF6vVanQyN5lMVFZW8pOf/IQ///nPnD17ttdWWGFhIaNHj2bhwoVGh/Ru9hamurq6jFC0fv16Fi5cyPTp0wkJCWHnzp3AdwExIiKCoUOHsmzZMsrLy3F0dDTGpaSkYDabSUtLU5iSXhSoRETE0HMF58iRI3z++eeYTCaKi4t59tlniYqKorS0tFdhdn5+PsuWLWPy5Mm2mvZd6d6u27hxI0lJScTHx/Ppp5/y5JNPsnr1arZs2QL8K1R1dXWxe/duY3xCQgIrV65k3759dn1MjtiGApWIiAC9V3CioqJYu3Ytf/zjH7ly5Qomk4kvv/wSFxcXgoODOX36dK9QFR8fb9dP83U7ffo0x44d49ChQ/ziF7+gvr6e3NxcXn31VbZu3UpsbCwAL730Etu3b2fPnj3GWAcHB9LS0njttddsNX2xY6qhEhGRXnbs2MGWLVsoLCxk/PjxPPLII0ZxudVqZeLEiXR2drJ79258fX3vqhmmvWhsbCQxMZFVq1Zx6tQp3njjDTZu3Mi8efOYO3cun3zyCWazmZiYGGOMPRbWi/1RoBIREYPFYiEoKIhJkyZhNpuNLcCeW4FWq5URI0YwY8YMDhw4YOMZ39mdGm7eunWLfv36sXTpUtzd3YmLi8PFxYWIiAi++uorBg4cSH5+PkCfCotiW9ryExERg6OjI2fPnuX69evGz91bga2trVRXV+Po6MiFCxfIyMiw8WzvrGeYKi4uJjs7mwsXLtDe3k6/fv2wWCyUl5dz69YtXFxcaGlpoaGhgYiICAoKChSk5EdToBIREYPVauWJJ57g7Nmz/POf/+zVe6m2tpaYmBjOnDljtBuw15qp7jC1du1a5s6dy1tvvcWkSZNISkqioaEBV1dXAgMDKSgoIDg4GD8/P7755hsCAwOBO/eqErkTBSoRETG4urqydu1ajhw5wqZNm/jHP/5BV1cX169fJyoqiqtXrxo9m8A+WyN0O378OJ999hl5eXmcOXOGwMBAkpKS2Lt3L42NjQQHBxMREcHFixd56qmn+OKLL4yQqDAlP5ZqqEREHiL/aeWle6ssPz+f119/nfHjxxs1Ry0tLZSWluLs7Gz3BwLv37+fsrIyTCYT27dvN65HRUVx5MgRFi9eTHh4OAMHDux1LypAl/8v/dWIiDwkamtrGTly5L99T3fN1OzZs/nyyy85fvw4586d44knniAkJAQnJ6c+ETpycnLIz89n+vTptLa28sgjjwAQGxuLg4MDBw8e5MaNG6xZs4YhQ4YA34VNe78vsV9aoRIReQhERkZy6dIlDhw4cFf1QXdagbL342R6Wr58OQUFBWzYsIEFCxbg7u5uvBYeHs7NmzfJzMzU9p78VyhQiYg8BEpKSvD29sbJyYlvv/2WoUOH3tW2nb1v7fWcX3l5OfBd64furu1BQUGUlpZiNpuZN28e/fv3N8Z2B0sVoMt/gwKViMhD5OOPP2b9+vXk5OTws5/97N8Gpp5Bo6mpqdcKjz3oOb/o6GgOHz5Me3s7LS0t+Pv7G13Og4KCKCsrw2w2ExAQwIABA277O0Tuhf1+7RARkf86d3d3Ro4cSVhYGFVVVUbTzu/rGTR27dpFVFQUFovlfk/33+qe37Zt29izZw8pKSlUVlayePFiUlJSOHXqFACZmZk899xzrF69mhMnTtz2d4jcKwUqEZEH1O02IF5++WVWrVrFoEGDWLp06W1DVc8wlZyczLvvvsu0adNwdXW9b3O/W1arlYqKCuLj4/Hx8aGoqIjExER++9vf8sILL9DU1AR899TfqlWrmDlzpo1nLA8qbfmJiDyAem7l1dTUGI04u3tIFRYWkpiYyJUrV0hNTWXcuHFGqOoet2fPHsxmM+np6cyZM8c2N/IftLS0MGbMGD744AOGDBnC7NmziYuLIywsjPb2djZt2oSPjw/+/v7GGHssrJe+TytUIiIPmO6jYgDWr1/PwoULmT59OiEhIezcuRMAf39/IiIiGDp0KMuWLaO8vBxHR0djXEpKCmazmbS0NLsJU7fbmnRzc2PBggWkpKQwa9YsduzYQVhYGADXrl2jrKyM+vr6XmMUpuR/QYFKROQB071dt3HjRpKSkoiPj+fTTz/lySefZPXq1WzZsgX4V6jq6upi9+7dxviEhARWrlzJvn37CAgIsMk9fF/PFbf6+nrq6uqM16ZNm0Z1dTW+vr7MmDEDgMuXL7NkyRIaGxsJDQ21yZzl4aIOZiIiD6DTp09z7NgxDh06xM9//nOOHTtGbm4ur776Klu3bsXJyYmoqCheeuklBg0axPPPP2+MdXBwIC0tjddee82Gd9Bbd5iKjo4mKyuL5uZmvLy8MJvNLFq0iNjYWDZs2MDs2bMZMGAAVquVzs5OSkpKjONktDIl/0uqoRIReQA1NjaSmJjIqlWrOHXqFG+88QYbN25k3rx5zJ07l08++QSz2UxMTIwxxh47oPdcmTp48CDvvPMOH374IcOHDyc5OZmKigoWL16M2Wzm1KlT1NTUUFdXx+jRo5k/fz4mk8ku70sePApUIiJ93J16SXWfwbd06VLc3d2Ji4vDxcWFiIgIvvrqKwYOHEh+fj5g/+0DcnJyuHr1Kp2dnYSHhxvXzWYz2dnZZGRkMHXq1B+M08qU3C+qoRIR6cN6hqni4mKys7O5cOEC7e3t9OvXD4vFQnl5Obdu3cLFxYWWlhYaGhqIiIigoKDA7oMUwPnz53nzzTcJCwvj4sWLwHerafBdD6rhw4ezY8eO245VmJL7RYFKRKQP6w5Ta9euZe7cubz11ltMmjSJpKQkGhoacHV1JTAwkIKCAoKDg/Hz8+Obb74hMDAQsM9O4d9/mu+xxx6jsLCQZ555hqKiIpqbm3FycjLe17P+S8RWFKhERPqgntUax48f57PPPiMvL48zZ84QGBhIUlISe/fupbGxkeDgYCIiIrh48SJPPfUUX3zxhVGobY9hqjskHj58mKSkJFJTU/H09CQhIYEbN27wyiuv0NDQQGtrK+3t7ZSUlPDoo4/aeObysFMNlYhIH7Z//37KysowmUxs377duB4VFcWRI0dYvHgx4eHhDBw4sFdYsfdC7cjISDIyMnj66acpLy9nwoQJBAQE4O3tTUhICBaLhVGjRuHp6UllZSUVFRU4Ozvb5YqbPBy0QiUi0ofl5OSwa9cuKioqaG1tNa7Hxsbyy1/+koMHDxIbG8vVq1eNMNXV1WXXYSo7O5usrCyOHj3KiRMnOH/+PGPGjCE/P5+amhr27t2Lh4cHNTU1rFu3jurqapydneno6FCYEptRoBIR6SNu1yn88OHDhIaGcubMGTIzM42z6wBiYmKYMmUK9fX1eHh4GNftPXTU1tby+OOPM378eLq6uhg0aBCbN2/Gw8ODvLw8pk6dykcffYSjoyORkZHGOBWgiy1py09EpA/ouV1XXl4OgMViYfLkyQAEBQVRWlqK2Wxm3rx59O/f3xjbvQ1m79th3fPbvn07+/fv5+TJk/Tv39/YniwtLWXSpElUVlYybtw4Tp48yaJFixgxYgQnT5609fTlIacVKhERO9fzbL7o6GiCgoJ4/fXXmT9/PsuXLwcgMzOT5557jri4OA4dOsTNmzeN8X0hTMG/Vs5mzpxJVVUV8fHxAMb2ZGdnJ2PHjsXNzQ0HBwemTJlCeno6169f59y5czabtwhohUpEpM/Ytm0b27ZtIz8/n2effZbNmzfz/vvv8/nnn/PCCy8A8Ktf/YqCggIyMzOZNWuWjWf8/5eRkUFoaChvv/02AQEBDB48mDVr1tDU1ERxcXGvRqYWiwVXV1cbzlZEgUpEpE+wWq0sWrQIPz8/3nzzTfLy8liyZAkxMTEsX76cpqYm3N3dAdi0aRPR0dF9vqYoNzeXFStW4ODggJubG8OGDaO4uBhnZ2d1QBe7o0AlItIHtLS0MGbMGD744AOGDBnC7NmziYuLIywsjPb2djZt2oSPjw/+/v7GmAchdFy6dInLly/T1tbGxIkTcXR0tPuWD/Jw0l+kiIidud3ZfG5ubixYsICUlBT+9Kc/kZCQQEhICADXrl2jrKyMESNG9BrT18MUgJeXF15eXsbPVqtVYUrskorSRUTsSM8wVV9fT11dnfHatGnTqK6uxtfXlxkzZgBw+fJllixZQmNjI6GhoTaZ8/10u0OgReyBtvxEROxQdHQ0WVlZNDc34+XlhdlsZtGiRWRlZbFhwwZcXFwYMGAAVquVzs5OSkpKVFskYkNaNxURsQM9V6YOHjxISkoKH374IcOHDyc5OZmtW7dy8eJFzGYzI0eOpKamhrq6OkaPHs38+fMxmUyqLRKxIa1QiYjYkZycHK5evUpnZyfh4eHGdbPZTHZ2NhkZGUydOvUH47QyJWJbClQiInbi/PnzjB49mubmZqKjo3nvvfd6rTr5+vri6elJbm6ujWcqIt+n6j4RERv5/tl8jz32GIWFhTzzzDMUFRXR3NyMk5OT8b7nn3/eFtMUkbugQCUiYgM9a6YOHz5MUlISqampeHp6kpCQwI0bN3jllVdoaGigtbWV9vZ2SkpKePTRR208cxG5HW35iYjYUGRkJBkZGTz99NOUl5czYcIEAgIC8Pb2JiQkBIvFwqhRo/D09KSyspKKigqcnZ37xNl8Ig8TrVCJiNhIdnY2WVlZHD16lBMnTnD+/HnGjBlDfn4+NTU17N27Fw8PD2pqali3bh3V1dU4OzvT0dGhMCViZxSoRERspLa2lscff5zx48fT1dXFoEGD2Lx5Mx4eHuTl5TF16lQ++ugjHB0diYyMNMbpaT4R+6NAJSJyn3VXWjg5OdHa2kpbW5txRp2npye/+c1v+MMf/sDXX3+Nr68vv/vd74wO6YBWp0TskAKViMh91h2IZs6cSVVVFfHx8QBGe4TOzk7Gjh2Lm5sbDg4OTJkyhfT0dK5fv865c+dsNm8RuTMVpYuI2FBGRgahoaG8/fbbBAQEMHjwYNasWUNTUxPFxcW9zq6zWCy4urracLYicicKVCIiNpabm8uKFStwcHDAzc2NYcOGUVxcrLP5RPoQBSoRETtw6dIlLl++TFtbGxMnTjRqqnQ2n0jfoEAlImKHejb+FBH7p0AlIiIico/09UdERETkHilQiYiIiNwjBSoRERGRe6RAJSIiInKPFKhERERE7pEClYiIiMg9UqASERERuUcKVCIiIiL3SIFKRERE5B4pUImIiIjcIwUqERERkXv0f9oBKZ3NW6Z+AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Draw box plot of results with labels\n", + "keys = list(results.keys())\n", + "values = [[r[\"time\"] for r in results[key]] for key in keys]\n", + "plt.boxplot(values, labels=keys)\n", + "plt.xticks(rotation=45)\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "baml 10\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "\n", + "openai_structured 10\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "----------\n", + "1890\n", + "\n", + "openai_structured_union 10\n", + "----------\n", + "1897\n", + "----------\n", + "1901\n", + "----------\n", + "1901\n", + "----------\n", + "1900\n", + "----------\n", + "1900\n", + "----------\n", + "1897\n", + "----------\n", + "1901\n", + "----------\n", + "1897\n", + "----------\n", + "1897\n", + "----------\n", + "1901\n", + "\n", + "json_object 10\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "----------\n", + "3106\n", + "\n", + "raw_curl 10\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "\n", + "openai_chat_completion 10\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "\n", + "openai_chat_completion_prediction 10\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "----------\n", + "3118\n", + "\n", + "openai_structured_with_schema 10\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "----------\n", + "1886\n", + "\n" + ] + } + ], + "source": [ + "for label, result in results.items():\n", + " print(label, len(result))\n", + " for r in result:\n", + " print(\"-\" * 10)\n", + " if isinstance(r[\"value\"], BaseModel):\n", + " print(len(r[\"value\"].model_dump_json()))\n", + " elif isinstance(r[\"value\"], str):\n", + " print(len(r[\"value\"]))\n", + " elif r[\"value\"] is None:\n", + " print(\"None\")\n", + " else:\n", + " print(len(r[\"value\"][\"choices\"][0][\"message\"][\"content\"]))\n", + " print()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "```json\n", + "{\n", + " \"items\": [\n", + " {\n", + " \"name\": \"Guide leash (1 Pair)\",\n", + " \"description\": null,\n", + " \"quantity\": 1,\n", + " \"price\": 34.95\n", + " },\n", + " {\n", + " \"name\": \"The Index Town Walls\",\n", + " \"description\": null,\n", + " \"quantity\": 1,\n", + " \"price\": 35.00\n", + " },\n", + " {\n", + " \"name\": \"Boot Punch\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 60.00\n", + " },\n", + " {\n", + " \"name\": \"Burger Deluxe\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 15.00\n", + " },\n", + " {\n", + " \"name\": \"Fries Large\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 9.00\n", + " },\n", + " {\n", + " \"name\": \"Soda\",\n", + " \"description\": null,\n", + " \"quantity\": 4,\n", + " \"price\": 8.00\n", + " },\n", + " {\n", + " \"name\": \"Ice Cream Sundae\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 10.00\n", + " },\n", + " {\n", + " \"name\": \"Coffee\",\n", + " \"description\": null,\n", + " \"quantity\": 5,\n", + " \"price\": 12.50\n", + " },\n", + " {\n", + " \"name\": \"Chicken Wings\",\n", + " \"description\": null,\n", + " \"quantity\": 6,\n", + " \"price\": 18.00\n", + " },\n", + " {\n", + " \"name\": \"Salad\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 12.00\n", + " },\n", + " {\n", + " \"name\": \"Milkshake\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 7.50\n", + " },\n", + " {\n", + " \"name\": \"Onion Rings\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 6.00\n", + " },\n", + " {\n", + " \"name\": \"Nachos\",\n", + " \"description\": null,\n", + " \"quantity\": 1,\n", + " \"price\": 8.50\n", + " },\n", + " {\n", + " \"name\": \"Pizza\",\n", + " \"description\": null,\n", + " \"quantity\": 1,\n", + " \"price\": 14.00\n", + " },\n", + " {\n", + " \"name\": \"Pasta\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 16.00\n", + " },\n", + " {\n", + " \"name\": \"Steak\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 25.00\n", + " },\n", + " {\n", + " \"name\": \"Grilled Cheese\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 5.00\n", + " },\n", + " {\n", + " \"name\": \"Fish Tacos\",\n", + " \"description\": null,\n", + " \"quantity\": 4,\n", + " \"price\": 20.00\n", + " },\n", + " {\n", + " \"name\": \"Burrito\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 11.00\n", + " },\n", + " {\n", + " \"name\": \"Quesadilla\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 9.00\n", + " },\n", + " {\n", + " \"name\": \"Hot Dog\",\n", + " \"description\": null,\n", + " \"quantity\": 5,\n", + " \"price\": 7.00\n", + " },\n", + " {\n", + " \"name\": \"Cheesecake\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 8.00\n", + " },\n", + " {\n", + " \"name\": \"Brownie\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 6.00\n", + " },\n", + " {\n", + " \"name\": \"Muffin\",\n", + " \"description\": null,\n", + " \"quantity\": 4,\n", + " \"price\": 4.00\n", + " },\n", + " {\n", + " \"name\": \"Tea\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 3.50\n", + " },\n", + " {\n", + " \"name\": \"Lemonade\",\n", + " \"description\": null,\n", + " \"quantity\": 2,\n", + " \"price\": 4.50\n", + " },\n", + " {\n", + " \"name\": \"Smoothie\",\n", + " \"description\": null,\n", + " \"quantity\": 3,\n", + " \"price\": 5.50\n", + " },\n", + " {\n", + " \"name\": \"Water\",\n", + " \"description\": null,\n", + " \"quantity\": 6,\n", + " \"price\": 1.00\n", + " }\n", + " ],\n", + " \"total_cost\": 806.00,\n", + " \"venue\": \"ox_burger\"\n", + "}\n", + "```\n" + ] + } + ], + "source": [ + "print(results[\"openai_chat_completion\"][0][\"value\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"items\":[{\"name\":\"Guide leash (1 Pair)\",\"description\":null,\"quantity\":1,\"price\":34.95},{\"name\":\"The Index Town Walls\",\"description\":null,\"quantity\":1,\"price\":35.0},{\"name\":\"Boot Punch\",\"description\":null,\"quantity\":3,\"price\":60.0},{\"name\":\"Burger Deluxe\",\"description\":null,\"quantity\":2,\"price\":15.0},{\"name\":\"Fries Large\",\"description\":null,\"quantity\":3,\"price\":9.0},{\"name\":\"Soda\",\"description\":null,\"quantity\":4,\"price\":8.0},{\"name\":\"Ice Cream Sundae\",\"description\":null,\"quantity\":2,\"price\":10.0},{\"name\":\"Coffee\",\"description\":null,\"quantity\":5,\"price\":12.5},{\"name\":\"Chicken Wings\",\"description\":null,\"quantity\":6,\"price\":18.0},{\"name\":\"Salad\",\"description\":null,\"quantity\":2,\"price\":12.0},{\"name\":\"Milkshake\",\"description\":null,\"quantity\":3,\"price\":7.5},{\"name\":\"Onion Rings\",\"description\":null,\"quantity\":2,\"price\":6.0},{\"name\":\"Nachos\",\"description\":null,\"quantity\":1,\"price\":8.5},{\"name\":\"Pizza\",\"description\":null,\"quantity\":1,\"price\":14.0},{\"name\":\"Pasta\",\"description\":null,\"quantity\":2,\"price\":16.0},{\"name\":\"Steak\",\"description\":null,\"quantity\":2,\"price\":25.0},{\"name\":\"Grilled Cheese\",\"description\":null,\"quantity\":3,\"price\":5.0},{\"name\":\"Fish Tacos\",\"description\":null,\"quantity\":4,\"price\":20.0},{\"name\":\"Burrito\",\"description\":null,\"quantity\":2,\"price\":11.0},{\"name\":\"Quesadilla\",\"description\":null,\"quantity\":3,\"price\":9.0},{\"name\":\"Hot Dog\",\"description\":null,\"quantity\":5,\"price\":7.0},{\"name\":\"Cheesecake\",\"description\":null,\"quantity\":2,\"price\":8.0},{\"name\":\"Brownie\",\"description\":null,\"quantity\":3,\"price\":6.0},{\"name\":\"Muffin\",\"description\":null,\"quantity\":4,\"price\":4.0},{\"name\":\"Tea\",\"description\":null,\"quantity\":3,\"price\":3.5},{\"name\":\"Lemonade\",\"description\":null,\"quantity\":2,\"price\":4.5},{\"name\":\"Smoothie\",\"description\":null,\"quantity\":3,\"price\":5.5},{\"name\":\"Water\",\"description\":null,\"quantity\":6,\"price\":1.0}],\"total_cost\":806.0,\"venue\":\"ox_burger\"}\n" + ] + } + ], + "source": [ + "print(results[\"baml\"][0][\"value\"].model_dump_json())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python-integ-tests-lSPb1NE9-py3.12", + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/integ-tests/python/baml_client/async_client.py b/integ-tests/python/baml_client/async_client.py index 758505b13..c39c70901 100644 --- a/integ-tests/python/baml_client/async_client.py +++ b/integ-tests/python/baml_client/async_client.py @@ -696,7 +696,7 @@ async def ExtractPeople( async def ExtractReceiptInfo( self, - email: str,reason: Union[Literal["curiosity"], Literal["personal_finance"]], + email: str,idx: int, baml_options: BamlCallOptions = {}, ) -> types.ReceiptInfo: __tb__ = baml_options.get("tb", None) @@ -709,7 +709,7 @@ async def ExtractReceiptInfo( raw = await self.__runtime.call_function( "ExtractReceiptInfo", { - "email": email,"reason": reason, + "email": email,"idx": idx, }, self.__ctx_manager.get(), tb, @@ -3526,7 +3526,7 @@ def ExtractPeople( def ExtractReceiptInfo( self, - email: str,reason: Union[Literal["curiosity"], Literal["personal_finance"]], + email: str,idx: int, baml_options: BamlCallOptions = {}, ) -> baml_py.BamlStream[partial_types.ReceiptInfo, types.ReceiptInfo]: __tb__ = baml_options.get("tb", None) @@ -3540,7 +3540,7 @@ def ExtractReceiptInfo( "ExtractReceiptInfo", { "email": email, - "reason": reason, + "idx": idx, }, None, self.__ctx_manager.get(), diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index e63fc92fd..48e264328 100644 --- a/integ-tests/python/baml_client/inlinedbaml.py +++ b/integ-tests/python/baml_client/inlinedbaml.py @@ -20,9 +20,9 @@ "custom-task.baml": "class BookOrder {\n orderId string @description(#\"\n The ID of the book order\n \"#)\n title string @description(#\"\n The title of the ordered book\n \"#)\n quantity int @description(#\"\n The quantity of books ordered\n \"#)\n price float @description(#\"\n The price of the book\n \"#)\n}\n\nclass FlightConfirmation {\n confirmationNumber string @description(#\"\n The flight confirmation number\n \"#)\n flightNumber string @description(#\"\n The flight number\n \"#)\n departureTime string @description(#\"\n The scheduled departure time of the flight\n \"#)\n arrivalTime string @description(#\"\n The scheduled arrival time of the flight\n \"#)\n seatNumber string @description(#\"\n The seat number assigned on the flight\n \"#)\n}\n\nclass GroceryReceipt {\n receiptId string @description(#\"\n The ID of the grocery receipt\n \"#)\n storeName string @description(#\"\n The name of the grocery store\n \"#)\n items (string | int | float)[] @description(#\"\n A list of items purchased. Each item consists of a name, quantity, and price.\n \"#)\n totalAmount float @description(#\"\n The total amount spent on groceries\n \"#)\n}\n\nclass CustomTaskResult {\n bookOrder BookOrder | null\n flightConfirmation FlightConfirmation | null\n groceryReceipt GroceryReceipt | null\n}\n\nfunction CustomTask(input: string) -> BookOrder | FlightConfirmation | GroceryReceipt {\n client \"openai/gpt-4o-mini\"\n prompt #\"\n Given the input string, extract either an order for a book, a flight confirmation, or a grocery receipt.\n\n {{ ctx.output_format }}\n\n Input:\n \n {{ input}}\n \"#\n}\n\ntest CustomTask {\n functions [CustomTask]\n args {\n input #\"\nDear [Your Name],\n\nThank you for booking with [Airline Name]! We are pleased to confirm your upcoming flight.\n\nFlight Confirmation Details:\n\nBooking Reference: ABC123\nPassenger Name: [Your Name]\nFlight Number: XY789\nDeparture Date: September 15, 2024\nDeparture Time: 10:30 AM\nArrival Time: 1:45 PM\nDeparture Airport: John F. Kennedy International Airport (JFK), New York, NY\nArrival Airport: Los Angeles International Airport (LAX), Los Angeles, CA\nSeat Number: 12A\nClass: Economy\nBaggage Allowance:\n\nChecked Baggage: 1 piece, up to 23 kg\nCarry-On Baggage: 1 piece, up to 7 kg\nImportant Information:\n\nPlease arrive at the airport at least 2 hours before your scheduled departure.\nCheck-in online via our website or mobile app to save time at the airport.\nEnsure that your identification documents are up to date and match the name on your booking.\nContact Us:\n\nIf you have any questions or need to make changes to your booking, please contact our customer service team at 1-800-123-4567 or email us at support@[airline].com.\n\nWe wish you a pleasant journey and thank you for choosing [Airline Name].\n\nBest regards,\n\n[Airline Name] Customer Service\n \"#\n }\n}", "fiddle-examples/chain-of-thought.baml": "class Email {\n subject string\n body string\n from_address string\n}\n\nenum OrderStatus {\n ORDERED\n SHIPPED\n DELIVERED\n CANCELLED\n}\n\nclass OrderInfo {\n order_status OrderStatus\n tracking_number string?\n estimated_arrival_date string?\n}\n\nfunction GetOrderInfo(email: Email) -> OrderInfo {\n client GPT4\n prompt #\"\n Given the email below:\n\n ```\n from: {{email.from_address}}\n Email Subject: {{email.subject}}\n Email Body: {{email.body}}\n ```\n\n Extract this info from the email in JSON format:\n {{ ctx.output_format }}\n\n Before you output the JSON, please explain your\n reasoning step-by-step. Here is an example on how to do this:\n 'If we think step by step we can see that ...\n therefore the output JSON is:\n {\n ... the json schema ...\n }'\n \"#\n}", "fiddle-examples/chat-roles.baml": "// This will be available as an enum in your Python and Typescript code.\nenum Category2 {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage2(input: string) -> Category {\n client GPT4\n\n prompt #\"\n {{ _.role(\"system\") }}\n // You can use _.role(\"system\") to indicate that this text should be a system message\n\n Classify the following INPUT into ONE\n of the following categories:\n\n {{ ctx.output_format }}\n\n {{ _.role(\"user\") }}\n // And _.role(\"user\") to indicate that this text should be a user message\n\n INPUT: {{ input }}\n\n Response:\n \"#\n}", - "fiddle-examples/classify-message.baml": "// This will be available as an enum in your Python and Typescript code.\nenum Category {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", + "fiddle-examples/classify-message.baml": "// This will be available as an enum in your Python and Typescript code.\nenum Category {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage(input: string) -> Category {\n client \"openai/gpt-4o\"\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}\n\ntest TestName {\n functions [ClassifyMessage]\n args {\n input #\"\n hello world\n \"#\n }\n}\n", "fiddle-examples/extract-names.baml": "function ExtractNames(input: string) -> string[] {\n client GPT4\n prompt #\"\n Extract the names from this INPUT:\n \n INPUT:\n ---\n {{ input }}\n ---\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}\n", - "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", + "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, idx: int) -> ReceiptInfo {\n client GPT4o\n prompt #\"\n {{idx}}: Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\ntest TestName {\n functions [ExtractReceiptInfo]\n args {\n email #\"\n 04/14/2024 1:05 pm\n Venue: Ox Burger\n Ticket: 220000082489\n Register: Shop Counter\n Employee: Connor\n Customer: Sam\n Item # Price\n Guide leash (1 Pair) uni UNI\n 1 $34.95\n The Index Town Walls\n 1 $35.00\n Boot Punch\n 3 $60.00\n Subtotal $129.95\n Tax ($129.95 @ 9%) $11.70\n Total Tax $11.70\n Total $141.65\n \"#\n reason \"curiosity\"\n }\n}\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.68.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.68.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.68.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.68.0\"\n// on_generate \"rm .gitignore\"\n// }\n", diff --git a/integ-tests/python/baml_client/sync_client.py b/integ-tests/python/baml_client/sync_client.py index bb4347c7c..5f7be5b4f 100644 --- a/integ-tests/python/baml_client/sync_client.py +++ b/integ-tests/python/baml_client/sync_client.py @@ -693,7 +693,7 @@ def ExtractPeople( def ExtractReceiptInfo( self, - email: str,reason: Union[Literal["curiosity"], Literal["personal_finance"]], + email: str,idx: int, baml_options: BamlCallOptions = {}, ) -> types.ReceiptInfo: __tb__ = baml_options.get("tb", None) @@ -706,7 +706,7 @@ def ExtractReceiptInfo( raw = self.__runtime.call_function_sync( "ExtractReceiptInfo", { - "email": email,"reason": reason, + "email": email,"idx": idx, }, self.__ctx_manager.get(), tb, @@ -3524,7 +3524,7 @@ def ExtractPeople( def ExtractReceiptInfo( self, - email: str,reason: Union[Literal["curiosity"], Literal["personal_finance"]], + email: str,idx: int, baml_options: BamlCallOptions = {}, ) -> baml_py.BamlSyncStream[partial_types.ReceiptInfo, types.ReceiptInfo]: __tb__ = baml_options.get("tb", None) @@ -3538,7 +3538,7 @@ def ExtractReceiptInfo( "ExtractReceiptInfo", { "email": email, - "reason": reason, + "idx": idx, }, None, self.__ctx_manager.get(), diff --git a/integ-tests/python/cache/baml_results.pkl b/integ-tests/python/cache/baml_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c0107e9eede593a4799f2dae832b74ff265a0f82 GIT binary patch literal 19995 zcmeI4&ube;6vv%dl5MF8u238kLfD3q$dH;OgyKM;sU6~&B&r)3oJ+clcb`0iSG(@+ zY-$GzE|fIxig>;CBZGd`dqzWcb{yv78DYoB&wD zo#qv1m5F!`pX5X0#rP-@g?THR{5)l$6mmDedn_w&$HG%Cf4utxett}|y6bN5`sx>+ z3p+Aq=u0a*ZG77i5cr9kfO7L&^lgSWc%7fx&l<+BQ1~&EpsdpkezMm-?JlopjWrI= zO6bFmvle|3I_oS5lAJeM{M6lJdeOz>0utvQLp9Tz^HwUQcI30Zc}Y3pSeZ|+ zc;GC>z`9O54SiO4qTBPnl~iRZ>U5wGC@Wv)tOQOhap7$Njrzs@N$2Jw6s^^y7lApMPo7k;rv+sspX=m-+=yj)eIK}nY zI#wbRi!pA=;>e&_PVf6^rz66CJM@4|Te&d421okw9V_d}d(e$S<`*r{eNeZPXm^n) z{Aef4SV@%Ek$!Q%57ch=(O+-0hpZ|i$uLZa5{W?mrne$7hJaAT5L3~PyP*k{AA;x^ zf6iFPIeW2L;1Xn4oUNLIdLzg8FNb zAVIxZ1jPh(mCRsvKu}lNUokDJ1a+Jf|5K>*X9pxlRKIv5xi6moX^+TVOnXYldvV>X zK^vvx#@6S;}phqs;v?--PGkC@z7 ze*f7aaud0U++#!EOr*tj8EVon6ZG^X!bB{Xbo?n0YkjPEsCUO(G>DoD6 zJ6G_nXLRixFS-2-*UoL~+?Srtsy6}XZn>VZROhBTH`Td^dpCq~Zpyj!JHm8YjxS0N z?1Yilxi9>>pk9_Gaud0G@9Gbnf>h@=4g#spO?7Unb5ouB?f-scq~!kKkKgu*+;mz_ Yr{#27PN(H`T280s1q=SOr{ysJ54S7bsQ>@~ literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache/json_object_results.pkl b/integ-tests/python/cache/json_object_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..1065d528eaccd12772842ddcf1d52f39485eace5 GIT binary patch literal 31317 zcmeHQ&rcIU6efxn;=!XQGucy#gs_G3%L@SlsG!x7NMei`y8}C6yNmlnD~802H;(n9 z@&EA8@#w+-z?eAGN^SGH%uXqZ#;-TF4KMTd&3o^A-0A z8=|$ja_9EWo_cQ@W%@=vce@XdVp-S!c6M%hsnY%@ zC!Ozz++AO=yP+qVY&UuxvL`$Uk`c(QOwY`mD|a=DQdZ5vx^F9OmaKAq#waa|4@At? zMUXXxt-vx7=o*)|5lfMa6jAd$zA_fDX&1_qHR0 z!^G!@)@r1txM0%a!%+Ds_IMZ_(xuItR`!6`{mA-dQ9rq8T2@saA6suRD#x8Ot*FYA z)LIbLoNH8FEfxIm;?`F-y28y^27&O{nlD5$0uwX}+>k1U?((|5VNjn~Hae))ERJOw zU0jo{YqE_;nMk;&v}tW1bR!#M%9e`H>(PPjx~S(}FfFTN81*6i6SaGz(_M{Knj=SG zhQs@71+p+Ab3R56Kq!c!63 zzM}!bzH8$u>3ybi0Vj=89z0i0C{=m*;*2(z_VZUF%-R`$)O`M;ot8QiC#_6j2>;6F zO6B9XuL?f+R{}6sUVSo-2>y$uS3cNfN>}mGO6`}aRB3Re#r)mgU*ABCZ%8;nDZYq4wGL$uK+mc z{Q}@{@fw?vRtDpsJu?`G9Ci=Dq2D?H98_;CT9tHo>NgCUwV_q1<5LPJzLe_)aOl`s zF=$Rr5Uol@K^Nsw{<&5q_rsRL4QN#YaKIUdKWA`gy%LOrEvy`%Log1O$qj%5fWyE; zf;4LbaIoB401juTR&mCmeejkBESz!3KjScU|MUicgGSn59BflVikrbW*y@mmFPw3} z8HfBK5@=N_Ru83F09uvMs&qcr3&sJAgVum^Hn9i5As;xD-~Uk4l)yLuIDl~gZ8Co*y<3BgD&xONpp;2?K=U3RwcA5p;gH+Q31dKz@ayYU>s}r+Jj4+ zs#N;4Tmo9huVe+VX6Tkt$0l)#kA(wPRs}fq3$o)3B0IuICXvT(n9B_{V?s4cLlyL#vZ*v&r OD-5^3{xuiCiRoYA`y?d* literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache/openai_chat_completion_prediction_results.pkl b/integ-tests/python/cache/openai_chat_completion_prediction_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..176728c0933e849a5572dd9f3786b4c54aa6cc05 GIT binary patch literal 31437 zcmeHQ&2AG(5RO>5WV!JItvO|XFdoMaVfTU(L_i`C){#I$h%}x~rZ?jmn4b`WB5~oC z0| z59amxbnCkSY z8F$OUN3rhZ|8~CJxYQ~B$^PMYMDDt;#P!fqyJ9_h5{f%A2$Ctt?KGOriE@{sC>3j2 z*z;|r&68O!G+Aj`yrp7sMFrWevK81O0$p}`S7WUbaYGuhw&LjgE^*WAMxL}4(DX|Aj&&M+y(V3kvyI!CN~CABX>A~MBeQ49HFG{+iMDL#MLq9DZd!+i z(W~K~sNJ(pcPTbuj-G-UvKwqQ+uYQlt^TM9vMys?O~D@KIS+V4^`lUF)|#Vh)aFEW z`zAQ_r?E&KPShQls@QgoMjZB~jhmqNejW=rX_U&~fpJ2qiNhD0xw#bMJ1WeIh(FqW z@URF=o!R|a0~H3D!4v+emCL{EobwHo@P7b^0EhsH$WihT$ff?oWzT4U2v&yx5ha4F zn`{AysHQo(g8?D{B8GiDK*Uj67$Bm^Y*Uv35HT4f$tG@su03rY)%Gh{v_6;DSR8-wC4j{rdfe8>{2mLSuCi+SiXyS>FUEVvKJ>PsHS&hzqYB z^hD&hLZK%Dw=*3kV1|w|8YQB!+BS7D`FcFq}3rqwW ztC`zW03s%Xh{YG5KZ1z>hyW8&o;?5&U?Qr;_7oqn**-84W3qib$hE+Cg=~jn$10_nrep07L*p07S4Cg`k`X)gsE7P|lQx&E<GA9S*;pZ@!u3^9!%u9WE4~ zN28^q(b9_xsUE7)_Qv;be)Y}u7Z;z(AXB4X8s9A}?Ck9PoWT4;-4HHe@E>0eI;&&o;ncy=+96*kU@~l!EUF~Y|ga18AYk+ zX5qlMwYEZ5x!Po{W$~Vh#WfXV2g=r9ix_m-s#lR*NZ%9Yo<+B zwZ@sbIZ$FNR&pqMS?EdYl}&IYd*`;I-CbpEsY4d$wi=z;5xM2-!M-w&fDZSpAAwbB zkacHI2GX;=Z4-Rh;_lmR9qcE*+_!ck4aKXR7w?7!qs09>KBP-qK76 ziv_67ERJ;=eY+=Jmy3;inM$N*ylEXE^g(9#lpAJ$z83A-u8Sh?Rc=|w zfib9oPc-gX(A|tpnxp3shU^1&JKNpWp{@UD2(pmTS96Gm6%GM!sbLgK&)ReJ9<@1B zy`f1C{dwG^4rl6tOjT@qk0xyPWsIAo_feh;IBAs1;IRRr)a2o7%{*L+>rYjf6&ZhY z@c6ePEp--;77bMxWrk1q=e9Rmmp=6kmGIAlM1VwqMC2@ajO0>0aoIf@B!cxJNJPot z>K0o-BC2_gKEWUnAQ9sj4-#=w76yqZD%%t?Kq6+7h}F%%M<5YK0b$EUP$H)3Nj0iQ zP$IsfD|9P^5>cblM?(=xM4=y7OSz#$m?E45C8FfGvkNLvB5X^-G(m+DQK@Hz0y~t5 zJcX!+>u0P)EOr0+2oeDj;h>$VXl7%p=ujfc45J!=(S6gIm zM3^8tIYR5dc*N@u?>F9pM1VwqM3f2SOw7j-ueSaCbl=2Ggsl%T6M>nCi7#5B4e6MP zD1p3MB>*!KC;2Jbnb6KuYq0vt`s*f01V{u(M7j5XL`*9zqMeDWE3$pZn2DIOQDY_o kGZACROWRj46M>nCT-PaIOU%8N4KJH3U+R2T?M$liFK`M@?EnA( literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache/openai_structured_results.pkl b/integ-tests/python/cache/openai_structured_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..ea01e4921f549a9c62922ad9231a442640a19008 GIT binary patch literal 17461 zcmeI2&u<$=6vx}f&JR0DgK^Ucp=$XdsM#)|NcmRAD8biC*n!`+z#tFrsW9khD+hWJ`a+( zdXrmR?1vj}+e^Mn7Vjr%gh|u1g%z5n`cxJn?*xgA4yC?8es?T@Db=paWV`XgdL(Ra zIGhDwG~PD0nD7^k$Q80Rn+KLJn-iX!G~>z7Bj$!8JV-Xr#^rrqSZUhV4t|u+Pf=Vm z&HV#A{e@-nZs;?aPcy!#ecKk?u>&*UX{z7K{4PKp=Arf=u4})Nf$y-8r|M`2X0tx3 zl%W>aw}BfQuFbo~w)cf=++vOsBv5a{h0U`tFVi_x-bQe-2@84~@WKhEtoWRDj8^2@EYC#s=T%gw@fEM#=6Qf}n#&?8z|0B=YmduO7Vd67%HwIA z%cwZz7IT=b4@?84pSmHOy#Ux=-WN4VE}>#nKXT=W!+ULMD$2UJyzkf1RyJd5++2dXAX#y5^1| zRMH396R5)D2a1W2JPg3O^{dry{8F zl^+LALN&aSDe-)UMy6Dwi6Sz*skMn(l5jaw;sFd-v}{qlh4(Wh9<*>RQ{vGIYg)D_ zsKREZ#G@3pv^G)u3w)9(@!W(@H6@CeU~1W-SP8bKL{Sn%rc~adun2CZ#Iq0rEn5@= zp{r$!TV?k$B_4S2rIxLswxJPE`|y>PEpGP3nG%mRc&N3BLK^&_^%F%h_*rWc1u%G& zDMvvUJU-?XJb_>OC^&&n)3t}c$&n&HNgk&KJk*F!MFl?bsn8+flUz!to;-<9MGg_4 zWc@V#*PrP@g7`#ylGC7nlsR>8q57$4Zy`PvIYfLaa)|gO`7~Sp_mKFc-k4JTM10ck zxNCI3S6C;~{az7e=zee5A&$A~~f&L#+w1-mtROArVPs0wO>Zj><{yCBx6TN?uF4F%a zh)=|)^qeyCNrm_{y!#H{H4vYM9YXPGt}}Nerz7!+_%!;iME85cYi@W~qWirfhv&wJgo}Ta)9lv=s=ggV^Tz)fWXAcIx z{rUY<>F<-cbSExF1A(aXcc$V^*)QY7T9&ee8OTz1V#r04+pKO^Oj~d#m<#qA+>fKtUWPE7Sm#B+>wYXFfzeJm z`K(<*R&KyyGRCN|6bg$QHfKH{dk^LB`!JfSR2q9$Qo^k8-N0kA0p;igx2f3Ax~HFte>@I$18GoD9jC?}@-w+w&UA!^lS=_n9Tz)Dkrv zTevAdbX_iDi|$S{jC7{W;KIn{G&@5)?OOxoWN6-#OR_l9Dahfy5>~6iX|^NnkO@=> zxeb0q$7fL1XK(Vl>oBX;f>eVkoQw6kBnliA;dzvc{HCOz*VG_c?cV*XuRV`O0ykiC zi{Sc!1oFLXM#@bGcalxVu)AB?P6-uvfc6L;!{q&xiGCZEx$HqGw-In=>FW6Bm$qch zkb}Vvgyp}n&c6~&CL4_|NEdtUDU4(f0n<_LR(UyY)4I8NXot|+5%i)pyn0;D!|RzP z9`5jFW|C7#Q$qC|@#GOT5mcn-s+ zQYUJ0f{!yxJamC6mMGjpRf!e_TBs?OD8xb|vrM%`F%`nh5)V??SE5A$6uwZR#m%z2 znI)c0I#E1?AC-2ZFbF>>b)x78zh;(C!##M^ zhMlC@6CB(oe|U0m9Js-uJhT2r{A!-udvcoirQ|kxDn$I!DMb9zDMb9zDRh$gHNNu4 zpU34_Cs|6zum2{6>G-8fo73@2s}SK!w>T5NbPAnle0{Y@`096tqU@n=dQkRIrx0Zi zbqZ1TP^S=O57S#DU9ZL_SMMe-Ceg3P;6=ISzeL%?e&nO

9r6_E4t~9lvx6(eX>C z&`CaiP5u4w*vBt=`_;a;+VkBG@k=+eh+jH|h+jH|h+jH|PBOp7e;+mI{MGLiMfpSB z{Gj}yP9e%4>J*~cVYnJx?NvjyJ>AbQLeN+ zDI%~I-mtcX3Ky{@S4K{VO{u`o>gm`giST0;A7z_o)5>9}oIK=PN8jV~Ly}I}_TiD6 z|HH9mD-H$5Qco`$ZyQQ_Ze&L?5A!RGZ3b#E1=Ekxn(;4md|$*ew@&upLeW1RE=;Ah zU69s>@5+|78+__p_k`y~8Pw`9y?GX9Fq~tpYXTSRFl)8}bEmkQSPp{N+D?22+D?XY zCw1-P%z#eLFDK!?46Rk^B`w+Zb1wI@MDkNz3zdwl+XB6r(Of2Z8Quw8(Ka8>gRn^E zlN*k-RzfM7)=uKPq7#Yk&lQrZk(Hp)kR1n=JeEb0gYzq(oCArYto;4XD39cRu95sy zc7!Kfb6^%o_TyX1JBUCWbo!zv$t9AH>U%z}BI}OP6D{d1$;(JxI1qHC&=dY;l7q^& zdhnn#J+%F+M0*j%9edq@*J<`Uu@nd9P+TY3Usw;7=SkOE0V$)N@u-m;O{^)*b-Thj zQByCLH%U%Lapi|94$S^sC3%>5Kar7eu}>XQ_1vN@`O$YViLD0v?J)F8o2P|Q$mw*a zxE@=JIEV#q6M`s4Ab(k`NZdn6Ki@-)2Q7O~6DsQh z?Fsw@)km6%32p@7-1^NIum5LZLofs*CUdL#CZd#QSwIyK@{KAsXLWqoLNeqOR z5iM<%JuEEgz=O|?X!ERx&wzR83nN`MzvI@aK8qfHXh;5(zAB$C08Mw=vn!Q;Ym z5Ol$l6J8;Ze(nyzDSWcF9)Ezt#C$>?=fyi#&dev2;hDPz=2MwM%%?Jim``O2F`ux0 zdg(@b$b8bL(afhocazMgvfRRaDpQF0RHhK~3Hdbl*X2K%Ps}Hr1Nd}HZLXiNlIHWh zvK-3idu0mo`Ch+5l5)N``_3=SC-dfw&-Y3{;NknHvQM1&{;5}p*H2hK z%})Q8-{1266V4XCf8zS7r;_ISsVs+b{Zyt9*H8Tlk?N>x pKc41^iO=^?MLyqSJ~5y2bTIHvh56K>Yc(>+GM# zF;oIBa9D}UQb6JZa6xp(-eu9Q@dV!cHYjsdB6AG zy!mwY>!)AMbpIZ@OHbS-XVxN3>~7tS-A?~QuRC*(k!oYt`{*i>UFSVXL6+2PsmrNi zs9oDiChB`uW+%0?xe^Ph*|w~9b_%%aI@k3|9ZQz$-1NQ?lyv$XY!O{^og0#Yk%eV< z`_6i_=FBy98LO`IPOW7vNA=|<(a3T*6pk*3R+hztcfX<&37hW2?sLo$O~!5a-i&jj ziA@vLdXG12=qh%d*O6%w(?S|;`i7)y7N-At5L}pRULeEWYd<3 zbwaO;gNrSLK0dt?i3XFg?vFg_ea5s~RIrfox+fI%V@)_fs%l<9yRl#>G_l=PUAKf? zTay&Otwoq##zWlJY@>z^VI8Y>8~bfA%rq!+ySHf&YzkRKoAuiq+rK2Qd;7YK{5BJ1 zdX?Zclaa8nMrTq}*tazq`R>^mL2}>RnqIA9-z~+M&WYh*Z1RX)Q;5{SbP5oy=6edn z*#^1d+(#;s{l2y_G7R(HTaKs=Q$Y>iVq}Nn3QvkV8r4z4-t)+i?OL4Ivpk}j+V{(1 z^<;wAtzFXT_?}{HJ7SdAqg_Ook_#9VT+!`Y7&TtJp)gk!ZW%;Xu`H}97@HR`1i1}v z61s*Kk>r11usSi!RZy$8VGv7yaY>3IZ)_B7Y$BOT)As;jCo*?UNz?UtU9b7=7pr+! zc-`s^4Cy)a6RR<}N_W+uW)8W4VaT0eIlEdVnqT>`Ly)U7iueM?LxiURv$&~iNcJr` z_8moeP3gH|dHC3;*483Byd1sN1BdXKN)bye_;X1RX zrMFxgIdk;xQy5vKH#b{W+0v;EW4gH?t~hU=A<*FRvun;m@5%Z%I&;q3Bi}8{*g`}# zyXdnh(G?cU{qIu*T0pi;^s@`L^DfiQ$WOe{du(bEoP9|N&|kWRBnh`DmX%uumWkxi z&Dkx^EdzTzch1MQ?Yw24m=vnYR65kSr^w?G*kZL+4pmS{7Q@l1=-M^~N#*L+-Qe$k zEK$5vu8jxF6A?FZ@p|;IpoQC+!)&IM+05t3T27i0EK>lMqd*H_$>nucH3C=ySkkp) z$fq-At>M}@0G6XNWak;zcmuHPdK6j7iCobESauh}ky*@I^#GOwkJ)t2Z2-%Dr~tt7 z9Nh$931FGIY_JS(A7>|lW!moO)l>l=f0#PSDV?NgB@&s#1M6r?uq*&r0$BQ7E612^ ze6Kk~ELpp4j3BuI0f<=g=!?c;IoSaau^g2l8%czS<#gD<&R~dGLd0^|!v7GyK5Upk&yMH@Z&Jr&aIx5v~-3{36>IoC4eP>CC$!Y zz4P1<8>GUXn}rS$%hQy8NQIrWH33p#{idCjE8oUy5}-&{6WhU532O#(|}FP%C#r^$S zIu$dvj!T(PVM?(40>H9oKK2tfV2>s2u{^Ex#9fpjVhIsTUNr=WSVF{dbcKQ9Jp)JP zkk1Cda!|JriuVkS3pSAmiuX+G$YXICiud&Dm-cJo z%`jx;uq!o0EIlDX#4^yYI}Up+VUOi-(k<+%FN8mWXo}d zVc*aH^yMVBRFCxa(m^y8F>Y4 zDc*fLF>cw}N$+La_d8m0uXt35G*Y3x`zcZ=-kXvwe+IS$w)AO=jzJ<|OE}GP1e?cf zzToB;!=WRibw=2E#x0WphmM?Mzrmp+aGK@B1OzDIbL#t?&Z)v?aBy`Ku;n?r32MXs z?`y->ORs<}Ls{+4`Eg4zlrGqooHtUNTZh|7sjt`uX%vi1nw}qeU9Wg2Yr4)&NkLZd z?D$T41gS(%>!fFHy4$}3TLN1GTS65d*3S$%u|3T&(IkbOSWifh6AL-9{nW=*h+9J3 plIjGATdL~7uo_xJSdSsFC9vgZFPSZqm6b##E=sX5-EWD5{{kU#Ycv1= literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_short/baml_results.pkl b/integ-tests/python/cache_short/baml_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..08ef189832dd8a73f48d73f780548d6fd40c009c GIT binary patch literal 196 zcmZo*nYxn!0%E6VxH||6Eh_+W-5uB@r4K+Dk;x0d3?T(Q12BVq*6#)|gKeW=0+_)e zr0xJ_u*kutgYdn4c%wRp+5wFl21+rASAiI*dI0~bC&d5& literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_short/openai_chat_completion_results.pkl b/integ-tests/python/cache_short/openai_chat_completion_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..da93eea939ff10dd9da8b132cce5c6979cf6ce1a GIT binary patch literal 196 zcmZo*nYxn!0%E6VxH~X5hbaKL?hXu!Rtvxk#!tr~45kJa2Z%^FLjr_x#dZOhA#VD> z03!0ySpm#oespjFn89-TT?3fGc(q9Z%wV!OmH=jOH{E^!X0Qpx9sn~0QqCxV8JxR& fAPk1Yc@AI^Zu?A#2#YUI0$7B3X1oKCk*Ws(ho&ka literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_short/openai_structured_results.pkl b/integ-tests/python/cache_short/openai_structured_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..6c49c508afe8eac83d057c53a45226d9b7a33808 GIT binary patch literal 196 zcmZo*nYxn!0%E6VxZ8i(am)e8b+`Y$PYlBNq@D#8IilMDmilV*8p8P4od}WoDgOr| z^6O7BMC4cKEe0R}8u-N!%2=}V09fR!v!er;@%u>wMC22z5rpx1TOdU0+ap=9hy$bZ b28h&`!U;e$ z2QcHCt@{Bm+7OX{GB9(##sQT8t@!K0&;VxqdH4q+@+WWF0kFtVg+&mN gpSM;xfJ7V^T&_Lvx&T9ZO{ytO#(hRA300m+_A^-pY literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_short/raw_curl_results.pkl b/integ-tests/python/cache_short/raw_curl_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..cdc29826787c97b8dd1cace92492b8df2917ba2a GIT binary patch literal 196 zcmZo*nYxn!0%E6VxI1w3{W}2Ux;wCj`a6IbOfqZ-zzoK>_6xuarsb*-5y23BsL0i= zKpCJefkSHyzzpVs0}5aU!}kmz4U}ROX@H0@aeO-f7U9ZOZvZnG>MOw__W!5r0R=#c jbAC2}8BA%64qyhyslN}v42F7R1u%m#uPy<|NYw)XQcWtA literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_win/baml_results.pkl b/integ-tests/python/cache_win/baml_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..a44e6fce81366a0269e865323e4bc3ed172a8160 GIT binary patch literal 19995 zcmeI3&ube;6vv%dl5MF8j!>$JP-tPHhHjwkG3}v$Kxxl~7Wyaj*kdn+{t10E(%R!hB$|Us0#7$B`@Zw$=jXlI znTM4}^X)19`?zpFE8M&yMGuPg_s`eA_!6Jz)%z^Wpvcc`vtH==p@2xP$h|(KMc%jr zK8U{Dh`Mp{O|krWp%i94FA%=;JpHdKB=ph()p_O60G}Ng@Ht&>#IW4FwVsIpoDf*b z9ru#6$wab@B?XZB2^J;dsA%W2_c9hqA@_=#C-Q1P5x#QygT3$Y_kET(J+HqPs5g8M z1~OsjOFLgQo^}OZ@@qoy{!r`AB41iHtgD zLXlIeS+WC(a}C0503)4~N@qp;GBu%2<9Z?>b#5_KGrf7+N~O|?12!_RC?^~%^Z5-Q zoV5g4&*@}Qz)DYaecrK>s;$M{E|daQ<;${_z^OGZ{9V9a7ST@G%QdBQ*-EF{VId35 zj&ZH*=WdH|H|1=%tcxBbZ(3&*QQw^nicMN}#$a9y}V7q2lT(z=4y`G3Lguq$j0O^tbXjuu>uM1r3wwQm=ntHNa zu@afVnV$$5oAr6uN}>Ky1}O`$PGzI&v1K>qXKvskb}il+xuIv;8+L9Co6|oW;<|4g zE0LMi1eauSq*E-1_wB6P715|3xHZz4C5```@2*nNA-xs64M$W7!Xavz?08oy#t&VAhE{%7GQ zA~%tn$UQaj$wWH5ramvzZn=3d2tT(|&TWLZlye_<&h7r*M{v^#H8tp(IqjCyZaM9i zPj-#k1#T4w^^^*-bVN@eq>WD)@+QB!Y;vJDp6E*_k*Gjgf!{j~-X> zCn#P7@#Zx{>@Rf``FM3z8aMiY04W9;LP5OR31i7_|$;l(-E{0(uR??v9*-D!ttDKo+ zrKQn^io~+=(`{uduu240*yUY`w2H-bX~f!!qwAaJme&YfX)9)$tZI%EbFHbwQlw-{ zG}6G8)+_6yNOtFz!u54!EvZHpSE)|aj<(1pPd7J}IRZM^us#AaR3NL)hV-RtyKQ}R zSmpNZhW0mOPi|VPk(%Nxr^Q==@loQ=AUdQ=o8eY=Q#QTOdb6mXoa2_YqIY(zj~JCx zndVlsBICqb5Y=3TRb3-da`Vrvugbc@dZc|{xnjvvDjtFfvI4JY6GK;J)7~(sPpq;I zYB7x>orHg`$x4N@joYb;rE9clZ6Nd@voYnWiO>#0h5&{z zbQycM2lAm89nr99&=EuQfqdxIAtePsK9q}|)cQa^fP6Um_6FobcI{9$KLz<9od1=4 zI8|R5{qgZbMn0Sd`2g}^UjwCG2fY|z8D@|VnP&$1P;k}&9D1z-z`>NsqG~D6=X%@* z&Dv14WEs6E?F-K z^=G4038hLXRYIS17fnP%4BLx{KIwwsj6P}fNp~GBdKb&G*yxk)rm(33S>FWUP~e*Y z9EyR%#h=Ml00#gE3|Q*+zBDrg;{e8?Gartc2OFFL914OnfCGR7fJ2`_mKd;3~-{6u&bQ<5)3{)l_hxIr=w(MUO*wK%qeyjKiQV1B^o-#z9T| E0<-QdXaE2J literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_win/openai_chat_completion_results.pkl b/integ-tests/python/cache_win/openai_chat_completion_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..dcb1e815ab341ab7e5acbb590d260f2151a1bd15 GIT binary patch literal 31448 zcmeI5J!}(66vrbzq$8rFMH+2GfXK=^b`q$f1YwZ)@SP)pgb*3Llk8m9ySe><5EKb| zN+VrKf7NwYTy+%<6g1G%Qc+)XH@gw5glGHhI8K4|cbB!5(Y$^0=KbbBZ|23R*Y9?x ziqFIT%wB)y)u~kXRKK;{_#FRjp1(T%L;pWnp$69|22ui>F3izI676m#JMUS zm_LNbALSn>ls#phI;~85N(4$KzL;@ETk80tGyCmVo=Up0-cEHCnjeQ*5R_m2mdP;H z=`-`(Egx>jx|{#o`9|$Zv-l@_``?jv*L)>zhMw9HYthqC+>=3&OrYInZEkL4yDL$Y zigp%uecRUNNiP@X*w(UmQ^n$%3bGw#+hCnE=(63r9&43|ThcUZ+Z^rR6|Q@o$dk6s zG)S+OxMps4l~|3H?1@emdeXXQ0}RQ&xz%W6Ls_@fB%O2XwdQD#T=jK#OPL{{!%gcU zus|DR&DoKG^lV?-02|i1_jX$cTZu2Xtj$PWagnp)-O$7+@yj?iq+MI!dUi*4{mA-d z(Kxxpb*rs+cddsQZO3hJJ!;D&wQh)7&Sg#4NtN6>y7$%DP}quf5GYTq`bs4ea6z`g z>)OnrYqD$a7&Io<*#NbY#j#GKqg&E-Ip6p>Q;GD9HLV?l4rF#txnbt#Ytg1{zi8xL znp{)&WU6A@cQjzKFMZr3y$|zTz)7Q229Hb-N=+WVG?%+e@%)Jj zvm)b>HwlS&wrdN|d-edTj-wgzf4u%~c^v zRNB5m13N^CJcXzh*N;<__^Gu#^Kbk$7bVU>lz=D!QR2JQp2mEL5=Wmm4IVLL4Lh3- z3p+HqhbU2P`lKTmq69<MK89 zc|@*6G(WzD5@Bk)v7HGu)?|*R>zIHD+XQ%k4WUF>COUu!K*Yd9N@xZLh_D=6fC!XF zFg1}Vj~HGa;Twp!@K5_MKm;Jd!9h*MFawbL|EDo5CMn)L@;|G zaZuC2U0QUJ8wWL2lUC@21&A085wqw2xDSW`L;xbnyl!+cAt0hO)VMJj+nH?D96$sh z0uTX+D0Z_|3%h^_oc3DYs&LGO)tA3~_ymXmL;xbn+!zos?6wwM8Nmrv>}nsbj2Ke9 zh$|y-WyFEVOLJgc8By%E9e=w$8=FvAJtQ_ki5RU!TzYwK8xR4A07L*H*wY395r7DC rrVH+!JM0uR{bkGTaPJ(cMx#~)L;xa;1)TCwe(r`gC=ti5M5x;TCgxc3 literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_win/openai_structured_results.pkl b/integ-tests/python/cache_win/openai_structured_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..6e7f824e8257986f57b94064f62b9ac14250601a GIT binary patch literal 23986 zcmeHP-)~e!6mDs^KwF^H0@Y}9!C$Q+5n?n(6BmlqQdlZ2A!=~B>`s|G-Mw3P??Ou? zDL!b7H?hWrC?-mf#Q5TiLH_^~`WH)qbA zneRL2-sx)Z_3zGg$)9tL@vDvTus86^q%oDeUFb;B(*}759d|O~HkSEJQ)#d)=!ad4g7d%ob*77wXT>X^$H$r#OVY+)Q z98tc-fiJlM5!Uq!bbB;M=`tM-N9HMUru`yWcIGRWednxOD%BcvBu976bkp73omCmz zI^C0_qv{y+kv4GsM=F)TnXUT;8iVu*ketNm>JVhxk$UwasX9kVslH5NoJ|7f019W| zSk)sn=Y-4ARB!g7Pp!y~&3kw7Q zGQyV$6u`Dg>J=6VUuDm~2&>#Da1NnxGIMUpEvgGMjQcOn zvfn;c^-3jDbS5bwwZwXipn&?1dHlSacMHvE%FXfu3S=|i`Bg8dsPlOWh0yjeZdlctJ6wX2`#pT*MD3HxZs{Bay5{rUN@00a~1<#M? zAs1u_j>ft9kI2toWCF$s?j2}+w@yHuqHXN&cy)TG?m>s`bU-z zM0;qT%DDqVNF-U9KBN+E%>Nw`E*(=XSLM7~PJtX~N7eN4$P&-bl8p_?o@nXe$P!Pj^qAr;id5-LWQnIzI;)I{I$!9S$P&++ z^lilw#h5g&c#GmnT2w4iEJ?k{QpOfVi`0)S@mxr2ink~Zq|1u8xLtNNvcwY}{Xp^7 zk;hPnYM*|jc#F%vFtWtc8vRTe6GdtChB8kSlhLn~F;N6YZ$*}!P#3-3!FbJBdKTLP>vV^PDXRjmr%6NBsJEec$#c2)dMF}_Z+DEveftfGVW`VoOb zkE&x8wl{WKKLt>*>#JsU2#AYL=cpl|npS}`vG00WjRMxHY!$yR#@EYj6nT36A*bN%E;p+gm~0>j4NtC0~3IIiy7;p(CVi7Tsq6&C`b zOBx(*)D38ds|y|!uHGe32Y~$0brEU+wR@m~!(pPg5m4aGu7ZjT@z$jk3R&$osNfJ2 zqocLig;0^@NT?-W%0%Eq!<8Fou3<)x1vdv|eLq!F5b!~`> za;y8HLPLyo@rZ+Nc12WZ@LE@wDCoFbqTaa`3cD-h-cRCVUsLmmUJ84R z|2mZ&{w)w|%*Oa{37IOtt~XU8-^K-+(2}|u)Osu%&t$#mWCu3_U6nc5)Z8f07d22= zOA~3yUeQ1y_e}I8%W9zDsmWQ#Ue`cjTRSqOtx^&d)8iT_Oy5K{vQru;9LOe;kv~twOE1PyPIj{T2idT{<3mSh~U=7Lo~>(TuY`DXh191(x;S_ zYl)VEm1|rTOl7THOTVN34{~j={Ck$qz{)i%*E)Ol&TMxr!2_UHZFepGL1?>ciIjp~ zfbFiOPbu47OQe+Tu1U4}z<1XM|NQz^YPrUq5&c2&c3tcBIQu}9hcjJ|#Xb;C95GN3 z+XtfQS<5~UO{5fPYx_VneM;E}qHR;k5fM#$^4kZZZDVR5h;nJwx(gV;zqaG=C(rXt zvmG|uVY3~!4leiD_t)Z$qP@GiSMXI@#D+hyj9Whoq$);7=@LxF7{96)xLp0gBfURIuX4)H~iQ~oI5S5(^qpN53 phG-(Cpj5LrL_1`xHvb#I-VjZs6rB7<+tha0+Q#$&?XZyp{{q%Ba+m-B literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_win/openai_structured_with_schema_results.pkl b/integ-tests/python/cache_win/openai_structured_with_schema_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..fbfb51ee3a7435ba10fca5efa1769b1cb16e19d2 GIT binary patch literal 23965 zcmeI4U2has7{^<>+d?adwLn27Q#9K8LXc>T#)Lu%r75hH)<8_iX1aT}XQtbkvNMY< zhNPMpUor`(s|lJI1Y^80F$TTx%5R`oUJ~Oc@FRHU%sji#obJj#GhA46xY(r4KELyv z*Z==KGi4+9*(Vo!{vtT8<~diTNK#qWdsWwTmmjo_h0bER4=RW0WD zhyC?c<~4$$bF9RyRe#2*xQ$O66Yn%a!uDdZY?b_CQT~*-e752>1fAzv0pfSf0KP-E z>zJb5U}U;(m6=gxrpJx(=Z!hjs!fQN%FHX(L{paQGz!7?OLf!nEq}c++Z*IpYgQ>t z`S|(`@$ZXzFkCFIu9w4al!|Q4ubCp3La-10wqmhr*(-W1O!Jz^ZG`XP!+h`cU<7?j zfG?Xq3#03cd{@*znJym=Miw|TW}GrxGZx&p9OJxMt$GbUQs8@Ld--0G&W0S+nG!RmYRp_Q=Ic(`giK_Ao*<$6r`$?~0U#gdGC>0D zoZ?n#nTc7poF$m${*ZH&#L3T_RkMsIW}Fni=drO>y) z665#)DSG=Ew&FTw8G0bcV3>xOUlEGJlY_9Agvg&4>Q{@$AUy4k{r#`;EEx1%-xM~% z^?V`7A4WS;cnIc%9%6^PR$P<{)o2OYEqPOACiQ6ycTx$qgGJ&?0WQe^%dYLm1j`Ozqn zF2MXHlr2eb`KwVRU1<67D3UI%{1nQTB&vKiilj>^pF?eu&KLeh6iL@j{w9hfDJCzX zY)M+l%P5khlH7_S<=B#BkvmZ&T?@H~vL$ICUqji_cG=Y^k}i1sU6idMkD)HzK7Su& zOIv+G6iJsg{xNEkBx(F})K8L<@h?%EBmv_$qsVTgi{EPMl@O$FT2i3sQ|p5K^@ShA zbioBVAyomo^5#d4;FIWZdB|-trgz98y+^7i9j;s0{5?3t_;09oQ zsCJ0d04^F}I2G{GEiv5`QQB+Ze1}4QM+Xux@33n>LuGUhb z+{Qy%=p|J*sFYSZ_hhr_w2yRxZpby*wAv)-iwYFxGK;meUs0g2_Okd%`}T&DY_xyDs-rBCk z4)osDOl{YaW*zpIwrimYZf!h5fn3|QyQb}$wrgFyDXJfa#v4U>5n?PnMbZ`*wOvbStF~)WTlK@x^gBvF3~jrk zw!B>%J9Fp*u`0A(({@eUHEq{~PRc(7>GXF^`rWmpTZP)Hes?Xswb1XbwY3)d-L>>f z>VNz0+WtTG{i^L6>0NvMrv{1R1r$rayO#cV(SK@?SW^1kHCbNL4@1-MDE%-rv7_|E zP`RVFe06Q~+tYK}u4%j0eQ{C0yOuZz!L90d*V1dNei)iqQu<-2ei$nL*X?jWrG33X PKMZZVqqeABV~76%waRL6 literal 0 HcmV?d00001 diff --git a/integ-tests/python/cache_win/raw_curl_results.pkl b/integ-tests/python/cache_win/raw_curl_results.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2149aac7fa02ac4958aa990caa73794cc7be486b GIT binary patch literal 36780 zcmeI5&u<$=6vtDVP#QJ-s00!{t$d)VXd>J3j|2%RvGY4l;>1qllt%7kckCT|e>nTY zaY8Fq;)2jhT$Td|4oDSexK-jng~W*q=U%uVQT_u?h*>*!Y>n;lwo!`2%OOhEYd_E1 znK$#9@7uSJhQIpu%c1(uzB~TV9e0K;qGESxHun3^!}Pc_Qbmf5UGJsWh~zpSh%&N7 zwW3VSWk_Z%C8oBNt#DRbSy(x_vrtLbGS!*I=pEO2T|X#c(Q=))ymw5BI(-keh_1QL z716-R!jik1nw%;+BdRW8#dY2*R;-DLKA{qgOoW5s$V4zc5t{bSmvtgy)7`Isj}f9t zxaO`6IagF{nyA?Ldc%gUVAr{dOp}-v(x~YxqOMt({*{}&HZ*kq{{51vYoniz3PONb zSTzG537^n^1i?Gx{RA|mVtO>NWD^Ms3Pz?ZjE96YBF3%2?dDk$HbsL}yw=c@HCs_y zFCE&{GO>>7@lfkv#h_oG9+`?v&P3}U^04t5V>c^fVa02nkkyYgVHYWic@B1?lfhtL zy9r&lgtV=RvR`XcOe)4T4P}g{WD-=GgYl@S2y= zCFIvkglW|@&&-O5g(MwGs*tfY3HfeW7e{ihTv9I-uy0FIrg5S0WVC;eOv*$oV>$$g zR`fjtVyr=~J2OZ@lHbeL#fM?ubz3J&*_2V)w;S2680UF$Q=>6T*nSZovQ3NeTDE~` zr1pKW*f=@OYgU?^ocJDMtesGV*P=9{Q^`4W3a;xi7DnZlHx%ZE!X<+!3YLVVjIntR zU65;Vka>_FzuDa&+zp4W?h z+r>uSIImfajv>B4d}1R8H|Qn|y38Tx&<(i*Y~3yti00RSY!~E)j4VEf{xHRhfGMo% z8j^f_j=e?^o~evV7l-nBT%;(^)GoyW!|yffGTFEKI9>GaduxG!rCUhJ(;#Hgb@+79 z>n`=L5k0y&JH@$SV2|f|ylmUfb@SMyP?e|Np^JNpJRX6K6)O4Q0SZc?aHJ4&ZJUCm z{MyoN^qVI##Y_2e53rQCD^h_>rx&)P@wl{83a?q2EvXt$3<#DYfMqAp0$6f+oehlu zmH?J??r7W7=`z=F*Ej%{ojzp88F%ppU|HW$WIY$+x(>jyJ`r||Vs=#zVAamH2PK)mcB5P*0IS+Q-o6)Z?VR_v*EJs3-{4&=rr5HEYgCJ-+{y!`s2!Sd$Q zAD{FC%UrpN&AcTwPW%X7Guk2{BfVhM^R-Op^MF2n7XujY2krxy*Dx1KGJ z_XEq)#$uK1l~uG{+FeU-h+=wWyRiBq08Zc!F>iBr$3cwP;vTsR0sN>TXa@qY}sN*weyk(~=sN>TpW!fx{v;JSH z;>a$#imO^*C{~c~q_C)?!EHXbx`<2$s(PECDQA6a8RmFkLp6 z`SnM}a#gW|li%=kzmoG|7-*SpELxI>%AF{v)1!7+`6heVmC=lCT&thjt+WJ%@FI-EM$ zOApAFe*s$pTLN1`HZ1%29}q1Yk)dq|o!tcn(b97gh?arojrEI zYzb`HgDs=4fGuzS_RHt}*m6%?O|H%z9oQ@LT6uFfhzmQ`-BhZ&F(6z118mt?K{j{S zAR!hKVj&?G5@NePDHqtX87ASumOU1Vz?Q(4z?Q(4J!=rK$x2Yd=YLFw%Xg=DLq_BzMdAap<<&WO?uZAMt=pJ^ErBh8ErBh8E&JXO v25bpzS??f>Je2^p1hxdW1h#C=4.0.0", markers = "python_version < \"3.9\""} +[[package]] +name = "anyio" +version = "4.5.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, + {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + [[package]] name = "assertpy" version = "1.1" @@ -24,6 +57,51 @@ files = [ {file = "assertpy-1.1.tar.gz", hash = "sha256:acc64329934ad71a3221de185517a43af33e373bb44dc05b5a9b174394ef4833"}, ] +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "baml-py" +version = "0.68.0" +description = "BAML python bindings (pyproject.toml)" +optional = false +python-versions = "*" +files = [ + {file = "baml_py-0.68.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c978bb70cf8b1c6de27a302f51c63d06fb7349bea14bf13bc931f0b407de27d0"}, + {file = "baml_py-0.68.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:4195e47c086cc48cb5ae78a23a8de66847b7fa8ab687c53fe687b59ad5360ae7"}, + {file = "baml_py-0.68.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e8e30e1a1af8d397e454c8ddb0a4033dc1710cab4cc22d2431a9c02225684a"}, + {file = "baml_py-0.68.0-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:af08e109d7f14e7cae3f9bd7ffc52f9f42f31061942bb9c052317708696b4531"}, + {file = "baml_py-0.68.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:258c45e835eb0c577e5ad4ff39e366e991c47a14df6c8d868e0c56d8f58b6c35"}, + {file = "baml_py-0.68.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:af554e286b499b25080faacf11cafb90301d042971215f9e18bfb5bcc65f5196"}, + {file = "baml_py-0.68.0-cp38-abi3-win_amd64.whl", hash = "sha256:c948620d49d52b71577e553114f6ae57f98fed1e6060c9cf6737f6434e08713f"}, +] + [[package]] name = "certifi" version = "2024.8.30" @@ -35,6 +113,85 @@ files = [ {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "charset-normalizer" version = "3.4.0" @@ -160,6 +317,179 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "contourpy" +version = "1.3.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "debugpy" +version = "1.8.8" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6"}, + {file = "debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d"}, + {file = "debugpy-1.8.8-cp310-cp310-win32.whl", hash = "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f"}, + {file = "debugpy-1.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9"}, + {file = "debugpy-1.8.8-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318"}, + {file = "debugpy-1.8.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba"}, + {file = "debugpy-1.8.8-cp311-cp311-win32.whl", hash = "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98"}, + {file = "debugpy-1.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4"}, + {file = "debugpy-1.8.8-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996"}, + {file = "debugpy-1.8.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9"}, + {file = "debugpy-1.8.8-cp312-cp312-win32.whl", hash = "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9"}, + {file = "debugpy-1.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864"}, + {file = "debugpy-1.8.8-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804"}, + {file = "debugpy-1.8.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f"}, + {file = "debugpy-1.8.8-cp313-cp313-win32.whl", hash = "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add"}, + {file = "debugpy-1.8.8-cp313-cp313-win_amd64.whl", hash = "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b"}, + {file = "debugpy-1.8.8-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:143ef07940aeb8e7316de48f5ed9447644da5203726fca378f3a6952a50a9eae"}, + {file = "debugpy-1.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95651bdcbfd3b27a408869a53fbefcc2bcae13b694daee5f1365b1b83a00113"}, + {file = "debugpy-1.8.8-cp38-cp38-win32.whl", hash = "sha256:26b461123a030e82602a750fb24d7801776aa81cd78404e54ab60e8b5fecdad5"}, + {file = "debugpy-1.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3cbf1833e644a3100eadb6120f25be8a532035e8245584c4f7532937edc652a"}, + {file = "debugpy-1.8.8-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854"}, + {file = "debugpy-1.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2"}, + {file = "debugpy-1.8.8-cp39-cp39-win32.whl", hash = "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2"}, + {file = "debugpy-1.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9"}, + {file = "debugpy-1.8.8-py2.py3-none-any.whl", hash = "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f"}, + {file = "debugpy-1.8.8.zip", hash = "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -174,6 +504,148 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "executing" +version = "2.1.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fonttools" +version = "4.54.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[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 = "1.0.6" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.27.2" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "idna" version = "3.10" @@ -188,6 +660,51 @@ files = [ [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +[[package]] +name = "importlib-metadata" +version = "8.5.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + +[[package]] +name = "importlib-resources" +version = "6.4.5" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -199,6 +716,423 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.12.3" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, + {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<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 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + +[[package]] +name = "jiter" +version = "0.7.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e14027f61101b3f5e173095d9ecf95c1cac03ffe45a849279bde1d97e559e314"}, + {file = "jiter-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:979ec4711c2e37ac949561858bd42028884c9799516a923e1ff0b501ef341a4a"}, + {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:662d5d3cca58ad6af7a3c6226b641c8655de5beebcb686bfde0df0f21421aafa"}, + {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d89008fb47043a469f97ad90840b97ba54e7c3d62dc7cbb6cbf938bd0caf71d"}, + {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8b16c35c846a323ce9067170d5ab8c31ea3dbcab59c4f7608bbbf20c2c3b43f"}, + {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e82daaa1b0a68704f9029b81e664a5a9de3e466c2cbaabcda5875f961702e7"}, + {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a87a9f586636e1f0dd3651a91f79b491ea0d9fd7cbbf4f5c463eebdc48bda7"}, + {file = "jiter-0.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ec05b1615f96cc3e4901678bc863958611584072967d9962f9e571d60711d52"}, + {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5cb97e35370bde7aa0d232a7f910f5a0fbbc96bc0a7dbaa044fd5cd6bcd7ec3"}, + {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb316dacaf48c8c187cea75d0d7f835f299137e6fdd13f691dff8f92914015c7"}, + {file = "jiter-0.7.0-cp310-none-win32.whl", hash = "sha256:243f38eb4072763c54de95b14ad283610e0cd3bf26393870db04e520f60eebb3"}, + {file = "jiter-0.7.0-cp310-none-win_amd64.whl", hash = "sha256:2221d5603c139f6764c54e37e7c6960c469cbcd76928fb10d15023ba5903f94b"}, + {file = "jiter-0.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:91cec0ad755bd786c9f769ce8d843af955df6a8e56b17658771b2d5cb34a3ff8"}, + {file = "jiter-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:feba70a28a27d962e353e978dbb6afd798e711c04cb0b4c5e77e9d3779033a1a"}, + {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d866ec066c3616cacb8535dbda38bb1d470b17b25f0317c4540182bc886ce2"}, + {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7a7a00b6f9f18289dd563596f97ecaba6c777501a8ba04bf98e03087bcbc60"}, + {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9aaf564094c7db8687f2660605e099f3d3e6ea5e7135498486674fcb78e29165"}, + {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4d27e09825c1b3c7a667adb500ce8b840e8fc9f630da8454b44cdd4fb0081bb"}, + {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca7c287da9c1d56dda88da1d08855a787dbb09a7e2bd13c66a2e288700bd7c7"}, + {file = "jiter-0.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db19a6d160f093cbc8cd5ea2abad420b686f6c0e5fb4f7b41941ebc6a4f83cda"}, + {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e46a63c7f877cf7441ffc821c28287cfb9f533ae6ed707bde15e7d4dfafa7ae"}, + {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ba426fa7ff21cb119fa544b75dd3fbee6a70e55a5829709c0338d07ccd30e6d"}, + {file = "jiter-0.7.0-cp311-none-win32.whl", hash = "sha256:c07f55a64912b0c7982377831210836d2ea92b7bd343fca67a32212dd72e38e0"}, + {file = "jiter-0.7.0-cp311-none-win_amd64.whl", hash = "sha256:ed27b2c43e1b5f6c7fedc5c11d4d8bfa627de42d1143d87e39e2e83ddefd861a"}, + {file = "jiter-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac7930bcaaeb1e229e35c91c04ed2e9f39025b86ee9fc3141706bbf6fff4aeeb"}, + {file = "jiter-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:571feae3e7c901a8eedde9fd2865b0dfc1432fb15cab8c675a8444f7d11b7c5d"}, + {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8af4df8a262fa2778b68c2a03b6e9d1cb4d43d02bea6976d46be77a3a331af1"}, + {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd028d4165097a611eb0c7494d8c1f2aebd46f73ca3200f02a175a9c9a6f22f5"}, + {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b487247c7836810091e9455efe56a52ec51bfa3a222237e1587d04d3e04527"}, + {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6d28a92f28814e1a9f2824dc11f4e17e1df1f44dc4fdeb94c5450d34bcb2602"}, + {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90443994bbafe134f0b34201dad3ebe1c769f0599004084e046fb249ad912425"}, + {file = "jiter-0.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f9abf464f9faac652542ce8360cea8e68fba2b78350e8a170248f9bcc228702a"}, + {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db7a8d99fc5f842f7d2852f06ccaed066532292c41723e5dff670c339b649f88"}, + {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:15cf691ebd8693b70c94627d6b748f01e6d697d9a6e9f2bc310934fcfb7cf25e"}, + {file = "jiter-0.7.0-cp312-none-win32.whl", hash = "sha256:9dcd54fa422fb66ca398bec296fed5f58e756aa0589496011cfea2abb5be38a5"}, + {file = "jiter-0.7.0-cp312-none-win_amd64.whl", hash = "sha256:cc989951f73f9375b8eacd571baaa057f3d7d11b7ce6f67b9d54642e7475bfad"}, + {file = "jiter-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:24cecd18df540963cd27c08ca5ce1d0179f229ff78066d9eecbe5add29361340"}, + {file = "jiter-0.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d41b46236b90b043cca73785674c23d2a67d16f226394079d0953f94e765ed76"}, + {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b160db0987171365c153e406a45dcab0ee613ae3508a77bfff42515cb4ce4d6e"}, + {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d1c8d91e0f0bd78602eaa081332e8ee4f512c000716f5bc54e9a037306d693a7"}, + {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997706c683195eeff192d2e5285ce64d2a610414f37da3a3f2625dcf8517cf90"}, + {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ea52a8a0ff0229ab2920284079becd2bae0688d432fca94857ece83bb49c541"}, + {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d77449d2738cf74752bb35d75ee431af457e741124d1db5e112890023572c7c"}, + {file = "jiter-0.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8203519907a1d81d6cb00902c98e27c2d0bf25ce0323c50ca594d30f5f1fbcf"}, + {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41d15ccc53931c822dd7f1aebf09faa3cda2d7b48a76ef304c7dbc19d1302e51"}, + {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:febf3179b2fabf71fbd2fd52acb8594163bb173348b388649567a548f356dbf6"}, + {file = "jiter-0.7.0-cp313-none-win32.whl", hash = "sha256:4a8e2d866e7eda19f012444e01b55079d8e1c4c30346aaac4b97e80c54e2d6d3"}, + {file = "jiter-0.7.0-cp313-none-win_amd64.whl", hash = "sha256:7417c2b928062c496f381fb0cb50412eee5ad1d8b53dbc0e011ce45bb2de522c"}, + {file = "jiter-0.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9c62c737b5368e51e74960a08fe1adc807bd270227291daede78db24d5fbf556"}, + {file = "jiter-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e4640722b1bef0f6e342fe4606aafaae0eb4f4be5c84355bb6867f34400f6688"}, + {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f367488c3b9453eab285424c61098faa1cab37bb49425e69c8dca34f2dfe7d69"}, + {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0cf5d42beb3514236459454e3287db53d9c4d56c4ebaa3e9d0efe81b19495129"}, + {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc5190ea1113ee6f7252fa8a5fe5a6515422e378356c950a03bbde5cafbdbaab"}, + {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ee47a149d698796a87abe445fc8dee21ed880f09469700c76c8d84e0d11efd"}, + {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48592c26ea72d3e71aa4bea0a93454df907d80638c3046bb0705507b6704c0d7"}, + {file = "jiter-0.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79fef541199bd91cfe8a74529ecccb8eaf1aca38ad899ea582ebbd4854af1e51"}, + {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d1ef6bb66041f2514739240568136c81b9dcc64fd14a43691c17ea793b6535c0"}, + {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca4d950863b1c238e315bf159466e064c98743eef3bd0ff9617e48ff63a4715"}, + {file = "jiter-0.7.0-cp38-none-win32.whl", hash = "sha256:897745f230350dcedb8d1ebe53e33568d48ea122c25e6784402b6e4e88169be7"}, + {file = "jiter-0.7.0-cp38-none-win_amd64.whl", hash = "sha256:b928c76a422ef3d0c85c5e98c498ce3421b313c5246199541e125b52953e1bc0"}, + {file = "jiter-0.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9b669ff6f8ba08270dee9ccf858d3b0203b42314a428a1676762f2d390fbb64"}, + {file = "jiter-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5be919bacd73ca93801c3042bce6e95cb9c555a45ca83617b9b6c89df03b9c2"}, + {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a282e1e8a396dabcea82d64f9d05acf7efcf81ecdd925b967020dcb0e671c103"}, + {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:17ecb1a578a56e97a043c72b463776b5ea30343125308f667fb8fce4b3796735"}, + {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b6045fa0527129218cdcd8a8b839f678219686055f31ebab35f87d354d9c36e"}, + {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:189cc4262a92e33c19d4fd24018f5890e4e6da5b2581f0059938877943f8298c"}, + {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c138414839effbf30d185e30475c6dc8a16411a1e3681e5fd4605ab1233ac67a"}, + {file = "jiter-0.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2791604acef33da6b72d5ecf885a32384bcaf9aa1e4be32737f3b8b9588eef6a"}, + {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae60ec89037a78d60bbf3d8b127f1567769c8fa24886e0abed3f622791dea478"}, + {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:836f03dea312967635233d826f783309b98cfd9ccc76ac776e224cfcef577862"}, + {file = "jiter-0.7.0-cp39-none-win32.whl", hash = "sha256:ebc30ae2ce4bc4986e1764c404b4ea1924f926abf02ce92516485098f8545374"}, + {file = "jiter-0.7.0-cp39-none-win_amd64.whl", hash = "sha256:abf596f951370c648f37aa9899deab296c42a3829736e598b0dd10b08f77a44d"}, + {file = "jiter-0.7.0.tar.gz", hash = "sha256:c061d9738535497b5509f8970584f20de1e900806b239a39a9994fc191dad630"}, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[package.dependencies] +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 = ">=5.3" + +[package.extras] +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 (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "kiwisolver" +version = "1.4.7" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.8" +files = [ + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + +[[package]] +name = "matplotlib" +version = "3.9.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, + {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, + {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, + {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, + {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + [[package]] name = "maturin" version = "1.7.4" @@ -228,6 +1162,95 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} patchelf = ["patchelf"] zig = ["ziglang (>=0.10.0,<0.13.0)"] +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "numpy" +version = "2.0.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, +] + +[[package]] +name = "openai" +version = "1.54.3" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "openai-1.54.3-py3-none-any.whl", hash = "sha256:f18dbaf09c50d70c4185b892a2a553f80681d1d866323a2da7f7be2f688615d5"}, + {file = "openai-1.54.3.tar.gz", hash = "sha256:7511b74eeb894ac0b0253dc71f087a15d2e4d71d22d0088767205143d880cca6"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.11,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + [[package]] name = "packaging" version = "24.2" @@ -239,6 +1262,154 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "pillow" +version = "11.0.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + [[package]] name = "pluggy" version = "1.5.0" @@ -254,6 +1425,103 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "prettytable" +version = "3.12.0" +description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" +optional = false +python-versions = ">=3.9" +files = [ + {file = "prettytable-3.12.0-py3-none-any.whl", hash = "sha256:77ca0ad1c435b6e363d7e8623d7cc4fcf2cf15513bf77a1c1b2e814930ac57cc"}, + {file = "prettytable-3.12.0.tar.gz", hash = "sha256:f04b3e1ba35747ac86e96ec33e3bb9748ce08e254dc2a1c6253945901beec804"}, +] + +[package.dependencies] +wcwidth = "*" + +[package.extras] +tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + [[package]] name = "pydantic" version = "2.9.2" @@ -378,6 +1646,34 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyparsing" +version = "3.2.0" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pytest" version = "8.3.3" @@ -418,6 +1714,20 @@ pytest = ">=7.0.0,<9" docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-dotenv" version = "1.0.1" @@ -432,6 +1742,154 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "pywin32" +version = "308" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + [[package]] name = "requests" version = "2.32.3" @@ -479,17 +1937,114 @@ files = [ {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, ] +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "tomli" -version = "2.0.2" +version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, +] + +[[package]] +name = "tornado" +version = "6.4.1" +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.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "tqdm" +version = "4.67.0" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, + {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "types-assertpy" version = "1.1.0.20240712" @@ -529,7 +2084,37 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "zipp" +version = "3.20.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "324e77023537e384bec377bf8662498f9f2763d87bf28faa0e8c884d27f9a326" +content-hash = "53d3a394ca142176b2b3442c24a78cc0bb7fed2dfaa888b6b9fbffa87e757ab2" diff --git a/integ-tests/python/pyproject.toml b/integ-tests/python/pyproject.toml index c4d2c2768..371b1f703 100644 --- a/integ-tests/python/pyproject.toml +++ b/integ-tests/python/pyproject.toml @@ -21,6 +21,11 @@ pydantic = "^2.7.1" python-dotenv = "^1.0.1" assertpy = "^1.1" requests = "^2.32.3" +openai = "^1.54.3" +prettytable = { version = "^3.12.0", python = ">=3.9" } +matplotlib = { version = "*", python = ">=3.9" } +ipykernel = "^6.29.5" +baml-py = "^0.68.0" [tool.poetry.group.dev.dependencies] types-assertpy = "^1.1.0.20240712" diff --git a/integ-tests/ruby/baml_client/client.rb b/integ-tests/ruby/baml_client/client.rb index 2631807c4..2b02e0f2a 100644 --- a/integ-tests/ruby/baml_client/client.rb +++ b/integ-tests/ruby/baml_client/client.rb @@ -949,13 +949,13 @@ def ExtractPeople( sig { params( varargs: T.untyped, - email: String,reason: T.any(String, String), + email: String,idx: Integer, baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] ).returns(Baml::Types::ReceiptInfo) } def ExtractReceiptInfo( *varargs, - email:,reason:, + email:,idx:, baml_options: {} ) if varargs.any? @@ -969,7 +969,7 @@ def ExtractReceiptInfo( raw = @runtime.call_function( "ExtractReceiptInfo", { - email: email,reason: reason, + email: email,idx: idx, }, @ctx_manager, baml_options[:tb]&.instance_variable_get(:@registry), @@ -4694,13 +4694,13 @@ def ExtractPeople( sig { params( varargs: T.untyped, - email: String,reason: T.any(String, String), + email: String,idx: Integer, baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] ).returns(Baml::BamlStream[Baml::Types::ReceiptInfo]) } def ExtractReceiptInfo( *varargs, - email:,reason:, + email:,idx:, baml_options: {} ) if varargs.any? @@ -4714,7 +4714,7 @@ def ExtractReceiptInfo( raw = @runtime.stream_function( "ExtractReceiptInfo", { - email: email,reason: reason, + email: email,idx: idx, }, @ctx_manager, baml_options[:tb]&.instance_variable_get(:@registry), diff --git a/integ-tests/ruby/baml_client/inlined.rb b/integ-tests/ruby/baml_client/inlined.rb index cdd8e6de1..bde3e7e39 100644 --- a/integ-tests/ruby/baml_client/inlined.rb +++ b/integ-tests/ruby/baml_client/inlined.rb @@ -20,9 +20,9 @@ module Inlined "custom-task.baml" => "class BookOrder {\n orderId string @description(#\"\n The ID of the book order\n \"#)\n title string @description(#\"\n The title of the ordered book\n \"#)\n quantity int @description(#\"\n The quantity of books ordered\n \"#)\n price float @description(#\"\n The price of the book\n \"#)\n}\n\nclass FlightConfirmation {\n confirmationNumber string @description(#\"\n The flight confirmation number\n \"#)\n flightNumber string @description(#\"\n The flight number\n \"#)\n departureTime string @description(#\"\n The scheduled departure time of the flight\n \"#)\n arrivalTime string @description(#\"\n The scheduled arrival time of the flight\n \"#)\n seatNumber string @description(#\"\n The seat number assigned on the flight\n \"#)\n}\n\nclass GroceryReceipt {\n receiptId string @description(#\"\n The ID of the grocery receipt\n \"#)\n storeName string @description(#\"\n The name of the grocery store\n \"#)\n items (string | int | float)[] @description(#\"\n A list of items purchased. Each item consists of a name, quantity, and price.\n \"#)\n totalAmount float @description(#\"\n The total amount spent on groceries\n \"#)\n}\n\nclass CustomTaskResult {\n bookOrder BookOrder | null\n flightConfirmation FlightConfirmation | null\n groceryReceipt GroceryReceipt | null\n}\n\nfunction CustomTask(input: string) -> BookOrder | FlightConfirmation | GroceryReceipt {\n client \"openai/gpt-4o-mini\"\n prompt #\"\n Given the input string, extract either an order for a book, a flight confirmation, or a grocery receipt.\n\n {{ ctx.output_format }}\n\n Input:\n \n {{ input}}\n \"#\n}\n\ntest CustomTask {\n functions [CustomTask]\n args {\n input #\"\nDear [Your Name],\n\nThank you for booking with [Airline Name]! We are pleased to confirm your upcoming flight.\n\nFlight Confirmation Details:\n\nBooking Reference: ABC123\nPassenger Name: [Your Name]\nFlight Number: XY789\nDeparture Date: September 15, 2024\nDeparture Time: 10:30 AM\nArrival Time: 1:45 PM\nDeparture Airport: John F. Kennedy International Airport (JFK), New York, NY\nArrival Airport: Los Angeles International Airport (LAX), Los Angeles, CA\nSeat Number: 12A\nClass: Economy\nBaggage Allowance:\n\nChecked Baggage: 1 piece, up to 23 kg\nCarry-On Baggage: 1 piece, up to 7 kg\nImportant Information:\n\nPlease arrive at the airport at least 2 hours before your scheduled departure.\nCheck-in online via our website or mobile app to save time at the airport.\nEnsure that your identification documents are up to date and match the name on your booking.\nContact Us:\n\nIf you have any questions or need to make changes to your booking, please contact our customer service team at 1-800-123-4567 or email us at support@[airline].com.\n\nWe wish you a pleasant journey and thank you for choosing [Airline Name].\n\nBest regards,\n\n[Airline Name] Customer Service\n \"#\n }\n}", "fiddle-examples/chain-of-thought.baml" => "class Email {\n subject string\n body string\n from_address string\n}\n\nenum OrderStatus {\n ORDERED\n SHIPPED\n DELIVERED\n CANCELLED\n}\n\nclass OrderInfo {\n order_status OrderStatus\n tracking_number string?\n estimated_arrival_date string?\n}\n\nfunction GetOrderInfo(email: Email) -> OrderInfo {\n client GPT4\n prompt #\"\n Given the email below:\n\n ```\n from: {{email.from_address}}\n Email Subject: {{email.subject}}\n Email Body: {{email.body}}\n ```\n\n Extract this info from the email in JSON format:\n {{ ctx.output_format }}\n\n Before you output the JSON, please explain your\n reasoning step-by-step. Here is an example on how to do this:\n 'If we think step by step we can see that ...\n therefore the output JSON is:\n {\n ... the json schema ...\n }'\n \"#\n}", "fiddle-examples/chat-roles.baml" => "// This will be available as an enum in your Python and Typescript code.\nenum Category2 {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage2(input: string) -> Category {\n client GPT4\n\n prompt #\"\n {{ _.role(\"system\") }}\n // You can use _.role(\"system\") to indicate that this text should be a system message\n\n Classify the following INPUT into ONE\n of the following categories:\n\n {{ ctx.output_format }}\n\n {{ _.role(\"user\") }}\n // And _.role(\"user\") to indicate that this text should be a user message\n\n INPUT: {{ input }}\n\n Response:\n \"#\n}", - "fiddle-examples/classify-message.baml" => "// This will be available as an enum in your Python and Typescript code.\nenum Category {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", + "fiddle-examples/classify-message.baml" => "// This will be available as an enum in your Python and Typescript code.\nenum Category {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage(input: string) -> Category {\n client \"openai/gpt-4o\"\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}\n\ntest TestName {\n functions [ClassifyMessage]\n args {\n input #\"\n hello world\n \"#\n }\n}\n", "fiddle-examples/extract-names.baml" => "function ExtractNames(input: string) -> string[] {\n client GPT4\n prompt #\"\n Extract the names from this INPUT:\n \n INPUT:\n ---\n {{ input }}\n ---\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}\n", - "fiddle-examples/extract-receipt-info.baml" => "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", + "fiddle-examples/extract-receipt-info.baml" => "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, idx: int) -> ReceiptInfo {\n client GPT4o\n prompt #\"\n {{idx}}: Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\ntest TestName {\n functions [ExtractReceiptInfo]\n args {\n email #\"\n 04/14/2024 1:05 pm\n Venue: Ox Burger\n Ticket: 220000082489\n Register: Shop Counter\n Employee: Connor\n Customer: Sam\n Item # Price\n Guide leash (1 Pair) uni UNI\n 1 $34.95\n The Index Town Walls\n 1 $35.00\n Boot Punch\n 3 $60.00\n Subtotal $129.95\n Tax ($129.95 @ 9%) $11.70\n Total Tax $11.70\n Total $141.65\n \"#\n reason \"curiosity\"\n }\n}\n", "fiddle-examples/images/image.baml" => "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml" => "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", "generators.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.68.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.68.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.68.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.68.0\"\n// on_generate \"rm .gitignore\"\n// }\n", diff --git a/integ-tests/typescript/baml_client/async_client.ts b/integ-tests/typescript/baml_client/async_client.ts index d3face652..813f8a675 100644 --- a/integ-tests/typescript/baml_client/async_client.ts +++ b/integ-tests/typescript/baml_client/async_client.ts @@ -744,14 +744,14 @@ export class BamlAsyncClient { } async ExtractReceiptInfo( - email: string,reason: "curiosity" | "personal_finance", + email: string,idx: number, __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } ): Promise { try { const raw = await this.runtime.callFunction( "ExtractReceiptInfo", { - "email": email,"reason": reason + "email": email,"idx": idx }, this.ctx_manager.cloneContext(), __baml_options__?.tb?.__tb(), @@ -3824,14 +3824,14 @@ class BamlStreamClient { } ExtractReceiptInfo( - email: string,reason: "curiosity" | "personal_finance", + email: string,idx: number, __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } ): BamlStream, ReceiptInfo> { try { const raw = this.runtime.streamFunction( "ExtractReceiptInfo", { - "email": email,"reason": reason + "email": email,"idx": idx }, undefined, this.ctx_manager.cloneContext(), diff --git a/integ-tests/typescript/baml_client/inlinedbaml.ts b/integ-tests/typescript/baml_client/inlinedbaml.ts index 40e86d3b4..27333de12 100644 --- a/integ-tests/typescript/baml_client/inlinedbaml.ts +++ b/integ-tests/typescript/baml_client/inlinedbaml.ts @@ -21,9 +21,9 @@ const fileMap = { "custom-task.baml": "class BookOrder {\n orderId string @description(#\"\n The ID of the book order\n \"#)\n title string @description(#\"\n The title of the ordered book\n \"#)\n quantity int @description(#\"\n The quantity of books ordered\n \"#)\n price float @description(#\"\n The price of the book\n \"#)\n}\n\nclass FlightConfirmation {\n confirmationNumber string @description(#\"\n The flight confirmation number\n \"#)\n flightNumber string @description(#\"\n The flight number\n \"#)\n departureTime string @description(#\"\n The scheduled departure time of the flight\n \"#)\n arrivalTime string @description(#\"\n The scheduled arrival time of the flight\n \"#)\n seatNumber string @description(#\"\n The seat number assigned on the flight\n \"#)\n}\n\nclass GroceryReceipt {\n receiptId string @description(#\"\n The ID of the grocery receipt\n \"#)\n storeName string @description(#\"\n The name of the grocery store\n \"#)\n items (string | int | float)[] @description(#\"\n A list of items purchased. Each item consists of a name, quantity, and price.\n \"#)\n totalAmount float @description(#\"\n The total amount spent on groceries\n \"#)\n}\n\nclass CustomTaskResult {\n bookOrder BookOrder | null\n flightConfirmation FlightConfirmation | null\n groceryReceipt GroceryReceipt | null\n}\n\nfunction CustomTask(input: string) -> BookOrder | FlightConfirmation | GroceryReceipt {\n client \"openai/gpt-4o-mini\"\n prompt #\"\n Given the input string, extract either an order for a book, a flight confirmation, or a grocery receipt.\n\n {{ ctx.output_format }}\n\n Input:\n \n {{ input}}\n \"#\n}\n\ntest CustomTask {\n functions [CustomTask]\n args {\n input #\"\nDear [Your Name],\n\nThank you for booking with [Airline Name]! We are pleased to confirm your upcoming flight.\n\nFlight Confirmation Details:\n\nBooking Reference: ABC123\nPassenger Name: [Your Name]\nFlight Number: XY789\nDeparture Date: September 15, 2024\nDeparture Time: 10:30 AM\nArrival Time: 1:45 PM\nDeparture Airport: John F. Kennedy International Airport (JFK), New York, NY\nArrival Airport: Los Angeles International Airport (LAX), Los Angeles, CA\nSeat Number: 12A\nClass: Economy\nBaggage Allowance:\n\nChecked Baggage: 1 piece, up to 23 kg\nCarry-On Baggage: 1 piece, up to 7 kg\nImportant Information:\n\nPlease arrive at the airport at least 2 hours before your scheduled departure.\nCheck-in online via our website or mobile app to save time at the airport.\nEnsure that your identification documents are up to date and match the name on your booking.\nContact Us:\n\nIf you have any questions or need to make changes to your booking, please contact our customer service team at 1-800-123-4567 or email us at support@[airline].com.\n\nWe wish you a pleasant journey and thank you for choosing [Airline Name].\n\nBest regards,\n\n[Airline Name] Customer Service\n \"#\n }\n}", "fiddle-examples/chain-of-thought.baml": "class Email {\n subject string\n body string\n from_address string\n}\n\nenum OrderStatus {\n ORDERED\n SHIPPED\n DELIVERED\n CANCELLED\n}\n\nclass OrderInfo {\n order_status OrderStatus\n tracking_number string?\n estimated_arrival_date string?\n}\n\nfunction GetOrderInfo(email: Email) -> OrderInfo {\n client GPT4\n prompt #\"\n Given the email below:\n\n ```\n from: {{email.from_address}}\n Email Subject: {{email.subject}}\n Email Body: {{email.body}}\n ```\n\n Extract this info from the email in JSON format:\n {{ ctx.output_format }}\n\n Before you output the JSON, please explain your\n reasoning step-by-step. Here is an example on how to do this:\n 'If we think step by step we can see that ...\n therefore the output JSON is:\n {\n ... the json schema ...\n }'\n \"#\n}", "fiddle-examples/chat-roles.baml": "// This will be available as an enum in your Python and Typescript code.\nenum Category2 {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage2(input: string) -> Category {\n client GPT4\n\n prompt #\"\n {{ _.role(\"system\") }}\n // You can use _.role(\"system\") to indicate that this text should be a system message\n\n Classify the following INPUT into ONE\n of the following categories:\n\n {{ ctx.output_format }}\n\n {{ _.role(\"user\") }}\n // And _.role(\"user\") to indicate that this text should be a user message\n\n INPUT: {{ input }}\n\n Response:\n \"#\n}", - "fiddle-examples/classify-message.baml": "// This will be available as an enum in your Python and Typescript code.\nenum Category {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", + "fiddle-examples/classify-message.baml": "// This will be available as an enum in your Python and Typescript code.\nenum Category {\n Refund\n CancelOrder\n TechnicalSupport\n AccountIssue\n Question\n}\n\nfunction ClassifyMessage(input: string) -> Category {\n client \"openai/gpt-4o\"\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}\n\ntest TestName {\n functions [ClassifyMessage]\n args {\n input #\"\n hello world\n \"#\n }\n}\n", "fiddle-examples/extract-names.baml": "function ExtractNames(input: string) -> string[] {\n client GPT4\n prompt #\"\n Extract the names from this INPUT:\n \n INPUT:\n ---\n {{ input }}\n ---\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}\n", - "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", + "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, idx: int) -> ReceiptInfo {\n client GPT4o\n prompt #\"\n {{idx}}: Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\ntest TestName {\n functions [ExtractReceiptInfo]\n args {\n email #\"\n 04/14/2024 1:05 pm\n Venue: Ox Burger\n Ticket: 220000082489\n Register: Shop Counter\n Employee: Connor\n Customer: Sam\n Item # Price\n Guide leash (1 Pair) uni UNI\n 1 $34.95\n The Index Town Walls\n 1 $35.00\n Boot Punch\n 3 $60.00\n Subtotal $129.95\n Tax ($129.95 @ 9%) $11.70\n Total Tax $11.70\n Total $141.65\n \"#\n reason \"curiosity\"\n }\n}\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.68.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.68.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.68.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.68.0\"\n// on_generate \"rm .gitignore\"\n// }\n", diff --git a/integ-tests/typescript/baml_client/sync_client.ts b/integ-tests/typescript/baml_client/sync_client.ts index 7b352eb58..f790fd6cc 100644 --- a/integ-tests/typescript/baml_client/sync_client.ts +++ b/integ-tests/typescript/baml_client/sync_client.ts @@ -744,14 +744,14 @@ export class BamlSyncClient { } ExtractReceiptInfo( - email: string,reason: "curiosity" | "personal_finance", + email: string,idx: number, __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } ): ReceiptInfo { try { const raw = this.runtime.callFunctionSync( "ExtractReceiptInfo", { - "email": email,"reason": reason + "email": email,"idx": idx }, this.ctx_manager.cloneContext(), __baml_options__?.tb?.__tb(),