"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "if kernel_rows:\n",
+ " fig, ax = plt.subplots(figsize=(6, 4))\n",
+ " for row in kernel_rows:\n",
+ " weights = np.asarray(row[\"weights_mean\"], dtype=float)\n",
+ " error = np.asarray(row[\"weights_error\"], dtype=float)\n",
+ " x = np.arange(weights.size)\n",
+ " ax.errorbar(\n",
+ " x,\n",
+ " weights,\n",
+ " yerr=error,\n",
+ " fmt=\"o-\",\n",
+ " label=row[\"subject_name\"],\n",
+ " )\n",
+ " ax.axhline(0, color=\"0.75\", linewidth=1)\n",
+ " ax.set(xlabel=\"time bin\", ylabel=\"kernel weight\", title=\"Psychophysical kernels\")\n",
+ " ax.legend(frameon=False)\n",
+ " fig.tight_layout()\n",
+ "else:\n",
+ " print(\"no kernel rows to plot\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/behavioral_metrics/plot_learning_curves.ipynb b/behavioral_metrics/plot_learning_curves.ipynb
new file mode 100644
index 0000000..f5677eb
--- /dev/null
+++ b/behavioral_metrics/plot_learning_curves.ipynb
@@ -0,0 +1,69 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "7fb27b941602401d91542211134fc71a",
+ "metadata": {},
+ "source": [
+ "# Learning curves (labdata)\n",
+ "\n",
+ "Reads selected upstream `DecisionTask.TrialSet` rows directly. CLI alternative:\n",
+ "\n",
+ "```bash\n",
+ "uv run python scripts/analyses/plot_learning_curves.py --analysis-set-id --output figures/learning.pdf\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "acae54e37e7d407bbb7b55eff062a284",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pathlib import Path\n",
+ "import sys\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "\n",
+ "REPO_ROOT = Path.cwd().parent if Path.cwd().name == \"behavioral_metrics\" else Path.cwd()\n",
+ "for path in [REPO_ROOT, REPO_ROOT / \"src\"]:\n",
+ " if str(path) not in sys.path:\n",
+ " sys.path.insert(0, str(path))\n",
+ "\n",
+ "from labdata.schema import DecisionTask\n",
+ "from labdata_plugin.analysisschema import BehaviorAnalysisSet\n",
+ "\n",
+ "ANALYSIS_SET_ID = \"example_analysis_set\" # replace after seeding\n",
+ "selected = BehaviorAnalysisSet.TrialSet() & {\"analysis_set_id\": ANALYSIS_SET_ID}\n",
+ "rows = (DecisionTask.TrialSet() & selected).fetch(as_dict=True)\n",
+ "assert rows, f\"No selected TrialSets for {ANALYSIS_SET_ID}\"\n",
+ "\n",
+ "data = pd.DataFrame(rows).sort_values([\"subject_name\", \"session_name\"])\n",
+ "fig, ax = plt.subplots(figsize=(8, 4))\n",
+ "for subject, subject_df in data.groupby(\"subject_name\"):\n",
+ " ax.plot(subject_df[\"performance_easy\"].to_numpy(), marker=\"o\", label=subject)\n",
+ "ax.set_xlabel(\"Session index\")\n",
+ "ax.set_ylabel(\"Easy performance\")\n",
+ "ax.set_ylim(0, 1)\n",
+ "ax.legend(frameon=False, fontsize=8)\n",
+ "ax.set_title(\"Easy performance across selected sessions\")\n",
+ "fig.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python",
+ "pygments_lexer": "ipython3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/MIGRATION.md b/docs/MIGRATION.md
new file mode 100644
index 0000000..8fcbb48
--- /dev/null
+++ b/docs/MIGRATION.md
@@ -0,0 +1,132 @@
+# LabData migration notes
+
+## Goal
+
+Finish moving maintained behavior analyses from `djchurchland` to `labdata`,
+keep machine-local paths out of the runtime, and validate against LabData before
+merging [PR #8](https://github.com/rojasgabriel/behavior_analyses/pull/8).
+
+## Inventory
+
+| Surface | Classification | Notes |
+| --- | --- | --- |
+| `src/behavior_analyses/` | migrate (done) | Reusable learning / psychometric / kernel math |
+| `labdata_plugin/` | migrate (done) | Skill-informed analysis-set/config/fit schema; live activation completed 2026-08-03 |
+| `scripts/analyses/` | migrate (done) | Seed / populate / plot CLIs |
+| `psychometric_curves/utils.py` | migrate (done) | LabData/Chipmunk plotting helpers |
+| `psychometric_curves/*.ipynb` (old) | archived | Moved under `archive/djchurchland/` |
+| `behavioral_metrics/*.ipynb` (old) | archived | Moved under `archive/djchurchland/` |
+| `psychophysical_kernels/*.ipynb` (old) | archived | Moved under `archive/djchurchland/` |
+| migration stress notebooks (old schema) | archived | Moved under `archive/labdata_migration/`; superseded by tested CLIs |
+| `sess.ipynb` (old) | archived | Moved under `archive/djchurchland/root/` |
+| `oft/` notebooks | archived | Open-field; not Chipmunk LabData path |
+| `psychometric_curves/fit_psychometric.py` | preserve local copy | Upstream also vendored in `third_party/fit_psychometric` |
+| `labdata2_testing/`, `notebooks/ingest_subjects.ipynb` | already labdata | Leave as-is |
+
+## Portability
+
+- `fit-psychometric` is vendored at `third_party/fit_psychometric` (upstream
+ `jcouto/fit_psychometric@665d058`) so CI and local `uv sync` do not need a
+ sibling checkout or `/Users/gabriel/...` path.
+- Chipmunk access prefers `from chipmunk import Chipmunk`. Optional local
+ fallback uses `CHIPMUNK_PLUGIN_PATH` or
+ `tool.behavior_analyses.chipmunk_plugin_path` (empty by default).
+- LabData 0.1.x requires DataJoint `<2`. DataJoint 0.14.9 is the latest
+ compatible release and upstream pins `setuptools<82` because it still uses
+ `pkg_resources`.
+
+## Plugin schema design lock
+
+This design follows the Notion skills **Design LabData Plugin Tables** v0.2
+and **Plan Analysis** v0.5.
+
+| Table | Tier | One row represents | Primary dependencies | Persisted facts |
+| --- | --- | --- | --- | --- |
+| `BehaviorAnalysisSet` | Manual | One curated analysis selection and its provenance | none | name, description, selection thresholds/version |
+| `BehaviorAnalysisSet.TrialSet` | Part | One selected upstream task TrialSet | master + `DecisionTask.TrialSet` | optional inclusion reason |
+| `PsychometricFitConfig` | Lookup | One versioned psychometric eligibility configuration | none | minimum choices/stimulus values, analysis version |
+| `PsychometricSessionFit` | Computed | One fit for one upstream TrialSet and config | `DecisionTask.TrialSet` + config | status, fit sample size, curve/parameters/diagnostics |
+| `PsychometricSubjectFit` | Computed | One pooled fit for one analysis set, subject, condition, and config | analysis set + `Subject` + config | status, fit sample size, curve/parameters/diagnostics |
+| `PsychophysicalKernelFitConfig` | Lookup | One versioned pooled-kernel configuration | none | bins, CV folds, seed, calibration rate, regularization, version |
+| `PsychophysicalKernel` | Computed | One pooled kernel for one analysis set, subject, condition, and config | analysis set + `Subject` + kernel config | status, fit sample size, weights, held-out scores, bias |
+
+Keep:
+
+- one manual selector containing only selection provenance and upstream TrialSet
+ membership
+- direct upstream keys and versioned fit configuration in computed primary keys
+- explicit `fit` / `skipped` rows so eligible keys do not remain pending
+- numerical outputs and sample sizes needed to reproduce and interpret plots
+
+Drop or derive:
+
+- `BehaviorSessionSet.Session` and `.SubjectTrialSet`; both project from selected
+ TrialSets
+- `LearningSessionMetrics`; learning curves read canonical counts/performance
+ directly from `DecisionTask.TrialSet`
+- duplicated `p_side`, `n_side`, `fit_params`, selection-owned kernel settings,
+ and upstream trial payloads
+- figures in database blobs; maintained plot code produces editable PDF/SVG
+ outputs from numerical tables
+
+Live state:
+
+- the old definitions are preserved under `archive_l479_*` table names and the
+ canonical class names are active; no legacy table was dropped.
+
+## Live LabData validation
+
+Read-only checks completed on 2026-07-28:
+
+- DataJoint 0.14.9 connected and exposed the expected Chipmunk
+ `TrialParameters` and LabData `DecisionTask.TrialSet` fields.
+- GRB006 had 263 LabData trial sets.
+- The corrected psychometric query returned 422 choice trials for
+ `20240826_113307`, all with finite boundary-centered intensities spanning
+ -8 to +8 Hz.
+- The shared user schema already contains ephys-owned
+ `PsychophysicalKernelParam` / `SessionPsychophysicalKernel`, so this plugin
+ uses the collision-safe and method-specific
+ `PsychophysicalKernelFitConfig`.
+- The deployed behavior schema contains two selections: one disposable smoke
+ set and `migration_stress_test` with 183 selected TrialSets. Across both
+ selections it currently stores 184 duplicated learning rows, 128 session
+ fits, three pooled subject fits, and three pooled kernels.
+
+Approved disposable write checks completed on 2026-07-28:
+
+- Seeded `lab_tasks_479_smoke_20260728` with the GRB006
+ `20240819_110829` visual trial set: one session, one trial set, and one
+ subject/trial-set aggregate.
+- Created the old four computed analysis tables and populated one row in each:
+ `LearningSessionMetrics`, `PsychometricSessionFit`,
+ `PsychometricSubjectFit`, and `PsychophysicalKernel`.
+- Verified 393 choice trials in the psychometric outputs and a 10-fold kernel
+ fit over 393 trials (`score_mean = 0.844744`).
+
+The repository's Python 3.10 environment has a damaged local SciPy binary, so
+the successful populate ran from the same lockfile under Python 3.11.
+
+## Completed live migration
+
+The bounded migration was approved and completed on 2026-08-03. It:
+
+1. archived the eight old behavior tables with plugin-specific names
+ (no drops);
+2. activated the seven locked relations above and their two default config rows;
+3. copied the two selection masters and 184 TrialSet membership rows;
+4. copied compatible fitted rows under the default config while deduplicating
+ session fits by their upstream TrialSet key;
+5. dry-ran pending keys, then populated only the two migrated analysis-set IDs;
+6. verified counts, statuses, headings, and bounded diagnostic figures.
+
+Final active counts are two analysis sets, 184 memberships, 184 session fits,
+three pooled subject fits, and three pooled kernels. Session results comprise
+128 `fit` rows and 56 explicit `skipped` rows; every pooled subject fit and
+kernel is `fit`. All eight archive tables retain their original counts.
+
+Figures use a plain white canvas, neutral comparison titles, units, sample
+sizes, frameless legends, and vector output. Raw figures, commands,
+configuration IDs, and observation-first notes are on the LAB-TASKS-479
+[Results](https://www.notion.so/3b1ecf086b7c814a959aebd29420b453)
+subpage.
diff --git a/labdata_plugin/__init__.py b/labdata_plugin/__init__.py
new file mode 100644
index 0000000..7d151a2
--- /dev/null
+++ b/labdata_plugin/__init__.py
@@ -0,0 +1,17 @@
+from .analysisschema import (
+ BehaviorAnalysisSet,
+ PsychometricFitConfig,
+ PsychometricSessionFit,
+ PsychometricSubjectFit,
+ PsychophysicalKernel,
+ PsychophysicalKernelFitConfig,
+)
+
+__all__ = [
+ "BehaviorAnalysisSet",
+ "PsychometricFitConfig",
+ "PsychometricSessionFit",
+ "PsychometricSubjectFit",
+ "PsychophysicalKernel",
+ "PsychophysicalKernelFitConfig",
+]
diff --git a/labdata_plugin/analysisschema.py b/labdata_plugin/analysisschema.py
new file mode 100644
index 0000000..8710664
--- /dev/null
+++ b/labdata_plugin/analysisschema.py
@@ -0,0 +1,304 @@
+from __future__ import annotations
+
+import numpy as np
+import datajoint as dj
+from labdata.schema import (
+ DecisionTask,
+ Subject, # noqa: F401 - referenced by DataJoint definitions
+ get_user_schema,
+)
+
+
+rojasbowe_schema = get_user_schema()
+
+TRIALSET_KEY_FIELDS = (
+ "subject_name",
+ "session_name",
+ "dataset_name",
+ "trialset_description",
+)
+
+
+@rojasbowe_schema
+class BehaviorAnalysisSet(dj.Manual):
+ """A curated set of upstream DecisionTask trial sets."""
+
+ definition = """
+ analysis_set_id : varchar(64)
+ ---
+ analysis_set_name : varchar(64)
+ analysis_set_description = NULL : varchar(512)
+ performance_threshold = NULL : float
+ min_trials_with_choice = 0 : int
+ selection_version : varchar(32)
+ """
+
+ class TrialSet(dj.Part):
+ definition = """
+ -> master
+ -> DecisionTask.TrialSet
+ ---
+ include_reason = NULL : varchar(256)
+ """
+
+
+@rojasbowe_schema
+class PsychometricFitConfig(dj.Lookup):
+ """Versioned eligibility settings for psychometric fits."""
+
+ definition = """
+ psychometric_fit_config_id : varchar(48)
+ ---
+ min_choices : int
+ min_stim_values : int
+ analysis_version : varchar(32)
+ """
+ contents = [("v1", 100, 6, "v1")] # noqa: RUF012
+
+
+@rojasbowe_schema
+class PsychometricSessionFit(dj.Computed):
+ """One psychometric fit per upstream trial set and fit configuration."""
+
+ definition = """
+ -> DecisionTask.TrialSet
+ -> PsychometricFitConfig
+ ---
+ fit_status : enum('fit', 'skipped')
+ fit_message = NULL : varchar(256)
+ n_choices_fit : int
+ stims = NULL : longblob # boundary-centered stimulus rate (Hz)
+ p_right = NULL : longblob
+ p_right_ci = NULL : longblob
+ n_right = NULL : longblob
+ n_obs = NULL : longblob
+ bias = NULL : float
+ sensitivity = NULL : float
+ guess_rate = NULL : float
+ lapse_rate = NULL : float
+ goodness_of_fit = NULL : float
+ """
+
+ @property
+ def key_source(self):
+ selected = DecisionTask.TrialSet() & BehaviorAnalysisSet.TrialSet()
+ return selected * PsychometricFitConfig()
+
+ def make(self, key):
+ row = (DecisionTask.TrialSet() & _trialset_key(key)).fetch1()
+ config = (PsychometricFitConfig() & key).fetch1()
+ self.insert1({**key, **_psychometric_fit_payload(row, config)})
+
+
+@rojasbowe_schema
+class PsychometricSubjectFit(dj.Computed):
+ """One pooled psychometric fit per analysis set, subject, condition, and config."""
+
+ definition = """
+ -> BehaviorAnalysisSet
+ -> Subject
+ trialset_description : varchar(54)
+ -> PsychometricFitConfig
+ ---
+ fit_status : enum('fit', 'skipped')
+ fit_message = NULL : varchar(256)
+ n_choices_fit : int
+ stims = NULL : longblob # boundary-centered stimulus rate (Hz)
+ p_right = NULL : longblob
+ p_right_ci = NULL : longblob
+ n_right = NULL : longblob
+ n_obs = NULL : longblob
+ bias = NULL : float
+ sensitivity = NULL : float
+ guess_rate = NULL : float
+ lapse_rate = NULL : float
+ goodness_of_fit = NULL : float
+ """
+
+ @property
+ def key_source(self):
+ subject_conditions = (
+ dj.U("analysis_set_id", "subject_name", "trialset_description")
+ & BehaviorAnalysisSet.TrialSet()
+ )
+ return subject_conditions * PsychometricFitConfig()
+
+ def make(self, key):
+ rows = _fetch_trialset_rows_for_subject(key)
+ intensity_values = np.concatenate(
+ [np.asarray(row["intensity_values"], dtype=float) for row in rows]
+ )
+ response_values = np.concatenate(
+ [np.asarray(row["response_values"], dtype=float) for row in rows]
+ )
+ config = (PsychometricFitConfig() & key).fetch1()
+ self.insert1(
+ {
+ **key,
+ **_psychometric_fit_payload(
+ {
+ "intensity_values": intensity_values,
+ "response_values": response_values,
+ },
+ config,
+ ),
+ }
+ )
+
+
+@rojasbowe_schema
+class PsychophysicalKernelFitConfig(dj.Lookup):
+ """Versioned settings for pooled psychophysical-kernel fits."""
+
+ definition = """
+ kernel_fit_config_id : varchar(48)
+ ---
+ timebins : int
+ cv_splits : int
+ random_state : int
+ max_rate_hz : float # calibration rate
+ regularization_c : float
+ analysis_version : varchar(32)
+ """
+ contents = [("v1_10bin_10fold", 10, 10, 0, 20.0, 1.0, "v1")] # noqa: RUF012
+
+
+@rojasbowe_schema
+class PsychophysicalKernel(dj.Computed):
+ """One pooled kernel per analysis set, subject, condition, and config."""
+
+ definition = """
+ -> BehaviorAnalysisSet
+ -> Subject
+ trialset_description : varchar(54)
+ -> PsychophysicalKernelFitConfig
+ ---
+ fit_status : enum('fit', 'skipped')
+ fit_message = NULL : varchar(256)
+ n_trials_fit : int
+ weights = NULL : longblob # cv fold x stimulus time bin
+ weights_mean = NULL : longblob
+ weights_error = NULL : longblob
+ scores = NULL : longblob # held-out accuracy by fold
+ score_mean = NULL : float
+ bias = NULL : longblob # intercept by fold
+ bias_mean = NULL : float
+ """
+
+ @property
+ def key_source(self):
+ subject_conditions = (
+ dj.U("analysis_set_id", "subject_name", "trialset_description")
+ & BehaviorAnalysisSet.TrialSet()
+ )
+ return subject_conditions * PsychophysicalKernelFitConfig()
+
+ def make(self, key):
+ from behavior_analyses.io import get_chipmunk_table
+ from behavior_analyses.kernels import fit_psychophysical_kernel
+
+ config = (PsychophysicalKernelFitConfig() & key).fetch1()
+ trialset_keys = _selected_trialset_keys(key)
+ Chipmunk = get_chipmunk_table()
+ relation = (
+ Chipmunk() * Chipmunk.Trial() * Chipmunk.TrialParameters()
+ & trialset_keys
+ & {"rewarded_modality": key["trialset_description"]}
+ )
+ stim_events, response_values = relation.fetch("stim_events", "response")
+ result = fit_psychophysical_kernel(
+ stim_events,
+ response_values,
+ timebins=int(config["timebins"]),
+ cv_splits=int(config["cv_splits"]),
+ random_state=int(config["random_state"]),
+ max_rate_hz=float(config["max_rate_hz"]),
+ regularization_c=float(config["regularization_c"]),
+ )
+ n_trials_fit = int(result["choice_right"].size)
+ if result["weights"].size == 0:
+ self.insert1(
+ {
+ **key,
+ "fit_status": "skipped",
+ "fit_message": "insufficient trials or response classes for CV",
+ "n_trials_fit": n_trials_fit,
+ }
+ )
+ return
+
+ self.insert1(
+ {
+ **key,
+ "fit_status": "fit",
+ "n_trials_fit": n_trials_fit,
+ "weights": result["weights"],
+ "weights_mean": np.mean(result["weights"], axis=0),
+ "weights_error": np.mean(result["error"], axis=0),
+ "scores": result["scores"],
+ "score_mean": float(np.mean(result["scores"])),
+ "bias": result["bias"],
+ "bias_mean": float(np.mean(result["bias"])),
+ }
+ )
+
+
+def _trialset_key(key):
+ return {field: key[field] for field in TRIALSET_KEY_FIELDS}
+
+
+def _selected_trialset_keys(key):
+ selection_key = {
+ field: key[field]
+ for field in ("analysis_set_id", "subject_name", "trialset_description")
+ }
+ return list(
+ (BehaviorAnalysisSet.TrialSet() & selection_key).fetch(
+ *TRIALSET_KEY_FIELDS, as_dict=True
+ )
+ )
+
+
+def _fetch_trialset_rows_for_subject(key):
+ trialset_keys = _selected_trialset_keys(key)
+ return list((DecisionTask.TrialSet() & trialset_keys).fetch(as_dict=True))
+
+
+def _psychometric_fit_payload(row, config):
+ from behavior_analyses.psychometrics import fit_psychometric_labdata
+
+ intensity_values = np.asarray(row["intensity_values"], dtype=float)
+ response_values = np.asarray(row["response_values"], dtype=float)
+ valid_choice = np.isfinite(intensity_values) & np.isin(response_values, [-1, 1])
+ n_choices_fit = int(np.sum(valid_choice))
+ fit = fit_psychometric_labdata(
+ intensity_values,
+ response_values,
+ min_choices=int(config["min_choices"]),
+ min_required_stim_values=int(config["min_stim_values"]),
+ )
+ if fit is None:
+ return {
+ "fit_status": "skipped",
+ "fit_message": "insufficient choices, stimulus values, or fit convergence",
+ "n_choices_fit": n_choices_fit,
+ }
+ return {
+ "fit_status": "fit",
+ "n_choices_fit": n_choices_fit,
+ **{
+ field: fit[field]
+ for field in (
+ "stims",
+ "p_right",
+ "p_right_ci",
+ "n_right",
+ "n_obs",
+ "bias",
+ "sensitivity",
+ "guess_rate",
+ "lapse_rate",
+ "goodness_of_fit",
+ )
+ },
+ }
diff --git a/oft/README.md b/oft/README.md
new file mode 100644
index 0000000..d67bdf3
--- /dev/null
+++ b/oft/README.md
@@ -0,0 +1,4 @@
+# Open-field test
+
+Notebooks with machine-local video paths were moved to
+`archive/djchurchland/oft/`.
diff --git a/psychometric_curves/plot_psychometric_fits.ipynb b/psychometric_curves/plot_psychometric_fits.ipynb
index 9d06602..2ec8358 100644
--- a/psychometric_curves/plot_psychometric_fits.ipynb
+++ b/psychometric_curves/plot_psychometric_fits.ipynb
@@ -1,512 +1,80 @@
{
"cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "The autoreload extension is already loaded. To reload it, use:\n",
- " %reload_ext autoreload\n"
- ]
- }
- ],
- "source": [
- "from djchurchland.schema import Task\n",
- "from djchurchland.chipmunk.task import Chipmunk\n",
- "from djchurchland.chipmunk.psychometric import PsychometricFit\n",
- "from chiCa.chiCa import separate_axes\n",
- "from behavior_analyses.psychometric_curves.utils import (\n",
- " plot_single_mouse_psychometric_fit,\n",
- " plot_multi_mouse_psychometric_fit,\n",
- ")\n",
- "\n",
- "from datetime import datetime\n",
- "import pandas as pd\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "import matplotlib as mpl\n",
- "import os\n",
- "\n",
- "\n",
- "new_rc_params = {\"text.usetex\": False, \"svg.fonttype\": \"none\"}\n",
- "mpl.rcParams.update(new_rc_params)\n",
- "plt.rcParams[\"font.sans-serif\"] = [\"Arial\"]\n",
- "plt.rcParams[\"font.size\"] = 12\n",
- "\n",
- "save_dir = \"/Users/gabriel/Desktop/BSN_figures/\"\n",
- "if not os.path.exists(save_dir):\n",
- " os.makedirs(save_dir)\n",
- "\n",
- "%matplotlib widget\n",
- "%load_ext autoreload\n",
- "%autoreload 2"
- ]
- },
{
"cell_type": "markdown",
+ "id": "7fb27b941602401d91542211134fc71a",
"metadata": {},
"source": [
- "#### Identify sessions with good behavior (>80% performance)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "dict_keys(['GRB005', 'GRB006', 'GRB026', 'GRB027', 'GRB036', 'GRB037', 'GRB038', 'GRB039', 'GRB041', 'GRB045', 'GRB046'])"
- ]
- },
- "execution_count": 62,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "mice = np.unique(PsychometricFit.fetch(\"subject_name\"))\n",
- "performance_threshold = 0.7\n",
- "good_behavior_sessions = dict()\n",
- "for mouse in mice:\n",
- " if mouse in [\n",
- " \"GRB001\",\n",
- " \"GRB002\",\n",
- " \"GRB003\",\n",
- " \"GRB004\",\n",
- " \"GRB007\",\n",
- " ]: # mice only trained on 1s wait time version of the task\n",
- " continue\n",
+ "# Psychometric fits (labdata)\n",
"\n",
- " trials_df = pd.DataFrame(Task.TrialSet() & f'subject_name = \"{mouse}\"')\n",
+ "Uses fitted `PsychometricSubjectFit` rows from a seeded behavior analysis set.\n",
+ "For batch figures without a notebook, prefer:\n",
"\n",
- " easy_perf_df = pd.DataFrame(\n",
- " {\n",
- " \"session_datetime\": trials_df.session_datetime,\n",
- " \"avg_performance\": trials_df.performance.apply(\n",
- " lambda x: np.mean([x[0], x[-1]])\n",
- " ),\n",
- " }\n",
- " )\n",
- "\n",
- " # find sessions with performance above threshold in database\n",
- " try:\n",
- " sessions = (\n",
- " Chipmunk() * Chipmunk.Trial() * PsychometricFit() * Task()\n",
- " & \"n_total_trials_with_choice > 200\"\n",
- " & \"goal_wait_time >= 0.5\"\n",
- " & \"goal_wait_time < 0.6\"\n",
- " & f'subject_name = \"{mouse}\"'\n",
- " & \"session_datetime in (\"\n",
- " + \",\".join(\n",
- " [\n",
- " f'\"{dt}\"'\n",
- " for dt in easy_perf_df[\n",
- " easy_perf_df.avg_performance >= performance_threshold\n",
- " ].session_datetime.dt.strftime(\"%Y-%m-%d %H:%M:%S\")\n",
- " ]\n",
- " )\n",
- " + \")\"\n",
- " ).fetch(\"session_datetime\")\n",
- " except Exception:\n",
- " print(\n",
- " f\"Mouse {mouse} has no sessions with performance above {performance_threshold}\"\n",
- " )\n",
- " continue\n",
- "\n",
- " if len(np.unique(sessions)) >= 10:\n",
- " good_behavior_sessions.update({mouse: sessions})\n",
- "\n",
- "good_behavior_sessions.keys()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Identify good behavior ephys sessions"
+ "```bash\n",
+ "uv run python scripts/analyses/plot_psychometrics.py --analysis-set-id --output figures/psychometrics.pdf\n",
+ "```"
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
+ "id": "acae54e37e7d407bbb7b55eff062a284",
"metadata": {},
"outputs": [],
"source": [
- "GRB006_ephys_sessions = [\n",
- " \"20240424_150511\",\n",
- " \"20240429_174359\",\n",
- " \"20240430_183206\",\n",
- " \"20240501_195113\",\n",
- " \"20240502_161058\",\n",
- " \"20240506_171411\",\n",
- " \"20240507_180829\",\n",
- " \"20240508_173227\",\n",
- " \"20240509_163637\",\n",
- " \"20240510_180411\",\n",
- " \"20240530_164626\",\n",
- " \"20240604_123410\",\n",
- " \"20240605_133531\",\n",
- " \"20240606_141045\",\n",
- " \"20240607_133855\",\n",
- " \"20240612_142350\",\n",
- " \"20240613_140011\",\n",
- " \"20240614_132538\",\n",
- " \"20240620_124808\",\n",
- " \"20240621_143838\",\n",
- " \"20240628_130506\",\n",
- " \"20240702_134736\",\n",
- " \"20240715_134530\",\n",
- " \"20240716_151257\",\n",
- " \"20240717_154846\",\n",
- " \"20240723_142451\",\n",
- " \"20240724_144439\",\n",
- " \"20240806_141817\",\n",
- " \"20240814_154434\",\n",
- "]\n",
+ "from pathlib import Path\n",
+ "import sys\n",
"\n",
- "ephys_mice = [\"GRB006\"]\n",
- "behavior_ephys_sessions = {}\n",
- "\n",
- "for mice in ephys_mice:\n",
- " ephys_sessions = []\n",
- " for date in GRB006_ephys_sessions:\n",
- " ephys_sessions.append(datetime.strptime(date, \"%Y%m%d_%H%M%S\"))\n",
- "\n",
- " ephys_set = set(ephys_sessions)\n",
- " behavior_set = set(good_behavior_sessions[mice])\n",
- " behavior_ephys_sessions[mice] = ephys_set.intersection(\n",
- " behavior_set\n",
- " ) # get the ephys sessions that are also good behavior sessions"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Single animal psychometric fit plotting"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 41,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Calculating average fit for 29 sessions for mouse GRB006...\n",
- "Combined data: 10394 trials for mouse GRB006\n",
- "Successfully fit average curve for mouse GRB006\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "b0391a5254de4e4da41249fd8f3750bc",
- "version_major": 2,
- "version_minor": 0
- },
- "image/png": "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uJrNZjq/XiwWaQ3dYrHAZDKhXC5jaGiIjqV5PB6EQiF6c+L1emG1WsFxHNLpNPNyBxP0PQ6LxYK6urqdfYytwvM8nnnmGbz77rs44IADAAC/+tWv8OUvfxmCIOCll15CKpXCH/7wB3i9XixcuBDvvfce7rnnHjzxxBM7+fQMxq4BaSIzm80Ih8NjRrGKoqBcLuPDDz+kQhoMBsFxHBoaGmAymaDrOlRVhclkgsVigcfjGSWekiQhm80il8uhXC7XjKvJsgxN0+iedJvNRp3oiJuc0WikRjQkza9pGqxWKyKRCLxeL4xGI4aGhpBMJiFJEs4//3wAwM033wyPx4Pe3l40NDQgFovtiLd3l4Sl3LeT7u5uGAwGPPvss+jo6IDNZsM3v/lNZDKZCX1/b28vjj76aLhcLkQiEVxxxRV0ZEPXddx8882or6+Hz+fDCSecgN7eXvq9Tz75JObNmwebzYa99toLzz//PP3cvffei5aWFthsNhx44IH461//CmB0yr2/vx+nnXYaAoEAQqEQrrzySoiiCAD43e9+hyOOOALLli1DKBSCz+fDj370I1qr2trZR0Lu8kd+3HjjjaO+luM4vPTSS1i0aFHN46qqolQqYdOmTZg/fz68Xi/93L777ov3339/Qu85gzGb0TQN6XQahUIBLpcLoVBolJgrioK+vj68//77SKVSEAQB5XIZJpMJw8PDEEURXq8XqqoCAOx2O4LBICKRCBVzURSRTCaxfv16rFq1CkNDQzCbzWhpacGCBQvQ0NBAr6tpGlKpFNavX48NGzZg3bp16OnpgSAINHVvt9sBACaTCX6/Hy0tLWhra0MgEKANc7/97W9xyimn4Oqrr6av5frrr8fSpUtxyimn4Le//e2OeIt3WViEPk3cdttteOKJJ6DrOk488UTcdddduPXWW7f5fVdccQVcLhc+++wzDA8P45RTTsGCBQtw6aWX4v7778d//Md/4P/9v/+Huro63HnnnTj66KPxz3/+E9lsFueeey4eeughHHnkkXj66adx5plnYmBgAD09Pbj66qvx7LPPYuHChVi+fDm+853vYGBgoOa5JUnCV7/6VXR2duKtt95CMpnERRddBIPBgOXLlwMA3nvvPdTV1eHdd9/Fxx9/jPPOOw/HHnssjjrqqK2efSTjpfnHGpex2+045phjah5bvnw59t13X4RCIUSjUQwNDdEuWwDo6+tDKpXa5vvNYMxmSKSs6/qYO8oVRUEikUBPTw8KhQJsNhuam5vh8/mgKAqy2SytkQP/NwdOUvVkxCybzYLneWiaBofDQReqVM+aZzIZVCoVagSTy+WQTCYRCoUwZ84cuvKUuM1JkgSz2Uy75Mfi+9//Pr7xjW+gu7sbZ511FgDgpz/9KQ488EDEYjG0trbOwLu6+8AEfZq46aabaP327LPPxscffzyh7+vu7sbixYvR0tKCOXPm4JVXXoHf7wcA3HHHHfj1r3+NI444AsCWu9NYLIZXX30VjY2NkGUZjY2NaGlpwY9//GPsu+++sNlsNGvQ0tKC1tZW3HLLLfjmN78JTdNqnvvVV1/FwMAAPvzwQ/qcDzzwAE444QR6M6KqKh566CF4PB7MmzcPd999Nz7++GMcddRRWz37SLYnzX///ffjqaeewquvvgoAOPbYY3HFFVfgxhtvxHXXXYd//OMfeOSRR+haRgZjT4Sk2KvH0QiqqmJ4eJiOppnNZjQ2NiIUCiGVSiGbzWL9+vVIJBIIBoPo7OyE1WpFOBymTnJkc5osyzCbzYhEImPOf5Nxs4GBAWSzWfq40+lEe3s7AoEAmpqa6CY3UrOfiG98LBbD+++/j2uuuYY+dvvtt6O5uRn33HMPvvjFL07Tu7l7wlLu00RnZyf9vcfjGTf1PJJrrrkG//Ef/4FwOIwzzzwTPT09aG1tRalUQn9/P04//XS4XC64XC54vV6k02msX78eixYtwvHHH4+jjjoK8+fPx7XXXou2tjY4HA584xvfwD777IN99tkHixcvxp133okFCxaMSrutWbMGc+fOrRHhL33pS1AUBRs2bAAARKNReDyeMV/beGcfC/IaRn7cdtttW31/fv3rX+PKK6/EPffcg6OPPhoAEIlE8J//+Z948MEHYbfbccYZZ+CKK66oOSeDsTMRBAGJRALd3d1IJBLUfGUm0HUdmUwGhUIBbrcbwWCQirmqqkgkEli5ciXWrFmDQqGAcDiMuXPnorW1FU6nE/39/XjhhRewcuVKCIKAzZs346233sLw8DCSySQSiQRSqRSNtpuamtDR0YFoNFpj91ooFDA8PEy/r1KpQJIkhEIhdHR0oLm5mc6bp1IppNNpAEAwGEQoFJpQU9uzzz6LU089FR0dHVixYgU+/PBDrFixAu3t7Tj11FPx7LPPztj7vDvAIvRpYqRl4kRnIs8++2x87Wtfw/PPP4+XXnoJp556Kq699lpcddVVAICnn34a8+bNq/meQCAAg8GAl156CR999BFefPFFPPvss/j1r3+Nd955B4sWLcKHH36It956C//1X/+Fxx57DA8++CA+/fTTmuuM9R+I1MzIr2NZQZLXNt7Zb7nlllHf89lnn435+gOBwLjvzZ133omrr74av/zlL7F06dKazx133HFIJBKIx+OIRqP4zW9+s8en2xi7BoIgoL+/H6IowmKx0KUnjY2N096JrSgKMpkMVFWtiXCJ13o8Hqc+7W63G6FQiDbIFQoFiKKI9evXQxRFtLa2wmw2Q5Zl9Pb2YtWqVWhvb4fBYKDLWhwOB/V5H8sghjy3xWJBa2srnXsnUb4kSTSdPlZJYDx0XYcoivjhD3+Iww8/HMuXL6fPt99++2H58uVYunQpfvzjH+Nb3/rWNm1mZyssQt/JXHfddUgkErj44ovx0ksv4ZZbbsEf//hH+Hw+RCIRxONxzJkzB3PmzEFzczOuueYarFu3DmvXrsVVV12Fgw8+GLfccgtWrVqFpqYm/PnPf8b777+P22+/HUceeSTuvvturFu3DoIg0MY4wrx587B+/fqaBr73338fJpMJHR0dUz77WJDXMPJjPEF//PHHcfXVV+Oee+6hNzeENWvW4Gtf+xp0XUcsFgPHcXj55Zdx5JFHbvPMDMZMk8/nIYoiXUbi9/shiiLy+fy0Pg9pSgNA58CJkG/cuBGbN29GNpuF0WhENBrF3Llz0dzcDFmW6VIVXdeRzWYRCASgqioV4EAggHw+D4fDgUgkgkgkApfLRderkii8XC5TUxmTyQRN02C32xEOh9HQ0ID29nZ4vV7wPA+DwYBYLIb6+nqEQqGtijnpvs/n80gmk4jH43jppZfQ29uLCy+8cNTyGI7jsGTJEnR3d+Odd96Z1vd5d4JF6DuZtWvX4vLLL8cDDzwAo9GIV155Bfvvvz8A4Ec/+hGuu+46RCIRzJ8/HzfffDPeffddPPLIIxBFEQ8++CB8Ph/OPvtsrFq1Ct3d3dh///1ht9tx0003IRqN4utf/zreeustlEol7LvvvkgkEvS5jzrqKLS3t+Pcc8/Fv/7rvyKVSuGKK67AWWedNaG9wls7+/aQyWRw+eWX47zzzsMZZ5yBeDxOPxcOh9Ha2orVq1dj2bJluOCCC7BixQr89a9/xYMPPrjdz81gbC+VSmVUZstisdB56umA53nk83nYbDb4/X5q6ZrJZFAqlWjU7HK5UFdXh3A4TG8AiNuaoigwGAwIhUJYv349FeRisYhMJoMDDjgAkUikZp+5JEkwGAyw2+10lKxQKKBUKsFkMsHr9cJisUDXdXpG0jHvcrnoYhWyQU3XdWiaRn3ZyYemaXTDmtlsRiKRwOOPPw6gtrxZDXl8d/DZmCmYoO9kHnzwQVx66aU4/PDDoSgKjj/+eNx7770AgKuuugrFYhHf+973UCgUcOCBB+LPf/4zrXk/++yz+MlPfoJbb70VkUgEt99+O60zP/roo7j55ptx+eWXo6WlBStWrMCCBQtqBN1oNOLFF1/E5Zdfji984Qtwu904++yzt1nXnsjZt4fXXnsNpVIJjz/+OP1PTNi8eTNaW1vx3HPP4fLLL8fdd9+NvffeG6+++iqam5u3+7kZjO3FbreD53k4nU76mCRJ09Ljoes68vk8yuUy7UMpFosoFAooFArQNA2VSgUGgwHRaBRNTU0wGAzI5XI0PU7GUj0eDzweD51yWbNmDY3y3W43otEoBgYG6M2B2WymxjDk5oBE3qQznSx8ITcVHMfB6XTCarVCVVVq8SrLMhRFgSRJtCeHuMY5HA5aqnjuuefw1FNPUdc6AOjq6sJ+++036r3p6uoCgD16Dt2g76EGuIVCAV6vF/l8njVTMRiMaUMQBGzYsIHWto1GIwKBAObMmbNdNXRN05DNZunNARFOMj5WqVQgCAKcTie1ceV5HoVCgUbuuq7D7XbToKBUKuG9997Dxx9/jFwuh1KpBLvdjkAggAMOOAAHHngg3ZpmNpthMBhotA6AbmojNetyuUw/53a74Xa7YTQaaec7icR1XadrVslNgtlshiRJePnll/H444/jlVdeGdVcbDQaceihh+K+++6rSbtrmoalS5eiu7sbGzZs2GNr6CxCZzAYjGmGWKVW/7o9qKqKdDoNVVVhs9lQLBYhSRIURaFCT2rfkUgEkiRh7dq1yGQyyOVy4DgObrcbkUgEVqsVhUIBiqJQ61SXy4XW1lZomgZVVZHNZuF2u2siYWIjy3EcIpEIPB4PFVWy+EVVVSrysiyjVCpBEIQaW1e32023swFbovV//OMf+N3vfocnnniCdr9XM2/ePHzrW99CNBrFVVddhSuvvBIXXnghOjs70dXVhYcffhhvv/02nnnmmT1WzAEm6DPK3XffjRtuuGHcz59zzjn4zW9+swNPxGAwZhrS/FZd681ms7TmPVlkWUYmk0G5XIbBYADP87TWTFLpdrsdDQ0NcDqdSKfTdIyN4zjU1dWhubkZTqcT5XIZoijSpSYcx+Gjjz6iM+EkrW6z2ehZq1euWiwWhMPhGjEm9q0WiwUOhwOyLGN4eJjWwMm1SF8B2YGeSCTw3HPP4fe//z0++eSTUa87Eong5JNPxllnnYWDDz4YZrMZlUoFxWIR9957L84991z6teFwGHfeeSe+/e1vT/r9nU0wQZ9BLrjgApx44onjfp6l+hmM2cd0NMUpigJFUVAqlTAwMIBisUijWtJEJggCnUhpaGiA0WjE8PAwcrkcFEVBXV0dotEo/H4/SqUSja59Ph84jqPubGSfeaVSAc/zMBqNsFqtcLlcdOQOQM1yF03TaDOcoiiwWCx05SmJwsnMuSzLEEURxWIRsixjw4YNWLFiBZ566qmaDYoAYDabccwxx+D000/HN77xDbjdbhrpk4a8xYsX45JLLqHmV5dddhkaGhqwePHi7fhbmx0wQZ9BfD7fhLrFGQzG7GGyTXGqqtLmMCKKpEt8aGgIHMchFovBYrFAkiSUy2VwHIdAIIBYLAaPx4NMJoOBgQGUSiU4HA7EYjEEg0EoioJkMklr50TIiQiTa5DFKGTHOZkxJ6Nr1en1UqmEZDIJQRBGrVO12Wx0ZpzMuZM2rXfeeQePPPII/vu//3vUe7BgwQKcccYZOOWUU9DU1ASO41AulxGPx2m9naxcTSQSNTstyLa16R4L3B1hgs5gMBjTiNfrRbFYpGtJJUmC1Wqly4RIxEpEnJg4kREtl8tFU+bRaBT19fUQBAGZTIZGqWRRiqZp6OrqQi6Xo3PegUAAFosF+XweiqLA4XDQdaSkbu7z+WCxWDA0NIS1a9eiVCrRCZWLLroIRqMRXV1dWLhwIerr6wFsEfJ4PI5isQibzYZAIEBXoqqqCkEQkE6n6TicxWKBwWDAU089hfvvv5+6TxKsViuOP/54nHrqqVi8eDFtilu3bh1EUaQibjKZ6DKndDqNNWvW1FjKGo1GJJNJdHV1YWhoiHW57+xD7AxYlzuDwZgpSJNYpVKByWSCzWaDwWCg0bfBYIDZbKa7wS0WS01Ums/nEQqFEAwGkUqlUCgU6PcEAgG43W5kMhm6StTpdNK6OOl2Jyl6QRCgKAo1gCH1bwC48cYbcdNNN437Om644Qb8+Mc/RiKRoGn/WCwGt9sNVVXpGJymabRebjKZMDQ0hAceeACPPfbYqMi5sbERp512Go455hj4fD4YDAaoqkpF3OFwwOVywel01rw/FosFN99881bPu2zZsjE3OO4pMEFngs5gMKYRIk7kQ9M0GrFWj2hVd75LkoR8Po9sNkvr3waDgQq2yWSiZi4AkEqlaL3b4/HQ8TCe5+k4mKIokGV5TCEnDA0N4U9/+hPefPNN/OEPfwAAXHLJJVAUBfvssw8OPPBAOBwOuqjF4XDQjWuKogDYsu6U7IlYu3YtHnjgATz33HOjRs4OPfRQnHHGGfjCF75AU/zkvXE6ndR8xmKxjNupPjQ0hHfeeQfr16+nNxRkzevcuXPx5S9/eY+O0FnKncFgMLYTWZYhCAIEQaj5vaZp8Hq9CIVCY64EJc1lpPvcYrEgFArRFLvZbIbD4aB1atKkpqoq7HY7XW1KmuSISxtpzAuFQmPuYyCEw2FEIpGaPQiSJKGlpQV+vx+hUAhOp5Oa0wwPDwMAzS6YTCZwHIfPPvsMy5cvxyuvvFJzfbPZjBNOOAGnnHIK5s2bB5PJRAXbYrHA6/VS29iJEIvFcPTRR8Pv99OufF3X4XQ6ceCBB+7xPUssQmcROoPBmAJERMmcNXE6A4BkMglZlmtq6COXs1R3kBMbVKPRSF3WSO2b4zhwHEeb5ohrGzF0EUWR1pllWYbJZILH49nmiBwxnbn//vvx0EMPIZVK0c8Fg0GcddZZOO+882AwGGiGgDjCmc1mmM1mvP/++7jtttvw2muv1Vzb7Xbj2GOPxeGHH47LLrsMAPDMM8/QM7e1tdHFLxOBLHghvQfJZBL9/f1Ip9OYP38+Wlpa9ngxB1iEzmAwGBNGkiRqoVpdNyajXwCQSCRQKpWoONtsNrqcxWaz0c1jsizTMTCe56mhi9FohNfrha7rtIlNVVVomka3ppHHVFWFyWSixi3Vo2XjQYxoeJ7Hn/70J9x+++34yle+gosuuogatfz7v/877r//fixcuBBnnHEGvbkgAvzmm2/ihhtuGLUIJRaL4dJLL0UikcD999+Pp556in7u1FNPpb+fSK2bzNqPdJcDQF/71rIPeyIsQmcROoPB2AqKolC7U2LlSka0xhKUdevWobe3FyaTia4jVRQFjY2NqK+vB8/zMJvN8Hq9EASBmsOIokgXmJBNaC6Xi5rJEDGvrj0TnE4n3G73NiNeURQxNDSEdDoNXdfxrW99C52dnbj33nu3aaWqqipef/11/OIXvxi1ubGtrQ0/+clPcPLJJ0NRFPT396O/vx+JRAKXXnopAOD3v/89PB4PTfGPrHWTTnki4OQ1kuY+Mt6XTqexatUqqKoKr9cLURRZyv1/YRE6g8FgjGC8DWNkccjWkGUZ5XIZTU1N9LGNGzfCZDLB5/PB6/XC6XSiUCggmUyiVCqB4ziEQiFomoZMJgOHwwGv1wtFUZDNZmmKnXSEE0tZm80Gj8ezzRo0EfLe3l4oigK/34+VK1dicHAQd9xxx7jrSM8991z8+c9/htVqxS233II333yz5uvmzp2L6667DieccAIEQQDP8wCAhoYGeDyeGtH+4he/CFEUEQqFEI1Goes6dY0TRZE22VksFrrQxWAwoFwuUx96crNjNpvR3t5Or93X14f+/n4m6Dv7AAwGg7GroCgKeJ6nKXWr1Qq/30/HziYCaWTL5/MwGo3IZrNQVZXuFjcajSgWi9QBzuVyIRqNIp/Po1QqIRgM0uxhNpuF3W6nM92aptH5bK/XO26dnJi7kAxAf38/KpUKQqEQQqEQTCYTXn/9dQDbXkd6/fXX429/+1vN5+bMmYMbbrgBJ510Et1brmkaNZghDm8j0/9Go5E2+xHTGVK28Hg8dHxPkiTqA0+85h0OB4xGI1atWgWj0Yh0Og1RFGG1Wun7vKfDBJ3BYOzxkOiyehba6XROadGHz+dDJpNBJpNBIpGgkWprayvdH75x40YIgoBoNAqv10t3eDc3N9P93+Vymab1SUROxG289LooinQOXZIkFAoF5HI52O12em3yNY2NjQC2vY60Wsybm5tx44034owzzgDP88hkMrT5z+VyUVEGtjjmJZNJ+r3pdBrlchmBQACaplF72OrsgiAI1CKWZDTsdnvNa3U4HFi5ciV8Ph90XYfZbEYqldqjx9UITNAZDMYeia7rNJ1LGqwmG42PhdFoxODgIAqFAvx+P+0+t1qtyOfzWL16NTRNQ2trKziOQ29vL5xOJ1paWiAIAvr6+qgRjM1mo1E5cZsbOU+uKApdW0q+lvjAi6IIv99P0/Kkic7lcuGkk05Cc3MzHn74YSxfvnxUDf3f//3fae08Eong5z//OS688EKIooh0Ok1Nc8he9epsASlTZDIZ+lhfXx9aW1vR2dlZE7mT8gaxpLVarQgGg7TJsBoy204aE8kNj9lshtvtnvLf2WyBCTqDwdij0DQNPM/TPeJkHGss45XJQPzXBwcH4fV60dzcDE3TYLPZoKoq4vE4EokEzGYz5s2bh1KphEwmg3A4jIaGBqTTaSQSCVqvJ4tYzGYzPB5PjTc8uRkpl8uQZRkcx1Ef9XK5jGw2C0EQ4PF4qM2rJEkAQFemZjIZXH/99fje976HpUuXYsmSJTVd7m+//TasVituuOEG/OhHPwLHccjlcqP2nZNzkXp4pVKhDWzV0TcZeSM3DkTIyVy9zWajZ62GNCUSMxtN07B48WKIoohcLodwOFyTGdiTYYLOYDD2CFRVpUIObOkMn2pafSTVo2gcx6G5uRkul4t+fvPmzVi7di3a29vR2dmJZDIJURTR2tpKU+7Dw8MwGo10iQoRab/fT89IavykC564wGmahmKxCJ7nkc1mYTAYEI1GEQwGoaoq3X9usVjolja3243vfve7iMfjuPXWW2sa3oxGI77+9a9jxYoVCAQCyOfzKBaLUBSF1siJ/WuhUKAiznEcnQDI5XI1UbvP56Mi7PF4RhnkVIv/eE2JxCmvr68PPp8P4XAY4XAYhUJhTOOePQ0m6AwGY1ZDxI7sEyc+4SM7u6dKsVikc+fhcBhGo5GatOi6jqGhIaxZswbNzc2YM2cO3aDW2dkJs9mMnp4eZDIZWCwWeDweahNbHZVX1/iNRiNtEtN1Hfl8npYOyLa15uZm2Gw2pFIp5HI5mEwmOBwO2qlvtVoxPDyMpUuX4tFHH615PXPnzsUPfvADHHvssbDb7YjH4yiXy7BarXQhiyRJSKVSUBSFijhp3iPkcjmk02n650wmA1VVUS6X0d7ePqaQk21ylUoFuq7XNCXKsgye56kDnyiK8Hq9KBQKNctv9mSYoDMYjFmJpmkolUrgeX5GhJyMlMmyXNOo5vV60d/fjw8++AC9vb3I5XLo7OzEnDlzEI/H4XA40NjYCE3TsHHjRhqxki7u6qicCLWiKDCbzVTcgC03EmRFKUlHx2Ix1NfXI5fL0RG1QCAAn89HX7uiKLjvvvtw/fXXj7ly9NFHH0UqlcLatWvR2dlJ5+FJSj+dTsNgMMBms8Hr9Y5Z6wZAV7ASVFVFKpWC3+9HOBymJQ5N0+gudkVRam5YjEYj3eJGUvjRaBSxWIxmBkjkvi1nvD0BJugMBmNWQWrZZHZ5uoUc2LJKtFgswmg0jvJLFwQBAwMDWLNmDQqFApxOJyRJQiKRQGNjI+rq6iAIAjZt2gSe52kDGOkUd7lctElsrNoyGUUjr490mTc1NcFoNGLDhg0olUrwer2IxWI1XeIffPABLr74Ynz++ef0vHa7HUcddRRefPFFAMDf//53pFIpalZDuuHJiNhEGwfNZnNNOePjjz/GwQcfTMV8rPIBuUEY2ShHdrdXizZLsY+GOcUxpzgGY9ZQqVRQKBSgqioVpOkUcmLPSlaWkhR5NZ9++ineeOMN6LpOO+czmQwWLVqEL3/5y8jn89i4cSNkWUYoFILVaqWiLcsySqUSNE2ja0RJSlpVVeTzeeRyOUiSRJvtyPeTZjiz2YyGhoaaFHQ2m8VPf/pTPPTQQ6j+kb9o0SJ89tln477epUuX4mc/+xlN10+030BVVfz617/GrbfeikQiQR+vr6/HDTfcgFNPPZWOCDqdThqNk5sxYoVrs9noBjbGtmEROoPB2O0hM9dE6ILB4IQ3eE2USqWCXC4HjuPGHavieR6ffvop+vr6YDAYwHEc4vE4vF4vXSpCrFSj0SisViutPedyOWpAQyxeCeVyGZlMhtaL/X4/JEmCqqrQdZ025EWjUVrHB7ZkK5588kksXbqUbkoDtgj5gw8+iJaWFmzatAnr1q3D5s2baa08Go1i/vz5mD9/PiKRyITfI13XUSqV8NRTT2Hp0qX4yle+grvuuqume/6SSy6B1WrF6aefTt9DRVFo1oEIeXXKnUTxmqbRRTbkIxwOT+tN2+4Mi9BZhM5g7LZUrx8l/ujTHc1pmoZ8Pl9Trx1LQHK5HLq7u/Hqq6/io48+onVwMst90EEHoaOjAy6XC+FwmHqUa5pGhbw6Igf+LyOQTqehaRpNd5MueY/HQ2fLySpSkjHo7e3FpZdeipdffplez+Vy4eabb8bll18Ok8mEcrmMwcFBDAwMoFQqwWKxoKWlBU1NTZNOaVcqFWSzWYiiiMMPPxwdHR1jzrcvXboUmzZtwrvvvgtgy80KmTyw2+108oDcEBkMhq3+nljiMliEzmAwdlOq148Sf/TphoxZ6boOv98/rsiRdZ6iKNIZ7Hw+T61Mc7kcNm/ejAMOOADBYJCKnCzL42YUyuUy4vE4eJ6H2+1GMBgEz/Po7u6G2WxGNBql9WW/30+jXU3T8OCDD+Laa69FqVSi1zv55JNx7733orGxEaIoor+/H6lUCqIoIhgMYu+990YgEBgljrqu021vZMtZ9e8lSUIul4MgCLBarVi5ciX6+vpw++23b9Uj/qOPPsJ+++0Hs9mMpqYm6gVABJsxeZigMxiM3QqSnpUkCQ6HAx6PZ9oFQNd1Oo5mtVrh8/nGrR8PDQ1haGiImsCQmWmyJU2SJGplGggEqBsaMYwZmbrXNA3pdBrDw8PgOA51dXWwWq1IJBIoFovU653neSrm5GwbN27EkiVL8NZbb9HrxWIxPPDAAzjppJNQqVQwMDCAVCoFSZJgt9tRX18Pr9dLu+oVRaFiTcS7GoPBAKPRCI7jUC6XIQgCbDYb6urqYLfbaeS9LY/4eDyOr3/963C5XEzApwkm6AwGY7eA1GfJzPfI7vLpovqGwePx1BjEjKS3txfJZJIKKtn2VSgUEAwGIQgCZFmmhjPkmmRMbSSiKNKlLT6fDx6PB7IsY3BwELquo6WlBQBo1E7sTjVNw/3334+f/vSn1MkNAL73ve/h9ttvh9FoRF9fH7LZLB0ls9vtMJlMtKQA/J9YG41GmM1m2Gw2+mfyYTAYaFRuMplQV1cHp9MJnueRy+UQDAYBbNsjfv78+VMudwqCMKoMwsbWmKAzGIzdAFmW6dYyMto1E3XT6sa3rd0waJqG7u5upNNpOp9N/MzJYpdisUjr3iTSj0ajY3be67qObDaLwcFBAFuiarI6lIiWz+eDIAjQdb2mKa+7uxvf/e53a5zeWlpacM8992DRokXo6+ujNxVku5nT6UQwGKQ1e6PRCJPJtM1ImfQskOxAOByGIAi04c7pdOLEE09ES0vLuB7xjzzyCFpbW3H44YdP+u8H2CLmpLxhsVho6aWxsXGPF3Um6AwGY5eFROXFYhFmsxmhUGi7PdfHex7iuEbEc7wbhmpDGKfTCU3T6P5uMktNnNPMZjMsFgvq6+upzetIFEVBX18f8vk83VhGDFYMBgO9Nmn88/v9NNp/9NFHcc0119BeAgA499xzccUVV8Bms0EURZphICUBp9MJv98/6SkA0k+gaRod10un09B1nXbmE/G+++67ceqpp+LKK6/EhRdeSLvcH374Ybz99tt45plnpmy5m8/nUSgUYDQaUSqV6OvM5/NM0Hf2AaoRBAGXXXYZ/vjHP8Jut+Oqq67Cj3/84zG/9rnnnsPPfvYz9PX1YdGiRbj33nuxePHiHXxiBoMxU1Q7sbnd7hmLyhVFobakPp9vzFQ4QVVVbNy4Edlsloq+2WyGyWSC3W6nFq2kWxsAwuEw7Hb7mDXlUqmE7u5u+twWi4WuFhUEAaqq0v3pFosFJpOJrmW96qqr8Oc//5leq7GxEXfddRcOOeQQ2Gw2amhDFriQx7xe76Tex+pJAnLTQlzdxhqxkyQJX/7yl/GLX/wC99xzD84991z6uXA4jOXLl+Pb3/72hJ9/JMRS1mQywWw207q/0+lENBqd8nVnA7uUoF999dX45JNP8Prrr6OnpwfnnXceWlpacOqpp9Z83apVq3DWWWfht7/9LQ499FDcc889OP7447Fx48at/mdkMBi7BzzP0yis2iZ0uimXy8jn8/R5tha1yrKMDRs2IJ/PIxgM0pEzEkXn83msX78ePp8P0WgUoigiFApB0zR4vV7quAZsyQjE43HE43HaLEdS4Tabje5Dl2UZqqrC7XbDbDZDkiS88847uOyyy2oMW84880zccMMNCIVCNI2eyWTorDpp7JvsKFp1VO50OiHLMvL5PJ2Fr/57URQFhUIBgiDAbDbjq1/9Ktra2nDOOecAAG655RbMmzeP9gFMFVmWUS6X0dTURB8jZYU9nV1G0Hmex8MPP4w//elPWLx4MRYvXoxVq1bh/vvvHyXor732GhYuXIh/+Zd/AQDcfvvteOCBB7B69WoceOCBO+P4DAZjGtA0jY5AjefENh1Up9gdDsc2o1ZZltHV1YVCoYBwOAyn00kXiLjdbiSTSdrsFYlEaKSfz+dpCp5cX5ZlbN68GcVikUbyuq7TaLO7uxuiKMJsNsPhcCASicDpdEJVVfzsZz/Dr371K3quYDCIX/7ylzjxxBPhcrlgtVpRqVSQTCahKAr1XA8EApO6KdJ1ndbKSQaC53mYTKZRpjrVm96MRiMd7+vu7q65gTjiiCPG9I6fLOR9yefzMJvNkGUZDodjxm76did2GUH//PPPIcsyvvSlL9HHDjvsMNx6663QNK2msSIYDGLVqlV499138cUvfhGPPfYYPB4POjo6dsbRGQzGNCBJErLZLHRdH+XbPZ1dzZNJsZNzdXV1IZfLIRaLwe/306Uofr8fg4OD2LBhA0wmE9ra2mAwGKBpGo1qbTYbOI6ju783btyIQqEAh8MBVVWpICmKglKpRA1y3G43rZevW7cOp59+eo0H+5FHHon7778fc+bMgcVioTcpxDa1ev3qZMbCSAMi2aRGbgxGzvqT3evFYpE2BTqdTnrjEolE0N/fT78+n8/DYDBMynluLHw+H715EASBrnElEwZ7MruMoA8NDY3qKo1Go3TTTjgcpo+ffvrpePHFF3HYYYfReciXX34Zfr9/ZxydwWBsJ6VSCYVCYdRcNTC9Xc2ki30iKXZgS8q5q6sL+XwesVgMkUgEuVyOjpX19/dj8+bNcDgc6OzsRGtrKwYHB7F69WrYbDaYzWZ6Xq/Xi3Xr1kFVVYRCIXi9XoRCIdjtdnAch0wmQyN+r9cLj8cDXdfx+OOP47LLLqNualarFTfeeCN++MMf0khZVVVkMhmadiYbyyY7FkZKHaSUQG5KRnbmkyY0Urseq3M/Go2ioaGB/tloNKKhoWG769xerxfFYhGiKCIQCFBffbY+dRcSdNJwUQ35syiKNY+n02nE43Hcf//9OOSQQ/Dggw/iu9/9Lv72t7+Ne/cnimLNdQqFwjS/AgaDMVmqU+zjCVA+n6fRMLBlNCqbzU6qq7naKGZbXewEIua5XA5NTU2IRCLI5/PIZDJwu93o6+tDX18ffD4fFixYgFgsRm8QFEVBpVKhtqZ9fX3w+/3o6OhAS0sLIpEIzQzIsozh4WEUCgV4PB4EAgHY7XaUSiVccsklWLFiBT3T3Llz8cQTT9Q0AIuiSDMb5DVNtl5eLpfR29tLl7v4/X54vV54vd5x6+Rj1dGrsdlsNVnTzs5O1NfXb3cnus1mQ2NjI83YeDweNof+v+wygk5GD6ohfx6ZEvvJT36CffbZB5dddhkA4KGHHsKCBQvw2GOP4Sc/+cmY17/99ttx0003zcDJGQzGVCCpb03TRqXYq6lUKqPmwS0WS82u7a1RvSFtohaxoihi/fr1yOVyaG5uRiwWA8/zSCQSsNls6O7uxvDwMF1iEolEqNglk0nY7XZUKhUIgkA915uamrDffvvVONvJsoyhoSFqREPG8latWoVTTjkF69ato2e64IILcO+999acn2Q2yKYyg8GAQCAwKcOdQqGAVatW0QyJJEmwWq1oaGigYl1t6sNx3FZtcKup/juNRqPTJro2m40J+BjsMn57DQ0NSKVSUBSFPhaPx+nddDWffvppjQMRx3HYb7/90NPTM+71f/rTnyKfz9OPvr6+aX8NDAZjYpDGLYPBgFAotNUfzna7HZIk1TxGbEu3hSRJSKVSNM09ETEXBKFGzOvr6yHLMvr6+qCqKnp7e5FKpdDU1IQ5c+bAZrNheHgYqVQKmzdvRl9fH3p7e3HiiSfitNNOQ29vLyRJgiRJqFQqNWLe39+PQqGASCSCaDQKs9mMxx57DAcffDAVc7fbjSeeeAKPPPIIPT8xoiEiTAxjwuHwpMS8VCphw4YNyGazCAQCiEaj6OjoAMdxtIGNGMeUSiW4XC5EIhG2i3wXZZeJ0BctWgSz2YwPPvgAhx12GADgr3/9Kw466KBRtZn6+nqsXr265rF169bhoIMOGvf6Vqt1zHWHDAZjx1IsFmmH90RS36Rmms1mayLIbdVMeZ6nC1ICgcCEGsOqI/PW1lbEYjHouo7Nmzcjn8/Ts4fDYXp2URThcDhgs9nw0EMPjcoE/vznP6e/X7ZsGW688UbIsozu7m4IgoCGhgb4/X6Uy2VcdtllePzxx+nX77fffnj66adrZthJvVxRFDr7TnoPJtr8RkodZCWr3+9HMBikN1YWi4U26JH0utfrnfaVtIzpZZf523E4HDjvvPNw8cUX47HHHsPAwADuvPNOPPbYYwBAdwrb7XZcdNFFOP/883HQQQfhi1/8Ih5++GE6t85gMHZNSFQpCMI2PdKrmWzNtHokbTKjb6IoYt26dcjlcmhra0MsFgPHcVi7di16enroopVQKISGhgbEYjHqBke48MILsd9++2Hjxo24+uqrAQAvvPACXZcai8XoPLuiKGhpaYHb7cbq1atx9tln13SxX3TRRVi+fHlNNEzq5WQBzETH7qohNftcLgeHw4GGhgYUCgUUi0Ukk0lYrVaUSiX6d7S1csiOguxClyQJoihCEAQIggBJkjBnzhy23OV/2WUEHdhiF3jJJZfgyCOPhNfrxU033UQdhWKxGB577DGcf/75OP3001EqlXDbbbehv78fixYtwuuvv77d4xAMBmNmqI4qpyIQE62ZVj/PROu8QO1oWmtrK+rr62EwGPDPf/4Tf//736FpGmw2G5qbm2nNfCSiKCKZTMLlcuGoo46ij3/ta1+jqXJy0wCANow99dRTuOSSS5DNZgFsKTH85je/oT4bBJJxsFqtdNNZ9YKWiVAulzE0NIRKpYJAIIBgMIhKpUJvWEwmE9LpNCwWC774xS8iEonM+K7x6lWs1R+KotAeBEEQoCgK3fxGXOKsVuuoseY9GYOu6/rOPsTOoFAowOv1Ip/PT3njD4PB2DayLCOTyQDApA1OJoMkSchkMrQxbKLPI0kS1q9fj0wmg5aWFoRCIYiiiI0bN+LTTz+F3W5HJBJBXV0d2traxpx3zufzWLlyJURRxPz58+FyuWhJ4JVXXsHRRx9NI3Ngy/KUSqWC++67D7fddhsVqvb2djz77LOjtpSR+XKHwwFd11GpVCa1A756+YvRaEQsFqNRfSKRQH9/Px3pczqdcDgcaG1t3e4RM57naSYmnU7DarXWrGdVFAVEgshMfvXjHMdR4bZarbDb7bBarTCZTDN+o7E7sktF6AwGY3YhiiIymUyNvelU2JaxDLFwNZvNE66XA1s67bu6ujA8PIxIJAKz2UxH01auXAmPx4PGxka43e5xxTwej2Pt2rUwm8048MAD8T//8z/44Q9/SD9/3HHHobm5GUuXLsXRRx+NcDiM4eFhXHPNNXj22Wfp1x1//PH4wx/+UOOnoWkastks7ZQXRRGSJE0qy6FpGgYGBui4XUNDQ00/EVkVS7zQySrUiU4REHRdp6KsKAq1iSVkMhk4nU662Y38W1AUpcbVzmQywWKx0A9Wt5847J1iMBgzQrlcRi6Xg9VqRSAQmHJEtS1jGRK9TtYqVlEUrFq1Cj09PbTJjYjZP/7xD1itVrS2tsJut6O9vX1UE56maejp6cGmTZvg8/mwcOFCvPLKKzj11FNx+OGH47bbbqNbxv793/8dV111FX7zm99g//33x4UXXoh//OMf9Fo33HADli1bVnMjoqoq0uk0XcHK8zxkWUYgEJhwg68kSeju7ka5XEYsFkM4HKbPQfagC4IATdMQCoWoyJK97eOh6zpdyUo+qqPt6siaEA6HYbPZaBqdTDSZTCY4HA5YrVZYLJYJ3YwJgoBMJoNUKoVoNMrm0P8XlnJnKXcGY9oh89GTbdgai0QigVQqVRO5kjEri8UCURQnnX4uFotYtWoV+vv70dLSggULFsDlciGdTuN//ud/IEkSOjs7YbVa0dbWNsqFUpZlrFu3DolEArFYDJ2dneA4Dh0dHWhraxtzD/jSpUuxdu1ayLKMdDoNAHC5XPjDH/6Ak046adT10+k0DAYD/H4/8vk8VFWlS2EmQrFYRHd3NwwGA22+IwiCgFwuB2BLR3smk6E3TGSKoNqJT1EUSJIEWZbprwBgMBhoPZt8mEwmJBIJDA0NoVgs4ogjjgAAPP/889QGt6mpCS0tLbQfYDIIgoANGzbQWj8pEbB96CxCZzAY00yhUECpVJp0w9Z4jGUsw3EcBgYG0NjYOGpZyHioqkqj+56eHqTTaSxYsADz58+HyWRCKpXC22+/XSPmra2to8S8XC7T0bb29nY0NzfDaDTizTffRE9PD2699dZRIsVxHJYsWVKzSnTOnDl4/vnnsXDhwpqvFQSBOrZ5vV5ks1lomjYpMY/H4xgaGoLT6URbWxv9PhKVVyoVurvdaDTSZSdkioAsgyEb26qb0SwWCxwOB02Hj7xZkyQJ9957L/71X/+15vHqmxYyvjdZdF1Hb28vkskkotEoNemZrHPgbIUJOoPBmDZyuRzK5fKkIuZtYbfbaUod2FKXHx4eRjAYRDgc3mZdXlEUFItFuh0tm82iUqmgs7MTc+bMgclkQjKZxHvvvYdyuYz29nZYrVY0NzcjEAiMen1dXV2oVCqYO3cu6urqqHgPDQ0BwJh7z0c+/vWvfx1PPfXUqJsF0slus9ng8XhoJB8KhSZUSybGN9lsFtFolHbrA7VR+cgJALPZDLfbTTMehUKB7np3Op2wWCwwm81jRtO6rteMkmmahjPOOAPHHHNMzYpZm81GzxKLxbb5WkZCnAVzuRyCwWBNP8NknANnM0zQGQzGdlM9Yz6ZcbGJUG0sQ36ou1wudHR0bFXMJUlCqVSCIAgwGo1wu93I5XJIpVKoq6tDR0cHTCYThoeH8fHHH6NcLqOxsRF2ux2NjY0IhUI114vH4+jp6YGmaZg/fz5CoVCNwBGR6urqGtWlTh4HgJNPPhlPPfXUKIEmmQ2XywWn04lUKgUANbXtrSEIAjZv3gxJktDa2kpvRkZG5T6fDxzHQZIkWs8mKXSympTUs8crlRARJ/a2uq7TWrjNZkN9fT0903RsyaveW9/Q0IBEIoFkMglBEGCz2aCqas0imD0VVkNnNXQGY7vQdZ2mZv1+/4ykPXO5HNasWYN4PI66ujosWLBg3HWZkiTRbVwmkwkulws2mw2JRALr16+Hz+fD/PnzYbVakUgk8Pe//x08zyMQCMDpdKKpqakmgtR1HX19fRgcHITZbKZiWS12mqYhmUxi8eLF6OzsxL333juqhn7FFVdgzZo1GBoaqhFoXdeRy+VouttutyOVSsFgMCAYDE5IzAuFAnp6esBxHNra2uj+C1EUkcvl6HpTo9FIRZjMb9tsNjoWtq16drWIa5oGk8kEu90Ou90+6gZlZDPjWLX5bVH93pB+jHw+j08++QQ8z1PPfKfTiQMPPHCPX6HKInQGgzFlqsV8Mt3Xk6FSqaCrqwuCIKC9vZ3Wu0eazYiiiGKxCEmS6Pga+fzw8DC6urrgdrsxb948Kuaff/45dX8zmUyIxWI1Yq6qKrq7u5FKpeByuRCLxUaJOfE6z2QyuPrqq/GjH/0IV155JS688MKaLvd33nkHzzzzzCgxr74ZslgskxJzXdeRTCYxNDREZ8fNZjN0XUehUKhZuUrWolZH0hPxfZdlGZVKBZVKBaqqwmQywel0jini1Wzvljyyl11V1ZqsD1mbGg6HIQgCotEoVFUdtdxrT4QJOoPBmBKaptEd3MFgcFJLQSaKqqrYtGkTeJ5Ha2srvWGoFobqiHykkANb5p+7urpgs9kwb9482Gw2DA0NYc2aNVBVFV6vF5qmoaGhAU1NTfT7JEmiHu4+nw/hcBh+v5+KuaqqyOfzdE7c7/fjO9/5DgYGBvCrX/0Kb731Fr1WQ0MDnnnmGep8Sd6/dDpN3fPIjcpExVxVVQwNDSGVSiEQCKCxsREcx1FrV+LFTlLSTqeT7mjfFpqm0fWvsiyD4zgaiU/073l7tuSRFLvJZBq1t75SqcDtdtf0aExlbn42wgSdwWBMGhJZKooyY2JOHObK5TKi0WhN9G+xWFAoFOjyEGJcMzLyKxQKWL9+PYxGIxYsWACn04mhoSF0dXVBURR4PB6Uy2W0tbWhpaWFfl+5XKZ2qIFAAIFAoEbMy+UyCoUCyuUyACAYDEJRFDz99NO45557oKoqvdYTTzyB73znOzUCXT1jTmrxpGY+ETEXRRGDg4MolUqIxWKIRCLQdR2JRALDw8MAtjS+kRT+tkSc1LqrR9msVitsNhvcbjesVuukRw9HNjMCE5tvJz784408TuW6ewpM0BkMxqTQdZ1GlpMZpZoMZHTLZDKhsbERQ0NDtInLbDbTDWFer3fcJjye59HV1QVVVbFgwQK43W4MDQ1h48aNNKLO5XKoq6tDe3s7FQ4y1qaqKgKBAHw+HxVzEpULggBZlmGxWGC32yGKIu666y7cc889o85xwgkn1Ai0oih0xjwUCsFgMNR0s29LzEulEuLxOARBQH19PZ2fj8fjkGUZfr8f0Wh0wo2J5XIZXV1dyOfz4DgOmqbB6/Wis7OT1uKnwmS35JGGx5Ep9u297p4EE3QGgzFhdoSYV49uEVOVTCaDYrFIZ44dDgc6OzsRDofHjByJ+QjP85g3bx4CgQDi8Ti6u7shiiJCoRCy2Sy8Xi/mz59Pm8FyuRz6+/sBbBEOj8dDxZykgTmOo05oTqcTxWIRP/7xj/HUU0/R57/yyitx7733jjoXMYwxGo0IBoMAgFQqBV3XtynmpEEsmUzSuXRi60oi1vr6+gk3nMmyDJ7n6Zgb2XNutVqRzWZRLBa3S9AnsyWP+MiTne5bq81XX7dUKiEUCjGnuP+FCTqDwZgQRMxJzXwmxJyMbjmdThpxiaIIu90Og8EAQRAwd+7crS7oILVvYvwSjUbpyJkgCAiFQrQ+u++++9ImskwmQzvQHQ4HXC4X/H5/jUWq3W6Hqqo0xZtMJrFkyRK88cYbALY4p91777347ne/O0rQia89qfMbDAakUqlRtqtjQfoVkskkZFmGw+GApmkolUowGAxoaGig42jbQhAElEolSJIEo9FIl7VUmwBN11z3trbkVTfv2e12umN+a+i6Dl3XYTQaYbfbJzzWtyfABJ3BYGwTIngz1QA3cnSLbOgSRRF9fX3QdZ2ml41G47hNUIqioLe3F/F4HC0tLWhsbEQikUBfXx/tjiarOA844ADYbDZomoZUKoXh4WFaOyZ7wEltGdhSkyZNYn6/H729vTjjjDPw2WefAdjSSf7AAw9g//33p48BwGeffQaO41AoFNDY2Ii99toLwJbtY8TOdWsRqSzLSCaTGBgYgK7r1FRFFEXq9ratSFrXdZTLZZRKJaiqCovFUtNzQOr3hB1Rk1ZVFdlsFpIkTciIiDj9lctlaJoGi8UCv9/PVqdWwQSdwWBsFWIaQ0bTplvMyUYxMrpFomASFZNoVJIkDA4OjmskomkaBgcH0d/fj7q6OrS2tiKdTqO3t5duKwO2ZAH22msveL1eqKqKZDKJVCpFO7hJpEhuMOx2OzWlITc0a9euxUknnYTNmzcDAHw+H1588UX85S9/wYUXXlhzrsMOO4z+/oYbbsCNN96IbDY7oUxHqVRCX18f0uk07HY7mpqa4HA4UCwWaSPg1m4GNE0Dz/PgeR6apsFut8PlctU8p9frxcDAAD788ENq1NLS0jItNenxjGWqV92GQqGt/puSJInewBkMBjgcDjidTraFbQzYO8JgMLZKLpeDIAgzMmde3e1NxK1YLKJUKoHjOPj9fjgcjhojkXg8DqfTifb2dnod0uHd3d2NQCCAzs5OZLNZdHd3Q1VVuFwuujSkpaUFDQ0NUBQFyWSSOs8ZjUbYbDa4XC5a1yaz4dUd6Z999hlOPPFExONxAFtG0l599VXsvffemDNnDk488UTouk6tUGVZplausVgMuVyOZgvGEzJVVRGPxxGPxyFJEqLRKBoaGqgt67aW3qiqilKpRLvwnU4nXV06EkEQ6CIVg8GAYrGIoaEhtLe3b1dderwteX6/H6Iowmq1bjXCri4NmEwmmolge9DHhwk6g8EYFxJdzYQDHOn2BrZ0d5NoWVEUuFwuuN1uGAwGFAqFbRqJZDIZbNq0CU6nE52dnSiVSti8eTOdvzYajUin0wgGg+jo6KBp7FwuB7fbTZvcTCYTMpkMrFYrdR2rtmB99913cdJJJ9Hxrnnz5uG1115Dc3MzANQY05DmPofDQa9FegT8fv+YN0eapqFYLCKRSIDneVgsFsRiMXg8Hpou31oHuKIoVMg5jqM2sltLS/f390NRFOy99970sb6+PvT392+X89pIYxmHw4He3l7wPI+2trYxU/q6rqNSqaBUKkFRlFGlAcbWYYLOYDDGpFgsgud5+Hy+afVmB0BTrkajET6fj4qQxWJBJBKZlJFIoVDAhg0bYDQaMXfuXCiKgk2bNkHXdTgcDphMJto139nZCVVVkUqlUCwW6f50g8FAo2pSz60eLwsGg3jttddwyimn0Oc98MAD8corryAcDo96fUTMq5v7SqUSSqUSvF7vqPdT13WUSiUUi0UUCgVwHEcjeJvNRlPs43WAjxRysjFtItFsNpsddR673Y5sNrvN790a1cYyqqoil8tB0zRYrdZRYj6yxk8852fC32A2wwSdwWCMgqRHPR7Pdo0ujQWZMSdiRaJ0n8835nNtzUiE53ls3rwZiqJg3rx54DiOzp47HA5wHEcFuLW1lbqxkfWu5DxkFajf74fZbKbjZRzHIRgM4vnnn8dZZ50FSZIAAF/96lfx/PPPj7ketlQqYXh4mNb9yey8IAijbkyALXPgxWKR7hx3uVz0JoN4r4+XYldVFcViEeVyGUajcUppab/fj0wmU/NYpVKhC1amCvl7IzdUHMfB7XbXbJjTdR08z6NUKtEav9vtZvXxKcLeNQaDUUOlUqHRJek2ny7K5TJyuRwsFgt1BSPNUuOlhcczErHZbOjr60M+n0d7eztcLhe6urpqOrQFQYCqqqivr4fD4UA6naY3B2RkyuFwwO1202i9OnsQDAaxYsUKXHDBBdT97aSTTsITTzwxZhqYiHk+n6evMZvNolwuo6Ojo+YGQJIkFAoFSJIEi8UCTdNgs9mg6zpUVQXHceOm2Elqvlwuw2AwTCoiH0ljYyPi8Tj6+vpqlp00NjZO+lrVeL1eOvvvdDqpf7zX6x0VkZMxQSbk2wd79xgMBkWSJORyOSqy00mpVEKhUAAA6g8+kfroWAYlTqeT2pw2NjYiHA7TPeU+n4/WYjVNQyAQgMvlos19JJ2ey+Xg8/kQiUToGSRJQjqdprPiv/nNb3DZZZfRs5x77rl49NFHxxSeYrGIYrEIXdfpSBVZS0oibmCLGBPbWLPZDJ/PRxvSgC03IRzHwWq1jupiJ6l5Mn9OIv7taRTz+Xw48MAD0d/fj2w2i/r6ejQ2Nm5X/Zy8/+R8ZCsb8c0fHh6GqqosIp9m2LvIYDAA/J/1psVimfY1lPl8HoVCgc5A2+12eDyeKc0Qa5qGRCKBgYEBhEIhNDQ0YNOmTSiXywgEAlRMOI6jUaEgCJAkCQ6Hg7qSRSIRxGIx2vlNjF9II9bdd9+Nq666ij7vpZdeivvuu2/MMxMxd7vdkCQJuq7TLnVifkKWnZCbGq/XC7PZjEwmA47jYDAYaPaCpKarhZqUQXRdp9mT6ZrB9vl80/Z3rqoq9fmPxWI0uyAIAorFIu3639b8PWPysHeTwWDQzV9kVGy6RoOIYQyp0bpcLvh8vkmNv1WPP5nNZvT19WFoaAitra1oa2tDb28v8vk8gsEgOI4Dz/NU9IxGI3RdhyzLNSNxDQ0NiEajNc9BUvqBQAC33norrr/+evr5a6+9FrfddtuY7wtpZnO73XC73chkMuju7qbjVpqmobu7G42NjfRmxuv10jo9+ZpUKgWn04lQKFRT6hAEAYVCAYqi0PLAruqMNnK+nPQjFAoFOr62rbnziTDefPueDhN0BmMPh1i6AqCiOJ3XHR4ehtVqRTAYnFJUTqJ7o9GIoaEhJBIJWluOx+PI5XJ0XpxEgKSGrmkaNE2j9XJJktDc3IxQKESvT8ScjKpdf/31uPXWW+nnb775Zvz85z8f82ykjEDEnLxu0gxGtrmRXeTBYBBWq5U+JxG8ZDIJn89Xs1VOURQ6+kVmtmfCbne6IJ395KzAFg+Dcrk87ja8qTDefHtjY+MeL+pM0BmMPZxsNgtFUabVE5u4tqXTaSpUU/1hm8vlMDQ0RH+VJAlNTU0YGBigqWen0wme56kBjqZpEEURXq+X2rUCQHNzMwKBAL12pVKhY1terxfXXnstfvnLX9LP33HHHbj66qvHPNdYYg5sGaMLhUJwOBx0xWt7ezs15iGNgaQLPJVKIRQK0fQ/aXgjNwW7+hx2tR+70+mk0wekL2C6DWFyuRwKhQLsdjvK5TJCoRByuRwdTdyTYYLOYOzBFAoFCIIwrctWVFVFd3c3isUiotEootHodkX9pVIJa9eupd33gUAAPT09AIBFixbB5/PRKJgs9yDmLblcjjaY+f3+mpGpajH3+Xz48Y9/XLP+dPny5bjyyivHPBPP8ygUCtQAp/qsuq7DbDbDZrPVCJzD4aiZT8/lckin06ivr0c0GqUb3QqFAnRd367O9R0FWRojyzJ8Ph+MRiM1B3I6ndS0Z3tRVZU67/X29tJyBpkKmK5lMrs7TNAZjD0UMjbk9XqnzdJVFEVs3LgRiqKgra1tWjrlya7vSqWCQCAASZKQSCQQCoUQDochyzIymQwdjUokEnA4HMjlcrBarXA4HLDb7XTDGTBazH/4wx9i+fLl9DkfeOABXHrppWOeh6xRdblcNQYp1al7RVEwODgIh8OBbDZLsx/EOS6dTiOXy9H0vyzLyOfzkCSJNgzuqnVyAjHe0XUdPp8PgiBQM5lwOLzdN4iqqqJSqdCGRmDLApxwOIxSqUTXzwI7ZpnM7gATdAZjD0QUReRyOerxPR0UCgV0d3eD4zh0dnZOi7scadYjaXa73U4XtpAf4MlkElarFV6vlwoM+Roy8zyWmJPPX3nllbj//vsBbBkvu//++7cq5uR9qxYQWZYxNDREn9fn88FkMkFVVZoxsNvt8Pv91Nimra0NPp+P2sGaTCZaY9/VITcvJpMJVqsVuVwOBoNhq7a0E0HTNFQqFVQqFUiSBIPBQHsbbDYbOI6D0+mkI3bVvgTTPWa5O8IEncHYw1AUhUaS0/FDUNd1JJNJDA4Owul0oq2tbdrGkbLZLHieh9VqhdForEnv+v1+DA8P0wgxn8+jWCxSa1Gv1wtJkmp6A4ggT0XMybgb+V4CKTEIgoD6+noaTXq9XrqqNZfLwePxIJ1Oo1KpoL29HRaLhTrK7Q7pdQLpHSB/x6VSid5gTSW9Tm7AyuUyRFGkIk72B4x8T2w2G0KhEPr7+xGPx+H3+xEKhfb4+jnABJ3B2KMgNU8ynra9KIqCeDyOdDqNQCCAxsbGaeuSLxQKGBwchNvthsPhQF9fH8rlMhVUTdNo/V8URSSTSZru9fl84HkegUCApn5HivkPfvCDGjG/7777cMkll4x5FhKRkhQ9QZZlbNy4EaIo0oUj69ato+NoxA1O0zQYDAY0NDSgqamJzmqT6HNXT68DoM5+PM8D2HIjYzQapzyGJkkSyuUyKpUKrYNXR+LjIQgCUqkUDAYD6urqIEkSUqkUbDbbHi/qTNAZjD0IsiAjFAptt/CWy2UMDw+jVCohGo0iEolMm5hXKhUkEgna6MZxHEwmEyKRCDweD12tOWfOHGiahqGhIXAch6amJprG9ng89Af8SDH/0Y9+hHvvvRfAFjFfvnw5vv/9748ZIYuiiGw2C5vNNqqprqenB7IsY86cObR0IcsyhoeHIcsynS0ndqrBYBCCIADAdqendyRkZz2Z8TebzXC5XNR3fjxGzou73W5omoZyuQxFUWA0GuFyueBwOCZ8UzNyi5vT6UQ2m2Vd7mCCzmDsMVR3tG9PSpyMKWUyGYiiiLq6OgSDwWlLF5O57EQiAY/Hg2w2C5fLhbq6Ovj9fiiKgp6eHqiqCkmS6O70pqYm+P1+6s9OzFlGpsqvueYa/OpXvwKwRczvuusuXHTRRWO+J8QohVi5EgqFAk2Xt7e31/QhVCoVdHV10VLB0NAQAKCtrY0uINmad/2uBml+IxvfnE4nfD7fNpvequfFdV3H0NAQdF1HLBaDz+ebcjNm9RY3Auty3wITdAZjD4DsmPZ4PNvVdKWqKrLZLIrFIjRNQyQSmVZnOdIERzrEfT4fVq5cCV3XEQwGqbua0WiELMuQJIluRAuHw3Tum9S4qxvgiGnMnXfeSZ/vzjvvxIUXXjhmZEe654mvu8FgoJEqsWBtaGgY1VQ4PDwMRVHQ2NhITW0SiQT1ld+dokhSyiAjen6/f5tROSGXy1ErWzLGJknSqEzHZNna9r09HSboDMYsR5ZlamSyPdvTSLRKlocQ/+/pbOTKZrM0ovV6veB5nqalk8kkNRBRFAVz586F1WqF2WxGfX09eJ6HwWCg4jtSzG+55Rbccsst9LnuuOMOnHfeeWOuQCVRqdFopNcjAq8oCn2ekSJSKBSQzWbpjZMoilAUBU1NTbudPWm5XMbAwAAkSUIwGJywV4GqquB5Hn19fRBFkabarVYreJ6HKIrbda7xtu+xLncm6AzGrIY0wZlMpu1avkEMUVRVhclkop7s0wlJY5O94cAWUYlGo9B1HQMDAzTdGo1GEQ6HqZWrLMvU7Y7sQK9uYrvzzjtrvNlvv/12/Mu//MuYkaKqqjW70DmOo01xRqMRRqOR7k6vvpkpFApIJBLw+/10G5rRaERHRwcqlQrq6uqm9f2aSbLZLAYGBmA0GtHY2EhXy24NWZZRKpXoYhy/349KpVLzHk9HJD3W9r3d7WZppmCCzmDMYnK53Kg57MlAOpvL5TIAgOM4uFyuaY+GBEFAOp2mURcZ8SJbx8rlMpLJJDweD+rr69Ha2opsNouFCxfCZrOhUChQr/PqjnS/348HHnigxr715ptvxnnnnQe/3z+qjk1S/sD/+dqTMa3qrWEjPe+LxSIGBwfBcRyam5sxMDAARVHQ3t4OWZbh9/u3e7/4joBsiSP9Cw0NDdss0YiiiFKpBFEUYTQaqdWrz+ebsXlx1tE+NkzQGYxZSrFYpOIzlbGoaltPskRkJsScpLcTiQQAIBKJIJfLwWw2o62tDZs2bUJPTw+MRiMWLlyIjo4OrF27Fh6PB5FIBNlsFm63m5rOVIv57373O1x++eX0uW688UZccMEF8Hg8oxqrdF1HJpOpmQLIZrN0rzfHccjn86OWpBSLRfT09MBgMMBms0GWZey7774olUrIZDKIRCKYP3/+tGc0phtVVdHT04N8Po9oNIq6urptjo+RZThms3lU1z6LpHc8TNAZjGlgV1vnSH7YktrlZCH1Yl3X6XawkVan0wER0UQiAVmWUV9fj3K5DE3TMGfOHNrRTkbj6uvr0d3dDQCYP38+HVVyu910vIzMdj/99NNYsmQJfa5rr70W3/ve96jH+ljnkGWZinkmk4EkSfD7/TAajUin03A6nTWiVSgUaMe91+uFoigwm810YUtLSwvtxBcEYZcVM0EQaix7t3bzUS3kFotlq+52LJLesTBBZzC2k11tnaOqqsjlclToJku1rSd5PSM3ik0XuVwOqVQKPM/TWmu5XEZrayvMZjM++ugjZDIZLFq0CA0NDSgWizAajdhnn31gMBhgMBjg8/kgiiI1avH7/XjllVdw1llnQdM0AMAVV1yBH/7whwAwpljlcjlIkoRAIACO45BKpei6U5PJhGQyCbPZXHNDk8/nsWnTJiiKgmg0SrMgRMCNRiNKpRJsNhtEUdxl56Tz+Ty6u7thMpkwb968cc9YLeRWq3Va9pozphcm6AzGdrIrGV3ouo5sNkuFbrKQ5jebzQaTyYRSqTRjYs7zPLLZLNLpNK2tplIphMNhuFwufP755xgcHER9fT0WLlxIx598Ph9cLhdkWUY4HIaiKDWz4m+//TZOPfVUKIoCAFiyZAluuukmCIKAUCg0qpegUCjQ5i2O45BMJmEwGBAKhWAymag/fHUTXC6Xw7p166DrOpqamuB0OlEul+F2u+naWJPJBLPZTE1UnE4notHotL+PU4WM0w0NDcHj8aC1tXXM0owoiigUCkzIdwOYoDMY28muZHRBfvBOxQmO2HqSOeNisQiPx7Ndo27jIUkScrkc4vE4NE1DLBZDNpulbmobN27EwMAAvF4vOjo64HQ6EY/HwXEcHA4HjaZ1XUc6naaz4p9++ilOOOEE6sZ2xhln4Fe/+hV1nBs5dlUqlejGOaPRiFQqRZekcByHYrEIURRr+hAymQxWrVoFo9GIuXPnwuVy0fE4t9sNWZZRLpfR1NREn6evr4/uZN8VUFUVfX19yGaziEQiqK+vH3WjI8syCoUCzTztLotj9mSYoDMY28muYnRRqVTA8zy8Xu+kVleSqF4QBHi9XqiqOqNiTsxZEokEXVRC3N5CoRCGh4cxODgIo9GI9vZ2hMNhpFIp5PN52O12KIoCt9tN69pmsxnBYBBr167FMcccg2KxCAA4/vjj8eijj9IZfIfDUXOOSqVCDVPItSwWC50IEEWRvg9EyJLJJFauXAm73Y6FCxfCbrcjlUrBYrHQZkGz2QyHw4F8Pk+bCR0Ox7Ttm99eJElCd3c3KpUKmpuba9aQAluaFIvFIiqVCkwm025nhrMnwwSdwdhOdgWjC7LRy263T2odKhnTUhSFLjkhjnIzIebAlhnnVCqFdDqNWCwGXdchiiJCoRAqlQqGh4dRLBbR0dEBi8WCt956C4ODgzj//PMBbNlVPm/ePKiqivr6euy1117o7e3FUUcdRUfOvvKVr+Cpp56iteyR5QfSQOdwOGAymZDJZOjMusFgoI54NpsNLpcLuq5jcHAQq1evhs/nwz777AOLxYJUKkVnrkmESxbDGI1GOlOvquou0eVeKpXQ09MDXdfR0dFR83esaRpKpRJ4nqfGQSNvghi7NkzQGYztZGeP55AIeyzh2hpkXAwAFdOZFvNisYh8Po94PA6v10vr5mQ5B8/zGBoaQiQSwZw5c7Bs2TL88pe/rLnGZZddRn9/ww034LLLLsNRRx2FgYEBAMDixYvxX//1XzVmM9XpZNLBb7VaYTKZqM87ee9G9iHouo7u7m50dXUhGo1i7733BsdxSKfT0DQN4XC4prxBbvBEUUQgEIAkSXA6nTvVyYy8poGBAVitVrS0tNSkz0kjp67rE1q6wtg1YYLOYEwDO3M8p1AojClcW4PYuBI3NJ7naS15MhH+ZCDNVX19feA4DvX19bThzOPxwGw2o6urC3a7HXvvvTckScKZZ56Jjo4OrF+/HnfffTcA4J577kGhUMDcuXOxePFiHHvssejq6gIAzJs3D6+++iosFgsymcyo8gNxgSMd/CTlXl0eIZ3cwWAQuq5j/fr16O/vR2NjI+bPnw+O45DL5ejXjGwk29k3eCNRVRXJZBLDw8Nwu91obGyk74kkScjn87QsQEoZjN0TJugMxm6MIAiTrpuTsTTSSFbdGDZTYk5S2GS8r7OzkzrQNTY2wu/346OPPoIkSTj44INp5Nzc3Ix169Zh7ty59Frt7e2wWCwwmUy4+OKL8be//Q0A0NjYiNdeew2BQADJZHLUvDkpLxgMBlgsFjqnX93BT9ayer1e6LqONWvWIJlMorW1FW1tbdQ5rlwuw+/3j9vtvavMX8uyjHg8jlwuh2AwiLq6OhiNRmiaRm84yA75XaXGz5g6TNAZjN2U6nnziQox2QtONl4Vi8UZF3Ngy5hXMplENptFQ0MDJElCOp1GU1MTGhoasHLlSiQSCSxatAjBYBDpdBp2ux3lchk2mw2lUoley+fzIZVK4cEHH8Qbb7wBAAgEAnjttdfQ3NyMVCo1amyv2gWOzNaPLC1Uv5+6rmPt2rUoFotob29HQ0MDrYkXCgXqTLcrU6lUEI/HwfM8IpEILQ3wPI9CoUDfI1Ynnz0wQWcwdlMmO29OPMlJvbhQKOwQMS8Wi8jlchgYGIDP54PNZsPAwAAaGhrQ2tqKgYEBrF+/Hi0tLWhtbaXLZIhb29y5c2sEfXBwECtWrMD//M//ANgy9//KK69gwYIFKBaLkCRp1NgeSZETr/exXjN5P1VVRVdXF2RZRktLC6LRKEwmE2RZpo1yMzGXP50Ui0UMDw9DFEXEYjEEAgHaM0HS6x6PZ7fZyc6YGFMS9NWrV+P555/HX/7yF2zYsAHJZBIcxyEWi6GtrQ3HHXccTjjhBHR0dEz3eRkMBjCucI0HEW9SLyZ/9ng8MyrmxCGtu7ubWrImEglEo1G0t7eD53n8/e9/h9frxT777INCoUBr6ps3b4bFYoHP58O8efPoNVesWIGXX34ZAGAymfDss8/iC1/4Ah0zc7vdNalwYhxjMpkgSdKYYk7mrYlocxyHhoYGBINBWCyWmq1127PLe6Yhy3SGh4cBAA0NDfB4PDQTYzKZxjSG2dWsixlTw6Druj7RL/7rX/+K22+/Ha+++ip0XYfNZkNrayt8Ph9tvBgaGoIoijAYDDjmmGOwbNkyHHzwwTP5GqZEoVCA1+tFPp/f4fPCDMb2IEkSUqnUhB3ciGEMSTEXi8UZnTMnaJqG4eFhbNy4ETzPIxQK0fn8trY2WCwWvP3228hmszjiiCOoM10wGEQymUQ6nUYwGMSf//xn3HTTTejr66PXNhqNUFUVK1aswNlnnw1N05BMJqkpDIE43xkMBui6PqaYi6KIZDJJRd3pdMLpdMLv98PhcFDzGkVREA6Hd9mmMTLfT2xqo9EozGYzXXvrdrvhdDpHNU6OtC4mY5c7y7qYMXUmlG8pFAq44IIL8JWvfAWpVAp33XUXVq5ciVKphNWrV+O9997Dhx9+iE2bNqFQKODdd9/FL37xC2zYsAFf/OIXce655yKfz8/0a2EwZj3kh7bFYtmmmJNRJZ7nqV3qjhJzYEsKOx6Po1AowGq10gUmsVgMdrsdK1euRDKZxKJFi2C322nGQJZl2tT26quv4qKLLkJHRwdWrFiBDz/8ECtWrMChhx4Kg8FA69hkTWx1+YFkBzRNG1fMyU1HPB6nXeski0Fqy6QLPBAI7LJiXt3JbrPZUFdXR1PsHMdRO92xpiCqrYvJjQx57xi7FxOK0JuamrBgwQLceuutOOiggyb1BK+//jqWLVuG7u7umjvsnQ2L0Bm7I9lsFqIobjNSJGIuiiJ8Ph/sdvsOFfNisYihoSFs3LgRuq6jrq6Orl4Nh8MYGBjABx98gPb2duy99950Ltzn82H16tUQBAGRSARf/vKX0d7ejuXLl9eUFjRNw9KlS9Hd3Y3PP/8cpVKpxtFMlmWkUinIsgyTyTTuax4YGMDmzZvhdrtRV1cHVVVrZsZJhL8rN4+R10rWyHo8HgiCAE3TJlRS6e7uhizLNV/H8zzMZjNaW1tn+PSM6WRCEfqDDz6I1157bdJiDgBf/epX8c477+C+++6b9PcyGIz/o1wuo1KpUN/x8SAd3cTYhES/pL4802JOZtyJvWgoFILf74fL5YLP50OpVMLnn38On8+HvfbaC/l8HkajEX6/H/39/SgUCggGg1i1ahV6e3tx4YUXjuoT4DgOS5YsQXd3N/77v/8bTqeTirmqqvT1G43GcV9zPB5HV1cXnE4nmpuboWkabDYbFXMSpTqdzl1WzEVRRCKRQDabpXVvnudhMpkQiUQm1B9ht9shSVLNY5Ik7fJd/IzRTKgp7pvf/OZ2P9FJJ5203ddgMPZUVFVFPp+Hw+HY6g9aUu8lKWKr1Uq722dqa1o1mqYhlUqhu7sbuVwOsVgM9fX14DgOLpcLHMfhs88+g6qq2H///SGKIlRVRTgcRqlUQn9/P5xOJ0KhEHK5HACgs7NzzOcijyeTSZplIzcz5XIZJpNp3NecTCaxdu1auFwudHZ20oYx0vBG5uanauG7I5rMKpUKUqkUbXY0GAxQFGXSUwterxfJZBIbNmyAqqowGo0IBAI71dmOMTW2a2ZBEAS89tpreOihhzAwMEC3JzEYjOmFdF5v7YcsMU4htWCr1Upnjl0u1w4Ztcpms+jr66MrOdvb22E2m2EymeB0OrFu3ToMDw9jr732onPmXq8XBoMB69evh6qqaGlpgdvtpq+VuMCNhDw+Z84cWhvOZrN00YvH4xlVTtN1HclkEqtXr4bT6cRee+2FcrkMg8GAYDBIm+cymQwMBsOUOtpJkxlJ+adSKfT399MNcNMBz/NIJBLgeR4Wi4Wa5YTD4SlNLZDXXf0rY/djyoL+7LPPoqWlBcceeywuueQSrFu3Dh988AFaW1upRSODwdh+SqUSJEmqWQAykuolK2QsqVwuI5/Pj7I2nSl4nkdfXx+6u7vhcDioaJPFJENDQ+jq6kJTUxMaGxvpTLzdbkdPTw+y2Sza29vh8/kgyzKWL18Oo9GIhx56CJqmjXq9Dz/8MFpaWnDkkUcC2NIXQxq5iN3qyO8ZHh5GV1cXPV+lUoGmaXRdKrClwU5RFAQCgSnNac90kxmZMa9UKjAYDLT3IBgMwmSa/CQyOVdnZyfmzp1LMx+sKW73Y0qC/t577+H0009HMBjEz372M/p4LBZDc3Mzrr76arzwwgvTdkgGY0+F7KR2uVzj2owSMVdVFcFgEGazmTrCOZ3OHSLmsixj8+bN2LRpEywWC+bPnw+fz0e3jZXLZaxevRoul4sawJhMJrqcZdOmTaivr0d9fT10Xccll1yC1157Daqq4u2338aVV16Jzz77DDzP47PPPsOVV16Jt99+G3fffTeMRiPK5TJ1gvN4PKPMdhRFQTweR39/P8xmM+bOnQtZluledSKEpVIJlUplzN3pE4XYqVZjsVhQqVSmdL1qyIx5qVSinfuRSARut3vKUfVMnpexY5mSoN9yyy1obW3FJ598gqVLl4I0yu+333745JNPMG/ePBalMxjbCelUN5vN46bLxxLzSqVCN4jtiDqorutUzA0GA1paWlBXVwdBEGA2m8FxHNavXw9BELDXXntBVVWoqgq/349yuYz169fD4/Ggs7MTBoMBt956Kx555BEAW4TlJz/5Cbq6unDuuefikEMOwbnnnov169fjoYcewre//W2IoohUKkVNY8g+c4IkSYjH40ilUjAajWhpaaE3AT6fj4oZWR7jcrm2qyFspprMstkshoeHkc/nYTKZUFdXh0gkMu6N3kRhTXGzhykJ+vvvv4/vfve7cDgco+4KPR4PLrzwQqxevXpaDshg7KkUi0UqfGNFX9ViHgqFqK0p2fO9o/Zv9/b2YtOmTdB1HZFIBC0tLQC2NJa5XC4MDg4iHo+jra0NXq+XRsC6rqOrqwu6rmPu3Lkwm834wx/+gOuvv55e+/e//z1uvPFG/PGPf6SP/exnP8MLL7yAc845B4qiIJVK0Vn7kWIuCAISiQQVQVJjHunHXt0Et70Zjera//r162mtf6o3V6SmPzQ0hGw2C5fLhZaWlimXBMY6r9VqpZ4F29MMyNi5TMn6lYzDjAdJ+TEYjKkhiiI1WhmrLjpSzE0mExVzu92+w8Q8kUigq6sLmqbB5XKhqakJLpcL6XQaLpcL2WwWGzduhN/vR3t7OwqFApxOJ6xWK7q6ulAsFtHa2gqv14s33ngDS5Ysode+4447cPrpp0MQhBrhWrx4Mex2O30P8vk8/H5/TR0c2DLml0wmUS6X4XA4YDabqe2t3W6nWY/tbYIbC9JYpmkaOI7DJAw5R10nk8mgv78flUoF0WgUTU1NU6qVj8eutu6VMXWm9K9i3rx5ePPNN3HxxReP+fkXXnhh3FETBoOxdXRdRy6Xg8ViGXN+eiwxF0WRRlY7Ssyz2SzWrl0LYEtqPBaLIRaL0TKBLMs0cl+wYAGdj3a73ejt7UU+n0c0GkUoFMLatWtx8sknQ5ZlAMCll16Kq666CgCodSth3333hSiK6O7uBrAlKzjSaKdUKiGVStHmNFVVYbfbqWFK9XuUz+dpM+F0RLzkvHPmzKl5r/L5/KREknTkb968Gbquo7m5GbFYbEY60HeVda+M7WNK/3ovuOACPP3007j77rtRLBYBbBl7GB4exve//3288cYbOPfcc6f1oAzGngKxKx0rWhxZMycLR4jT2tY64aeTXC6H9evXAwCdMW9vb0elUqGzzENDQ8jlcmhvb6fe6z6fj65RdbvdCAaDKBQKOO6442hX9fHHH4/ly5fT11GpVKjQA1t+1kiShMHBQTidTkQikZqItVAoIJlM0vE9juPotjSDwVCTli+Xy3R0brr2gU9Hk5mmaUgkEli/fj04jsPcuXNRX1/PxskYW2VKEfrll1+Od999F1dddRWuvvpqGAwGnHjiiSiXy9B1Hd/4xjfwgx/8YJqPymDMfgRBoM1aI93gSPq1ugGO7BW3WCw7RMxJ9qC/vx+KooDjOKiqinnz5oHjOJRKJZjNZhSLRfT39yMUCqG+vh7FYpHuX08mkzTlbTKZcNxxx9Foe//998d//ud/1gi0yWSiJjPAFhEeGhpCMBgc1RSWy+WQyWSg6zrtXi+Xy+A4Dpqm0Z3gwJbOfGLWM51OcCQTUD0PTpbSTARN09Df34/NmzfD5XJh3rx5M+7ux5gdTEnQDQYD/vM//xPf/va38cQTT2D9+vXQNA1tbW049dRTcf7557M9uwzGJNE0Dfl8HlardZTAVG/8ImIuyzIymQzMZvOoZrCZgHTdZzIZlEolGI1G8DyPuXPn0sibuJX19fXBbDZj/vz5KJVKcDgckCSJirnZbIbD4cCSJUvw0UcfAQAaGxvx0ksv1YjX4OAgPv/8cwwMDNDHXnvtNdjtdthsNuRyOdjtdnq2bDYLAHQGPJ1OA0BNRoO812Qd6nQ3f3m9XhSLRbpEh2wvm8jzaJqGTZs2obe3F6FQCPPmzYPVap3W8zFmL5Nan7otRt6V7sqw5SyMXY3xFq+QyFySJLqfm3R3G43GUc1gMwE5Q6VSQSKRoHu3g8Eg9ttvP+oVDwDpdBoDAwOYP38+vTGx2+1IpVJQVRU2mw0mkwn33HMP7rjjDgCA2+3GX//6V+y77741z3vttdfi3/7t38Y917Jly7Bs2TJkMhmasvf7/fD5fBgeHoYoilS0q382kfdzptahTsX6VVVVdHV1YWBgAI2Njejo6JjW5jfG7GfK/1pefvll3HDDDXjhhRfQ2NgIAPjBD36A999/Hw8++CC+/OUvT9shGYzZjiAIdJxrpJhns1lqgGKxWKCqKl2LuSPFXJIkFItFcByHQqEAs9mMvfbaC4qioFgsQlEUqKqKeDyOcDhM58ydTiftC3A6ndB1HX/84x+pmHMchyeffHKUmIuiiNNPPx0nnHACLBYLBgcHkc/nUV9fT8sL0WiUdrpzHEfFPJfLQRAEGI1GOByOGjEvFosQBAHBYHDG1qFOtslMlmWsXbsWyWQS7e3taG5u3qGrWneE9zxj5pnST4K//OUvOOmkk9Db24tSqUQf32effZDJZHDUUUfh008/nfR1BUHAkiVL4PP5EIvFcNddd437tf/85z9x2GGHwW63Y5999sEbb7wxlZfCYOx0NE1DLpeDzWYblWrP5XJ0TJTsFE+lUjAYDNPWlb2ts6XTaUiSBFVVUalUIEkSRFHEwoULYbFY6Bk5jsPg4CBMJhPa29vB8zxdDqMoCpxOJwwGA95///2aHpv77rsPxx577JjvSXNzMw499FC0traivb0dX//61/G1r30NBxxwABYtWgSLxYJCoUAXihB3OjLDT8SJIIoi3Tq3q6SyBUHAypUrkUqlMGfOHGp8syOff6a95xk7hin9NLj11lsxb948rF+/HvPnz6ePX3nllVi1ahXa29uxbNmySV/36quvxieffILXX38dv/71r3HTTTfhmWeeGfV1+XweRx11FPbaay/885//xLe//W2cfPLJGB4ensrLYTB2KiRVPLLGmsvlUKlU4Pf7YbVaqbgC2CGRebU/PEmZk/O2trYiGAyiVCqB53kYDAbkcjmUSiV0dnbS1aWiKELTNFgsFpjNZqxfvx5LliyBoigAgKVLl+LSSy8d9dz5fB66rsPn8yGfzyORSMDj8SAajdL57lQqVSPmXq8XmqZRgxTio056C6rNY3bEopqJUCqVsGrVKhQKBcybNw+NjY07vP9opr3nGTuOKf3L+fzzz3HxxRePOVbj9/tx0UUX4eOPP57UNXmex8MPP4zly5dj8eLFOPnkk3HNNdfg/vvvH/W1jz/+OFwuFx588EHMmTMHN910Ezo7O/HJJ59M5eUwGDsNkmr3eDw1UVk+n0e5XIbf74fNZqPiShaJzHQEVz0e5/V6MTAwAIPBQE1c5syZA0VR6Ay3wWDA0NAQYrEYbDYbtXflOA4cx8FutyORSOD888+nQvHNb35zzCwceU+8Xi9EUcTg4CDsdjtisRgdf0ulUigWizCbzfD7/bQPJp/PI5fLweVyjbrpyWaz02oes73kcjmsXbsWlUoF8+bNQywW2ynNxMzLffYwpX89qqpuNR1jMBjA8/ykrvn5559DlmV86Utfoo8ddthh+PDDD0dtWnrzzTfxrW99q+aH2scff4zjjjtuUs/JYOxMSFf7yFR7sVgEz/Pwer20g5uMqxEjmZk+F2lgCwaDiMfjkGWZbvdauHAhOI5DLpdDsViE3W7HwMAArFYrGhsb6QYzk8kEg8EAo9EIWZaxZMkSbN68GcCWvQ9PPPHEqBuT6vKD0WjE4OAgAKC+vp72D4wn5pVKBclkEhaLZdT7VCgU6Ma6nT2Bo+s6UqkUurq6IMsyOjs7aeZhZ8C83GcPU/qXvWjRIvzHf/wHTZtVo6oq/t//+3/YZ599JnXNoaEhuvaREI1GIQgCTTMSNm3ahHA4jO9973uoq6vDIYccgnfffXer1yeLF6o/GIydSaFQgKZpNal2nudRLBbh8XhoA1kmk6EmKTMt5kQwdV1HKBSiDmeqqtJ0usPhoNvNrFYr8vk8isUi5syZg3K5DEVRYLFYYLVaoSgKXC4XrrzySnzwwQcAgLq6OvzXf/3XmLPVZN7c7XYjHo9DEATU19fTNaxEzC0WCwKBAE2da5qGeDwORVEQjUZrGroEQaA2utu7yGR7UVUVyWQSmzZtgqZpmDNnzk4Vc4B5uc8mpiTol19+OT7//HMcffTReP7557FmzRqsXbsWL7zwAo455hh8+umnuPLKKyd1zXK5PKpJhfxZFMWax0ulEv71X/8VsVgMf/rTn3D44Yfj6KOPRl9f37jXv/322+H1eulHU1PTpM7HYEwnoihShzISpVYqFbq/3OVy1XS4k9nzmYR0z+u6jmAwiEqlgng8DqPRSLvLY7EYFSVVVWE2mzEwMICmpiZwHAee52G32+HxeFAul+FyuXDnnXfiySefBLCl+/uFF14Y8/9fuVyGIAjwer20cz0ajcLr9dIxvVKpRB3xqm8IkskkCoUCotFozeOqqtKIf2ebs8iyjGQyiZ6eHhgMBnR0dCAcDu/UMwH/5+VOFvyEQiE0NjayLvfdkCnPod988834xS9+MSodDgDXXXcdfvGLX0zqek8//TSuuOIKxONx+tiaNWuw1157IZ1O1yyDmT9/PmKxWE1n+/7774/vfOc7NfvZqxFFsebGoFAooKmpic2hM3Y4uq5jeHgYJpMJwWAQwJYoMpPJ1GxJy2azEASBdrjPJCT6BYBQKARFUbB582aIogie58FxHPbbbz/aHDc4OIhwOEx9xufNm4dkMgm3241wOIxCoQBd1/H222/jtNNOo8tJnnzySZx22mljPv/w8DBdujIwMAC/34/6+npazy+VSjQyrx5D43keGzZsQCAQQGNjI412iRmPqqo1DnE7A1EUkU6nMTQ0BF3X0dbWRv/uGYzpYsr5u+uvvx7nnnsunnvuOWzevBmyLKOtrQ0nnXQS5s6dO+nrNTQ0IJVKQVEUmlaMx+Njbo6KxWI13fUAMHfu3K1G6FardZcZU2Hs2ZBUO/l3LUkSstksbDYbfYx0uO8MMQe2/N8TRRGqqkKWZSxcuBB2ux2CICAej8PtdtMU7cKFC5FKpWjtWhRFKIqCwcFBnHfeeVTMf/GLX4wp5uT1chwHo9GIgYEBOJ1O1NXVUTEvFouwWq2jxFxVVfT09MBqtY7yOi8Wi5AkaYeM922NSqWCTCaD4eFhGAwGOiHAYEw321WQa21txQ9/+MNpOciiRYtgNpvxwQcf4LDDDgMA/PWvf8VBBx006j/jIYccgrfeeqvmsbVr1+Kss86alrMwGDOFJEm04c1oNEJRFGQyGerFDmwRfOLnPtNpz+q5dtIVPjw8TCPsUqmExsZGBAIBGjkbDAbYbDZs2LABzc3NKJfL0DQNdXV11M+9Uqng5JNPpmuUzzjjDPz85z8f8ww8z0MURbjdbgwODsJoNKKhoQEAqJgbDAaasi6VStT4pK+vD5IkYf78+TUNdrtK3bxUKqFQKNAJBSbmjJlkQoL++uuvY++990YkEqF/nghf/epXJ3wQh8OB8847DxdffDEee+wxDAwM4M4778Rjjz0GYEvEQLp+L774Ytx333248cYbcc455+D3v/89Nm3ahHPOOWfCz8dg7Giq16I6nU5aszYajXReulgsUsGazoUhY6EoCtLpNBVzo9GIXC5HxYfU+MlsNBH6hoYGdHV1weVy0aa41tZWOBwOJJNJ6LqOf/mXf6EZs4MPPhiPPvromI1fqqqiUCjAZrMhnU5DlmW0trbCaDTWiDnJBpA946FQCF6vF5lMBi0tLTU3PrtK3Tyfz6NUKiGbzUJRFLS1tdWUDhmM6WZCNXSO47BixQoaAXMcN6GuTFVVJ3WYcrmMSy65BH/84x/h9Xpx9dVXU0cpg8GAxx57DOeffz4A4N1336VGNgsWLMDy5cvxla98ZcLPxbzcGTsaItaknlvdTU4WneTzebjd7hk3PhlLzMkWM57nIUkSFEVBZ2cnbZBbt24d/H4/SqUS4vE42trakM/n0dDQgEgkgnw+D57nce211+IPf/gDgC0LVz766CPEYrExz0HKbGRUrqGhAT6fj5rG2Gw28DyPTZs20aUuZEuazWbDggUL0NLSMuqaO7NuTm7cyuUyNW1paWlhYs6YcSYUoS9btqzGZ/mGG26YkTELh8OBxx9/HI8//vioz4287zj00EOnZC/LYOwMZFmmlqMk+tQ0jYo5+eHvcrl2ipiTzW08z0PTNKiqimg0ikAgAF3X0dvbC5PJRD3VGxoaqMlMOBymzXOPP/44FXO73Y4XXnhhXDEnNw7AltR6MBiE1+utEXMyBw/8n5OepmlYv349fD4f3SNBIPPmO6tuTsYMyfshiiKam5uZmDN2CBMW9GpuvPHGmTgLgzFryeVyMJlMcLlcyGazkGWZmp8IgoBcLgeHwzHj2aKxxJysEiULVGRZhsvlok1mJGpvamrCunXr4Ha7IcsybDYbmpub6et7++23cd1119Hn+t3vfofFixePew7iBZHNZuFyuRAKheg57HY7gsHgmGtkh4eHIUkS6urqaurmoiju1Lo5eR9FUUSlUgHP82hubmY1c8YOY7ua4orFIv785z9j8+bNsFqtaG5uxje+8Q3mMMRgVMHzPBXwfD5PN32ZzWaIoohsNjvmNMd0Q2r21WIObBFUsi1N13WYTCbU19fDarWiXC7T7WnxeBySJNElKx0dHdQxbu3atfje975HM2nXXXfduB3twJYbAFVVUS6XYTKZEI1GqW2r3W5HKBSiP0cikQgGBwexefNm2mAWCoXQ2tpKr0c83K1W606pm5P3VlEUSJKEUqmEpqYmJuaMHcqUBf2Pf/wjLrroIrpEAdhS5/Z4PPjtb3+71f/MDMZsY7z1k6Tpy+l0UjMZn88Hq9UKSZKo29qOEPPqbnYi5qSuT2xdDQYDfD4ffD4fNE1DT08PtWFNJBJUzFtaWmCxWCCKIgYGBnDBBRfQfegnnHDCVn0oyPMJggBJktDU1IRSqUQb2arFHNiSatd1HZs3b8bw8DBsNhva29trnMyy2SwA7BSf9moxJ46U9fX1dASQwdhRTEnQP/zwQ5x55pnweDy44YYbsPfee0NVVaxcuRIPPPAAzjnnHLS1teGggw6a7vMyGLscZP2kKIqwWCzUvrWxsRHlchkcx8FkMtGGN4fDQWvWxI98Jq0/xxNzIj5kvanZbIbJZEIsFoPBYMDg4CBEUUQsFkNXVxcMBgMsFgt1byONbJdeeik2bdoEAFi4cCF+//vfj1u/Jql2QRAgCAIikQidw7fb7QiHw6MyfMR61uFwIBaL0SUt+XwePp8PpVIJoijukA10Y70e0g9B9sLX1dXB7XYjkUiw/eKMHcqUBP3WW29FIBDAZ599hrq6Ovr4aaedhksvvRSLFi3CHXfcgaeffnraDspg7KpUr58EAKfTiWw2i3g8TkfU8vk8HA4H3G43FQGy9nNHiDmAGjEnq0QrlQpkWaa+6yTVXiwWkUqlEAwGkUgkUCwW4ff7EQwG6fhqoVDAsmXL8Pbbb9PrP/HEE1vNNpAVq5IkwefzwWAwIJPJwGazjSnmAJBIJFAulxEKhRAOh+H1ehGPxzE8PIxYLIZCoUBH6HYksizXiDmxqvV4PBgYGBjzBo+JOmMmmdLt7LvvvouLL764RswJdXV1+P73v4933nlnuw/HYOwOjLV+0mQyIZlM0g524gJH0rMcx814RDnSAY6IeXUnNll0QpbE+Hw+yLJMV5Zqmoa+vj44HA6EQiFEo1EYjUYIgoCHH34YjzzyCADAbDbj4YcfxsKFC8c9D0mrC4IAu90Ok8lExTwSiYzbe0OMdjweT80EAKmbWyyWHb7fXJIk6nuv6zoKhQK94SgUCmy/OGOnMKWfJjzPIxqNjvt50uDCYOwJjLV+MpPJwGQyQVVVmEwm+P1+amMKYIeIOXmuajEHtmQUZFlGoVCA0WiE2WyG0WhEXV0dDAYD7SJ3Op3YuHEjjEYjIpEIgsEgFfn//u//rtmbcPvtt+PrX//6VlPt6XQa5XIZZrMZFouFzpKPF5kDoJav5IaJ9CoAoKtlZ7pkMZJqMdc0DYVCgWYuOI5j+8UZO40p/URpa2vDX/7yl3E//5e//GWU2QODMVsZuX5yeHiY1nxJWh0ATc9Wp75nAnLjUG1aQyiXyyiXy+B5HoqiwO12o1KpoK6uDlarFblcDtlsFh6PB0NDQygUCohEIggEArQJbfXq1ViyZAlkWQYAXHTRRTjnnHNqPNZHkslkkM1mwXEc7Z63Wq2IRCLjOuIR8fb7/YjFYhgaGsKnn36K7u5u2s1eva1uR0CWrACg1rgej6fmfWb7xRk7iykJ+plnnonnnnsON910U80GM1EUceONN+L555/H6aefPm2HZDB2ZarXT5pMJphMJrqml0TimUwGiqLM+E5z0qhGVqBWix1xWCMmN16vl3bde71eVCoVpNNp2O12VCoV9Pb2IhwOIxqNwufzgeM4ZLNZnH322UgmkwCAI444Atdddx28Xu+4UXKxWEQikaAjcaIowmw2IxqNjivmiqIgl8tBlmWYTCbIsgyO46jRzeDgIDiO26EiKYoiMpkMgC1iTtbDkrWjBLZfnLGzmNL6VEEQcMQRR+Cjjz6Cw+FAe3s7AGDTpk0ol8tYvHgx3nnnnV36jpRZvzJmgmKxiP7+fjgcDhr1knp1MBicUcMTEpmrqkpvLqo/R2xWieCTBSZz5sxBMBik3uNmsxlr1qyBxWJBZ2cn/H4/vF4vVFXFaaedhmeffRbAlkzdK6+8glAoNO6IlqIo2LhxIwqFAk2Rk2718cRc13WkUikIgkC77Xt6euDz+Wh3fD6fxxe+8AXss88+0/9GjgERc/LjUpIkmM1mBAKBMX/OjTfGyGDMJFMKFWw2G9544w3ceeedePrpp7Fx40bouo6Ojg6ceuqpuPrqq3dpMWcwZgJFUZBIJMBxHMLhME1hk53mO0vMgf8zciHWqIIgUO/0YrGIeDwOh8MBp9OJ3t5e6LqO5ubmGve6W2+9lYq50+nEE088AY/Hs9XIc2hoCPl8HhaLBYqiwOVybVXMyVllWYbBYIDdbqejdcD/basjc/E7QtBHijkZ8SPLosbCZrMxAWfscKac+7Pb7bj++utx/fXXT+d5GAwAu2eEE4/HwfM82tra4HA4kM/nUS6X4ff7Z/TspGtdVdUxU/qlUgmCIFBLUrPZjM2bN9MRunw+j2w2i0gkAp7nkcvl0NLSApfLRUfLXnrpJdx00030mo8//jjdcladbq4mn88jHo9D13U6prYtMed5HpVKhS6A8nq9MJlMKJVKCAaDkGUZ0WiUesvPNCPFHACMRiNcLtdO3eTGYIzFtPyP0DRtzMd3xnIExu7P1oxadlVRz+fzSCaTiMVi8Hg8KBaLdO/5TGardF2nLmXETrYaSZKoZzppMNuwYQNKpRLcbjcEQUAymaSCb7fb6VIWt9sNi8WCrq4unHPOOfT/+bJly3DUUUeB5/lxx8UkSUJPTw9EUYTBYEAgEEBDQ8NWG+fIWclGNY/HA5PJRLMbn332GUwmE80kzPTCEyLm5HWTqQWHw8Hq4YxdkikprqIo+OlPf0rtH81m86iPnbEcgTE7qDZq2R3meGVZRk9PD9xuN6LRKL0BcbvdWxWw7YVE5rIsIxAIjBJzsiyE+K07HA7YbDYUCgWYTCaEQiHIsgyn04lMJoNUKgWHw4FAIEBNcIrFIk488UT63n/rW9/Cz372M/A8D5fLNW6HeU9PDz2b2+1Gc3PzVt8LMlNuMpmgaRrMZjONgEmU7nQ64fF44PF4aCPfTEHEnKyAtlqt0HUdFotlxm16GYypMmWnuH/7t3+Dx+PB4sWLWb2cMa3sTnO8ZLWoKIoIBAJYt24dRFGk9p8z+byZTAaSJI3bbEdSxeVyGZqmwe/3I5lMwufzwel0YmBggNbVFUWhnvJutxs+nw+6ruOcc87B2rVrAQALFizA73//e5RKJXAcN27KOZFIYHBwkC6haWtr2+aNTTabha7rMJvNKJfLNdE3ScE3NDTAaDTSj5mCeOzLsgyj0UitekmX/Y6ceWcwJsOUBP3xxx/HQQcdhNdee42lnhjTjt1uB8/zNSIgSdIuOY2QSCSQTCZhsVgwPDyMcrkMo9FIx8JmokSg6zqy2SwkSRq32Y40v2mahlKphLq6OpRKJRiNRrS1tWFgYAAcx6FYLNL0dl1dHbxeL9xuN8xmM2688Ua8+OKLAACfz4cXXngBVqsVpVJpXDOXcrmMzZs3I5PJIBKJYP78+du8sSkWixBFEV6vF4VCgT4/sCX7kUwm4XQ66apXMv4mCMI0vJu1ENMYSZJoVkBRFLq7npURGbsyUxL0wcFBXH311UzMGTOC1+tFsViktp6SJO2Sc7ykbm61WmEwGKhrmd/vRzabpU5o000ul6MlibH8y8k4msFgQC6Xo5vTeJ6no3RDQ0MwGo10JtzlcqGurg4ulwtutxsvvvgibYIzGAx44okn0NnZSW9exsrKqaqKDRs2oLe3F6H/z957h0lWlun/d+WcqzrH6Z4hDFlAZQmruxiRYFpBcVCyyuCyGHAFCbKgIAoIKzDAKIYVEXf5GlgMBHUVDOQwTOxYVV35VJ1QJ/7+6N/7UNVd3V3dMwMD836ui4vp7uqqU9Xd9bxPuu9kEvvvv/+SwZzJzzKBGzZwBrxycDFNE263m7zXAWBiYoKEbXYVTJudvSahUAiGYUDTtN2uH8Dh7ApWdNwcGBggq0QOZ1fTKNTicrmQTCb3uIE4SZKQy+Xg8/ng9XpJ0pT1V3dXi6BcLkOW5QUn5w3DQLlcBjA7Me7xeBAIBFAul6n3zJTh2GpYZ2cn+vr60NHRgVgshpdeegkf+9jH6D6vueYavOtd74IkSZTNz8WyLExMTGDTpk3w+/048MADl7QyZQYxXq8Xdru9ybAFmK0ysDU8ZnAjSRIZ3Sw0Xb8S5gZz9hzZa81ngjivB1YU0M8880zcfvvt9MbB4exqvF4vOjs7MTQ0hM7Ozj0qmDP5T8MwEIvFqCTbWIbeHVKfS63Bsb46c/9SVRWxWIx63olEgiRfNU2D2+3GyMgIkskkOjo6EA6HIYoiTjrpJDqwf/jDH8bnP/95MiDx+XwL9uuffvppWJaFgw46CKlUatHnwrJvm82GUCgEQRDg9/ubNNtFUSRZ1WAwCMuykMvlYFkWrdTtChp15pnKn8PhIFnXPel3j8NZjLZqSJdddlnTx4ZhIJvNYt9998V73/tedHV1zRtSsdlsTXurHM4bAV3XqX8dDAahqipJfZbL5d3WIhAEAaIoIhqNLupKxsrQ7LaGYaBWq6Gzs5M82RVFQSaToXK4x+NBOByG3+/HSSedhJdffhkAcMABB+Cuu+6CzWZDtVqFZVkts3NZlvH3v/8dgiDgiCOOaCqNL/Z8NE1DMplEtVqF3W6n+zZNE+VyGV6vF4FAAJqmQRRFmquoVqswTXOX2KUyE5tarQav14tYLAan04lCoYBAIMB3zTmvK9qSfl3JIIjNZqOVjz0RLv3KWS5MPrVer5NtptfrpfWv3SWEU61WachuoWlxWZZRKpUAgMr/wWAQ+XwePp8PXV1dKBaLpNduGAZcLhcMw0BPTw86Oztx1VVX4corrwQwOwT3t7/9DatWrYJhGJiZmaG1sUY0TcPf/vY3vPjiizjwwANx2GGHLfl+wa41EomQPnw8HqfXq1AoQNM0ci/LZrOYmpoi21av1wvDMNDb27uo6+NSMHvZarVKwdzj8SCfz8PlciGRSKz4vjmc14K2MvSHH354d18Hh7PHUyqVYBgG7HY7lYOZAYrD4dgtpdlarYZqtYpwOLxgMGdGJuzfNpsNwWAQ1WqVRF1qtRqV21VVhd/vp5J8NBrFL37xCwrmdrsdP/7xj8mjQRAEKo03YpomNm3ahJdffhnDw8M48MADlwzm7Fp9Ph98Ph9mZmaaZFJFUaQVQHZfsizP2+lninIrhUnlVioV+Hw+OlDkcjlaT+NwXm+0FdCPO+64lp83TbPpD3hiYgLd3d18GpTzhoOJ3bhcLmSzWXJS252/66IoQhCERWVGWd+cFdo0TUMwGISu65AkCclkEjabjbJ31gdn4i2xWAwTExM4/fTT6T6vvvpqvOMd7wAwOwsgy3LTsBpj69ateOGFF5BIJHDIIYcsWQJn1+pwOBCNRlGpVGBZFrUmdF2HIAgIBAJNh6NdvcbIgnmxWITf70cymYTX622ynOW75pzXIyteqvzOd76D3t5ebNu2jT532WWXoaOjA//1X/+1Sy6Ow9kTYP7hrITtdrvR0dGxS6es5yLLMiqVSssydyPMyMSyLNTrdXi9XuqVBwIBhEIh5HI5yswdDgdsNhs0TUMqlYLdbsfJJ59MQ3Af+MAH8IUvfIHun0mxztVfn5ycxAsvvACv14sDDzywrXkBZhATj8ehaRokSUI4HIbD4aAhOYfDMe/57ko7UiaVy2xiU6kUfD4fvY7xePxV9VfncHYlKwroP/nJT/CpT31qXlnqXe96F/r7+/HRj34Uv/nNb3bJBXI4ryWqqlJwZMps/f39u2QgayEURUGpVFpSM5yVnS3Loozb6/XSDnosFkO5XEatViOPc+ZH7nA4MDk5iRNPPBGbNm0CAOy///7YuHEjZaeyLLfMhAuFAp577jlyWOzp6Vkyo5UkiTJ9h8NBA4Qs665Wq9B1vaVgza5aY2QVArZu2NnZCZ/Ph2q1StfG19M4r2dW5If+1re+FXa7HQ8//PC8PwBN03DMMcfA5/Pt0b13PhTHWQrDMJDL5Wh4bHJyEkNDQ7u1v8o0xNmQ1kIwRTPDMEjUhv0tFgoF0nafnJxEIpGAIAio1+s0QV4ul3HffffhRz/6EYBZO9Tf/e53OPLIIwHMBr+ZmRny/GYIgoC//vWvkGUZPT09GB0dXVI8RtM00olnokG1Wg2pVIoOGIVCAeFweLdOlReLRaTTaQQCAXR3d8Pj8dCAXigU2q1SvRzOq8GKMvQXX3wRp59+esvTrMvlwumnn46nn356py+Ow3mtYNmczWaDy+VCOp1GIpHYrcGcaYgzTfWFYEYmpmnCZrPBZrPBbrdTqd3v98Pn82FqaooCJNNDZ0H9z3/+MwVzADj//PObyuqiKMIwjKbDriRJeOqpp6DrOjo6OtDR0bFkEGQGMU6nE+FwGLquo1arIRgMkhFLuVyGx+PZrcG8XC5jenoaPp+PgrmqqjSgx4M5543AigK60+mkIZtWsGlaDuf1Srlchq7r8Hq9SKfT8Pl86O3t3W2Px5TK3G73gjrpc68NAA3lsVI7AITDYdJqTyaTyOfzcDqdkCQJqqrikUcewY033kj3d+yxxyIQCOAPf/gD0uk0TNNEtVpFIBCg+1cUBc899xxM00Q8HkcwGER3d/eSz6tcLsOyLDI1KZfLTfKubDBudzqYCYKAyclJ+Hw+9PX1wePxwDAMFIvFJnU/Duf1zopGdI844ghs2LAB69evn7dKI0kS7rrrLhxxxBG75AI5nFcb1lP1+/0UcHp6enbbRDtTKmPl7cWCea1Wo7650+mk/+u6DlmWEYlESOt9ZGQE2WwWNpsNuq7DbrfjZz/7WVMwB4DHHnsMjz32GAAgk8ngX//1X5vW1FRVxUsvvQRRFJFIJGAYBoaGhpZcUavValAUhQbN2IGCTZHLskzSqrtrEK1arWJ8fBwejwf9/f1wu91N1RfunsZ5I7Gid6jPfe5zOP7443HEEUfgnHPOwT777AObzYZNmzbhjjvuwJYtW3DTTTft6mvlcHY7iqKgWq2SFrumaYjFYkuWg8vlMiYnJ1EqlRCLxdDX19dW5qfrOvL5PBwOx5LBpV6vQxAEmKYJp9MJl8sFVVXhcrmo765pGkqlEgYHByFJEiRJgmVZUBQFvb29pALXyAUXXIBIJIIDDjgARx11FERRJNEXVVWxdetWlEoldHd3Q5Ik9PT0LClrq6oqrdwxIZhGeVemOc/20XcHkiRhx44d8Hg8GBoaoq2EUqkEXddpyp/DeaOwooD+9re/HXfddRfWr1+Piy66iN6ELMtCIBDAbbfdRnusHM7rBSbr6nA4oGkaDMOA1+tFJBJZsgT+17/+FaIowufzoVgsIpPJ4PDDD180qDPZUaazvlhwYUYmhmHA4XDA5/NBkiT4fD7UajWYpgmHw4FcLodUKgWv14sdO3aQRWo4HMbGjRvxq1/9CsBsiZ7Zj+67775IJpN485vfDL/fD8MwyAN8cnISuVwO/f39UBQFgUBgSXU21uN3u92U5QuCAADUky+VSrDb7bvNQU9RFGzbtg0ulwvDw8MUzAVBoKoB18vgvNFY8W/0unXr8KEPfQgPPfQQtm3bBk3TMDw8jHe84x28J8V53cGGt9i/nU4nbDYb3G73kutRk5OTEEUR/f399LmJiQlMTk4u+LfAxE0ALBnMgVeySrvdDp/PR5k5K7WzPW0WcFkPnWXozz//fJMd6tlnn42bb74ZADA0NARgNgiysr+u65ienkYmkyEJVl3XMTo6umSJulQqkZWszWaDoihUWrfb7ajValR63x0Zcr1ex+bNm+FwODAyMkLBXJIkbrjCeUOzU0dUv9+Pk08+eRddCofz2lEqlchOlJWzdV1vK4MslUrzysY+n2/BwVEWzE3TRDKZXLJ/zLJKy7LIe51VD5jyGpN5HRgYQKlUgiRJpBZnWRbOP/98UpM7++yzccIJJ1BAj8fjZHqSTCbhdDqRTqeRzWYRCoUQi8UwNTXV1u53rVZDvV4nSVzLslCpVODxeODz+aBpGqrVKoLB4G7Z+VZVFZs3b4bdbsfq1aspmDM9Ab/fzw1XOG9YeAOJs9cjCAJkWaaydSQSgSRJCAaDbQ1rxWKxebriLCOdCxvIMgyjLelYRVFQq9XITCUYDEKSJHi9XtomYUF7YGCA+uwOhwOiKMLpdOIzn/kMHS7e/e534/zzz286qCSTSZK19fv9yGaz1JPv7u5GLpdDMBhER0fHotfKHjsUCpHwDnNGi0ajpAbndDp3y5qYpmnYvHkzADQF88aJ9t1V4udw9gR4E4mzVyPLMqmUeb1eJBIJVCoVOJ3OtjO5vr4+ZDIZTExMkCJbIBBAX19f0+1YMNc0DYlEYknpWDY4pmkarVdVKhWqHkiShHq9DpvNhlQqBbfbjVwuB5vNBkEQYBgGvvWtb+HZZ58FMBvkbrjhBqRSKUxNTdHjsANGV1cXKpUK+ZR3dHTQYWJwcHDRa2V9c4/HQ8Fa0zQqcTscDlQqFRiGgVQqtcsny3Vdx+bNm2GaJtasWUPZ/2s10a4oym5z3+NwFoIHdM5eC5sIr9fr8Pl8SCQS0DSNSsbtvvlHo1EcfvjhNOXe09PTcsqd+ajH4/Ely82Nwd/hcCAUCpEojNvtRrFYhCiKFKji8TiKxSLq9TrJrP7mN7/B/fffDwAIBoO46667kEwm59mCer1e+P1+2O12VCoVALNVB5fLhenpaQwMDCwpdcsqAI1ViXK5DJfLhUAggHq9TtPzKxlGWyxA6rqOLVu2wDAMjI6ONl3razHRrigKJicnUa/X4Xa7IYoiqtXqiuRqOZzlwAM6Z49kd2c4bAiOqZax8jcrNS9Xqz0ajS46DFoul2m6up37Zu5uAGjVq1AowO/3QxRF2o+Px+NIJBLUu2bf+9JLL+Gaa66h+/vOd76DVatW0TU2vpZerxc2m41K94FAALFYDDt27CCL2MWoVqt0CGJBUxRFaJqGZDIJy7JIDW4hC9jFWCxAOp1ObN++HaqqYmRkpGmW4bWaaGc/O3a4CQQCKJVKqFQqPKBzdiu75chqGAa2bNmyO+6asxfA3sDz+TzpgE9OTtKa1c7CerlsD5plzKzfu6v7rJVKBZIkIRaLtfWGztzdDMOA2+0msRi32w1N05DL5eg62bWyHn4ul0M2m8WXv/xlGIYBAPjCF76At7/97QiFQi0DW7lcpmqE0+lEPB6nx+jv719yN75arTb1zdnOeSAQgNvt3mk1uMYAyQ4b9Xod+XweY2NjkGUZq1atajosyLL8mk20y7I8rwLDdA04nN3JigK6w+Fo0oGey3e/+1286U1vWvFFcfZuFnoDZ+XgnUUQBOTzeXg8HvLCbtQY35WqZdVqlUrN7Qio6LqOSqUCXdfhdrsRj8fpoOF0OpHP51Gv1xEIBMgnne14C4KASqWCq666Cvl8HgDwjne8A//6r//aJLc6F5fLBbvdTqtmhmGgUqmgt7d30WoC241v7JsDsz8/u92OUChEanCRSGTFr2urAGmz2bB9+3ZIkoTBwcGm56ZpGh3WXouJdrZW2IiqqrtNQIfDYbRVh5qamsJvf/tb+tiyLDz22GPQNG3ebU3TxA9+8AOYprnrrpKzV7E7MxxZlpHNZuFwOMgLG8CyB+HagZWGw+FwW6Vm1jdXVRVOpxORSASmaUKSJPj9fqoqBINBys7ZIYdVMr7zne/gmWeeATC7X37HHXfAMAySW2U0/u0+++yzOPLIIxGLxeD3+7F161aEw+EljWjY8Fxj31xRFCiKglgsRitrO6sG5/P5IIoivYaqqmJ6ehpOpxO9vb1NFZU9QaOdOcoxcR1VVVfs387hLIe2AnoymcSll16KyclJALOn49tvvx233377vNuyXdePfvSju/AyOXsTc9/AAbT05V4umqZhenoahmGgu7ub7l+WZdTr9V06BS1JEiqVCmXR7VAul8kVjUmm5nI5uN1uSJKETCZD8wSBQACapkHXdTgcDmQyGfz85z/H//zP/wCY7Yvfd999tIrWeEC67777cOGFF9LH69atQ19fH6677jqyT+3t7V30tRAEYZ44DAvgXq8XPp8PhUIBNpttpwNZY4AEZvXmNU3Dvvvu23SYYAciAEsa3OxOmH87mwEJh8N8yp3zqtBWQPd4PLj//vvx1FNPwbIsnHPOOTjzzDPxlre8Zd5tHQ4HOjs7cfzxx+/yi+XsHeyODMc0TUxNTUGSJAwMDFCJ2LIsCIIAr9e7y95wFUVBuVyG3+9v+xAiiiJEUQQwe6AJh8OoVCpUap+enqZ+OhvaYwN8mUwGTzzxBAnFAMAdd9yB4eFhaJrWVA6/77778OEPfxjHHnssvv71r2P16tXYvHkz7rjjDpx22mm4/vrrsW7dukVL7Ww3PhwONx0UmM58JBJpEpjZ2elyFiBnZmYwPT0Nj8eD0dFR9PT0NAVt5kLXjljP7mZX/j5xOO1is1hKvQw+8YlP4LzzzsOb3/zm3XFNrwqCIFDJcmczP86uZ1dPuU9NTZEmeePUtiAIEEURHR0duyQI1Ot1CrSthGVaoaoq8vk8VFWF1+tFKpWCpmkoFovw+XyYmJiALMtIJBK0Xlcul+F0OqFpGv74xz/iU5/6FHK5HABg/fr1uPbaa1EqlRCPx5vWu1atWoVVq1bhpptuagq0pmli/fr12LZtG7Zu3brgjrxhGFQ1aCzJs2E9NoSWy+UQCAR22d9WvV5HoVBAtVpFJBJBKpVq+nnVajUIgoBYLMZ71Zy9lhUdne++++7XdTDn7Pl4vV50dnZiaGgInZ2dOxXM8/k8ZmZm0NXV1RTMdV2HKIq7bBBOVVUUi0V4PJ62+7dMkIUptbFSMZtqn5mZgSzLiMfjcLlcCIfDkCQJwOxcwbZt23DllVdSMD/66KPx9a9/nXrX7HWzLAu/+MUvMDExgbPPPnte1my323HWWWdhYmICf/zjH1teK9sOsNls855f4845M7jZVWpwiqKgWCxClmWEQiGSlW38OlOo48Gcszez4uXM5557Dj/5yU8wPT1N+6+N2Gw2fPe7392pi+NwdhZBEDAxMYFEIjHPJYxNY++KQTiWUTcG5XYolUqQZZmG4JjJCvBK1sl6+4FAAHa7HYqiIBKJYHp6Gtdddx0pwfX09OAnP/kJDQ+yFgXrLTN1uNWrV7e8Fvb5dDrd8uvVarWlqUqtVoOmaUilUqS6N3cIb6UoikIHHq/XSwcbBnPI83q9u0VOlsN5PbGigP7rX/8aJ5xwQsspdwYP6JzXGlmWsX37doRCoXn71Iqi7LJBOF3XUSgU2vI0b4SttAGg4TnmTMaEb9hhw+/3IxAIoFwuIxAIQFEU3HnnnTQE53K5cN999yEWi6FQKCAajdIqGpuc7+3tBQBs3rwZBx988LzrYTro3d3d877G+uaRSKSpb24YBqrVKgKBACzLot76UrK27SDLMkqlEkzTpKn1xkoNe40cDkfb7Q0O543MigL65ZdfDp/Ph9tuuw1vectbeJmLs8ehaRr1goeHh5uCbKMD2M4OLjFPc2ZnOj4+3lbPn5WJDcNAIBBANBqFaZo02FWpVOB2u+F2u8kwplqtwul0wuv14qc//Sm+9a1v0f3dfPPNeMtb3oKZmRl4PB74/f6mYB4OhzE0NITe3l5s2LABN95447we+p133omhoSEcc8wx855juVyG1+udt37XuHPOeuu7ouIhSRLK5TJdYzAYnPfYLNjvDm14Duf1yIoC+tNPP43Pfe5zOOOMM3bx5XA4O49pmti6dSssy8Lo6Oi8/nitVtslinDMBpXtXler1ba0u1mAVBQFfr+fsvpSqUT3xUrsmqYhFotB13UyNnn++edx0UUXUavrk5/8JM4555wmpTvW71ZVFdFoFNlsFpZl4dJLL8X555+PCy+8EGeeeSZNud9555149NFHcd999zW9Xo3mJnP75uxa4/E4Tbgnk8mdek0BkLQtM6Hxer3zhuuY+NDcfjqHszezooDu8XjQ09Ozq6+Fw9lpTNPE2NgY6vU6Vq9ePU+ghinCBQKBndL3tiyLPM2dTid0XW9Lu5sFSEmS4PF4EIvF4HQ6IcsyBEFAvV6HYRgIBoOQZZnKzOVymWxdzzrrLGSzWQDAEUccgVtuuYWeF3M2Y33nWCyGWq2GarUKv9+PE088EfF4HP/2b/+G008/na5raGgI9913H97//vc3Xa8gCNQTn5vRNz4/SZIQjUZ3OriyYO71eqFpGpxO57xyOpPGZTMHHA5nlhVNub/zne/Ez3/+8119LRzOTmFZFqanp1GpVDA4OAi/3z/vNoIgUIl4Zx6nUCiQp7mmaW0r21UqFYiiSGV0r9dLZXtZlmFZFvx+PzRNg9frRSQSoT15n8+Hiy66CH/9618BAKlUCj/96U8p4LMp83K5TMGcDZU5HA74fD7EYjGcdNJJTX+/v/zlL7Fly5Z5wVyWZYii2LInzqoBwWCQyvGtXu/lUKvVUKlUEAgESId+7kyCqqqoVCo0U8DhcF6hrRRl27ZtTR+fffbZOPHEE3HOOefg9NNPR1dXV8uT+apVq3bNVXI4S2BZFmZmZpDP59Hd3d1ybaxRlnSlPVdWym70NG9X2U6SpKayODtUlEollEol+Hw+uFwuGIYBwzDQ0dEBWZap3L1x40bceeedAGYFnO6991709/fTlHkymSS1uXg8TgNrhmHQAYKtwjVqjR977LHz/n51XSc99LmBU1VVypCr1SoA7LTMarVaJZMXpoA3VyCmUdaVy6hyOPNpK6CPjo7OewO0LAsbNmygN5i52Gw26Lq+81fI4bRBsVjEzMwMEokEOjo65n2dKcJ5PJ6dGuJk2W+jp3k7ynbMMKReryMUClEZWRRFpNNpUn/TdZ1EZGw2G+r1OpLJJJ599ll85jOfofu77rrr8I//+I/QdR3VahXBYBCiKFIwB2arAYZhQNM0dHV1IRwOo1wuLymmxA4tDoejZaBm/W0A9FrsjBqcIAjULjBNk/ryjVWBxl7+rpTo5XDeSLQV0D/+8Y/zPyDOHkupVEImk0EwGER3d3fL39VarQZd15c0HFkMplwXi8WaerdLaXcz8RiWxbMAqOs6duzYAafTSQNw9XodPp8PoVAIlUqFHMtOPvlkKuGfeuqp+OxnP0vXZLfbYRgGXZvT6UQul4Pdbqd5gXg8DlmWSWFusZYDc3trtUvOqgGxWIxW6HZmU4C1ICKRCGw2Gyk4zr3PRlnXnZWS5XDeqLQV0Ddu3LibL4PDaaZd6ddKpYJ8Pg+v14vu7u6Wg26GYZA16koH4ZhEbDQaXXaGXy6XUavVSA6WZZ7j4+PQdR3d3d2o1+vQdR2WZSGZTKJWq8HtdiMQCOCEE07Ajh07AAAHHnggNmzYAJvNBkmSUK/X4XA4mg4auVwOTqcTgiDAsiz09fXRdbDJ8MZAnc1m0dPTA6/XC1mWacBtbt+clfD9fj/NAeyMtGu5XG4apisUCggEAvNK/LVajZ7frthv53DeqKx8zJfD2U0oioLJyUnU6/VF18AEQUCxWITdbkcqlVowU2zclV4JtVqNSsKtBr8URcGWLVtQLBapXx2PxzE6Ogpd18mvPBwO02Egk8mgXC6jv7+fesaSJKGzsxOGYZA3+Ve/+lX86le/AjDbp/7v//5v+P1+mKZJjmdutxuxWAxerxeFQoEcDyuVCoaGhuB2u1EoFEjm1uv1Ns3FsGn9rq4uCtitnid7He12OynGrbRyxxTyotEo3G43+dPP7Y1zWVcOp31WFNDnCnXMxWazwePxoKurC0cddRT+7d/+jSs5cdqG7RgvtgbGJqJN00Q0Gl0wU6zX6zs1CCdJEgWUhQRTstkstm7dShk22ylnwjVspY1doyAISKfT6OjogGVZFMxZsK3VaojH43jwwQdx+eWXA5j9m/rRj35Eg6aVSgWCIMDv91PVoFwuQ9M0RCIRbNmyBdFoFPF4nA5EbDBOFMUmuWY2Db9jxw50dHS0HDiTZRmKoiAYDKJWqyEUCs2b7G8H1p9nPxOPx4N8Pg+73T7vPYLLunI4y2NFzaiRkRFUKhXs2LED+XwekUiETvc7duzA1NQUSqUS/vznP+M//uM/8KY3vYl8ijmcpZBledE1MLarrOs6gsHggodFpgjndrtXlN2xnnMgEFg0oExMTGBmZoZ20k3TRDqdxgsvvECGIuxAoSgKxsfHEQwGaaK7Xq/DZrMhkUhQn31iYgIf/ehHKdu+4oor8K53vQvAbNaazWapEuD3+1Gr1SBJEiKRCDKZDGw2G/r7+0l1jr1WbL997uvLSu2tBs7YzrnH44GiKHC5XCtSg2PBnA3Seb1eUnuba7PKZF1b7aFzOJzWrCig/+u//isqlQr+4z/+A/l8Hk8++ST+7//+DzMzM7j99tthWRbuueceiKKI//qv/8LMzAyuuuqqXX3tnDcoPp+vaa0KmF2V8vl8kCSJpreZWcdCQ1KiKELX9RWtONXrdVrbWur72cAdK6mHQiEIgoB8Pt80BKeqKiYnJ2Gz2dDd3Q1RFKGqKmRZRkdHBxRFgdPphM1mw8knn4xKpQIAOOGEE/DlL38ZwGxQnJiYoN673++nsnQwGKSKQm9vL5xOJ2XDLJNv9fpKkoRarYaOjo6WMwbVapUqD4ZhrKjawabUG4N5pVKBqqqIx+Pz1uZYoOcT7RxO+6wooF9++eU47bTT8MUvfrHppG+z2XDWWWfh9NNPx5e//GXYbDZ8+MMfxllnnYUHHnhgl100541No+uYKIpUvna73SiXy7Asi9zJFvPtZqYhyx2kWq4NajAYhMvlgiAIkGUZMzMzVPpmg1y6rmNmZgaKoqC3txeSJJF9azgcpkn1aDSKM888Ey+88AKAWS2H73//+xTUJicnUavVMDAwQAI0rCztdDqRzWbpcavVKiRJIitTl8uFdDqNbdu2NfXQH330UUxPTyOdTs9zWmM75263G4qiIBwOL3uwkEnkqqqKRCIBj8fTVFGYWy1obLlwWVcOp31WFNCfe+45HHXUUQt+/fDDD8fTTz9NHx900EELWjJyOHNha2DJZBIulwvJZBLJZBKyLMPhcMButyMQCCyqTCYIAmw227J7r5qmoVAo0KBZO9lhf38/KbqxllM4HMa+++4Lv98PwzCQz+chCAINkmma1iQawyxRv/GNb+C+++4DMOuw9rOf/YwqBPl8HrlcDr29vbSzzcrSwWAQMzMzsNvt6OrqgqZpJGLj9/upRH7bbbfhqKOOwkc+8hG6/vXr1+NjH/sYjjrqKNx22230ecuyUC6X4XA4oGkaPB7PstXZWDDXdR2JRIIOBqyiMPdnuJCsK2sz7NixA9lsFoqiLOs6OJy9gRUNxXV0dOBvf/vbgl//29/+1pTZ5PN53gfjLAuv10sDcPV6HcViEW63G7quw+VyLbouVa/XaYJ6OTvLzAbV6XQuq9QbiUTg9/tpTcxmsyGZTKK3t5eCriiKCIVCtF/OhvV6e3tpNe+xxx7Dl770JbrfW2+9FQcddBCA2ax1enqahHNYCduyLESjUdKHZ9P+rErAqgzsuZx77rk48cQTYVkWstksdF1HV1cXZd2N1qmsZcGy5OWqwZmmiXw+Tz1yVqlgFYW5P0Mm6zp3da3drQcOZ29nRQH9lFNOwbe//W2sXbsWn/nMZ+jNwLIs3HXXXbj77rtx1llnAQB27NiB22+/HUccccSuu2rOXgMrf7vdbhoQWyxzbhyEW462ONNTt9vt8/a0l6JeryMajUKSJEiShL6+PvT09NBBhA2SsQlzthfPLFPZDvapp55Kz5G1roDZakM2m4Xf7ydP80qlQvKzzFc9FAohGo1Sb5pl7o0th+7ubnR3dyOfz5MVazQanbfnzxToWCugVZ+7ndeT7dWzYUF2YJp7wG+UdV3IWa0d8xsOZ2/GZrF3kGUgCAKOPfZYPPPMMwiFQhgeHobH48GWLVtQLpex//7749FHH6UhIZvNhsceewxvectbdsdzWBFMkWopGUzOawcrfzudTrhcLoiiiGQyuei6VK1WgyAISKVSbffOWSbJgs9y+7abNm3Cc889R+tcrMwfDofR398P0zTh8XjoObBht87OTqiqCq/Xi2OPPRbPPfccAODII4/Eb3/7WwSDQQiCQOtoHR0dCIVC9ByZrSobEmycPdA0DT6fr6VXuCAIePbZZ6kSwaRqGzPeQqFAq22NA3XtwCodAOj1ZIY2uq4jlUrNs2hlmXwqlZpXVdmxYwc0TWvK2kVRhMvlwtDQUNvXxeG80VlRDz0cDuPxxx/H17/+deyzzz7Yvn07nnnmGfT19eGqq67CE088gXg8jkqlgrPPPnuPC+acPR8WFBwOBymTtRqgamQlg3Asa1xpMAdmJ7Knp6dhs9kow56eniY1NfYcJEmCLMtQVRWpVIp03c877zwK5j09PdiwYQMF81qtBsuyaA++sf9st9vJHIX1t1lwd7lcTaX2xtdobGwMwGzvPxAIIBaLoV6v00FDlmXU63VYlkW76+2i6zry+Ty1HdjrySoKrTJ9Juu60MbCYlsPHA7nFVYsiuzxeHDxxRfjiSeeIInOp59+Gl/60pfoDy2RSODWW29tO5grioIzzzwT0WgU3d3d+MY3vrHk9+zYsQPBYBCPPPLISp8KZw+DBQUWTCqVSkvXr7ksdxCO9aGZDepKgjmzJxVFEYVCAYIg4OWXX6byMfM2Z6ttTDTGMAz4fD7ccsstuPfeewHMBq5rr70Wa9eupWDOqhPRaLSp/8zKzky5ja3KGYYBu92OYDDY8vDD1tiSyWTT59meP9s5NwwDNpttWStqmqbRz60xmLOJdqYK10i1Wl1S1nWhrQfuuMbhNNNWD900zXmiD+2wXBOFz33uc/jrX/+K3/3udxgbG8O6deswODiID37wgwt+z/nnnw9RFJf1OJw9l8ZediwWoynupUq+bJ+73UE4FsyZ7ehKNN51Xcfzzz+Pl156CeVyGV/72tcAAF/5yldgs9nw4osvIhaLwe/3kwSs2+2m6e0//elPuOSSS+j+LrzwQpxyyikkNcsc1AKBABmusNeiUCjAZrPBZrPBbrfDNE0qkbtcrpaHGiYV29XVRXK0ja9fOByGIAjQNA02m23BQ0ErVFVFoVCAy+VqyrQbKwpzM2pFUcgydbFe+FLmNxwOZ5a23sVcLhfuuecenHbaabPf9P+LXyzGcu1TRVHEhg0b8Ktf/QqHHXYYDjvsMDz//PP49re/vWBA/8EPfkAlR87rH7bexVTTmLTrUprhbL1qOYNwpVKJ9qJXYvjBSvV33XUXbr311qavXXHFFfTvSy65BJ/5zGdo77yrqwumaaJcLjcpwX3gAx/AJz7xCZimiVqthkgkAkVRKPtmE+3xeBzVahW6riMQCJDGPPs7YGtwc18vRVHotk6nE/V6fZ7dK5OdNQxjSXW8Rhq3EBq3AxabaGf780yIZykatx44HE5r2groxx57LDo7O5s+3tXqTU8//TQ0TWvabz/66KNx9dVXz6sQALNDO5///Ofx0EMP4YADDtil18J59WEBEpht1UiSRL7YS2XPLFimUqm2HouVnRs9zZdLuVxGsVjEJz7xCbzvfe/D+Pg4zj33XADA7bffjnq9joGBAQwODkLTNNRqNcRiMfpd/tCHPoRyuQxgdgju3HPPRSqVomDOvNATiQRlzYlEAvV6neYJarUaPB4PJEmi62qVVeu6jnK5DK/XS/voczNedihg9q3tltpZy8Hj8TR9z2IT7Y3788tdheNwOAvTVkB/+OGHmz7+wQ9+QOszu4p0Oj1vgrmzsxOKoqBQKMx7s77ooouwbt06rF27dpdeB+fVp3HKPJFI0MrUUqVYYDarFwSh7UG4Rk/zlWZ81WqV3MGGh4ehaVrTY/f39yORSKCvr4+eG1O683g8OOecc/D8888DAIaGhvDpT38aa9asgSzLiEQi8Pl8mJmZgc/ng6ZpkCSJgmWlUiGxGtM0SY7VZrORIlwjTD/dbrc3Bc+5GS+zh3U6nW2rwcmyTFl2Y1WgcUd+7j7/Yl/jcDg7x4qG4t761reSC9SuQpKkJmUoAPRxozMUAPzmN7/BH/7wB1x66aVt33+9XocgCE3/cV57WCbHxEeYU1m7DlvLGYTbGU9zhqIoyOVyAIBUKgWn0wlRFMlzHJjdk1+1ahUsyyKxmUgkAqfTiVtvvRX3338/gNltkfXr12P16tU0+MYm1YHZ33/Wf/Z4PJTVBgIBWttiZXnmOjc3QDJjllgstuBsgaZpNFDXyo+8FWw4ze/3z8vmF5toX+xrHA5n51hRQJ+ZmWl6A9sVeL3eeYG7cQ+WIcsyzj33XNx6663LelO+5pprEIlE6L/+/v5dc+GcFdNqyrxYLFIfeCnYIBzTQl8MNmjGVN1Wgq7ryOVyUBQFqVQKgUCABvh6enrodixrl2W56fr++Mc/4rLLLgMw2+v+7Gc/i6GhIfT29iIajZLRiizLFNhZ/7lUKlFWyw6jmqbB4XDANM2WpXYmdBONRhetXlQqFRq+a0fRkVnXBoPBeT8nURQX1GhfbNqdw+HsPCsK6Mcddxz+53/+ByvQpFmQ3t5e5PP5pkG6TCZD5TzGE088gW3btuEDH/gA2UECwLvf/W6cd955C97/JZdcgkqlQv9NTEzssmvnLJ9GoRE2mLbUPvLc7293EE4URfI0X64WeePj5fN5VCoVJJNJhMPhpp5/49+Coiikpc6GzdLpNNatW0e3Of/88zE8PIzVq1cjmUzC7/fTypjb7YYkSdR/Zr3tWCxGdqtMYhZAy1K7pmkko7rYwZcJ3bAe+FKvO6tuhUKheYNubJe9lUb7YtPuHA5n17Ai6df3ve99+NKXvoTVq1fjH//xH9HZ2TmvfGaz2ZqmfZfikEMOgcvlwp///GccffTRAIA//OEPOOKII5reZI488khs3ry56XtXr16NDRs24Pjjj1/w/j0ez7ySPue1gQVzNujFFNSW2kduhOmMLzUIx+xWmf/4SikWi8jn84hGo4jH4yiVSjAMg/atS6US3VZVVSiKAsuyEA6HoWkaTj31VJpEf9/73ofDDjsMPT09GBkZoQDHyt4AKBuv1+s0T+B2uzEzMwNd1+F0OuF0OqGq6rwtADZ0tpTmPZNbZYeqpWYKWCYfDofn+aGziXaPxzPvMRebdudwOLuOFQX09evXA5gtoTXaMDay3IDu9/uxbt06nHfeebj77rsxNTWF66+/HnfffTeA2WydDQyNjo7O+/7e3l50dHSs4NlwXk0a97+Z+1ajKUc72Vu7inCKoqBcLsPv9+9UIKlWq5iZmUEgEEAqlWqaOnc6najVak3uX4888ggOOuggxONxuFwufPKTn8TLL78MADjggAPwoQ99CDabDUceeSQ933q9DkmSYFkWzROwKgSbJ6hWq1BVFTabDR6PB6qqtiy1s/L8UpPq5XIZgiAgkUgsKtLCroPt+c/NvtkBgmkHzP3aQtPuHA5n17KigD536n1XccMNN+D888/H2972NkQiEVxxxRV4//vfD2DWVOLuu+/GGWecsVsem7P7YcGc7X+73W7KEt1ud9tBt51BOLZnPbdls1yYbafD4UBnZyfJorKVN03T8OMf/7jp8Hr22Wejp6cHV155JTZt2oRf/epXAIB4PI5///d/R7lcxjve8Q66LhYw2bQ883nP5/M0nc4OMZqmIRgMkqnL3NeAleeXUr6TZRn5fB4+n29RMxo2Jc+ec6ssvlQqkV5AYzWNT7RzOK8uKzJneSPAzVleXeYGBo/HQ6V3wzBamnK0ol6vo1AotMwUG29TLBbn7UYvF13XMTk5CVEU0d/fD8uyIIoiYrEYfD4fLMvCxo0bceaZZ+K4447DWWedhdWrV2Pz5s3YsGEDHn30UeqtOxwO3HHHHdB1Hfvttx+1lYDZUnaxWITD4UA0GqUhODZ853Q6USwWUSgUqIohy/K8NU9FUVAsFluWxBsxTROTk5OoVqsYHBxc8LYs82ZT6a1aVqwMn0gk5n2dZfXs8MbhcHYvbQ3F3XTTTdTbWwmaprWly855Y9IqmAOg0nU7w1jsfpayRm20W92ZYG6aJmZmZlCr1dDV1QWbzUaCLqxMXi6X8ZWvfAXHHXccbrzxRhx88MHw+/04+OCDceONN+KYY46hLPnyyy+Hz+dDMpnE4Ycf3nS9TDs9GAwiHA7TPEE0GiVVt3K5DLvdjkAgAEVR5pXaG/vUiwVzdt3lchnJZHLRYN44tNgqmEuSRK/J3K/ziXYO59WnrYC+ceNGHHDAAfjxj3+8rMAuyzLuuusu7Lvvvvj+97+/4ovkvH5ZKJizYBAOh9t+w2eDcAv1ezVNo2GwnS3xFgoFFAoFCmbVahXhcJim5Ov1On77299iYmICZ5111rwDid1ux9lnnw3DMPBP//RPeOtb3wrLsnD44YdT2ZqVpNk6XSwWowDPpsHZbRRFQTQahaqq80rt7DYOh2PJPnW9Xkcmk0EgEJhn0MJgErxsnbDVz6dx7mHu5gCfaOdwXhvaCuh/+ctfcNppp2HdunXo7+/HZz/7WfziF7/A5ORk0+0sy8LY2Bh++MMf4qyzzkJ3dzc+/elP47TTTsMTTzyxW54AZ8+lMZjHYjEK5mylyu/3t71GxnrIwWCw5SBco93qzgbzSqWCbDaLcDhMLmaNK5JMi71YLAKY3bJoBfv82972NuTzeaxatapJv0EQBOTzeYTDYcTjcSpxN06K12o1FAoFUm9jFY3G51cul2EYxpLP27IsZDIZmKaJnp6elj125nTH7GRbvdaLzT0wjXY+0c7hvPq0NRTncDhw6aWX4mMf+xiuv/563HHHHbj55psBgP6oDcNAuVyGZVmwLAs+nw9nnHEGLrnkkl0uQsPZ85kbzFlW2qjjvRz7y0qlQkYlc2HB3G63I5FILNvlrxFJkjA9PU165oIgzJuSr1QqsCwLg4ODAIDNmzfj4IMPnndfbL3S5XIhGAzigAMOoICraRqmp6fh8XjQ0dEBu91OxjQsyzYMA9lsllTk2P53Y5Ct1WqQZbktzftyuYxSqYTe3t6WmbOmaU2vY6uAz6oBraxVWaDnE+0czmvDiobiSqUSHnzwQTz88MPYvHkzcrkc7HY7uru7MTw8jHe/+914xzvesUeX2/hQ3O6DTW0rijJPM53tn6dSqbalP9mwFxtGa6TRoW3ulPVyUVUV4+Pj0DQNXV1dUBQFXq+3KTgx/XL2u3PkkUdidHQUN9100zyL4fXr12PLli345je/iSOOOAJDQ0P0+uzYsQO1Wg0jIyPw+/00QNaYFWezWWQyGQwODtK6WuPOORsQZL33xdA0DZs2bYLf78fw8PC8TJ4NEs61P51LsVhEvV6nYT0GE95h0+5c1pXDefVZ0dpaLBbDqaeeilNPPXVXXw/ndc5CmTkwe4hqZ6Vq7v0xJbO5wXyuQ9vOBHPDMDA9PQ1FUcgUyO12N628sSqUz+eDqqqo1+u44IILcMkll2D9+vXzptwfe+wxfOELX8DAwECT1HA+n0epVMLQ0BD8fj/JpTaK6siyjEwmQ2V0JmLDArFhGAsKubRicnISlmWht7e3pbUqs1JdrGxfrVYXdMArlUrQdX23BXNFUchYx+fzcT90DqcFyw7ozOwhkUjsjuvhvI5ZLJjLskx+3MtR7KvVajBNc155fq5D284EEcuykM1mIQgCUqkUDMNoOVjHXMvcbjdKpRLK5TKOOuoofPGLX8R1112HRx99lG7b09ODiy++GMcccwz2228/uj5JkjA1NYVEIoF4PN5SVMeyLIyPj8PpdCKZTKJUKiEcDlOwn1v2XopisUgHiLmvvSRJdEhpZe7CkGWZBgPnBlJBECjQr8RbfikURcHk5CTq9TrcbjdEUUS1WkVfXx8P6hxOA22nNL/+9a9x8MEHIx6Po6OjA6Ojo/je9763O6+N8zpisWCuaRoFjaVWqhrRdR21Wg3BYLApI5zr0NaO1ediFAoFknUF0HKwjqm0Md9w5gkQCARw3333NXkQ3HTTTfjP//xPHH744dhnn30ogzYMA9u3b4fb7UZ/f/+Cw2XZbBaSJKG/vx/VahVut7vpdVuO5r2qqpicnEQsFkM8Hm/6Wq1WQ7lcJlOWhYL5Yj8/SZLooLa7gmulUqHfK3atTDeew+G8QlvvhH/605/w3ve+F4ZhYO3atXA4HHjxxRfxiU98Aoqi4Jxzztnd18nZg1ksmDcOwS1XsY0NwjUGkbkObTsbzAVBQDqdpkODw+GYV75XVZX01CVJQrVaJZGXL37xi/O8BY444ghMTU1hcHCQBucsy8LExAR0Xcc+++wDm82GQqEAm83WdHhQFAWZTAbJZBKWZdH0OmO5mvfj4+Ow2+3z3AWZIEwoFFpUcY8dOthgXiNsPz4QCCzroLZcZFmetzrndrshy/Jue0wO5/VIWxn6ddddh1gshr/+9a945pln8OSTT2LTpk048MADceWVV+7ua+TswSwWzIFXdMWXu0rGJFYby8CtTF12BlmWMTExAbfbDbfbDafTOS+Ys+fndrths9lQrVaRy+XgcDjw3e9+F7/+9a8BoKn0zfTj16xZQweOfD6PcrlMZWLWumrMsi3Lwvbt2+FyuZBMJmlPn91Ho5tZOwOnuVwOgiCgr6+P7oM9HyYIs1gwZ4cn9vwaf36LmbHsatjMQiOqqu7RQ7cczmtBWwH98ccfx2c+8xkceuih9LnBwUFcffXVSKfTCxq0cN7YLBXM2RBcLBZbVo+b2Yj6fD7q+c41ddnZYK5pGsbHx2nF0uVytezFVyoVmKZJ/uSFQgGKouBPf/oTbrnlFgCA0+kkEyFgNiseGBigjLZarSKbzVLZmw3BzfUpT6fTUBQFAwMDEAQBHo+H9vSXOwRXr9epV9+oGc9Ealj5ejEaS/uNrwtreTAzlt2t0c6U6NhBhL0Oy1l75HD2BtqqV+bzeQwMDMz7/CGHHALLspBOp7Fq1apdfnGcPZdGo5VWOt8rHYIDZgMgsx5lj1UqlZpMXXYGwzAwMTGBer1OtqStgrksy5AkCZFIBNVqlQbh0uk0LrnkErrdN7/5TXR3d9PHoig2+ZZnMhl4PB50d3fPU4Jr/J6ZmRl0dHRA13VYljUvELc7BMfW4pxOJ2lANEq5xuNxGgRcaGqc7bfPLe03Gq7s7Jpgu3i9XvT19dGUezgc5lPuHE4L2grozAVqLuwPql6v79qr4uzRLBXMVzoEx76XlYMdDsc86didDeaWZWF6eppEWpi++txevGEYVCXQdR2CIJC2+4UXXkhDcGeeeSaGh4fx0EMP0ffW63U89thj2LFjB/r6+hAIBNDb2wuHw4FcLjcvy9Z1HRMTE/B6vYhGo6hUKk1VDZYpt2tgw4bqRkdH4XA4YBgGDREmk0kYhrHo1DiTbmWvTyOlUgmapr3qu+Zer5cHcA5nCXZuooiz17FUMN+ZIThgNni5XC4qB5fL5XnSsTvDzMwM8vk8lbMXGqwrlUrkO57L5TA9PY16vY7Pf/7z1Fd+5zvfiZ6eHpxwwglN39uYvX/605/GpZdeimAwSENwjVk2y5RVVcXg4CCq1Sp8Ph8F0mq12rYSHDA7dZ7JZJBKpRAKhUj9jYnSMOc29poCQCAQQKlUQqVSgcPhINvZuf313b2exuFwdg4e0DltM3corVW2vNIhOGC2zMuyP3ZfLJjtiuysVCphenqaDhsLBSa2ohaPx1EsFpHJZKAoCq655hq8/PLLAID99tsPP/7xjyGKIuLxOF588UWkUin09/cjEAhgbGwMXq8X//iP/4hYLLZgls004VOpFHRdh81mo96woig0Xd/O8zcMA2NjY/B4POjp6SH1t7nDfgtNjYuiCAAtD2OiKJKJDM+UOZw9k7YD+u9///umXVtg9g0YAB566KF5Ri0A8PGPf3wnL4+zp8AybyYq1CqYr0QJjsHMVwKBANxuN0mhthq2Wwm1Wg3j4+MwTRPxeHyelzijcUWN9bUFQcDdd9+N3//+9wCAeDyO//f//h8ikQhM00RXVxdEUcTatWuRTCZRKBTQ39+P1atXY/Xq1ajX6y0V1mRZRj6fh9/vh8/ngyRJFHgb7VAXm0RvJJ1Oo16v02OWy+WW6m8+nw+iKDYNxdXrddjtdvj9/nm3ZyptwWCwbTMdDofz6tOWlrvdbl8w27Isa97X2Od2xkN9d8O13NuHDVSx3e9WWW2jxvlK3vTZBHsqlYIgCCSFuitWkxRFwZYtWyBJErq7u9HR0dGyfG+aJq2keb1eTE5OYmxsDL/85S9x0003AZg1Wvn1r3+N4447DoqiYNOmTdixYwe1CQRBgKqqiEQiWLNmDVKpFEql0rx9b13XkU6nIYoiOjo6UK/X4ff76ZDA/BEa5V4XQxAEbNu2DZ2dnQiHw9T/b6X+Nld5TVVVOnD09vY2HXRUVUWhUJinac/hcPY82srQv/KVr+zu6+DsZlaqhc0kVpkqW6tgzobglmOHOvfa2CpVtVqlla5dEcx1XceOHTtQrVbR09OzYDAHQG6BwWAQmUwGExMT+Mtf/kLraQBw22234bjjjoNpmkin08hkMujp6cGaNWtQLBYxMzNDr0MymaThwFb+5Wz4T9d1OBwOhMNhGgJcTtuCqcEx+ViWTS90UPV6vUgmk5icnEQmkyGluq6urqZgruv6gqIyHA5nz4MH9L2AlWphs+lotqLUaihrpXaojEbzFVVVIYoiotEo/H7/su+r1bXt2LED+Xwe3d3d6OzsXDCYi6JIh4pyuYxt27bh+eefx9e+9jWqNH3+85/HJz7xCQCzFYXx8XG43W6MjIzA4/HA4/FgdHQU9XodgUAA1Wq1ZT+6XC6jWq3C7/eTx3kqlYLNZkOlUqH1vHbaFqZpYnp6GoZhIBKJ0JrdYgcrRVHIoS4ajSKfz5NwTuP9FotF2O32nfaX53A4rw58KG4voFELG2ieal4ooDOPcQALToI37iSv9E1fEASYpgmbzbZLgzmTWp2amkJXVxd6e3sXfK6apkEQBAQCAdTrdWzduhWbN2/G17/+dZoTOfnkk3HNNdcAmA3+4+PjqNfrGB0dRSAQIKc2URTh9XoXNHgRRRGiKMJut8Pj8UDTNDJeYV+LRqNtr+cVi0WqAtjt9rYqG+z3IRgMolgsoqOjgz7v9Xpp+NE0zbZX5TgczmsPD+h7AcvVwmbB3GazLZopVioVmnhfyU4y2zkHZrPGSCRCwXxn7TLT6TTGxsaQSCQwMDCw4PeyErfD4YDL5cKLL76ILVu24KabbkI6nQYAHHroobjnnntoWC2dTiOfzyOZTKKzsxOZTAYzMzOkvS7LMgRBwAEHHND0uqiqCkEQYBgGPB4PTNMk45VGWdd2DzSiKCKdTsMwDIRCobZFd2RZhtPpRLlcpgqCJEn0+7C7rVA5HM7ugR+99wKWo4WtaRry+TwNZC30hs7kSyORyIrFXsrlMhRFAYCmMjFrEeTzebqeyclJuu1S5PN5bNmyBaFQCCMjI4tmrJVKhcrVW7duxUsvvYSNGzfihRdeAAD09vbi//2//4dgMAjLspDP5zE1NQWv14uhoSEya5EkCWNjY9i8eTNl640HJtM0USqVYJomnE4n2CxqLBZrmmhvd0BT0zRMT0+jUqkgkUigo6Oj7Z+D1+tFLpcjNTqbzUa/D+xnwnfNOZzXHzxD3wtolC5lU82ttLDZRHMrk5JGWDYZCARWXB6v1WooFovwer3zer4raREwyuUyXnjhBXi9Xuyzzz6LBvNGadfJyUk8//zzeOCBB/DII4/Q4/785z9Hb28vgNn99ImJCaiqitWrV8M0Tei6DkVR8Pe//x3VapVK6YIgUAYPgIK5zWaDaZpUHmeua0wXvR2Y2t3k5CR6enrQ39+/7Eya/WwVRaHfB5vNRtsFu0LEh8PhvLrwgL4X0I4WNhMhabW33EijSchKzTEMw8D09DQN280d4JJlGbIsI5vNolKpIBKJIBwOL2mXKYoinn32WbhcLhxwwAGLHjZ0Xafec7lcxt///nf84Q9/wL333gtgNuD9+Mc/xiGHHAJg9vVhGXFnZyf8fj+Jz/zpT3/C+Pg4urq6EAgE4PF4yKDloIMOov18p9NJlRKfzwev19vUq253BmF6eho7duxAMpkkedd2qdVqME0T++23H1RVpd8Hp9OJer2OcDjMXcw4nNcpPKDvJSymha0oCgXpxdyz2BDccrLJVkxMTECWZYyMjLScxq7X6/jLX/6Cer0Om80Gy7Lg8Xjw9re/fcH7VBQFTz31FADgwAMPXDSYN/bNNU3D3/72Nzz33HO47bbb6Dbf/OY38d73vhfAbLl8ZmYG6XQafr8fiUQCuq4jEonAZrNhZmYGwOxBxG63o16vw+FwQBAEMqnx+XyQZRm6rtNMQLlcXvYMQjabxdjYGMLhMEZGRpYVzBs12hvX6JiGQDAY3K2+5hwOZ/fCe+h7OZIkUel7KStMNizV6OG9XLLZLIrFIvr6+hYMHvl8HjMzMzBNEy6XiwJqPp9veXtN0/DUU09BVVUcfPDBSwYlQRCgaRpM08RTTz2Fbdu24YYbbiAlxAsvvBDr169vet7T09MAQBPhzC2N7YzbbDZ6XCaqxAbPvF4vNE2Dqqpwu92IxWIQRRGyLLc90W5ZFnK5HCYnJ+HxeDA0NLSsdoemaS012pminM/n4wJLHM7rHJ6h78XUajVa11qqfN5ozNGOSUgrmPVoR0cHEonEgrfL5/NIpVKIx+PkslYsFlsGdMMw8Pe//x2iKOJNb3rTkkGJZcyGYWB8fBzT09P42te+RutpJ510Er7xjW/Q7UVRxPT0NERRJGEdFvxYX7+7u5s04plbmd1uh9vthtPphMPhoP56KBQimdtWbmatYDvhmUwGLpcLqVRqWe0OwzBaGuaoqkptFi4cw+G8/uEBfS9FEATUarV55ddWNHqbr1RXXRAETE9PIxwOo6enZ9HbsgGtxrI+awk0YlkWnnzySVSrVRx66KFLBiW2jseeTzqdxrXXXotMJgMAOPzww/GDH/yAytiapmFmZgbFYhEejwc+nw+BQACxWIx02J1OJ4aHh1Gv1zE1NYVcLodQKIT+/n5EIhGEQiHk83kq0Xs8HhQKhZZuZq1g4j7FYhEOhwPBYBCxWKztCglrkwBomo1oVIHjwjEczhsDHtD3QsrlcluKYsBsFsdkXVfaX61UKigUCnC73ejq6loyGA0PD2NqagrT09OU8brdbgwPD9NtTNPEM888g0KhgEMPPXTRjB+YDWwzMzNkWDIzM4NvfOMb2LRpEwBgcHAQDzzwAL0eTFwlk8nANE2Ew2GEw2HE43GYpolsNgtN09Df3w+n0wm73U4B27IsGnRjK23s4LQcKVVmfSpJEt3vcg9VrXbK2SGBq8BxOG8seA99L4Jla0wrfalgzkq1LpdrxRPtlUoFtVqNMu52+r6Dg4M45JBDEIvFYFkWYrEYDjnkEAwODtLzeO655zAzM4ODDjqI+tqLkcvlMDMzg0AggEwmg5tuugmPP/44ACAajeKXv/wluru7m647nU5DURTKypPJJOx2OzmwdXZ2IhQK0bCZ3W5HMBiEqqrQdR2iKEIQBNoIqFQqbQdRJs/KBgKB2TW65fS5WZskFovRTjkz2gGw6Goih8N5/cEz9L0E1ofVNK0tf3EW/G0224qzOFYJsNvt8Hq9bfdpvV4v1q5di76+vnlKcZZl4fnnn0cmk8H+++/fFIQXolAoYHJyEtFoFKVSCRs3bsQvf/lLALOKef/93/+N/fffn24vyzJmZmZQrVYBzJaqOzo64HQ6UalUkM1mqccPzAZO9prmcjkMDw/DMAxMTU0hFAqRxrppmnQoWAw228CkYTVNoz53uwFYkqR5bRIWzC3LWrG6H4fD2XPhAX0vgGXazP60nanqxlLtSrI4Fsz9fj+V95cTQFqt2VmWhU2bNmF6ehpr1qxBX1/fkvfDTFSi0Sg0TcOPf/xj3H333fT1jRs34rjjjqOPdV1HPp9HLpeDoijo7u4mS1FVVTExMYFgMIju7u6mQ47T6YTT6URfXx/C4TBefvll6LqOcDgM0zRpPW2xgUJmVCNJEoLBIHRdh67rcDqdCAaDbYu9sMn1xjYJO6AZhrGg0Q6Hw3l9w/+q3+A0mqy0+0ZerVZ3Sv6zVCrRSlatVoPb7V6RrWojlmVh8+bNGB8fx+joKIaGhpa8falUwuTkJMLhMOx2O/7nf/6naYL9mmuuwamnntr0PcwCtVarIRKJYGBgAD6fD6ZpYtu2bQBmWwKNh5xUKoUXX3wRuq7D7/cjnU6jXC7j0EMPhcvlotdysYMUk4ZVVRXRaBSmaUKWZSq5t1tqZzKyjcI/7Hm1c6jgcDivX/hf9hsYtpZkt9vbLrHKsoxqtbqiiXYWRFnfVtM0GIZBpenl0GjO4vF4UCwWMTU1heHhYaxatWrR72VqdrlcjjLbX/3qV7jiiivICvXTn/40vvCFLzR9nyAIyOVyKJVKNL3OgiITw1mzZs28Q45lWbDb7bAsC4qiYGZmBtFoFKlUikxnFnst2cQ585y3LAvlchkA4HA4SCJ2KVhJnQn/MFEedlBY6lDB4XBe3/CA/gaFqb+xtSRVVZHP5xd1L9uZiXYWONjeuMPhQKlUIlnR5V478293Op146aWXkMlkcNhhh2F0dHTR79U0DcViEaIowufzweFw4PHHH8cXv/hFSJIEADjllFNw4403NgVJNoSWz+dRr9ex//77kw57oVBAoVBAf3//vEpDtVqFIAjo6+uDYRgYGxujnrskSejs7Fy0OlGv11EqlcgMx2azIZfL0bWFQqG2hWeYlW1jm6RcLtPPhOuzczhvbPiI6xsQpv7m8XiQSCSgquqS7mUsS3S73cueaGfBpDFwsMPESkrtzJyFibeUy2UkEokl9c5ZUDYMA263GzabDVu3bsWFF15IbYejjjqqadcceGWNK5vNolwuY2BggCbqRVHExMQE4vE4UqlU0+OxaoZhGCRAUyqVoGkaBdLFSuWSJKFQKMDlctFaWalUAjCrNud2u9vaVQdAMrLsMMU+J8syN1vhcPYSeEB/g1GtVlEulxEIBGg6vdG9jK1gMcc04JUJ+MZSbbuwfW1W0vV4PKTE1m6peC5ME316ehrj4+Po7OzEmjVrUK/XF/we5t7mcrlgt9upIvGpT30Kk5OTAIB99tkHDzzwQJM6G6ssZLNZ5HI5dHR0YM2aNXQfY2Nj8Hq9GBgYaHo8Vs3w+XywLAvbt2+nXXubzYZsNrvoMKEgCE0/J7vdDkEQoKoqHA4HWZu2A9OMj8VilM2zocRYLLZiMSAOh/P6gpfc3yA0TkiHw+Gmkrksy/PKtm63m4aumLXncifaG1fh2PS8pmkka7pSP22Xy4XNmzejUqkglUphdHQUgiC0DHCs3yzLMkKhEFRVpaz5M5/5DF588UUAQE9PDx566KF5AjSCICCfz2N6ehp+vx9r166Fx+OBruuYnJyEaZoYHh5uel0aVdai0ShkWYYoirSex/b2Wx1A2PBbvV5vEvZh9+HxeFCv1xGNRttqVbRaT2O/B9FolDuncTh7ETygvwFoLHnHYrF5b+I+nw+iKDaVv1VVRTgcRqVSoex6Ob1uNoDF1qBcLhcdDlwu14pV5VRVRa1WQzabRTAYRFdXV5M4y9xrYAeKWCxGE/02mw0XX3wx/vznPwOY9YN/8MEH52XZiqKgUChgbGwMlmVh7dq1CIfDMAwDmUwGkiSht7e36fVsrGawCoiiKDS85vF40NHR0fIQNXf4jZXBmZUrOxB5vd62BHjYelogEKDXu1KpQBRFRKPRFXvVczic1yc8oL/Ombtj3qpXGolEUK1WUSqVaJ/a4/HA4XBQJrecHivrObOsnh0EarUadF1flrd3I/V6HZlMBtlsFvvttx86Ozub7EYbS8ds+A2YVTxjcqwA8NWvfhW/+MUvAMzqwj/wwAM48MADmx6LBf/x8XHIsoy1a9eiq6uLWgjlchnJZLKpKsAOTkzW1W63Q1EU6LpO2XoymSTp10YFu7nDb+w1YweExp5+u7KwbE6CHXQEQYAoiohEIjyYczh7ITygv45pDGqL7Zh7vV709fXRGlg4HKaSeygUWtab/0J77TtbalcUBdlsFpOTk4jFYhgcHCT/8LnIsoxyuQyXy0XysBMTE6jX69i4cSO+973vAQDsdjt+9KMf4dhjj236flZJGB8fR6lUwuDgIAYHB2Gz2VAsFlEsFhEOh2nqnDHXv9w0TYyNjcHtdmP//fen3rfD4UB/fz9NyYuiiEqlQn7zjeX7crkM0zSpitKOHGuje1qjWh3bnd/ZnX8Oh/P6hAf01ylsLY29qS+1Y96ovKaq6rIcvxiNJe3GvfadLbVLkoSZmRmk02mEw2EMDg7SxLnb7UatVkO1WkVfXx+V5P1+P2WmY2NjEEURv/rVr3D99dfT/X7nO9/BKaecMu/xKpUKJicnkcvlkEwmsXr1arjdbrJD9Xg88w5I7DDUuMudTqeRzWYpeMuy3LQW6PF4aDgtGAzOm3hnAj7hcBjVarUtNbhW7mk8mHM4HIAH9NclLOPzer3LnkqfO9DVLkykxuFwzMsi2RDaSkrt1WoVxWIR2WwWoVAIwWAQjz/+ODKZDD7+8Y8DAP77v/8biqLg6aefxqpVq7BmzRoKXFNTUyiVSvjb3/6GL33pS3S/V199Nc4+++x5jydJEjKZDDKZDHw+H/bZZx+EQiEKigDm9Z9rtRqVstmhSBAEbN26laxSvV5vU8BmbQnW358716AoCgVxSZLgdDqXPFzNlW91OBw8mHM4HIIH9NcZbOipVca3FK0GutqhXq83eWc3BnOWMa9EQKZSqaBcLiOXy8Hv92NkZARf+9rXcMUVVzTd7uSTT6Z///u//zu++tWvAgBmZmaQzWaxadMmfOpTn4JpmgCA9evX45JLLpn3eJqmIZPJYHx8HKZpYnR0FMlkEqIo0qEkEAg0Dd/JsgxBEBAKhShgapqG559/Hna7HWvWrGkp0MP2yVtp5zN5VmY20+5haO4AI/td4MGcw+EAPKC/bmiUVV3JG3irga52YKV9t9s97xDAVsbcbveySu3s+9jKmMfjwejoKHw+H84991wcfPDBeOSRR3DTTTcBAD7ykY8gHo/j7W9/O4466igAIJ32sbExnHXWWdA0DQBw2mmn4Zvf/Oa84GiaJgVzTdMwNDSEvr4+2sdnmumNBxb23P1+P2XPzLpVkiS86U1vop8Dk6ptdLTr6emZ9zo3DsH5fD6USqW2VtSYrzoTiVmOpz2Hw9k74AH9dUDjVPlCk+xLwRTMWKm2HSRJIvGUViIxgiAsW6udHSxEUSRlutWrV1OW293djWg02rTDzWxD4/E4uru7Ua1WsWPHDmSzWZxxxhkk6XrCCSfgu9/9bsvDSj6fJz32jo4ODA0NwTRNlMtlun3jQB/Lsufavm7btg0zMzM48MAD6fOKomDz5s2YmJig9UCbzYZkMjkve2dDcLFYDKVSCT6fb8mhREmSSF/f5/NRMOeraRwOpxGuFLeHo6oqcrkcgNmp8pUE80qlQoYp7U6g12o12nFu1aev1+sQRXFZpXbDMJDP5yFJEg30jY6Ozgt627dvb7rONWvWIBKJ0PDb9u3bkc/nccYZZ0AQBADAMcccg5/85Cctr6VcLmPHjh0QRRGhUAhDQ0NwuVw0KW5ZFrxeL1UZ2PaA2+1GLBaj+8lms9iyZQuGhobQ09NDn5+ensbzzz9PGbTP58Pk5CSt0TEEQaCfQ7Vahc1mW1JmV1EU+jkEAgGUSiV6HB7MORxOIzyg78EwrW+n07liD2s20OXxeFCpVCizbdRxn4sgCNQ3bhVwWGbr8XjaLvcyn3EWoBwOB5XZG6nX66hWq01ZdiQSgdPphKZpFMw/+clPYmZmBgBw6KGH4uc//3lLiVNJkrB9+3aIogin04n+/n5Eo1EK5sDsehvLttkkv8PhaGoxCIKA5557DslkEmvWrKH7V1UVL7/8MgzDQH9/P+LxOCKRCCzLousDZnvxbNZAVVWoqjpvhW0ujVUCpmvPrFi5AhyHw5kLL7nvobDpZbaetVJNdEEQ4HK5SG7U7XbTEFhfX19TEGyUj12sN8t6zu1OybMJeU3TUKlUYLPZMDIyMi8o1Wo1CIKANWvWIJPJ0Oez2SwNrBWLRZxzzjmkz77vvvviwQcfbDkgqKoqtm7dimq1CgDo7OxEd3c3DQa6XC5IkkSSt6y1wexm2WsuSRKeeeYZeL1eHHTQQfR5URQhCAIcDgcikciC1Q9m1uLz+eByuVAoFEgLYCHmbiMUi8UmvXwOh8OZC8/Q9zCYpCpbRVqpwQmTBfX7/TBNc1FzFuCVoTtWzl0omLNd60gk0ra/Ouv/s8ebG8zZoBirCrz1rW/FPvvsQ19/9tlnye3svPPOw9atWwEAw8PDeOihh5oU2Rrvc+vWrVSSD4fDGBoaIp/xQCBAuvdut5uCOYCmtTxFUfDiiy/CMAwceOCBTRK3lUoFfr8fq1evht1up8MQe54dHR1NIjAsy/Z4PIsOETYeLBqD+UrnJzgczt4Bz9D3IBbS+l4ujT1g1nteyJwFmG+ystDjGoaBSqUCn8/XVsmXZdxMgY1l5o1VAVZWtiyLHvu//uu/mnbKf/SjH+E3v/kN/H4/xsbGAMyarfzv//4v+vv75z2uZVnYtm0byuUybDYbnE4nVq1aBVEUmwbSWN+cHaKYlzg7qCiKgrGxMdRqNeyzzz4Ih8O0cqbrOvXLPR4PRFFEPp+Hruuw2+0YHBxER0cHra/F43E6TDT25efCfhYAKJgzid2Vmt1wOJy9Ax7Q9xDYipTD4Vhxvxx4pQfMFORsNtui5ixzJ+gXKwOXSqW2BrmAV/blnU4nZmZmYLfbMTIy0nRYYAGfDZ85HA7cf//9OO2003Dsscfiuuuuw+rVq7F582bcfvvteOyxxwDMDgc++OCDWL16dcvHZpKuTqcTsixjdHQUhmHQRD4r+0ejUQrmLGg2BvN0Oo2ZmRn09PSgs7OT+v9Mj50FWK/Xi5GRESSTySalOFmWabNAkiTU6/VFpV0bhWOi0SgdBnbm94HD4ew92CzLsl7ri3gtEAQBkUgElUpl2QItu5pqtYpqtboi5bdGTNNEPp8HgCYrVEVRsGXLFgoWbOBrcHCQVr4SicSiQYMF32QyuWjQb3R+Y8Hc6XRieHiYgjkbqlMUBcFgEKFQCDabDYZhYGRkBMPDw7jxxhubAp9pmrjgggvwpz/9CY8++ije+ta3tnz8dDqNqakp8hfv6+tDNBql6oMkSZBlmYJ3o2Mce/6KoiCfz2NychLBYBD77rsv2ZSyNba5QZntobOA7nA4mgbfCoUCQqHQompw7HVjUrCsl9/umiGHw9m74T301xBWXmWmJstRb5sLcwljmfbcgGOz2WBZFv1fVVXk83nY7XakUqlFg7mqqtTfXiyYG4aBXC4HTdPgdruRzWbhcrmaMnO2hscGvMLhMD3n3//+9yQUM/f67XY7zj77bGia1tJnHAAKhQIymQxcLheq1SoSiQTC4TAJvei6TgN/iwXzYrGIQqEAr9eLoaEhVCoVmlCfq5THvmdychL5fB6apmFqagqbNm2Cy+UijXiPx7NoMGcHHL/fD0EQaLOBB3MOh9MuvI73GtHYL4/H4y1XrtqlsVTbKqOrVCqo1+uIRqO0rpbP5+Hz+TA0NLToIYKpui1lvMIm2VnPenp6mu6flaZZJaKxxN7I9PQ0ACxYSmefT6fT875WLpcxNTUFt9tNw4CpVAq6rlMQLhaL8Pv98Hq9CwbzUqlEMrBdXV2k775YZYK9vrFYDJqmwWazwWazwTRNalMs1jcXBAGSJNEGws5Wajgczt4JD+ivAbuqX84olUo0Bd1qcKpcLlNfna2OuVwuCjyLUalUltQab7QztSwLU1NTCIVCGBgYgNPphGEYdI0LlZ1N06Qe/+bNm3HwwQfPu83mzZsBzKrJNSIIAiYnJ+FwOGjQr7Ozkwbg3G43crkcGaDk8/l5Xu4sM9d1ncrmlmWRReti++KyLNOkPHOdCwQCmJmZQSKRaGp/zKVWq6FWq8Fms0FVVfj9/mWZ5nA4HA6Dl9xfRSzLgiAIKBaL8Hq9S5a624GValngaoWmaZAkify6u7q6YLPZWnqNNyLLMpWoF7rOarVKJWXDMDA9PY1IJILBwUEaSsvlcpQNtwrmTEHu8MMPR39/P+644w4yWmGYpok777wTQ0NDOOaYY+jztVoNU1NTcDgc0HUdtVqNXtdoNEp66ZZlIRKJNE2zs+ckyzLtppfLZaiqSuY37fiT+3w+CIKALVu2IJ1OQ9M0an8stm/OVtx0XYdlWQiFQjyYczicFcMz9FcJ1i9XVXVR0Za5w1WNlp1zYaXaWCy2aMmeZcnZbBaxWAy6rsPv9y+6BqXrOomhtJIYZaV4WZYRDAZRq9WQy+UQj8fR29sLm81GmuPsebQKjGzFDpjdDY/H43j00UdxwQUX4Oyzz6Yp9zvvvBOPPvoo7rvvPirV12o1ZDIZGqgrFotIJBIIBoOIRCLw+/2oVqvUbmh0QGPBnOnVu1wuzMzMoFQqYWhoCB0dHW2vDXo8HoyNjUEQBHR2dmL79u3QNA1HHnnkgm0KVhHQNA1er5eul8PhcFYKD+ivAo395cV6sWy4ailFN2A2M2biM4vthLN1rWAwiFgsBtM04fV6aTWqFUw4xeFwtLwNC566riMSiaBYLKJYLCKVSqGrq4sOA+wxFgpUzJbV6XTC5/PhlFNOwdNPPw0A+OMf/0hragDQ19eHH/7wh3j/+98PYFalLZfLQdd12Gw2zMzMkGhOOBxGIBAgz3EW2G02W9OMAfOV9/l8SKfTSKfTGB0dRV9f37KG0XK5HAKBAPr7+2EYBr2+C/1c6vU6adqHw2FyUONwOJydgZfcdzO1Wg35fB4ulwupVGrRKfHG4aqFFN0AUKBv9OhuhaZpyOfzCAaD6OjooBJ6pVIh0ZlWVKtVEk6Z2zdnU+qmaSIajSKXy6FUKqG7uxtdXV0ksMKm5xcK5kynnunBn3zyyfjNb34DYDbjvf766+m2P/jBD/DSSy/hIx/5CD3/QqEATdPgcrlomr6zsxOxWAzBYJAEYOx2OxRFmbcCVqvVUKlU4PV6kclkMD09jZGREQwNDS0rmNdqNRSLRXR3d6O3txfhcBjRaBS9vb0t9fJVVUUmk4EgCAiHwys23OFwOJy58IC+m5grZ9pOL5YNVzXSqOgGvNJ3ZfvbC8F2qRtFUBrX1hYacFMUBbVarclKtPGx2XBdOBzG9PQ0qtUqent7EYvFUCgU6KCx2LCfIAjkIObz+XDiiSfit7/9LYBZkZb//M//xOmnn063P+mkk+jgwpzaGvfcDcNAZ2cn4vE4Kb+xCoJpmnA6nU3BnJnPuN1uzMzMIJvNYnh4GIODgwu+nq1gWvlsvUySJCiKgnA4DNM052XomqZhYmIC1WoVqVQKHR0dXDCGw+HsMvi7yW6glZxpOyym6Aa8Mk3u9/sXFcNhpWS2/sRcvxrXwZgWeWMp3zAMlMvlJitR4JVhPnZtTqcT4+Pj0DQNAwMDcDgcyOfzNLW/UBWClfJZ0LPZbHj3u9+NRx99lJ7/Lbfcgn/5l39BK70jFsxVVaU9d0EQ0N/fj66uLjrglEoliKIIh8MxbwWsXC5DFEXYbDaUSiUUCgX09fVhcHBwyQNXI6qq0oxBPB7H1q1bMTExQauBHo+nqQKi6zp27NgBRVFI7IavpXE4nF0JD+i7mFZypu0SiURoatztdkNVVQoMbNXN5/Mt2vtmgZdNaQPtZf4s2DJJVAZbxdI0DdFoFLquY2xsDDabDf39/dA0jQJ9o0jMXBr77vF4HJqm4Z3vfCf+7//+DwDg9/tx880344Mf/CD8fj9EUWz6fja8pus6XC4XcrkcCoUCuru70d/fT8GcbRGwKgJzqmPPr1arwbIsGIZBE/F9fX3LypSZhoDb7Sb52EAggK6uLtK5bxxmVFUV27Ztg6qqGB4eXrSywuFwOCuFB/RdBBMRqdfrS0p8LoTX60VfXx9NuTcGJLbqtpBASePjzx1EWyrzB2b75qqqNu1Ms0oDMGsuUqvVkE6nSf5UkiTqTS9WhWi8n2QyCVEU8c53vhNPPPEEACAUCuHmm2/GiSeeiFqths2bNzcdNv785z9D13UqrbtcLqTTaaRSqaYAKcsypqam4HK5mlbkmPAO02F3uVyo1+vweDzo7u5elqgP0753OBz0sygWi/D5fBgYGJiX5dfrddqfX716Nfcx53A4uw0e0HcB9Xq9aSVqZ4acvF7vPDcyNjy2UDBfyqVtscwfeKVv3rgzzcr2bHiuWCxiZmYGXq8Xfr8fqqoumZUDr/T8XS4X4vE4CoUC3vnOd+LJJ5+ka7vlllvwrne9C7FYDJdffjmuuOKKpvv453/+Z/r3+eefj/e+972IRCJYs2YNPYd6vY7t27fDZrOhp6eHDjSmadLgHmslyLIMVVXR3d29rINXoxMaU59jzmutxGNEUcS2bdtgs9mwevVqPvzG4XB2K9ycZSfMWSzLovUxFnCX04ddChbM3W73gjrv7DBht9sRj8cXLB0vtN/O9NfZYzTulwcCAfj9fmSzWSoxBwIBKjUvFqAay/9+vx+RSATT09P453/+Z7z00ksAZoPirbfeire97W3kac7WxxRFwdTUFEqlEq3mqaoKVVXR29uLAw44AIlEgl6nl19+GQAwOjpKByJd1zE9PU0/63g8jmq1inw+T0Np7faxmVY+C95Op5PaK8xGtZFyuYzx8XF4PB6MjIzw4TcOh7Pb2aOm3BVFwZlnnoloNIru7m584xvfWPC2v/jFL3DIIYcgGAzioIMOwgMPPPAqXukszCK0XUWxdlAUBdlsFi+//DJeeuklsvxsFXjY+hYrMS8WNLxeLzo7OzE0NITOzk54vV4qRdvtduqP53I5Up7zeDxkOuJ0Oqkvv5ToCrMkFUURkUgE0WgU27dvxzHHHEPBvLOzE7fffjuOO+44CubArKzr/vvvj0AggGQyiUMOOQSdnZ1wu93weDzo6OjAvvvuS8G8Xq9TMF+zZg0Fc5axl8tlpFIpdHd305R+NBpFMplc1lAamyNghyZFUSAIAoLBYFMwZxWB8fFxBAIBHsw5HM6rxh71TvO5z30Of/3rX/G73/0OY2NjWLduHQYHB/HBD36w6XbPPPMM3v/+9+O6667De97zHvzv//4vPvjBD+Ivf/lLSw3w3UUwGEQgEFhUcW05MGGZWq0GURRhWRZ8Ph/q9XpTGd6yLFQqFUiS1DT8tlyY7GgymUS9Xke5XIbD4UAqlYKiKJienqb1skQisai8LKNxwp9NvL/wwgs4/vjjyXylv78ft956Kw499FB0dXXNu4/p6WkUi0V0dHRA0zR6XYLBIA4//HB0dnYCmC3n79ixA8BsMGfXVq1WMTY2BgAYGhpCOBwmBzW2k7+cYUUmrxuPx+F2u2nH3ev1Nr32rKLCDg09PT08mHM4nFeNPebdRhRFbNiwAb/61a9w2GGH4bDDDsPzzz+Pb3/72/MC+g9/+EO8/e1vx/r16wHMllkfeOAB3Hvvva9qQN/Vb9bMphOY7S3HYjGUy+Wm9bK5U+ftyoXOLbm7XC4oioJIJAJJkiCKIpXiy+UyJiYmIEkSEokEuru7EQwGl8xoG/vubML/8ccfx3ve8x7qPY+MjOCWW27B2rVr0dPTM+8+qtUqcrkcQqEQdF1HtVrF9PQ0LMvC4OAguru7qZzPZF9HRkYomGcyGaTTaQQCAQwNDcHtdqNSqVDroqOjY8lDSSNz5XVZ9cHpdDbNNFSrVfr5xeNxvmPO4XBedfaYd5ynn34amqbhqKOOos8dffTRuPrqq2GaZlM5e926dVBVdd59zFVUe73BggdTG7PZbE3rZY3T4olEou3ANFdSlmmsDw4OQpIkknD1er3IZrM0XNbX14fu7u4lA5NpmpTFNg7K/frXv8Ypp5xCK2hr167Ft7/9bYyMjJDe+9znX6vVkEgkqI8+PT2Ner2OoaEhDA8P04GmUqnA6XTSqpiu65iYmECpVEJHRwfdP+uZM+W65UyZMye0cDhM7mus+sDaIGy7QJZlOmTtCgc9DofDWS57zLtOOp2eJ0rS2dkJRVFQKBSQSqXo8/vtt1/T9z7//PP47W9/i/POO2/B+6/X66jX6/SxIAi78Op3HlVVoSgKWX6yYMfWyxqnxZe7394oKWuaJiRJgizLyOfz6O7uRjKZhGma2Lp1K6anpxEKhbBq1apFPbwZzFyFBTlWSfjJT36Cj370o9A0DQDw5je/GTfccAP6+/tbBvPGeQTTNKEoCsbGxmCaJgYHBzE4OAifz4dcLgdVVWltLBAIoFarYWxsDLquY3h4mK6b9cyZVepyJtpFUSSVPyayU6lUyKbW4XDQQCJzhvP5fE3GLxwOh/Nqsse880iSNG/Qin3cGIjnks/n8YEPfAD/8A//gJNOOmnB211zzTXz1qH2FFjvlZV1y+UyrZexAw7rZS+1JtYKJizDMkxBECjopFIplMtlbNmyBbVaDT09PVi1alVbcwEs6DmdTsTjcTpk3HLLLbjgggtI7e2f/umfcO2116KzsxM9PT1N1ZbGqfpIJIJ6vQ5JkiBJEgXPzs5O2qW32+1wOBwkfTszM4NMJgOPx4NVq1ZRBs6kb9l9LMeWVJZlVCoVBAIBOgTUajUqvbtcLjqAMF95to+/q+YpOBwOZ7nsMQHd6/XOC9zs44X6xNlsFscffzxM08R999236JT5JZdcgosuuog+ZpKhrzUsmLtcLnR1dZEZC1sbM02TjFBWaq/p8/lQLBYxNTWFqakpxONxMgYZGxvD+Pg4nE4n9ttvP3R2di55YGgUsWk8ZFiWhUsvvRRXX3013faUU07BZZddRr34xspCoxRsLBaDoiiYmZnBjh07kMvlMDw8jL6+Plp/GxkZoTaE1+vFxMQEKpXKvAG0er2OQqEASZIQj8dbmswsBFPkY6t2wCua7aFQCE6nk/zdQ6EQFEWZ56/O4XA4rwV7zDtQb28v8vk8dF2nN8ZMJrOg1OnU1BTe/va3AwAeeeSRppJ8Kzwezx4n7MHsQxv3zJmwDCvnstLycga55uLxeLBt2zZMTEwgmUxClmXU63WSQI3H4xgaGmqrJL2QiI6u6zj33HNx11130W3POeccrF+/HpFIBF1dXU0Bj63MsQxaURTaQa9UKuju7sbg4CAJ2JimiXw+T+uBU1NT0DQN3d3dTSuDmqahUCigVqshGo0ua52QPbfG37lGzXabzUaa9fF4HJVKhcr5PJhzOJzXmj3mXeiQQw6By+XCn//8Zxx99NEAgD/84Q844ogjWipwvetd74LdbsfDDz/ccvVpT6dVMGcwwZJdIVZjmiYmJiYgiiK6urrITlSWZTidThx44IHo6upa8rDTKBQz97pqtRr+5V/+Bb/85S8BADabDV/60pfw0Y9+lPbWGwMemxTXdZ2C+fj4OLLZLK3NsSl8plSXTqdpr51N0nd2djatjem6jnw+T4NsjQ5rS8F+Hh6Ph4I5U+Cz2WzQdR2yLCMYDMLv99PcAA/mHA5nT2GPeSfy+/1Yt24dzjvvPNx9992YmprC9ddfj7vvvhvAbLbOFMP+4z/+A1u3bsUjjzxCXwNAa1d7OqysywIjC+amaWJsbAzbt2+Hqqro6+uDw+FYVv937uMUCgVs27YNDocDgUAAlUoF1WqV+t7sMRaDZamGYSASiTRpwmcyGbz3ve/F3//+dwCAy+XC1772NZxwwgnw+/0UnBlMC51ltrIsY/v27U1qdcyr3OVyQdM0MmLp6+uDoigIhUKIx+NNE+vsfqvVKu3Nt9vPVlWVDlfs58EOHWz+wGazkU1qPp8HAD4Ax+Fw9ij2qHejG264Aeeffz7e9ra3IRKJ4IorrsD73/9+ALMKYnfffTfOOOMM/PSnP4Usy3jzm9/c9P3r1q3Dxo0bX5VrXUhKdSmYaxgr67Jgrmkatm/fjqeeego2mw2RSARbt25FJpPB4YcfvqygzrLpWq2GarUKh8MBRVHgcrngcDjQ29sLURQRCoUWDeaN0rYs2DYGsBdffBHvfve7ScQlGAzi29/+No4++mj4fL55Wwu6rqNQKACYNWmRJAmbN2+m18Pr9ZJ/e6VSQTabpdW1WCxGtrHxeHzeISGfz6NardKkebstisYZBlYpsSyL5G7D4TCJ97DHsdlsy8r+ORwO59Vgjwrofr8f3/3ud/Hd73533tcaJeeZfOhrxdy9blEUUa1W0dfXt2hQZ8Irfr+/KUCzafFMJgPLshCLxVCv1+H3+1EqlTA5Odl2QG/MptmkuNPphGVZVLL2eDzw+/2LBr3G+2FBrZGHH34Y73//+1EulwHMrhhu2LABBxxwADweD6mqNd5fsViEw+FAIpFArVbDSy+9hGq1Cq/XC5vNBo/Hg76+PpomLxQKKJfLGBkZgcvlgtvtRiqVampBsEy6Wq3C4/EgkUi07Z7WGMwTiQQF84mJCRSLRaRSKaRSKbjdburNs2l2Hsw5HM6exh4V0F8vNO51A0AgECCxk4WCCeuLN0q1mqbZNNGuaRoEQYAgCLAsi7L3mZmZJa/JsizKyFnwFgQBfr8fwWCQVrc8Hg+CwSAMw2h5SFgqKweAu+++G+eccw50XQcwawt61113YXBwkEr5jT151mJgJe1qtYoXXngBkiSRlGpHRwcF7omJCUxNTSGbzcIwjKYKSKtgzq6VZfHt0CqYq6qK8fFx2oBgeu9zDyO70oCHw+FwdhU8oK8A1ldtpFHRbS6s/N3ok84EWZiQjM/ng2EYGB8fR19fH/WPJycnMTg4uOj1aJpG6m9scp31kll5mGXkHo+HJsfnzhuwNoJpmi2zctM08eUvfxnXXHMNfe4tb3kLbrvtNgp+c4M5q0qwFkOpVMJzzz0HRVHIIGZgYAADAwNU0k6n03j66adpQK1cLkMQBHR3dzddC8vMmQzr3OtdiLnBnGnjZ7NZqKqK0dFROnSxYTlWkufBnMPh7KnwgL4CmMhJ43AYU3RrZK5oCrt9oyALG7QCZrXhPR4PRFGE1+uFoijweDwLDl6xrJzthLvdbtjtdgiCQD1mlp3bbDaqBoTD4aaev2EYEAQBsiyTT/rcxxRFEWeccQbuu+8++twHP/hBXHPNNQiFQjBNc14wZwcZVpXIZrN49tlnoWkagsEgnE4n+vv70dXVRYY0hmGgXC7DNE10dHQgGo3Sylq1WgXQHMzZ0GC7KnBzgznbMa/VanA4HFi1ahX9nBorCws53nE4HM6eAg/oKyASiaBardKbvaqqFAgZTDSFleZ9Pl+T5jlTOmsMEqFQCIODg5BlGaVSCbFYDKlUqmWwYj1dtqseDofhcrlI+zwajSIWi5FMrKIoLZ8LO1zYbLaWvt4AMDk5iRNPPBFPPvkkAMBut2P9+vW4+OKL4XK5YBhG0yDa3IOM3+/H+Pg4nn76adJUd7vd6OrqQjAYpKl3p9OJUqkESZKwzz77wOl0olwuIxgMoqurC5IktQzm7brNNa4KBoNB5PN5aJoGy7Lo58eC+ULDixwOh7OnwgP6CvB6vejr61sw4zVNE8VikfyzPR5PkyBLo+Z5I0z61OVyYWBgAIqioF6vzzsoVCoVZDIZMlWJxWLQdR3bt2+HLMvo6elBIpEghzRFUTAxMUGSsrVaDYVCgabcmcRpq3Ly448/jpNPPplWA/1+P6666ip89KMfhcPhgKZpTcG88bkzQZznn38eL774IkKhEPr7+0m61WazQRAEGoobHx+H2+3GyMgInnnmGSSTSSQSCWiahkwmg97e3qZgHolE2l5TZMHc4XDAbrdTlh4MBqkdwg4GbN6hVVuCw+Fw9lR4QF8hTNFtLnP3rJ1OJ5V0WU94oQlpliUKgoBisQiv10tT6cBsCXhqagrVahXBYBA9PT3w+XwolUrYsWMHdF3H4OAgZcDArOnNc889h0wmg49//OMAgHvuuQeiKCKRSODII49cMGh973vfwznnnEMSvN3d3fjWt76F448/HrqukzAMeywmxGKaJhKJBOr1Ov7+979jcnISfX196O3thSzLsNvtZGgSi8VQq9UwNTWFQCCAVatWYcuWLXTwYK0Hp9MJwzCoNB6JRNqe/FcUhQ4ZLpcLpmlSW6FYLDYpwzGN9sZ5Bw6Hw3k9wAP6Cmm1h+5wOGi1KZlMAgDJ2bYaMmt1n36/Hw6HA4ZhwOFwwOPxoFqtYnx8nLLKwcFB8jHPZrOYnJyEw+HAmjVr5g1u3XbbbfNMaU4//XT691e+8hVcfvnlTV/XdR0XX3wxbrzxRvrcIYccgm9961s47LDDIMsyBW3Wq2cVCLvdjmg0inQ6jZdffhnVahX7778/EokEHXRYMPZ4PCQaE41GMTg4SOtrBx98MARBQKVSQSqVgmVZ0DQNdrt9WcFclmVMT09D13VyTgsGg7QTzw5Zjbryc8VzOBwO5/UAD+grQFEUbNmyBcVikQJvIBBAPB4nFTM2bOVwOJBMJttSLdM0DbquY2hoCMBstv/CCy9AlmWsXr0a3d3d6OjooCpAYya/atWqlr3kc889F29605swNjaGCy64AADws5/9jLy7DzjggKbb5/N5/Mu//At+97vf0edOOukkXHnllVi9ejXZzjZKnrJ+s8PhgM1mw5YtWzA9PQ2bzYbDDjsMTqcTExMTcDqd6OnpIYW4bDaLarWKjo6OJlMYn88Hn8+Hnp4e8j9npjLRaLTtMng+n8f09DQZ34TDYTgcDhqMY6tuTFeetUja3WPncDicPQke0FdANpvFxMQEvF4vXC4XqtUqxsbGcNBBB6G/v7+lE1k7uFwu0glXFAW5XA71eh39/f3Yf//94XQ6SRZVFEVaPxsaGmq5f60oChwOB9auXds07Ob1erF69WqMjIw0Ba+//e1v+MAHPkDKb06nExdffDHOOeccdHd3o1wuzxNWqVQqJC6jKApl1eFwGH19fZBlGRMTEwiFQnSd7PXRNA0dHR3zdrvZ0GE+n6fDgt/vR19fX1vBnBm9sMFCtgYIvLIuyNbQ2JAdqzjsjAkOh8PhvJbwgL4CZmZmYFkWIpEIarUa7HY7PB4PBEFokgZdrrsbK7dXq1XKXGOxGEZGRmBZFnK5HAnH2O12BAIBdHZ2zgvm9Xod1WqVpu9TqRTpjwMgRbRG7rzzTnz605+mfnkikcD111+P448/HolEAqVSCU6nk4KvaZokj8q0zjVNQ71eJ2vWYrFIJfOhoSGoqkqvDwAyUJk7jOf1ehGNRjE5OYl0Oo1kMonh4WF0dnYu+vqx583aHAMDA9T6AF7ZDGDPg5XdmU4712XncDivZ/g72E5Qq9UgyzL8fj/K5TLJj0YikWUJkCiKglqtRtPVsiwjGo3SaptlWchkMiTGwu47Go3O24WvVqu0k84OFdlslobQgNlSdHd3NyqVCgDgggsuwIYNG+jrBx10EL75zW/iwAMPRDAYnLeLXavVMDExQRP4drsdmqZBFEVaCcvlchRUE4kEBEEg1bd6vQ6v17ug6lq1WsXmzZtpYt/n80FVVXr+rV4/doBhu/T9/f1Nrw0L5sz6lPX8uWAMh8N5o8AD+gro6OigcrhpmpiZmYGu6xgZGSE52KWwLAuSJEEURVpPA2Z30XVdp8l4RVFgt9tp4p0p0rHhLmA2M63VarTyNrcP/LOf/QxXXXUVffyxj30Mvb29OPfcc3H//ffjqaeeoq+deuqpuPTSS9HV1QWXy0X+4OFwGKIoolAoUN++q6sLpmnSLjvb55YkCS6XCx0dHXC73RAEAW63G6FQCJVKZVEJVVVVsX37dpRKJRKWYWX6Rmldy7IokOu6DpfLBZvNhkAggGg02tRiaAzmiUQCkiRBEAS+Y87hcN5Q8IC+Ajo7O5HP57Fp0yaUSiWEQiHsv//+S0q0ArODbqIoQpIkGIYBTdNgs9kQDodRqVRIcSuumaYAAENhSURBVI5l2xMTE4hEIujv7yehFeY61lhabxXIAeD+++/Hpz71KRx77LH4+te/jtWrV2Pz5s244447cNlll9HtPB4PrrzySnzkIx+hCXKmOGez2TAzM4NarUZ9b5fLhXq9TvvdrAdts9lgt9vhdrthmiZNtbtcLhSLRdJ6bxXM2XoZczlrFLphBxmmU89U5TweD0KhEGq1Wkvp2bmZuSAIkCSpSVOfw+Fw3gjYrLnN1L0EQRAQiURogGs5KIpC1qa6rsPr9SKZTM4bMmtEVVWIoghZlpv8z+12O2Xbf/nLX7Bjxw6EQiGyO61WqxgaGsKhhx5KO9Ner5eCq8vlQigUWnAnfmRkBMPDw7jxxhvnGZtccMEF+OMf/4i+vj7853/+Jw4++GA6KDAFOo/HQ/1xm81Gk+y6rqNWqyGbzSIQCFC2XqvVYFkWCbWEw2HaT280QpmLJEkoFouQZZkU4Rp75oVCAT6fD8FgEKZpwu/3k1Y9s2Sda6vaKPMajUbpwMTU6zgcDueNBM/QVwBzW0smk9TXrdfr89zWGsvquq7D6XTC6/WSKAvLtB0OB5WzBUEge9NgMEgDaGwSu7FPvNTg3e9//3uMjY3h6quvnpcR2+12nH322Xjsscfw1a9+FQcffDA8Hg/S6TREUUQ4HEY0GiV7WFVV6XtZJl2tVtHZ2YnOzk5Uq1UUi0WSdmXX1o4eOpPRZQN1XV1dyGazKJVK5O3ODgkskDeun7Hsu1GwpzGYRyKRpioCn2TncDhvRHhAXwHlcpmmpV0uFyRJgq7rNHWuaRokSSL3M6/Xi0AggHq9DkVR4Ha7kUwm4Xa7Ua/XUSgUIIoifD4fXC4X7HZ70yCYz+dDpVKhHnowGGxrrz2dTgOYtTdtBfv8zMwMFEVBPp+H3W4n4RoWjCVJIpOYxsC9Zs0a+P1+ZDIZlEolBINBDAwM0Koe06T3er2IxWLzgjmTsS2XyyRjyzJ4r9eLyclJWj1bs2YNuru76T4kSUKlUqFd8sYDS6Nmu9/vRz6fh9PpRCqV4j7mHA7nDQsP6CuABez+/n76HPPRzuVy0DSN9Mo9Hg9kWaZhMNYXZr1dURRpKn10dJRKw7IsU584Go2ir6+PMtN2YXajmzdvxsEHHzzv65s3bwYA9PT0kFRtZ2cn7HY7yuUy8vk8DMMg/3Q2CBiNRtHR0QFd17F161bU63VaTWMHDWab6vf7F/RdLxaLKJfLZAzj9/shCALK5TLS6TQ8Hg/WrFkDYDaAs+l4NjDo9/sRiUSaDgqyLKNcLtMBZLEDBYfD4byR4AF9BTABGLb2xabRZVmGw+FAKBSCx+MhExQ29BYIBMhxrXGCnfWa3W43OZVVKhU4nU6sXbsW++6774rWqpgd6+23346bb755Xg99w4YNGBwcxD/8wz/A7/cjFovBNE0ycvH5fAgEAtT7dzqd6OrqQiAQQKlUQi6Xg9PpxNDQELq6uuj+59qmzsUwDArmwOzeuaZptOtuWRbC4TDi8Th9T6lUInMZRVFaSukyERqPx0PWslyTncPh7C3wgL4CotEoTVpXKhUEg0HEYjGsWrUKsVgMoiiiXC7DsiwEAgEKPNVqlXbXAdDXnE4nZFlGOp1GJpOBzWZDZ2cnXC4XXC4XVFVdlhypoij46le/imuvvRaGYeCxxx7DBRdcgLPPPpum3Dds2IDHHnsMt99+Ox0oKpUKJicnSffc4XCQfG2jR/r09DQkSUI0GkVnZydlv6yELknSgtr1qqoim80il8vBZrMhFArB5XLB6/XC7/fD7XZTqyKXyzXtnk9NTaGnp6flND/b4fd4PDAMA4ZhcBlXDoezV8ED+gpg0qR2u52ySLfbDY/Hg5mZGRiGAb/fT37noiiiWq3S2pXf74fL5YLT6YQoijBNk9bDPB4PfD4f3G43otEoZeuLBSbDMKCqKlRVxXPPPYdPfepTeOaZZ+jrPT09eOqpp5pMWaLRKC688EKcdtppcDqdtPvNPMaZGUo4HKZhPNM0KdiyQM6kWBvNTVr5qjNb1ampKZTLZRp+i8ViNEnPsNlsmJycJGndSqWCXC6HffbZp6UuPpPCdTqdUFUVDocDqVSKK79xOJy9Cv6OtwIa/dAlSQIwOzVer9fh8/kouxVFEbVajYIg8+Jma2Bs/crv98PpdJJ2OQvowCv71wzLsqCqKjRNo/8bhgHTNLFx40Z89atfJZEah8OByy67DAceeCAefvhh3HzzzQCA97///RgeHsZb3/pWVKtVUqFjvu5sBoBNuNfrdfj9ftr79vl8iMVilIGzEjqzU2WT94ZhQJZlmopnsq8DAwPo7e1ddNqcbVM2zh80urux25RKJbJk1XWdi8VwOJy9Fh7QV4jX66WgwyRNWwVyVVUpmDudTrjdbni9Xvh8vqaVs61bt+Lpp59GuVzG+eefDwD46U9/ClmWEQqFIMsy6Y8Ds1ms2+2Gz+fD1NQUzjrrLPzf//0f3d8+++yDe+65B/vttx8efPDBpl72P/zDP5DAyo4dO+BwONDd3Q2v1wvDMOB0Osloha2bsUNDIBBoysCZ2Qkw68DG1syY+QoAmvhPJBKk/rZYwLUsCx0dHZiamkI+n0cqlUJvb2/T97CMX1EU0rbntqccDmdvhgf0ncAwDFJoY4Gc9dVZ5s4kT0OhEAXxxsDEhuBuuukm3HTTTU33/4EPfID+/bnPfQ7//u//jmAwCLfbDafTCdM0ccMNN+Cyyy5ryuIvvPBCXH311ajX69i8eTMEQSDbUwB4+umn4XA44HA4MDQ0hLVr1wKYnUxnE/yapiGZTCIYDJIaHbOGZZk1W3UzDAOBQIB25ZlUrdfrJW35cDiMjo6OJT3hgdlgvWXLFjidTgwODsLhcCCbzZLRChOqkSSJjHHmispwOBzO3gYP6DsBW+di0+yVSgWKosDpdCIYDCKRSCAcDlPwZbKvuq7DMAzouk573h/60Ifwnve8B6VSCaeeeioA4I477sCqVasQjUbR3d3dZB369NNP45xzzsETTzxBnxscHMRdd92Fo48+mkRZ7r33Xlx77bVN1/29732P/v3v//7vGB0dpYlzwzDgdrsxODgIVVVRLpdJvpUJwyiKgkKhQKIubC0tEAjA4/HQJDoTqYnFYkilUm0JurD7Zo/JJuDZIYgJxoiiCI/HQ9rt3FyFw+Hs7fCAvhNks1lMT09T0GPSpKwkzXrLjdjtduqly7IMl8uF4eFhhMNhaJrWNMzW39+Pjo4OjI6O0lBctVrFVVddhRtvvLFJve1Tn/oUrr32WtjtdhQKBViWBcuy8Pa3vx2pVAqbNm2CIAiw2Wzw+/2Ix+NYu3YtBgcHkc/n4fV6SQs9HA7T6hkAGk4rFotQVRWCIEDTNESjUaRSKXg8nqaAWqlUkE6nYRgGuru75wm/tMKyLNoCcLlcOOCAA8iAJRQKwW63Q5IkZLNZ0mKf6zbH4XA4ezM8oO8EMzMzyGQyFMSZVCorZzf+m/3HpFyLxSI8Hg9isRgF68nJSYyPj9P9P/nkk9A0DaFQCB0dHfj1r3+Niy++mARhAGB4eBh33nknjjvuuCahFiYR29PTg2KxiEwmg1gsRvKzTLSmv78fPp8PlmXB5/PBbrfTJDrTmWf353A4YBgGQqEQEolEy0n2mZkZzMzMwO/3z7MwXQjDMFAqlciYxuFwIJ/PNznXTUxMwLIsEqHhJXYOh8Nphgf0FcIkWTs7O5FKpZBMJucFuFaw/m8rXfEf//jHuP766+njSy65BKlUCh/96EeRTqdx77330iCe3W7HRRddhMsvvxyapuHll19GvV4niVm2S86qBMzspF6v0xodO2Sw/e1qtYpqtUrraqlUiuRm2XWzQ8jc8nm9Xsfk5CRqtRopzrWzNqYoCh1CmBwuk5hlQjO5XA6CIGBwcBDd3d0kLcvhcDicV+ABfQUoioLJyUnU63WEQiGa6u7r61t0X1xVVdJBTyaTTQHv/vvvxxe/+EUce+yxTQIwd9xxB771rW813c/BBx+MW2+9Ffvttx+mpqZQq9UQCAQQiURQq9VoHY65o7HVN6bs5vF44HA4yGAlGo3SnnkkEqF++VwZVzbxPrd8XiqVMDU1BQCkA79UwGXT8KIowuv1NvXB2VpgPp/H2NgYVFXFyMgIBgcHuVAMh8PhLAC3T12BfWo2m8XU1BQcDgcpmRmGgd7e3ibLz0aYxjibim8MiszmdGhoCDfddNOCNqcejweXXHIJ1q1bR9KmTDO+Wq2iUqlQsGaGMW63G0888QS2bt2KcDgMv99PvenDDjsM//RP/0T9cmbFyoIrm8CXZRnBYJCEchqve2JiAqVSCZFIBH19fW0NvjGZV8MwFrQyFUURExMT0DQNnZ2dSCaTfPCNw+FwFoFn6CtgKbe1uSxmJmKaJh566KG2bE6vu+46vO9976P+uKqq0HUd4+Pj5F0uiiIsyyIVN5vNhkMOOYRczKrVKgAgFApheHgYhUKB2gfRaJTWyhqDbivlN0EQMD4+Tn34hXzO51Kr1VCtVsn9bG5Znkm+ptNpuN1urFq1ig++cTgcThvwgL4CNE1DuVwmTXePx4NyuUzuZgzTNJt8vht3sOv1OgmuvPTSSwCWtjllDm1MX91ms5HtKNNS7+rqQiKRgKZp0DQNfr8ffX19MAwDmzdvblpBczqd1C9v7Isza9JWQdcwDExOTqJQKJBdajtlcF3XUS6Xoapqy2yfPT/mWpdIJNDb28vtTjkcDqdNeEBfAcwxbXp6mj7n9/thmib9x/alWcC1LAv5fL5JQY5Zgr788ssAlrY5DQQCMAwDiUSiaWWN7b13dHSQMIzL5UIymYTNZkMmk4Gu6+jp6SFteVVVYbfbEY1GqcRumiZZt7aqJlQqFUxMTEDXdfT399P9L4UoihAEgWYHWpXly+UyTbIPDw+3tFzlcDgczsLwgL4CVFUl61P2/2w2i8nJSSSTSciyTFl0MBgkIRSmv87cwKampnD77bfj97//PRwOx6I2pz09PTjooIPoMR0OB3w+H/mNN5bTmQQq2+uuVCqUgTNLUVVV4XQ6yVxGVVUSo5lbYtc0DZOTkyiVSgiFQli9enWTbO1CNGblgUCg5XS6ruuYmppCoVBAJBLBwMAAXC4XFEWhw4XP5yORGQ6Hw+G0hgf0FcB6zkyMxTAMCIIAp9MJm81GgjEul4uU4dgOdSAQgCAIuOuuu/DDH/4QpmkCANmcrl+/HmedddY8m9MbbrgBfr8fDocDXq+3yZWNPYbf70c4HIZhGMjlctA0DcFgEJVKBYIgkIlJKBSC0+mkwTfW13a73YjFYlTmNk0T+Xwe6XQadrsdg4ODSCQSS74+lmU1rcYtlZWbpomBgQGSdm3cImDPr1qtLrlFwOFwOHszPKCvAI/Hg1AoRNkvyzynpqZgt9spc7bb7WSg4nA4oGka7rjjDtxyyy1N2uu9vb248sorIQgCrrnmmiab066uLlx77bU4+eSTAYAMXvx+P+r1Ok22M9GYRrW1RCIBWZapJ55MJqmXXy6XyeGNideEQiEAr6i2pdNpSJKEWCyG3t7etoRcVFVFpVKhw8RCvfKpqSmUSiWEw2H09/c3BXx2AHE4HKjVavB6vfRceUDncDic1vCAvkzS6TQmJibwxBNP4IYbbgAAfPjDH4bD4cBBBx2EtWvXYmhoCMBsOZllwRs3bsTXv/510kwHZifN169fj4985CPQdR2SJOGrX/0qzjnnHADAZZddhqOPPho9PT2k5MZ69awiEI/HKeDlcjlScnM6nSiXyxQQ/X4/yuUyRFEk+Ve/3w+3241UKkXBWpIk5HI5lMtleL1ejI6OUqBfDNM0Ua1WIYoiXC5X03023qZUKiGdTsOyrAWn48vlMtLpNOr1OgzDoAn+hbYIOBwOh8MD+rK57bbbcMUVVzR97t577wUA/OhHP8JFF12Ef/u3f4PX64XD4aBAPjMzQ7d3u9049dRTsW7dOkSjUcpE0+k06acDsytezzzzDGRZxpo1axCLxSggsz45k02VZRkej4cm70ulErUGmIkMm7iXZRmGYWBwcBCpVIraBOVymbTnu7u7kUgk2poyZ57llmXNm+ZniKKIbDaLarWKUCiE3t7eBfvw1WoVExMT5H+uaRomJiZ4MOdwOJxF4AF9mZx77rkYGRnBtm3bcPnllwOYtSv1+Xzo6+vDu971LoTDYWzYsAFf+9rXkMlk6HvtdjtOPPFEnH/++RgeHqZBL0VRsGHDBsr4GY0fX3TRRbj44osRDAYpYLLeN9M3tywLhUIBkiRR0I9GoySt2tXVhVqtRu5vTGCGidKoqopIJIJkMtlWaVvTNPo+n89HOuyN1Ot1FItFcmbr7+9HLBZbdDqeOdY1wjzaORwOh9MaHtCXSXd3N1atWtWUcSuKgoGBAfT39+Oee+7Bt7/9bRQKBfq6zWbDe97zHnz2s5/FIYccgkAgAKfTSYIzTqcTn/zkJ9HZ2YmtW7dSVm232yEIAgYGBnDCCSegs7MTdrud+slMzIb5jtdqNaiqSsNxrH9dLpeRz+epBRCLxaDrOiYmJhCPx6GqKrxeLzo7O1v2vOfCSv6SJMHpdCKRSMzLtnVdhyAIKBQKqNfrTc5sS+HxeBAOh2GaJu27h8Phtr6Xw+Fw9lZ4QF8Bjz76aJOJym233UaOZXOzyPe+97343Oc+hze96U3w+Xy0XlYqlWC320ndDQASiQTtYRuGAWC2Z7/ffvthzZo1tAamKAqV1xVFQS6XgyzLcDqd5PrmcrloX75SqSCTySAej8M0TWzbtg21Wo1K7syEZSkzlcbpdVYBYJrxDMMwKONn/fv+/v5lGaow+1aHwwG/3w9JkmAYxrIlejkcDmdvggf0ZXL//ffjy1/+8jwTldtvvx2PPfYYgNmM/MQTT8TnPvc5HHnkkXC5XLQeVqvVYLPZyDAln8/D4XAgGo2io6MDpVIJ5XKZsvhQKESrZ6IowuFwUHm9WCzSYYBlsYFAoCnwArOiN7Is49lnn6WVOjbV3tnZ2VZ5ne3WG4aBQCBAHuUM0zRJQEYURdjtdqRSKcRisWXbnHq9XqRSKVr3Yw5sfMKdw+FwFoYH9GVgGAYuuugiHHvssU0mKgcffDBuvvlmXHDBBXjyySfx6KOP4tBDDwXQnNValkW94Hw+DwBUSjZNs6nHDYB2xr1eL2RZRjgchsvlolK9ruvwer0IhUIIh8PzyvF2ux0OhwPpdBr5fJ4G6gzDgN/vbytI1ut1CIIATdPg9XqRSCSaMnn2/Gq1GkRRhGmaCAQCiEajK9ZgtywLq1atgmmaZH7DtgU4HA6H0xoe0JfB73//+yVNVE4//XSa+JYkCbVaDYZhUCBnvfVAIEA9YcuyEAwGsXbtWvj9fiqhK4qCzs5ODAwMIBaLoVaroVgsQlEUEoGJRCJwuVxUjhdFkR6PXReTel2zZg08Hg/8fj+2bNmCUqm04HNVVRWCIEBVVbjd7nniMI2BnPmvu91uqhTsjAa7z+eDKIpNIjalUqktv3kOh8PZW+F+lMsgnU4DWNpEZfv27ZiZmaHArqoqstksKpUKfD4fYrEY2ZxGIhEaRvP5fOju7kYymUQ8HsfatWvxpje9CV6vF9lsFoVCAZqm0fckk0k4HA6Uy2WMjY0hm81CVVV4PB4Eg0HKkOv1Ovx+Pw2pTU5Owuv1kkpdI0yDPp/Pw7IsxOPxpmDOWgfZbJZW4+x2O8LhMDo7O5uU5lZKJBKBx+NBqVSiFTyPx4NIJLJT98vh7CyiKOLSSy/FvvvuC5/Ph2QyiQ9+8IN4/vnn6TY7duyAzWZr+s/lcqGnpwcXXHAB+TDMvZ3D4UBPTw++8IUvQNd1uj/LsvDFL34RqVQK8Xgcn//855v+dguFAj7wgQ+Qg+L3v//9pmt+9tlncfTRR8Pn8+HAAw/Eww8/vORzDAQCOOaYY3bFS8Z5FeEZ+jJgbmpLmaiEQiEYhkErYTabjaRiHQ4HXC4XgsEgSceybL5araJYLNIqmGVZ0HUdLpcLNpuNlNdYnzyfzyOfz1PATiaTFMQbS/KDg4OYmpqCKIpUwrbZbE1DZqqqolqtol6v03BdY0bMeuSsAmAYBqnihcPhXZo9e71e9PX1kZZ7OBzmWu6c15xarYajjz4atVoNN9xwAw4++GDk83l8+9vfxlFHHYWnnnoKw8PDdPsnnngC/f39AGY3YR555BGcd955SKVSuOyyy+bdTtd1vPzyy1i3bh3i8Ti+8IUvAJhdX/3hD3+In/3sZ9A0DR/72MfQ0dGBiy++GABwxhlnQJZl/OlPf8Ljjz+Os846C2vWrMGRRx6JSqWC448/HieeeCI2btyIe+65B6eccgpefvlldHR0tHyeDzzwALq7u/HHP/4R27Ztw6pVq3bXS8rZxdisvbQxKQgCIpEISbe2g2EYGBkZwdDQUFMPHZgNeOvXr8e2bdvw4IMPol6vkyIbk371+XwIBAJN2W5jWb5er+Oll15CpVIh5zOfz4cjjzwS/f39CAQClEEXCgWa/E4mk/D7/dA0rSmQB4NBuN1uPPPMM/j5z38O0zRpatxut+OEE07APvvsg2q1ClVV6aDRGJwNwyCHOMuyKDNgDm+BQKDt6XUO5/XM5z//eXz/+9/HCy+8MM8N8J//+Z+x33774eabb8aOHTswPDyM7du3k2ok4+yzz8Zf//pXPPnkkwve7tprr8W9996Lv//97wCAgYEBXHnllTjjjDMAAN///vfx5S9/GTt27MDWrVsxOjradB9nnXUWdF3Hxo0bcdNNN+Gmm27Cpk2bqHJ2xBFH4IorrsB73vOels/zxBNPxJo1a/DrX/8ap5xyCultcPZ8eMl9GTgcDtxwww1kovLUU09BFEU89dRTWL9+PR577DFccMEFUBQFfr8fiUQC4XAY0WiUytFut5tkUlkZnvWos9ks0uk0SbUODw/D5XKhVqtB0zRs374dL730EgqFAmKxGPbbbz+sWrUKTqcTxWKR9NlZaY4dHOr1OkZHR7F69WpEIhGMjo6iv78fmUwGhUKBSuupVIqCuaZpKJVKyGazkCSp6TUIh8Po6OhAMBjkwZyzV2CaJjZu3IiLLrqopbXvPffcg69//etL3o/H41lyPbRxmHR6ehoTExM49thj6XNHH300xsbGkE6n8fjjj6O/v7/pQHD00UfjT3/6EwDgkUcewUknndTUBvvLX/6yYDAvlUr43//9Xxx77LE44YQT8L3vfY+GUR988EFKCBgPPfQQwuEwZFmGZVm46qqr0NPTg2g0ive9730YHx+n29psNlx22WVIJpM48cQTAQAbNmzAvvvuS++Bn/70p2llFwC++c1vore3F+FwGOvXr8fb3vY2/H/t3XdYU9f/B/B3QiCQsAQUQkBQAfdCrXGhfsVd967irKhFxWJttdQC7rZaxYkDcc9q3eKoFUW0FUfFDSIiSgpShkgGJOf3B797SoTgJpGe1/PwPObem9wPkZtPzrnnfM6mTZsAFH+uBQYGwsHBAQ4ODhgxYgStdPlfxRL6G+rfvz/WrFmDO3fuwM/PDzKZDH5+frh58yZmzpyJPn360PvbDg4O9P64iYkJioqKkJubi7///hv5+fn0Hhyfz0dmZiaSk5MBAKamprRVz+PxkJSUhKdPn0Kr1UIqlaJ+/fqQSqUoLCzU+VLAJfKypomZmZnB1taWzgdXqVTg8/mwt7dH1apVYW5uDkIInUqXmZlJl2nliMViVKtWjY6oZ5j/igcPHiAzM1PvfWWJRFLubSdCCM6ePYvt27dj4MCBeo97/PgxNmzYgBEjRgD4d9yOs7MzPYYrgZyWlob09HSdfdz+tLQ0AEBycjKqVq0Kf39/ODk5QSaT4cKFC3rPv3//fpiYmMDX1xd9+vTBw4cPcf78eQDFvRBisRjHjx+nx+/btw+9e/eGhYUFVq5cie3bt2PHjh24dOkSHB0d0aVLFxQWFtLjDx8+jAsXLmDRokWIiYnB1KlTsWDBAty/fx8RERGIjIzEwYMHAQDbt29HSEgIli1bhosXLyIlJQUxMTH0tb799ltcvnwZx44dw++//47c3FwMGjRI7+/2X8Duob+h9PR0NGrUCD/88APGjBkDABg2bBhkMhm91+To6KjzLVylUtH713w+n3aFFxQUQC6X6yx/KpfLoVQqUVBQAHNzc6jVajRs2BCurq6wtLSkrXtutTaRSARLS8tyB6KJxWKkpqZCo9HQwXACgQCurq50ytyLFy9oAReBQACBQACNRkO76V91DoapzLhppnZ2dnTb6dOn6SqIAODm5qYzOK5+/fq0B0ulUqFatWoIDAyk975fPk6r1UKhUMDDw4OuuMi1hktWSeT+rVKpUFBQUKqColAohEqlAlB833/RokUIDAzE8ePHsWvXLnTp0gV3796l9/dL2rlzJzp37gyRSIQWLVrAxcUFmzdvho+PDwQCAQYMGIB9+/ZhwIAB0Gg0OHDgADZs2AAA+PHHH7F69Wp06NABQHHBLYlEgujoaPTq1QtAcens2rVrAwCuXLmCyMhI9O/fHwDg7u6OJUuW4NatW+jfvz9WrVqFadOm0SS9efNmuLi40Pdl5cqViI+PR8OGDQEU95LY29sjISGBbvuvYQn9DZW1OMvOnTuxc+dOAEBISAhCQ0Oh1WpRUFCAgoICOrDN1tYWPB4PeXl5SEtLw/Pnz6HVaulKYlKpFFevXkVOTg4tBmNnZ4caNWrAzMwM2dnZUKvVMDExgZWVFV2itSxc1TpuDry1tTVdetXExISuh85Ng+NG4nLLvALFXwTEYjFL5MwH17x5c511DyqCk5MT4uPjX+vYKlWqAIDOaoncQDiguGW7evVqneccO3YMUqkUqampCAgIQOPGjREcHFzqeuKO02q1kMvlmDdvHtq1a4e//vqLDgRVqVQ6/waKv8xzKy2WxA2SBYrHujRt2pR+ZjVt2hQnT57E1q1b8e233+o8Ty6X4+zZs1i/fj2A4i7yfv36YdOmTVixYgVEIhGGDh2KPn36QK1WIy4uDmq1Gl27dkV+fj7S0tIwZMgQnc8khUKB+/fv08clbw1w1TNDQkJw69YtJCQkIDExEV27dgUA3LhxA7NmzdL5P+C+DCQnJ0OtVqNVq1Y6v4NWq8X9+/dZQmdez4QJE9C1a1c8fvyYdodxU9FcXFzg7OxMp3MRQiAUCiEUCqFQKPDo0SPk5OSgsLAQAoEAtra2dC45IQR///03qlWrBhcXFxQWFtLV1dLS0iASiei659wo9bJwy7AWFBRAq9XCzMwMNjY28Pb2pnPHgeJR7f/88w8dPa7VaqFWq2kPglgsZt3qTIWRy+V48uSJocPQy8PDA/b29oiLi0OLFi0AFCdUDw8PAChzxLibmxvc3d3h4eGBI0eOoHHjxpg+fTqWL19e5nEA4OXlhc2bN8PZ2RmnTp2Ct7c3gOL3hzuG++IjkUgglUpLfRGSy+V0Ro5EIkGdOnV09nt5eeHx48el4t2zZw80Gg3Gjx+P8ePHAwAdCPvrr79i+PDh8PHxgaWlJU6dOoXo6Gj069eP9jYCwN69e2nS5ZTs1Sg5U+XEiRPo27cvRo4cie7duyMkJARffPEF3S8QCEoVk+Iec9P6YmNjS63u+F9elZEl9DckkUigVquRnZ2NRo0awdTUFEqlEnl5eTr107k/Rq7YC1cMxtraGlWqVKED5LjpahqNBjk5OXBzc4O9vT2USiUKCwvp0qbVqlXTO5iGq6hWUFBAkzI3ol4gEKCoqAhPnjyBUCikXwZ4PB4d3MOtbmZra0vrzTNMRXJycjLqc3ILKC1btgxjx46FlZWVzv5XfRmpVasWwsLCMGPGDAwfPhwtW7bUeyyXtDQaDZydnVG9enXExsbShB4bG4vq1atDIpFAJpPh0aNHSEtLo93RsbGxkMlkAACZTKZz3xkA7t69i88++6zUeXft2oVOnTph2bJlOtv79u2LzZs3Y/jw4eDz+Rg0aBCOHj2KI0eO0O52rnS1XC5Hz549ARQ3GoYOHYoZM2aUakkDwPr16zF27FisWrUKQHGSfvDgAf73v/8BKL4VceXKFTqALi8vD0lJSfT9NDExQVZWFpo0aQIAyMjIwLhx47B06dJS/z//FSyhv4WMjAyo1WqoVCpkZWXRe9CFhYU0SSoUCtoVZmlpCalUCktLS4hEItqKzs7OpnPUTU1NYW9vj1u3btG53lzFNVdX11LJnBBC1zYv2RvAteCB4q437n67UqmEQqGAhYUFVCoVCCEwNTWFQCCghVwYxlBet+vbkEJDQ3H+/Hm0atUKoaGhaNasGTIzM7FhwwZERkaWmSRLCgwMxMaNGzF58mT88ccfdHtmZia9ZrOysvDdd9/BwcEBHTt2BABMmjQJ33zzDU3YM2fOxPTp0wEANWvWRNeuXeHn54fw8HBcvnwZO3bsoEl84sSJWLFiBUJDQzFixAhs2bIFycnJdNAdJyUlBRcvXsTevXvRoEEDnX0TJkzAzJkz8eTJE0ilUgwdOhSdO3eGhYUFTb5A8RLPwcHBqFatGurUqYO5c+fiwoULiIyMLPP94Ho8EhISwOfzsXDhQqSnp9PPzSlTpmDixIlo3Lgx6tati++//56uhWFlZYXx48dj0qRJWLduHapVq4agoCA8evRIpxbAfw1L6G9BpVIhPT0dz58/R0FBAcRiMQoLC2FmZgZCCDQaDW0BW1tbQyQSwcTEhNZw12q1MDU1pSuVca1rKysrFBUVQS6Xw8bGBikpKbCysoKDgwM9t1qthkKhgEKhoIPbuCpzJiYmtJa7Uqmk++3t7SEWi5GZmYn8/Hy6KIudnR27P84wr0kkEiEmJgbLli3D3LlzkZiYCKFQiJYtW2Lfvn06A+TKIhAIsHz5cvj6+mLjxo3w9fUFAHzyySf0GGtra7Rt25ZOBwOAGTNmICMjA/369YNAIMC4cePw5Zdf0uds2bIFn3/+OVq2bAmJRIKNGzfS13Rzc8OJEycwdepULFq0CHXr1sXRo0chlUp1Ytu1a5fOdLKSxowZg9mzZ2Pr1q2YOXMmZDIZHBwc0K1bN52GxldffYXnz5/D398feXl5aN68OU6cOEHHH7wsNDQUo0ePhkwmg42NDXr06IFJkybh2rVrAIChQ4ciKSkJEydOhFKphL+/P9zc3Oh03CVLluCrr77CgAEDUFhYCB8fHxw7duw//ZnGCsu8QWEZTlxcHE6dOkUHnuTl5SE7OxsymQytWrWig8mEQiFNwIWFheDz+XQwWlFREV1AxdzcHBYWFsjJyUFycjIUCgVyc3NhY2MDCwsLSKVS2NjY0CTOFamxsLCAQCCASqWCUqnUSeJCoRA8Hg9FRUV00Bs3+I61xhmGMXYxMTGoWbMmHY1fVFQEBwcHHDhwgI6kZ3SxFvpb0Gq1sLW1pcVcLCwsULVqVTg4OMDZ2blU2VcukXN13bl10LmV1rh71gqFglZ9UyqVUKlUyMnJQXp6Ol1UxdzcnC70wpVq5VZxs7CwoF8WuMpu3KA4bh/DMMzH4MCBA4iLi0NERASsrKwQHh4Oa2trOj6AKY0l9LfEFXLhFiPhWtzZ2dl0UAuXQLm651xL3MzMrNTAs6KiImi1WmRkZEAkEunc43Z2dkaVKlVodzo3rYxb3Yx7fslueK6E66uqUjEMwxijOXPmICAgAJ07d4ZCoUDr1q0RHR3N1nQoB/u0fwvm5ubIy8tDTk4ObaGbmZnB09OTJm9u9SRzc3OYm5vrLD0KFLfyVSoV/eHuu3PT1/h8PrRaLaytrVFUVIRnz57Rlj33B83VbueSv1gsZkmcYZhKwcrKClu2bDF0GB8V9sn/FhQKBeRyOTIyMgAUj0y1sbFBUVERvUfNrazG4eZ5q1QqqNVq2soWCAT0WJVKhadPn9IpayYmJhCLxXSBF65YDFclTigU6gyIYxiGYf67WEJ/C5mZmTA1NUWzZs3oVLC0tDRoNBpaREGj0UChUNAkzhVCMDExgZmZGV0SlTtOq9UiMzMTWq0WderUoV3yz549g1wup2ufc0lcKBSye+IMwzAMxRL6WygoKICdnR3EYjFsbW2hVqthZ2eH7Oxs/PPPP1Cr1TrLjHJd5Vy9Zm7eOFdulSvmkpWVRavKcfu5Uq3lFZZ5HUqlkq4vbmFhwdYXZxiGqWRYQn8LLi4uyMjIgJmZGfLz82n9cxsbG6jVanr/nGuBc61zbtETblUmQggKCwtpOVageHAbV0XO1NQU2dnZcHBweOdknpaWBpVKBTMzM1rf3cXFhSV1hmGYSoIl9LdQp04dpKSkICMjAwKBALm5ubCzs4Onp6dOy5z7AUDnhHPTzIDiZVK5kepmZmaws7OjiRcoXilJKBTCxsbmneLNzc2FSqWiBR7EYjGys7ORm5vLEjrDMEwlwRL6W3ByckK3bt1w5coVPHnyBDVq1ICnpyckEgntKucKunC4lc5EIhFMTU3pPfSSBAIBXFxcaNe4tbX1e+kaVygUpUbZm5mZ0cF1DMMwzMfPqEZVKZVKjBs3Dra2tpBIJFiyZIneY69du4aWLVvSdXuvXLlSgZEWJ/V27dqhd+/eaNmyJezs7Oj0M6B4BTZbW1tUrVoVEokE1apVg62tLcRicZnz0Dnm5uZwdHSEu7s7HB0d30sL2sLCAmq1WmebWq2mXf8MwzDMx8+oWugzZsxAfHw8zpw5g0ePHmHUqFFwc3PDwIEDdY578eIFevTogeHDh2PTpk2IiIhAz5498eDBA4jF4gqLl0vMJbvXjXGlMhsbGzx//hzZ2dkwMzODWq1+L135DMMwjPEwmlruL168gIODA44fP07r9M6bNw+nT5/G2bNndY7duHEj5s2bhwcPHtBiLF5eXggODsbo0aNf63zvUsv9Y8RGuTMMw1RuRtNC/+uvv1BYWIjWrVvTbW3btsX8+fOh1Wp15lxfunQJbdu2pa1hHo+HNm3a4OLFi6+d0N/VjRs3cPr0aaSmpqJ69erw9fVFo0aN3vl1U1JScPXqVTx9+hTOzs7w9vam6yC/C65iHcMwDFM5Gc099PT0dDg4OOgM3nJ0dIRSqURWVlapY52dnXW2OTo6Ii0trUJivXHjBsLDwxEXF4e8vDzExcUhPDwcN27ceKfXTUlJwe7duxEfH4/nz58jPj4eu3fvRkpKyvsJnGEYhqm0jKaFXlBQUGpZT+4xN43rVce+fFxJXM10Tl5e3lvHevr0aeTm5qJJkyZQqVSQSqW4ceMGjhw58k6t6djYWGRkZKBu3boAgKpVq+LOnTuIjY2lFegYhmGYf1lZWRnl2CVDMJqEbm5uXiohc4+5dcdfdezLx5W0cOFChIWFvZdYU1NTYW1tjRcvXmDRokV0+6FDhxAcHPxezsEwDMO8WkZGBqpWrWroMIyC0SR0qVSKZ8+eoaioiBZjkcvldPrXy8fK5XKdbXK5HBKJRO/rz5o1C0FBQfQxtza5lZXVG8e6bNkyAMUFWxYtWoTHjx9/FAPr8vLy4OrqyuL9QFi8HxaL98P6WON9ucbGf5nRJPQmTZrA1NSUDngDirugW7RoUWoREplMhkWLFtEiLoQQXLhwodzWsVAoLNVN/664bh5ra+uP4gLgsHg/LBbvh8Xi/bA+tnhZd/u/jGZQnEgkwqhRozBx4kRcvnwZBw4cwOLFixEYGAiguAXOVTYbOHAgcnJyMG3aNNy+fRvTpk3DixcvMHjwYEP+CgzDMAxjMEaT0AHg559/RrNmzdCxY0cEBAQgLCwM/fv3BwBIJBLs3r0bQPE3yCNHjuD8+fNo1qwZLl26hGPHjlVoURmGYRiGMSZG0+UOFLfSN2/ejM2bN5fa93L9m08++QRXr16tqNDKJBQKERIS8t678j8UFu+HxeL9sFi8HxaL9+NnNJXiGIZhGIZ5e0bV5c4wDMMwzNthCZ1hGIZhKgGW0BmGYRimEmAJ/R317NmzwhaEeRcqlQoBAQGoUqUKHB0d8e2335YaaGhMHj9+jE8//RTW1tZwd3enxXyMjUqlQoMGDXRWBHz48CF8fX0hFotRr149nDx50nABvqSseC9duoTWrVvD0tIStWvXxoYNGwwX4EvKipeTm5sLqVSKTZs2VXhc+pQVb2pqKnr06AGRSAQPDw/s2bPHcAG+pKx4udlDYrEYTZo0wenTpw0X4P978uQJBg4cCDs7O0ilUgQFBUGpVAIw7uutorGE/g527dqFY8eOGTqM1xIYGIhTp07hxIkT2LFjB9avX49169YZOiy9Bg8eDEtLS1y5cgXh4eEIDg7Gr7/+auiwdCiVSgwbNgy3bt2i2wgh6Nu3L5ycnBAfHw8/Pz/069cPqampBoy0WFnxyuVydO/eHR06dMC1a9cQFhaGKVOm4OjRowaMtFhZ8Zb0zTff4OnTpxUclX5lxVtUVISePXvC1NQU165dw4wZMzBixAjcvHnTgJEWKyvejIwM9OrVC0OHDkVCQgIGDx6MPn36VNjCV2UhhGDgwIEoKCjA+fPnsWvXLhw+fBizZ8826uvNIAjzVrKysoiLiwtp0aIFGTVqlKHDKVdWVhYRCATk7NmzdNvChQvJmDFjDBiVfv/88w8BQBISEui2/v37k4CAAANGpevWrVukcePGpFGjRgQA+f333wkhhPz2229ELBaT/Px8emynTp1ISEiIYQL9f/riXbNmDalTp47Osf7+/uSzzz4zQJT/0hcv5/z588TDw4M4OTmRqKgog8RYkr54Dx48SGxsbEhubi49tk+fPmTt2rUGirSYvnj3799P7O3tdY61s7Mje/fuNUCUxe7cuUMAELlcTrft2LGDODs7G+31Ziishf6WvvrqK/j5+aFevXqGDuWVYmNjYWNjg/bt29NtM2fOxMaNGw0YlX4WFhYQiUSIiopCYWEh7t27hwsXLqBp06aGDo2KiYlBx44dcfHiRZ3tly5dgre3t06Ro7Zt25Y6rqLpi7dbt26IiooqdXxubm5FhVYmffECxd3E48ePx6pVq4xmDrK+eM+ePYtOnTrplFI9cOAA/P39KzpEHfritbe3R1ZWFvbv3w9CCA4cOIDnz5+jYcOGBooUcHJyQnR0NBwdHXW25+bmGu31ZihGVVjmY3HmzBmcO3cOCQkJmDRpkqHDeaXk5GS4u7tjy5YtWLBgAdRqNcaMGYPg4OBSdfKNgbm5OVatWoXJkycjPDwcGo0Go0ePxrhx4wwdGqXv/z09PR3Ozs462xwdHQ3aZQnoj9fd3V1nyd+MjAzs2rULoaGhFROYHuVdVwsWLEDTpk3RpUuXCoyofPri5a69mTNnYuvWrXBwcEBYWBj69u1bsQG+RF+87dq1Q0BAAAYOHAg+nw+NRoOoqCjUrl27giP8l62tLbp27Uofa7VarFy5Ep06dTLa681QjO/T3MgplUpMmDABq1atgoWFhaHDeS35+flITEzE2rVrERUVhcWLF2P58uVYunSpoUPT686dO+jVqxcuXbqEqKgo/PLLL9i+fbuhw3qlgoKCUq1GoVBYarlfY6RQKDBgwAA4OTlhwoQJhg6nTLdv30ZERIRR/+2WlJ+fj02bNiE7OxuHDx/GyJEjMXDgQMTHxxs6tDLl5+cjOTkZoaGh+PPPPxEcHIypU6fi7t27hg6N+vrrr3H16lXMnz//o77ePgTWQn9DYWFhaN68uc43RmMnEAiQl5eHHTt2wM3NDUDxyNvVq1dj+vTpBo6utN9++w0bNmxAWloaLCws0Lx5czx58gTz5s3D8OHDDR1euczNzZGVlaWzTaVSQSQSGSii15Ofn48+ffrg/v37iI2NNcp4CSEYP3485syZU6r71VgJBALY29tjzZo14PP58Pb2xvnz57Fu3To0b97c0OGV8uOPP4IQgu+//x4A4O3tjT/++APh4eFYs2aNgaMrHgi5bNky7N69Gw0aNPhor7cPhbXQ39CuXbtw4MABWFpawtLSEtu3b8f27dthaWlp6ND0kkgkMDc3p8kcAGrXro3Hjx8bMCr9rly5Ak9PT50ekKZNm+LRo0cGjOr1SKVSyOVynW1yuRwSicRAEb1aXl4eunbtips3b+LMmTPw9PQ0dEhlSk1NRVxcHKZPn06vv9TUVEycOBHdu3c3dHhlkkgk8PLy0rm1ZezXXuPGjXW2Gcu1N2XKFCxZsgTbtm3DgAEDAHyc19uHxBL6Gzp79iwSEhJw/fp1XL9+Hb1790bv3r1x/fp1Q4eml0wmg1KpxP379+m2O3fu6Nw7NSbOzs5ISkqCWq2m2+7evYsaNWoYMKrXI5PJcPXqVbrUL1A8KFEmkxkwKv20Wi369++P5ORkxMTEoH79+oYOSS+pVIrExER67V2/fh3Ozs6YM2eOUc2dL0kmk+HmzZvQaDR0m7Ffe7dv39bZZgzXXlhYGCIiIrBr1y4MHTqUbv/YrrcPzsCj7D96o0aNMvppa4QQ0rNnT9KqVSty/fp1Eh0dTapWrUrCw8MNHVaZcnJyiJOTE/Hz8yP37t0jhw4dIvb29iQiIsLQoZUJJab9FBUVkXr16pEhQ4aQmzdvkoULFxJLS0vy6NEjwwZZQsl4161bR/h8Pjly5AhJT0+nP1lZWYYNsgSUMW2N4+bmZhTT1koqGW9ubi5xdnYm/v7+JDExkaxatYoIBAJy5coVwwZZQsl4L168SExMTMjPP/9MHjx4QJYuXUpMTU3JzZs3DRbf7du3iYmJCfnuu+90/kbT09M/iuutIrGE/o4+loSek5ND/Pz8iKWlJalWrRoJCwsjWq3W0GHpdevWLeLr60usra1JrVq1yNKlS4023pcTTmJiIvHx8SFCoZDUr1+fnDp1ynDBlaFkvF27diUASv20b9/eoDGW9DEndEKK/5a5vwcvLy+yb98+wwVXhpfjPXjwIGncuDERi8XE29vb4H+/CxcuLPNvlGuPGvv1VpHY8qkMwzAMUwmwe+gMwzAMUwmwhM4wDMMwlQBL6AzDMAxTCbCEzjAMwzCVAEvoDMMwDFMJsITOMAzDMJUAS+gMwzAMUwmwhM5UKlqtFpGRkejYsSPs7e0hFArh7OyMvn374siRI2U+R6lU6iy3uGnTJvB4PIOVE3V3d4eLi4tBzv2+JCYmfrDXnjx5ss7yox06dACPx0NKSore54wePRo8Hg9nz559o3MVFBTA1dUVe/fufbtgGaYCsYTOVBpcXfLx48dDLBZj1qxZWL16NSZMmICbN2+iV69eCAwM1HlOfHw8vLy8cPr0abrNx8cHW7duRceOHSv6V6gU5s2b98FqwsfExGDDhg1YvHjxB3n9l4lEIixcuBABAQF49uxZhZyTYd4WWz6VqTT27duHgwcPYs6cOZg9e7bOvlmzZqF9+/ZYvnw5hgwZgtatWwMArl+/Xmrlq5o1a6JmzZoVFndlEx0djcLCwvf+ulqtFhMmTMDIkSPh4eHx3l9fn+HDh2PRokX4+uuvsXHjxgo7L8O8KdZCZyqNc+fOAQA+/fTTUvvMzMzw1VdfAShu5TEfn3379uHevXuYPHlyhZ6Xx+Phiy++wLZt23RuzTCMsWEJnak0rK2tAQBr1qxBUVFRqf39+vVDYWEhZs2aBaD4vur48eMBAGPGjAGPxwNQ9j10Ho+HyZMnY+fOnWjSpAnMzc3h6uqKefPmgRCCX375BU2bNoWFhQU8PDxKdQlz93lfjuv06dPg8XgIDQ3V+3uFhoaCx+Pp3BYAgKKiIvB4PHTo0IFu02g0mDNnDho2bAixWAxbW1t07NgRhw8ffsW79+95Dh8+jHr16kEoFKJt27YAAEII1q9fj3bt2sHW1hampqaQSCQYNmwYkpKSdN6nCxcu0H+PHj2a7nvy5An8/f3h4uICMzMzuLm5YerUqcjKynplbACwZMkSNGjQAI0aNXqt48vD/R/r+3l5edMhQ4ZAo9EgPDz8nc/NMB8K63JnKo0xY8YgPDwc69evx+HDh9G7d2/4+Pigbdu2cHNzA5/PB5//73fYCRMmQCAQIDIyEv7+/mjXrl25r3/o0CHs2LEDU6ZMgb+/PyIiIjB79mz8+eefiIuLw+TJk+Hv74/Vq1djxowZcHV1xZAhQz70r60jKCgIK1euhL+/PwIDA5GTk4O1a9eiT58+OHLkCHr06PHK1xg+fDjGjh0LLy8vmJqaAgCmTZuG5cuXo1+/fli4cCEIITh//jx2796NuLg4JCUlwdTUFFu3bsXcuXNx//59bN26FbVq1QIAPHz4EK1bt4ZKpcKECRPg7u6Ov/76CxERETh+/DguXrwIBwcHvTGlp6fjjz/+QFBQkN5jsrOzYWlpWeY+lUql85gbJ/GyyMhInD17FgMHDtTZbm9vD29vb/z666/46aef9MbAMAZl0LXeGOY9i4uLI7Vr1y61zKKHhweZPXs2ycvL0zl+/fr1BIDOEpxRUVEEAFm/fj3dxr1OXFwc3Xb16lUCgPD5fJ31rRMSEggAMmLECLqtffv2BAApLCzUOf+pU6cIABISEkK3ubm5EalUSh+HhIQQAKWWhSwsLCy11KlYLCbdu3fXOS41NZXUqlWLhIWFlfPO/XsePz8/ne3Pnj0jAoGA9OrVq9RzBg0aRACQy5cv021t2rQhL3+0dO/enVhbW5OkpKQyf/9JkyaVG9u2bdsIALJ58+ZS+7j39nV+9C3DSgghe/fuJTwej/Tq1YtoNJpS+z///HMCgKSkpJQbK8MYCmuhM5VKq1atcPv2bcTGxuL48eOIiYlBfHw8kpKSMHfuXGzZsgXnzp1D9erV3/i1q1evjlatWtHHdevWBQB4eHjA29ubbvf09ARQ3MVc0VxdXRETE4OlS5eiX79+cHd3h6urq063+Kv4+vrqPLa3t0dubm6p2wU5OTkQiUQAgLy8PL2vl52djRMnTqB79+6wsbHRGS3epEkT1KxZE/v378fq1av1vgY3Da68wXDbtm2Do6Njmft++uknnDx5Uu9z4+Li4Ofnh8aNG2Pnzp06PTkc7txJSUlwc3PT+1oMYygsoTOVDp/Ph4+PD3x8fAAA+fn5OHbsGObMmYNbt25h2rRp2L9//xu/rpOTk85jgUBQ5nYTExMAxaOyK1pkZCQGDx6MoKAgBAUFoVatWujSpQuGDh1K349XKSspmpub49ChQzh06BDu37+PlJQUPHnyhI47KO93TUxMhFarxdGjR1G1alW9xymVSpibm5e5LzMzEwBgY2Oj9/lt2rQpde+bs23btnLj6927N+zs7HDkyBGIxeIyj7O1tQUAZGRk6H0thjEkltCZSuHFixdYsGABXFxcMGnSJJ19lpaWGDx4MLp06YIaNWrgt99+e6tzcPeTX8YltbdR1uC9d3lu69atkZycjDNnziA6Ohq///47IiIisGbNGgQFBWHJkiWvfF3uCwlHrVajS5cuiImJQYsWLdCsWTMMGTIE3t7eOHr0KBYuXFju63HJvm/fvggICNB7HPcFqSxci1mj0bwy/jeRmZmJ7t27Q6FQ4OTJk5BKpXqP5c798vvDMMaCJXSmUrCwsMDSpUtha2uLzz//vMzka2trCzc3N/z9998VHh+XrFQqlU7iksvlb/Tckl5+rlKpxI0bN2BnZ4du3bqhW7duAIoHpHXq1AnLli1DSEgInQ3wuvbs2YOYmBjMmDEDP/74o86+TZs2vfL5NWrUAAAoFIpS3fkAcPDgQdjZ2ZWb0CUSCQC81+IuCoUCvXv3xsOHD7Fv3z6d2yZl4XoJuFgYxtiwaWtMpcDn8zF27Fikp6dj+vTpZbZez507h4SEBAwaNIhuq6jucWdnZwDFlek4Wq0W27dvf6vnAsCWLVt0HmdmZkImk2Hq1Kk622vUqAGJRAIej/dWrUsuiTZs2FBne1JSEn755RcAur0FL7+njo6OaNu2LU6ePElrBXCOHz+Ovn37YtGiReXGwH0pePTo0RvHXxatVosRI0bg0qVL+OGHH3RKyerDnZuLhWGMDWuhM5XGDz/8gISEBKxYsQInTpzAoEGDUKNGDSiVSly4cAF79+5F06ZNMW/ePPoc7n7xtm3bQAjByJEjP0hso0aNwtatWzFs2DB8+eWXEIvF2Llz52vNwe7fvz8CAwMxf/58vHjxAl5eXoiJiUF0dLTOPWlXV1eMHTsWkZGR6NatG3r16gU+n4/o6Gg6rU7f/eHydO3aFUKhEEFBQUhJSYGzszNu3ryJjRs30opwOTk59HjuPQ0JCUH79u3h6+uL1atXw8fHB507d4a/vz8aNmyIu3fvIiIiAvb29q8s5dqlSxeYmJjgwoULGDNmzBv/Di/77rvvsH//fshkMtSsWRM7duwo9aWuc+fOOuMJYmNj0aBBg4++zj5TiRl6mD3DvE8ajYZERUWR7t27E4lEQszMzIiNjQ2RyWRk6dKlRKVS6RyvVqvJZ599RkQiEbG0tCT37t3TO22tTZs2Os8ta9pYedu3b99OmjRpQoRCIXF0dCQBAQEkKSnpldPWCCHkzz//JJ07dyZisZhYWVmRXr16kbt375L69evrnEetVpPFixeTRo0aEWtrayISiYi3tzdZsWJFmVOxStI3PY4QQk6fPk3atGlDrK2tibW1Nalfvz4JDg4m165dIwDIqFGj6LHXrl0jDRo0IKampsTX15duf/DgARk9ejSRSCTE1NSUVK9enYwcOZIkJiaWGxfHx8eH1KxZs9R2btraw4cP9T531KhROtPWXmeqW8kpbmlpaQQACQ4Ofq1YGcYQeIQQUtFfIhiGYd7Unj17MGTIEMTExLz2iP33Zf78+QgLC0NSUtJbTXlkmIrAEjrDMB8FrVaLhg0bomnTpuVOQ3vfNBoNPD090blzZ6xdu7bCzsswb4oNimMY5qPA5/OxbNky7N69G7dv366w80ZFRSE3N7fcevsMYwxYC51hmI/KpEmTkJqaiqNHj37wc7148QKenp5YunRphdflZ5g3xRI6wzAMw1QCrMudYRiGYSoBltAZhmEYphJgCZ1hGIZhKgGW0BmGYRimEmAJnWEYhmEqAZbQGYZhGKYSYAmdYRiGYSqB/wPl31mkNkLgowAAAABJRU5ErkJggg==",
- "text/html": [
- "\n",
- "
\n",
- "
\n",
- " Figure\n",
- "
\n",
- " \n",
- "
\n",
- " "
- ],
- "text/plain": [
- "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "mouse = \"GRB006\"\n",
- "fig, ax = plt.subplots(figsize=(5, 5))\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
"\n",
- "plot_single_mouse_psychometric_fit(\n",
- " mouse_id=mouse,\n",
- " ax=ax,\n",
- " plot_mode=\"both\",\n",
- " sessions_list=behavior_ephys_sessions[mouse],\n",
+ "REPO_ROOT = (\n",
+ " Path.cwd().parent if Path.cwd().name == \"psychometric_curves\" else Path.cwd()\n",
")\n",
+ "for path in [REPO_ROOT, REPO_ROOT / \"src\"]:\n",
+ " if str(path) not in sys.path:\n",
+ " sys.path.insert(0, str(path))\n",
"\n",
- "# plt.title(f'Psychometric Fits for {mouse}')\n",
- "ax.legend(frameon=False, fontsize=10)\n",
- "ax.text(4, 0.89, f\"n_sessions = {len(behavior_ephys_sessions[mouse])}\", fontsize=10)\n",
- "separate_axes(ax)\n",
- "# plt.savefig(pjoin(save_dir, f'{mouse}_ephys_psychometric_fits.svg'), format='svg', dpi=300)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Multi-animal psychometric fit plotting"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 95,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Calculating average fit for mouse GRB005 with 12 sessions...\n",
- "Combined data: 3400 trials for mouse GRB005\n",
- "Successfully fit average curve for mouse GRB005\n",
- "Calculating average fit for mouse GRB006 with 81 sessions...\n",
- "Combined data: 28103 trials for mouse GRB006\n",
- "Successfully fit average curve for mouse GRB006\n",
- "Calculating average fit for mouse GRB026 with 25 sessions...\n",
- "Combined data: 6965 trials for mouse GRB026\n",
- "Successfully fit average curve for mouse GRB026\n",
- "Calculating average fit for mouse GRB027 with 28 sessions...\n",
- "Combined data: 10611 trials for mouse GRB027\n",
- "Successfully fit average curve for mouse GRB027\n",
- "Calculating average fit for mouse GRB036 with 25 sessions...\n",
- "Combined data: 6324 trials for mouse GRB036\n",
- "Successfully fit average curve for mouse GRB036\n",
- "Calculating average fit for mouse GRB037 with 42 sessions...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Users/gabriel/miniconda3/lib/python3.10/site-packages/statsmodels/base/model.py:595: HessianInversionWarning: Inverting hessian failed, no bse or cov_params available\n",
- " warnings.warn('Inverting hessian failed, no bse or cov_params '\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Combined data: 12521 trials for mouse GRB037\n",
- "Successfully fit average curve for mouse GRB037\n",
- "Calculating average fit for mouse GRB038 with 39 sessions...\n",
- "Combined data: 12185 trials for mouse GRB038\n",
- "Successfully fit average curve for mouse GRB038\n",
- "Calculating average fit for mouse GRB039 with 12 sessions...\n",
- "Combined data: 3416 trials for mouse GRB039\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Users/gabriel/miniconda3/lib/python3.10/site-packages/statsmodels/base/model.py:595: HessianInversionWarning: Inverting hessian failed, no bse or cov_params available\n",
- " warnings.warn('Inverting hessian failed, no bse or cov_params '\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Successfully fit average curve for mouse GRB039\n",
- "Calculating average fit for mouse GRB041 with 17 sessions...\n",
- "Combined data: 4473 trials for mouse GRB041\n",
- "Successfully fit average curve for mouse GRB041\n",
- "Calculating average fit for mouse GRB045 with 12 sessions...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Users/gabriel/miniconda3/lib/python3.10/site-packages/statsmodels/base/model.py:595: HessianInversionWarning: Inverting hessian failed, no bse or cov_params available\n",
- " warnings.warn('Inverting hessian failed, no bse or cov_params '\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Combined data: 4182 trials for mouse GRB045\n",
- "Successfully fit average curve for mouse GRB045\n",
- "Calculating average fit for mouse GRB046 with 17 sessions...\n",
- "Combined data: 5527 trials for mouse GRB046\n",
- "Successfully fit average curve for mouse GRB046\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3d78c5f5811a4109ae3546dedb7e5c2c",
- "version_major": 2,
- "version_minor": 0
- },
- "image/png": "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",
- "text/html": [
- "\n",
- "
\n",
- "
\n",
- " Figure\n",
- "
\n",
- " \n",
- "
\n",
- " "
- ],
- "text/plain": [
- "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "fig, ax = plt.subplots(figsize=(5, 5))\n",
- "mice_list = list(good_behavior_sessions.keys())\n",
+ "from behavior_analyses.psychometrics import cumulative_gaussian\n",
+ "from labdata_plugin.analysisschema import PsychometricSubjectFit\n",
"\n",
- "plot_multi_mouse_psychometric_fit(mouse_sessions_dict=good_behavior_sessions, ax=ax)\n",
+ "ANALYSIS_SET_ID = \"example_analysis_set\" # replace after seeding\n",
+ "rows = (\n",
+ " PsychometricSubjectFit() & {\"analysis_set_id\": ANALYSIS_SET_ID, \"fit_status\": \"fit\"}\n",
+ ").fetch(as_dict=True)\n",
+ "assert rows, f\"No fitted psychometrics for {ANALYSIS_SET_ID}\"\n",
"\n",
- "ax.legend(frameon=False, fontsize=10, loc=\"upper left\")\n",
- "ax.text(\n",
- " 20,\n",
- " 0.1,\n",
- " s=f\"session performance threshold = {int(performance_threshold * 100)}%\",\n",
- " fontsize=10,\n",
- " ha=\"right\",\n",
- ")\n",
- "separate_axes(ax)\n",
- "# plt.savefig(pjoin(save_dir, 'psychometric_fits_all_mice.svg'), format='svg', dpi=300, bbox_inches='tight')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 101,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Calculating average fit for mouse GRB036 with 25 sessions...\n",
- "Combined data: 6324 trials for mouse GRB036\n",
- "Successfully fit average curve for mouse GRB036\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Users/gabriel/miniconda3/lib/python3.10/site-packages/statsmodels/base/model.py:595: HessianInversionWarning: Inverting hessian failed, no bse or cov_params available\n",
- " warnings.warn('Inverting hessian failed, no bse or cov_params '\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Calculating average fit for mouse GRB037 with 42 sessions...\n",
- "Combined data: 12521 trials for mouse GRB037\n",
- "Successfully fit average curve for mouse GRB037\n",
- "Calculating average fit for mouse GRB038 with 39 sessions...\n",
- "Combined data: 12185 trials for mouse GRB038\n",
- "Successfully fit average curve for mouse GRB038\n",
- "Calculating average fit for mouse GRB045 with 12 sessions...\n",
- "Combined data: 4182 trials for mouse GRB045\n",
- "Successfully fit average curve for mouse GRB045\n",
- "Calculating average fit for mouse GRB046 with 17 sessions...\n",
- "Combined data: 5527 trials for mouse GRB046\n",
- "Successfully fit average curve for mouse GRB046\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "edb757ce96d1407795b5cc29178a0d09",
- "version_major": 2,
- "version_minor": 0
- },
- "image/png": "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NF/Lzp07lbm5uapUqZIKCgpSf/75p3JwcFA//PCDUkqpdevWqfz586v169er8+fPq6+++kq5uLioe/fuGc7l4eGhTp48qY4fP65u3rypALVq1SoVFham7ty5o1xcXFSPHj3UmTNn1Jo1a1SePHnU9OnTlVJK+fr6KkDNmzdPHTt2TEVHRysvLy/l5uam/v77bxUYGKjy5MmjcufOrebNm6eCg4NVtWrVVIsWLZRSSu3atUtZW1urVatWqUuXLqk//vhDWVpaqlWrVimllPLx8VEWFhZq6tSp6uLFi2rQoEHK2tpahYeHK6WU6tSpkypVqpTat2+fCgoKUiVLllRffPGFUkqpNm3aqObNm6uTJ0+qQ4cOqXfffVd99NFHab6Phw8fVoA6fPiwio6ONryuzz77TIWGhqrp06crQJ05c8bw+7S1tVX79+9XgYGBSqfTqcqVK6uePXuqs2fPqp07d6rixYurcePGKaWUmj59uipWrJgKCgpSISEhqm7duqp9+/ZG72F65/L19VX58uVTa9euVWfOnFE+Pj7K3d1dRUVFKaWUAtTOnTuVUkp17txZeXt7q6CgILVlyxbl6uqq0ksH0dHR6ubNm2n+JCYmprlPsvfee0998sknRm12dnZq8+bNRm3vvPOO+vrrr5VSSn333XfK3Nxc5cqVSy1YsEAppVS1atXU0aNHn3ouoZQk9JyY0GMfKLX9K6XGWRon81/qKPXfaVNHl22sXr1aWVpaqlOnTimllIqKilLbtm1TCQkJ6qefflIVK1Y02n727NmGthYtWqhGjRqphw/1X5xCQkIM//CWK1dOde/eXcXHxyul9F8cLl26pJQyTugVKlRQI0aMMDpH1apV1fDhw5VS+iT75ZdfGtatXbtWWVhYpPladu7cqQB1/PhxQ9uYMWNUpUqVlFJK1axZU82ePdton4oVKxravLy81LBhw4zWP54gZs2apTw9PVVCQoJh/bx581T+/PmVUvpk4+rqarS/l5eX0evr0KGDqlWrlmF57ty5qnjx4koppQIDA9XSpUtTvRfJidDHx0dVrlzZsC75871//3517949ZWZmZohVKaX27NmjZs+erUJDQ5VWqzUkfqWUOnnyZKq2ZJcuXVKA4ffl6+urPDw8lE6nM2zj5OSkli9frpTS/z47duxoWLdt2zaVN29elZSUZGhbt26dcnZ2VkrpvwiWK1dOhYWFKaWUunz5sgoKCnrmuXQ6nXJ2djYkQKWUio+PV56enmr+/PlKqZTfV3h4uDIzM1N79uwxbDtnzpx0E/rLunjxotJqter0aeN/c7RardqxY4dRW61atdT48eMNy5GRkerBgwdKKaW2bt2qWrRooaKiolT79u2Vp6en+vzzz43eB6EnXe45iU4HJxbB9yUeda/H6dvt3aHtMui+E/KVMm2M2Ujjxo0pW7YsZcuWpWLFikybNo2SJUtibm5OSEgIJ06cwM7OzvAzdOhQzp8/D8CgQYM4cOAAefPmpWXLlhw5coTixYsD+sFkS5YsIW/evHTu3JkrV65QsGDBVOcPCQnh3XeN5wuoVq0aISEhhuVixYoZ/t/BwcHQdZ8WOzs7ypcvb1iuXLmy4VghISEMHTrU6PWcOHHC8HqANGN8PNZKlSphbp4yLKd69ercunWL8PDwdPcvXDilzoG1tbXRNtbW1sTF6f+GK1WqRPny5fH19aVdu3aUKFGCQ4cOGbqq03ovQN9FHRoaSlJSEpUqVTKsr1WrFgMGDCAkJASdToeHh4fhdVerVg2dTkdoaGi6r/dxhQoVMhoh7ujoaOjOf/J1h4SEEBYWhoODg+F8HTt25N69e4SFhdG7d29u3rxJ/vz5adSoEZs2baJkyZLPPNft27e5d++e0d+LhYWF0e842fnz50lKSsLb29vQVqVKlXRf35IlS4z+Lh7/uXr1arr7rVq1Cm9vb0qVMv43x8rKyvB7TRYXF4eNjY1h2d7eHrtHs1eOGzcOX19fvv/+exITEzl37hx79+5l9erV6Z77TSWD4nKKqwf0z5TfOJzSprWAap9D7a/A0t50sWVTNjY2HDp0iN27d7N+/Xr8/f2ZN28eQUFBJCYm0qBBA+bMmZPmvvXr1+fatWusXbuWjRs30rt3b7Zu3crixYvp0qULDRo0YM2aNWzYsIF27doxfPhwJkyYYHQMKyurVMdNSkoySmK5cuV67tfzeLJNPpb20eOJiYmJzJw5kwYNGhht8/hMhGnF86xYH/9vWts8GZM2ncclt27dSqtWrejWrRtNmzbF19eXTz/91GibtN4LpRQWFulP75uYmIijoyOBgYGp1nl4eKS73+PMzMzSPG+yx193YmIib7/9NmvXrk21j6OjIy4uLly+fJmNGzeyYcMGRowYwdKlSw1jJ9I7V3q/myf/XtKL8Wl/Ry1atEj1xTKZu7t7uvtt2bLFMBDucR4eHty6dcuo7datW7i5uaXadtu2bTg7O1OxYkXGjh1L06ZNsba2pn79+uzbt4+2bdume/43kVyhZ3dhofB7O/ilhnEyL9EC+p3WF4mRZP5SDh48yOTJk6lXrx7Tp0/n3LlzxMbGsm/fPkqUKMH58+cpVKgQRYsWpWjRogQEBPDdd98BMGPGDIKCgvDx8WHFihX4+/uzatUqAEaNGsV///3HJ598woYNG5gwYYJh3eNKlChBQECAUVtAQMBLPyIWHh5uNIgpMDCQcuXKGc51/fp1w2spWrQoEydOTHX+9JQoUYKgoCCjHoKDBw+SN2/eDBm5/+OPP/LRRx+xYMECevbsScmSJbl48eJzjTovXLgwZmZmnDhxwtC2du1aKlasSIkSJYiIiECj0Rhed0xMDEOGDEl1FQm88rPaJUqU4OrVq+TNm9dwvkuXLuHr64tGo+G3335j/fr1tG/fnl9//ZUtW7awb98+w3Pv6XF0dMTV1dXo95WQkEBQUFCqv5cSJUpgYWFhNBDuac9229vbG/1dPP7z5BeyZEopjhw5Qo0aNVKtq1q1qtHg0mvXrnHt2jWqVq2aatvkq3PQf9lLHmSZmJgoTxykQRJ6dvXwDmwepC8OE/JYMshbGrr+BZ3Xgkux9PcXz2RtbY2fnx8//fQTly9fZvny5URFRVGuXDk+/PBDoqOj6dOnD2fPnmXTpk0MHDiQfPnyAXD9+nX69+9PQEAAFy5cYOXKlYYRumfPnqV///6cPHmS06dPs2nTpjRH7w4ePJjvvvuORYsWcf78eYYPH86JEyf4+OOPX/o19erVi+DgYFatWsXs2bPp16+f4VwzZ85k0aJFXLx4kWHDhrFixQqj7t6n6dKlC3FxcfTp04eQkBDWrl2Lr68vffv2zZCCJS4uLhw4cIBTp05x+vRpunfvzs2bN9NMuk9ycHDAx8eHgQMHcvjwYQIDAxk5ciQNGjSgZMmSNGnShC5dunDkyBGOHj1K9+7diYqKwsnJKdWxbG1tAThx4gRRUVEv/DoaNWqEl5cXH374IadOnWLv3r307t0bGxsbzMzMiIiIYNCgQWzfvp1Lly6xZMkSChQoQJ48eZ557MGDBzNmzBjWr19PSEgIvXr1IjY2lo4dO6Z6P7p168aAAQM4dOgQu3btyvBiRleuXOHBgweputsB+vbty6JFi/j55585efIk3bp143//+5/hCYJkO3bswNHR0XCrpEqVKvzxxx+cPn2a9evXU61atQyNOUcw4f17k8q2g+JiI5XaOVapiXbGA96+dlUq8AelEhOefQzx3BYtWqSKFy+uLC0tVfHixdWyZcsM64KCglStWrWUpaWlcnd3V6NHjzYMdnr48KHq2bOnyps3r7K2tlZNmjRR//zzj1JKqf/++0+1bdtWOTk5KTs7O9WxY0d1584dpZTxoDil9IPNvLy8lKWlpXr33XfV7t27Deu8vLyUv7+/YTl54Ftaktd9++23ytHRUXl4eKjvvvvOaJvkc1lZWalKlSqp7du3p3supYwHxSmlH9yX/H4UKFBATZgwwfB++Pr6qjp16hjt/+QxfXx8lI+Pj2HZ399feXl5KaWU+vfff1WjRo2UjY2NcnNzUz179lR9+/ZVjRo1SnPfJ+OLjIxU3bt3Vw4ODipPnjyqX79+KjY2Viml1J07d1SnTp2Uvb29yp07t+rcubO6e/dumu+jUkp9+OGHKleuXGrGjBnPfF1P/j6V0g8Wa9asmbK2tlZ58+ZVn376qYqOjlZKKZWUlKSGDh2q3NzclKWlpapRo4ZhdPezzpWYmKhGjRqlXF1dlbW1tWrQoIFhQOeT70d0dLTq2bOnsre3V2+99ZaaNm1ahg6KCwgIUIDhPX6Sv7+/8vT0VLa2tqp169Zpvt916tRRR44cMSxHRESoZs2aKQcHB9WrVy+jgYVCT6PUm9lvERkZiaOjIxEREUb3CbOshFgIWgB7JkL0nZR2c2uoMQSqDwFLO9PFJ7K0Xbt2Ua9ePemmFCIHk0FxWV1iPBz7RT9q/UFKgQk0ZlCpF9QZA/apB5MIIYR4s0hCz6oS4+HEb7B3IoRfNl5XugPUnyD3yIUQQhhIl3tW63JPjIfj/rB3MkRcMV5XogXUGwf5y6e9rxBCiDeWXKFnFfEP4ehPcGAaRF43XlekEdQbDwXeMU1sQgghsjxJ6KYWcx+OzIWAmRB913hd0ab6e+SeqZ/PFEIIIR4nCd1Uwq/ok3jQj5Dw0HhdiRZQa5RckQshhHhuktAz240jcHAGnF4B6rGSjBotlOkENYeDa1nTxSeEECJbkoSeGZIS4ewaCJgB1w4YrzO3hgo9oNpgcC5ikvCEEEJkf5LQX6eo23D0Rwicn3qgm00eeKc/VOkHts8u6yiEEEI8jST0jKYUXN2vr+p2egUkxRuvz1taPwNa2S5gkf7sVUIIIcSLkISeUWLuw8nFELgA7px+YqUGSjTXX5EXfg8yYLIKIYQQ4nGS0F+FTgeXd8Gxn+HMKkh6YuYna2eo0BOq9IXchdI8hBBCCJERJKG/rODfYftIuP9P6nWeNaDyJ1CqnXSrCyGEyBSS0F+axjiZWztDuQ+h4sfy2JkQQohMJwn9Zb3dEmzyQn5vqNgT3m4F5pamjkoIIcQbShL6yzK3hEEXwdLe1JEIIYQQaE0dQLYmyVwIIUQWIQldCCGEyAEkoQshhBA5gCR0IYQQIgeQhC6EEELkAJLQhRBCiBxAEroQQgiRA0hCF0IIIXIASehCCCFEDiAJXQghhMgBJKELIYQQOYAkdCGEECIHkIQuhBBC5ACS0IUQQogcQBK6EEIIkQNkqYQeGxtLz549cXJyws3NjW+//TbdbY8dO8a7776LjY0NVapUISgoKBMjFUIIIbKWLJXQhwwZQmBgIDt27GDu3Ln4+fmxcuXKVNs9fPiQZs2aUatWLYKCgqhevTrvv/8+Dx8+NEHUQgghhOlplFLK1EGAPknnyZOHzZs3U7duXQAmTJjAtm3b2LVrl9G2v/zyCxMmTODixYtoNBqUUhQvXpxRo0bRvXv35zpfZGQkjo6ORERE4ODgkLEvRgghhMhkWeYK/cSJEyQkJFC9enVDW82aNTl06BA6nc5o24CAAGrWrIlGowFAo9FQo0YNDh48mKkxCyGEEFlFlknoN2/eJE+ePOTKlcvQ5urqSmxsLGFhYam2dXd3N2pzdXXl+vXrmRKrEEIIkdWYmzqAZNHR0VhaWhq1JS/HxcU917ZPbve4uLg4o/WRkZGvGjJKKR48ePDKxxFCCPFy7O3tDb21b7osk9CtrKxSJeTkZRsbm+fa9sntHjd58mT8/PwyKFq9u3fvki9fvgw9phBCiOd3+/Zt8ubNa+owsoQsk9A9PDy4e/cuiYmJmJvrw7p16xbW1tY4OTml2vbWrVtGbbdu3cLNzS3d448YMYLBgwcblpVSxMfHY29v/9IxJ98euHbtWrYYWBcZGYmnp6fE+5pIvK+XxPt6Zdd4H79N+6bLMgnd29sbCwsLw4A3gH379lGlShW0WuNb/VWrVmXKlCkopQyj3Pfv38+oUaPSPb6lpWWqbvpXldzN4+DgkC0+AMkk3tdL4n29JN7XK7vFK93tKbLMoDgbGxt8fHz45JNPOHLkCGvWrGHatGkMGjQI0F+Bx8TEANCuXTvCw8P57LPPOHPmDJ999hkPHz6kQ4cOpnwJQgghhMlkmYQOMH36dCpVqkS9evXo168ffn5+tGnTBgA3Nzd+//13QP8NcsOGDezdu5dKlSoREBDApk2bsLW1NWX4QgghhMlkmS530F+l//rrr/z666+p1j1Z/+add97h6NGjmRVamiwtLfH19c3wrvzXReJ9vSTe10vifb0k3uwvy1SKE0IIIcTLy1Jd7kIIIYR4OZLQhRBCiBxAEroQQgiRA0hCf0Xvv//+c8/wZkpxcXH069eP3Llz4+rqysiRI1MNNMxKrl27xv/+9z8cHBwoWLAgM2fONHVIaYqLi6NMmTJGMwJeunSJ9957D1tbW0qVKsVff/1lugCfkFa8AQEBVK9eHTs7O0qUKMFPP/1kugCfkFa8ySIiIvDw8GDhwoWZHld60or36tWrNGvWDBsbG4oWLcqKFStMF+AT0oo3+ekhW1tbvL292bZtm+kCfOTGjRu0a9cOZ2dnPDw8GDx4MLGxsUDW/rxlNknor2D58uVs2rTJ1GE8l0GDBvH333+zdetWli5dyo8//sgPP/xg6rDS1aFDB+zs7AgKCmLWrFmMGjWKP//809RhGYmNjaVz586cPn3a0KaUolWrVuTPn5/AwEC6du1K69atuXr1qgkj1Usr3lu3btG0aVPq1q3LsWPH8PPzY8CAAWzcuNGEkeqlFe/jhg0bxr///pvJUaUvrXgTExN5//33sbCw4NixYwwZMoQPP/yQ4OBgE0aql1a8t2/fpnnz5nTq1IlTp07RoUMHWrZsadKJr5RStGvXjujoaPbu3cvy5ctZv349o0ePztKfN5NQ4qWEhYWpAgUKqCpVqigfHx9Th/NUYWFhytzcXO3atcvQNnnyZNWjRw8TRpW+e/fuKUCdOnXK0NamTRvVr18/E0Zl7PTp06p8+fKqXLlyClA7d+5USim1fft2ZWtrq6KiogzbNmjQQPn6+pom0EfSi3fevHnq7bffNtq2d+/e6oMPPjBBlCnSizfZ3r17VdGiRVX+/PmVv7+/SWJ8XHrxrl27Vjk6OqqIiAjDti1btlQLFiwwUaR66cW7evVq5eLiYrSts7Oz+uOPP0wQpV5ISIgC1K1btwxtS5cuVe7u7ln282YqcoX+kr788ku6du1KqVKlTB3KM+3btw9HR0fq1KljaBs+fDi//PKLCaNKn7W1NTY2Nvj7+5OQkMC5c+fYv38/FSpUMHVoBrt376ZevXocPHjQqD0gIICKFSsaFTmqWbNmqu0yW3rxNmnSBH9//1TbR0REZFZoaUovXtB3E/fq1Ys5c+ZkmWeQ04t3165dNGjQwKiU6po1a+jdu3dmh2gkvXhdXFwICwtj9erVKKVYs2YNDx48oGzZsiaKFPLnz8+WLVtwdXU1ao+IiMiynzdTyVKFZbKLHTt2sGfPHk6dOkXfvn1NHc4z/fPPPxQsWJDffvuNSZMmER8fT48ePRg1alSqOvlZgZWVFXPmzKF///7MmjWLpKQkunfvTs+ePU0dmkF6v/ebN2/i7u5u1Obq6mrSLktIP96CBQtSsGBBw/Lt27dZvnw5Y8eOzZzA0vG0z9WkSZOoUKECjRo1ysSIni69eJM/e8OHD2fRokXkyZMHPz8/WrVqlbkBPiG9eGvVqkW/fv1o164dWq2WpKQk/P39KVGiRCZHmMLJyYnGjRsblnU6Hd9//z0NGjTIsp83U8l6/5pncbGxsfTp04c5c+ZgbW1t6nCeS1RUFBcuXGDBggX4+/szbdo0Zs+ezYwZM0wdWrpCQkJo3rw5AQEB+Pv7s3LlSpYsWWLqsJ4pOjo61VWjpaVlqul+s6KYmBjatm1L/vz56dOnj6nDSdOZM2eYP39+lv7bfVxUVBQLFy7k/v37rF+/nm7dutGuXTsCAwNNHVqaoqKi+Oeffxg7diyHDx9m1KhRDBw4kLNnz5o6NIOhQ4dy9OhRJk6cmK0/b6+DXKG/ID8/PypXrmz0jTGrMzc3JzIykqVLl+Ll5QXoR97OnTuXL774wsTRpbZ9+3Z++uknrl+/jrW1NZUrV+bGjRtMmDCBLl26mDq8p7KysiIsLMyoLS4uDhsbGxNF9HyioqJo2bIl58+fZ9++fVkyXqUUvXr1Yty4cam6X7Mqc3NzXFxcmDdvHlqtlooVK7J3715++OEHKleubOrwUvn6669RSjFmzBgAKlasyKFDh5g1axbz5s0zcXT6gZAzZ87k999/p0yZMtn28/a6yBX6C1q+fDlr1qzBzs4OOzs7lixZwpIlS7CzszN1aOlyc3PDysrKkMwBSpQowbVr10wYVfqCgoIoVqyYUQ9IhQoVuHLligmjej4eHh7cunXLqO3WrVu4ubmZKKJni4yMpHHjxgQHB7Njxw6KFStm6pDSdPXqVQ4cOMAXX3xh+PxdvXqVTz75hKZNm5o6vDS5ublRvHhxo1tbWf2zV758eaO2rPLZGzBgAN9++y2LFy+mbdu2QPb8vL1OktBf0K5duzh16hTHjx/n+PHjtGjRghYtWnD8+HFTh5auqlWrEhsby/nz5w1tISEhRvdOsxJ3d3dCQ0OJj483tJ09e5ZChQqZMKrnU7VqVY4ePWqY6hf0gxKrVq1qwqjSp9PpaNOmDf/88w+7d++mdOnSpg4pXR4eHly4cMHw2Tt+/Dju7u6MGzcuSz07/7iqVasSHBxMUlKSoS2rf/bOnDlj1JYVPnt+fn7Mnz+f5cuX06lTJ0N7dvu8vXYmHmWf7fn4+GT5x9aUUur9999X1apVU8ePH1dbtmxRefPmVbNmzTJ1WGkKDw9X+fPnV127dlXnzp1T69atUy4uLmr+/PmmDi1NPPbYT2JioipVqpTq2LGjCg4OVpMnT1Z2dnbqypUrpg3yMY/H+8MPPyitVqs2bNigbt68afgJCwszbZCPIY3H1pJ5eXllicfWHvd4vBEREcrd3V317t1bXbhwQc2ZM0eZm5uroKAg0wb5mMfjPXjwoDIzM1PTp09XFy9eVDNmzFAWFhYqODjYZPGdOXNGmZmZqa+++srob/TmzZvZ4vOWmSShv6LsktDDw8NV165dlZ2dncqXL5/y8/NTOp3O1GGl6/Tp0+q9995TDg4OqkiRImrGjBlZNt4nE86FCxdU7dq1laWlpSpdurT6+++/TRdcGh6Pt3HjxgpI9VOnTh2Txvi47JzQldL/LSf/PRQvXlytWrXKdMGl4cl4165dq8qXL69sbW1VxYoVTf73O3ny5DT/RpOvR7P65y0zyfSpQgghRA4g99CFEEKIHEASuhBCCJEDSEIXQgghcgBJ6EIIIUQOIAldCCGEyAEkoQshhBA5gCR0IYQQIgeQhC5yFJ1Ox88//0y9evVwcXHB0tISd3d3WrVqxYYNG9LcJzY21mi6xYULF6LRaExWTrRgwYIUKFDAJOfOKBcuXHhtx+7fv7/R9KN169ZFo9Fw+fLldPfp3r07Go2GXbt2vdC5oqOj8fT05I8//ni5YIXIRJLQRY6RXJe8V69e2NraMmLECObOnUufPn0IDg6mefPmDBo0yGifwMBAihcvzrZt2wxttWvXZtGiRdSrVy+zX0KOMGHChNdWE3737t389NNPTJs27bUc/0k2NjZMnjyZfv36cffu3Uw5pxAvS6ZPFTnGqlWrWLt2LePGjWP06NFG60aMGEGdOnWYPXs2HTt2pHr16gAcP3481cxXhQsXpnDhwpkWd06zZcsWEhISMvy4Op2OPn360K1bN4oWLZrhx09Ply5dmDJlCkOHDuWXX37JtPMK8aLkCl3kGHv27AHgf//7X6p1uXLl4ssvvwT0V3ki+1m1ahXnzp2jf//+mXpejUbDp59+yuLFi41uzQiR1UhCFzmGg4MDAPPmzSMxMTHV+tatW5OQkMCIESMA/X3VXr16AdCjRw80Gg2Q9j10jUZD//79WbZsGd7e3lhZWeHp6cmECRNQSrFy5UoqVKiAtbU1RYsWTdUlnHyf98m4tm3bhkajYezYsem+rrFjx6LRaIxuCwAkJiai0WioW7euoS0pKYlx48ZRtmxZbG1tcXJyol69eqxfv/4Z717KedavX0+pUqWwtLSkZs2aACil+PHHH6lVqxZOTk5YWFjg5uZG586dCQ0NNXqf9u/fb/j/7t27G9bduHGD3r17U6BAAXLlyoWXlxcDBw4kLCzsmbEBfPvtt5QpU4Zy5co91/ZPk/w7Tu/nyelNO3bsSFJSErNmzXrlcwvxukiXu8gxevTowaxZs/jxxx9Zv349LVq0oHbt2tSsWRMvLy+0Wi1abcp32D59+mBubs7PP/9M7969qVWr1lOPv27dOpYuXcqAAQPo3bs38+fPZ/To0Rw+fJgDBw7Qv39/evfuzdy5cxkyZAienp507Njxdb9sI4MHD+b777+nd+/eDBo0iPDwcBYsWEDLli3ZsGEDzZo1e+YxunTpwkcffUTx4sWxsLAA4LPPPmP27Nm0bt2ayZMno5Ri7969/P777xw4cIDQ0FAsLCxYtGgR48eP5/z58yxatIgiRYoAcOnSJapXr05cXBx9+vShYMGCnDhxgvnz57N582YOHjxInjx50o3p5s2bHDp0iMGDB6e7zf3797Gzs0tzXVxcnNFy8jiJJ/3888/s2rWLdu3aGbW7uLhQsWJF/vzzT7755pt0YxDCpEw615sQGezAgQOqRIkSqaZZLFq0qBo9erSKjIw02v7HH39UgNEUnP7+/gpQP/74o6Et+TgHDhwwtB09elQBSqvVGs1vferUKQWoDz/80NBWp04dBaiEhASj8//9998KUL6+voY2Ly8v5eHhYVj29fVVQKppIRMSElJNdWpra6uaNm1qtN3Vq1dVkSJFlJ+f31PeuZTzdO3a1aj97t27ytzcXDVv3jzVPu3bt1eAOnLkiKGtRo0a6sl/Wpo2baocHBxUaGhomq+/b9++T41t8eLFClC//vprqnXJ7+3z/KQ3DatSSv3xxx9Ko9Go5s2bq6SkpFTrP/74YwWoy5cvPzVWIUxFrtBFjlKtWjXOnDnDvn372Lx5M7t37yYwMJDQ0FDGjx/Pb7/9xp49e3jrrbde+NhvvfUW1apVMyyXLFkSgKJFi1KxYkVDe7FixQB9F3Nm8/T0ZPfu3cyYMYPWrVtTsGBBPD09jbrFn+W9994zWnZxcSEiIiLV7YLw8HBsbGwAiIyMTPd49+/fZ+vWrTRt2hRHR0ej0eLe3t4ULlyY1atXM3fu3HSPkfwY3NMGwy1evBhXV9c0133zzTf89ddf6e574MABunbtSvny5Vm2bJlRT06y5HOHhobi5eWV7rGEMBVJ6CLH0Wq11K5dm9q1awMQFRXFpk2bGDduHKdPn+azzz5j9erVL3zc/PnzGy2bm5un2W5mZgboR2Vntp9//pkOHTowePBgBg8eTJEiRWjUqBGdOnUyvB/PklZStLKyYt26daxbt47z589z+fJlbty4YRh38LTXeuHCBXQ6HRs3biRv3rzpbhcbG4uVlVWa6+7cuQOAo6NjuvvXqFEj1b3vZIsXL35qfC1atMDZ2ZkNGzZga2ub5nZOTk4A3L59O91jCWFKktBFjvDw4UMmTZpEgQIF6Nu3r9E6Ozs7OnToQKNGjShUqBDbt29/qXMk309+UnJSexlpDd57lX2rV6/OP//8w44dO9iyZQs7d+5k/vz5zJs3j8GDB/Ptt98+87jJX0iSxcfH06hRI3bv3k2VKlWoVKkSHTt2pGLFimzcuJHJkyc/9XjJyb5Vq1b069cv3e2SvyClJfmKOSkp6Znxv4g7d+7QtGlTYmJi+Ouvv/Dw8Eh32+RzP/n+CJFVSEIXOYK1tTUzZszAycmJjz/+OM3k6+TkhJeXF//991+mx5ecrOLi4owS161bt15o38c9uW9sbCwnT57E2dmZJk2a0KRJE0A/IK1BgwbMnDkTX19fw9MAz2vFihXs3r2bIUOG8PXXXxutW7hw4TP3L1SoEAAxMTGpuvMB1q5di7Oz81MTupubG0CGFneJiYmhRYsWXLp0iVWrVhndNklLci9BcixCZDXy2JrIEbRaLR999BE3b97kiy++SPPqdc+ePZw6dYr27dsb2jKre9zd3R3QV6ZLptPpWLJkyUvtC/Dbb78ZLd+5c4eqVasycOBAo/ZChQrh5uaGRqN5qavL5CRatmxZo/bQ0FBWrlwJGPcWPPmeurq6UrNmTf766y9DrYBkmzdvplWrVkyZMuWpMSR/Kbhy5coLx58WnU7Hhx9+SEBAAFOnTjUqJZue5HMnxyJEViNX6CLHmDp1KqdOneK7775j69attG/fnkKFChEbG8v+/fv5448/qFChAhMmTDDsk3y/ePHixSil6Nat22uJzcfHh0WLFtG5c2c+//xzbG1tWbZs2XM9g92mTRsGDRrExIkTefjwIcWLF2f37t1s2bLF6J60p6cnH330ET///DNNmjShefPmaLVatmzZYnisLr37w0/TuHFjLC0tGTx4MJcvX8bd3Z3g4GB++eUXQ0W48PBww/bJ76mvry916tThvffeY+7cudSuXZuGDRvSu3dvypYty9mzZ5k/fz4uLi7PLOXaqFEjzMzM2L9/Pz169Hjh1/Ckr776itWrV1O1alUKFy7M0qVLU32pa9iwodF4gn379lGmTJlsX2df5GCmHmYvREZKSkpS/v7+qmnTpsrNzU3lypVLOTo6qqpVq6oZM2aouLg4o+3j4+PVBx98oGxsbJSdnZ06d+5cuo+t1ahRw2jftB4be1r7kiVLlLe3t7K0tFSurq6qX79+KjQ09JmPrSml1OHDh1XDhg2Vra2tsre3V82bN1dnz55VpUuXNjpPfHy8mjZtmipXrpxycHBQNjY2qmLFiuq7775L81Gsx6X3eJxSSm3btk3VqFFDOTg4KAcHB1W6dGk1atQodezYMQUoHx8fw7bHjh1TZcqUURYWFuq9994ztF+8eFF1795dubm5KQsLC/XWW2+pbt26qQsXLjw1rmS1a9dWhQsXTtWe/NjapUuX0t3Xx8fH6LG153nU7fFH3K5fv64ANWrUqOeKVQhT0CilVGZ/iRBCiBe1YsUKOnbsyO7du597xH5GmThxIn5+foSGhr7UI49CZAZJ6EKIbEGn01G2bFkqVKjw1MfQMlpSUhLFihWjYcOGLFiwINPOK8SLkkFxQohsQavVMnPmTH7//XfOnDmTaef19/cnIiLiqfX2hcgK5ApdCJGt9O3bl6tXr7Jx48bXfq6HDx9SrFgxZsyYkel1+YV4UZLQhRBCiBxAutyFEEKIHEASuhBCCJEDSEIXQgghcgBJ6EIIIUQOIAldCCGEyAEkoQshhBA5gCR0IYQQIgf4P/P+iwFIe2o6AAAAAElFTkSuQmCC",
- "text/html": [
- "\n",
- "
\n",
- "
\n",
- " Figure\n",
- "
\n",
- " \n",
- "
\n",
- " "
- ],
- "text/plain": [
- "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
"fig, ax = plt.subplots(figsize=(5, 5))\n",
- "mice_list = [\"GRB036\", \"GRB037\", \"GRB038\", \"GRB045\", \"GRB046\"]\n",
- "\n",
- "plot_multi_mouse_psychometric_fit(\n",
- " mouse_sessions_dict=good_behavior_sessions, mice_list=mice_list, ax=ax\n",
- ")\n",
- "\n",
- "ax.legend(frameon=False, fontsize=10, loc=\"upper left\")\n",
- "ax.text(\n",
- " 20,\n",
- " 0.1,\n",
- " s=f\"session performance threshold = {int(performance_threshold * 100)}%\",\n",
- " fontsize=10,\n",
- " ha=\"right\",\n",
- ")\n",
- "separate_axes(ax)\n",
- "# plt.savefig(pjoin(save_dir, 'psychometric_fits_all_mice.svg'), format='svg', dpi=300, bbox_inches='tight')"
+ "for row in rows:\n",
+ " stims = np.asarray(row[\"stims\"], dtype=float)\n",
+ " params = np.asarray(\n",
+ " [row[\"bias\"], row[\"sensitivity\"], row[\"guess_rate\"], row[\"lapse_rate\"]]\n",
+ " )\n",
+ " p_right = np.asarray(row[\"p_right\"], dtype=float)\n",
+ " x = np.asarray(sorted(stims), dtype=float)\n",
+ " label = f\"{row['subject_name']} (n={row['n_choices_fit']})\"\n",
+ " ax.plot(x, cumulative_gaussian(*params, x), label=label)\n",
+ " ax.plot(stims, p_right, \"o\", ms=4)\n",
+ "ax.set_xlabel(\"Stimulus rate relative to boundary (Hz)\")\n",
+ "ax.set_ylabel(\"P(right choice)\")\n",
+ "ax.set_ylim(0, 1)\n",
+ "ax.legend(frameon=False, fontsize=8)\n",
+ "ax.set_title(\"Psychometric fits by subject\")\n",
+ "fig.show()"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
"kernelspec": {
- "display_name": "base",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
"name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.12"
+ "pygments_lexer": "ipython3"
}
},
"nbformat": 4,
- "nbformat_minor": 2
+ "nbformat_minor": 5
}
diff --git a/psychometric_curves/utils.py b/psychometric_curves/utils.py
index fe96234..7ab0613 100644
--- a/psychometric_curves/utils.py
+++ b/psychometric_curves/utils.py
@@ -1,158 +1,156 @@
-import numpy as np
+"""Labdata-backed psychometric plotting helpers.
+
+Archived djchurchland notebooks live under ``archive/djchurchland/``.
+Maintained plotting entry points are ``scripts/analyses/plot_psychometrics.py``
+and the helpers in this module.
+"""
+
+from __future__ import annotations
+
+import datetime
+from typing import Any
+
import matplotlib.pyplot as plt
+import numpy as np
import seaborn as sns
-import datetime
-from djchurchland.chipmunk.task import Chipmunk
-from djchurchland.chipmunk.psychometric import PsychometricFit
-from djchurchland.chipmunk.fit_psychometric import (
- cumulative_gaussian,
- PsychometricRegression,
-)
+
+from behavior_analyses.io import get_chipmunk_table
+
+
+def _as_session_name_strings(sessions_list: list[Any] | None) -> list[str] | None:
+ if sessions_list is None:
+ return None
+ out = []
+ for session in sessions_list:
+ if isinstance(session, datetime.datetime):
+ out.append(session.strftime("%Y%m%d_%H%M%S"))
+ else:
+ out.append(str(session))
+ return out
+
+
+def _fetch_choice_and_stim(
+ mouse_id: str, query: str | None, sessions_list: list[Any] | None
+):
+ Chipmunk = get_chipmunk_table()
+ relation = Chipmunk.Trial() * Chipmunk.TrialParameters() & {
+ "subject_name": mouse_id
+ }
+ if sessions_list is not None:
+ session_strings = _as_session_name_strings(sessions_list)
+ assert session_strings is not None
+ relation = relation & [{"session_name": name} for name in session_strings]
+ if query:
+ relation = relation & query
+ relation = relation & "response != 0"
+ response, modality, audio_rate, visual_rate, boundary = relation.fetch(
+ "response",
+ "rewarded_modality",
+ "stim_rate_audio",
+ "stim_rate_vision",
+ "category_boundary",
+ )
+ modality = np.asarray(modality)
+ stim_rate = np.where(
+ np.isin(modality, ["visual", "visual+audio"]),
+ np.asarray(visual_rate, dtype=float),
+ np.asarray(audio_rate, dtype=float),
+ )
+ return response, stim_rate - np.asarray(boundary, dtype=float)
def plot_single_mouse_psychometric_fit(
- mouse_id, query=None, ax=None, plot_mode="both", sessions_list=None
+ mouse_id,
+ query=None,
+ ax=None,
+ plot_mode="both",
+ sessions_list=None,
+ session_fits=None,
):
+ """Plot individual and/or average psychometric fits for one subject.
+
+ ``session_fits`` may be a list of dict rows with ``stims``, ``p_side`` /
+ ``p_right``, and ``fit_params`` (for example from
+ ``PsychometricSessionFit``). When omitted, only the pooled average fit from
+ Chipmunk trials is drawn.
"""
- Plot individual sessions and average psychometric fit for a single mouse.
-
- Args:
- mouse_id: The ID of the mouse to plot.
- query: Optional additional query as a string.
- ax: Optional matplotlib axis to plot on.
- plot_mode: Mode of plotting ('individual', 'average', 'both').
- sessions_list: List of session_datetime strings or datetime objects to include.
- """
+ from behavior_analyses.psychometrics import (
+ cumulative_gaussian,
+ fit_psychometric_labdata,
+ )
if ax is None:
_, ax = plt.subplots(figsize=(5, 5))
- # Build the base query with the mouse_id
- combined_query = f'subject_name="{mouse_id}"'
-
- # Add any additional query
- if query:
- combined_query += f" AND ({query})"
-
- # Prepare session query if sessions_list is provided
- if sessions_list is not None:
- # Ensure all session_datetimes are strings formatted correctly
- sessions_list_str = [
- f'"{s.strftime("%Y-%m-%d %H:%M:%S")}"'
- if isinstance(s, datetime.datetime)
- else f'"{s}"'
- for s in sessions_list
- ]
- session_query = "session_datetime in (" + ", ".join(sessions_list_str) + ")"
- combined_query += f" AND ({session_query})"
-
- # Assign a color to the mouse
color = "black"
-
- # Fetch fits for the current mouse with querys
- fits = (PsychometricFit & combined_query).fetch(as_dict=True)
- if fits:
- if plot_mode in ["individual", "both"]:
- # Plot individual fits
- for fit in fits:
+ fits = list(session_fits or [])
+
+ if fits and plot_mode in ["individual", "both"]:
+ for fit in fits:
+ stims = np.asarray(fit["stims"], dtype=float)
+ params = np.asarray(fit["fit_params"], dtype=float)
+ p_side = np.asarray(fit.get("p_right", fit.get("p_side")), dtype=float)
+ nx = np.linspace(np.min(stims), np.max(stims), 100)
+ ax.plot(
+ nx,
+ cumulative_gaussian(*params, nx),
+ linewidth=1,
+ alpha=0.1,
+ color=color,
+ )
+ ax.plot(stims, p_side, "o", markersize=4, alpha=0.1, color=color)
+
+ if plot_mode in ["average", "both"]:
+ response_values, stim_values = _fetch_choice_and_stim(
+ mouse_id, query, sessions_list
+ )
+ if len(response_values) == 0:
+ print(f"No trial data available for mouse {mouse_id}.")
+ else:
+ fit = fit_psychometric_labdata(
+ np.asarray(stim_values, dtype=float),
+ np.asarray(response_values, dtype=float),
+ min_choices=20,
+ )
+ if fit is None:
+ print(f"Failed to fit average curve for mouse {mouse_id}")
+ else:
nx = np.linspace(np.min(fit["stims"]), np.max(fit["stims"]), 100)
ax.plot(
nx,
cumulative_gaussian(*fit["fit_params"], nx),
- linewidth=1,
- alpha=0.1,
+ linewidth=2,
+ label=f"{mouse_id} Average",
color=color,
)
+ for stim, p_side, ci in zip(
+ fit["stims"], fit["p_right"], fit["p_right_ci"]
+ ):
+ ax.plot([stim, stim], ci, "-_", color=color)
ax.plot(
fit["stims"],
- fit["p_side"],
+ fit["p_right"],
"o",
- markersize=4,
- alpha=0.1,
+ markerfacecolor="lightgray",
+ markersize=6,
color=color,
)
- if plot_mode in ["average", "both"]:
- print(
- f"Calculating average fit for {len(fits)} sessions for mouse {mouse_id}..."
- )
-
- # Get trial data for all sessions of the current mouse
- trial_data = (
- Chipmunk.Trial() & combined_query & "response != 0"
- ) * Chipmunk.TrialParameters()
- response_values, stim_values = trial_data.fetch("response", "stim_rate")
-
- if len(response_values) > 0:
- # Convert responses: 1 (left) -> 0, -1 (right) -> 1
- all_responses = (response_values == -1).astype(int)
- all_stims = stim_values
-
- print(f"Combined data: {len(all_stims)} trials for mouse {mouse_id}")
-
- # Fit psychometric function to combined data
- ft = PsychometricRegression(
- all_responses.astype(float),
- exog=all_stims.astype(float)[:, np.newaxis],
- )
- res = ft.fit(min_required_stim_values=6)
-
- if res is not None:
- print(f"Successfully fit average curve for mouse {mouse_id}")
-
- # Plot average curve
- nx = np.linspace(np.min(ft.stims), np.max(ft.stims), 100)
- ax.plot(
- nx,
- cumulative_gaussian(*res.params, nx),
- linewidth=2,
- label=f"{mouse_id} Average",
- color=color,
- )
-
- # Plot confidence intervals as vertical lines
- for stim, p_side, ci in zip(ft.stims, ft.p_side, ft.ci_side):
- ax.plot([stim, stim], ci, "-_", color=color)
-
- # Plot average data points
- ax.plot(
- ft.stims,
- ft.p_side,
- "o",
- markerfacecolor="lightgray",
- markersize=6,
- color=color,
- )
- else:
- print(f"Failed to fit average curve for mouse {mouse_id}")
- else:
- print(
- f"No trial data available for mouse {mouse_id} with the given querys."
- )
- else:
- print(f"No data available for mouse {mouse_id} with the given querys.")
-
- # Format plot
ax.set_ylabel("P(right choice)", fontsize=14)
- ax.set_xlabel("Stimulus rate (Hz)", fontsize=14)
+ ax.set_xlabel("Stimulus rate relative to boundary (Hz)", fontsize=14)
ax.tick_params(axis="both", which="major", labelsize=10)
ax.set_ylim([0, 1])
-
return ax
def plot_multi_mouse_psychometric_fit(
mouse_sessions_dict, mice_list=None, query=None, ax=None
):
- """
- Plot average psychometric fits for multiple mice, each with their own session querys.
-
- Args:
- mouse_sessions_dict: Dictionary where keys are mouse IDs and values are lists of session_datetime
- strings or datetime objects to include for that mouse.
- query: Optional additional query as a string.
- ax: Optional matplotlib axis to plot on.
- """
+ """Plot average psychometric fits for multiple mice."""
+ from behavior_analyses.psychometrics import (
+ cumulative_gaussian,
+ fit_psychometric_labdata,
+ )
if ax is None:
_, ax = plt.subplots(figsize=(5, 5))
@@ -160,96 +158,34 @@ def plot_multi_mouse_psychometric_fit(
if not mice_list:
mice_list = list(mouse_sessions_dict.keys())
- # Assign colors to mice
- # cmap = plt.get_cmap('viridis')
colors = sns.color_palette("Set1")
- # colors = cmap(np.linspace(0,1,len(mice_list)))
-
for mouse_id, color in zip(mice_list, colors):
- # Get sessions for this mouse
sessions_list = mouse_sessions_dict[mouse_id]
+ response_values, stim_values = _fetch_choice_and_stim(
+ mouse_id, query, sessions_list
+ )
+ if len(response_values) == 0:
+ print(f"No trial data available for mouse {mouse_id}.")
+ continue
+ fit = fit_psychometric_labdata(
+ np.asarray(stim_values, dtype=float),
+ np.asarray(response_values, dtype=float),
+ min_choices=20,
+ )
+ if fit is None:
+ print(f"Failed to fit average curve for mouse {mouse_id}")
+ continue
+ nx = np.linspace(np.min(fit["stims"]), np.max(fit["stims"]), 100)
+ ax.plot(
+ nx,
+ cumulative_gaussian(*fit["fit_params"], nx),
+ linewidth=2,
+ label=f"{mouse_id}",
+ color=color,
+ )
- # Build the base query for each mouse
- combined_query = f'subject_name="{mouse_id}"'
-
- # Add any additional query
- if query:
- combined_query += f" AND ({query})"
-
- # Prepare session query if sessions_list is provided
- if sessions_list is not None:
- # Ensure all session_datetimes are strings formatted correctly
- sessions_list_str = [
- f'"{s.strftime("%Y-%m-%d %H:%M:%S")}"'
- if isinstance(s, datetime.datetime)
- else f'"{s}"'
- for s in sessions_list
- ]
- session_query = "session_datetime in (" + ", ".join(sessions_list_str) + ")"
- combined_query += f" AND ({session_query})"
-
- # Fetch fits for the current mouse with querys
- fits = (PsychometricFit & combined_query).fetch(as_dict=True)
- if fits:
- print(
- f"Calculating average fit for mouse {mouse_id} with {len(fits)} sessions..."
- )
-
- # Get trial data for all sessions of the current mouse
- trial_data = (
- Chipmunk.Trial() & combined_query & "response != 0"
- ) * Chipmunk.TrialParameters()
- response_values, stim_values = trial_data.fetch("response", "stim_rate")
-
- if len(response_values) > 0:
- # Convert responses: 1 (left) -> 0, -1 (right) -> 1
- all_responses = (response_values == -1).astype(int)
- all_stims = stim_values
-
- print(f"Combined data: {len(all_stims)} trials for mouse {mouse_id}")
-
- # Fit psychometric function to combined data
- ft = PsychometricRegression(
- all_responses.astype(float),
- exog=all_stims.astype(float)[:, np.newaxis],
- )
- res = ft.fit(min_required_stim_values=6)
-
- if res is not None:
- print(f"Successfully fit average curve for mouse {mouse_id}")
-
- # Plot average curve
- nx = np.linspace(np.min(ft.stims), np.max(ft.stims), 100)
- ax.plot(
- nx,
- cumulative_gaussian(*res.params, nx),
- linewidth=2,
- label=f"{mouse_id}",
- color=color,
- )
-
- # # Plot confidence intervals as vertical lines
- # for stim, p_side, ci in zip(ft.stims, ft.p_side, ft.ci_side):
- # ax.plot([stim, stim], ci, '-_', color=color)
-
- # Plot average data points
- # ax.plot(
- # ft.stims, ft.p_side, 'o',
- # markerfacecolor='lightgray', markersize=6, color=color
- # )
- else:
- print(f"Failed to fit average curve for mouse {mouse_id}")
- else:
- print(
- f"No trial data available for mouse {mouse_id} with the given querys."
- )
- else:
- print(f"No data available for mouse {mouse_id} with the given querys.")
-
- # Format plot
ax.set_ylabel("P(right choice)", fontsize=14)
- ax.set_xlabel("Stimulus rate (Hz)", fontsize=14)
+ ax.set_xlabel("Stimulus rate relative to boundary (Hz)", fontsize=14)
ax.tick_params(axis="both", which="major", labelsize=10)
ax.set_ylim([0, 1])
-
return ax
diff --git a/psychophysical_kernels/plot_kernels.ipynb b/psychophysical_kernels/plot_kernels.ipynb
new file mode 100644
index 0000000..b319a68
--- /dev/null
+++ b/psychophysical_kernels/plot_kernels.ipynb
@@ -0,0 +1,79 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "7fb27b941602401d91542211134fc71a",
+ "metadata": {},
+ "source": [
+ "# Psychophysical kernels (labdata)\n",
+ "\n",
+ "Reads fitted `PsychophysicalKernel` rows for an analysis set. CLI alternative:\n",
+ "\n",
+ "```bash\n",
+ "uv run python scripts/analyses/plot_psychophysical_kernels.py --analysis-set-id --output figures/kernels.pdf\n",
+ "```\n",
+ "\n",
+ "Kernel math lives in `behavior_analyses.kernels`; archived exploratory logic is under `archive/djchurchland/psychophysical_kernels/`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "acae54e37e7d407bbb7b55eff062a284",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pathlib import Path\n",
+ "import sys\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "REPO_ROOT = (\n",
+ " Path.cwd().parent if Path.cwd().name == \"psychophysical_kernels\" else Path.cwd()\n",
+ ")\n",
+ "for path in [REPO_ROOT, REPO_ROOT / \"src\"]:\n",
+ " if str(path) not in sys.path:\n",
+ " sys.path.insert(0, str(path))\n",
+ "\n",
+ "from labdata_plugin.analysisschema import PsychophysicalKernel\n",
+ "\n",
+ "ANALYSIS_SET_ID = \"example_analysis_set\" # replace after seeding\n",
+ "rows = (\n",
+ " PsychophysicalKernel() & {\"analysis_set_id\": ANALYSIS_SET_ID, \"fit_status\": \"fit\"}\n",
+ ").fetch(as_dict=True)\n",
+ "assert rows, f\"No fitted kernels for {ANALYSIS_SET_ID}\"\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(5, 4))\n",
+ "for row in rows:\n",
+ " weights_mean = np.asarray(row[\"weights_mean\"], dtype=float)\n",
+ " weights_error = np.asarray(row[\"weights_error\"], dtype=float)\n",
+ " x = range(len(weights_mean))\n",
+ " label = f\"{row['subject_name']} (n={row['n_trials_fit']})\"\n",
+ " ax.plot(x, weights_mean, label=label)\n",
+ " ax.fill_between(\n",
+ " x, weights_mean - weights_error, weights_mean + weights_error, alpha=0.2\n",
+ " )\n",
+ "ax.axhline(0, color=\"k\", alpha=0.3, linestyle=\"--\")\n",
+ "ax.set_xlabel(\"Stimulus time bin\")\n",
+ "ax.set_ylabel(\"Choice weight\")\n",
+ "ax.legend(frameon=False, fontsize=8)\n",
+ "ax.set_title(\"Psychophysical kernels by subject\")\n",
+ "fig.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python",
+ "pygments_lexer": "ipython3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pyproject.toml b/pyproject.toml
index 06368de..b465ab3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,8 +4,9 @@ version = "0.1.0"
description = "behavioral analysis code for my thesis in the Churchland Lab"
requires-python = ">=3.10"
dependencies = [
+ "datajoint>=0.14.9,<2.0.0",
"ipykernel>=6.0.0",
- "labdata>=0.0.22",
+ "labdata>=0.1.7",
"matplotlib>=3.0.0",
"natsort>=8.0.0",
"numpy>=1.24.0",
@@ -13,18 +14,44 @@ dependencies = [
"scikit-learn>=1.0.0",
"scipy>=1.10.0",
"seaborn>=0.13.0",
+ "statsmodels>=0.14.0",
"chiCa",
- "djchurchland",
+ "fit-psychometric",
]
[tool.uv]
package = false
+constraint-dependencies = [
+ "cryptography>=48.0.1",
+ "pillow>=12.3.0",
+ "tornado>=6.5.7",
+ "urllib3>=2.7.0",
+]
[tool.uv.sources]
chiCa = { git = "https://github.com/churchlandlab/chiCa" }
-djchurchland = { git = "https://github.com/churchlandlab/djchurchland" }
+fit-psychometric = { path = "third_party/fit_psychometric", editable = true }
+
+[tool.behavior_analyses]
+# Optional local Chipmunk plugin checkout. Prefer `from chipmunk import Chipmunk`
+# (labdata plugin entry point). Override with env CHIPMUNK_PLUGIN_PATH.
+chipmunk_plugin_path = ""
[tool.ruff]
exclude = [
"psychometric_curves/fit_psychometric.py",
+ "third_party",
+ "archive",
+]
+
+[tool.ruff.lint]
+select = ["E4", "E7", "E9", "F"]
+per-file-ignores = { "*.ipynb" = ["E402", "F401", "F403", "F405"] }
+
+[tool.ruff.format]
+exclude = [
+ "notebooks/stress_test_labdata_migration.ipynb",
+ "stress_test_labdata_migration.ipynb",
+ "archive",
+ "third_party",
]
diff --git a/scripts/analyses/_bootstrap.py b/scripts/analyses/_bootstrap.py
new file mode 100644
index 0000000..1fa499f
--- /dev/null
+++ b/scripts/analyses/_bootstrap.py
@@ -0,0 +1,12 @@
+from __future__ import annotations
+
+from pathlib import Path
+import sys
+
+
+REPO_ROOT = Path(__file__).resolve().parents[2]
+SRC_ROOT = REPO_ROOT / "src"
+
+for path in [str(SRC_ROOT), str(REPO_ROOT)]:
+ if path not in sys.path:
+ sys.path.insert(0, path)
diff --git a/scripts/analyses/migrate_behavior_analysis_schema.py b/scripts/analyses/migrate_behavior_analysis_schema.py
new file mode 100644
index 0000000..2ae40c6
--- /dev/null
+++ b/scripts/analyses/migrate_behavior_analysis_schema.py
@@ -0,0 +1,321 @@
+from __future__ import annotations
+
+import argparse
+
+import numpy as np
+
+import _bootstrap # noqa: F401
+
+
+ARCHIVE_TABLES = {
+ "behavior_session_set": "archive_l479_behavior_set",
+ "behavior_session_set__session": ("archive_l479_behavior_set__session"),
+ "behavior_session_set__trial_set": ("archive_l479_behavior_set__trial_set"),
+ "behavior_session_set__subject_trial_set": (
+ "archive_l479_behavior_set__subject_trial_set"
+ ),
+ "__learning_session_metrics": "archive_l479_learning_session_metrics",
+ "__psychometric_session_fit": "archive_l479_psychometric_session_fit",
+ "__psychometric_subject_fit": "archive_l479_psychometric_subject_fit",
+ "__psychophysical_kernel": "archive_l479_psychophysical_kernel",
+}
+NEW_TABLES = {
+ "#psychometric_fit_config",
+ "#psychophysical_kernel_fit_config",
+ "behavior_analysis_set",
+ "behavior_analysis_set__trial_set",
+}
+COMPUTED_TABLES = {
+ "__psychometric_session_fit",
+ "__psychometric_subject_fit",
+ "__psychophysical_kernel",
+}
+EXPECTED_KERNEL_CONFIG = (10, 10, 0)
+TRIALSET_KEY_FIELDS = (
+ "subject_name",
+ "session_name",
+ "dataset_name",
+ "trialset_description",
+)
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ mode = parser.add_mutually_exclusive_group()
+ mode.add_argument(
+ "--apply",
+ action="store_true",
+ help="Archive the old tables, activate the locked schema, and copy rows.",
+ )
+ mode.add_argument(
+ "--resume",
+ action="store_true",
+ help="Resume copying after the old tables were archived and targets created.",
+ )
+ return parser.parse_args()
+
+
+def main() -> None:
+ args = parse_args()
+ import datajoint as dj
+ import labdata.schema as labdata_schema
+
+ connection = dj.conn()
+ database = f"{labdata_schema.dbase_name}_user"
+ if args.resume:
+ _validate_resume_state(connection, database)
+ _validate_kernel_configs(connection, database, archived=True)
+ _print_archive_counts(connection, database)
+ else:
+ _validate_table_state(connection, database)
+ _validate_kernel_configs(connection, database)
+ _print_source_counts(connection, database)
+ if not args.apply:
+ print("Dry run only. Re-run with --apply after exact live-write approval.")
+ return
+
+ rename_sql = "RENAME TABLE " + ", ".join(
+ f"`{database}`.`{source}` TO `{database}`.`{archive}`"
+ for source, archive in ARCHIVE_TABLES.items()
+ )
+ connection.query(rename_sql)
+
+ from labdata_plugin.analysisschema import (
+ BehaviorAnalysisSet,
+ PsychometricFitConfig,
+ PsychometricSessionFit,
+ PsychometricSubjectFit,
+ PsychophysicalKernel,
+ PsychophysicalKernelFitConfig,
+ )
+
+ PsychometricFitConfig.insert1(("v1", 100, 6, "v1"), skip_duplicates=True)
+ PsychophysicalKernelFitConfig.insert1(
+ ("v1_10bin_10fold", 10, 10, 0, 20.0, 1.0, "v1"),
+ skip_duplicates=True,
+ )
+
+ old_master = _archive_table(connection, database, "behavior_session_set")
+ BehaviorAnalysisSet.insert(
+ [
+ {
+ "analysis_set_id": row["session_set_id"],
+ "analysis_set_name": row["session_set_name"],
+ "analysis_set_description": row["session_set_description"],
+ "performance_threshold": row["performance_threshold"],
+ "min_trials_with_choice": row["min_trials_with_choice"],
+ "selection_version": row["analysis_version"],
+ }
+ for row in old_master.fetch(as_dict=True)
+ ],
+ skip_duplicates=True,
+ )
+
+ old_trialsets = _archive_table(
+ connection, database, "behavior_session_set__trial_set"
+ )
+ BehaviorAnalysisSet.TrialSet.insert(
+ [
+ {
+ "analysis_set_id": row["session_set_id"],
+ **{field: row[field] for field in TRIALSET_KEY_FIELDS},
+ "include_reason": row["include_reason"],
+ }
+ for row in old_trialsets.fetch(as_dict=True)
+ ],
+ skip_duplicates=True,
+ )
+
+ old_session_fits = _archive_table(
+ connection, database, "__psychometric_session_fit"
+ )
+ PsychometricSessionFit.insert(
+ [
+ {
+ **{field: row[field] for field in TRIALSET_KEY_FIELDS},
+ "psychometric_fit_config_id": "v1",
+ "fit_status": "fit",
+ "n_choices_fit": int(np.sum(row["n_obs"])),
+ **_psychometric_outputs(row),
+ }
+ for row in _deduplicate_by_fields(
+ old_session_fits.fetch(as_dict=True), TRIALSET_KEY_FIELDS
+ )
+ ],
+ skip_duplicates=True,
+ allow_direct_insert=True,
+ )
+
+ old_subject_fits = _archive_table(
+ connection, database, "__psychometric_subject_fit"
+ )
+ PsychometricSubjectFit.insert(
+ [
+ {
+ "analysis_set_id": row["session_set_id"],
+ "subject_name": row["subject_name"],
+ "trialset_description": row["trialset_description"],
+ "psychometric_fit_config_id": "v1",
+ "fit_status": "fit",
+ "n_choices_fit": int(np.sum(row["n_obs"])),
+ **_psychometric_outputs(row),
+ }
+ for row in old_subject_fits.fetch(as_dict=True)
+ ],
+ skip_duplicates=True,
+ allow_direct_insert=True,
+ )
+
+ old_kernels = _archive_table(connection, database, "__psychophysical_kernel")
+ PsychophysicalKernel.insert(
+ [
+ {
+ "analysis_set_id": row["session_set_id"],
+ "subject_name": row["subject_name"],
+ "trialset_description": row["trialset_description"],
+ "kernel_fit_config_id": "v1_10bin_10fold",
+ "fit_status": "fit",
+ "n_trials_fit": row["n_trials"],
+ **{
+ field: row[field]
+ for field in (
+ "weights",
+ "weights_mean",
+ "weights_error",
+ "scores",
+ "score_mean",
+ "bias",
+ "bias_mean",
+ )
+ },
+ }
+ for row in old_kernels.fetch(as_dict=True)
+ ],
+ skip_duplicates=True,
+ allow_direct_insert=True,
+ )
+
+ print(f"BehaviorAnalysisSet: {len(BehaviorAnalysisSet())}")
+ print(f"BehaviorAnalysisSet.TrialSet: {len(BehaviorAnalysisSet.TrialSet())}")
+ print(f"PsychometricSessionFit copied: {len(PsychometricSessionFit())}")
+ print(f"PsychometricSubjectFit copied: {len(PsychometricSubjectFit())}")
+ print(f"PsychophysicalKernel copied: {len(PsychophysicalKernel())}")
+
+
+def _validate_table_state(connection, database):
+ existing = {
+ row[0]
+ for row in connection.query(
+ "SELECT table_name FROM information_schema.tables "
+ f"WHERE table_schema={database!r}"
+ ).fetchall()
+ }
+ missing = set(ARCHIVE_TABLES) - existing
+ occupied_archives = set(ARCHIVE_TABLES.values()) & existing
+ occupied_targets = NEW_TABLES & existing
+ if missing or occupied_archives or occupied_targets:
+ raise RuntimeError(
+ f"Unsafe table state: missing={sorted(missing)}, "
+ f"occupied_archives={sorted(occupied_archives)}, "
+ f"occupied_targets={sorted(occupied_targets)}"
+ )
+
+
+def _validate_resume_state(connection, database):
+ existing = {
+ row[0]
+ for row in connection.query(
+ "SELECT table_name FROM information_schema.tables "
+ f"WHERE table_schema={database!r}"
+ ).fetchall()
+ }
+ missing_archives = set(ARCHIVE_TABLES.values()) - existing
+ missing_targets = (NEW_TABLES | COMPUTED_TABLES) - existing
+ old_only_tables = set(ARCHIVE_TABLES) - COMPUTED_TABLES
+ occupied_sources = old_only_tables & existing
+ if missing_archives or missing_targets or occupied_sources:
+ raise RuntimeError(
+ f"Unsafe resume state: missing_archives={sorted(missing_archives)}, "
+ f"missing_targets={sorted(missing_targets)}, "
+ f"occupied_sources={sorted(occupied_sources)}"
+ )
+
+
+def _validate_kernel_configs(connection, database, *, archived=False):
+ master = (
+ ARCHIVE_TABLES["behavior_session_set"] if archived else "behavior_session_set"
+ )
+ kernel = (
+ ARCHIVE_TABLES["__psychophysical_kernel"]
+ if archived
+ else "__psychophysical_kernel"
+ )
+ queries = {
+ master: (
+ "SELECT DISTINCT kernel_timebins, kernel_cv_splits, "
+ f"kernel_random_state FROM `{database}`.`{master}`"
+ ),
+ kernel: (
+ "SELECT DISTINCT timebins, cv_splits, random_state "
+ f"FROM `{database}`.`{kernel}`"
+ ),
+ }
+ incompatible = {}
+ for table, query in queries.items():
+ configs = {tuple(map(int, row)) for row in connection.query(query).fetchall()}
+ unexpected = configs - {EXPECTED_KERNEL_CONFIG}
+ if unexpected:
+ incompatible[table] = sorted(unexpected)
+ if incompatible:
+ raise RuntimeError(f"Incompatible legacy kernel configs: {incompatible}")
+
+
+def _print_source_counts(connection, database):
+ for source, archive in ARCHIVE_TABLES.items():
+ count = connection.query(
+ f"SELECT COUNT(*) FROM `{database}`.`{source}`"
+ ).fetchone()[0]
+ print(f"{source}: {count} rows -> {archive}")
+
+
+def _print_archive_counts(connection, database):
+ for archive in ARCHIVE_TABLES.values():
+ count = connection.query(
+ f"SELECT COUNT(*) FROM `{database}`.`{archive}`"
+ ).fetchone()[0]
+ print(f"{archive}: {count} archived rows")
+
+
+def _archive_table(connection, database, source):
+ import datajoint as dj
+
+ return dj.FreeTable(connection, f"`{database}`.`{ARCHIVE_TABLES[source]}`")
+
+
+def _deduplicate_by_fields(rows, fields):
+ unique = {}
+ for row in rows:
+ unique.setdefault(tuple(row[field] for field in fields), row)
+ return list(unique.values())
+
+
+def _psychometric_outputs(row):
+ return {
+ field: row[field]
+ for field in (
+ "stims",
+ "p_right",
+ "p_right_ci",
+ "n_right",
+ "n_obs",
+ "bias",
+ "sensitivity",
+ "guess_rate",
+ "lapse_rate",
+ "goodness_of_fit",
+ )
+ }
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/analyses/plot_learning_curves.py b/scripts/analyses/plot_learning_curves.py
new file mode 100644
index 0000000..de2570e
--- /dev/null
+++ b/scripts/analyses/plot_learning_curves.py
@@ -0,0 +1,55 @@
+from __future__ import annotations
+
+import argparse
+from pathlib import Path
+
+import _bootstrap # noqa: F401
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--analysis-set-id", required=True)
+ parser.add_argument("--output", type=Path, required=True)
+ return parser.parse_args()
+
+
+def main() -> None:
+ args = parse_args()
+ import matplotlib
+
+ matplotlib.use("Agg")
+ matplotlib.rcParams["font.family"] = "Arial"
+ from matplotlib import pyplot as plt
+ import pandas as pd
+
+ from labdata.schema import DecisionTask
+ from labdata_plugin.analysisschema import BehaviorAnalysisSet
+
+ selected = BehaviorAnalysisSet.TrialSet() & {
+ "analysis_set_id": args.analysis_set_id
+ }
+ rows = (DecisionTask.TrialSet() & selected).fetch(as_dict=True)
+ if not rows:
+ raise RuntimeError(
+ f"No selected TrialSets for analysis_set_id={args.analysis_set_id}"
+ )
+
+ data = pd.DataFrame(rows).sort_values(["subject_name", "session_name"])
+ fig, ax = plt.subplots(figsize=(8, 4))
+ for subject, subject_df in data.groupby("subject_name"):
+ ax.plot(
+ subject_df["performance_easy"].to_numpy(),
+ marker="o",
+ label=f"{subject} (n={len(subject_df)} sessions)",
+ )
+ ax.set_xlabel("Session index")
+ ax.set_ylabel("Easy performance")
+ ax.set_ylim(0, 1)
+ ax.legend(frameon=False, fontsize=8)
+ ax.set_title("Easy performance across selected sessions")
+ args.output.parent.mkdir(parents=True, exist_ok=True)
+ fig.savefig(args.output, bbox_inches="tight")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/analyses/plot_psychometrics.py b/scripts/analyses/plot_psychometrics.py
new file mode 100644
index 0000000..9e40129
--- /dev/null
+++ b/scripts/analyses/plot_psychometrics.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+import argparse
+from pathlib import Path
+
+import _bootstrap # noqa: F401
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--analysis-set-id", required=True)
+ parser.add_argument("--output", type=Path, required=True)
+ return parser.parse_args()
+
+
+def main() -> None:
+ args = parse_args()
+ import matplotlib
+
+ matplotlib.use("Agg")
+ matplotlib.rcParams["font.family"] = "Arial"
+ from matplotlib import pyplot as plt
+ import numpy as np
+
+ from behavior_analyses.psychometrics import cumulative_gaussian
+ from labdata_plugin.analysisschema import PsychometricSubjectFit
+
+ rows = (
+ PsychometricSubjectFit()
+ & {"analysis_set_id": args.analysis_set_id, "fit_status": "fit"}
+ ).fetch(as_dict=True)
+ if not rows:
+ raise RuntimeError(
+ f"No fitted psychometrics for analysis_set_id={args.analysis_set_id}"
+ )
+
+ fig, ax = plt.subplots(figsize=(5, 5))
+ for row in rows:
+ stims = np.asarray(row["stims"], dtype=float)
+ params = np.asarray(
+ [
+ row["bias"],
+ row["sensitivity"],
+ row["guess_rate"],
+ row["lapse_rate"],
+ ],
+ dtype=float,
+ )
+ p_right = np.asarray(row["p_right"], dtype=float)
+ x = np.asarray(sorted(stims), dtype=float)
+ label = f"{row['subject_name']} (n={row['n_choices_fit']})"
+ (line,) = ax.plot(x, cumulative_gaussian(*params, x), label=label)
+ ax.plot(stims, p_right, "o", color=line.get_color(), ms=4)
+ ax.set_xlabel("Stimulus rate relative to boundary (Hz)")
+ ax.set_ylabel("P(right choice)")
+ ax.set_ylim(0, 1)
+ ax.legend(frameon=False, fontsize=8)
+ ax.set_title("Psychometric fits by subject")
+ args.output.parent.mkdir(parents=True, exist_ok=True)
+ fig.savefig(args.output, bbox_inches="tight")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/analyses/plot_psychophysical_kernels.py b/scripts/analyses/plot_psychophysical_kernels.py
new file mode 100644
index 0000000..726ef35
--- /dev/null
+++ b/scripts/analyses/plot_psychophysical_kernels.py
@@ -0,0 +1,59 @@
+from __future__ import annotations
+
+import argparse
+from pathlib import Path
+
+import _bootstrap # noqa: F401
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--analysis-set-id", required=True)
+ parser.add_argument("--output", type=Path, required=True)
+ return parser.parse_args()
+
+
+def main() -> None:
+ args = parse_args()
+ import matplotlib
+
+ matplotlib.use("Agg")
+ matplotlib.rcParams["font.family"] = "Arial"
+ from matplotlib import pyplot as plt
+ import numpy as np
+
+ from labdata_plugin.analysisschema import PsychophysicalKernel
+
+ rows = (
+ PsychophysicalKernel()
+ & {"analysis_set_id": args.analysis_set_id, "fit_status": "fit"}
+ ).fetch(as_dict=True)
+ if not rows:
+ raise RuntimeError(
+ f"No fitted kernels for analysis_set_id={args.analysis_set_id}"
+ )
+
+ fig, ax = plt.subplots(figsize=(5, 4))
+ for row in rows:
+ weights_mean = np.asarray(row["weights_mean"], dtype=float)
+ weights_error = np.asarray(row["weights_error"], dtype=float)
+ x = range(len(weights_mean))
+ label = f"{row['subject_name']} (n={row['n_trials_fit']})"
+ ax.plot(x, weights_mean, label=label)
+ ax.fill_between(
+ x,
+ weights_mean - weights_error,
+ weights_mean + weights_error,
+ alpha=0.2,
+ )
+ ax.axhline(0, color="k", alpha=0.3, linestyle="--")
+ ax.set_xlabel("Stimulus time bin")
+ ax.set_ylabel("Choice weight")
+ ax.legend(frameon=False, fontsize=8)
+ ax.set_title("Psychophysical kernels by subject")
+ args.output.parent.mkdir(parents=True, exist_ok=True)
+ fig.savefig(args.output, bbox_inches="tight")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/analyses/populate_behavior_tables.py b/scripts/analyses/populate_behavior_tables.py
new file mode 100644
index 0000000..1004500
--- /dev/null
+++ b/scripts/analyses/populate_behavior_tables.py
@@ -0,0 +1,39 @@
+from __future__ import annotations
+
+import argparse
+
+import _bootstrap # noqa: F401
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--analysis-set-id", required=True)
+ parser.add_argument("--dry-run", action="store_true")
+ return parser.parse_args()
+
+
+def main() -> None:
+ args = parse_args()
+ from labdata_plugin.analysisschema import (
+ BehaviorAnalysisSet,
+ PsychometricSessionFit,
+ PsychometricSubjectFit,
+ PsychophysicalKernel,
+ )
+
+ restriction = {"analysis_set_id": args.analysis_set_id}
+ selected_trialsets = BehaviorAnalysisSet.TrialSet() & restriction
+ table_restrictions = [
+ (PsychometricSessionFit, selected_trialsets),
+ (PsychometricSubjectFit, restriction),
+ (PsychophysicalKernel, restriction),
+ ]
+ for table, table_restriction in table_restrictions:
+ pending = (table.key_source & table_restriction) - table()
+ print(f"{table.__name__}: {len(pending)} pending")
+ if not args.dry_run:
+ table.populate(table_restriction, display_progress=True)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/analyses/seed_behavior_analysis_set.py b/scripts/analyses/seed_behavior_analysis_set.py
new file mode 100644
index 0000000..3e3b007
--- /dev/null
+++ b/scripts/analyses/seed_behavior_analysis_set.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+import argparse
+
+import _bootstrap # noqa: F401
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--analysis-set-id", required=True)
+ parser.add_argument("--name", required=True)
+ parser.add_argument("--description", default="")
+ parser.add_argument("--subjects", nargs="+", required=True)
+ parser.add_argument("--trialset", default="visual")
+ parser.add_argument("--performance-threshold", type=float, default=0.7)
+ parser.add_argument("--min-trials-with-choice", type=int, default=200)
+ parser.add_argument("--dry-run", action="store_true")
+ return parser.parse_args()
+
+
+def main() -> None:
+ args = parse_args()
+ from labdata.schema import DecisionTask
+ from labdata_plugin.analysisschema import BehaviorAnalysisSet
+
+ relation = DecisionTask.TrialSet() & {
+ "trialset_description": args.trialset,
+ }
+ relation = relation & [{"subject_name": subject} for subject in args.subjects]
+ relation = relation & f"n_with_choice >= {args.min_trials_with_choice}"
+ relation = relation & f"performance_easy >= {args.performance_threshold}"
+ trialset_rows = relation.fetch("KEY")
+
+ analysis_set = {
+ "analysis_set_id": args.analysis_set_id,
+ "analysis_set_name": args.name,
+ "analysis_set_description": args.description,
+ "performance_threshold": args.performance_threshold,
+ "min_trials_with_choice": args.min_trials_with_choice,
+ "selection_version": "v1",
+ }
+
+ print(f"Analysis set: {analysis_set}")
+ print(f"TrialSets: {len(trialset_rows)}")
+ if args.dry_run:
+ return
+
+ BehaviorAnalysisSet.insert1(analysis_set, skip_duplicates=True)
+ BehaviorAnalysisSet.TrialSet.insert(
+ [
+ {
+ **row,
+ "analysis_set_id": args.analysis_set_id,
+ "include_reason": "seeded_from_decision_task",
+ }
+ for row in trialset_rows
+ ],
+ skip_duplicates=True,
+ ignore_extra_fields=True,
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/sess.ipynb b/sess.ipynb
index 8891334..4704469 100644
--- a/sess.ipynb
+++ b/sess.ipynb
@@ -1,202 +1,60 @@
{
"cells": [
+ {
+ "cell_type": "markdown",
+ "id": "7fb27b941602401d91542211134fc71a",
+ "metadata": {},
+ "source": [
+ "# Session lookup (labdata)\n",
+ "\n",
+ "Maintained replacement for the archived `djchurchland` `sess.ipynb`.\n",
+ "Requires labdata/DataJoint credentials and a Chipmunk plugin (`from chipmunk import Chipmunk`)."
+ ]
+ },
{
"cell_type": "code",
- "execution_count": 2,
- "id": "9ad1f58e",
+ "execution_count": null,
+ "id": "acae54e37e7d407bbb7b55eff062a284",
"metadata": {},
"outputs": [],
"source": [
- "from djchurchland.schema import Chipmunk\n",
+ "from pathlib import Path\n",
+ "import sys\n",
"\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib as mpl\n",
"\n",
+ "REPO_ROOT = Path.cwd()\n",
+ "if not (REPO_ROOT / \"pyproject.toml\").exists():\n",
+ " REPO_ROOT = Path.cwd().parent\n",
+ "for path in [REPO_ROOT, REPO_ROOT / \"src\"]:\n",
+ " if str(path) not in sys.path:\n",
+ " sys.path.insert(0, str(path))\n",
+ "\n",
+ "from behavior_analyses.io import get_chipmunk_table\n",
+ "\n",
+ "Chipmunk = get_chipmunk_table()\n",
+ "\n",
"new_rc_params = {\"text.usetex\": False, \"svg.fonttype\": \"none\"}\n",
"mpl.rcParams.update(new_rc_params)\n",
- "plt.rcParams[\"font.sans-serif\"] = [\"Arial\"]\n",
- "plt.rcParams[\"font.size\"] = 12\n",
- "\n",
- "%matplotlib widget\n",
- "%load_ext autoreload\n",
- "%autoreload 2"
+ "plt.rcParams[\"font.size\"] = 12"
]
},
{
"cell_type": "code",
- "execution_count": 3,
- "id": "fd46321d",
+ "execution_count": null,
+ "id": "9a63283cbaf04dbcab1f6479b197f3a8",
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.microsoft.datawrangler.viewer.v0+json": {
- "columns": [
- {
- "name": "index",
- "rawType": "int64",
- "type": "integer"
- },
- {
- "name": "subject_name",
- "rawType": "object",
- "type": "string"
- },
- {
- "name": "session_datetime",
- "rawType": "datetime64[ns]",
- "type": "datetime"
- },
- {
- "name": "session_num",
- "rawType": "int64",
- "type": "integer"
- },
- {
- "name": "starttime",
- "rawType": "datetime64[ns]",
- "type": "datetime"
- },
- {
- "name": "duration",
- "rawType": "float64",
- "type": "float"
- },
- {
- "name": "setting_task_type",
- "rawType": "object",
- "type": "string"
- },
- {
- "name": "setting_modalities",
- "rawType": "object",
- "type": "unknown"
- },
- {
- "name": "setting_left_reward_volume",
- "rawType": "float64",
- "type": "float"
- },
- {
- "name": "setting_right_reward_volume",
- "rawType": "float64",
- "type": "float"
- },
- {
- "name": "setting_prob_audio",
- "rawType": "float64",
- "type": "float"
- },
- {
- "name": "setting_prob_vision",
- "rawType": "float64",
- "type": "float"
- },
- {
- "name": "setting_high_rate_side",
- "rawType": "object",
- "type": "string"
- }
- ],
- "ref": "1b2f4d73-bb0b-4b29-965e-418b3a1bcce8",
- "rows": [
- [
- "0",
- "GRB006",
- "2024-08-26 11:33:07",
- "211",
- "2024-08-26 11:34:07",
- "3256.48",
- "discrimination",
- "['auditory']",
- "3.0",
- "3.0",
- "1.0",
- "0.0",
- "right"
- ]
- ],
- "shape": {
- "columns": 12,
- "rows": 1
- }
- },
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
subject_name
\n",
- "
session_datetime
\n",
- "
session_num
\n",
- "
starttime
\n",
- "
duration
\n",
- "
setting_task_type
\n",
- "
setting_modalities
\n",
- "
setting_left_reward_volume
\n",
- "
setting_right_reward_volume
\n",
- "
setting_prob_audio
\n",
- "
setting_prob_vision
\n",
- "
setting_high_rate_side
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
GRB006
\n",
- "
2024-08-26 11:33:07
\n",
- "
211
\n",
- "
2024-08-26 11:34:07
\n",
- "
3256.48
\n",
- "
discrimination
\n",
- "
[auditory]
\n",
- "
3.0
\n",
- "
3.0
\n",
- "
1.0
\n",
- "
0.0
\n",
- "
right
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " subject_name session_datetime ... setting_prob_vision setting_high_rate_side\n",
- "0 GRB006 2024-08-26 11:33:07 ... 0.0 right\n",
- "\n",
- "[1 rows x 12 columns]"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
- "pd.DataFrame(\n",
- " Chipmunk() & 'subject_name = \"GRB006\"' & 'session_datetime LIKE \"2024-08-26%\"'\n",
- ")"
+ "pd.DataFrame(Chipmunk() & 'subject_name = \"GRB006\"' & 'session_name LIKE \"20240826%\"')"
]
},
{
"cell_type": "code",
- "execution_count": 4,
- "id": "01b67aa5",
+ "execution_count": null,
+ "id": "8dd0d8092fe74a7c96281538738b07e2",
"metadata": {},
"outputs": [],
"source": [
@@ -208,21 +66,13 @@
],
"metadata": {
"kernelspec": {
- "display_name": "base",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
"name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.12"
+ "pygments_lexer": "ipython3"
}
},
"nbformat": 4,
diff --git a/src/behavior_analyses/__init__.py b/src/behavior_analyses/__init__.py
new file mode 100644
index 0000000..aaae20f
--- /dev/null
+++ b/src/behavior_analyses/__init__.py
@@ -0,0 +1 @@
+"""Behavior-only analyses backed by labdata."""
diff --git a/src/behavior_analyses/io.py b/src/behavior_analyses/io.py
new file mode 100644
index 0000000..d49af1f
--- /dev/null
+++ b/src/behavior_analyses/io.py
@@ -0,0 +1,89 @@
+from __future__ import annotations
+
+from pathlib import Path
+import importlib.util
+import os
+import sys
+from typing import Any
+
+
+def _repo_root() -> Path:
+ return Path(__file__).resolve().parents[2]
+
+
+def _configured_chipmunk_plugin_path() -> Path | None:
+ env_path = os.environ.get("CHIPMUNK_PLUGIN_PATH", "").strip()
+ if env_path:
+ return Path(env_path).expanduser()
+
+ pyproject = _repo_root() / "pyproject.toml"
+ if not pyproject.exists():
+ return None
+
+ in_section = False
+ for line in pyproject.read_text(encoding="utf-8").splitlines():
+ stripped = line.strip()
+ if stripped.startswith("[") and stripped.endswith("]"):
+ in_section = stripped == "[tool.behavior_analyses]"
+ continue
+ if not in_section or not stripped.startswith("chipmunk_plugin_path"):
+ continue
+ _, _, value = stripped.partition("=")
+ value = value.strip().strip("\"'")
+ if value:
+ return Path(value).expanduser()
+ return None
+
+
+def get_chipmunk_table() -> Any:
+ """Return the labdata Chipmunk plugin table.
+
+ Preferred path: ``from chipmunk import Chipmunk`` (plugin entry point).
+ Optional fallback: load a local checkout via ``CHIPMUNK_PLUGIN_PATH`` or
+ ``tool.behavior_analyses.chipmunk_plugin_path`` in ``pyproject.toml``.
+ """
+ try:
+ from chipmunk import Chipmunk
+
+ return Chipmunk
+ except ModuleNotFoundError:
+ plugin_path = _configured_chipmunk_plugin_path()
+ if plugin_path is None:
+ raise ModuleNotFoundError(
+ "Chipmunk plugin not importable as `chipmunk`, and no "
+ "CHIPMUNK_PLUGIN_PATH / tool.behavior_analyses.chipmunk_plugin_path "
+ "is configured."
+ ) from None
+ return _load_local_chipmunk_plugin(plugin_path).Chipmunk
+
+
+def _load_local_chipmunk_plugin(plugin_root: Path) -> Any:
+ module_name = "_behavior_analyses_chipmunk_plugin"
+ if module_name in sys.modules:
+ return sys.modules[module_name]
+
+ init_path = plugin_root / "labdata_plugin" / "__init__.py"
+ if not init_path.exists():
+ alt = plugin_root / "__init__.py"
+ if alt.exists() and plugin_root.name == "labdata_plugin":
+ init_path = alt
+ search_locations = [str(plugin_root)]
+ else:
+ raise ModuleNotFoundError(
+ f"Could not find Chipmunk plugin at {plugin_root}; expected "
+ f"{plugin_root / 'labdata_plugin' / '__init__.py'}"
+ )
+ else:
+ search_locations = [str(init_path.parent)]
+
+ spec = importlib.util.spec_from_file_location(
+ module_name,
+ init_path,
+ submodule_search_locations=search_locations,
+ )
+ if spec is None or spec.loader is None:
+ raise ModuleNotFoundError(f"Could not load Chipmunk plugin from {init_path}")
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[module_name] = module
+ spec.loader.exec_module(module)
+ return module
diff --git a/src/behavior_analyses/kernels.py b/src/behavior_analyses/kernels.py
new file mode 100644
index 0000000..038ce97
--- /dev/null
+++ b/src/behavior_analyses/kernels.py
@@ -0,0 +1,88 @@
+from __future__ import annotations
+
+import numpy as np
+from sklearn.linear_model import LogisticRegression
+from sklearn.model_selection import StratifiedKFold
+
+
+def build_residual_rate_matrix(
+ stim_events,
+ response_values,
+ *,
+ timebins: int = 10,
+ max_rate_hz: float = 20.0,
+) -> tuple[np.ndarray, np.ndarray]:
+ rows = []
+ choices = []
+ for events, response in zip(stim_events, response_values):
+ if response not in (-1, 1):
+ continue
+ events = np.asarray(events, dtype=float)
+ events = events[np.isfinite(events)]
+ if events.size < 2:
+ continue
+ bins = np.linspace(events[0], events[-1], num=timebins + 1)
+ specific_rate = max_rate_hz / len(bins)
+ instantaneous_rate, _ = np.histogram(events, bins=bins)
+ rows.append(instantaneous_rate - specific_rate)
+ choices.append(response == 1)
+ if not rows:
+ return np.empty((0, timebins)), np.empty((0,), dtype=int)
+ return np.asarray(rows, dtype=float), np.asarray(choices, dtype=int)
+
+
+def fit_psychophysical_kernel(
+ stim_events,
+ response_values,
+ *,
+ timebins: int = 10,
+ cv_splits: int = 10,
+ random_state: int = 0,
+ max_rate_hz: float = 20.0,
+ regularization_c: float = 1.0,
+) -> dict:
+ x, y = build_residual_rate_matrix(
+ stim_events, response_values, timebins=timebins, max_rate_hz=max_rate_hz
+ )
+ if x.shape[0] < cv_splits or np.unique(y).size < 2:
+ return {
+ "design_matrix": x,
+ "choice_right": y,
+ "weights": np.empty((0, timebins)),
+ "scores": np.empty((0,)),
+ "bias": np.empty((0,)),
+ "error": np.empty((0, timebins)),
+ }
+
+ splitter = StratifiedKFold(
+ n_splits=cv_splits, shuffle=True, random_state=random_state
+ )
+ weights = []
+ scores = []
+ biases = []
+ errors = []
+ for train_index, test_index in splitter.split(x, y):
+ x_train, x_test = x[train_index], x[test_index]
+ y_train, y_test = y[train_index], y[test_index]
+ model = LogisticRegression(
+ penalty="l2",
+ solver="liblinear",
+ C=regularization_c,
+ fit_intercept=True,
+ ).fit(x_train, y_train)
+ predict_prob = model.predict_proba(x_train)
+ variance = np.prod(predict_prob, axis=1)
+ covariance = np.linalg.pinv(np.dot(x_train.T * variance, x_train))
+ errors.append(np.sqrt(np.diag(covariance)))
+ weights.append(model.coef_[0])
+ scores.append(model.score(x_test, y_test))
+ biases.append(model.intercept_[0])
+
+ return {
+ "design_matrix": x,
+ "choice_right": y,
+ "weights": np.asarray(weights, dtype=float),
+ "scores": np.asarray(scores, dtype=float),
+ "bias": np.asarray(biases, dtype=float),
+ "error": np.asarray(errors, dtype=float),
+ }
diff --git a/src/behavior_analyses/learning.py b/src/behavior_analyses/learning.py
new file mode 100644
index 0000000..bb5b74d
--- /dev/null
+++ b/src/behavior_analyses/learning.py
@@ -0,0 +1,52 @@
+from __future__ import annotations
+
+import numpy as np
+
+
+def _as_float_array(value) -> np.ndarray:
+ return np.asarray(value if value is not None else [], dtype=float)
+
+
+def summarize_trialset(row: dict) -> dict:
+ response_values = _as_float_array(row.get("response_values"))
+ correct_values = _as_float_array(row.get("correct_values"))
+ initiation_times = _as_float_array(row.get("initiation_times"))
+ reaction_times = _as_float_array(row.get("reaction_times"))
+ intensity_values = _as_float_array(row.get("intensity_values"))
+
+ valid_choices = np.isfinite(response_values) & (response_values != 0)
+ valid_correct = np.isfinite(correct_values)
+
+ return {
+ "n_trials": int(row.get("n_trials", len(response_values))),
+ "n_with_choice": int(np.sum(valid_choices)),
+ "n_correct": int(np.nansum(correct_values[valid_correct]))
+ if valid_correct.any()
+ else 0,
+ "performance": _finite_or_none(row.get("performance")),
+ "performance_easy": _finite_or_none(row.get("performance_easy")),
+ "mean_initiation_time": _nanmean_or_none(initiation_times),
+ "mean_reaction_time": _nanmean_or_none(reaction_times),
+ "stim_values": np.sort(
+ np.unique(intensity_values[np.isfinite(intensity_values)])
+ ),
+ "response_values": response_values,
+ "correct_values": correct_values,
+ "intensity_values": intensity_values,
+ }
+
+
+def _nanmean_or_none(values: np.ndarray) -> float | None:
+ finite = values[np.isfinite(values)]
+ if finite.size == 0:
+ return None
+ return float(np.mean(finite))
+
+
+def _finite_or_none(value) -> float | None:
+ if value is None:
+ return None
+ value = float(value)
+ if not np.isfinite(value):
+ return None
+ return value
diff --git a/src/behavior_analyses/psychometrics.py b/src/behavior_analyses/psychometrics.py
new file mode 100644
index 0000000..669203e
--- /dev/null
+++ b/src/behavior_analyses/psychometrics.py
@@ -0,0 +1,63 @@
+from __future__ import annotations
+
+import numpy as np
+from fit_psychometric import cumulative_gaussian, fit_psychometric
+
+__all__ = ["cumulative_gaussian", "fit_psychometric_labdata"]
+
+MIN_CHOICES = 100
+MIN_STIM_VALUES = 6
+
+
+def fit_psychometric_labdata(
+ stim_values,
+ response_values,
+ *,
+ min_choices: int = MIN_CHOICES,
+ min_required_stim_values: int = MIN_STIM_VALUES,
+):
+ """Fit psychometrics using the external fitter and labdata response coding."""
+ stim_values = np.asarray(stim_values, dtype=float)
+ response_values = np.asarray(response_values, dtype=float)
+ valid_choice = np.isfinite(stim_values) & np.isin(response_values, [-1, 1])
+ stim_values = stim_values[valid_choice]
+ response_values = response_values[valid_choice]
+ if response_values.size < min_choices:
+ return None
+
+ choice_right = (response_values == 1).astype(float)
+ fit_result = fit_psychometric(
+ stim_values,
+ choice_right,
+ min_required_stim_values=min_required_stim_values,
+ )
+ if fit_result["fit_params"] is None:
+ return None
+
+ params = np.asarray(fit_result["fit_params"], dtype=float)
+ predicted = fit_result["function"](*params, np.asarray(fit_result["stims"]))
+ goodness_of_fit = _r_squared(np.asarray(fit_result["p_side"]), predicted)
+ return {
+ "stims": np.asarray(fit_result["stims"], dtype=float),
+ "p_side": np.asarray(fit_result["p_side"], dtype=float),
+ "p_right": np.asarray(fit_result["p_side"], dtype=float),
+ "p_side_ci": np.asarray(fit_result["p_side_ci"], dtype=float),
+ "p_right_ci": np.asarray(fit_result["p_side_ci"], dtype=float),
+ "n_side": np.asarray(fit_result["n_side"], dtype=float),
+ "n_right": np.asarray(fit_result["n_side"], dtype=float),
+ "n_obs": np.asarray(fit_result["n_obs"], dtype=float),
+ "bias": float(params[0]),
+ "sensitivity": float(params[1]),
+ "guess_rate": float(params[2]),
+ "lapse_rate": float(params[3]),
+ "goodness_of_fit": goodness_of_fit,
+ "fit_params": params,
+ }
+
+
+def _r_squared(observed, predicted) -> float:
+ ss_res = np.sum((observed - predicted) ** 2)
+ ss_tot = np.sum((observed - np.mean(observed)) ** 2)
+ if ss_tot == 0:
+ return float("nan")
+ return float(1 - (ss_res / ss_tot))
diff --git a/tests/test_analysis_functions.py b/tests/test_analysis_functions.py
new file mode 100644
index 0000000..ec10f73
--- /dev/null
+++ b/tests/test_analysis_functions.py
@@ -0,0 +1,107 @@
+from __future__ import annotations
+
+from pathlib import Path
+import sys
+import types
+import unittest
+
+import numpy as np
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+SRC_ROOT = REPO_ROOT / "src"
+sys.path.insert(0, str(SRC_ROOT))
+
+
+class PsychometricTests(unittest.TestCase):
+ def test_package_adapter_uses_labdata_rightward_response_code(self):
+ fake_module = types.ModuleType("fit_psychometric")
+
+ def cumulative_gaussian(alpha, beta, gamma, lapse, x):
+ x = np.asarray(x, dtype=float)
+ return gamma + (1 - gamma - lapse) / (1 + np.exp(-beta * (x - alpha)))
+
+ def fit_psychometric(stim_values, response_values, min_required_stim_values):
+ stims = np.unique(stim_values)
+ p_side = np.array(
+ [np.mean(response_values[stim_values == stim]) for stim in stims]
+ )
+ n_obs = np.array([np.sum(stim_values == stim) for stim in stims])
+ n_side = p_side * n_obs
+ if len(stims) < min_required_stim_values:
+ fit_params = None
+ else:
+ fit_params = np.array([12.0, 0.2, p_side[0], 1 - p_side[-1]])
+ return {
+ "stims": stims,
+ "p_side": p_side,
+ "p_side_ci": np.column_stack([p_side, p_side]),
+ "n_side": n_side,
+ "n_obs": n_obs,
+ "fit_params": fit_params,
+ "fit": object(),
+ "function": cumulative_gaussian,
+ }
+
+ fake_module.cumulative_gaussian = cumulative_gaussian
+ fake_module.fit_psychometric = fit_psychometric
+ sys.modules["fit_psychometric"] = fake_module
+
+ from behavior_analyses.psychometrics import fit_psychometric_labdata
+
+ stims = np.repeat(np.array([4, 6, 8, 12, 16, 20], dtype=float), 30)
+ responses = np.where(stims > 12, 1, -1)
+ responses[stims == 12] = np.tile([1, -1], 15)
+
+ fit = fit_psychometric_labdata(stims, responses, min_choices=20)
+
+ self.assertIsNotNone(fit)
+ self.assertEqual(fit["stims"].tolist(), [4, 6, 8, 12, 16, 20])
+ np.testing.assert_allclose(fit["p_right"], [0, 0, 0, 0.5, 1, 1])
+ self.assertEqual(len(fit["fit_params"]), 4)
+
+
+class LearningTests(unittest.TestCase):
+ def test_summarize_trialset_counts_choice_and_means(self):
+ from behavior_analyses.learning import summarize_trialset
+
+ summary = summarize_trialset(
+ {
+ "n_trials": 4,
+ "performance": 0.75,
+ "performance_easy": 1.0,
+ "response_values": np.array([1, -1, 0, np.nan]),
+ "correct_values": np.array([1, 1, 0, np.nan]),
+ "initiation_times": np.array([0.2, 0.3, np.nan, 0.5]),
+ "reaction_times": np.array([0.1, np.nan, 0.2, 0.3]),
+ "intensity_values": np.array([4, 8, 8, np.nan]),
+ }
+ )
+
+ self.assertEqual(summary["n_trials"], 4)
+ self.assertEqual(summary["n_with_choice"], 2)
+ self.assertEqual(summary["n_correct"], 2)
+ self.assertAlmostEqual(summary["mean_initiation_time"], 1.0 / 3.0)
+ np.testing.assert_allclose(summary["stim_values"], [4, 8])
+
+
+class KernelTests(unittest.TestCase):
+ def test_kernel_design_matrix_skips_no_choice_and_short_stim_trials(self):
+ from behavior_analyses.kernels import build_residual_rate_matrix
+
+ stim_events = [
+ np.array([0.0, 0.1, 0.2]),
+ np.array([0.0]),
+ np.array([0.0, 0.2, 0.4]),
+ ]
+ responses = np.array([1, -1, 0])
+
+ x, y = build_residual_rate_matrix(stim_events, responses, timebins=2)
+
+ self.assertEqual(x.shape, (1, 2))
+ np.testing.assert_allclose(x[0], [1 - 20 / 3, 2 - 20 / 3])
+ np.testing.assert_array_equal(y, [1])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/test_cli_and_migration_contracts.py b/tests/test_cli_and_migration_contracts.py
new file mode 100644
index 0000000..bdf9eff
--- /dev/null
+++ b/tests/test_cli_and_migration_contracts.py
@@ -0,0 +1,291 @@
+from __future__ import annotations
+
+from datetime import datetime
+import json
+from pathlib import Path
+import runpy
+import sys
+import types
+import unittest
+from unittest.mock import MagicMock, patch
+
+import numpy as np
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+SCRIPTS = REPO_ROOT / "scripts" / "analyses"
+SRC_ROOT = REPO_ROOT / "src"
+sys.path.insert(0, str(SRC_ROOT))
+sys.path.insert(0, str(REPO_ROOT))
+sys.path.insert(0, str(SCRIPTS))
+
+
+class _Andable:
+ def __and__(self, _other):
+ return self
+
+ def __sub__(self, _other):
+ return [1, 2]
+
+
+class FakeTrialSet(_Andable):
+ def __init__(self, rows):
+ self._rows = rows
+
+ def __call__(self):
+ return self
+
+ def fetch(self, *_args, **_kwargs):
+ return self._rows
+
+
+class FakeComputed:
+ key_source = _Andable()
+
+ def __call__(self):
+ return self
+
+ @staticmethod
+ def populate(*_args, **_kwargs):
+ raise AssertionError("populate should not run in dry-run")
+
+
+class CliContractTests(unittest.TestCase):
+ def test_schema_migration_archive_names_leave_room_for_foreign_keys(self):
+ module = runpy.run_path(str(SCRIPTS / "migrate_behavior_analysis_schema.py"))
+
+ self.assertTrue(
+ all(
+ len(f"{name}_ibfk_99") <= 64
+ for name in module["ARCHIVE_TABLES"].values()
+ )
+ )
+
+ def test_schema_migration_rejects_occupied_target_tables(self):
+ module = runpy.run_path(str(SCRIPTS / "migrate_behavior_analysis_schema.py"))
+ connection = MagicMock()
+ connection.query.return_value.fetchall.return_value = [
+ *[(name,) for name in module["ARCHIVE_TABLES"]],
+ ("behavior_analysis_set",),
+ ]
+
+ with self.assertRaisesRegex(RuntimeError, "occupied_targets"):
+ module["_validate_table_state"](connection, "labdata_user")
+
+ expected = MagicMock()
+ expected.fetchall.return_value = [(10, 10, 0)]
+ incompatible = MagicMock()
+ incompatible.fetchall.return_value = [(8, 10, 0)]
+ connection.query.side_effect = [expected, incompatible]
+ with self.assertRaisesRegex(RuntimeError, "Incompatible legacy kernel"):
+ module["_validate_kernel_configs"](connection, "labdata_user")
+
+ def test_schema_migration_accepts_expected_resume_state(self):
+ module = runpy.run_path(str(SCRIPTS / "migrate_behavior_analysis_schema.py"))
+ connection = MagicMock()
+ existing = (
+ set(module["ARCHIVE_TABLES"].values())
+ | module["NEW_TABLES"]
+ | module["COMPUTED_TABLES"]
+ )
+ connection.query.return_value.fetchall.return_value = [
+ (name,) for name in existing
+ ]
+
+ module["_validate_resume_state"](connection, "labdata_user")
+
+ def test_schema_migration_deduplicates_direct_trialset_keys(self):
+ module = runpy.run_path(str(SCRIPTS / "migrate_behavior_analysis_schema.py"))
+ rows = [
+ {"subject_name": "GRB001", "session_name": "s1", "set": "a"},
+ {"subject_name": "GRB001", "session_name": "s1", "set": "b"},
+ {"subject_name": "GRB001", "session_name": "s2", "set": "a"},
+ ]
+
+ unique = module["_deduplicate_by_fields"](
+ rows, ("subject_name", "session_name")
+ )
+
+ self.assertEqual([row["session_name"] for row in unique], ["s1", "s2"])
+
+ def test_seed_script_dry_run_prints_counts_without_insert(self):
+ fake_rows = [
+ {
+ "subject_name": "GRB001",
+ "session_name": "20240101_120000",
+ "trialset_description": "visual",
+ },
+ {
+ "subject_name": "GRB001",
+ "session_name": "20240102_120000",
+ "trialset_description": "visual",
+ },
+ ]
+
+ fake_schema = types.ModuleType("labdata.schema")
+ fake_schema.DecisionTask = types.SimpleNamespace(
+ TrialSet=FakeTrialSet(fake_rows)
+ )
+
+ fake_labdata = types.ModuleType("labdata")
+ fake_labdata.schema = fake_schema
+
+ def _boom(*_args, **_kwargs):
+ raise AssertionError("database writes should not run in dry-run")
+
+ fake_plugin = types.ModuleType("labdata_plugin.analysisschema")
+ fake_plugin.BehaviorAnalysisSet = types.SimpleNamespace(
+ insert1=_boom,
+ TrialSet=types.SimpleNamespace(insert=_boom),
+ )
+
+ argv = [
+ "seed_behavior_analysis_set.py",
+ "--analysis-set-id",
+ "test_set",
+ "--name",
+ "Test",
+ "--subjects",
+ "GRB001",
+ "--dry-run",
+ ]
+ with (
+ patch.dict(
+ sys.modules,
+ {
+ "labdata": fake_labdata,
+ "labdata.schema": fake_schema,
+ "labdata_plugin": types.ModuleType("labdata_plugin"),
+ "labdata_plugin.analysisschema": fake_plugin,
+ },
+ ),
+ patch.object(sys, "argv", argv),
+ ):
+ runpy.run_path(
+ str(SCRIPTS / "seed_behavior_analysis_set.py"), run_name="__main__"
+ )
+
+ def test_populate_script_dry_run_reports_pending(self):
+ fake_plugin = types.ModuleType("labdata_plugin.analysisschema")
+ fake_plugin.BehaviorAnalysisSet = types.SimpleNamespace(
+ TrialSet=FakeTrialSet([])
+ )
+ for name in [
+ "PsychometricSessionFit",
+ "PsychometricSubjectFit",
+ "PsychophysicalKernel",
+ ]:
+ setattr(fake_plugin, name, type(name, (FakeComputed,), {}))
+
+ argv = [
+ "populate_behavior_tables.py",
+ "--analysis-set-id",
+ "test_set",
+ "--dry-run",
+ ]
+ with (
+ patch.dict(
+ sys.modules,
+ {
+ "labdata_plugin": types.ModuleType("labdata_plugin"),
+ "labdata_plugin.analysisschema": fake_plugin,
+ },
+ ),
+ patch.object(sys, "argv", argv),
+ ):
+ runpy.run_path(
+ str(SCRIPTS / "populate_behavior_tables.py"), run_name="__main__"
+ )
+
+
+class IoConfigTests(unittest.TestCase):
+ def test_configured_path_reads_env(self):
+ from behavior_analyses import io as io_mod
+
+ with patch.dict("os.environ", {"CHIPMUNK_PLUGIN_PATH": "/tmp/chipmunk-plugin"}):
+ path = io_mod._configured_chipmunk_plugin_path()
+ self.assertEqual(path, Path("/tmp/chipmunk-plugin"))
+
+
+class PsychometricPlotHelperTests(unittest.TestCase):
+ def test_fetch_uses_labdata_rates_and_session_names(self):
+ from psychometric_curves import utils
+
+ relation = MagicMock()
+ relation.__mul__.return_value = relation
+ relation.__and__.return_value = relation
+ relation.fetch.return_value = (
+ np.array([1, -1, 1]),
+ np.array(["visual", "audio", "visual+audio"]),
+ np.array([20.0, 8.0, 20.0]),
+ np.array([14.0, 20.0, 13.0]),
+ np.array([12.0, 10.0, 12.0]),
+ )
+ part = MagicMock(return_value=relation)
+ chipmunk = types.SimpleNamespace(Trial=part, TrialParameters=part)
+ with patch.object(utils, "get_chipmunk_table", return_value=chipmunk):
+ responses, intensity = utils._fetch_choice_and_stim(
+ "GRB006",
+ None,
+ [datetime(2024, 8, 26, 11, 33, 7)],
+ )
+
+ np.testing.assert_array_equal(responses, [1, -1, 1])
+ np.testing.assert_allclose(intensity, [2, -2, 1])
+ self.assertIn(
+ [{"session_name": "20240826_113307"}],
+ [call.args[0] for call in relation.__and__.call_args_list],
+ )
+ self.assertNotIn("stim_rate", relation.fetch.call_args.args)
+
+
+class NoDjchurchlandImportsTests(unittest.TestCase):
+ def test_maintained_python_sources_do_not_import_djchurchland(self):
+ import ast
+
+ roots = [
+ REPO_ROOT / "src",
+ REPO_ROOT / "scripts",
+ REPO_ROOT / "labdata_plugin",
+ REPO_ROOT / "psychometric_curves" / "utils.py",
+ REPO_ROOT / "tests",
+ ]
+ offenders = []
+ for root in roots:
+ paths = [root] if root.is_file() else root.rglob("*.py")
+ for path in paths:
+ tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path))
+ for node in ast.walk(tree):
+ if isinstance(node, ast.Import):
+ names = [alias.name for alias in node.names]
+ elif isinstance(node, ast.ImportFrom):
+ names = [node.module or ""]
+ else:
+ continue
+ if any(
+ name == "djchurchland" or name.startswith("djchurchland.")
+ for name in names
+ ):
+ offenders.append(str(path.relative_to(REPO_ROOT)))
+ break
+
+ for path in [
+ REPO_ROOT / "behavioral_metrics" / "plot_learning_curves.ipynb",
+ REPO_ROOT / "psychometric_curves" / "plot_psychometric_fits.ipynb",
+ REPO_ROOT / "psychophysical_kernels" / "plot_kernels.ipynb",
+ REPO_ROOT / "sess.ipynb",
+ ]:
+ notebook = json.loads(path.read_text(encoding="utf-8"))
+ code = "\n".join(
+ "".join(cell["source"])
+ for cell in notebook["cells"]
+ if cell["cell_type"] == "code"
+ )
+ if "djchurchland" in code:
+ offenders.append(str(path.relative_to(REPO_ROOT)))
+
+ self.assertEqual(offenders, [])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/test_schema_imports.py b/tests/test_schema_imports.py
new file mode 100644
index 0000000..aed5355
--- /dev/null
+++ b/tests/test_schema_imports.py
@@ -0,0 +1,78 @@
+from __future__ import annotations
+
+import importlib
+from pathlib import Path
+import sys
+import types
+import unittest
+from unittest.mock import patch
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+SRC_ROOT = REPO_ROOT / "src"
+sys.path.insert(0, str(SRC_ROOT))
+sys.path.insert(0, str(REPO_ROOT))
+
+
+class FakeRelation:
+ def __and__(self, _other):
+ return self
+
+ def __sub__(self, _other):
+ return self
+
+
+class FakeTable(FakeRelation):
+ key_source = FakeRelation()
+
+ def __call__(self):
+ return self
+
+
+class FakeSchema:
+ def __call__(self, cls):
+ return cls
+
+
+class SchemaImportTests(unittest.TestCase):
+ def test_locked_datajoint_imports(self):
+ import datajoint
+
+ self.assertTrue(hasattr(datajoint, "schema"))
+
+ def test_analysis_schema_imports_with_fake_labdata(self):
+ fake_dj = types.ModuleType("datajoint")
+ fake_dj.Manual = FakeTable
+ fake_dj.Lookup = FakeTable
+ fake_dj.Computed = FakeTable
+ fake_dj.Part = FakeTable
+
+ fake_schema = types.ModuleType("labdata.schema")
+ fake_schema.DecisionTask = types.SimpleNamespace(TrialSet=FakeTable())
+ fake_schema.Subject = FakeTable
+ fake_schema.get_user_schema = lambda: FakeSchema()
+
+ fake_labdata = types.ModuleType("labdata")
+ fake_labdata.schema = fake_schema
+
+ with patch.dict(
+ sys.modules,
+ {
+ "datajoint": fake_dj,
+ "labdata": fake_labdata,
+ "labdata.schema": fake_schema,
+ },
+ ):
+ sys.modules.pop("labdata_plugin.analysisschema", None)
+ module = importlib.import_module("labdata_plugin.analysisschema")
+ module = importlib.reload(module)
+
+ self.assertTrue(hasattr(module, "BehaviorAnalysisSet"))
+ self.assertTrue(hasattr(module, "PsychometricFitConfig"))
+ self.assertTrue(hasattr(module, "PsychophysicalKernelFitConfig"))
+ self.assertTrue(hasattr(module, "PsychophysicalKernel"))
+ self.assertFalse(hasattr(module, "LearningSessionMetrics"))
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/third_party/fit_psychometric/LICENSE b/third_party/fit_psychometric/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/third_party/fit_psychometric/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/third_party/fit_psychometric/README.md b/third_party/fit_psychometric/README.md
new file mode 100644
index 0000000..3fd1d63
--- /dev/null
+++ b/third_party/fit_psychometric/README.md
@@ -0,0 +1,3 @@
+# Vendored from https://github.com/jcouto/fit_psychometric at commit 665d058.
+# Upstream is unpackaged; this tree adds a minimal pyproject.toml for uv/pip.
+# See LICENSE in this directory.
diff --git a/third_party/fit_psychometric/fit_psychometric/__init__.py b/third_party/fit_psychometric/fit_psychometric/__init__.py
new file mode 100644
index 0000000..adc6797
--- /dev/null
+++ b/third_party/fit_psychometric/fit_psychometric/__init__.py
@@ -0,0 +1,6 @@
+from .analysis import (compute_proportions,
+ fit_psychometric,
+ PsychometricRegression,
+ cumulative_gaussian,
+ weibull)
+
diff --git a/third_party/fit_psychometric/fit_psychometric/analysis.py b/third_party/fit_psychometric/fit_psychometric/analysis.py
new file mode 100644
index 0000000..8495ded
--- /dev/null
+++ b/third_party/fit_psychometric/fit_psychometric/analysis.py
@@ -0,0 +1,234 @@
+# the following is from github.com/jcouto/btss
+from statsmodels.stats.proportion import proportion_confint
+from scipy.special import erfc # import the complementary error function
+from scipy.special import erf # import the error function
+# This has example ways to fit the psychometric function and getting confidence intervals
+from statsmodels.base.model import GenericLikelihoodModel
+from scipy.optimize import minimize
+import numpy as np
+
+# weibull fit
+def weibull(bias, slope, gamma1, gamma2, X):
+ ''' weibull function with lapse rates
+ '''
+ return gamma1 + (1. - gamma1 - gamma2) * (erf((X - bias) / slope) + 1.) / 2. +1e-9
+
+def cumulative_gaussian(alpha,beta,gamma,lmbda, X):
+ '''
+ Evaluate the cumulative gaussian psychometric function.
+ alpha is the bias (left or right)
+ beta is the stepness
+ gamma is the left handside offset
+ lmbda is the right handside offset
+
+ Adapted from the Palamedes toolbox
+ Joao Couto - Jan 2022
+ '''
+
+ from scipy.special import erfc # import the complementary error function
+ return gamma + (1 - gamma - lmbda)*0.5*erfc(-beta*(X-alpha)/np.sqrt(2))+1e-9
+
+# log likelihood when using minimize
+def neg_log_likelihood_error(func, parameters, X, Y):
+ '''
+ Compute the log likelihood
+
+ 'func' is the (psychometric) function
+ 'parameters' are the input parameters to 'func'
+ 'Y' is the binary response (correct = 1; incorrect=0)
+ Joao Couto - Jan 2022
+ '''
+
+ pX = func(*parameters, X)*0.99 + 0.005 # the predicted performance for X from the PMF
+ # epsilon to prevent error in log(0)
+ val = np.nansum(Y*np.log(pX) + (1-Y)*np.log(1-pX))
+ return -1*val
+
+def compute_proportions(stim_values, response_values):
+ '''
+ Computes the proportion of responses to each stimulus value.
+Returns:
+ - stims - unique stimulus intensities
+ - p_side - proportion of trials to the side
+ - ci_side - confidance intervals from binomial distribution with the wilson method
+ - n_obs - number of observations (trials for each)
+ - n_side - number of trials to the specific side
+
+
+Joao Couto - Jan 2023
+ '''
+
+ stims = np.unique(stim_values)
+ p_side = np.zeros_like(stims,dtype=float)
+ ci_side = np.zeros((len(stims),2),dtype=float)
+ n_obs = np.zeros_like(stims,dtype=float)
+ n_side = np.zeros_like(stims,dtype=float)
+ for i,intensity in enumerate(stims):
+ # number of times the subject licked to one of the sides
+ cnt = np.sum(response_values[stim_values == intensity])
+ nobs = np.sum(stim_values == intensity) # number of observations (ntrials)
+ n_obs[i] = nobs
+ n_side[i] = cnt
+ p_side[i] = cnt/nobs
+ ci_side[i] = proportion_confint(cnt,nobs,method='wilson') # 95% confidence interval
+ return stims,p_side,ci_side,n_obs,n_side
+
+# statsmodels gives confidence and p values for the fit
+class PsychometricRegression(GenericLikelihoodModel):
+ '''
+ Fits a psychometric with constraints function (constrained weibull e.g.)
+
+ This is part of the tools for github.com/jcouto/btss
+
+ Inputs:
+ endog - are the response values for each trial
+ exog - are the stim intensities for each trial
+ func - the function to fit; default weibull with lapses
+ bound - the constraints to the fit; default [(min(x),max(x)),(0.01,1000),(0,1),(0,1)]
+ startpar_function - a function to get the start guess for the fit
+ parnames - the names of the fit parameters
+
+ Usage:
+
+ ft = PsychometricRegression(response_values.astype(float),
+ exog = stim_values.astype(float))
+ res = ft.fit(min_required_stim_values = min_required_stim_values, full_output=True)
+ print(res.summary())
+
+ Joao Couto - Feb 2023
+ '''
+ def __init__(self, endog, exog, func = None, bounds = None,startpar_function = None,parnames = None, **kwds):
+ '''
+ Fits a psychometric with constraints function (constrained weibull e.g.)
+
+ This is part of the tools for github.com/jcouto/btss
+
+ Inputs:
+ endog - are the response values for each trial
+ exog - are the stim intensities for each trial
+ func - the function to fit; default weibull with lapses
+ bound - the constraints to the fit; default [(min(x),max(x)),(0.01,1000),(0,1),(0,1)]
+ startpar_function - a function to get the start guess for the fit
+ parnames - the names of the fit parameters
+
+ Usage:
+
+ ft = PsychometricRegression(response_values.astype(float),
+ exog = stim_values.astype(float))
+ res = ft.fit(min_required_stim_values = min_required_stim_values, full_output=True)
+ print(res.summary())
+
+ Joao Couto - Feb 2023
+ '''
+
+ super(PsychometricRegression, self).__init__(endog, exog, **kwds)
+ if not func is None:
+ self.fit_function = func
+ self.bounds = None
+ self.get_start_params = startpar_function
+ if not parnames is None:
+ self.exog_names[:] = parnames
+ else:
+ self.fit_function = cumulative_gaussian
+ self.exog_names[:] = ['bias','sensitivity','gamma1','gamma2']
+ self.bounds = [(np.min(self.exog[:,0]),np.max(self.exog[:,0])),
+ (0.001,0.3),
+ (0,0.5),(0,0.5)]
+ self.get_start_params = lambda x,y: [0,1./np.max(x),y[0],1-y[-1]]
+
+
+ def loglikeobs(self,params):
+ pX = self.fit_function(*params, self.exog[:,0])
+ pX[pX<=0] = 0.0001
+ pX[pX>=1] = 0.9999
+ ii = np.where(np.isfinite(pX))
+ # the predicted performance for X from the PMF
+ val = np.nansum(self.endog[ii]*np.log(pX[ii]) + (1-self.endog[ii])*np.log(1-pX[ii]))
+ return val
+
+ def fit(self, start_params=None,
+ maxiter=100000,
+ maxfun=10000,
+ method = 'lbfgs', # Broyden–Fletcher–Goldfarb–Shanno (BFGS) algorithm because it can be constrained
+ min_required_stim_values=6, **kwds):
+
+ self.stims, self.p_side, self.ci_side, self.n_obs,self.n_side = compute_proportions(self.exog[:,0], self.endog)
+ if len(self.stims) < min_required_stim_values:
+ return None
+
+ if start_params == None:
+ # Reasonable starting values
+ if not self.get_start_params is None:
+ start_params = self.get_start_params(self.stims, self.p_side)
+ if start_params is None:
+ raise(ValueError("Need to provide start parameters or a function to compute them."))
+ self.df_null = 0
+ self.k_constant = len(start_params)
+ self.df_resid = len(self.endog)-len(start_params)
+ return super(PsychometricRegression, self).fit(
+ start_params=start_params,
+ maxiter=maxiter,
+ maxfun=maxfun,
+ method = method,
+ bounds = self.bounds,
+ disp = False,
+ **kwds)
+
+# main function to fit and compute statistics
+def fit_psychometric(stim_values, response_values,
+ func = cumulative_gaussian, # to fit the psychometric
+ min_required_stim_values = 6, # min values required to fit the function
+ method = 'PsychometricRegression'):#'Nelder-Mead'):#'L-BFGS-B'):
+ '''
+ Fits a psychometric curve and computes points
+
+ Joao Couto - Jan 2023
+ '''
+ if method == 'PsychometricRegression':
+ # use PsychometricRegression (default weibull)
+ ft = PsychometricRegression(response_values.astype(float),
+ exog = stim_values.astype(float))
+ res = ft.fit(min_required_stim_values = min_required_stim_values, full_output=True)
+ if res is None:
+ fit_res = None
+ params = None
+ else:
+ fit_res = res
+ params = res.params
+ return dict(stims = ft.stims,
+ p_side = ft.p_side,
+ p_side_ci = ft.ci_side,
+ n_side = ft.n_side,
+ n_obs = ft.n_obs,
+ fit_params = params,
+ fit = fit_res,
+ function = ft.fit_function)
+
+ stims,p_side,ci_side,n_obs,n_side = compute_proportions(stim_values, response_values)
+ fit_res = None
+ params = None
+ if len(stims) >= min_required_stim_values and not func is None:
+
+ opt_func = lambda pars: neg_log_likelihood_error(func, pars,
+ stim_values,
+ response_values)
+ # x0 is the initial guess for the fit, it is an important parameter
+ x0 = [0.,0.1,p_side[0],1 - p_side[-1]]
+ bounds = [(stims[0],stims[-1]),(0.0001,10),(0,0.7),(0,.7)]
+ #import warnings
+ #warnings.filterwarnings('ignore')
+ options = dict(maxiter = 500*len(x0))
+ if 'Neder' in method:
+ options['adaptive'] = True
+ fit_res = minimize(opt_func, x0,
+ options = options,
+ bounds = bounds, method = method)
+ params = fit_res.x
+ return dict(stims = stims,
+ p_side = p_side,
+ p_side_ci = ci_side,
+ n_side = n_side,
+ n_obs = n_obs,
+ fit_params = params,
+ fit = fit_res,
+ function = func)
diff --git a/third_party/fit_psychometric/pyproject.toml b/third_party/fit_psychometric/pyproject.toml
new file mode 100644
index 0000000..ac4094c
--- /dev/null
+++ b/third_party/fit_psychometric/pyproject.toml
@@ -0,0 +1,17 @@
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[project]
+name = "fit-psychometric"
+version = "0.1.0"
+description = "Vendored fit_psychometric helpers (upstream: jcouto/fit_psychometric@665d058)"
+requires-python = ">=3.10"
+dependencies = [
+ "numpy",
+ "scipy",
+ "statsmodels",
+]
+
+[tool.hatch.build.targets.wheel]
+packages = ["fit_psychometric"]
diff --git a/uv.lock b/uv.lock
index cd0db15..cb039d4 100644
--- a/uv.lock
+++ b/uv.lock
@@ -14,6 +14,14 @@ resolution-markers = [
"python_full_version < '3.11'",
]
+[manifest]
+constraints = [
+ { name = "cryptography", specifier = ">=48.0.1" },
+ { name = "pillow", specifier = ">=12.3.0" },
+ { name = "tornado", specifier = ">=6.5.7" },
+ { name = "urllib3", specifier = ">=2.7.0" },
+]
+
[[package]]
name = "appdirs"
version = "1.4.4"
@@ -95,7 +103,8 @@ version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "chica" },
- { name = "djchurchland" },
+ { name = "datajoint" },
+ { name = "fit-psychometric" },
{ name = "ipykernel" },
{ name = "labdata" },
{ name = "matplotlib" },
@@ -109,14 +118,16 @@ dependencies = [
{ name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
{ name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
{ name = "seaborn" },
+ { name = "statsmodels" },
]
[package.metadata]
requires-dist = [
{ name = "chica", git = "https://github.com/churchlandlab/chiCa" },
- { name = "djchurchland", git = "https://github.com/churchlandlab/djchurchland" },
+ { name = "datajoint", specifier = ">=0.14.9,<2.0.0" },
+ { name = "fit-psychometric", editable = "third_party/fit_psychometric" },
{ name = "ipykernel", specifier = ">=6.0.0" },
- { name = "labdata", specifier = ">=0.0.22" },
+ { name = "labdata", specifier = ">=0.1.7" },
{ name = "matplotlib", specifier = ">=3.0.0" },
{ name = "natsort", specifier = ">=8.0.0" },
{ name = "numpy", specifier = ">=1.24.0" },
@@ -124,6 +135,7 @@ requires-dist = [
{ name = "scikit-learn", specifier = ">=1.0.0" },
{ name = "scipy", specifier = ">=1.10.0" },
{ name = "seaborn", specifier = ">=0.13.0" },
+ { name = "statsmodels", specifier = ">=0.14.0" },
]
[[package]]
@@ -454,62 +466,59 @@ wheels = [
[[package]]
name = "cryptography"
-version = "46.0.7"
+version = "49.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4", size = 7179869, upload-time = "2026-04-08T01:56:17.157Z" },
- { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" },
- { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" },
- { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" },
- { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" },
- { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" },
- { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" },
- { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" },
- { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" },
- { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" },
- { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" },
- { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" },
- { url = "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl", hash = "sha256:d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457", size = 3026504, upload-time = "2026-04-08T01:56:39.666Z" },
- { url = "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b", size = 3488363, upload-time = "2026-04-08T01:56:41.893Z" },
- { url = "https://files.pythonhosted.org/packages/7b/56/15619b210e689c5403bb0540e4cb7dbf11a6bf42e483b7644e471a2812b3/cryptography-46.0.7-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:d151173275e1728cf7839aaa80c34fe550c04ddb27b34f48c232193df8db5842", size = 7119671, upload-time = "2026-04-08T01:56:44Z" },
- { url = "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c", size = 4268551, upload-time = "2026-04-08T01:56:46.071Z" },
- { url = "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902", size = 4408887, upload-time = "2026-04-08T01:56:47.718Z" },
- { url = "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d", size = 4271354, upload-time = "2026-04-08T01:56:49.312Z" },
- { url = "https://files.pythonhosted.org/packages/50/46/cf71e26025c2e767c5609162c866a78e8a2915bbcfa408b7ca495c6140c4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:fbfd0e5f273877695cb93baf14b185f4878128b250cc9f8e617ea0c025dfb022", size = 4905845, upload-time = "2026-04-08T01:56:50.916Z" },
- { url = "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce", size = 4444641, upload-time = "2026-04-08T01:56:52.882Z" },
- { url = "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f", size = 3967749, upload-time = "2026-04-08T01:56:54.597Z" },
- { url = "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99", size = 4270942, upload-time = "2026-04-08T01:56:56.416Z" },
- { url = "https://files.pythonhosted.org/packages/41/3d/fe14df95a83319af25717677e956567a105bb6ab25641acaa093db79975d/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:c5b1ccd1239f48b7151a65bc6dd54bcfcc15e028c8ac126d3fada09db0e07ef1", size = 4871079, upload-time = "2026-04-08T01:56:58.31Z" },
- { url = "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2", size = 4443999, upload-time = "2026-04-08T01:57:00.508Z" },
- { url = "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e", size = 4399191, upload-time = "2026-04-08T01:57:02.654Z" },
- { url = "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee", size = 4655782, upload-time = "2026-04-08T01:57:04.592Z" },
- { url = "https://files.pythonhosted.org/packages/95/b6/3da51d48415bcb63b00dc17c2eff3a651b7c4fed484308d0f19b30e8cb2c/cryptography-46.0.7-cp314-cp314t-win32.whl", hash = "sha256:fdd1736fed309b4300346f88f74cd120c27c56852c3838cab416e7a166f67298", size = 3002227, upload-time = "2026-04-08T01:57:06.91Z" },
- { url = "https://files.pythonhosted.org/packages/32/a8/9f0e4ed57ec9cebe506e58db11ae472972ecb0c659e4d52bbaee80ca340a/cryptography-46.0.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e06acf3c99be55aa3b516397fe42f5855597f430add9c17fa46bf2e0fb34c9bb", size = 3475332, upload-time = "2026-04-08T01:57:08.807Z" },
- { url = "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4", size = 7165618, upload-time = "2026-04-08T01:57:10.645Z" },
- { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" },
- { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" },
- { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" },
- { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" },
- { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" },
- { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" },
- { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" },
- { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" },
- { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" },
- { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" },
- { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" },
- { url = "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl", hash = "sha256:f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246", size = 3013001, upload-time = "2026-04-08T01:57:34.933Z" },
- { url = "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl", hash = "sha256:506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3", size = 3472985, upload-time = "2026-04-08T01:57:36.714Z" },
- { url = "https://files.pythonhosted.org/packages/63/0c/dca8abb64e7ca4f6b2978769f6fea5ad06686a190cec381f0a796fdcaaba/cryptography-46.0.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc9ab8856ae6cf7c9358430e49b368f3108f050031442eaeb6b9d87e4dcf4e4f", size = 3476879, upload-time = "2026-04-08T01:57:38.664Z" },
- { url = "https://files.pythonhosted.org/packages/3a/ea/075aac6a84b7c271578d81a2f9968acb6e273002408729f2ddff517fed4a/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d3b99c535a9de0adced13d159c5a9cf65c325601aa30f4be08afd680643e9c15", size = 4219700, upload-time = "2026-04-08T01:57:40.625Z" },
- { url = "https://files.pythonhosted.org/packages/6c/7b/1c55db7242b5e5612b29fc7a630e91ee7a6e3c8e7bf5406d22e206875fbd/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d02c738dacda7dc2a74d1b2b3177042009d5cab7c7079db74afc19e56ca1b455", size = 4385982, upload-time = "2026-04-08T01:57:42.725Z" },
- { url = "https://files.pythonhosted.org/packages/cb/da/9870eec4b69c63ef5925bf7d8342b7e13bc2ee3d47791461c4e49ca212f4/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:04959522f938493042d595a736e7dbdff6eb6cc2339c11465b3ff89343b65f65", size = 4219115, upload-time = "2026-04-08T01:57:44.939Z" },
- { url = "https://files.pythonhosted.org/packages/f4/72/05aa5832b82dd341969e9a734d1812a6aadb088d9eb6f0430fc337cc5a8f/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3986ac1dee6def53797289999eabe84798ad7817f3e97779b5061a95b0ee4968", size = 4385479, upload-time = "2026-04-08T01:57:46.86Z" },
- { url = "https://files.pythonhosted.org/packages/20/2a/1b016902351a523aa2bd446b50a5bc1175d7a7d1cf90fe2ef904f9b84ebc/cryptography-46.0.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:258514877e15963bd43b558917bc9f54cf7cf866c38aa576ebf47a77ddbc43a4", size = 3412829, upload-time = "2026-04-08T01:57:48.874Z" },
+sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" },
+ { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" },
+ { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" },
+ { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" },
+ { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/9e/db72b3ae7fc9cfad53e630e56c6ae83b9b6ff0bf3718ffb8012d20b3aabf/cryptography-49.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7", size = 4013892, upload-time = "2026-06-12T20:02:10.735Z" },
+ { url = "https://files.pythonhosted.org/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", size = 4678835, upload-time = "2026-06-12T20:02:48.743Z" },
+ { url = "https://files.pythonhosted.org/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", size = 4697239, upload-time = "2026-06-12T20:02:56.03Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", size = 4685593, upload-time = "2026-06-12T20:02:50.666Z" },
+ { url = "https://files.pythonhosted.org/packages/47/f1/1d3eaa243bfc5de4a187b22aa8c048b3e4980bfbe830ac46e6bac2e66947/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d", size = 5289961, upload-time = "2026-06-12T20:01:46.468Z" },
+ { url = "https://files.pythonhosted.org/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", size = 4731145, upload-time = "2026-06-12T20:02:16.832Z" },
+ { url = "https://files.pythonhosted.org/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", size = 4321719, upload-time = "2026-06-12T20:02:52.611Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", size = 4685209, upload-time = "2026-06-12T20:02:07.282Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/84/0e27016a6fc5a0886f797018b26aa42f40c09a82332bff77822a451deaaa/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866", size = 5246285, upload-time = "2026-06-12T20:01:32.439Z" },
+ { url = "https://files.pythonhosted.org/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", size = 4730441, upload-time = "2026-06-12T20:02:01.469Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", size = 4815869, upload-time = "2026-06-12T20:01:36.574Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", size = 4960948, upload-time = "2026-06-12T20:02:18.688Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/fe/93ecac273d3738939d023612ad12cca9a3740a5345d69fda04134c43fd96/cryptography-49.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61", size = 3799153, upload-time = "2026-06-12T20:01:39.059Z" },
+ { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" },
+ { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" },
+ { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" },
+ { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" },
+ { url = "https://files.pythonhosted.org/packages/63/d3/4a83af35d65e3fad632c926fad684c193ea4398569ccb0bbbc7fe8f5dc9a/cryptography-49.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc1e275c2f1d97b1a6450b8b0ea3ebfa6e087a611c2b26cb2404d48588abab7b", size = 3993685, upload-time = "2026-06-12T20:02:14.883Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/a7/f9dac0ab7f80368c56993a7bf638ef9935f825c91902798481fac0898138/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838", size = 4676239, upload-time = "2026-06-12T20:02:28.793Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/70/2ba3769dd0ae167e2f33dfa9592d45db6ff9a61d62ca1a5b3d1bdd09068f/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5", size = 4715584, upload-time = "2026-06-12T20:01:27.495Z" },
+ { url = "https://files.pythonhosted.org/packages/94/64/2923570ac1c0bd3a737aa366ac3abbbbde273042308b8cde95e2364a6e6a/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615", size = 4675885, upload-time = "2026-06-12T20:01:55.49Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/f8/614dc7e051418cfe53d55173c1e24c6b0085e89996fe90508c2fdf769aef/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6", size = 4715449, upload-time = "2026-06-12T20:02:05.469Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/50/a9caea39ad19c431c1a3f8a31114df65b260cdfe67786b6c7e7c040c4c44/cryptography-49.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be9fcb48a55f023493482827d4f459bd263cc20efde64f204b97c123201850c6", size = 3783731, upload-time = "2026-06-12T20:02:43.319Z" },
]
[[package]]
@@ -603,11 +612,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/dc/c4/da7089cd7aa4ab554f56e18a7fb08dcfed8fd2ae91fa528f5b1be207a148/deepdiff-9.0.0-py3-none-any.whl", hash = "sha256:b1ae0dd86290d86a03de5fbee728fde43095c1472ae4974bdab23ab4656305bd", size = 170540, upload-time = "2026-03-30T05:52:22.008Z" },
]
-[[package]]
-name = "djchurchland"
-version = "0.0"
-source = { git = "https://github.com/churchlandlab/djchurchland#9547036f178234a04162dbfeb963b9c97cd534b1" }
-
[[package]]
name = "exceptiongroup"
version = "1.3.1"
@@ -641,6 +645,25 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/da/8a/708103325edff16a0b0e004de0d37db8ba216a32713948c64d71f6d4a4c2/faker-40.13.0-py3-none-any.whl", hash = "sha256:c1298fd0d819b3688fb5fd358c4ba8f56c7c8c740b411fd3dbd8e30bf2c05019", size = 1994597, upload-time = "2026-04-06T16:44:53.698Z" },
]
+[[package]]
+name = "fit-psychometric"
+version = "0.1.0"
+source = { editable = "third_party/fit_psychometric" }
+dependencies = [
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "statsmodels" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "numpy" },
+ { name = "scipy" },
+ { name = "statsmodels" },
+]
+
[[package]]
name = "flask"
version = "3.1.3"
@@ -1040,7 +1063,7 @@ wheels = [
[[package]]
name = "labdata"
-version = "0.1.4"
+version = "0.1.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "boto3" },
@@ -1053,9 +1076,9 @@ dependencies = [
{ name = "safe-exit" },
{ name = "tqdm" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/f9/68/1fa4ecfef5762746df1a63b4f212d5997744cbf3b9bc5d19bfefd0a7c79d/labdata-0.1.4.tar.gz", hash = "sha256:fab7dcbf9ab341a907b8221747b560bb7edfa685a3d9d1486692002f844e8cb7", size = 160722, upload-time = "2026-04-09T03:04:07.773Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/00/90/c12a67f89853a7a03e45cc1a2bb8769fb3a24facfcff10ececefde9c7a1b/labdata-0.1.8.tar.gz", hash = "sha256:27c09849f2f659a41258d86dd7c933234bf6885817ad32ce00a6db974e81a47e", size = 187906, upload-time = "2026-05-21T21:43:15.265Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/58/75/4ff2ed66a9dff7fad27c890cc6812710f8955d7b5d047fb32df9be1a089c/labdata-0.1.4-py3-none-any.whl", hash = "sha256:9474368a05a92c488e5bb29efd5d59f107c32ea7199f8613faae50c78a179405", size = 180093, upload-time = "2026-04-09T03:04:06.657Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/5b/1773508e6d82bbe4d9d2d08979f70c0e36b9543c36d3982db4efccec6e6c/labdata-0.1.8-py3-none-any.whl", hash = "sha256:8dc23e08e5be932dcc38d2fbeb52139f0e96c54bf1fdeb3bce651e154769ddec", size = 208654, upload-time = "2026-05-21T21:43:13.605Z" },
]
[[package]]
@@ -1628,6 +1651,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" },
]
+[[package]]
+name = "patsy"
+version = "1.0.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/be/44/ed13eccdd0519eff265f44b670d46fbb0ec813e2274932dc1c0e48520f7d/patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0", size = 399942, upload-time = "2025-10-20T16:17:37.535Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a", size = 233301, upload-time = "2025-10-20T16:17:36.563Z" },
+]
+
[[package]]
name = "pexpect"
version = "4.9.0"
@@ -1642,100 +1678,96 @@ wheels = [
[[package]]
name = "pillow"
-version = "12.2.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", size = 5354355, upload-time = "2026-04-01T14:42:15.402Z" },
- { url = "https://files.pythonhosted.org/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", size = 4695871, upload-time = "2026-04-01T14:42:18.234Z" },
- { url = "https://files.pythonhosted.org/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", size = 6269734, upload-time = "2026-04-01T14:42:20.608Z" },
- { url = "https://files.pythonhosted.org/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", size = 8076080, upload-time = "2026-04-01T14:42:23.095Z" },
- { url = "https://files.pythonhosted.org/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", size = 6382236, upload-time = "2026-04-01T14:42:25.82Z" },
- { url = "https://files.pythonhosted.org/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", size = 7070220, upload-time = "2026-04-01T14:42:28.68Z" },
- { url = "https://files.pythonhosted.org/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", size = 6493124, upload-time = "2026-04-01T14:42:31.579Z" },
- { url = "https://files.pythonhosted.org/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", size = 7194324, upload-time = "2026-04-01T14:42:34.615Z" },
- { url = "https://files.pythonhosted.org/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", size = 6376363, upload-time = "2026-04-01T14:42:37.19Z" },
- { url = "https://files.pythonhosted.org/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", size = 7083523, upload-time = "2026-04-01T14:42:39.62Z" },
- { url = "https://files.pythonhosted.org/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", size = 2463318, upload-time = "2026-04-01T14:42:42.063Z" },
- { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" },
- { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" },
- { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" },
- { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" },
- { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" },
- { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" },
- { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" },
- { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" },
- { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" },
- { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" },
- { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" },
- { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" },
- { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" },
- { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" },
- { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" },
- { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" },
- { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" },
- { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" },
- { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" },
- { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" },
- { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" },
- { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" },
- { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" },
- { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" },
- { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" },
- { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" },
- { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" },
- { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" },
- { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" },
- { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" },
- { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" },
- { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" },
- { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" },
- { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" },
- { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" },
- { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" },
- { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" },
- { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" },
- { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" },
- { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" },
- { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" },
- { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" },
- { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" },
- { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" },
- { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" },
- { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" },
- { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" },
- { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" },
- { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" },
- { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" },
- { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" },
- { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" },
- { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" },
- { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" },
- { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" },
- { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" },
- { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" },
- { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" },
- { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" },
- { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" },
- { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" },
- { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" },
- { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" },
- { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" },
- { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" },
- { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" },
- { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" },
- { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" },
- { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" },
- { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" },
- { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" },
- { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" },
- { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" },
- { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" },
- { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" },
- { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" },
- { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" },
- { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" },
- { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" },
+version = "12.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/25/c2/669d88644cddb1485bd9534e63e8cf476c8e51cb3c3a1297677023505c0e/pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a", size = 5392418, upload-time = "2026-07-01T11:53:27.808Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/ba/3762f376a2948e3036488d773a146e0ae6ecc2ca03ac20e2615bd0b2ba02/pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7", size = 4785287, upload-time = "2026-07-01T11:53:29.761Z" },
+ { url = "https://files.pythonhosted.org/packages/07/50/b5d688cc9c52d4482f3d5bcab6ce20bc2a74a85d2343841c907444a3be2c/pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f", size = 6253754, upload-time = "2026-07-01T11:53:32.298Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/89/36f4cd76cf4baf05c50ababb976249153f18c959171c7f6ba09a6f217260/pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec", size = 6925605, upload-time = "2026-07-01T11:53:34.487Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/c0/4de58cf6633b9e3a6061ef4be6fb91fc3c90b812ece886f531e3c523d777/pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468", size = 6327788, upload-time = "2026-07-01T11:53:36.433Z" },
+ { url = "https://files.pythonhosted.org/packages/87/3c/14d53682a19550dbbaf3b598f807d5457646c510805a44c7d7891cd1cd1a/pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed", size = 7036288, upload-time = "2026-07-01T11:53:38.712Z" },
+ { url = "https://files.pythonhosted.org/packages/38/1d/36279e3c77efe034e4cc2b0393ee74ffdb5a62391dacbf9b916154f5f0b8/pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1", size = 6472396, upload-time = "2026-07-01T11:53:40.781Z" },
+ { url = "https://files.pythonhosted.org/packages/48/7c/8fa0039574c476d7c6fa57dd7c32a130436877c6ec1e5ce1cc8ec44878c1/pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb", size = 7226887, upload-time = "2026-07-01T11:53:42.764Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/17/e324be141d173c1c919428066c3259f21c1b8982e564e01a4a81e96dbdcf/pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f", size = 2568039, upload-time = "2026-07-01T11:53:45.372Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/c8/0a78b0e02d7ac54bc03e5321c9220da52f0c2ea83b21f7c40e7f3169c502/pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756", size = 5392415, upload-time = "2026-07-01T11:53:47.162Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/5b/a02d30018abd97ced9f5a6c63d28597694a00d066516b9c1c6de45859fc9/pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6", size = 4785266, upload-time = "2026-07-01T11:53:49.079Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/98/766667a4be768150a202836acd9fad19c06824ca86c4286d3cf6b274964e/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd", size = 6263814, upload-time = "2026-07-01T11:53:51.32Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/2d/ede717bc1144f63886c21fd349bb95860b0d1a21149ff16f2bb362b612b6/pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd", size = 6934408, upload-time = "2026-07-01T11:53:53.487Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/48/9c58b685e69d49c31af6c8eb9012055fab7e665785165c84796e2c73ce72/pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c", size = 6337160, upload-time = "2026-07-01T11:53:55.457Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/fa/dc2a5c0ba6df93f67c31d34b808b7ce440b40cdbf96f0b81cde1d1e6fa93/pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5", size = 7045172, upload-time = "2026-07-01T11:53:57.736Z" },
+ { url = "https://files.pythonhosted.org/packages/86/a5/444817a4d4c4c2417df00513086ca196f388d8f9ef40c2e4ccd1ad1af54b/pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b", size = 6472232, upload-time = "2026-07-01T11:53:59.767Z" },
+ { url = "https://files.pythonhosted.org/packages/63/c6/4bad1b18d132a50b27e1365e1ab163616f7a5bb56d330f66f9d1d9d4f9d4/pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a", size = 7233653, upload-time = "2026-07-01T11:54:02.066Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/16/00f91ab7760dc842f5aad55217e80fc4a7067a0604535249bc8a2d6d9870/pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26", size = 2568195, upload-time = "2026-07-01T11:54:04.622Z" },
+ { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" },
+ { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" },
+ { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" },
+ { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" },
+ { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" },
+ { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" },
+ { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" },
+ { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" },
+ { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" },
+ { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" },
+ { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" },
+ { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" },
+ { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" },
+ { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" },
+ { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" },
+ { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" },
+ { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" },
+ { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" },
+ { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" },
+ { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" },
+ { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" },
+ { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" },
+ { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" },
+ { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" },
+ { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" },
+ { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" },
+ { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" },
+ { url = "https://files.pythonhosted.org/packages/75/18/2e8b40223153ccbc60df07f9e8928dc0c76202aa4e55ae9f53962b6510d6/pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468", size = 5302510, upload-time = "2026-07-01T11:56:25.736Z" },
+ { url = "https://files.pythonhosted.org/packages/46/3e/51fabf59d5ab801ceab709453d3ab6b180083496579549de4c45ced6528a/pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94", size = 4736058, upload-time = "2026-07-01T11:56:28.041Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/20/22fe9384b7949e25fb1293bcfc84fb82590ff4ea6b37c95b24d26d793d86/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e", size = 5237776, upload-time = "2026-07-01T11:56:30.263Z" },
+ { url = "https://files.pythonhosted.org/packages/08/14/f6ba68107680ffa74b39985f3f30884e41318fbc4250caa423c79b4788bb/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3", size = 5860358, upload-time = "2026-07-01T11:56:32.68Z" },
+ { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786, upload-time = "2026-07-01T11:56:35.046Z" },
]
[[package]]
@@ -2303,6 +2335,54 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" },
]
+[[package]]
+name = "statsmodels"
+version = "0.14.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "packaging" },
+ { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "pandas", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "patsy" },
+ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0d/81/e8d74b34f85285f7335d30c5e3c2d7c0346997af9f3debf9a0a9a63de184/statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a", size = 20689085, upload-time = "2025-12-05T23:08:39.522Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b5/6d/9ec309a175956f88eb8420ac564297f37cf9b1f73f89db74da861052dc29/statsmodels-0.14.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4ff0649a2df674c7ffb6fa1a06bffdb82a6adf09a48e90e000a15a6aaa734b0", size = 10142419, upload-time = "2025-12-05T19:27:35.625Z" },
+ { url = "https://files.pythonhosted.org/packages/86/8f/338c5568315ec5bf3ac7cd4b71e34b98cb3b0f834919c0c04a0762f878a1/statsmodels-0.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:109012088b3e370080846ab053c76d125268631410142daad2f8c10770e8e8d9", size = 10022819, upload-time = "2025-12-05T19:27:49.385Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/77/5fc4cbc2d608f9b483b0675f82704a8bcd672962c379fe4d82100d388dbf/statsmodels-0.14.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93bd5d220f3cb6fc5fc1bffd5b094966cab8ee99f6c57c02e95710513d6ac3f", size = 10118927, upload-time = "2025-12-05T23:07:51.256Z" },
+ { url = "https://files.pythonhosted.org/packages/94/55/b86c861c32186403fe121d9ab27bc16d05839b170d92a978beb33abb995e/statsmodels-0.14.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06eec42d682fdb09fe5d70a05930857efb141754ec5a5056a03304c1b5e32fd9", size = 10413015, upload-time = "2025-12-05T23:08:53.95Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/be/daf0dba729ccdc4176605f4a0fd5cfe71cdda671749dca10e74a732b8b1c/statsmodels-0.14.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0444e88557df735eda7db330806fe09d51c9f888bb1f5906cb3a61fb1a3ed4a8", size = 10441248, upload-time = "2025-12-05T23:09:09.353Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/1c/2e10b7c7cc44fa418272996bf0427b8016718fd62f995d9c1f7ab37adf35/statsmodels-0.14.6-cp310-cp310-win_amd64.whl", hash = "sha256:e83a9abe653835da3b37fb6ae04b45480c1de11b3134bd40b09717192a1456ea", size = 9583410, upload-time = "2025-12-05T19:28:02.086Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/4d/df4dd089b406accfc3bb5ee53ba29bb3bdf5ae61643f86f8f604baa57656/statsmodels-0.14.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ad5c2810fc6c684254a7792bf1cbaf1606cdee2a253f8bd259c43135d87cfb4", size = 10121514, upload-time = "2025-12-05T19:28:16.521Z" },
+ { url = "https://files.pythonhosted.org/packages/82/af/ec48daa7f861f993b91a0dcc791d66e1cf56510a235c5cbd2ab991a31d5c/statsmodels-0.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:341fa68a7403e10a95c7b6e41134b0da3a7b835ecff1eb266294408535a06eb6", size = 10003346, upload-time = "2025-12-05T19:28:29.568Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/2c/c8f7aa24cd729970728f3f98822fb45149adc216f445a9301e441f7ac760/statsmodels-0.14.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdf1dfe2a3ca56f5529118baf33a13efed2783c528f4a36409b46bbd2d9d48eb", size = 10129872, upload-time = "2025-12-05T23:09:25.724Z" },
+ { url = "https://files.pythonhosted.org/packages/40/c6/9ae8e9b0721e9b6eb5f340c3a0ce8cd7cce4f66e03dd81f80d60f111987f/statsmodels-0.14.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3764ba8195c9baf0925a96da0743ff218067a269f01d155ca3558deed2658ca", size = 10381964, upload-time = "2025-12-05T23:09:41.326Z" },
+ { url = "https://files.pythonhosted.org/packages/28/8c/cf3d30c8c2da78e2ad1f50ade8b7fabec3ff4cdfc56fbc02e097c4577f90/statsmodels-0.14.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e8d2e519852adb1b420e018f5ac6e6684b2b877478adf7fda2cfdb58f5acb5d", size = 10409611, upload-time = "2025-12-05T23:09:57.131Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/cc/018f14ecb58c6cb89de9d52695740b7d1f5a982aa9ea312483ea3c3d5f77/statsmodels-0.14.6-cp311-cp311-win_amd64.whl", hash = "sha256:2738a00fca51196f5a7d44b06970ace6b8b30289839e4808d656f8a98e35faa7", size = 9580385, upload-time = "2025-12-05T19:28:42.778Z" },
+ { url = "https://files.pythonhosted.org/packages/25/ce/308e5e5da57515dd7cab3ec37ea2d5b8ff50bef1fcc8e6d31456f9fae08e/statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5", size = 10091932, upload-time = "2025-12-05T19:28:55.446Z" },
+ { url = "https://files.pythonhosted.org/packages/05/30/affbabf3c27fb501ec7b5808230c619d4d1a4525c07301074eb4bda92fa9/statsmodels-0.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26d4f0ed3b31f3c86f83a92f5c1f5cbe63fc992cd8915daf28ca49be14463a1c", size = 9997345, upload-time = "2025-12-05T19:29:10.278Z" },
+ { url = "https://files.pythonhosted.org/packages/48/f5/3a73b51e6450c31652c53a8e12e24eac64e3824be816c0c2316e7dbdcb7d/statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368", size = 10058649, upload-time = "2025-12-05T23:10:12.775Z" },
+ { url = "https://files.pythonhosted.org/packages/81/68/dddd76117df2ef14c943c6bbb6618be5c9401280046f4ddfc9fb4596a1b8/statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d", size = 10339446, upload-time = "2025-12-05T23:10:28.503Z" },
+ { url = "https://files.pythonhosted.org/packages/56/4a/dce451c74c4050535fac1ec0c14b80706d8fc134c9da22db3c8a0ec62c33/statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37", size = 10368705, upload-time = "2025-12-05T23:10:44.339Z" },
+ { url = "https://files.pythonhosted.org/packages/60/15/3daba2df40be8b8a9a027d7f54c8dedf24f0d81b96e54b52293f5f7e3418/statsmodels-0.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f", size = 9543991, upload-time = "2025-12-05T23:10:58.536Z" },
+ { url = "https://files.pythonhosted.org/packages/81/59/a5aad5b0cc266f5be013db8cde563ac5d2a025e7efc0c328d83b50c72992/statsmodels-0.14.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47ee7af083623d2091954fa71c7549b8443168f41b7c5dce66510274c50fd73e", size = 10072009, upload-time = "2025-12-05T23:11:14.021Z" },
+ { url = "https://files.pythonhosted.org/packages/53/dd/d8cfa7922fc6dc3c56fa6c59b348ea7de829a94cd73208c6f8202dd33f17/statsmodels-0.14.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa60d82e29fcd0a736e86feb63a11d2380322d77a9369a54be8b0965a3985f71", size = 9980018, upload-time = "2025-12-05T23:11:30.907Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/77/0ec96803eba444efd75dba32f2ef88765ae3e8f567d276805391ec2c98c6/statsmodels-0.14.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89ee7d595f5939cc20bf946faedcb5137d975f03ae080f300ebb4398f16a5bd4", size = 10060269, upload-time = "2025-12-05T23:11:46.338Z" },
+ { url = "https://files.pythonhosted.org/packages/10/b9/fd41f1f6af13a1a1212a06bb377b17762feaa6d656947bf666f76300fc05/statsmodels-0.14.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:730f3297b26749b216a06e4327fe0be59b8d05f7d594fb6caff4287b69654589", size = 10324155, upload-time = "2025-12-05T23:12:01.805Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/0f/a6900e220abd2c69cd0a07e3ad26c71984be6061415a60e0f17b152ecf08/statsmodels-0.14.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f1c08befa85e93acc992b72a390ddb7bd876190f1360e61d10cf43833463bc9c", size = 10349765, upload-time = "2025-12-05T23:12:18.018Z" },
+ { url = "https://files.pythonhosted.org/packages/98/08/b79f0c614f38e566eebbdcff90c0bcacf3c6ba7a5bbb12183c09c29ca400/statsmodels-0.14.6-cp313-cp313-win_amd64.whl", hash = "sha256:8021271a79f35b842c02a1794465a651a9d06ec2080f76ebc3b7adce77d08233", size = 9540043, upload-time = "2025-12-05T23:12:33.887Z" },
+ { url = "https://files.pythonhosted.org/packages/71/de/09540e870318e0c7b58316561d417be45eff731263b4234fdd2eee3511a8/statsmodels-0.14.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:00781869991f8f02ad3610da6627fd26ebe262210287beb59761982a8fa88cae", size = 10069403, upload-time = "2025-12-05T23:12:48.424Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/f0/63c1bfda75dc53cee858006e1f46bd6d6f883853bea1b97949d0087766ca/statsmodels-0.14.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:73f305fbf31607b35ce919fae636ab8b80d175328ed38fdc6f354e813b86ee37", size = 9989253, upload-time = "2025-12-05T23:13:05.274Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/98/b0dfb4f542b2033a3341aa5f1bdd97024230a4ad3670c5b0839d54e3dcab/statsmodels-0.14.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e443e7077a6e2d3faeea72f5a92c9f12c63722686eb80bb40a0f04e4a7e267ad", size = 10090802, upload-time = "2025-12-05T23:13:20.653Z" },
+ { url = "https://files.pythonhosted.org/packages/34/0e/2408735aca9e764643196212f9069912100151414dd617d39ffc72d77eee/statsmodels-0.14.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3414e40c073d725007a6603a18247ab7af3467e1af4a5e5a24e4c27bc26673b4", size = 10337587, upload-time = "2025-12-05T23:13:37.597Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/36/4d44f7035ab3c0b2b6a4c4ebb98dedf36246ccbc1b3e2f51ebcd7ac83abb/statsmodels-0.14.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a518d3f9889ef920116f9fa56d0338069e110f823926356946dae83bc9e33e19", size = 10363350, upload-time = "2025-12-05T23:13:53.08Z" },
+ { url = "https://files.pythonhosted.org/packages/26/33/f1652d0c59fa51de18492ee2345b65372550501ad061daa38f950be390b6/statsmodels-0.14.6-cp314-cp314-win_amd64.whl", hash = "sha256:151b73e29f01fe619dbce7f66d61a356e9d1fe5e906529b78807df9189c37721", size = 9588010, upload-time = "2025-12-05T23:14:07.28Z" },
+]
+
[[package]]
name = "threadpoolctl"
version = "3.6.0"
@@ -2314,19 +2394,19 @@ wheels = [
[[package]]
name = "tornado"
-version = "6.5.5"
+version = "6.5.7"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" },
- { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" },
- { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" },
- { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" },
- { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" },
- { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" },
- { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" },
- { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" },
- { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" },
+ { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" },
+ { url = "https://files.pythonhosted.org/packages/92/4f/090b1431e5a43df696feceffc268c5383cc079ecb5f08ce58f917109aafe/tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100", size = 446707, upload-time = "2026-06-08T17:34:39.594Z" },
+ { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" },
+ { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" },
+ { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/42/5f0e56c01e8d9d36f4e23f367b85ae6cae0c1ecddd5e6977d8388ad27488/tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4", size = 451047, upload-time = "2026-06-08T17:34:46.784Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/a4/b393076ffb21b469eec5b328a0534cf03a3b90bfc6b1f09507cdd075d938/tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4", size = 451485, upload-time = "2026-06-08T17:34:48.248Z" },
+ { url = "https://files.pythonhosted.org/packages/71/2e/7b1c769803121b809112cf9a00681c472eae1d80e32d7ec0e0bd61d0d0e1/tornado-6.5.7-cp39-abi3-win_arm64.whl", hash = "sha256:ff934fce95643af5f11efdae618eaa73d469dc588641e5c8d19295a0c65c4796", size = 450506, upload-time = "2026-06-08T17:34:49.702Z" },
]
[[package]]
@@ -2370,11 +2450,11 @@ wheels = [
[[package]]
name = "urllib3"
-version = "2.6.3"
+version = "2.7.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
]
[[package]]