diff --git a/dj-course-01/000-Contents.ipynb b/dj-course-01/000-Contents.ipynb
new file mode 100644
index 0000000..ff293b0
--- /dev/null
+++ b/dj-course-01/000-Contents.ipynb
@@ -0,0 +1,104 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Welcome to DataJoint\n",
+ "DataJoint for Python 3 is a full-featured relational database programming sublanguage.\n",
+ "\n",
+ "It is designed for work with scientific data and computational data pipelines. This tutorial assumes intermediate programming proficiency in Python. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Contents\n",
+ "\n",
+ "### 0. Setup \n",
+ "| | | | |\n",
+ "|:--|:--|:--|:--|\n",
+ "| [Set up and Connect](010-Setup.ipynb) |
install datajoint, configure database connection, `dj.config`, authentication, change password, save configuration, secure connection | [Administration](020-Admin.ipynb) |
configure database server, create user accounts, user privileges"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 1. Work with Individual Tables\n",
+ "| | | | |\n",
+ "|:--|:--|:--|:--|\n",
+ "| [Create a Schema](100-Schema.ipynb) |
`dj.schema` | [Define a Table](110-Table.ipynb) |
table class, simple attributes types, primary and secondary attributes, `insert`, `insert1`, `delete`, `describe`.\n",
+ "| [Fetch](120-Fetch.ipynb)|
`fetch`, `fetch1`, `head`, `tail`, `len` | [Restrict and project](130-Restrict-Project.ipynb) |
`&`, `-`, `.proj`, `AndList`, restricted `delete`.\n",
+ "| [More Attribute Types](MoreTypes.ipynb) |
`uuid`, `raw`| [Blobs](130-Blobs.ipynb) |
storing complex data \n",
+ "| [Attachments](135-Attach.ipynb) |
attaching files | [Lookup Tables](135-Lookup.ipynb) |
specifying fixed contents | \n",
+ "| [External Storage](160-External.ipynb) |
storing blobs and attachments in external filesystems and AWS S3 | [File Management](170-Filepath.ipynb) |
tracking files in an external repository\n",
+ "| [Adapted Attribute Types](180-AdaptedTypes.ipynb) |
user-defined attribute types | [Redefining Tables](185-Redefine.ipynb) |
`drop`, `alter`\n",
+ "| [Secondary Indexes](188-SecondaryIndexes.ipynb) |
secondary indexes | [Transactions](190-Transactions.ipynb) |
Transactions \n",
+ "| [Log](195-Log.ipynb) |
The log table"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 2. Work with Multiple Tables\n",
+ "| | | | |\n",
+ "|:--|:--|:--|:--|\n",
+ "| [Schemas and Modules](200-SchemaModules.ipynb) |
correspondence between schemas and modules | [Dependencies](210-Dependencies.ipynb) |
primary and secondary dependencies, referential constraints, cascading deletes\n",
+ "| [Work with Existing Schemas](220-Existing.ipynb) |
`dj.list_schemas`, `schema.spawn_missing_classes`, `dj.create_virtual_modules` | [Diagramming](230-Diagramming.ipynb) | `dj.Diagram`, graph algebra, multi-schema databases |\n",
+ "| [Join and Restrict](240-Join.ipynb) |
`*`, using `proj` to control join | [Aggregate](250-Aggregate.ipynb) |
`.aggr`\n",
+ "| [Hierarchical Relationships](250-Nested.ipynb) |
modeling hierarchical or nested data | [Dimensional Relationships](255-Dimensional.ipynb) |
modeling dimensional relationships \n",
+ "| [Master-part Relationships](Master-Part.ipynb) |
modeling master-part relationships | [Specialization Relationships](260-Specialization.ipynb) |
modeling specialization relationships |\n",
+ "| [Derived Dependencies](270-DerivedDependencies.ipynb) |
dependencies on query expressions | [Dependency Properties](274-DependencyProperties.ipynb) |
`unique` and `nullable` dependencies\n",
+ "| [Association Relationships](276-Associations.ipynb) |
modeling associations between entities | [Cyclic Relationships](278-Cyclic.ipynb) |
modeling cyclic relationships | \n",
+ "| [Universal sets](280-U.ipynb) |
`dj.U` in restrictions, aggregations, and joins | [Union](282-Union.ipynb) |
`+` \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3. Computations\n",
+ "| | | | |\n",
+ "|:--|:--|:--|:--|\n",
+ "| [Populate](300-SchemaModules.ipynb) |
The `populate` method and the `make` callback in `dj.Imported` and `dj.Computed` tables. | [Distributed Computations](310-Distributed) |
Using `populate` with `reserve_jobs=True`\n",
+ "| [Jobs Table](320-Jobs.ipynb) |
Working with `schema.jobs` table and `dj.kill` | [Master-Part Computations](330-MasterPart.ipynb) |
Computations in a master-part relationship\n",
+ "| [Computation Parameters](340-Parameters.ipynb) |
Computation parameters and versions | [Key Source](350-KeySource.ipynb) |
Controlling the scope and granularity of computing jobs with `key_source`\n",
+ "| [Offline Jobs](360-OfflineJobs.ipynb) |
work with no database connection"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 4. Interfaces & Applications\n",
+ "| | | | |\n",
+ "|:--|:--|:--|:--|\n",
+ "| [Export](410-Export.ipynb) |
exporting data for dataset sharing | [Web GUIs](440-WebGUIs.ipynb) |
wen interfaces\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/dj-course-01/010-Setup.ipynb b/dj-course-01/010-Setup.ipynb
new file mode 100644
index 0000000..0e6106a
--- /dev/null
+++ b/dj-course-01/010-Setup.ipynb
@@ -0,0 +1,71 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Setup\n",
+ "\n",
+ "## Install DataJoint\n",
+ "To get started you will need to install `datajoint` from PyPi:\n",
+ "\n",
+ "```shell\n",
+ "$ pip install datajoint\n",
+ "```\n",
+ "\n",
+ "Import datajoint and verify its version. It should be 0.12 or higher. It is a common convention to import datajoint as `dj`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "SyntaxError",
+ "evalue": "invalid syntax (external.py, line 166)",
+ "output_type": "error",
+ "traceback": [
+ "Traceback \u001b[0;36m(most recent call last)\u001b[0m:\n",
+ " File \u001b[1;32m\"/home/dimitri/.local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\"\u001b[0m, line \u001b[1;32m3326\u001b[0m, in \u001b[1;35mrun_code\u001b[0m\n exec(code_obj, self.user_global_ns, self.user_ns)\n",
+ " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m1\u001b[0m, in \u001b[1;35m\u001b[0m\n import datajoint as dj\n",
+ " File \u001b[1;32m\"/home/dimitri/dev/datajoint-python/datajoint/__init__.py\"\u001b[0m, line \u001b[1;32m33\u001b[0m, in \u001b[1;35m\u001b[0m\n from .schema import Schema as schema\n",
+ "\u001b[0;36m File \u001b[0;32m\"/home/dimitri/dev/datajoint-python/datajoint/schema.py\"\u001b[0;36m, line \u001b[0;32m13\u001b[0;36m, in \u001b[0;35m\u001b[0;36m\u001b[0m\n\u001b[0;31m from .external import ExternalMapping\u001b[0m\n",
+ "\u001b[0;36m File \u001b[0;32m\"/home/dimitri/dev/datajoint-python/datajoint/external.py\"\u001b[0;36m, line \u001b[0;32m166\u001b[0m\n\u001b[0;31m with open(full_path, 'rb')\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
+ ]
+ }
+ ],
+ "source": [
+ "import datajoint as dj"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/Adapted-Quantities.ipynb b/notebooks/Adapted-Quantities.ipynb
new file mode 100644
index 0000000..83bd4de
--- /dev/null
+++ b/notebooks/Adapted-Quantities.ipynb
@@ -0,0 +1,239 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Adapted Attribute Type for quantities\n",
+ "\n",
+ "**Purpose**: demonstrate using `dj.AttributeAdapter` for convenient storage of custom datatypes, e.g. objects from the quantities module."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's create a table with attribute `volume` storing values of type `mL` from the [`quantities`](https://pypi.org/project/quantities/) library."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.12.7\n"
+ ]
+ }
+ ],
+ "source": [
+ "import datajoint as dj\n",
+ "print(dj.__version__)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The following is necessary in DataJoint version 0.12.* \n",
+ "# while adapted types are in beta testing.\n",
+ "dj.errors._switch_adapted_types(True) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import quantities as pq\n",
+ "\n",
+ "class Milliliter(dj.AttributeAdapter):\n",
+ " attribute_type = 'float'\n",
+ " \n",
+ " def put(self, obj: pq.Quantity) -> float:\n",
+ " assert isinstance(obj, pq.Quantity)\n",
+ " obj = obj.rescale(pq.mL)\n",
+ " return obj.item()\n",
+ "\n",
+ " def get(self, value) -> str:\n",
+ " return value * pq.mL\n",
+ "\n",
+ "mL = Milliliter()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Then we need to define an adapter object that convert target objects into an attribute type that datajoint can already store. The class must subclass `dj.AttributeAdapter` and define the property `attribute_type`, and methods `get` and `put`. These methods translate the adapted data type `nx.Graph` into a representation that can be stored in datajoint, a `longblob` storing the edge list."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can define a table that uses `graph` as its attribute type. These \"adapted types\" must be enclosed in angle brackets as in ``:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Connecting dbadmin@dimitri-proj0.cda95qzjbnvs.us-east-1.rds.amazonaws.com:3306\n",
+ "Proceed to delete entire schema `test_quantities`? [yes, No]: yes\n"
+ ]
+ }
+ ],
+ "source": [
+ "schema = dj.schema('test_quantities')\n",
+ "schema.drop() # drop previous contents\n",
+ "schema = dj.schema('test_quantities') # create de novo"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "@schema\n",
+ "class Quantity(dj.Manual):\n",
+ " definition = \"\"\"\n",
+ " quant_id : int\n",
+ " ---\n",
+ " volume : \n",
+ " \"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "quant_id : int \n",
+ "---\n",
+ "volume : \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "Quantity.describe();"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now, populate the table with our example graphs and fetch them as objects\n",
+ "Inserting the graphs as objects"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Quantity().insert([\n",
+ " (1, 2.3 * pq.mL),\n",
+ " (2, 3.5 * pq.mL)])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([array(2.3) * mL, array(3.5) * mL], dtype=object)"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q = Quantity.fetch('volume')\n",
+ "q"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "d = (3.5 * pq.mL).dtype"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "dtype('float64')"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "d"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/Adapted-Types-2.ipynb b/notebooks/Adapted-Types-2.ipynb
new file mode 100644
index 0000000..e436022
--- /dev/null
+++ b/notebooks/Adapted-Types-2.ipynb
@@ -0,0 +1,249 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Adapted Attribute Types with Spawned Classes and Virtual Modules\n",
+ "\n",
+ "**Purpose**: demonstrate using `dj.AttributeAdapter` for convenient storage of arbitrary data types in DataJoint table attributes when working with previously defined schemas.\n",
+ "\n",
+ "This notebook works with the schema created previously in [Adapted-Types.ipynb](Adapted-Types.ipynb). Please execute it first, leaving the `Connection` table defined and populated.\n",
+ "\n",
+ "Also, see [Spawning-Classes.ipynb](Spawning-Classes.ipynb) for a review of `schema.spawn_missing_classes` and `dj.create_virtual_module`. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import networkx as nx\n",
+ "import datajoint as dj"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's connect to the schema defined in [Adapted-Types.ipynb](Adapted-Types.ipynb)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Connecting dbadmin@dimitri-proj0.cda95qzjbnvs.us-east-1.rds.amazonaws.com:3306\n"
+ ]
+ }
+ ],
+ "source": [
+ "schema = dj.schema('test_graphs')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To work with the `` type used in that schema we need to define or import the adapter object *before* `spawn_missing_classes`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class GraphAdapter(dj.AttributeAdapter):\n",
+ " \n",
+ " attribute_type = 'longblob' # this is how the attribute will be declared\n",
+ " \n",
+ " def put(self, obj):\n",
+ " # convert the nx.Graph object into an edge list\n",
+ " assert isinstance(obj, nx.Graph)\n",
+ " return list(obj.edges)\n",
+ "\n",
+ " def get(self, value):\n",
+ " # convert edge list back into an nx.Graph\n",
+ " return nx.Graph(value)\n",
+ " \n",
+ "\n",
+ "# instantiate for use as a datajoint type\n",
+ "graph = GraphAdapter()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Spawning missing classes in the local namespace"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now spawning missing classes will have the type adapter accessible:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "schema.spawn_missing_classes()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'Connectivity' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpyplot\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mConnectivity\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfetch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'conn_graph'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder_by\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'conn_id'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubplots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m,\u001b[0m \u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m15\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'Connectivity' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "%matplotlib inline\n",
+ "from matplotlib import pyplot as plt\n",
+ "\n",
+ "result = Connectivity.fetch('conn_graph', order_by='conn_id')\n",
+ "\n",
+ "fig, axx = plt.subplots(1, result.size , figsize=(15, 3))\n",
+ "for g, ax in zip(result, axx.flatten()):\n",
+ " plt.sca(ax)\n",
+ " nx.draw(g)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Creating a virtual module with adapted attribute types\n",
+ "\n",
+ "To allow adapted attribyte types in virtual modules, they must be passed into the virtual module using the `add_objects` argument:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vmod = dj.create_virtual_module('vmod', 'test_graphs', add_objects={'graph': graph})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dj.Diagram(vmod)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/dimitri/.local/lib/python3.7/site-packages/networkx/drawing/nx_pylab.py:579: MatplotlibDeprecationWarning: \n",
+ "The iterable function was deprecated in Matplotlib 3.1 and will be removed in 3.3. Use np.iterable instead.\n",
+ " if not cb.iterable(width):\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "result = vmod.Connectivity.fetch('conn_graph', order_by='conn_id')\n",
+ "\n",
+ "fig, axx = plt.subplots(1, result.size , figsize=(15, 3))\n",
+ "for g, ax in zip(result, axx.flatten()):\n",
+ " plt.sca(ax)\n",
+ " nx.draw(g)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/Adapted-Types.ipynb b/notebooks/Adapted-Types.ipynb
new file mode 100644
index 0000000..2d6088d
--- /dev/null
+++ b/notebooks/Adapted-Types.ipynb
@@ -0,0 +1,237 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Adapted Attribute Types\n",
+ "\n",
+ "**Purpose**: demonstrate using `dj.AttributeAdapter` for convenient storage of arbitrary data types in DataJoint table attributes."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Imagine I want store graph objects of type `networkx.Graph` in the form of edge lists. \n",
+ "\n",
+ "First, let's create a few graphs:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%matplotlib inline\n",
+ "from matplotlib import pyplot as plt\n",
+ "import networkx as nx\n",
+ "graphs = [nx.lollipop_graph(4, 2), nx.star_graph(5), nx.barbell_graph(3, 1), nx.cycle_graph(5)]\n",
+ "\n",
+ "fig, axx = plt.subplots(1, len(graphs) , figsize=(15, 3))\n",
+ "for g, ax in zip(graphs, axx.flatten()):\n",
+ " plt.sca(ax)\n",
+ " nx.draw(g)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Then we need to define an adapter object that convert target objects into an attribute type that datajoint can already store. The class must subclass `dj.AttributeAdapter` and define the property `attribute_type`, and methods `get` and `put`. These methods translate the adapted data type `nx.Graph` into a representation that can be stored in datajoint, a `longblob` storing the edge list."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import datajoint as dj\n",
+ "\n",
+ "class GraphAdapter(dj.AttributeAdapter):\n",
+ " \n",
+ " attribute_type = 'longblob' # this is how the attribute will be declared\n",
+ " \n",
+ " def put(self, obj):\n",
+ " # convert the nx.Graph object into an edge list\n",
+ " assert isinstance(obj, nx.Graph)\n",
+ " return list(obj.edges)\n",
+ "\n",
+ " def get(self, value):\n",
+ " # convert edge list back into an nx.Graph\n",
+ " return nx.Graph(value)\n",
+ " \n",
+ "\n",
+ "# instantiate for use as a datajoint type\n",
+ "graph = GraphAdapter()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can define a table that uses `graph` as its attribute type. These \"adapted types\" must be enclosed in angle brackets as in ``:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Connecting dbadmin@dimitri-proj0.cda95qzjbnvs.us-east-1.rds.amazonaws.com:3306\n",
+ "Proceed to delete entire schema `test_graphs`? [yes, No]: yes\n"
+ ]
+ }
+ ],
+ "source": [
+ "schema = dj.schema('test_graphs')\n",
+ "schema.drop() # drop previous contents\n",
+ "schema = dj.schema('test_graphs') # create de novo"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The following is necessary in DataJoint version 0.12.* \n",
+ "# while adapted types are in beta testing.\n",
+ "dj.errors._switch_adapted_types(True) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "@schema\n",
+ "class Connectivity(dj.Manual):\n",
+ " definition = \"\"\"\n",
+ " conn_id : int\n",
+ " ---\n",
+ " conn_graph = null : # a networkx.Graph object \n",
+ " \"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "conn_id : int \n",
+ "---\n",
+ "conn_graph=null : # a networkx.Graph object\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "Connectivity.describe();"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now, populate the table with our example graphs and fetch them as objects\n",
+ "Inserting the graphs as objects"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Connectivity.insert((i, g) for i, g in enumerate(graphs))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can now fetch the graphs as an array of objects and plot them to verify successful recovery."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1MAAACxCAYAAAAh3OeIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABPOUlEQVR4nO3dd1hTZ/sH8G8gQHBQF+LAUWUJKnUjoqCADLdSEcVSF21xYG2diLbuWfd43QUcWNyKgKhgHVgVRBERwYlbFBEkgSTn9weFn1ZFkpzkZNyf6/Lq+1o450sTzsl9nue5Hx7DMAwIIYQQQgghhMhEj+sAhBBCCCGEEKKJqJgihBBCCCGEEDlQMUUIIYQQQgghcqBiihBCCCGEEELkQMUUIYQQQgghhMiBiilCCCGEEEIIkQOf6wDaIiLpHuZHZ0AolqCiZvM8HiDg6yPE2wb+Dk1Vlo8QXUC/h4QL9L4jhCgDXVs0A4/2mVJc6Zv9JopKpJX+HmMDPYR4t6A3PSEsod9DwgV63xFClIGuLZqDpvkpKPVhHuZHZ8j0ZgeAohIp5kdn4FpOnnKCEaJD6PeQcIHed4QQZaBri2ahYkpB6xKyIBRL5PpeoViC9QlZLCciRPfQ7yHhAr3vCCHKQNcWzULFlAJeFoiQmPmiwnmsFWEY4PStF8gtELEbjBAdQr+HhAv0viOEKANdWzQPFVMKiLqSo/AxeACikhU/DiG6in4PCRfofUcIUQa6tmgeKqYUkPE0HyKxbPNZ/0soliLjyVuWEhGie+j3kHCB3neEEGWga4vmoWJKAflCMUvHKWHlOIToIvo9JFyg9x0hRBno2qJ5aJ8pBZgI2PnPd+ZkLIbFrUTLli3L/zRp0gR6elTrEvIlbP0emggMWDkO0Q30viOEKANdWzQPFVMyevv2LU6dOoWYmBgcv1sCplUv8PiGch/PiK+HwZ5dYVHSCGlpaVi/fj3S0tKQl5cHW1vb8uLKzs4OLVu2RP369cHj8Vj8iQjRbDb1TGDEf6rQtAgBXw829auzmIpoO3rfEUKUga4tmoc27f0ChmGQlpaG48ePIyYmBpcuXYKDgwM8PT3R2aUnRhzMUegNb8TXw/mpPVC7mtEHf5+Xl4f09HSkpaV98EcsFn8wglVWaNWuXVvRH5UQjfSyQIQui08p5feQkM+h9x0hRBno2qJ5aGTqE/Ly8hAfH4+YmBjExMTAyMgIXl5emDRpElxcXFCtWrXyr3VOF+HEzWdytbDk8YDu1qaffLPXqFEDjo6OcHR0/ODvnz9/jhs3biAtLQ2pqanYuXMn0tLSUKVKlY+KLFtbW1SvTk8miHarU80IzlamSvk9JORz6H1HCFGGOtWMYF/XAP/kFAHyLPdgpHBo/BVdW1SIRqYASKVSXL16tXTq3vHjSE1NhZOTEzw9PeHl5QULC4vPTq1LfZiHIZuTUFQi++Zqxgb6iAx0QGvzGgrlZxgGOTk5SEtLKy+00tLScPPmTZiamn5UZNnY2EAgECh0TkLUiTr8HhLdQ+87QgibGIbBqlWrsGjTblTvH4oSRvZlHfqQ4O2BOQj5aTjGjh0LPp/GTZRNZ4up3NxcxMXFISYmBrGxsahRo0Z58dStWzcYGxtX+lgRSfcwP/omikoqPyRrbKCHEO8W8HdoKkf6ypFIJLh79255cVVWaGVlZaFJkybl67DK/lhYWMDAgBYsEs2krr+HRLutjk7B8tN3weNX/ikwve8IIf/18uVLjBgxAs+fP8eePXtw7hlP7nta+xpCBAUFIS8vDxs3bkTHjh2VmJzoTDElkUhw+fLl8tGnmzdvwtnZGV5eXvDw8ECzZs0UOn7pB7kMCMWSCqd8MFIpjI34mMnhjbS4uBi3b9/+aD1WTk4OrKysPmh40bJlSzRt2lTtOwu+LBAh6koOMp7mI18ohomAD5t6Jvi2nTkNdeuQyv4e8niAgK+PEG8b+kBL5Pbq1Ss4OTnBwf9XXBA2+OL7Dv9e/6mQIoS8LyEhAcOHD4efnx/mzZsHQ8PSxmaK3NMYhsHOnTsxefJkDBw4EPPnz0eNGjWU/8PoIK0upp49e4a4uDgcP34ccXFxqFevHry8vODp6QknJycYGbH7IftaTh7WJ2Th9K0X4KF007QyAr4eGABGuVnwbqqPRVOCWD03G969e4eMjIyPiqxXr159srNggwYNOO8smPowD+sSspCY+QIAPliwWfbf3MXaFEHOFrBvVIObkESlKvN72N3aFEEuFjTFisitqKgI7u7u6Ny5M5YuXVqp9x3vSTpGODTE1NFDOMtNCFEfYrEYc+fOxaZNm7Bjxw54eHh89DWK3tNev36N6dOn4/Dhw1i+fDmGDBnC+Wc3baNVxZRYLMbFixfLO+9lZWXB1dUVnp6e8PT0RKNGjVSSI7dAhKjkHGQ8eYt8YQlMBAawqV8dPm3N8eTebbi6uiIzMxNfffWVSvIo6s2bN5/sLFhcXPzJzoJ16tRRSS4ahSAVef/38EhsPJw6tkVn2ybwaUujlUQxEokEPj4+qFKlCsLDwz8Yua/o+n8j+SK+//57ZGRklD95JoToppycHAwdOhSGhoYIDw9H/fr1K/z6iq4tlbmnXbhwAT/++CPMzMywbt06WFpasvWj6DyNL6YeP35c3nUvPj4eTZo0KR996ty5s1quARoxYgQaNmyIefPmcR1FIWWdBd9vepGWlgaBQPDJzoImJiasnZvWxxBZODg4YMWKFejcuTPXUYiGYxgGY8eORWZmJqKjo2Uuiry9vdGrVy+MHTtWSQkJIeru8OHDCAwMRHBwMKZOnaqypRRisRirV6/GggULMGHCBEydOpX1WVq6SOOKqeLiYpw/f7587VNOTg7c3d3h6ekJDw+PL1b26uDBgwdo06YN0tLSNCKvLBiGwaNHjz5qepGeno46dep8srOgLM0+AOqgRWTXvXt3hIaGokePHlxHIRpuwYIF2Lt3L86cOSPXA6KrV6/Cy8sLt2/f/mCbDUKI9hOJRJgyZQoOHTqEXbt2fbT9jao8fPgQEyZMQHp6OtavXw9XV1dOcmgLmYspLhb6P3jwoHzq3unTp2FlZVXeea9Dhw4a2fbx119/RWFhITZs2MB1FJWQSCS4d+/eByNYN27cwO3bt9G4ceOPml5YWlp+dlQxMPyyQnu7eNiaYaN/ewV/IqJJvLy8MH78eHh7e3MdhWiwHTt24Pfff8f58+cVehA2dOhQ2NnZISQkhMV0hBB1lpmZiSFDhuDrr7/Gli1bULNmTa4j4fDhw5gwYQK6dOmCP/74A2ZmZlxH0kiVLqZUudBfJBLhzJkz5aNPL1++hIeHBzw9PdGzZ0+YmpoqdHx1kJubCxsbG5w7dw5WVlZcx+FMSUnJJzsLPnz4EJaWlh8VWdVNG6Dr0gSFdwa/NdeLxZ+CqLuBAwdi2LBhGDRoENdRiIY6fvw4RowYgcTERFhbWyt0rKysLDg4OODWrVuoXbs2SwkJIeoqLCwMv/zyC+bMmYMff/xRrRpAFBYWYu7cudi2bRvmzJmDwMBAte/grG4qVUypYqF/dnZ2efF05swZtGrVqnz0qW3btlr5wi5cuBApKSnYu3cv11HUTlFR0Sc7C75r4oiqDr6Avvxr4QR8PWRQMaVThg0bBm9vbwwbNozrKETNVGa2xaVLl9CrVy8cOnSItXV3QUFBqFKlCpYtW8bK8Qgh6qegoABBQUG4fPky9uzZg9atW3Md6bOuX7+On376CWKxGBs3bsQ333zDdSSN8cViSlkL/d+9e4fExMTy6Xtv374tL57c3NxQq1atSp9PU7179w6WlpY4ePAgOnTowHUcTjEMA7FYDJFIBKFQ+ME/3//fqy/nIzlXX+Hz3VvYi4XURFOMGjUKnTt3xujRo7mOQtREZWdb9GluhMBBHti4cSP69u3L2vmfPHmCli1b4urVqyrrNEsIUZ2UlBQMGTIEXbt2xapVq1C1alWuI32RVCrF9u3bMWPGDAwbNgy///47qlevznUstVdhMcXmQn+GYZCZmVlePJ0/fx5t2rQp77xnb2+vVsOeqrJp0yZERkYiPj6ek59fKpV+VLB8qqCp6N+x9fV6enoQCAQwMjKCkZFR+f9+/58vWgxCYQ3FNlgGqJjSNePGjYO1tTXGjx/PdRSiBio92wIAIy6Gp1khNv7qz3qOGTNm4Pnz59iyZQvrxyaEcINhGKxZswbz5s3D6tWrMWSI5u0r9+LFC0yZMgXx8fFYtWoVBgwYoJOf0SurwmJK0YX+rlZ10LfWs/ICSiwWlxdPrq6uGrPPEtvKRmGEQiEKCwvh6OiIWbNmoWPHjioraMr+KRaLYWho+Mni5XMFzef+naxf//6/MzIyqlQjkYmRKTh49bHCrwEVU7rl119/hZmZGSZPnsx1FMIxddpWIS8vD5aWlvj7779hY2PD6rEJIaqXm5uLESNG4MmTJ9izZw+aN2/OdSSFJCYm4qeffkKzZs2wdu1aNG3alOtIaqnCT6+JmS/kKqQAgGGAEzceI/v6NvRyc8bRo0dha2vLaWX7qVEYrkZj3h+FAYAffvgBzZo1k7l4qV69ukLFjqGhoUY9bbCpZwIj/hOIxPJ39BfwtW/9HamYsbExioqKuI5BOJb6MA/zozNkKqQAoKhEivnRGWhtXoPVbRVq1KiByZMnY+bMmYiKimLtuIQQ1Ttz5gz8/f0xePBgREVFacXG3M7Ozrh69SqWL1+O9u3b49dff8WkSZO04mdjk1J7igsEAvhOX4lRjo0hFAqRm5urlNGVyv5dSUkJK6Mr1atXh6mpqULH0tf//3U/DMPAwcEBEydOhJ+fnzJfEo2Wl5eHB4l7IRTagMeX/xdZozZWI6wwNjZGQUEB1zEIx9YlZEEoln3aOgAIxRKsT8hifVuFcePGwcrKCpcuXdL5tbOEaCKJRIL58+djw4YN2LZtG7y8tKvBlaGhIaZPnw5fX1+MGzcO4eHh2LhxI7p27cp1NLVRYTGlSPvpsu+fuWw9xsesZmVq2OdGYSpb0KjrKAyPx8PixYsxatQoDBo0iCr+/8jNzcXKlSuxYcMG9OrVC10cOuPCw0K5p592t9b81vpENgKBAC9evOA6BuGYorMtTt96gdwCEat7KlapUgWzZs3C9OnTER8fz9pxCSHK9+jRIwwbNgz6+vq4cuUKGjRowHUkpWnWrBmOHTuG/fv3w8/PDz179sSSJUtQp04drqNxTum73fYd5IttR5Yr+zQaz8XFBVZWVti0aRPGjRvHdRy18Pz5cyxfvhxbtmzBoEGD8M8//6BZs2YKNUYR8PUR5GKhhLREndE0P8IGHoCo5Bz80I3ddRAjRozAsmXLEB8fDzc3N1aPTQhRjqNHj2L06NEYP348pk2b9sGMI23F4/EwaNAguLu7Y/bs2bCzs8OiRYsQEBCglVsYVZbSf/LiwjeQSOSbVqFrFi1ahPnz5+Pt27dcR+HU48eP8fPPP8PGxgaFhYVISUnBpk2b0KxZaRc/+0Y1EOJtA2MD2d6+pYvIbVhd80A0g0AggFAo5DoG4Ziisy2EYikynrB/fTYwMMC8efMwbdo0VGLrR0IIh0QiEX7++WeMHTsWUVFRCAkJ0YlC6n0mJiZYsWIFYmJisGHDBri4uODGjRtcx+JMhZ9GjRRcqK/PSHAp7iDq1q2LwYMHY9u2bXj06JFCx9Rm9vb2cHV1xR9//MF1FE7cv38fQUFBaNmyJXg8HtLS0rB27Vo0btz4o6/1d2iKEO8WMDbQx5dmbvJ4pa36ldGNi2gGGpkibMkXlijluD4+PmAYBvv27VPK8Qkhirt9+zYcHR1x7949pKSkwMnJietInGrTpg0uXLiAIUOGwMXFBdOnT8e7d++4jqVySh2Z4hsY4PzOP3Dt2jV4eXkhNjYWrVq1QuvWrTF58mScPHkSIpFImRE0zty5c7F69Wo8f/6c6ygqk52djdGjR6Nt27YwMTFBRkYG/vjjjy/OPfZ3aIrIQAd42JrBiK/3UZc+AV8PRnw9eNiaITLQgQopHWZsbEwjU4QVJgIDpRxXT08PCxcuREhICMRisVLOQQiR386dO+Ho6IiRI0di//79qFWrFteR1IK+vj6CgoJw/fp1PHjwAHZ2djh27BjXsVRKqftMediafdT5SCKR4NKlS4iJiUFMTAzS09PRrVs3eHp6wtPTExYWtJ4lODgYDMNg9erVXEdRqoyMDCxYsADR0dEICgpCcHAwateuLdexcgtEiErOQcaTt8gXlsBEYACb+tXh09ac1cXiRDPFxsZi+fLliIuL4zoK4ZB16HGFpvrxJCVwr1+CFYHeqFq1KovJSjEMA1dXVwwdOhSjR49m/fiEENkVFBRg/PjxuHDhAiIjI2Fvb891JLV24sQJBAUFoXXr1li1ahXMzc25jqR0FRZTiiz0NzbQR2SgwxfXp+Tm5iI+Ph4xMTGIjY2FsbFxeWHVvXt3VKtWTeZza7rnz5+jRYsWuHTpUvk6IW1y/fp1zJ8/H6dOncKECRMwfvx4nd3AmajGmTNnEBISgr///pvrKIRDihZTfB4Dixs7cPHMSfTr1w8BAQFwdnZmdeH1xYsX4ePjg8zMTBgbG7N2XEKI7K5evYohQ4bA0dERa9asUcpDFG0kFAqxaNEirF27FiEhIRg/fjz4fKX3vONMhXcAVSz0r127Nnx9fbF9+3Y8evQIBw4cQJMmTbBixQrUr18fPXr0wJIlS3Dt2jWdWZhbt25dBAcHY9asWVxHYVVycjIGDhyInj17ol27dsjOzsbMmTOpkCJKRw0oCAA4W5l+cY3l5/B4gJttPcQcisLNmzdhb2+Pn3/+GV9//TVmzpyJW7dusZKxU6dO6NChA9atW8fK8QghsmMYBmvXroW7uztCQ0Oxbds2KqRkIBAI8Ntvv+H8+fM4duwY2rdvj4sXL3IdS2kqHJkqE5F0D/OjMyAUSyqc8sfjlbaeDvG2YWV9SkFBAU6fPl0+JbCoqAgeHh7w9PSEm5ub3FPCNEFBQQEsLS1x/PhxfPPNN1zHUUhSUhLmzZuHq1evYvLkyRgzZgyqVKnCdSyiQ65fvw4/Pz+kpaVxHYVwSBmzLVJTUxEWFoadO3eiadOmCAgIgK+vr0LrKdLT0+Hi4oLMzEzUqFHji19PCGHPq1evMGrUKDx48AB79uyBpaUl15E0GsMw2L17N3755Rf0798fCxYsQM2aNbmOxapKFVMAcC0nD+sTsnD61gvwUNoitoyArwcGpZuhBrlYKK31dFZWFmJjYxETE4PExETY2trC09MTHh4e6Nixo9a1ply3bh2OHj2K48ePcx1FLmfOnMHcuXORmZmJadOmYcSIERAIBFzHIjooKysLnp6eyMrK4joK4Vjpw8GbKCqp/HS/0tkWFXcDFYvFiIuLQ1hYGGJiYuDm5obvvvsOXl5eMDCQvWnFyJEj0aBBA0ycFoqoKznIeJqPfKEYJgI+bOqZ4Nt2tB6UELadPXsWw4YNw6BBg7Bw4UIYGdHvGFtev36NkJAQHDhwAMuWLcPQoUPBk3eqgJqpdDFVRl0W+otEIpw9e7a8uHr06BHc3Nzg4eEBDw8PNGzYUGVZlKW4uBgtWrTAli1b0L17d67jVArDMDh58iTmzp2LR48eYfr06Rg+fDgMDQ25jkZ0WE5ODjp16kRbMxAAyp9tkZeXh7/++gt//vknMjMz4efnh4CAALRp06bSHx5iL2dg5LJIVLXoAB6P98Far7IHmC7WpghytoB9oxqVzkYI+ZhEIsHChQuxdu1abN26Fb169eI6kta6ePEifvzxR9SqVQvr16+HtbU115EUJnMxpa4ePXqEuLg4xMTE4MSJEzA3Ny8ftXJyctLYpwu7d+/GihUrcPHiRbWu4BmGwfHjxzF37tzypw9+fn5aveCQaI7c3FxYWlri1atXXEchakJVsy2ys7MRFhaGsLAwVK1aFQEBARg2bFiFWz+UFXtFxSUA7/NrltmeWk+ILnr8+DH8/f3BMAwiIiK04mG8uhOLxVi7di3mzZuHsWPHYvr06Ro9c0lriqn3icViXLp0qXzUKj09Hc7OzuXrrTSp/bpUKkX79u0xY8YM+Pj4cB3nI1KpFIcPH8a8efMgEokQGhqKQYMGad2US6LZCgsLYWpqqpObCZKKqWq2hVQqxdmzZxEWFob9+/ejY8eO+O6779C/f/8P1pAqaxoiIeRj0dHRGDVqFIKCgjBjxgz67KJiOTk5mDhxIlJTU7F+/Xq4u7tzHUkuWllM/df77ddjYmJQtWrV8sJKE9qvx8XFYfz48bhx44bajPRIJBLs27cP8+bNg4GBAUJDQ9G3b19WWwQTwhapVAo+nw+JRKLWI7xEN7x79w6HDh3Cn3/+iYsXL2LgwIEICAhA9aYtMXTLP0rdjoQQUrqMYsaMGdi7dy8iIiLQrVs3riPptGPHjmHcuHHo3Lkz/vjjD9SrV4/rSDLRiWLqfQzD4Pr16+WF1aVLl9ChQ4fyva1atWqldh+2GIaBu7s7Bg8ejMDAQE6ziMVi7N69GwsWLECNGjUQGhoKLy8vtftvRsh/GRkZIT8/X2On/BLt9PjxY+zcuRN//vknCtoMBcxbA5D9esrjAR62Ztjo3579kIRokezsbAwZMgQNGjTAtm3btLoztCZ59+4d5s6diy1btuD333/HDz/8oDEjhTpXTP2XprRfv3z5Mvr164fbt29z0la8uLgY4eHhWLhwIRo2bIjQ0FC4urpSEUU0xldffYX79+9Tq2mill68FcJx0UnIMLvvI0Z8PZyf2oO6/BHyGbt370ZwcDBCQ0Mxbtw4+gyjhm7cuIGffvoJQqEQGzduRNu2bbmO9EU6X0z9V1ZWFmJiYhAbG/tB+3VPT0906NCB0yrZ19cX33zzDaZPn66yc4pEImzbtg2LFy+GpaUlQkNDaTicaKR69eohJSUF9evX5zoKIR/ZmJiNFfGZH3Ttk5WAr4ef3a3wQ7fmLCYjRPMVFhZiwoQJOHv2LPbs2YM2bdpwHYlUgGEY7NixA9OmTYOfnx/mzJkDExMTrmN9Fi1w+Q8LCwuMGzcOR44cwYsXLzB//nwUFhYiMDAQdevWha+vL7Zv347Hjx+rPNu8efOwfPly5ObmKv1c7969w6pVq9C8eXMcPXoUe/bswYkTJ6iQIhpLIBBAKBRyHYOQT8p4mq9QIQWUdiTMePKWpUSEaIdr166hffv2EIvFuHLlChVSGoDH42HEiBG4ceMG3r59C1tbW0RFRUFdx3+omKqAkZERXF1dsXTpUly7dg3Xrl2Dh4cHYmJi0LJlS7Ru3RpTpkzBqVOnIBKJlJ7H0tISgwcPxsKFC5V2joKCAixduhTNmzdHYmIiDh06hGPHjsHBwUFp5yREFYyNjVFUVMR1DEI+KV8oZuk4JawchxBNxzAMNmzYAFdXV0yfPh1//vmn2jccIx+qU6cOtm7dit27d2P27Nno1asX7ty5w3Wsj6hHazgN0bBhQ4wcORIjR478oP36jBkzytuvl+1tpaz267NmzYKdnR0mTJiAKrXMEHUlBxlP85EvFMNEwIdNPRN82072lr5v3rzBmjVrsHr1avTo0QNxcXFo1aqVUn4GQrhgbGxMI1NEbZkI2LkdmwgMWDkOIZrs9evXGD16NO7evYtz587BysqK60hEAV27dkVKSgpWrFiBjh07YtKkSfj1119haGjIdTQAtGaKNbm5uThx4kT53lZVq1YtL6zYbr/+Y8hCXH5XG2+rNQKAD6aGlG026WJtiiBnC9g3qlHhsV69eoWVK1di/fr18Pb2xowZM2BjY8NaVkLUhaOjI5YuXYouXbpwHYWQj9CaKULYcf78eQwdOhT9+/fH4sWLqYOrlrl37x7GjRuHO3fuYMOGDXB2duY6Ek3zY0vt2rUxZMiQ8vVU+/btQ+PGjbFixQrUr18frq6uWLJkCa5du6bQnM+IpHtI0PsGLwzrQySWfnTjFf77d3HpzzBkcxIiku598jjPnz/HtGnTYGlpicePH+PixYsICwujQopoLZrmR9SZTztzhY/BAPBpq/hxCNFEEokECxYswMCBA7F69WqsXLmSCikt1LRpUxw5cgTz58+Hv78/vv/+e7x48YLTTFRMKQGPx4O9vX35eqonT55g4sSJuH//PgYMGICGDRtixIgRiIyMxKtXryp93Iike5gffRNCsRS8L2yOyzBAUYkE86NvflBQPXnyBJMmTYKNjQ3y8/ORnJyMLVu2oHlzepJJtBs1oCDqrE41IzhbmULeTs08AN2tTaktOtFJT58+LV/TfvnyZfTt25frSESJeDweBgwYgPT0dNSuXRstW7bE1q1bIZUq1sRHXlRMqUC1atXQp08frFu3DtnZ2Thz5gzatWuH8PBwNG3aFA4ODvjtt9+QlJQEiUTyyWOkPszD/OgMFMm4CUlRiRTzozNw4sotjBs3DnZ2dpBKpbh+/TrWr1+PJk2asPEjEqL2aGSKqLuxLhYQ8OXbfoORFGNI61osJyJE/cXGxqJt27ZwcnLCqVOnYG5Oo7O6onr16li+fDliY2OxefNmdOvWDdevX1d5DlozxTGRSISzZ8+Wbxr8+PFjuLm5la+3atCgAQAgMPwyTtx8BrleLUaKkntX4N+kCJMmTYKZmRm7PwQhGmD48OHo2bMnhg8fznUUQj6rbAaCLA/OjA308A1zB0kRyxAdHY0WLVooMSEh6qG4uBgzZ87E7t27ER4eDhcXF64jEQ5JpVJs2rQJoaGhGDlyJGbNmoWqVatW+D0vC0SsNHKjYkrN5OTkIC4uDjExMYiPj4e5uTlcPPvguIEjZByU+oChPg8XprnSFBCis8aMGYMOHTogMDCQ6ygai60bD6lYaUGVAaFYUuEDNB4PEPD1EeJtA3+HpggLC8PkyZOxZ88edO/eXXWBCVGxO3fuwM/PD3Xr1sX27dtRp04driMRNfHs2TP88ssvOHv2LNasWYM+ffp89DWpD/OwLiELiZmla60UaeQGUDGl1srary89ehXJJfUBfflb3lKXJ6LrJkyYgObNmyM4OJjrKBqH7RsP+bJrOXlYn5CF07degIfS5kJlyv6bd7c2RZCLBVqb1yj/d6dOnYKfnx+WLVtGo7BEK0VGRmL8+PEICQnBhAkTwJN3oSHRaidPnkRQUBBsbW2xatUqNG7cGID8D6sqQvtMqTE+n4/OnTuj8QMBkq8+VuhYQrEUGU/espSMEM1DDSjk86UbT9mH/Lj0ZziT+bJSNx7yZa3Na2Cjf3vkFogQlZyDjCdvkS8sgYnAADb1q8On7adHA3v06IHTp0+jV69euHv3LkJDQ+nDJtEK7969w8SJE3H69GkcP34c7dq14zoSUWOurq64du0aFi9ejLZt22L69Omo49Afi2IzKzWN+v1GbgAqvK9RMaUB8oVilo5TwspxCNFE1IBCdrKs35HlxkMqr3Y1I5lnFNja2uLChQvo06cP7ty5g02bNqnN5paEyCMtLQ2+vr5o06YNkpOTUb16da4jEQ1gZGSEWbNmwc/PD6Mmz8GDp80AvmzXwrJGbq3Na3wwC+B91M1PA5gI2Kl5TQTyTxMkRNMZGxvTyJQMFO0gei0nTznBSKXUq1cPCQkJyMvLg5eXF/Ly8riORIjMGIbB//73P3Tv3h1TpkxBeHg4FVJEZpaWlrAZFAweX77PwUKxBOsTsj7772lkSgPY1DOBEf/pRxv0ykLA14NNfboAaRJa7M8ugUBAI1MyWJeQBaH401s1fEnZjWejf3uWUxFZVK1aFfv27cOkSZPQpUsXREdH03YYhDOy3tPy8vIwZswY3L59G2fPnoW1tTUHqYk2eFkgQmLmCzCQb8ozwwCnb31+Y2AqpjSATztzrIjPVOgYDACftrT3giaoeLH/U6yIz6TF/nKgaX6VV37jkbM9UdmNJ7dARIU/x/T19bFq1SqsWrUKjo6OOHToENq3pyKXqI4897SkpCT4+fmhT58+CA8Ph0Ag4CI60RJRV3IUPkZFZRgVUxqgTjUjOFuZyr3PFI9X2vWJPtSoP1rsrzzUgKLy2LrxRCXnUAdRNREcHIwmTZrA29sbW7du/WS7YELYJus9bbqXNZ6c2Ys//vgDmzZtQr9+/VScmGijjKf5Cs3uAj7sqPpfVExpiLEuFvj79ksUlcg+7UbA10eQi4USUhE20WJ/5aKRqcpj68ZDHUTVS//+/dGwYUP069cP9+/fx7hx47iORLSYPPe02QdS8dWdHFy+fBmNGjVSQUqiC9hq5PY51IBCQ9g3qoEQbxsYG8j2khkb6CHE2+azHUiIeqDF/spHDSgqjzqIaq8OHTrg3LlzWL9+PSZNmgSJRL51cYRURN57GqNvAKGtN17zaI03YQ9bjdw+h4opDeLv0BQh3i1gbKCPL24bwkhhbKCPEO8WNGqhAdhY7E8qRg0oKo86iGq3r7/+GufOnUNKSgq+/fZbvHv3jutIRMsock8TiaV0TyOsKm3kpljJI6jg+6mY0jD+Dk0RGegAD1szGPH1PnpxBXw9GPL1IH14FaGO1aiQ0hBsLfYnn0fT/L4sLy8PYWFhSDq+D4xYsfcTdRBVbzVr1kRMTAyqVq2K7t2749mzZ1xHIlqCzQY2hLDBp53iDdgqejtTMaWBWpvXwEb/9jg/tQd+drfCgG8awtWmLgZ80xA/u1vhwtQemN2jATYtmglG3qsZ0Shli/3J51EDik8rK6D69OmDJk2aYN++ffjepQWMjBTrnkUdRNWfkZERwsLC4Onpic6dOyMjI4PrSEQLsNnAhhA2lDVy++Ksrs8oa+T2OdSAQoPVrmb02U5ZAQEBWLZsGWJiYuDl5aXiZERWtNhf+Whk6v/l5eXh8OHD+Ouvv3DmzBm4uLjA19cXERER+OqrrwAAyeGXqYOoDuDxePj999/RrFkzODs7Y+/evXB2duY6FtFg1MCGqCNlNnKjkSktxefzsXDhQkybNg1SqWIXNaIZaLF/xXS9AcWnRqB8fX3x4MEDHDp0CP7+/uWFFFB64xHw9eU6F3UQ1TwBAQHYtWsXvv32W+zcuZPrOESDUQMboo6U2ciNiikt1q9fP1StWhW7du3iOgpRAVFBHsRi5bb/1GS62IBC1gLqfdRBVPe4urri9OnTCAkJwbx582iaOJELNbAh6kqWRm48HirdyI2KKS3G4/GwaNEihIaGQiSihZzqTNEuM/qMBJdPHIKpqSkGDBiADRs2ICsriz4MvUdXpvkpUkD9l7JuPER92dnZ4cKFCzh48CBGjRqFkhIaHSCyYatzGjWwIcpQ1sitXV0+ICn5ZCM3I74ePGzNEBnoUKn7GY+hT1tar3fv3nB3d0dwcDDXUchnWIceV2iOuRFfD+en9oC4MA/x8fE4ceIE4uLiIBAI4O7ujp49e6JHjx6oWbMmi6k1S1FREWrWrKmVU/0+tQbq22+/RZ8+fSpdOFXkWk4e1idk4fStF+Dhw53gBXw9MChdIxXkYkEjUlqisLAQfn5+KCoqQlRUFCvvI6IbXhaI0GXxKVbuabTukijL1KlTITWoAoue/sh48hb5whKYCAxgU786fNqay/Teo2JKB1y/fh1ubm64ffs2TExMuI5DPiFQwcX+HrZm2Ojf/oO/ZxgG6enpiIuLQ1xcHM6dOwdbW1v07NkT7u7ucHBwgIGB7kyjYBgG+vr6EIvF0NPT/EF5ZRdQn5JbIEJUco7CNx6iGSQSCSZOnIjTp08jOjoajRs35joS0RDKuKcRwiZbW1vs2LEDHTt2VPhYVEzpiICAADRp0gRz5szhOgr5hNSHeRiyOUmuLjPGBvqIDHT44oiASCTCuXPnyketsrKy4OzsjJ49e6Jnz56wtLQET96+oRrC2NgYr169grGxMddR5MJFAUV0G8MwWLVqFZYtW4bDhw+jbdu2XEciGkAV9zRC5JWdnQ0nJyc8evSIlYerVEzpiPv376Nt27ZIT0+HmZkZ13HIJ0Qk3cP86JsoKqn81IjSxf7yrVF58eIFTp48ibi4OJw4cQJ6enrlo1aurq6oXbu2zMdUdzVr1kR2djZq1arFdZRKowKKqIP9+/fjhx9+wPbt29G7d+9Pfs3LAhGiruQg42k+8oVimAj4sKlngm/b0cilLlL1PY2Qylq5ciXS0tKwZcsWVo5HxZQOmTRpEoqLi7F27Vquo5DPKL35ZEAollQ4PYLHK20/HeJtw8pNh2EYZGRklI9anTlzBjY2NuXrrTp37gxDQ0OFz8O1Bg0a4NKlS2jYsCHXUSpEBRRRRxcvXsSAAQMwc+ZMBAUFlf996sM8rEvIQmLmCwAf7ptXtqbOxdoUQc4WsG9UQ8WpCZe4uqcRUhFXV1dMmDAB/fr1Y+V4VEzpkJcvX8LGxgZJSUmwsKA9YNSVOiz2Ly4uxoULF8pHrTIyMtCtW7fy4srGxkYjpwQ2a9YMJ06cQPPmn97smktv3rzBoUOHqIAiau3OnTvw9vZG7969sWTJEuz65wF9WCYVquiexpOWQF+fDzfbetTAhqjEmzdv0KhRIzx58gRVq1Zl5ZhUTOmYefPm4caNG9i9ezfXUcgXqNNi/9zcXJw8ebJ85EoqlZYXVq6urjA1NVVpHnnZ2dkhMjISLVu25DoKgNKL+uHDh7F3714qoIjGePXqFQYOHAhpsy54bu4EIU3jIpXwqXua9NVDJO1ZhYuJ8VzHIzoiMjISYWFhOHbsGGvHpGJKxxQWFsLS0hJHjhxBu3btuI5DNBDDMLh9+3b5qFVCQgIsLCzKi6suXbrAyEg910e0b98eGzduRPv23HWJer+ASkxMRPfu3amAIhrn0p3n8P3fBUj1ZN+glRoMkDJisRiNGzfGiRMnYGdnx3UcogP8/f3h5OSEH3/8kbVjUjGlgzZs2IADBw4gLi6O6yhEC5SUlCApKal81Co9PR1dunQpb2ZhZ2enNlMCnZycsHDhQnTt2lWl56UCimgban1N2BISEoJ3795hxYoVXEchWk4sFsPMzAypqakwNzdn7bhUTOmgkpIS2NraYsOGDXBzc+M6DtEyr1+/xqlTp3DixAnExsZCJBKVj1q5ublx2k3S3d0dkydPRs+ePZV+LiqgiLaiTVkJm7Kzs+Hg4ICcnBy1ndVAtMOZM2cwceJEJCcns3pcKqZ01N69e7FkyRL8888/WrGBKVFPDMMgOzu7fNQqISEBTZo0Kd/bysnJCQKBQOk5ylo2b9hzGOZNLWDZ1FwpLZupgCK6YGNiNlbEZypUTAn4evjZ3Qo/dFO/ZjBE9dzc3DB69GgMGTKE6yhEi02ePBlVqlTB77//zupxqZjSUVKpFJ06dcKvv/4KX19fruMQHSEWi/HPP/+UF1fXrl2Do6Nj+chVq1atWJ0SqIqWzVRAEV0zMTIFB68+Vvg4A75piBW+3ygeiGi8PXv2YMuWLYiPp0YURHlsbGwQERHB+rppKqZ02MmTJ/HDDz/g5s2bMDAw4DoO0UFv3rzB6dOny5tZvH379oMpgfXr15f72Mrc34QKKKLLRv55Cacynit8HFebutga0IGFRETTiUQimJubIykpSS23riCa7/bt23B2dkZOTg7rM7JofpcOc3V1RfPmzbF582auoxAd9dVXX6F///5Yv349bt++jfPnz8PJyQmHDh2CnZ0dWrdujV9++QWxsbF49+5dpY9bWkjdRFFJxYUUADAMUFQiwfzom4hIuvfZr3vz5g3Cw8PRp08fNGrUCFFRUfD19cXDhw9x6NAh+Pv7UyFFdIKJQPYOfp8+Dj3EI6WMjIzg7++Pbdu2cR2FaKkjR46gd+/eSlnaQiNTOi4lJQW9evVCZmYmqlWrxnUcQsqJxWJcuXIFcXFxiIuLw9WrV9GpU6fyLoH29vafvCimPszDkM1JKCqRyHzO/7ZsphEoQj5Ga6aIMty4cQPu7u548OAB+Hx2CnZCynTv3h2TJk1Cnz59WD82FVMEfn5+sLOzw8yZM7mOQshn5efnIyEhoXy91evXr+Hm5lZeXDVs2BCA4i2be1jWhgv/NhVQhHwGdfMjyuLo6Ihp06ahb9++XEchWuT169do0qQJnj59iipVqrB+fCqmCLKzs9GpUyfcvHkTpqamXMchpFLu379fXlidPHkS9erVg3PPXogzdoZYgasaIy5Gy+w98BvYhwooQj6D9pkiyrB9+3bs378fR44c4ToK0SK7d+/Grl27lPa+omKKAADGjRsHAwMD2jSPaCSJRILk5GQsPXoV/xSZAvryr8Uw4vMwyd2aph8RUgE2p9MSUqawsBCNGjXC9evXy2cbEKKooUOHwsXFBYGBgUo5PjWgIACA0NBQhIWF4d69e1xHIURm+vr66NChAxrYtleokAIAkZhBxpO3LCUjRDvZN6qBEG8bGBvI+DFCXIyv36TAth6t0SUfq1q1KgYPHozt27dzHYVoiZKSEsTExKB3795KOwcVUwQAYGZmhnHjxmHWrFlcRyFEbvlCMUvHKWHlOIRoM3+HpgjxbgFjA318aXs4Hq90RCqkly2ktxLRt29fvH1LDy3Ix0aPHo2tW7dCKpV/TR4hZc6dO4dmzZqhQYMGSjsHFVOk3C+//FK+kSohmohaNhOiWv4OTREZ6AAPWzMY8fUg4H/4sULA14MRXw8etmaIDHTAGBdrHDlyBI0aNYKTkxNycnI4Sk7UVbt27VCjRg2cPHmS6yhECxw5ckQpHfzeR2umyAdWr16N2NhYHDt2jOsohMiMWjYTwp3cAhGiknOQ8eQt8oUlMBEYwKZ+dfi0Nf+oax/DMFi+fDlWrVqFw4cPo02bNhylJupo3bp1OHPmDCIjI7mOQjSclZUV9uzZg7Zt2yrtHFRMkQ+IRCLY2Nhgx44dcHZ25joOITKhls2EaJZ9+/bhxx9/xPbt25W6poFoltevX+Prr7/G7du3qcswkdutW7fg6uqKhw8fgvelucgKoGl+5ANGRkaYN28epk6dCqqziaapU80IzlamX1y/8Tk8HtDd2pQKKUJUZNCgQThy5AjGjBmDtWvXch2HqImaNWuib9++CA8P5zoK0WBHjhxB7969lVpIAVRMkU/w8/ODUCjEwYMHuY5CiMzGulhAwNeX63sFfH0EuViwnIgQUhEHBwecP38e69atw8SJEyGRyN5unWif0aNHY/PmzfRgl8itrJhSNiqmyEf09PSwaNEiTJ8+HWIxO93RCFGVspbNRnzZnkQJ+HoI8bahvW8I4cDXX3+N8+fP49q1axg4cCAKCwu5jkQ41rVrV0ilUpw/f57rKEQDvXr1CikpKXB1dVX6uaiYIp/k4eGB+vXrY8eOHVxHIURmg9s2gGHaEfAhrVTLZn1GjBp3T8GvQyPVBCSEfKRmzZqIiYlBrVq14OzsjCdPnnAdiXCIx+OVj04RIqvjx4/DxcUFxsbGSj8XFVPkk3g8HhYvXozffvsN79694zoOITKZOXMmmopzsC/IqVItm//6sQuqPU3BlClTOEpMCAEAQ0NDbNu2Df3794eDgwOuX7/OdSTCoYCAABw8eBBv3rzhOgrRMKpoiV6GuvmRCvn4+KBDhw6YOnUq11EIqZSYmBiMGTMGKSkpqFOnDoDKtWx+9eoVHBwcMG3aNIwcOZLLH4EQAmDXrl2YOHEiIiIi0LNnT67jEI74+PjAzc0NP/74I9dRiIYoKSlB3bp1kZ6ejvr16yv9fFRMkQrdunULTk5OuHXrFmrVqsV1HEIq9OTJE7Rt2xZ79uyRq7V/RkYGunXrhv3798PJyUkJCQkhsjh79ix8fHwwd+5cjBkzhus4hAOxsbGYMWMGrly5wnUUoiFOnTqFqVOn4tKlSyo5H03zIxWytrbGwIEDsWjRIq6jEFIhqVSK4cOH48cff5R7jzQbGxuEh4fj22+/xb1799gNSAiRmZOTE/7++28sWbIE06ZNg1Qq/x5yRDO5ubnh5cuXSE5O5joK0RCqnOIH0MgUqYTHjx+jVatWuHr1Kho1ogX6RD0tXLgQMTExOHXqFPT15WuNXmbVqlXYunUrzp07h+rVq7OUkBAir5cvX2LAgAGoV68ewsLCVLKonKiPOXPm4OnTp1i/fj3XUYiaYxgGlpaW+Ouvv9CmTRuVnJOKKVIpM2bMwLNnz7B161auoxDykfPnz2PgwIG4fPkyzM3NFT4ewzAIDAzE8+fPceDAAejp0SA+IVwTCoUYOXIk7t69i0OHDqFu3bpcRyIq8vDhQ9jb2yMnJwdVqlThOg5RYxkZGXB3d8eDBw+UvllvGSqmSKXk5eXBysoKCQkJqNu4OaKu5CDjaT7yhWKYCPiwqWeCb9v9/2J+QlTl9evXaNOmDdasWcPqsH5xcTHc3Nzg5OSEBQsWsHZcQoj8GIbBrFmzsGvXLhw9ehQtWrTgOhJRkV69emHw4MEICAjgOgpRY0uXLsWdO3ewYcMGlZ2TiilSaVMWrUPsQwbCWs0BACLx/89dF/D1wABwsTZFkLMF7BvV4CYk0SkMw8DHxweNGjXCypUrWT/+ixcv0KlTJ8ydOxfDhg1j/fiEEPns2LEDU6dOxZ49e9C9e3eu4xAVOHDgAP744w/8/fffXEchaqxbt26YNm0avL29VXZOKqZIpUQk3cO86JsoEonBq2DKE48HCPj6CPG2gb9DU9UFJDppw4YN2Lx5My5cuAAjI+WMiqalpaFHjx44cuQIOnXqpJRzEEJkd+rUKfj5+WHJkiU0WqEDSkpK0LhxY5w6dYpGJMkn5ebmolmzZnj27BkEAoHKzksLAcgXRSTdw/zomxCWSCsspACAYYCiEgnmR99ERNI91QQkOunatWuYNWsWIiMjlVZIAUDLli2xdetWDBw4EA8fPlTaeQghsunRowcSEhLw+++/Y/bs2aBnw9rNwMAAAQEBtHabfNbx48fRvXt3lRZSABVT5AtSH+ZhfnQGikpka0dbVCLF/OgMXMvJU04wotMKCwvh6+uLFStWwNLSUunn69OnD4KDg9GvXz8UFhYq/XyEkMpp0aIFLly4gJiYGAwfPhwikYjrSESJRo0ahbCwMHqdySepuiV6GSqmSIXWJWRBKJbI9b1CsQTrE7JYTkQIMGHCBHTq1An+/v4qO+fkyZPRsmVLfP/997TXDSFqxMzMDKdPn4ZQKIS7uztyc3O5jkSUxNLSEnZ2djh8+DDXUYiaKS4uRlxcHHr16qXyc1MxRT7rZYEIiZkvIO/MCYYBTt96gdwCeoJE2LNr1y6cPXsWa9euVel5eTweNm3ahJycHMydO1el5yaEVKxKlSrYu3cvHBwc4OjoiKwsepCnrcaMGYPNmzdzHYOomb///htWVlaoV6+eys/NV/kZicaIupKj8DF4AKKSc/BDt+aKByI6Lzs7G8HBwYiLi0O1atVUfn6BQIADBw6gU6dOsLW1xbfffqvyDISQT9PT08OSJUvQvHlzODk5Yd++fejSpcsnv/ZlgYi2+NBQAwcOxIQJE3D37l18/fXXXMchaoKrKX4AdfMjFZgYmYKDVx8rfJwB3zTECt9vFA9EdFpxcTG6dOmC7777DuPHj+c0S0pKCnr27ImYmBi0a9eO0yyEkI/FxsZi+PDhWL16NYYMGVL+96kP87AuIQuJmS8A0BYfmio4OBgmJiY0S4AAKN0mxcLCAvv374e9vb3Kz0/T/Mhn5QvFLB2nhJXjEN02Y8YMNGjQAOPGjeM6Ctq0aYONGzeif//+ePLkCddxCCH/4eHhgfj4eEydOhULFiwAwzCISLqHIZuTcOLmM4jE0g8KKQAQ/vt3cenPMGRzEnWkVWOjR4/G9u3bIRaz8zmFaLabN2+ipKQErVu35uT8NM2PfJaJgJ23h4nAgJXjEN0VHR2NvXv3IiUlBTwej+s4AIBBgwYhPT0d/fv3R0JCAoyNjbmORAh5T+vWrXHhwgX07t0bCY8keFC7PYSV6Ez7/hYfAGjPRDXUqlUrmJubIyYmBr179+Y6DuFY2RQ/rj4f0MgU+SybeiYw4iv2FhHw9WBTvzpLiYguevz4MUaNGoWdO3eidu3aXMf5wMyZM/H1119jzJgxtMcNIWqoQYMGWLfnKG5Xa1WpQup9tMWHehs9ejS2bNnCdQyiBrhcLwVQMUUq4NPOXOFjMAB82ip+HKKbJBIJ/P39ERQUhK5du3Id5yM8Hg/bt2/HrVu3sGjRIq7jEEI+YfvFx4C+fDMkaIsP9TVkyBAkJibSVGsd9/LlS1y/fh0uLi6cZaBiinxWnWpGcLYyhbyjpjwe0N3alDojEbktXLgQDMNgxowZXEf5LGNjYxw8eBDr1q3DoUOHuI5DCHkPbfGhvapVqwYfHx/s2LGD6yiEQ9HR0XB1dYVAIOAsAxVTpEJjXSwg4OvL9b0Cvj6CXCxYTkR0xd9//421a9di586d0NeX7z2oKg0bNsT+/fsxevRoXLt2jes4hJB/sbnFB1E/ZVP9aCN13cX1FD+AiinyBfaNaiDE2wbGBrK9VYwN9BDibYPW5jWUE4xotVevXmHYsGHYunUrGjRowHWcSunYsSNWr16Nvn374vnz51zHIYQAyHia/1HXPlkJxVJkPHnLUiLCpo4dO6Jq1apISEjgOgrhQHFxMU6cOIFevXpxmoOKKfJF/g5NEeLdAsYG+l+e8sdIYWygjxDvFtQBiciFYRiMHDkSPj4+nF8gZeXn5wd/f38MHDgQIhFNCyKEa7TFh3bj8XgYPXo0Nm/ezHUUwoHExES0aNECdevW5TQHFVOkUvwdmiIy0AEetmYw4utB8J8ufwK+Hoz4etB7fB0TW1ErWSK/9evXIycnBwsXLuQ6ilzmzJmDunXr4qeffqIOf4RwjLb40H7+/v6Ijo5Gbm4u11GIiqnDFD8A4DF0tycyyi0QISo5BxlP3iJfWAITgQFs6leHT1tzJMQexdy5c5GcnAw9ParViWyuXr0Kd3d3XLhwARYWmrverqCgAE5OTvjuu+8wadIkruMQorM2JmZjRXymQlP9jPg8THK3xg/dmrOYjLBp2LBh6NChAyZOnMh1FKIiDMOgWbNmOHz4MFq1asVpFiqmCKsYhoGDgwOCg4MxdOhQruMQDVJQUID27dtj1qxZWvHeuX//Pjp37owtW7bA29ub6ziE6KSXBSJ0WXxKoWKKERfDLms3vvfzQZ8+fWiDbjWUkJCAcePG4fr162qzsTtRrrS0NPTu3Rt3797l/DWnoQPCKh6Ph8WLF2PmzJkoLi7mOg7RIOPHj4ejo6NWFFIA0KRJE0RFReH7779Heno613EI0UlsbPHhZlcfQwb0xpYtW9CgQQOMHDkSp06dgkQiYTcskZuzszNEIhGSkpK4jkJUpGyKH9eFFEDFFFECFxcXWFtb43//+x/XUYiGiIiIwIULF7BmzRquo7DK0dERS5cuRZ8+fWg+PyEcUXSLj2A3G3z33XeIi4vDjRs30LJlS/z6669o0qQJpkyZQtshqIGyRhRbtmzhOgpREXVZLwXQND+iJKmpqfDw8MDt27dRvXp1ruMQNXb79m04OjoiPj4e9vb2XMdRiilTpuDSpUuIi4uDgQEtZCdE1SKS7mF+9E0UlVR+ul/pFh+f70x748YN7Ny5Ezt37sRXX30Ff39/DB06FObm5grnfVkgQtSVHGQ8zUe+UAwTAR829UzwbTtz1K5mpPDxtdHTp09hY2ODBw8ewMTEhOs4RImeP38OKysrPHv2DEZG3P8+UDFFlMbf3x8WFhb47bffuI5C1JRIJIKjoyNGjhyJsWPHch1HaSQSCfr16wdzc3Ns2LBBLaYlEKJrSguqDAjFElT0yYcHQGCgjxBvm0p1ppVKpTh79iwiIiKwb98+2Nvbw9/fH4MGDcJXX30lU8bUh3lYl5CFxMwXAPDBWi8BXw8MABdrUwQ5W8C+UQ2Zjq0LBg4cCE9PTwQGBnIdhSjRjh07cPToUURFRXEdBQAVU0SJ7t69i/bt2yM9PR1mZmZcxyFq6Oeff8a9e/ewf/9+rS8w8vPz0blzZwQFBWl14UiIOruWk4f1CVk4fesFeCjdkLeMgK+H4pISmJY8w+afv5Vr03mhUIhjx44hIiICp06dgoeHB4YPHw4PDw8YGhpW+L2VLvZ4pdMPK1vs6ZLo6GjMnj0bly5d4joKUaJBgwahb9++CAgI4DoKACqmiJIFBwdDKpVq3VoYorijR49i7NixSElJQa1atbiOoxJ37tyBo6MjwsPD4e7uznUcQnTW57b4cGtWDQ5tWuLs2bOwtrZW6ByvXr3CX3/9hYiICGRkZGDw4MHw9/eHg4PDRw+PlDENURdJJBI0bdoUR44cwTfffMN1HKIEIpEIdevWRVZWFkxNTbmOA4CKKaJkL168QIsWLXDx4kU0b057dJBSjx49Qrt27bBv3z506dKF6zgqlZCQgMGDB+Ps2bOwsrLiOg4h5D8WL16Mf/75B/v27WPtmHfv3sWuXbsQHh6OkpIS+Pv7Y9iwYbCyskLqwzwM2ZyEohLZuwMaG+gjMtBBrlE0bTV79my8evWKHuJqqdjYWPz+++84f/4811HKUTFFlG7OnDnIyMjArl27uI5C1IBEIoGrqyvc3d0REhLCdRxObN68GcuWLUNSUhJq1qzJdRxCyHuKiopgZWWFvXv3onPnzqwem2EYJCcnIyIiArt370aTJk1Q3XsSsoXVIM+HMR4P8LA1w0b/9qzm1GT3799H27ZtkZOTQ3uCaaFx48ahYcOGmD59OtdRylExRZSuoKAAlpaWiI6ORps2bbiOQzg2Z84cJCYmIi4uDvr68rUr1gbBwcHIyMjAsWPHwOfzuY5DCHnPtm3bsGPHDiQmJiptPadYLMaB4/GYcq4YDE/+a6ERXw+35nqxmEzzeXp6wt/fH/7+/lxHISxiGAZNmzbFsWPH0LJlS67jlKN9pojSVatWDTNnzsS0adO4jkI4dubMGWzYsAHh4eE6XUgBwPLly8EwDH755ReuoxBC/iMgIACvXr3C0aNHlXYOPp+PXBNLGCq4XYJ2t+6Rz5gxY7B582auYxCWXb9+HXp6erCzs+M6ygeomCIqMWbMGGRnZ+PkyZNcRyEcyc3Nhb+/P7Zt24YGDRpwHYdzfD4fkZGRiImJwaZNm7iOQwh5j76+PhYtWoRp06ZBLBYr7TwZT/M/aH8uD6GC36+N+vTpg4yMDGRmZnIdhbCobKNedev+S8UUUQlDQ0PMmzcP06ZNA80s1T0Mw2DEiBHw9fWFlxdNRylTs2ZNHDlyBKGhoUhMTOQ6DiHkPb169ULt2rURFhamtHPkC5VXqOkyQ0NDBAQEYMuWLVxHISwqK6bUDRVTRGUGDx4MiUSiNpusEdVZs2YNnj59ivnz53MdRe1YWVkhIiICvr6+uHPnDtdxCCH/4vF4WLJkCWbPno13794p5RwmAlovqSyjRo3Cn3/+ieLiYq6jEBY8e/YMGRkZcHZ25jrKR6iYIiqjp6eHxYsXIyQkBCUlJVzHISqSnJyMuXPnYvfu3V/ctFJXubu7Y+bMmejbty/y8/O5jkMI+ZeDgwM6deqktDbbNvVMYMRX7KOYQMHv11bW1tawsbHBkSNHuI5CWHDs2DG4u7ur5ecI+g0kKuXu7o7GjRtj69atXEchKvD27VsMGTIEa9asoX3GvmDs2LFwcnLC0KFDIZHIvt8MIUQ55s+fj2XLliE3N5f1Y/u0M1f4GDRx/vNGjx5NU/20xNGjR9Vyih9ArdEJBy5fvoy+ffvi9u3bqFq1KtdxiBJ99913MDQ0pJtZJZWUlKBnz57o0KEDlixZwnUcQsi/fvrpJ1SpUgXLly9n/diB4Zdx4uYzyPNpjPaZqlhRURHMzc2RnJyMJk2acB2HyEkoFMLMzAzZ2dmoU6cO13E+QiNTROXat2+Prl27YuXKlVxHIUoUFhaGy5cvY9WqVVxH0RgGBgaIiorCvn378Oeff3IdhxDyr9mzZ2PHjh24f/8+68ce62IBAzmbkwn4+ghysWA3kBYxNjaGn58ftm/fznUUooCEhAS0atVKLQspgIopwpF58+ZhxYoVePnyJddRiBJkZmbil19+QWRkJI0+yqh27do4cuQIJk+ejPPnz3MdhxACoF69ehg7dixCQ0NZP7ZR4VMUng2DoYyfyIwN9BDibYPW5jVYz6RNxowZg23bttH0aQ2mrl38ylAxRThhaWmJwYMHY8GCBVxHISwTiUTw9fXF3Llz0apVK67jaCRbW1vs2LEDPj4+SnkSTgiR3eTJkxEXF4fU1FTWjvns2TN4e3tj/ggvzOpjB2MDfXxpCx0eDzA20EeIdwv4OzRlLYu2sre3h5mZGeLi4riOQuTAMIzaF1O0Zopw5unTp7Czs6O5zFomODgYjx49wl9//aV2G+tpmuXLlyM8PBxnz55FtWrVuI5DiM5bu3Ytjh07huPHjyt8rMLCQri4uKB3796YPXs2AOBaTh7WJ2Th9K0X4OHDDXkFfD0wALpbmyLIxYJGpGTwv//9D7Gxsdi/fz/XUYiMUlNTMXDgQGRlZantZwoqpginQkND8eDBA1ofoiUOHz6MCRMmICUlBTVr1uQ6jsZjGAYjR47EmzdvEBUVBT09mkxACJeKi4tha2uLTZs2oUePHnIfRywWY8CAAahTpw62bdv20YfE3AIRopJzkPHkLfKFJTARGMCmfnX4tDVH7WpGiv4YOic/Px+NGzdGRkYG6tWrx3UcIoN58+bh5cuXar3Onoopwqn8/HxYWloiPj6epoRpuIcPH6J9+/Y4cOAAHB0duY6jNUQiEVxdXdG9e3fMnTuX6ziE6LzIyEgsXboU//zzj1wPOBiGwdixY5GVlYVjx47BwMBACSnJf40cORLW1taYOnUq11HIZ7wsECHqSg4ynuYjXyiGiYCP+L/+xLxRvdHfy43reJ9FxRTh3MqVKxEfH4+jR49yHYXISSwWo0ePHvDy8sL06dO5jqN1nj9/jo4dO2LhwoXw8/Mr//tP3Xhs6png23b09JoQZZFKpejUqRN+/fVX+Pr6yvz9S5Yswc6dO/H333/DxMRECQnJp1y4cAHfffcdMjMz1Xa6mK5KfZiHdQlZSMx8AQAQvTe9lSkRQWBsDBdrUwQ5W8C+UQ2OUn4eFVOEcyKRCNbW1ggPD0fXrl25jkPkMHv2bJw/fx6xsbE0FU1JUlNT4ebmhmPHjsGovtVnbzxl6yrU+cZDiKY7deoUAgMDkZ6eDkNDw0p/3549ezBlyhRcuHABDRs2VGJC8l8Mw6Bly5ZYt24dXFxcuI5D/hWRdA/zozMgFEsq3GuNxyvdCiDE20btGq9QMUXUQnh4ODZs2IBz584ht7CYnrarkS+NfiQkJMDPzw8pKSk0F13JDh48iPGr9qKKkz+KJYzG3ngI0QZeXl7w9vbG+PHjKzVKfObMGfj4+ODkyZM0rZ0jK1euxOXLl7Fy41b6nKEGSgupmygqkX75i/9VuiWAenWypGKKqAWJRILWLn3QrM9PyHzLB0BP27lW0bB72evRuelXOLlmCrYsDoWHhwdHSXVHRNI9/HboGsTQr/T3qOONhxBtkJqaCs9hP8Drl5U4d+c1gM/ft7ya6OMHH0/s2rULrq6uHCUmiWn34Dd3B6pZdgSPx6PPGRxKfZiHIZuTUFQi+/5fxgb6iAx0UJuOllRMEbUQkXQPc47cQLFYClQwTYyetqtGZYfdwUihDwa/929Nr4eSadONhxBtEJF0D7MOpEKqpw/g82tweAAYsQi9zUuwNlj2NVaEHWX3taLiEoBHnzO4Fhh+GSduPqv4M8Zn8HiAh60ZNvq3Zz+YHGhxA+Fc2TBvsRQVFlIAwDBAUYkE86NvIiLpnkry6Zr/H3b/QiEFADw9SHj69HqowLqELAjFshdSACAUS7A+IYvlRITorrLrpFSPj4oKKQBgAIBvhJO5JnSd5Mj797WKCimAPmeowssCERIzX8hVSAGlr9HpWy+QWyBiN5icqJginEp9mFf6pEiG+bIAUFQixfzoDFzLyVNOMB1Fr4d60rYbDyGajK6TmoVeL/UTdSVH4WPwAEQlK34cNvC5DkB0GxtP29VlmFcb0Ouhnti88fzQrbnigQjRYXSd1Cz0eikfwzAQCoUoKiqq1J9Dj6pBJK6m0DmFYikynrxl6SdQDBVThDNsPm2n7juKo9dDfWU8zf9gobQ81OnGQ4imouukZtHV10ssFle6sGHjj0gkgqGhIYyNjSv1J7eWE2CgWDEFAPnCEhb+aymOiinCGXrarl7o9VBf+UIxS8dRjxsPIZqKrpOaRR1eL4ZhIBKJVFrcSKXSShc2//1jamoq8/cIBAKZ9picGJmCg1cfy/Xf830mAgOFj8EGKqYIZ+hpu3qh10N9mQjYuVSry42HEE1F10nNwtbrtS/+Ap6cCv+oaHn37t0XCxuhUAg+ny9XYVOlShXUrl37g/9fme8zMDAAj1dxYxQu2dQzgRH/qUKvjYCvB5v61VlMJT8qpghn6Gm7eqHXQ31p242HEE1F10nNwtbr9VYkASNgULNmTTRo0EDmokhfv/J7A+oCn3bmWBGfqdAxGAA+bc3ZCaQgKqYIZ+hpu3qh10N9aduNhxBNRddJzcLW6+XQ1h6/+wawciwC1KlmBGcrU4X2mepubao269ioNTrhTOnTdsXegvS0nT30eqivshuPvLM21O3GQ4imouukZqHXS32NdbGAgC/fiJ2Ar48gFwuWE8mPiinCGZ92ij8lp6ft7KHXQ71p042HEE1F10nNQq+X+rJvVAMh3jYwNpCtFDE20EOItw1am9dQTjA5UDFFOENP29ULvR7qTZtuPIRoKrpOahZ6vdSbv0NThHi3gLGB/hdfIx4PMDbQR4h3C/g7NFVJvsqiYopwip62qxd6PdSbttx4CNFkdJ3ULPR6qTd/h6aIDHSAh60ZjPh6EPxnWqaArwcjvh48bM0QGeiglvczHsPIu5UZIeyISLqH+dE3UVRS+U5lpU/b6UOiMtDrof6u5eRhfUIWTt96AR5KW/eWEfD1wKD0aWqQiwWNSBGiBHSd1Cz0emmG3AIRopJzkPHkLfKFJTARGMCmfnX4tDVX69FBKqaIWii90GVAKJZU2NmFxyt9UhTibUMXOCWi10MzaOqNhxBtQNdJzUKvF1EWKqaI2qCn7eqFXg9CCKkYXSc1C71eRBmomCKEEEIIIYQQOVADCkIIIYQQQgiRAxVThBBCCCGEECIHKqYIIYQQQgghRA5UTBFCCCGEEEKIHKiYIoQQQgghhBA5/B99u4BshSCCbQAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "result = Connectivity.fetch('conn_graph', order_by='conn_id')\n",
+ "\n",
+ "fig, axx = plt.subplots(1, result.size, figsize=(15, 3))\n",
+ "for g, ax in zip(result, axx.flatten()):\n",
+ " plt.sca(ax)\n",
+ " nx.draw(g)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/Alter.ipynb b/notebooks/Alter.ipynb
index a0ba0bb..a595a1d 100644
--- a/notebooks/Alter.ipynb
+++ b/notebooks/Alter.ipynb
@@ -42,18 +42,20 @@
{
"data": {
"image/svg+xml": [
- "