From 97f60f56ae01e1bcb24e971b23247dfa4332bab6 Mon Sep 17 00:00:00 2001 From: Laurent Perrinet Date: Tue, 10 Oct 2023 11:38:02 +0200 Subject: [PATCH 1/2] Add MPS as a possible computing backend These changes just add a quick test to know if the MPS device from the Apple Silicon chips is available. Was tested on tutorials with no problem. --- docs/quickstart.rst | 2 +- docs/tutorials/tutorial_5.rst | 2 +- docs/tutorials/tutorial_6.rst | 2 +- docs/tutorials/tutorial_7.rst | 2 +- docs/tutorials/tutorial_pop.rst | 2 +- docs/tutorials/tutorial_regression_1.rst | 2 +- docs/tutorials/tutorial_regression_2.rst | 2 +- docs/tutorials/tutorial_sae.rst | 2 +- .../Alpha_neuron_training_example.ipynb | 276 +-- examples/legacy/CIFAR_temp.ipynb | 1580 ++++++++--------- .../legacy/FCN_truncatedfromscratch.ipynb | 524 +++--- examples/legacy/TBPTT.ipynb | 761 ++++---- examples/legacy/tutorial_3_FCN.ipynb | 200 +-- examples/legacy/tutorial_4_CNN.ipynb | 2 +- examples/legacy/tutorial_7_tonic.ipynb | 1470 +++++++-------- examples/quickstart.ipynb | 2 +- examples/tutorial_5_FCN.ipynb | 2 +- examples/tutorial_6_CNN.ipynb | 24 +- .../tutorial_7_neuromorphic_datasets.ipynb | 17 +- examples/tutorial_pop.ipynb | 296 +-- examples/tutorial_regression_1.ipynb | 5 +- examples/tutorial_regression_2.ipynb | 3 +- examples/tutorial_sae.ipynb | 4 +- tests/test_backprop.py | 2 +- 24 files changed, 2499 insertions(+), 2685 deletions(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 738d4b49..a7b68d1c 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -49,7 +49,7 @@ Define variables for dataloading. batch_size = 128 data_path='/data/mnist' - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") Load MNIST dataset. diff --git a/docs/tutorials/tutorial_5.rst b/docs/tutorials/tutorial_5.rst index 60b3c27e..cda65e44 100644 --- a/docs/tutorials/tutorial_5.rst +++ b/docs/tutorials/tutorial_5.rst @@ -391,7 +391,7 @@ training a fully-connected spiking neural net. data_path='/data/mnist' dtype = torch.float - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") :: diff --git a/docs/tutorials/tutorial_6.rst b/docs/tutorials/tutorial_6.rst index 0ef1c7de..cdc620d5 100644 --- a/docs/tutorials/tutorial_6.rst +++ b/docs/tutorials/tutorial_6.rst @@ -194,7 +194,7 @@ here. `__ data_path='/data/mnist' dtype = torch.float - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") :: diff --git a/docs/tutorials/tutorial_7.rst b/docs/tutorials/tutorial_7.rst index abdeb21e..7ee8bea3 100644 --- a/docs/tutorials/tutorial_7.rst +++ b/docs/tutorials/tutorial_7.rst @@ -235,7 +235,7 @@ previous tutorial. The convolutional network architecture to be used is: :: - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") # neuron and simulation parameters spike_grad = surrogate.atan() diff --git a/docs/tutorials/tutorial_pop.rst b/docs/tutorials/tutorial_pop.rst index 52e05001..0cf64773 100644 --- a/docs/tutorials/tutorial_pop.rst +++ b/docs/tutorials/tutorial_pop.rst @@ -63,7 +63,7 @@ Define variables for dataloading. batch_size = 128 data_path='/data/fmnist' - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") Load FashionMNIST dataset. diff --git a/docs/tutorials/tutorial_regression_1.rst b/docs/tutorials/tutorial_regression_1.rst index c0943b55..1d1992f6 100644 --- a/docs/tutorials/tutorial_regression_1.rst +++ b/docs/tutorials/tutorial_regression_1.rst @@ -318,7 +318,7 @@ Instantiate the network below: :: hidden = 128 - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") model = Net(timesteps=num_steps, hidden=hidden).to(device) diff --git a/docs/tutorials/tutorial_regression_2.rst b/docs/tutorials/tutorial_regression_2.rst index 668f353c..b62640b2 100644 --- a/docs/tutorials/tutorial_regression_2.rst +++ b/docs/tutorials/tutorial_regression_2.rst @@ -305,7 +305,7 @@ Instantiate the network below: :: hidden = 128 - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") model = Net(timesteps=num_steps, hidden=hidden, beta=0.9).to(device) 4. Construct Training Loop diff --git a/docs/tutorials/tutorial_sae.rst b/docs/tutorials/tutorial_sae.rst index ee600ae0..5e036838 100644 --- a/docs/tutorials/tutorial_sae.rst +++ b/docs/tutorials/tutorial_sae.rst @@ -180,7 +180,7 @@ data_path='/data/mnist' dtype = torch.float - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + device = torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device("cpu") .. container:: cell code diff --git a/examples/legacy/Alpha_neuron_training_example.ipynb b/examples/legacy/Alpha_neuron_training_example.ipynb index af2e6fe1..ca71e852 100644 --- a/examples/legacy/Alpha_neuron_training_example.ipynb +++ b/examples/legacy/Alpha_neuron_training_example.ipynb @@ -1,21 +1,4 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "Alpha_code_example.ipynb", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - }, - "accelerator": "GPU" - }, "cells": [ { "cell_type": "markdown", @@ -28,6 +11,7 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -35,23 +19,15 @@ "id": "ptd12vmR7H8D", "outputId": "79499811-cc47-4470-f190-f3a8581df051" }, + "outputs": [], "source": [ "# !git clone -b alpha_neuron --single-branch https://github.com/jeshraghian/snntorch.git\n", "!pip install snntorch" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "fatal: destination path 'snntorch' already exists and is not an empty directory.\n" - ], - "name": "stdout" - } ] }, { "cell_type": "code", + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -59,19 +35,10 @@ "id": "5VNVo64L93Zo", "outputId": "69255447-8261-4119-f851-066c05ea510c" }, + "outputs": [], "source": [ "# %cd snntorch\n", "import snntorch as snn" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/content/snntorch/snntorch\n" - ], - "name": "stdout" - } ] }, { @@ -85,9 +52,11 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "AQeg7QZ69fSt" }, + "outputs": [], "source": [ "import snntorch as snn\n", "import torch\n", @@ -97,9 +66,7 @@ "import numpy as np\n", "import itertools\n", "import matplotlib.pyplot as plt" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", @@ -112,9 +79,11 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "MHmCvayV7LJR" }, + "outputs": [], "source": [ "# test alpha neuron: can it learn?\n", "\n", @@ -132,7 +101,7 @@ "beta = 0.8\n", "\n", "dtype = torch.float\n", - "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")\n", + "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"mps\") if torch.backends.mps.is_available() else torch.device(\"cpu\")\n", "\n", "# Define Network\n", "class Net(nn.Module):\n", @@ -167,9 +136,7 @@ " return torch.stack(spk2_rec, dim=0), torch.stack(mem2_rec, dim=0)\n", " \n", "net = Net().to(device)" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", @@ -182,6 +149,7 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -189,6 +157,7 @@ "id": "NblLifHj9qO-", "outputId": "e890995e-a9fd-490d-f278-caf6bce9c21e" }, + "outputs": [], "source": [ "# Define a transform\n", "transform = transforms.Compose([\n", @@ -199,31 +168,20 @@ "\n", "mnist_train = datasets.MNIST(data_path, train=True, download=True, transform=transform)\n", "mnist_test = datasets.MNIST(data_path, train=False, download=True, transform=transform)" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.7/dist-packages/torchvision/datasets/mnist.py:498: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /pytorch/torch/csrc/utils/tensor_numpy.cpp:180.)\n", - " return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)\n" - ], - "name": "stderr" - } ] }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "kx8nATF69tEk" }, + "outputs": [], "source": [ "# Create DataLoaders\n", "train_loader = DataLoader(mnist_train, batch_size=batch_size, shuffle=True, drop_last=True)\n", "test_loader = DataLoader(mnist_test, batch_size=batch_size, shuffle=True, drop_last=True)" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", @@ -236,9 +194,11 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "EJYEQpHk-MzX" }, + "outputs": [], "source": [ "def print_batch_accuracy(data, targets, train=False):\n", " with torch.no_grad():\n", @@ -258,9 +218,7 @@ " print_batch_accuracy(data_it, targets_it, train=True)\n", " print_batch_accuracy(testdata_it, testtargets_it, train=False)\n", " print(\"\\n\")" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", @@ -273,16 +231,16 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "4Uwvn33m-OuY" }, + "outputs": [], "source": [ "optimizer = torch.optim.Adam(net.parameters(), lr=2e-4, betas=(0.9, 0.999))\n", "log_softmax_fn = nn.LogSoftmax(dim=-1)\n", "loss_fn = nn.NLLLoss()" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", @@ -295,6 +253,7 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -303,6 +262,7 @@ "id": "hQvfXduS-QmB", "outputId": "7ec1f1dc-ce3f-4834-f601-9b5c34245225" }, + "outputs": [], "source": [ "loss_hist = []\n", "test_loss_hist = []\n", @@ -360,174 +320,24 @@ "\n", "loss_hist_true_grad = loss_hist\n", "test_loss_hist_true_grad = test_loss_hist" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Epoch 0, Minibatch 0\n", - "Train Set Loss: 57.23897171020508\n", - "Test Set Loss: 56.607032775878906\n", - "Train Set Accuracy: 0.1171875\n", - "Test Set Accuracy: 0.0625\n", - "\n", - "\n", - "Epoch 0, Minibatch 50\n", - "Train Set Loss: 39.31348419189453\n", - "Test Set Loss: 37.7827033996582\n", - "Train Set Accuracy: 0.3203125\n", - "Test Set Accuracy: 0.3046875\n", - "\n", - "\n", - "Epoch 0, Minibatch 100\n", - "Train Set Loss: 27.320207595825195\n", - "Test Set Loss: 26.991588592529297\n", - "Train Set Accuracy: 0.40625\n", - "Test Set Accuracy: 0.390625\n", - "\n", - "\n", - "Epoch 0, Minibatch 150\n", - "Train Set Loss: 25.243783950805664\n", - "Test Set Loss: 24.81044578552246\n", - "Train Set Accuracy: 0.390625\n", - "Test Set Accuracy: 0.296875\n", - "\n", - "\n", - "Epoch 0, Minibatch 200\n", - "Train Set Loss: 26.74785614013672\n", - "Test Set Loss: 24.078622817993164\n", - "Train Set Accuracy: 0.3359375\n", - "Test Set Accuracy: 0.390625\n", - "\n", - "\n", - "Epoch 0, Minibatch 250\n", - "Train Set Loss: 21.86463737487793\n", - "Test Set Loss: 20.568628311157227\n", - "Train Set Accuracy: 0.3515625\n", - "Test Set Accuracy: 0.3515625\n", - "\n", - "\n", - "Epoch 0, Minibatch 300\n", - "Train Set Loss: 20.57036590576172\n", - "Test Set Loss: 20.193082809448242\n", - "Train Set Accuracy: 0.3515625\n", - "Test Set Accuracy: 0.3984375\n", - "\n", - "\n", - "Epoch 0, Minibatch 350\n", - "Train Set Loss: 19.613008499145508\n", - "Test Set Loss: 21.873371124267578\n", - "Train Set Accuracy: 0.3671875\n", - "Test Set Accuracy: 0.3828125\n", - "\n", - "\n", - "Epoch 0, Minibatch 400\n", - "Train Set Loss: 18.950220108032227\n", - "Test Set Loss: 19.205629348754883\n", - "Train Set Accuracy: 0.3359375\n", - "Test Set Accuracy: 0.3359375\n", - "\n", - "\n", - "Epoch 0, Minibatch 450\n", - "Train Set Loss: 19.0748291015625\n", - "Test Set Loss: 19.952434539794922\n", - "Train Set Accuracy: 0.3515625\n", - "Test Set Accuracy: 0.234375\n", - "\n", - "\n", - "Epoch 1, Minibatch 32\n", - "Train Set Loss: 17.7125301361084\n", - "Test Set Loss: 18.93415641784668\n", - "Train Set Accuracy: 0.3515625\n", - "Test Set Accuracy: 0.34375\n", - "\n", - "\n", - "Epoch 1, Minibatch 82\n", - "Train Set Loss: 18.431243896484375\n", - "Test Set Loss: 18.173742294311523\n", - "Train Set Accuracy: 0.46875\n", - "Test Set Accuracy: 0.3203125\n", - "\n", - "\n", - "Epoch 1, Minibatch 132\n", - "Train Set Loss: 20.278743743896484\n", - "Test Set Loss: 18.996170043945312\n", - "Train Set Accuracy: 0.328125\n", - "Test Set Accuracy: 0.34375\n", - "\n", - "\n", - "Epoch 1, Minibatch 182\n", - "Train Set Loss: 17.771526336669922\n", - "Test Set Loss: 17.510616302490234\n", - "Train Set Accuracy: 0.2890625\n", - "Test Set Accuracy: 0.234375\n", - "\n", - "\n", - "Epoch 1, Minibatch 232\n", - "Train Set Loss: 16.881547927856445\n", - "Test Set Loss: 17.74418067932129\n", - "Train Set Accuracy: 0.265625\n", - "Test Set Accuracy: 0.3125\n", - "\n", - "\n", - "Epoch 1, Minibatch 282\n", - "Train Set Loss: 18.29578399658203\n", - "Test Set Loss: 18.975635528564453\n", - "Train Set Accuracy: 0.375\n", - "Test Set Accuracy: 0.265625\n", - "\n", - "\n", - "Epoch 1, Minibatch 332\n", - "Train Set Loss: 19.05307960510254\n", - "Test Set Loss: 19.7917423248291\n", - "Train Set Accuracy: 0.3203125\n", - "Test Set Accuracy: 0.25\n", - "\n", - "\n", - "Epoch 1, Minibatch 382\n", - "Train Set Loss: 16.641101837158203\n", - "Test Set Loss: 17.99464988708496\n", - "Train Set Accuracy: 0.265625\n", - "Test Set Accuracy: 0.28125\n", - "\n", - "\n", - "Epoch 1, Minibatch 432\n", - "Train Set Loss: 15.80801010131836\n", - "Test Set Loss: 16.729612350463867\n", - "Train Set Accuracy: 0.265625\n", - "Test Set Accuracy: 0.2890625\n", - "\n", - "\n", - "Epoch 2, Minibatch 14\n", - "Train Set Loss: 19.15610122680664\n", - "Test Set Loss: 16.361337661743164\n", - "Train Set Accuracy: 0.3359375\n", - "Test Set Accuracy: 0.3203125\n", - "\n", - "\n" - ], - "name": "stdout" - }, - { - "output_type": "error", - "ename": "KeyboardInterrupt", - "evalue": "ignored", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\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 33\u001b[0m \u001b[0;31m# Test set\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0mtest_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcycle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_loader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0mtestdata_it\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtesttargets_it\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_data\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 36\u001b[0m \u001b[0mtestdata_it\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtestdata_it\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0mtesttargets_it\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtesttargets_it\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 519\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sampler_iter\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 520\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reset\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;32m--> 521\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_next_data\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[0m\u001b[1;32m 522\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_num_yielded\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 523\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dataset_kind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0m_DatasetKind\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_next_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\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[1;32m 560\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_next_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# may raise StopIteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 561\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dataset_fetcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfetch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# may raise StopIteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 562\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_pin_memory\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 563\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_utils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpin_memory\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpin_memory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/fetch.py\u001b[0m in \u001b[0;36mfetch\u001b[0;34m(self, possibly_batched_index)\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfetch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpossibly_batched_index\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[1;32m 43\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_collation\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 44\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataset\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpossibly_batched_index\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 45\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataset\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpossibly_batched_index\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/fetch.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfetch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpossibly_batched_index\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[1;32m 43\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_collation\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 44\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataset\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpossibly_batched_index\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 45\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataset\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpossibly_batched_index\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/torchvision/datasets/mnist.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, index)\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 134\u001b[0;31m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\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 135\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtarget_transform\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/torchvision/transforms/transforms.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, img)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mimg\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[1;32m 59\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransforms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 60\u001b[0;31m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\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 61\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mimg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 1044\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1045\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_call_impl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\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;32m-> 1046\u001b[0;31m \u001b[0mforward_call\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_C\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tracing_state\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\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 1047\u001b[0m \u001b[0;31m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1048\u001b[0m \u001b[0;31m# this function, and just call forward.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } ] } - ] -} \ No newline at end of file + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "Alpha_code_example.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/examples/legacy/CIFAR_temp.ipynb b/examples/legacy/CIFAR_temp.ipynb index 4d78073b..1a7ffd84 100644 --- a/examples/legacy/CIFAR_temp.ipynb +++ b/examples/legacy/CIFAR_temp.ipynb @@ -1,571 +1,296 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "kernelspec": { - "name": "python3", - "language": "python", - "display_name": "Python 3" + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "id": "rtrNT4NPRp7r", + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "\n", + "\n", + "# snnTorch - Gradient-based Learning in Spiking Neural Networks\n", + "## Tutorial 2\n", + "### By Jason K. Eshraghian\n", + "\n", + "\n", + " \"Open\n", + "" + ] }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "id": "TKy-qDQdRp73" }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "source": [ + "# Introduction\n", + "In this tutorial, you will learn how to use snnTorch to:\n", + "* create a 2-layer fully-connected spiking network;\n", + "* implement the backpropagation through time (BPTT) algorithm;\n", + "* to classify both the static and spiking MNIST datasets.\n", + "\n", + "If running in Google Colab:\n", + "* You may connect to GPU by checking `Runtime` > `Change runtime type` > `Hardware accelerator: GPU`\n", + "* Next, install the latest PyPi distribution of snnTorch by clicking into the following cell and pressing `Shift+Enter`." + ] }, - "colab": { - "name": "tutorial_2_FCN.ipynb", - "provenance": [] + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "id": "BgBRVUtpRp74", + "outputId": "61c32ebb-e69b-4d44-852b-0bf58481a9d1", + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: snntorch in /usr/local/lib/python3.7/dist-packages (0.2.7)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from snntorch) (1.1.5)\n", + "Requirement already satisfied: torch>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from snntorch) (1.8.0+cu101)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from snntorch) (3.2.2)\n", + "Requirement already satisfied: celluloid in /usr/local/lib/python3.7/dist-packages (from snntorch) (0.2.0)\n", + "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.7/dist-packages (from snntorch) (1.19.5)\n", + "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->snntorch) (2018.9)\n", + "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->snntorch) (2.8.1)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch>=1.2.0->snntorch) (3.7.4.3)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->snntorch) (1.3.1)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->snntorch) (0.10.0)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->snntorch) (2.4.7)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->snntorch) (1.15.0)\n" + ] + } + ], + "source": [ + "!pip install snntorch" + ] }, - "accelerator": "GPU", - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "feb965fc6abb4ee9bc9dbb5ef3b9723c": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "state": { - "_view_name": "HBoxView", - "_dom_classes": [], - "_model_name": "HBoxModel", - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.5.0", - "box_style": "", - "layout": "IPY_MODEL_1a99d740897c4ea09c6f33ce3a4a3230", - "_model_module": "@jupyter-widgets/controls", - "children": [ - "IPY_MODEL_82d6d6dfb0c845ec99c25f57e6c5d9d2", - "IPY_MODEL_c03ab1b2c81149feb0c1551831a6a909" + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "id": "Zm-D2lthRp75", + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 1. Setting up the Static MNIST Dataset\n", + "### 1.1. Import packages and setup environment" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "sEygpdc8Rp76", + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import snntorch as snn\n", + "import torch\n", + "import torch.nn as nn\n", + "from torch.utils.data import DataLoader\n", + "from torchvision import datasets, transforms\n", + "import numpy as np\n", + "import itertools\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "id": "RcX7J9vVRp76" + }, + "source": [ + "### 1.2 Define network and SNN parameters\n", + "We will use a 784-1000-10 FCN architecture for a sequence of 25 time steps.\n", + "\n", + "* `alpha` is the decay rate of the synaptic current of a neuron\n", + "* `beta` is the decay rate of the membrane potential of a neuron" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "bKEj2hucRp77", + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Network Architecture\n", + "num_inputs = 32*32\n", + "num_hidden = 1000\n", + "num_outputs = 10\n", + "\n", + "# Training Parameters\n", + "batch_size=128\n", + "data_path='/data/mnist'\n", + "\n", + "# Temporal Dynamics\n", + "num_steps = 25\n", + "time_step = 1e-3\n", + "tau_mem = 3e-3\n", + "tau_syn = 2.2e-3\n", + "alpha = float(np.exp(-time_step/tau_syn))\n", + "beta = float(np.exp(-time_step/tau_mem))\n", + "\n", + "dtype = torch.float\n", + "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device("mps") if torch.backends.mps.is_available() else torch.device(\"cpu\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "agBKaYiIQxbS" + }, + "outputs": [], + "source": [ + "alpha = 0.8\n", + "beta = 0.9" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "id": "gM_hcwDIRp78", + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### 1.3 Download MNIST Dataset\n", + "To see how to construct a validation set, refer to Tutorial 1." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 120, + "referenced_widgets": [ + "feb965fc6abb4ee9bc9dbb5ef3b9723c", + "1a99d740897c4ea09c6f33ce3a4a3230", + "82d6d6dfb0c845ec99c25f57e6c5d9d2", + "c03ab1b2c81149feb0c1551831a6a909", + "f74b5621630e458aa55562f4ae2f36f8", + "f999b8f0ade1483c83e5c2f047bad551", + "e2f3ff56de4e424bb8e2f09a9976bf5b", + "fe66ac83ad074efbbc802309b16e08a3" + ] + }, + "id": "0xwYb15xRp79", + "outputId": "fd8cb868-a8c3-45a1-a43a-4aad7992884a", + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to /data/mnist/cifar-10-python.tar.gz\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "feb965fc6abb4ee9bc9dbb5ef3b9723c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=170498071.0), HTML(value='')))" ] - } + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" }, - "1a99d740897c4ea09c6f33ce3a4a3230": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - }, - "82d6d6dfb0c845ec99c25f57e6c5d9d2": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "state": { - "_view_name": "ProgressView", - "style": "IPY_MODEL_f74b5621630e458aa55562f4ae2f36f8", - "_dom_classes": [], - "description": "", - "_model_name": "FloatProgressModel", - "bar_style": "success", - "max": 170498071, - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "value": 170498071, - "_view_count": null, - "_view_module_version": "1.5.0", - "orientation": "horizontal", - "min": 0, - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_f999b8f0ade1483c83e5c2f047bad551" - } - }, - "c03ab1b2c81149feb0c1551831a6a909": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "state": { - "_view_name": "HTMLView", - "style": "IPY_MODEL_e2f3ff56de4e424bb8e2f09a9976bf5b", - "_dom_classes": [], - "description": "", - "_model_name": "HTMLModel", - "placeholder": "​", - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "value": " 170499072/? [03:00<00:00, 946963.10it/s]", - "_view_count": null, - "_view_module_version": "1.5.0", - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_fe66ac83ad074efbbc802309b16e08a3" - } - }, - "f74b5621630e458aa55562f4ae2f36f8": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "state": { - "_view_name": "StyleView", - "_model_name": "ProgressStyleModel", - "description_width": "initial", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "bar_color": null, - "_model_module": "@jupyter-widgets/controls" - } - }, - "f999b8f0ade1483c83e5c2f047bad551": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - }, - "e2f3ff56de4e424bb8e2f09a9976bf5b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "state": { - "_view_name": "StyleView", - "_model_name": "DescriptionStyleModel", - "description_width": "", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "_model_module": "@jupyter-widgets/controls" - } - }, - "fe66ac83ad074efbbc802309b16e08a3": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Extracting /data/mnist/cifar-10-python.tar.gz to /data/mnist\n", + "Files already downloaded and verified\n" + ] } - } - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - }, - "id": "rtrNT4NPRp7r" - }, + ], "source": [ - "\n", - "\n", - "# snnTorch - Gradient-based Learning in Spiking Neural Networks\n", - "## Tutorial 2\n", - "### By Jason K. Eshraghian\n", + "# Define a transform\n", + "transform = transforms.Compose([\n", + " transforms.Grayscale(),\n", + " transforms.Resize((32, 32)),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0,), (1,))])\n", "\n", - "\n", - " \"Open\n", - "" + "mnist_train = datasets.CIFAR10(data_path, train=True, download=True, transform=transform)\n", + "mnist_test = datasets.CIFAR10(data_path, train=False, download=True, transform=transform)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, - "id": "TKy-qDQdRp73" + "id": "DIg3vLmURp7-", + "pycharm": { + "name": "#%% md\n" + } }, "source": [ - "# Introduction\n", - "In this tutorial, you will learn how to use snnTorch to:\n", - "* create a 2-layer fully-connected spiking network;\n", - "* implement the backpropagation through time (BPTT) algorithm;\n", - "* to classify both the static and spiking MNIST datasets.\n", - "\n", - "If running in Google Colab:\n", - "* You may connect to GPU by checking `Runtime` > `Change runtime type` > `Hardware accelerator: GPU`\n", - "* Next, install the latest PyPi distribution of snnTorch by clicking into the following cell and pressing `Shift+Enter`." + "### 1.4 Create DataLoaders" ] }, { "cell_type": "code", + "execution_count": 8, "metadata": { + "id": "K4DF-odMRp7_", "pycharm": { "name": "#%%\n" - }, - "id": "BgBRVUtpRp74", - "outputId": "61c32ebb-e69b-4d44-852b-0bf58481a9d1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 0 - } - }, - "source": [ - "!pip install snntorch" - ], - "execution_count": 5, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Requirement already satisfied: snntorch in /usr/local/lib/python3.7/dist-packages (0.2.7)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from snntorch) (1.1.5)\n", - "Requirement already satisfied: torch>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from snntorch) (1.8.0+cu101)\n", - "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from snntorch) (3.2.2)\n", - "Requirement already satisfied: celluloid in /usr/local/lib/python3.7/dist-packages (from snntorch) (0.2.0)\n", - "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.7/dist-packages (from snntorch) (1.19.5)\n", - "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->snntorch) (2018.9)\n", - "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->snntorch) (2.8.1)\n", - "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch>=1.2.0->snntorch) (3.7.4.3)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->snntorch) (1.3.1)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->snntorch) (0.10.0)\n", - "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->snntorch) (2.4.7)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->snntorch) (1.15.0)\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - }, - "id": "Zm-D2lthRp75" - }, - "source": [ - "## 1. Setting up the Static MNIST Dataset\n", - "### 1.1. Import packages and setup environment" - ] - }, - { - "cell_type": "code", - "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "sEygpdc8Rp76" - }, - "source": [ - "import snntorch as snn\n", - "import torch\n", - "import torch.nn as nn\n", - "from torch.utils.data import DataLoader\n", - "from torchvision import datasets, transforms\n", - "import numpy as np\n", - "import itertools\n", - "import matplotlib.pyplot as plt" - ], - "execution_count": 6, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false, - "id": "RcX7J9vVRp76" - }, - "source": [ - "### 1.2 Define network and SNN parameters\n", - "We will use a 784-1000-10 FCN architecture for a sequence of 25 time steps.\n", - "\n", - "* `alpha` is the decay rate of the synaptic current of a neuron\n", - "* `beta` is the decay rate of the membrane potential of a neuron" - ] - }, - { - "cell_type": "code", - "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "bKEj2hucRp77" - }, - "source": [ - "# Network Architecture\n", - "num_inputs = 32*32\n", - "num_hidden = 1000\n", - "num_outputs = 10\n", - "\n", - "# Training Parameters\n", - "batch_size=128\n", - "data_path='/data/mnist'\n", - "\n", - "# Temporal Dynamics\n", - "num_steps = 25\n", - "time_step = 1e-3\n", - "tau_mem = 3e-3\n", - "tau_syn = 2.2e-3\n", - "alpha = float(np.exp(-time_step/tau_syn))\n", - "beta = float(np.exp(-time_step/tau_mem))\n", - "\n", - "dtype = torch.float\n", - "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")" - ], - "execution_count": 9, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "agBKaYiIQxbS" - }, - "source": [ - "alpha = 0.8\r\n", - "beta = 0.9" - ], - "execution_count": 17, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - }, - "id": "gM_hcwDIRp78" - }, - "source": [ - "### 1.3 Download MNIST Dataset\n", - "To see how to construct a validation set, refer to Tutorial 1." - ] - }, - { - "cell_type": "code", - "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "0xwYb15xRp79", - "outputId": "fd8cb868-a8c3-45a1-a43a-4aad7992884a", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 120, - "referenced_widgets": [ - "feb965fc6abb4ee9bc9dbb5ef3b9723c", - "1a99d740897c4ea09c6f33ce3a4a3230", - "82d6d6dfb0c845ec99c25f57e6c5d9d2", - "c03ab1b2c81149feb0c1551831a6a909", - "f74b5621630e458aa55562f4ae2f36f8", - "f999b8f0ade1483c83e5c2f047bad551", - "e2f3ff56de4e424bb8e2f09a9976bf5b", - "fe66ac83ad074efbbc802309b16e08a3" - ] - } - }, - "source": [ - "# Define a transform\n", - "transform = transforms.Compose([\n", - " transforms.Grayscale(),\n", - " transforms.Resize((32, 32)),\n", - " transforms.ToTensor(),\n", - " transforms.Normalize((0,), (1,))])\n", - "\n", - "mnist_train = datasets.CIFAR10(data_path, train=True, download=True, transform=transform)\n", - "mnist_test = datasets.CIFAR10(data_path, train=False, download=True, transform=transform)" - ], - "execution_count": 7, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to /data/mnist/cifar-10-python.tar.gz\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "feb965fc6abb4ee9bc9dbb5ef3b9723c", - "version_minor": 0, - "version_major": 2 - }, - "text/plain": [ - "HBox(children=(FloatProgress(value=0.0, max=170498071.0), HTML(value='')))" - ] - }, - "metadata": { - "tags": [] - } - }, - { - "output_type": "stream", - "text": [ - "\n", - "Extracting /data/mnist/cifar-10-python.tar.gz to /data/mnist\n", - "Files already downloaded and verified\n" - ], - "name": "stdout" } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - }, - "id": "DIg3vLmURp7-" - }, - "source": [ - "### 1.4 Create DataLoaders" - ] - }, - { - "cell_type": "code", - "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "K4DF-odMRp7_" }, + "outputs": [], "source": [ "train_loader = DataLoader(mnist_train, batch_size=batch_size, shuffle=True, drop_last=True)\n", "test_loader = DataLoader(mnist_test, batch_size=batch_size, shuffle=True, drop_last=True)" - ], - "execution_count": 8, - "outputs": [] + ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "pD4Dw-RoRp7_", "pycharm": { "name": "#%% md\n" - }, - "id": "pD4Dw-RoRp7_" + } }, "source": [ "## 2. Define Network\n", @@ -582,29 +307,29 @@ }, { "cell_type": "code", + "execution_count": 10, "metadata": { + "id": "Sf9RdE9jRp8A", "pycharm": { "name": "#%%\n" - }, - "id": "Sf9RdE9jRp8A" + } }, + "outputs": [], "source": [ "# from snntorch import surrogate\n", "#\n", "# spike_grad = surrogate.FastSigmoid.apply\n", "# snn.slope = 50" - ], - "execution_count": 10, - "outputs": [] + ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "Og9e57W0Rp8B", "pycharm": { "name": "#%% md\n" - }, - "id": "Og9e57W0Rp8B" + } }, "source": [ "The surrogate is passed to `spike_grad` and overrides the default gradient of the Heaviside step function.\n", @@ -619,10 +344,10 @@ "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "Yo-x48mARp8C", "pycharm": { "name": "#%% md\n" - }, - "id": "Yo-x48mARp8C" + } }, "source": [ "Now we can define our spiking neural network (SNN).\n", @@ -646,12 +371,14 @@ }, { "cell_type": "code", + "execution_count": 18, "metadata": { + "id": "P6RHCnXMRp8D", "pycharm": { "name": "#%%\n" - }, - "id": "P6RHCnXMRp8D" + } }, + "outputs": [], "source": [ "# Define Network\n", "class Net(nn.Module):\n", @@ -683,18 +410,16 @@ " return torch.stack(spk2_rec, dim=0), torch.stack(mem2_rec, dim=0)\n", "\n", "net = Net().to(device)" - ], - "execution_count": 18, - "outputs": [] + ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "386KNHG7Rp8E", "pycharm": { "name": "#%% md\n" - }, - "id": "386KNHG7Rp8E" + } }, "source": [ "## 3. Training\n", @@ -703,12 +428,14 @@ }, { "cell_type": "code", + "execution_count": 19, "metadata": { + "id": "cOKKbUnDRp8F", "pycharm": { "name": "#%%\n" - }, - "id": "cOKKbUnDRp8F" + } }, + "outputs": [], "source": [ "def print_batch_accuracy(data, targets, train=False):\n", " output, _ = net(data.view(batch_size, -1))\n", @@ -727,18 +454,16 @@ " print_batch_accuracy(data_it, targets_it, train=True)\n", " print_batch_accuracy(testdata_it, testtargets_it, train=False)\n", " print(\"\\n\")" - ], - "execution_count": 19, - "outputs": [] + ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "mZqfCe0KRp8J", "pycharm": { "name": "#%% md\n" - }, - "id": "mZqfCe0KRp8J" + } }, "source": [ "### 3.1 Optimizer & Loss\n", @@ -752,28 +477,28 @@ }, { "cell_type": "code", + "execution_count": 20, "metadata": { + "id": "UMZ-4uGlRp8K", "pycharm": { "name": "#%%\n" - }, - "id": "UMZ-4uGlRp8K" + } }, + "outputs": [], "source": [ "optimizer = torch.optim.Adam(net.parameters(), lr=2e-4, betas=(0.9, 0.999))\n", "log_softmax_fn = nn.LogSoftmax(dim=-1)\n", "loss_fn = nn.NLLLoss()" - ], - "execution_count": 20, - "outputs": [] + ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "UerqLkd1Rp8K", "pycharm": { "name": "#%% md\n" - }, - "id": "UerqLkd1Rp8K" + } }, "source": [ "### 3.2 Training Loop\n", @@ -782,78 +507,21 @@ }, { "cell_type": "code", + "execution_count": 21, "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "76CEHI2xRp8L", - "outputId": "e29c7e0e-4504-4d08-fdcf-70ab371b0996", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 - } - }, - "source": [ - "loss_hist = []\n", - "test_loss_hist = []\n", - "counter = 0\n", - "\n", - "# Outer training loop\n", - "for epoch in range(3):\n", - " minibatch_counter = 0\n", - " train_batch = iter(train_loader)\n", - "\n", - " # Minibatch training loop\n", - " for data_it, targets_it in train_batch:\n", - " data_it = data_it.to(device)\n", - " targets_it = targets_it.to(device)\n", - "\n", - " output, mem_rec = net(data_it.view(batch_size, -1))\n", - " log_p_y = log_softmax_fn(mem_rec)\n", - " loss_val = torch.zeros((1), dtype=dtype, device=device)\n", - "\n", - " # Sum loss over time steps: BPTT\n", - " for step in range(num_steps):\n", - " loss_val += loss_fn(log_p_y[step], targets_it)\n", - "\n", - " # Gradient calculation\n", - " optimizer.zero_grad()\n", - " loss_val.backward(retain_graph=True)\n", - "\n", - " # Weight Update\n", - " nn.utils.clip_grad_norm_(net.parameters(), 1) # gradient clipping\n", - " optimizer.step()\n", - "\n", - " # Store loss history for future plotting\n", - " loss_hist.append(loss_val.item())\n", - "\n", - " # Test set\n", - " test_data = itertools.cycle(test_loader)\n", - " testdata_it, testtargets_it = next(test_data)\n", - " testdata_it = testdata_it.to(device)\n", - " testtargets_it = testtargets_it.to(device)\n", - "\n", - " # Test set forward pass\n", - " test_output, test_mem_rec = net(testdata_it.view(batch_size, -1))\n", - "\n", - " # Test set loss\n", - " log_p_ytest = log_softmax_fn(test_mem_rec)\n", - " log_p_ytest = log_p_ytest.sum(dim=0)\n", - " loss_val_test = loss_fn(log_p_ytest, testtargets_it)\n", - " test_loss_hist.append(loss_val_test.item())\n", - "\n", - " # Print test/train loss/accuracy\n", - " if counter % 50 == 0:\n", - " train_printer()\n", - " minibatch_counter += 1\n", - " counter += 1\n", - "\n", - "loss_hist_true_grad = loss_hist\n", - "test_loss_hist_true_grad = test_loss_hist" - ], - "execution_count": 21, + }, + "id": "76CEHI2xRp8L", + "outputId": "e29c7e0e-4504-4d08-fdcf-70ab371b0996", + "pycharm": { + "name": "#%%\n" + } + }, "outputs": [ { + "name": "stdout", "output_type": "stream", "text": [ "Epoch 2, Minibatch 70\n", @@ -905,13 +573,12 @@ "Test Set Accuracy: 0.34375\n", "\n", "\n" - ], - "name": "stdout" + ] }, { - "output_type": "error", "ename": "KeyboardInterrupt", "evalue": "ignored", + "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", @@ -921,16 +588,74 @@ "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } + ], + "source": [ + "loss_hist = []\n", + "test_loss_hist = []\n", + "counter = 0\n", + "\n", + "# Outer training loop\n", + "for epoch in range(3):\n", + " minibatch_counter = 0\n", + " train_batch = iter(train_loader)\n", + "\n", + " # Minibatch training loop\n", + " for data_it, targets_it in train_batch:\n", + " data_it = data_it.to(device)\n", + " targets_it = targets_it.to(device)\n", + "\n", + " output, mem_rec = net(data_it.view(batch_size, -1))\n", + " log_p_y = log_softmax_fn(mem_rec)\n", + " loss_val = torch.zeros((1), dtype=dtype, device=device)\n", + "\n", + " # Sum loss over time steps: BPTT\n", + " for step in range(num_steps):\n", + " loss_val += loss_fn(log_p_y[step], targets_it)\n", + "\n", + " # Gradient calculation\n", + " optimizer.zero_grad()\n", + " loss_val.backward(retain_graph=True)\n", + "\n", + " # Weight Update\n", + " nn.utils.clip_grad_norm_(net.parameters(), 1) # gradient clipping\n", + " optimizer.step()\n", + "\n", + " # Store loss history for future plotting\n", + " loss_hist.append(loss_val.item())\n", + "\n", + " # Test set\n", + " test_data = itertools.cycle(test_loader)\n", + " testdata_it, testtargets_it = next(test_data)\n", + " testdata_it = testdata_it.to(device)\n", + " testtargets_it = testtargets_it.to(device)\n", + "\n", + " # Test set forward pass\n", + " test_output, test_mem_rec = net(testdata_it.view(batch_size, -1))\n", + "\n", + " # Test set loss\n", + " log_p_ytest = log_softmax_fn(test_mem_rec)\n", + " log_p_ytest = log_p_ytest.sum(dim=0)\n", + " loss_val_test = loss_fn(log_p_ytest, testtargets_it)\n", + " test_loss_hist.append(loss_val_test.item())\n", + "\n", + " # Print test/train loss/accuracy\n", + " if counter % 50 == 0:\n", + " train_printer()\n", + " minibatch_counter += 1\n", + " counter += 1\n", + "\n", + "loss_hist_true_grad = loss_hist\n", + "test_loss_hist_true_grad = test_loss_hist" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "fdOuwCWHRp8L", "pycharm": { "name": "#%% md\n" - }, - "id": "fdOuwCWHRp8L" + } }, "source": [ "## 4. Results\n", @@ -939,51 +664,51 @@ }, { "cell_type": "code", + "execution_count": 14, "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "WJGSBq6zRp8M", - "outputId": "9c224143-2579-4708-88a8-e645e32ce289", "colab": { "base_uri": "https://localhost:8080/", "height": 334 + }, + "id": "WJGSBq6zRp8M", + "outputId": "9c224143-2579-4708-88a8-e645e32ce289", + "pycharm": { + "name": "#%%\n" } }, - "source": [ - "# Plot Loss\n", - "fig = plt.figure(facecolor=\"w\", figsize=(10, 5))\n", - "plt.plot(loss_hist)\n", - "plt.plot(test_loss_hist)\n", - "plt.legend([\"Test Loss\", \"Train Loss\"])\n", - "plt.xlabel(\"Epoch\")\n", - "plt.ylabel(\"Loss\")\n", - "plt.show()" - ], - "execution_count": 14, "outputs": [ { - "output_type": "display_data", "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAE9CAYAAADaqWzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOydeZgU1fm2n6rq7hlWFURFMCJGI4gIEcF9/VQU9xB/xiW472LUSDQGQ4yJJEZUUEGigsEVURZZ3EBkFRxg2Pd9gBmGgdmnp7ur6vuj6lSdqjrVXd0zPTPAe18XFz1d26mlz3nq3Y6k67oOgiAIgiAIIuvIjd0AgiAIgiCIwwUSXgRBEARBEA0ECS+CIAiCIIgGgoQXQRAEQRBEA0HCiyAIgiAIooEg4UUQBEEQBNFAhBq7AUE4+uij0alTp8ZuBkEQBEEQREq2bduGffv2CZcdFMKrU6dOyMvLa+xmEARBEARBpKRXr16+y8jVSBAEQRAE0UCQ8CIIgiAIgmggSHgRBEEQBEE0EAdFjBdBEARBEHUnHo+joKAA0Wi0sZtySJCbm4uOHTsiHA4H3oaEF0EQBEEcJhQUFKBVq1bo1KkTJElq7OYc1Oi6jpKSEhQUFOCkk04KvB25GgmCIAjiMCEajaJt27YkuuoBSZLQtm3btK2HJLwIgiAI4jCCRFf9kcm1JFcjQRAEQRANQklJCS6//HIAQGFhIRRFQbt27QAAixcvRiQSSbr97NmzEYlEcN5553mWjR07Fnl5eXjzzTfrv+H1CAkvgiAIgiAahLZt2yI/Px8AMGTIELRs2RJ//OMfA28/e/ZstGzZUii8DhbI1QhgfWEFPl60A7GE1thNIQiCIIjDiiVLluDiiy/GWWedhauuugp79uwBAAwfPhxdu3ZF9+7dceutt2Lbtm0YNWoUXnvtNfTo0QNz584NtP9hw4ahW7du6NatG15//XUAQFVVFfr164czzzwT3bp1w2effQYAePbZZ61jpiMI04EsXgDmb9qHF6euQb8z2iMSIi1KEARBEA2Brut4/PHHMXnyZLRr1w6fffYZnn/+ebz//vsYOnQotm7dipycHJSWluLII4/EQw89lJaVbMmSJRgzZgwWLVoEXdfRp08fXHzxxdiyZQuOP/54TJs2DQBQVlaGkpISTJw4EevWrYMkSSgtLc3KOZPwAqDIRnBcQiOLF0EQBHF48LevVmPN7vJ63WfX41vjr9edHnj92tparFq1CldccQUAQFVVtG/fHgDQvXt33H777bjxxhtx4403ZtSeefPm4aabbkKLFi0AADfffDPmzp2Lvn374umnn8af/vQnXHvttbjwwguRSCSQm5uLe++9F9deey2uvfbajI6ZCjLvwBZeqq43cksIgiAI4vBB13WcfvrpyM/PR35+PlauXIlvv/0WADBt2jQ8+uijWLp0Kc4++2wkEol6O+6pp56KpUuX4owzzsBf/vIXvPjiiwiFQli8eDH69++PqVOnom/fvvV2PB6yeIETXhoJL4IgCOLwIB3LVLbIyclBcXExFi5ciHPPPRfxeBwbNmxAly5dsHPnTlx66aW44IIL8Omnn6KyshKtWrVCeXlwK92FF16Iu+66C88++yx0XcfEiRMxbtw47N69G23atMEdd9yBI488Eu+++y4qKytRXV2Na665Bueffz46d+6clXMm4QXO1aiS8CIIgiCIhkKWZUyYMAEDBw5EWVkZEokE/vCHP+DUU0/FHXfcgbKyMui6joEDB+LII4/Eddddh/79+2Py5MkYMWIELrzwQsf+xo4di0mTJll///TTT7jrrrvQu3dvAMB9992Hnj174ptvvsEzzzwDWZYRDocxcuRIVFRU4IYbbkA0GoWu6xg2bFhWzlnS9abvX+vVqxfy8vKytv8vlxbgqfHL8eMzl+DEti2ydhyCIAiCaEzWrl2LLl26NHYzDilE1zSZbqEYL/DB9U1egxIEQRAEcRBDwgu28NJIeBEEQRAEkUVIeAEIkcWLIAiCIIgGgIQXAFmirEaCIAiCILIPCS8AIYWEF0EQBEEQ2YeEFwBFNi4DuRoJgiAIgsgmJLwAKORqJAiCIIisU1JSgh49eqBHjx447rjj0KFDB+vvWCyWdNu8vDwMHDgwreN16tQJ+/btq0uT6x0qoAqqXE8QBEEQDUHbtm2Rn58PABgyZIhnwutEIoFQSCxNevXqhV69ejVIO7MJWbxAwosgCIIgGou77roLDz30EPr06YNBgwZh8eLFOPfcc9GzZ0+cd955WL9+PQBg9uzZ1sTVQ4YMwT333INLLrkEnTt3xvDhwwMfb9u2bbjsssvQvXt3XH755dixYwcA4PPPP0e3bt1w5pln4qKLLgIArF69Gr1790aPHj3QvXt3bNy4sc7nSxYv8AVUtUZuCUEQBEEcfhQUFGDBggVQFAXl5eWYO3cuQqEQvv/+e/z5z3/GF1984dlm3bp1+OGHH1BRUYFf/epXePjhhxEOh1Me6/HHH8eAAQMwYMAAvP/++xg4cCAmTZqEF198Ed988w06dOiA0tJSAMCoUaPwxBNP4Pbbb0csFoOqqnU+VxJesOt4aU1/9iSCIAiCqB9mPAsUrqzffR53BnD10LQ3++1vfwtFUQAAZWVlGDBgADZu3AhJkhCPx4Xb9OvXDzk5OcjJycExxxyDoqIidOzYMeWxFi5ciC+//BIAcOedd2LQoEEAgPPPPx933XUXbrnlFtx8880AgHPPPRf/+Mc/UFBQgJtvvhmnnHJK2ufmhlyNoEmyCYIgCKIxadHCnid58ODBuPTSS7Fq1Sp89dVXiEajwm1ycnKsz4qiIJFI1KkNo0aNwksvvYSdO3firLPOQklJCW677TZMmTIFzZo1wzXXXINZs2bV6RgAWbwAcFMGkcWLIAiCOFzIwDLVEJSVlaFDhw4AgLFjx9b7/s877zx8+umnuPPOO/HRRx/hwgsvBABs3rwZffr0QZ8+fTBjxgzs3LkTZWVl6Ny5MwYOHIgdO3ZgxYoVuOyyy+p0fLJ4gaYMIgiCIIimwqBBg/Dcc8+hZ8+edbZiAUD37t3RsWNHdOzYEU899RRGjBiBMWPGoHv37hg3bhzeeOMNAMAzzzyDM844A926dcN5552HM888E+PHj0e3bt3Qo0cPrFq1Cr///e/r3B5J15u+madXr17Iy8vL2v43F1fi8ld/xBu39sANPTpk7TgEQRAE0ZisXbsWXbp0aexmHFKIrmky3UIWL9gWLyonQRAEQRBENsmq8CotLUX//v1x2mmnoUuXLli4cCGGDBniqFQ7ffr0bDYhEAq5GgmCIAiCaACyGlz/xBNPoG/fvpgwYQJisRiqq6vxzTff4Mknn3RUqm1sqIAqQRAEQRANQdaEV1lZGebMmWNlJEQiEUQikWwdrk6Q8CIIgiAOF3Rdh2TOUUzUjUzC5LPmaty6dSvatWuHu+++Gz179sR9992HqqoqAMCbb76J7t2745577sGBAwey1YTA0CTZBEEQxOFAbm4uSkpKMhIMhBNd11FSUoLc3Ny0tsuaxSuRSGDp0qUYMWIE+vTpgyeeeAJDhw7FY489hsGDB0OSJAwePBhPP/003n//fc/2o0ePxujRowEAxcXF2WomACAkG/qThBdBEARxKNOxY0cUFBRkfVw9XMjNzQ1ULZ8na8KL1czo06cPAKB///4YOnQojj32WGud+++/35rw0s0DDzyABx54AACyPhu5opDFiyAIgjj0CYfDOOmkkxq7GYc1WXM1HnfccTjhhBOsWcVnzpyJrl27Ys+ePdY6EydORLdu3bLVhMAwVyNlNRIEQRAEkU2ymtU4YsQIa0bvzp07Y8yYMRg4cCDy8/MhSRI6deqEd955J5tNCAQLrq+qrXuFXIIgCIIgCD+yKrx69Ojhqdw6bty4bB4yI1gB1Td/2IQ/XvWrRm4NQRAEQRCHKlS5HoAsS+jcroVl+SIIgiAIgsgGJLxMLj61HZpHlMZuBkEQBEEQhzAkvEwkSKCyJgRBEARBZBMSXiaylFkFWoIgCIIgiKCQ8DKRJICqSRAEQRAEkU1IeJnIkgQdpLwIgiAIgsgeJLwYZPEiCIIgCCLLkPAykSCBDF4EQRAEQWQTEl4msgRyNRIEQRAEkVVIeJlQcD1BEARBENmGhJeJLElUToIgCIIgiKxCwstEAlm8CIIgCILILiS8GBLN00gQBEEQRHYh4WXC5scmdyNBEARBENmChJeJBEN5kbuRIAiCIIhsQcLLhCxeBEEQBEFkGxJeJizEiyxeBEEQBEFkCxJeJpKpvKiIKkEQBEEQ2YKEl4lkuRobtx0EQRAEQRy6kPAyYcH1JLwIgiAIgsgWJLxMrOB6cjUSBEEQBJElSHiZUHA9QRAEQRDZhoSXie1qJOVFEARBEER2IOFlYgXXN24zCIIgCII4hCHhZWKVk9AauSEEQRAEQRyykPACAE1FWKuFEVpPNi+CIAiCILIDCS8AWDQKv5/VB61QQ8H1BEEQBEFkDRJeACCHAAAKVAquJwiCIAgia5DwAgBZAQDk5z5IFi+CIAiCILIGCS/AsngBVECVIAiCIIjsQcILAOSw/Zl0F0EQBEEQWYKEF+CweJGrkSAIgiCIbEHCC7BivAByNRIEQRAEkT1IeAFk8SIIgiAIokEg4QUAih3jReUkCIIgCILIFiS8AGdWI+kugiAIgiCyBAkvwBnjRcKLIAiCIIgsQcILcJSToOB6giAIgiCyBQkvgILrCYIgCIJoEEh4AQ7htbGwHAM/WYa4qjVigwiCIAiCOBQh4QU4hNeVE07DuhWLsKKgrBEbRBAEQRDEoQgJLwBQQo4//5+8FNG42kiNIQiCIAjiUIWEF+CweAGADA3VMRJeBEEQBEHULyS8AI/wUqChIhpvpMYQBEEQBHGoQsIL8Fq8JA0Hqkl4EQRBEARRv5DwAgSuRh2l1bFGagxBEARBEIcqWRVepaWl6N+/P0477TR06dIFCxcuxP79+3HFFVfglFNOwRVXXIEDBw5kswnBELgaaxNUToIgCIIgiPolq8LriSeeQN++fbFu3TosX74cXbp0wdChQ3H55Zdj48aNuPzyyzF06NBsNiEYguB6lSqpEgRBEARRz2RNeJWVlWHOnDm49957AQCRSARHHnkkJk+ejAEDBgAABgwYgEmTJmWrCcFRws4/SXgRBEEQBJEFsia8tm7dinbt2uHuu+9Gz549cd9996GqqgpFRUVo3749AOC4445DUVFRtpoQHG6SbMCI8dJotmyCIAiCIOqZrAmvRCKBpUuX4uGHH8ayZcvQokULj1tRkiRIkiTcfvTo0ejVqxd69eqF4uLibDXTgFyNBEEQBEE0AFkTXh07dkTHjh3Rp08fAED//v2xdOlSHHvssdizZw8AYM+ePTjmmGOE2z/wwAPIy8tDXl4e2rVrl61mGgiC60l3EQRBEARR32RNeB133HE44YQTsH79egDAzJkz0bVrV1x//fX44IMPAAAffPABbrjhhmw1ITiyN8ZLI+VFEARBEEQ9E0q9SuaMGDECt99+O2KxGDp37owxY8ZA0zTccssteO+993DiiSdi/Pjx2WxCMGQZe07+Ldpv/hwAIEGDSjFeBEEQBEHUM1kVXj169EBeXp7n+5kzZ2bzsBlR2fZMwBReCnSyeBEEQRAEUe9Q5XqGZF8KRSKLF0EQBEEQ9Q8JLwYnvCirkSAIgiCIbEDCiyHbZS1kaBnV8Zq6YjfKaHJtgiAIgiB8IOFlInGXIpPK9dtLqvDYx8vw5Pj8+m4aQRAEQRCHCCS8TCSPqzG97ctqDEvX3opofTaLIAiCIIhDCBJeDJm3eOn4fm0RHv5wSeDNaxOGUssJKSnWJAiCIAjicIWEF4PPaoQKAJixqjDw5tG4sU1umC4pQRAEQRBiSCWY8HNG5iD9APlonCxeBEEQBEEkh4QXg7N45Ui28Co4UB1o89qEYfHKCTX8JV224wAWbNrX4MclCIIgCCI9SHiZ8MH1zWEHyF/wrx8Cbc8sXrnhhrd43fT2Atz27qI67SOuakikm1FAEARBEERakPBiyLzwqk17c2bxOlhjvLq+8HVgkUkQBEEQRGYcnCohC/AxXs2lDITXQR7jFVd1FJZTKQyCIAiCyCYkvBiSLZhaoCbtzWvijRfjxaiIxtHp2Wn4etWeRmsDQRAEQRD+kPAy4S1eLRAFkF7l+pqYIbzCSpqXtLIY2LcpvW182LbPSAR464fN9bI/giAIgiDqFxJeDL6AqqQ7S0oUrgTWf510c2bxSnuOxze6A2+eld42BNHAbCmuxOd5Oxu7GQRBEAc9ocZuQFNBcmnQlqhBLSLGH6MuMP4fUua7fXWMCa80DxwPVq6CIBqTa4bPRTSu4be9TmjsphAEQRzUkMXLRJIlx9/NpdSB5tNW7MFjHy8F4lF0PGCUc9DTtXjVI5KUeh2CyARWLoUgCIKoGyS8GJIzG7FFipIS0biKRz9eiqkr9gBf/wmP7nwap0gFUNM2eXn3O3b+1jrtR08zPo0gCIIgiIaBXI0mkuzUoKkyGwdPWmX/UbweAHAkKtN3Nbp4e/ZmDJ+5ES1yQuTWIZocuq47ElEIgiCI9CDhZeIeTFpIUSyIPIYCvZ1w/RUFdryXDkACIEFPP7ie7cMc0MprjKD+8mgio/0Y+8p404ZH14HaCiC3dWO3hAiArpNLmyAIoi6Qq5EhOS9Fc9TieGk/esvrhasrXEwYL3QyFV4f/rQdABAy96tq6cfUHFSCizH3VWDoCUDl3sZuCRGATJ9vgiAIwoCEl4nkEl4tpeSuxpDCCS8YnyVkPjCt3l1u7tdoRyIDn6XahAdFTdPxh0+XYdmOA84FqycZ/1cUNnyjiLSpqyudIAjicIeEF0N2BtfzE2ULV5d44WUgSXrGA5NsWrpY/VVVzUB4mQdvivprX1UtJuXvxv3/W+Ja0gQbS/hCiRsEQRB1g4SXCZvkmuGX1fjjhmLsr4pZLkHAFjoSdGgZKq+Lij8GNs2EYgb5Z2K9aspuICZUPW20Lh4FDgXh/95ZiJGzG29mgib8iBEEQRwUkPAy6XhUS+tzQpfRQuBqrIrGMeD9xbhrzGKXq9EgBDVj8dN399vAhzdzMV7p7ydhWsma4tioSKnOi4RXEBZt3Y9/fb2u0Y7flMU9QRDEwQAJL5NwyE7wrEEOWsFbUX7n/goAwPrCCkdwPQuDDyORlqvxqc/yPd8dW7UOPaWNzhivWDUw9ERg/Yyk+2vKgyJrWaYWQaJp0BRun67rda6XRxAE0ViQ8GJwwfW1COMoqdKzyszVewAYAkfh6n7puiHCOklFlvhJqBqicdWzD6z6AvjgegDAl8t2eRb/39I7MDHnr86B5cBWIFoKzHwx6SnE1aZbXZxdF684pAH0YKIpiPtPf96Jk/88HYVlqWeXIA4S9m0Cdixq7FYQRINAwovBebpqEcaR8Aqvb1YWADDe+h0xXub/L4THWRad295dhNMGCybWnnAPsPVHIBFL2hyH8NLMml6uBAA38QwC8hsKNmB7Yte4GK9/f70OY+dvbeCWNV2e+Xw5rn9zXmM3w4HeBLT9xKXGC8u2kqpGbglRb7x5FvD+lY3dCoJoEEh4MTiLV1SP4AjJ26nH4oYAUjXdt46XbtbfWrx1v9+BjP9q/JbDOoYFE16FK4HSnb7bxBKa2Z6mJ8BYk/zLk0l4e/ZmDPlqDVC0GoiTNePzJQWOQr0Nxu5lwJAjgNIdnkVNweJFEARxMBNIeFVVVUEzR8wNGzZgypQpiMfjWW1Yg8MJr0hOM7RTvMKLP+eQIMYLAHRd4F7kyWll/F+1L+lqbas22n/wamX+G8b/O34Cti9wti9DV2NDCLWgrsY2KAdGngd89QTw5YPA0v9lvW1NhkQMiJY3diuAvDHG/5u+9ywi4UUQBFE3Agmviy66CNFoFLt27cKVV16JcePG4a677spy0xoYTng1a94Cx0e8FpePE3+wPs/ZUGx95sciSUshSCMtAABaCuH1+PoBQLVpFdO46YOYsHv/KmDM1Y5tYhkKr4YIVGaH8HU1mgKsuWSW8dg+H1jxKTDl8ay3rckw7zXg3csbuxXgKtP5LmkKUB6sl7Hzt2JvOVmL68rGogrM3VicekWCyIBAwkvXdTRv3hxffvklHnnkEXz++edYvXp1ttvWwHAWLCUHqPW6eI6FXXW9KmZbtjSH8PKxeOV/Avw0ihNeJambpJpxYA7h5S+umKsxXRqi4r3mW9zVjP1SjeuW0M1H0u86HspUFgLluxu7FUlrqzUFi1e6RVxnri3CuIXbMjuYpgGf3g5sa1qxdiK27avCkK/W4KEP3UWKD23G5+3EUveMGHXkitfm4M73FtfrPgmCEVh4LVy4EB999BH69esHwB4oDxk4i5eq5PiuloMY3gi/iY6SPbegw2Ck+UxuPekh4Os/AeHmAAC9OnmMl7Ev8xrz7sskwiupq7GiCFDF1rgMpoVMm1TjdXXMaJvKHkm/63goo6lAoilYK5JYvBpfd3G60Nm+JdsPCK23936Qh8GTM3xRrC0D1k0FPvldZts3IOwFqrT6EAsDScGgCStw89sLUq9IEE2EQMLr9ddfx8svv4ybbroJp59+OrZs2YJLL700221rWEzhVannQpP9hdcZ0hbcoCzA8PCb1ncOi5fuEgzbFwAlXKVx2agXpsUCZGQx8VFXi1c8Crx6KjD1D8LFvMXLU2crb4zhAqsjvpYS8/ua2jiOwQEcLZkxToej8NI147wb29qXRFw1BYuXiJ+37cdvRi7A2z9squc9m+JOTZ6F3BTwnR2CIIgmRSj1KsDFF1+Miy++GACgaRqOPvpoDB8+PKsNa3DMTqsauYar0Yca5AIATpKMSZ1laNC5uC6Pq9EVh8VKQui1AYQXs3TxlqokfSqzeHn63Vqj8KtfAVbeSqDqOmTe0sHE2gVPpm5vEvwHA1t4Lc59lPv60LCoHqiKYd6mfbjuzONTr8xEdaIWiDS3vtY03ZrLs0ERuhobvhlB2GPW9FpfVFG/O2a/54NAeLG71VTvEUEQBoEsXrfddhvKy8tRVVWFbt26oWvXrnjllVey3baGxRQGFXqzpK7GCAwRdJRUiUhIxpTIX9Bunx0L4LF4uTFFVE21t06YB1Gnn8zi5VfHK25W4Q83Fy7mrVzZCrRPtdvqmGtgawj/ZwPw6MdL8fgny7Cr1DsFlQd2v13uxkyTJjLH39XYlGYe4HVh1jJzmeW1KRQwSwGzeLlj4JbvLMXO/d6ZOAiCaBwCCa81a9agdevWmDRpEq6++mps3boV48aNy3bbGpa4YYGqQi7UJK7G5pI9KDYLK+gmb3Ou4HCRCQaDhJG1N+XnjWgtKNLq3BcbiP2F194Kuz2+MV5xc9AP5QoXO1yNWRrAfAdGVunf7SZNlR3qg6bp6PTsNIwJWoj1qyeAL+7P6FhYOQHYvyXpKgUHjGufCCKeeIsXR4MLL3avBGKjKXixkjXBHfdVZw4ilzc7dfc7yw1vzceF//6h4RuUAcWUkUkcBgQSXvF4HPF4HJMmTcL111+PcDhc/x1cY6MaHWyRfhRUOeK72lGcWGoW9laSlzlXYwTeTls3rRnNUYv/RYYmbxPr9B0WL6cL7qrX5lif/WO8TLdmWCy8NE3HUShHa1RC27cR2DI7ebsywGEoWTsVGNbVFJRmtqPbResSH0FhIvKlaWuDbbBkLLByfEbHwhf3AqMuSroKE7JSkOIHuo/FK8Ns1cxh1W694rcpxQ/xV9QKuK/vg3DC6+NFOzB/U/IyME2BplhAOSh9/vkdNtS3u5ggmhiBhNeDDz6ITp06oaqqChdddBG2b9+O1q1bZ7ttDcsJvTH9mAfwTPxBRHOO9l3tBsXOnmkW9l6+VQUlWGamNjeH9+1NMyuyN5Nq0UNObi2xY7w4EeKyQhzgMpisyvVum0DMdDOEmgkPo+o6luU+hBW5D6Dl6HOA/92QvF1B2fCNMUUSXAP29D8C5buAqmJrxNRVt0jNbPBgx2mwwSeWfJDgKzMs23EA17wxFzUxn/g1895e/sp32LrPjgG0Y/ca6JzYcQRZsE1BeImuA3vm6/19kBNef564Ere/2/TnE2z8O5Q5IajYWBQgDIMgDmICCa+BAwdi165dmD59OiRJwoknnogffjg4TNeBkSTMPuYOlKIVCtv09l3tCsWukXN0rncAlbQEbjJTm1sIhJfOhBcCBOtaFi9uANzyI3Bgm3B1X1cjy6AMG8JL13WMnb8VpdVGG7JWQPXjW4xJwXXdOWAz8ciV8EAiYAzKTyON6WyK1wsXZxoatmhLCfZX2ffkQFUseVxWwAPxIuHFqWuwZk851uzxqU5vWv1yEcd3awqtr5mgbrjwKvNAAqtjUxrURW2pf4vXwZPk4T87xMGDAjXjGTgahUWjgal1SzwiDj8CCa+ysjI89dRT6NWrF3r16oWnn34aVVWH3gS1LDh1f+vTAq1/XNgemH/SugAAFGiQoaEFauwq7BzRqLHN5cqylPuvrDGFAD8AVu8DRotLecT8shpNV+PeqIzJ+buwclcZhny1BoMmrADQAHHsuuZsk2UGksGGTyWF5QiAMVfl188an1dPFK5iWbwcX2rA6klJB9H/G/0Tbh290Pr73KEzcf7QWf5tCZh1KTpt/5WNG5GDGPixJ+05OAvyjGtVVwQWr6bkxuID/f1qe9X9IAdPjBe7HE3oFqXNyPAb2XOtL/sI2LW0fvc54xkg7/363SdxyBNIeN1zzz1o1aoVxo8fj/Hjx6N169a4++67s922Bof12arkjd0S0Uapwc/ar1CpHIFRiesAGFmPH0f+gdW59+IIQfB8DoIHjb81a53ZIJd1zGeC7Y6VK/FkaIK9WkzFoAnLUVFhVOFfXFCDJz7Nt94oS0wLTzqV67fuq8JD45agNpGGJUCNuyxe5raSbI0SUiyAe4GfZskny0xeNhZ9pLXOwWfZOODzAcCSMUl3v4FzcUTjKTr/gJYQdt68VbFF8TI74YGHCS/Jeb1q07V4vXs5MOqCgCsLYNdWUEKhCSU1OtqSTozX9JV7MGPlnoAHafxipF8sKcD5Q2elFEA8tggAACAASURBVL26ZfFqiFZlh0uU5dlLJpn8CPDfQ6z+JHFQEkh4bd68GX/729/QuXNndO7cGX/961+xZUuK+KSDEMkqQAjglnHAkb9wLJ+hnu34W0lUIyzpWBr7BeIwxNojoSk4RzYCu9tJ3mmHwlJwwVJcZrrf3JaHlscK139qx2N4IvSl9ff4vJ0Yn1eAeau3AwCiMJIGJFehxXRcjYMnrcLXqwvx89Y0pujQ4s7BQCCaAlm8eOuDj/Bp9vXT+Czn784vD5gZjjX1OK1IUIuXa47K1qjCaVNvAt4RBOWb5xRBwnFPmFBuMBcSs7AKhVfjj+o6gGaI4txxnYEV463vgvLIR0vx8EcBLR91tXjlfwJsnZN6vSQ8M2E5dpXWpPyd2haver5He9f6hjdkg4PK1UgQGRBIeDVr1gzz5tlzlc2fPx/NmokDtQ9mrBqVug50vR4451HHchVOS5gajyEsadAgW8u6cwHztyp1i4M7o31L40OtKybIR3hZmB1vWY0h2JrLxv9x3WijwoSXll5MyMMfLsE8LqurtDqGoTPWpS6V4LF4mZ9HnguUGqJQiadRyR9IWVdpTPhfwJhrjD+YdSncIvUxghJwQGaDoaYZ4d+5LLZv3wbvyg5Xo329bFdjxq21KdsFzHkl+c6Y4BIF1zeRMfFYyRTRs18GwIkNd6qjJ2kjTeoa4zXpIeCD6+q0C931v+967hivikLfacLS4u1zgDfOrPt+AtLwWbwE0bAEEl6jRo3Co48+ik6dOqFTp0547LHH8M4772S7bQ2OzFu8AKvKPEN1Xa52zWWEJA0qZEvUxLjJAE6RC+rUHqsYa1Wxc4FPPS5rOxgdV0XU6HRzzdPQzVHJqvfDrDGCN+nKaByLtzpdmjNWFTr+/uf0tRj142Z8vdr5vQdNdb6FM9HEnZccT9PixQmvaFxFp2enYeRse2qmS5XlwPb5xh+u5IJ6IeCA7Hb/KEgyqJhWtBw4hWpcZXFr9aC8xt0IzHoJKEvybDYVi1f5bt/4GfYsQ9eA1RNx9ay+kKE5y3YsHg38vS2Ogk8yQxCaUIxXqmuvW+vBeOZf/dVBGfidlsVr0WjcoXyX3gGagNWWOLwJJLzOPPNMLF++HCtWrMCKFSuwbNkyzJqVJPD4IMUz15nsnFHJLbyu6tIWIUl3WLziur3NEaiCpnujTmrkYJYXzRzcK/e74lFC/gVeAUDRDcFVETUGjVzFHPzNQSnhsnSJhNeg8UtxyzsLPd8zdOjWfnzLIzACuBpD8QAxXo6pk+x9lJsC8715Pu5vVrlf8a/PljYBK5mz01Y1HdB1yMmEl3m/c6Q4VE3HSdIedJc2c9lqabaxshgodlnWmKXNjF1SNR0DP1lmlUAxlrFsWkFWY0OOWR/2N4RDZbFnkSVgdQ2Y/DhaVhegBaLOchI/jQRgzDKRNjUHgLHXAge2Z9Dw7KDrMH4D5eL4NEcpFTN7GuumNVDr6g/fGThEzHgGL4WTx256aBIT0ROHM4GEF6N169ZW/a5hw4alXL9Tp04444wz0KNHD/Tq1QsAMGTIEHTo0AE9evRAjx49MH369AyanV2sAc71tqu5LtcpRzdDSNKQgIyEuSzOWbxaSLWohNfKUq20CtYQU2gUFOxwfi8lv22yOagyQRKSnIN9QnUKLtGb9La9pSmbF1GMrMRE3OnO+N3on9Dnn9/bX6hxVwaa93hKEOHFW5k44WNNleLXXzNXYwaB0r7xMgEtIW73jywls3gZyyJIQNV1/JDzNKbkDLbiw+TVE3C1bNaR0lRg4/f494y1yN/pc6+G9wTeOlu8zLRq7a+KYcry3fjtKE5kW1NVNXIdr6q95gfnMXUdCLPixLpuLdfhCq6PGtdFy6TIxIrPgW1zgbn/SX/beoZdck3XjRp4w04Dar2/F+YG1gHbrN0UpzpSE0DpTt/FmboahdslaoG3zjHK8FjHb/yECeLwJi3hxRM0gPOHH35Afn4+8vLyrO+efPJJ5OfnIz8/H9dcc02mTah37AHcPDcz/oi5EccmrnRuoMUtVyOzeCVccWAVAuFVJbUM1J67dvwZWPAm2rhdJa5Bv7e0FpfIdnmKydV3Gsc2LV6sKrxsDlAJs4duqZYB0XJhh9Uy7Lq/1d5MyrAi45nQZ/jdNz0dndnCLSUoKuesJVrCZfHyWsgCWbx8XI0eS6WbuE+SQgDifm/fgbMa2f9m2YykrkY7xosXquxz8ykPYmTkDePLhW8BH/0GG+eOx41vzRfvL1nCgilGdeuZEGSdCsSlDmDk7M34aUuJ/77rC+t+eoWTNStEMmFhJlOEEDBOq2qfYeWqKLL3y91nZq3s9Gz2rEj/W7gNL08Xz7qgajqwZorxRyJqBL1Pfsxqo23xgvG99UcjEasyau79NMr5/XeDgde7AZV7xZtlKLyembDc+2XJZqB4LTBjkP0dCS+ikclYeB1yUwbBDq63+qpzHgHOfQzhwXvw5zPnYZXe2blB5V50SOyEBtnKanR38lW6Nx4rJqXh8vr2ebSEs/TAtr3O7LzxOX/H2Ig9aXkIGqAmoMQMwZZIGIOUxAZZU0xMqLgDGNYV6wVTdDQPub541VnbbO7Gffjs5514NGQOBKLyCAwt4RTqggjtcArhtWhLCYZ/v87+QjDg+rrioqZwzWAaIlG8SVzVEIt7O++pK3bj5RnOQdPtzg0mvOIOISQ8r1LDCtpeylAAmddCmCmn+QsvTdfxr6/X4dbRP2V23LQQ31Ad9mT10HXrBytDF1auD/O/yZoDmBh5Ab+Qirwr5r1vWLl+/q/9fHHPWVgwBRgA4Pu/AfOHpzqZQLwweTXemeN0mTtiMvlSLJ/8ziiV4so41HQdWG+Kw3q0eKU9QTor/7LwLef3m2Ya/wte5gDgy2UFGU3G/u1qwT0VIYhddBNBHC+E/lc/mdBqHPjsTqBodd33RRwSJBVerVq1styL/L9WrVph9+7dKXcuSRKuvPJKnHXWWRg9erT1/Ztvvonu3bvjnnvuwYED4gd79OjRVsHW4mJvjEc2kGWX5aT18cBV/wBCOWIL37SnAMBh8WrmKpoqcjXGEAYALNV+GahdIVcJioqqAFXepzyOsUX9AejQzMwut8XLaEwFVhV4XVUei5cr3mf0nC3OejvJ3iLVADFeieTC67kvV6LwACcQOUsEuzcsi9OD6XKyOtw9y4FXu/h2/Dwi4XXZq7Nx9WvejNXHPl6Gd37cYj8rVfvQVjfdXbphW5KTBchrXHA9d8GE4siMPwxDRUjO4CUowSbvFuw7mcUrmxaUnYuNOTxrStnBzP+99yAiMYuXCibQJOjCOTEdgmn1JPSUN+ERZTJQVSJ+bjn3JW8x8hVe84YZVpx6JBrnn2/2v+68JlbsotGfOCxe1sb1J7yeHJ+f5haZPSul1XHEM0ifFVq8RUo8gPC6QZmPe0JfQ//+xbTb4aFoFbB2CjDxobrv61Bm23zDQuoTw3gokVR4VVRUoLy83POvoqLCsqIkY968eVi6dClmzJiBt956C3PmzMHDDz+MzZs3Iz8/H+3bt8fTTz8t3PaBBx5AXl4e8vLy0K5du8zOLk3YT1Q0zlnxUJLbFGSUmWAxXs3gEl66V3jVmvW0+HiwZLgn2w4HcZ0s/xiAYWFhwksx44vcg+3LK701pTwWLwDXyLaVoz1KnIHiyeKnNFc5CYHVJ5xCeEmSMZ2IBTegpHw5Zm+tbJCd8x+gYjew1Y77kHwsUSK3x879NVbig9EA5zqsMC1eORmzpQeMQ5urJA2uNwVPRIo7itoKBxTFuEEKVOuFIS2SWrzM503gTs1qiaWZLxpzeI65xrRkMauTtx1WIWJd4yxemnCcZVZoXdetZ0CDDLzSGZgyUNwWgcWLt2anLUBLd6RVmkI0XZWmw9qHriWgx5wudLdb21wxvXZy1MRUFJbZgeiT81O/bAvxfTzF11CCllHZEuHvRPcK6CCuRmaZ1usjq5UlaR1E008lZfUk4PUz6l6qxc3P/zX+3+4TOnEIkbGrMQgdOnQAABxzzDG46aabsHjxYhx77LFQFAWyLOP+++/H4sWLs9mEtHjw4pPR9/TjcFufX3iWsU5t+iXTgd+851im6jJUMw6suVt4CSxetabFS9XFl3+m7hMQbeL75u3A6O1CUKGqqvnZ2C4RwIzfXPGu83bEcKc0QxQLcx/Hy6F37YVmZ7Z0h8CCqSbQbP8aPBn63GiZYDAIJ/zreBVX1EKSJKcbl9tHskHwL18ug84sKJbVztsZ+7kAHVa96v3A2q8AuATUj0MBAJGQcT+3l1R7YmvSifF6NDQF/Vc84NnWgdmZh6BCkSTEVS0994zpGhbOWsBGPcGgw1ti6h3mrt672jw2UxLcMQtXomtsJRdcb19PBTrmbtyH9YVO13nYEl6wrB1WwP3Kz7k1OYUgEH3smDfK86BGve75XaU16PTsNHH82+tnWDXHglBS6VPKw2zPgPcWQmOzPZgiWhdZvOpQgmTAmMU45+WZGW/vG1+WIkyFJZcAAGLVgYvHJX/8eeEVYJ7c+sQSXk2nNEmd+Gqg8SIRZLYRAHsrothbHiCTlM0Y0xQTQuqZrAmvqqoqVFRUWJ+//fZbdOvWDXv22GbEiRMnolu3btlqQtq0aRHBqDvPwhHNwp5lbPCLtuwAdLrQszxuuRqdP2qRxavKFGM1EJeF2IATfNu4UO3qsYCJYJ2QDA2aKYpuVBbgBnleoDo5zUP+6zBx+X+h2dwBjWPcbE4Q7ujotATO/vp6PBGaiByfycHDqr/79O6xiyHBFT/HDYjJOtxvFq+xYtusDlf3DuiOfWsangt9hF9IRc7g+k9vAz67A0eh3Ln+RqOOULuWxv0srqgFKp3xJkwUBSknAQA9tDXWZ7Gr0XhGB4XH42n5E5zy/AzcPnIW8LLg2bGEFNfmZBYvy9XoFVk19SC8Ji3bhbxtAjcvHyeoa1zlUO6ajboAL5f9iQuut9svQcOu0hpc9bqzUnzIdEtqum6JbysJxq+TF1i8Ikjg19IGvB55G5g+yLPJCjO79L+uGC2LzcFL8IheJjTOCripsByK67m2Ktfzvz1uP6PnbEZpdXDR4a7jlzk+QstHmFl17DQV+Gd7e37WFCR1NfLPso/wenr8clzzxlxXE32ej9IdwmdASKbCK1ErzF4FgK+W78ZHi+xSJ9Ux/33vKatBWXU9JhSw/iRFdj2j9z9movc/Awh4s26mmkjgpalrUFKZfkxuKh7+cElWk2OCkjXhVVRUhAsuuABnnnkmevfujX79+qFv374YNGgQzjjjDHTv3h0//PADXnvttWw1oV6xBk4JVkwFQ5E0RzZjOSe2RBavYeWX473E1XgrcYPwWLW6vwuyQD8aYSn4DzgEDbpqdzo3KfPFcT0uNB8zsgQNNygLvAtc5nuHZWfKY9ZHP+GVjB0l1ZAkl4vV4Wq0RmjPtrl8zF3CdWyuI3QIqX0b8GBoGqZGnodWyhUaLTaC+yWILVdhxejkaxMqUO20enSc+wxeKn3WsV1c1XDlaz9i1jpTpPkMRMksXgBwl2QkOJQVrPPOcgDYbmB+wEkW42W5Gr3PQH1kM/7hs3z0HyWoERfnxLemJnU1RnhXI+zg+iNRgX6yM/CfWao0HU5Xo7W9G1csFduPlEBLyRSHld6iwSHF2Oe+Kp9nXOTiyv/YKBTrbYH3O87V6ChLYt5XT+V6V/v/OX0dnv2iHiZPD0LJ5iSWC2uKEOHSCBJGf8ss1Ss+C3RI98+k4EA13pq10VzICy+xCPliaQHW7Ck3W5aiRM2XDwKL0ywinq7wGnk+8HIH4aLHP1mG5yeuAmAkHnV94Rv8uEEcC33uy7Nw4b/rse5mwOnS0sbs09bs2o93523F375ak2KD9HEXAW8ssia8OnfujOXLl2P58uVYvXo1nn/+eQDAuHHjsHLlSqxYsQJTpkxB+/bts9WEekWRZfN/yVNYVYKGUrS0Yrcq0NxaJionkYCMvyfuRLm53katA3Zodhxbre61uDGiiAR0NRrIXIwXAORKsUBzM/64VhzPEYKGF8LjvAtcnZkjiLxkk/XxAnlVymO7UWQJEiTneUfLgEJjX8nceLn8pOSL3wF2L7N605paW5SxbR8cl4dRpsWitVSNkz/sbW9vnqMCVWi5CpsDb01M9VyPX2z/Et0TKx3XpaQyhg1FlfZg6NOhCT0tiv0MxpI8L3y7ncLLOHehqNP8LV5j5m/zP07BEmPAzRS+sKXutEC6sYPrnVmNr4XfxluR4Y7Cp0ywa7puW/qsrs/ntyDMalSt+yf6CbGZIg74CS/39azeD0x6GPjoFu/hRbeFczXyz/oHczfgvg/yrDORuGvnttjsT8PilTEbvgVG/BpYOcFskGS89LDsy5SuRjMZp8a0uOUe4V2pfI89I4UPT322HJOXm/2Y7hSqff75Pf40YUXqc3Gz7EPjGU+nJqBVmiRN4VWyMdBqeduN8I6Fm/1fisqj9ejmtJ5jwUO6fYFRjiUVZQXAxu+d35kWLxZXlwga6FdRZLzAHERkNcbrUOL5fl1w13mdcHW39h6LlwwdOmQUysYcirx7UVROYpd+NADgglOPMbd3lnisTRJ0H0M4kPCSJeNHEYLqCBDNQRwLA1gtFJ8A/nERnziVRNScsDi5S43FiaWDLEn4e9Xf8GT4C/vLtV8Bo87Hsu37rUFKJLw8FrbRl6DWTAx5cYrd8bLB+ZvVRZi4xKdauTloh6G6jmU0wBJeca/wYkzM+av12apxyb7wCb4VxmFx4j+K5MJLS5ht4S1+pltPGO+XJKvxKJSjNXwGvHcvMwbcTOFdjZqdrSiynPAxXuwMFEmzJ6avsd1kbaQKvB/+N7SKIkt8umehAOCd59Fqh4Hh3jTjqATus3Izq5bF+nlwC2smhKu89axE00PxL0z88/f9qp34fm2RZZVXdLFl2L2PrFFkvkjs5iYin/K4Md+jj+uMh83cwKzGu2pz8chHS5wrDTsNGNsv6X40XbfDDBzB9TEUldfiszz/Iq4Mz9Wa/CgqRpyfxBQmaoj/78mXquCWZbsfaYB7C9jPsciiOeZqYPTFqffxzsXAR79xfmfGeIligJPy6e+MF5gggq+JQMIrIG1aRDDk+tONTlV2DnStIsZlLAodD8A5X2P3zh0d634ZuQ6VpqUrZGWmaZAk+0cTTWLBiCPkiPG6Tha4/Tim5zyHC6u+tf7ORQwTl+1KHmsE/8zJc2RxcUfMeQX48n5cLxsupKRB5GkiSRJ6J/KEy24d+SM+WmTUtBKd09Scv3i+21hY7mkjLzRz/dyhGpsJwC28DMIhGd2lzWi5f3WgN2L30O0XTyJMHuCeQWZpDftkN8bibO5F3u3KYrwEx0wSXL8s9yHk5zzg+d7BrJeACfcKF/nGF1budVowdC1YVqOswC4noaEK5otOrR38fofyHS5T8hH6aQQXXJ+i6/Op42VlPguEFytY3CKi4N25W7C12BWA7xbjbEAWxMokS9ADnM86c7uK5gOVXINxygnt6wOPm1YCNn5jfOStrtwJxcKtUaQfCcA4H13XrXIvWyrDmL5S4CLavcz7HYeRCS2Ib0yjgKpzjlnjcyvUIK2kBfP5VdPJAnylc+p1YIQ1WCVU6qK7SndatQFTwq6ln/isCFAOonqfdx8yE15pujIrzGejoZMm6gAJr0xwTZ7NyjRszj0dgPGGzTj1F+0xTe2NH9XuAICaOBebFDIE2A79GMf+KgVWMkYMisPiNSLyZtKmHis5a3SxTjqV1SxwtW+GOelyG8kraupCQpeRrFpCS9RgvUBIJYO9IfLnGHIIr+Qdc8ht8dJ1YP5wjC++EVNyBuO3S25PqxPQdWNA3FYsnsxZOFZyFi/mmm7VTGwpfXHyciMb0eFqNNx6VbWC++yO8YrXOJ4XWUrRw895BVg1QbioOlprTnvE7aOiCPjPKU6xWrjCa3XiBsxu8lbjgxJ2uBotazMnvKysRsASnEnrqTlKWfDlJBKW4NEFc7CyKbpiqo6Xpq3FrSPnOVdwC1l2vpKzP2FNcMO7hfn2h/lyGUj+2w2S0WztV0mzTMnaqcAO7t4KpviqqY1DGOOla6jRjeSUHJjlVEyrZTkXuhEUTdPx87YDtkB1uRoDw18ux/mkI7yMY1dWJykynSFlNXG78HdddvR6NyPzlmf5Zz6hAwIrYqbwvwmXxSvl7n9+z4i1k+x4zaBlXhrE8psEEl6Z4IpRkM2bvabV+QCADnw18VAOHo3/AXM146Gujts3vCb3GNwbexqPxR93vJlGJW9cGCOuh6D4DHxVevLJswEjxgvw1gZz4y7amgrVNS1RKota4P1CMeLqfGghRbkMzmA/pqIyowN0CC/ufHNdmanQdUcMwaycP+IKxXZ91Koa8N1gp1szwNutlYWm66iIJnzbr4pckFyMVye5CNfL89EiIhZec9btxuSf1gL7uJgRU8T8/n27nIvVaVmuBPP/fxyHryN/8ux3ynIuDvCL+4THdiPPfw0jI2/gKjkPvxm5AKt3l9lvvzz/uwEeV2O0zFp8k2LW+uEEqMJbvGrsFw7bLSlZg24khbgWiYewpHIWLy/LC4z2MZdfRdSVleW+j0xIygKLl3l8vo4cP1YoAouX5XJNIrzSGXBCsoy0hvPPbgfev9Jr8ZIky5r7ly+WCmO8JF1FjWm5tWK8zBknKvX0hdeHZsafPZl66qxGEY6zd1ikXddl6f+AXS53KEPzxuXVF+U1cdvVWN/FjSc+AIy6wH+520KfyfH52UTM37KkB7QMTnsKWPGp9Tz9vLUEJz03HSsEBcHdBMnszyYkvOoB5iY8++xzPcv0HGNCbCZETj6mtbUsokiYqZ2FcrR0CC811ML3WAW6fzHZap/yFDzMjZbK4jU8PAK5SJ7Om+DqkJVUGGKGFSKtr04mR4rjhbh/XFhL1NgTUAe1eJnXmi92y4swT1zY2q+MGAKOmxQ77XxDYZJMwiSw2C0dhrVE8ZlAWxLGhjgHr+GRt9Ayx2s5AQyLyJULbgM+5oK4BYOPJQStIp32NTlZ9roPXvyKmwLFUQ/LxJ1FCkA3g96PkiqwZPsB/GPaWv+0dBZszwbNuF/JEeZq1G1rMTfVC3vJ0JFKeHHX1LL62etFkLCeHZGrkZVfYFXXdbfQct9HNugILF6aDizfWYq/TlnNfcdbvDjhxZfLQP1avIK+zDgQZRmb12T5jn2C9QBJ1xE1+6+IZGY16qp7L4HZUmy4rWW3eEd6lien8Epi8ZryOPDfy3x2kvq+ZEpZjf1M1avuYjvz/c0B/NXRdR2rCjKYXonvh5irMd1Cs+bvZ9FmI6szSBmUGAmvgx/24+5wVDPg0cXA43ZQqR5p5Vjnkl8dg37djUxOvyBcLewvvPL0U32XqRAPvDw5AV2N7aRyXC8qG8Hxj8Tt3MGN/XWRd+K3yuzMOmwfrtZm+y67XZmJs6oNlw4v9uaoTrM5LxLZkNlKsjtgfluPq1GQ7l+mp5joPMBbNbOM6LqO8pqEr3DUhDEp3uvbLCy2DIag4qgaV8KAWut562PWEDYPZWV18qKHtakmM67xdoCqmdjAgtslCanrAQlizmJmwWKj7ITtamTxbijfZa0bkYzzkUs2AKuMBI2UtfDYNeeOGYZtlRS5GhmsRIfn5cMvuF72/m4LDlTjhrfm45PFdtwNb9FwWry4chkw52r1IR2LVyQkO8TCttzbjPksU+Fx00rW5/Oxwr6m3PWQoKFGN+5dDszger8BOIDCqKypxS3KD3Y/x+3r/TkbUp+D6FjJLF5J95E9i5eq2dNk1au9yy8OTuA+BoCvVuzBTW/NFWzgA3vZcFi8jO/kdAWq2X8o7AUrwIWIZzgRe31BwqseYAOmJElAu18BbU+2lkk5Lc11zMFBCVkFWhXZKwYAAGF/V+OuJBYvYaaWi5aSMZgGqQWWqqNYoXVG31qjajsLiOyvzMEr4dEBXDn1w+2hmfhDiTGfGt9edxmPatMFpUG2rBZ8dh6fTJDjdjXWequUl8IWXsIhOEAALxsED1THcd2b83zFqq4mvFldgkB8v2wgochW454q9Kw97F7GBRYrhgwNsYRZpsFvMBfMhckCjB2zNqS6VlY6Ph+Txw/utsXTEgqFK63fAxMmkS12kgn//Hd6dhp27uff7HVhm8JcVmOyXwa7jh4h7d4nE14Ci1epoOAlf5lDkgbNFH9ha8AxBV+SMIGgLpaNRRUoqYp5ziE67+0AWzM3LR8HaXz+mzzaqofHP8OSrlkFpSOsgCqL9XH/wpJkvZ378kw88ekynLX3C/w7/F/8PmTec240PlCeOrPSttnxVrsMY7zM7cJphm8EQdV0ztVYjzv2s9jPfdX+zB1w097KpC5uDyxEgE/4Yb+DdOeLMoVXSPfvR+54dxHu++Bn6+94gFqW2YSEVz1giSpRfZqc1uY6drVfRRTjwP3AlZzm+DhxqfBYGmTfWK5kbkgeBarnjX9rO6+Z/Mic5I9HAopVsb9dwumKOkFqmInNefhBogbOBIVK828ZGi5WjDISrSV7sA1x18OT1fjDS55jxZIUuQUQTHi5eko/oStpqjerS9DL1rhjikxeCgusFIlaTxV61h6ZDXiuOLX2sGMXt+TegQdhWI/mbxbEaAEOdx8ArN5dhp0lxqCnQkZblGHt9kI89cnPoq1tBOUtrAB/x5RBnPAqXmdlLopcPO4Xg29WFzpjjwQDz++UWXgn8rqxOEm/zcSN5356Yrz8LV6iroR3NYZl3frtWTFelsUrjRgvNQGM6eepqn/Fa3Og695z2Lo/9dQvusaLYhgnIxJLug589wKw6B0juB62xYuvWebOzExWlmFPWQ2+yi9ATswQ/W1hvjTV2vGBcpIB2s36wkqs2V2OqSt2O84hSOmGzcWVxvX2EYqnPj8DT49fbvzx3QuoXvQBNhR5X/KSsxMZvAAAIABJREFUwT8T9VpOwq//YqIZsM5rf1UMa3aXpWfRYyWZ+Je7dGO8GKbwknUWUuC9DvM27cP3a+2yLRTjdQjABnyRoJJzmfAyHwZJtoLF+R8N37mEIs0wSfUPahRVwweM+mBvJG5K2d5fSrs8VpDCU2/3rNcykvzxiCPkqNjP00lu+ArBvMWIuS0YVYKpm47gLF68e9G3nARHjsR1TIL7XlvDv1WLO8T7/+cskeEZYEzO2fBvr/VEILx27BN32r+WN3m/VGOIxsSuRollyXFuPABYmPu4Y/37FGPqjZqYz0CvOoVgv+HzsGu/cV1aS9VYkvswPpD+ivC+1aKtbUzBUlkjGPR1u40SdLuwarwGmkuY8LhfPBKabrlOowlN6Cq+SLGrvotivBh7K4zzVlIJhoS/xUsS7J83BCjQrdCCMBJoiWogXmUu8x9UPDFe0VJg+zxg/ADh+u59pSzDAWDCErM+VpJ6YsbOVGD+G8CMQZChWTFeOZIZXO9nwkkSA3S/Mg1bcu9AJG7EXUqCRCQ5jeKnGwrLcc3wuXjs42XOc0hhXlpXWI7LX/0Ro37c7HUxm8RUDV8sNWfGWD0JC7/7HFe+Nke4rh+Gxct4VsbM31Z/AfZ+4tZRPNw41v8b9iO+X7s3PeFlWbwEMV7p1vFirkY9DVcjCa+DHzbgi95SpRwjXsua4kOSLcsYn7HEb9rxmDZ4+TfdfY8nmv8RMDIeKwJkAF0uL8MJitMa0eeXx3nW8wv2to6HEBK6WHi5p21pCPj2RuESXoLEg9aSLbyacVMLBRFe/DrNBLF6b0y1rTh+HdKWYqfLw2+9U4umo4+7fpqgc0p1vywirQA1juq4s3NVNR2o3AvFHJgkTXXGYLhoAUMI+Vp/BC4DJiCPgnHuZ8jb8K/wf5O31zzX5ybkC5ZxLyxQHTE9bEmOwK3uFl6qpmOJWQF8+Y4DKS2Wmk+M1ylSAXjXp3MjVzssi5e4G/6lVIBtubehu7TZPCZn8ZI0y5WaIyWwKvc+nD/VsJKnZfFiiKaaEpxDkHCGQjYhMhfjJazN5HqG2ctSBAmHpcjjakxi8fo/ZTYAoGXigLD9QOr4Vh4Juu1CS8PVuNUM7l9ZUJZUKNr70xBlM2mkIZ5U3Xl1Fm4uwbBv16Oyto6V6vnnf/8Wo2xDIuYUXpzFC0id3LR0BzfmMIsX/3Jm7i/tOl7M1Wgl0aSGXI0HK/9vCPDr3wOwhZfo96KYaf+Sw+JlfOQ7Qd7a8cd+Z+LkbuegVhEHcPtZvBJQhG4LN4PCn+Hd0L8c38mKt2hrqpiEBBRHsVieTKYGqiv8D79IP8qxLCao7t4atqvRIaTcMV4CmnEWL1HpjSMkW1T5DYTfRZyT7CZ7Y/xz6CPH34VlRturObdz4Kyp5m0AtdZjqVI1HRjRi2uP6pzGxwUrayKcdggQvumz34qnZEcyzP3s3OcUBxpkQNes387knBdwvWIU8E2oiaRvzh6Ll2oP9JIEZxV9AaI995bW4rucQbhTMSZN97oa3cLLmdW4b/LzWMYVp71cNgqE9lOMlxj+OreVKqzkkOamAI7UHsAzoU/xZeSvvu32vOm7RMH+qhi6vvA1AGOWgvzcB52rQza2efcKYBM35Qu3H2HtLBFu4QW7jpc1STYEZWICDMyqeZ6iuMlIgPhWJmd+G5qDzbl3GlbTNFyNzI2fG5ZTXwcA0FQ7zjQN4aVxMV4A8NHiHRg+axP+8836wPsQ75gTXp/daZRtKF7rHF903fE8JUvqAICb3+aStWSBq5Hd7wxdjUEsXqwyEVm8DlYueBI43XDrMWuW48fY2pjcNGTeaaer0bjsLMge5taM3JxcILc13r3gR+Ghq30KrMYQgqykiD3yQyDY/KrXM5K5GlMW2cwCbKAbGHvUCqZnrNS8laD5GC++tERbiN/+eXjhIBI8vBvTTxCdIu9y/O3nagQMyxDPf+cY7kNW7TvZcTw0bwOocU+Ml6brrliY5MLLsZ1wgbc97B41S1GqRLQfd/CuJof9rQmaapU2ERHhhHMblCNRU4afNnFxibHkAdiWxavIdpOeLBvZr10ls4aUR5Bz1ykRA1ZPMj7LCnRdx9HL3sRRpmAXDey8sWqY/Lr1mX/WHg1NQQvJ/9p6LF68iBl5PtTv/45qU5B3lrwlRDRIQNU+oGAx8OFvgJj5G+IsJJYO4GO8RLgEFJv6KoK4YSzVmXhKESsnQPPbFulZvBiG8Apu8YqahbJzwwow22eaNR4twdUcc7Z5U1GZ7/yfRlajzbQVxj2rjtWjxYvNsRlu7rF4bbas9jrOk1OEDPAoguB68/rKWnoV6NldUZLEeDHYRPZUTuJgRmLpr6bw4u/3Q/OAgflWPJf1o5Iky+KVE5Kxbagx35ijazI7Kr9sMZHbDDCEkBLA4iVEkNKfyuIV1xUkkswr2dCw+6BBRsL1aL+c+J1nfT6rsZkUw9XyIvxOmYljpNT1aPiYsJDgDa1ZCmEmIp0YCSbk+esfWMzkHmnEeLmElzv+R4Ga0vIDJJkKRTPqMSVUDesLK8x2ZyC8rDpIzuuTQAi1cfGxQ5KWtKQJH/e1NPch3LvsN7arVtcdcwrqgt+GVUp15Hn2Mc37zF5Gkt7P714A1pjCS1I8gkhVvcOHn8DlXyBE5CCGbtIWo23uPoUXMUWr0G6ZXTNPNB+lChn7Kripnb4bbC6wn3d23eOJFM+9S2BEdZfFi4kn90tcAOHFYp1Ez0CqF0oRMrTUMV7cNF5Ry+KlAAUpkkcAQFftfsJ1Xfq+NhtXvi6O/dJ0O8aLp866grfOspcQTXXFI+pYvct4Se2vzMHwFLOoOGACTmTxShGDl1A1LOPclqv3GO1TAlhCmSGEykkczLBsCpZizv8Ym7cB2pzEWbzMGy0rVhA+n9Um6uQcb7jx/ngw9gcA8FhzGHEoCPtN0Osm5HJXCgRbqsGRz2pMxRW1/xZ+36f2Letzqe5fvywIbKBTIXuCgBMIoURv5Vxf0q0M0WaIYmTkDbwcfs+eaDkJfJHVkOANOhfpC6/gBWA1a/CIc8KreRJLh4NQLrRELf7zjbOekVvoG67GFPss2QzZbx1dxR3vLcIvn5+Bq8yBw7J4+bgay8PezNz1haVIqJrHghRDKOk1CyWJeXO7Go/USq19ydAc80bqivdFR5TxHuaEVwgJvBgaKzy2ruvYv5lLrJAVT4arWyCdKu1Eq50/CPd3hN+k5Sb/CY/C1Jy/oA3Kk1u83O0U9UmQUVnN3W9W484RE2ccY0Mh+x35WbycFzEOBZoUQkQypwxiFpBULltBm31LeiAzi5cCzSH4hFYVxY4rreGFVxA0lbPoerOdiytqMey7Dda0VAxVS50Bmw6dnp1mWMtEMY5awuNqXLXbuMcnCayjQtZOBeJRW6Q65u4MFuM17LsNuIlzW7JEFzmAq9ESXhTjdRDT4mgAwE7lRADiIGPZvNGz1J7GF50vsb7j17899mdMVfug4tbJ1nf8j3uJfgq+0XoDcA62PDE97DtRsgd3TJfs3WeuntzNFEcIUeTg3/Fbkq4HAMX6EdbnDxJXWJ/36XYlf3dcVrpYAhiSMOhf9PY7z5zKqRknlNpJqaecyPWpem8vz57wGh0ehkHhzwDAIXwDW5GUMEorqrBmj9Ol6h6UZWhAIoXFa8SvjY5UhKZiweYSx1epLF6q5H0OX5mxBq9+t8FzHRNSOOOpqUSDL9u/rKtAzM4Q1ZSIZ91lBWVYtcsp0K16WpBwkzLPKlvi5pPFO7Frr+3W3FsZdwk53eNC+jbnTzjlu7uF++OTRET0NLNam6HWK7ySWI9EmZuqLqO6lrt3THRzAyhzmacsouxSrxokaEoOHg1NQbh0qzUQ95Q2GcVbdxmFqdfuTm2RZi0XxnhlJLz01BYvxWvx8iTelO92TgZv7U+zXhTcMx6wl5XhMzfiH1ONJBsmttzB9Yy6zEVYXpPAk58KrHS66nE1rt5t9CG+NQi56/RraYMxrdR3gwMF11dEEx6rPACsKHD+7nSrbEzqbFXmaoynWyusniHhVReO6QLcNR3vt2IBsd6HjynsxXoXYEgZcHxPK6uRtzBs0E+A1n8sWp12ifXd2Z3aWJ/5qvSO4pMccYQQCTqxrbvjEKS0N0Mq4WVsM1btm/JwfPtrOFcp37nv5eKVMkHhXI28xeuR2EAA4hiqfO2XiOuKI6vxyBQWBP5YAHCE6i0UyseA3aqILRXJ9pmMKxR7ZoR4Jq5GJQJdUBzV42rUVWwrLPGs50H1EWeL3oHo7R3wzxxVJW8ShAzDVem+PnEp7DtvKSPmk3UrCrC2LF666nQ1iixekDBvk7N+GZsV4p7Q13glPFp43Okr92Dsgq1WRigArN9b7bB4KdDw5g+CEiA+HJFCePEueA9JhZfIxSqjiptyp+hAGRZuLhG6Gu3ahcFivDTICCWMcznl299bfVQnuchYYfWXgJrA+7PX+LaZkUz8eUR3/sfApplJ9xfI1chbvMw4ueZh13rDuhixcW60hGXxclur+Oe+rMbMOGababrn+v4v/DLuKfhLstNJig4d24oEVn+BxWtPGZsqTvw7nLPR/o20kYyXmcSBHaiImesLXI0dt0/CtMhzmLdpH64d4ZpoHkBCINgBQEliCWUo5Go8ROh0PjTZ+MEJf4sCCxT7zu1euP7M4x1/n//Lo63Pqi6jZY4xyLrjlxjj1UsQCiq83JYMkatRT27tYPFFQeaI5NPQa7lSD/z7Wq0g8zAdWEevumK8pmvnmMu9NyiGEGoQcYitHCmOzVr7OrUlh3v7ejL8RaBtUokIEXxyw0lSwNppoRxhAKunw5d0/GVCnmc9NzvXC8o8AEDBYvSUnALCmifTxy2qCSxe7L55LF4B4gvdZUUYHSVv0Vc2wEm66giu14W/NwlrdjsthkEyNR/5aCk2FFU6pqvSIGNKvj0tVbpz+vGxinGB0GSxccKnK6mr0YsGGRVVdtt37SvFXf+d45hWK7DFy1UrTYNsxdMp8WqvKKwshvbORXil6P7k++XaIEqw8MzaMelh4MObk+5P8QgvwcDNCa+oGd8mzPTbsdD7HZfVqKrO8+atuiwbj8V1iSxbFykr0aNqHrDxO/HJ8NRWOhJEAB0LNpWIn0FNw9oiLp5Q1xBP+Nzr3UafMOD9xdZXTFiu2lOFjSXm758fh7hn8XTZSFDZtNeb5OI+Z6+rUbfWY7GljDC5Gg8durY33GXOLEWDkKBGT99uRs2s67of71nmhwoZq/52FY5rnSt8E52inot9OCK4xcv9diAQXp7Jol0wi9ejl/4y5eF44RV1FDe129usDnH6dyjf4dXwSABGBy6uNyQWXlHkoINrIP5SvRD3xP6YcXtSXTuemZGnMTPydEbH4Svo/y6U2rKWCLXAzrK4FcA6PfIc7lFmABB34kGsaKdu/9h3GXPrKFBxNMqsAHZ/i5f3OWSCyGPxCiDUa32Elwi2/w279jmyOSPVXkGrQ0JJlfPa5ARwdTB4i5cOCX+eaBdnZYNekKFB1SW05kScyPJwjOk6F1pUk1i8hC4syCiv4l5SEMcHkX8BY/p6trOzdn36JFdsYI2UC90S3rpX3FTthbw3WOac7PPMAKljvERFSBVJg8YnkYgCwDlXYw0rThy0GKhux3hpPq5GwM7GY1dU1XXkxMvx3/B/0BYuK9VH/VMfd/zvPQkiT3++XFgiB7qK79fxM5LolpXc4/IffbFnc3YeFbUaStlct1WcRd3nWZw+fwnO/vs3KDhgiD63aLJnqIgjBzEcU2b8ll79dj2uen2OQ7zdnJuHe5Vp6H1SGzQmJLzqgb9c2wWfP3QuTjm2lWeZyOJ1cruW2Da0H7oebwi2Oc9cirmDxFMEMZiQUHVdKCpYhxuWM1TyggEvrIkH3etqX8KvomPBfv7Xn9kh5e4dwstnwDy/c+YxXi+Fx+BUs6MXBdcD4jfwBBTU6BEc68pkrEUYs7RfZ9ye5gHdfrMiT+FkeQ9Olo3g1HQtbX7lPPzYGGuD7zeWQVdj+HvofXSVt+OF8DgAmQuvIJa2waFxyMt92BIczdJ0NQJeS1AQ4RXV0xdeqbIEAaOcREXUOYAHKbzrPhbgHbTYeQZ5hToAZ5+TzMokLLCbxOIlEi0qZJSU2QNZBAmc4yrum6wsioMv7nX8WQ6+bqHubZsoNsqH/6cYNdAyifESeS6mRZ6DVsjVJhS46vdW29cras1jKjiWK55W03TommpbJl2X3SG8ElytOXPbU3Z+jiuUpbg/NN33nHzZvsDxJzuWUJzyJS/MhjK3X0rrJmzrX2lUtfutyiJuf877/Ub4TZwoFeKa7y5D/+iXmGxahd2uRt2yeKkYEvoAtyy/G9i/FXnbjD59X6XRh+Ughj+W/RODwx+hXavUXppsQsKrHsgJKY54LB4W49X5aP+MvV+0bY4T2iSvOM+Ei67rjngpBuvsghq8PAgsXtEab0e3QjsJK/XODkvCr45zC05xGrq1Xz8rRLpTRfigQRIKEj/hFUUEXeQdju9jCOH8X7bNuA1HSakn4gWAzq6plcaqV2Fw/K7AxxE9C8kYmbjBiAXU47gz9L1jmVB4BXCfsdiNZFxrFgE9USoy95uOq1GDrnMVxE38kkx40nFfM8HDYqa+ZwkxAnRIKK9xWj0c00ilgL/SFykrHefmFpji8GkDy3Jgkqx+XroWL1HiggYZO4vt5BPRdEy/lJz16XxjvFyUo6XVdei6jvV7XEHUAUrluM9eJAL9LF7MSi3KCDxCqoYy62/2fgUWr6OiBcDwX0MrXI0CNum66PpGnPds/qa9jgr5qubvarQtXhKOQjlO2v65o6yR6H4IObAN2L3MU0aIXRuRq3HS0h3O36CuI6HqiChyoCQXtk4Cin1fquz5E939/w3KAvxCMpafL9sW4VW7nC5+3aypp+gJ28paUWjdRxZT3QqpS+M0FCS8sowsS3hvQC98+uA5ddoPG2BVTReKClt4Zai8JMXzI8wV/Ig36amtWwh5y13wcTJ/utY5oL0W/w0WXvIp0PsB92YZ4Q6uZ4g64ZgeEq478MpuePkm57RN687+O4q5LMxkBLGaiKjQm2OVdlLg9f3i/dzEdAWdoh9hinYeqvRcYekJVZBCHsTiFURkMrHNYpt8sxo5a8BSzXBhK5bFy+1qzDzGSwQbGNiMBqkmnS8pd553OhYv9zP3iGJnM7sHvWQWpAP4/+2dd5wU9f3/XzOz5Rp3B1c4uAOO445ejnqChSZFUBBFkWLBAnaNikZj+9qwJFGTn+VLYk2sX2OUQKIGW6xRxJJgNIigooj0ctzt7e58fn/MfGY+U3f2OvB+Ph7K7ezszGdmPzvzmnd1727hhl24AnDc7MRxeVm8fthuCiI3sSn2tNQ2GixmbY+UC6684vE4pG+t1hjmIsqNfVZ2QibqHRLVr5xECAngxQuN5R31htrqlrU4T1nu3In4+3Dp5RmWksCO9fjLiufxqZ55Z280DwCIdrAkVu2u1azA/Hwz5uNq5EHhEnBv+D7UrL0JX6z92FjPXlrEs3fjvUOAZeMcoti0eDm/s+dWf2v9DTIV8aSKaEgOZvHS3ZcqzPV3/PQ9yn++Ej/trXet0cLnbAIhyJKEVZ9vcazD96ywOGp5cfGGWmM5dzplSamLQbcWJLxagYn9OqO4g3vtrZToTzPcYqQy92wjI5OosRXj5ZDD3egWp/SL+JmptxXyN+Pm51nFy73JE1FbPAzoO91YtlHtnHo/HiSZs4Aq4GXxCsEtmqYwPxf52VZryby3ijAy9mDgccRY+kFre5Hp2t7IiyC98wDoDYi1K5BXyynW4BSLYizSwoYl+GNiYuCxicSY9Zi8XI27BT3Gj02WGH7470f4VcR67r3aVSWErN90LF6mq1G7ee3wEdkyVNwAa+ZiOjFe9hknNpW3Cy+/Vix2i5cfQSxeSaEIqJtrUoUEVXCzRRHHXo/eseaHgp2XvZJ5LNms1ggdMPB5qOydXIf/ZJzp6AZh/80nmWQUhh4jrwU+/oPxHhcG4UcmOyzR2oeFkhkuwovzxteC+HFz5YYzLVa1uF4EmAtC1Vb9VKxfZ7gaYZa9MWMgk5ZWZYBLiaPa7cD74u/Iek4Xh1YAcLd4hZC0iXctxisaVtKzeDFz/fpd2nn+YvNe13MVMqxkMmQJ+HaH8xrF73kyS6KW17hs2GtY8HkiQnaKLP3WhIRXeyequfEyItoFUVWZq6iQbP9aOPOV1PuRFSBidXeKT7OqpABnrUKdR/FWnPM6UNRP+9vF4mXBXrwVcBR+ndRwF+5NzEo9bhe8YrzcBFYcivs5UyLIiYQs7qag1iXOVqRfHmMPy0YsjW4AQV2NdYLlZ6+L8JqvrIIimv11xFIF+1kG9qBxRW7tFjYvF+b2OvM74t9hIXbjvvBvHOt6Ca+9MOdxOjFevN4VzxLcAWfMJkeWVEyU11iWTVI+Crwvu/swKWQj2gOb/cq6pCO8/jd8t7PQpe1ml5DM8+XlahRddRHEzZudFzu+DjQ+UXi5wZLelrNrN1/kutxuLYwhYsR42UUZXy7FPazVotjyEV5i1qTqNmYlahFE9Q3atrjQVW2WH1Ewm1mNwlD034kC1fFAw/QMymny+1qj6xfOBV66ylzBFoN2fmg5irDTtSi0DNUiyJiqIqmywBYvs8C1ZKyfo2pWxqTKXC2jIcHiJUmm9cq6Xd2SlkxaLV66uOUiN5tcjURgdOG17HSteKpXcH1uhnbhdnVLdK9JvR9JBs58GRh3DUbX/xZfqN0srpPkkVcC3UZ6f750GFChZ7KksHghbF6oefJB2BacloTsG9vihwo5cAHVOELu5yyUAVmWcEH8Est206ExFbL3IiuQC43D50It8z/nYjPtfS4WilvDD6Pf3xcYr7nF0VKqAEpgCxtH0p9GO8Df9fqjXjxXPHZer+7n4adRKZvlCr5TNRegl/ASjy8dVyPfB88S3MG8hZcCFa+p1YG3bcc+t0VRn47Fa3caQrhc3oKl4d9bF9pudqqkIBd6CxYPV6M4r6MQ3Dsp8LOM/cTykZT9vyvlW2dNp1TYPQD1CAvjt74nFsB1RRApfu7fiODKDCVd5r0SMsTABHkNlNot+vo8xstPeGmfK8EO9JO/09YXhJf9O1Oe1Ipb3x/5jdboep3tIdylQLIC1bVdnGbxMrf//JpNAKALL+dceenfptXwJOUNo5ejCtk4f9nqXgBMq8jvavHSlk1VPkT+rs/x015niIKZlJAwHwJi+wxxy4uwWnqYNrKyf3NBwqu9owdilmRrX9UF4ystT8ccXgPKrzGwL3JIKwg77ipsRgG+YZ1RKJlBjGElgGUlnGn91wvB4hXRKwlHbRav9685GgNKg2U5PpmwZoQmPcpJuF0sLYGeljFqN4GbZ4+wrAsAXx73Im4quCvluDoHqIBvZy/LxENnHR54fS5OXlSP9F2vXqi15uVqjOplE/4vcRSWJuYBADrosWpvJgfjX6wibfGp6O6JnBTxFXHGa9QJhYI99sXLmDR4uHLF4/PKoA3CDni7GhXXuu5BYML/TUTLZQhJXB16AjV6tqCz2bZJOiIdcAmGt93sshO78FnGItwfvge/7W9tKQVoN03xuwxJqiOz0oubEqdiEyt0fe9TtVfQGPy0sAuCGCKGwLLvzhBkXgPxsXKJXBf6A7JQj+WR63Dmxye5bCcBxoCR0hd4OPJLVH+l9TjkombrHqsYEh8YY7qr8Q/yjebm9N/JIPlrx/FKDXstXTaCIMHd1SiDWZY//q5myeyq7MQpoTcc6y9/8j68EfkZZKi4K7wMx+kJNkmYQk2BihzUaU3AXZKrRNfmxn/+Bfe/sd6xDrfOSUw1hFe8bo8hbnnD8izRchyg2GpLQsKrvVOm3/j14nwXjK/EZVP6Gm/XZ2nlByRuVrWXhSjsY3l5ccMF7vuxZQw5Lui2a1HErSdkWH/6dilNYV3PfELm2wnzzuETrwcAFOdmYlL/YKUVRNcSoMWhuN20vSxermZyvVr5ySO6CdvVS3p0GYbPo4NSjmspzki5jp29yEIoHDwekB9nqIN/BqboanSzeImsUEdjj35OebDuuokPISOakbawj0rahTUVXEyJLZC8RB6fmwnmfoP8hpnxgelYvOz4WbwiSnrB9MbnjLpm1vMoCs5CaTcWh1ZigqIVofSzeAXtlWrfP+p2AU/NA/Y6g5UBYJryAfK/et6x/ETlLdwWfsiybHfAHqsNLOTZdWMDKwm0jXSx/7brWVgQXu6uRi+kgFnXUSmBm8OPoL9eBNRBMoYkYxgtaxX4Y7o7nIuau1/5wrK6OFdi8SSgqugCs+4gP8ZB8kZU2uPiAFwd8q6z54YiqaYIzTBbvSlQLXF//NfXh2103c6t4YdRLm9BHmxxZ7C6JvOlWuzbuxvY5wx1EOe+16OOkQjAkqjTLfu/e/VfRowXLyeRI9S7I+FF+DP9V8Bpy4HCKnOZIGzqs8v0v7RJ9m7HmXg0Mdlc97QXLJtbrnpYU2xiyRlnZJ30/73lGOc2uKXLxWS88PBy84UQwMsFlyG8jrxca60EBE5DX6uWW17XI+IuvFwSD+LMy+LlFD/85pgRll37ctpZhfQzWesQRSgSvMYMFyd5Wf5irU5wNdqFqnPdiBEMf4SiuQe6dspBJCS7Zjv5EZLVlL0EAfPcii5iL4sXX9ctY2txw6VYkTTPuz2oPx12+givEJhFeO0L6G77e2SJ/nlbULtwrAOljZb3XLMRdRJpJnAYFq8t/wa+XAlscunJlyZBW101IOz5ncYQ1q8wzWv2sguvGCJGuyj7796c200fw0Bpg/ebiRhUxoxYsP36HDXaaYWt50g8v/tiDcBNHS0N4EXBmOvi0i+UXNr/+BBGwpwnFaY3QUHSMm+51SpHdn8A4a5lt5ZW4rU4D/swf80c4Jt3nGMR4+U7xJzWAAAgAElEQVQ8hZe+DlOFrgmq4U28+nkty9ZSW9GtCXgrQsKrvROKmrFTHCHlnrfYqCrKQo+CLHTvXIgbE2eY6+YGrI5vt3jZL+hBRJBPbNcNxw1w3Rd3Mbpa0PRj292hCnU+QdLL1cMtlryvWVfXoPPtLjdST1dNyLk//sOPhhXvNG2BoNaW75lprYpDQSgS3OI1pLteP86lybmImN2XyuK1H1FLP00AUBQZYUW23ASOiN2DN5JDfLdVom7DW9Gf+a4DmO1/4oFcjdq6bl0/XlZHWaxH6VSuF1GZ5Bs/pUiqRXgFzZ7sIf8EgCFqa1sjjvnq8FPWffkIm3QL6Bo3ab0yf6wuWL05P/yEoUiDHiXk+h4LGdlnzYndQhsTYrzs59W4yTfDOAoUn5jGZAOYaorgZFwTBGEkkIt9uGT3nZbVRfehm1XOqyYeJ91Y2RCSiPL9CGEjWgyZ+V1zkZMnu1u0eSKOvfdtCElIYEaJoVxpPzo2uBdhtsQZ6+vXSP9BtdCKzCg4zEyL3LmhFahKfGnZVja5GokmYbnJal9hx6ww3lwy3hErZTBlKbYWjvLepq2Gl7OkgfbjHdWzE2YN9ajlxXuVSammlXkh4ILL9dKgC7SGzGL8wPxdaTzOZC/LdG0ZJEnACQ3/4/hcAh6p0K6ZmWYigJvF69r4Qvyji1luw6ssxIqkNdnhCb1Eg1YGQUI4DeHFkxIYZLydHOC5XgPCxrqp4p7qELW4JgFgX30C4ZBkCazeyvLxYPI4323NUt7yfZ/DBZdXM3XXdT30iPhk7CZ+f2Cd8Ofu12B9lrdorEfEM3gf0CwpYm/GVCVA1qo9jL/HlOc53vfLCmtWVyPPVNZLQrzyqWaZOSF2I1AxLq1tcUJQUcci2JfCkpqE4pkZnCpWza0HZRDs4qoBIf3Gr2JZ5G7Le41JhvEiT6r1fsDRLV5cVCTjDcZYzw8tR6/9n1pWV1IJL0GcuNfHS094RZAw5kkds5YXEediT73kRj6zFjTlcBd0vq3AckjPO1cVq4vVDbFECxdqz0RvxgvR643lXDBLLGmxYl67/06cqrwC7g3KJlcj0SQEi5HKn84YL76nvfxzzxuB84RmrKPPx7tHPOq9TdtTnjPGS3v/2cWjcfccLZtrzXWT8PF1k8x1lIDWBWFfXCi6Ni3VXZIyGN5RBzre/m3iePxP/FQApktpM9MsQHbhdcnEKnzjEkfSgBDeVF1uwD7HkhMNuVa3fj1ZjY9LThS27X4z3m6rD8XX44IhHA6lHANH1WPRmKzgrPgSz/UaEDISGVKJhDoWdZRh2FUXR1iRLRfJBoRSFhnNR+qq9oBpuRFF0y3xBa7rGrF2+lfwiVphed+7L6gGg4SPOk3D64XzPcejWbC8b1gV7DsMk82n7lTCYAszE0UuGVcOAFgan2ss8+vt6etqbKzFK6ndoPmNej8yoIb8hZPn+KQk1qhV+Bh9fdcLIelt8eKuRq+EwkbequyCtoGFUSDtRVdsd6xripqmW7zCagwNLu2vAADJBqiMGaJC1XtWhqWkq6twimK6g90q04tzx61MC+8aEZQCaTcuDWnxfc+uMcuPKLZyEr8M/y8AIB/uwovHiXa0xXiF9Jz1pH6P8ZvfosUrdYyXNauzhP2Em8OPYpi0DgC5GommIgiv7UU1QN9jgWm/BGDWLPm8cArQuX+w7U293bHI72mf0yk7go7Zwo2NN4n1qlS94Hlg0s0Wi9j984dhXk13VBa71PBRuPBScVPiVIyN/dry9mvJoXgkqcWaZeuZVj96CK+SXKsVSdUDsxNQcEvC5QbvUYvs4olVyIqEXC1edYiCCRdbFvDnxUUudwlEFFmL6zvntZSfVUPaU2WYxX3daqLYSuUWq0PEYW2aPbwMEcUsJfCvYTeBQcZm1gkxFvKMcRKr2qsewfCAU0BsYfmerr6HE1pD5i9ULb7RflMO0p5KZbA0NbaT6hyVwRqUntJiI7yfwWqNZe/oVsrTQ3/3/KyfRSD9rMYE/vavzUaDam4tSULGa/91ipEgaIJK9nWJ8vXsFq9NEU008+uNV/3ndGvocRzCS9/POxmXONZNmdWYJp08BAlLxPCbV9cZFlM1YYoAt3jI80J/wSjpP9YxCoidAoJ0mkjFRaE/G3/bOxnY52IH7Pfc5x7d4lUgWc9DSNKE176EuV0vLLUkPYSX4WpUk66WY74NcjUSTUMIhE9KEeCUJ4CCXgCAvEzthlGQ43TTxOK2Cd5Nd3l1dLaocQqvABcjbqERguvnNvwCjw54WHtRORE4/GLLha2iKAe3zRrk2kycu1RlJJFACN+wEhwVu9uoSSWalf+jdgcAw/Vlv5GPKLeWpuAX8uUXj8MH17kkCkTcb/oR7tpzsXjVIwJJNn9SXs4j8UhXJGuMc80MV6asxfXlBmg+HtaeKqPMP3NQLL3gZiXZw0xrx35kOARLXmZYs3jxoF5dtCShoE/scTybHOe633zhRuJWuNUYE+P95rSzlhkJecZ4vayOwvROK7CN5bkej3iz2O/irpTAwBjzddOJQfnfZKZ+gEn1oCIKpD4vzzc+c1r85ym33Uev1+RGuvE7MlSc98QaQ3jxwrYqJNSnlzdhoEDVvgOPhtt/0ZMdFKgOi9fmTK0tVCqhm279OI49jMCrlArQvK5GPyQ1jsff22BYvMQq+Plwj7nrLGkNnyOS/xibQ3iJ4iVpEV5JVAtWXgDoLv3k2bGBn2t7H1zu6uW/CT9XurhtFTJ+dZLTO2EG17sLLw65GommIboabW+dNKIb7jhxEM4+wimm9jfYJhvPLnR5wmvgN56eY4HOg4Ahcx3rOODCS5jU69Wu2JZrcxOmjAGzbk9M4/6WdcaxDbfiheQYfMZMF9OPKMDXF3yPd3WXpGpLWy/OzcC8mu7Ga35zzs3ORqdsF6uIh/BSZN6s3PlePSKQlNQWCH4zWJ4cjYviFxkXID4mQ4QGaAqc1N1DUVW7qCxuuBR3JufiwQLrDd0qDJzf91ZdxHzVaRxiiLjeCDPCslkzR7a+vzw5JuVY/bIpuXgyW1/JSCCEzbLpHt6odkZV/eMAtHPELYp+Fq/9HlXVVRUIh72TQfjxD6lfhnvL7vZcz76+F+L5z9il3bziPsHmIn714OxWgKSPVRHQhNpFyvPAXy7WxqLfqL27PaTGcCF6WLpvip+GpxPjsEod5hDJIf37NpJ5PKxN6TaD59jrx9nd/CJmBl0LFBSzocBMzlCYKS68+p5yN2gqcRikqX0qRDEv/paq5a+QZ+tBe6LyD3StX+e6HX6dEwPhAdPVyK97fu2GxONVIaNDhvP6GhJcjW7bMoq1kquRaBJCcL3d5aXIEuaM7I6Q4vxq98dtF0bjxu680BjWgPxuwHlvAx0C9E40XI3m5N+NbKc1K7DwMmO8RL5mXXFp/EIjE85YXdiP/QIflmXcNsusvWVcULzcTR6iJ6TvQ2UMk2J34vsjzQwkFbLFGul1+ebLGxAGg2yIXIcpXfieVybdEyNUvXZaJKkJr5fVUXggcRx2wBrAHUMYDMATZ9fgb5c4i63y5IQ3GnicjnP0mZGQcZGTQ9bz9gmrxOTYHa5j5Oxl3sKLzzf+Tcd1F+ob0QmWY+AXa/G7tteGEgWEIzuXr8MYcrLM8eyxBUJzIbUbOahVU4vp1MHhzvcbGzAuYhdL9t/Eq0lrQ3oGCZeHnzNeZwnCy8uq9IHax3U5J4IEEpBdezsCWuusnycWIYaIw1UlM94SRvH18DXW4mVnt09TcS5uGtsxIx3CSGCErBWoFa1Y+V7CS3eXpeoHmtUMFi8RcX4VuMRrnhl6CSV1XzmWA+b5LLKVswhB1YSXPv/9XI1W4SW5Jo9lcHekmvQVcZYm2WTxItKmuJ/xZ9A4IgCob/AQXi5CaC0r1/7Y7SzI54mLqzGGiKMdUOAnSpnHfQTzgUjCdu03pJBLSyJtH+nd/GT9hp8VUbCOlWFPf6slUFbEGC8Amc7q+zzFnVvNYjZXo7kx8yb6X7Ub3OAxXtzixbcbU51ZqowBh1cWol8X51M/Lxa6fqd5YTfKXMy8HwCQIdTxklwEa6pa7m5uPw4XDD+xjrgtPhd/H6pV81aFcyCKm5AsGefRflMWhZjbhfj7UHcsHluB7GxTbNXCLrxMK2i93UUv8EOP47Wx2YTVarW352c4dpHUGOyGV7vL84r4Ystr+3fELSQq87Z4fS5kZLqRKcWQhBKontdw2WodYUy7AaYSVo21xgHAC4I1dmB372SQ1nI1AsBZyt/QQXd9ifv1cjXyquupxphulXo3mOVvc77w7MRHElMCbYeLbHviSAgJyGDG/PcLrhdbF90e/j2ymU9NQJb0nYM5lhgvsngR6dJ1KD7tcBQA7zgiN/bbhRe/87vcL99RBwKHXwIcfWPwHRiuRluvObv1LU2LlxjLNX2QdzV7a+NY60FxSxXytZvIq+ow65gDwrfzm7lDcfmk3uhbYqsNJsR4XX1MP+D0FY5t7NGfuvnNhBfq7CDZ4rQE65nXU3gyqokoyRaVXGf7qr0sPxwej9EgxDZNiy3F1NjtwFAtJikzopiBrCE34eX/vfpl4BmuRknFsuRxqNMLA4vJCnydsCJBkU2Zbb9pi/txXIj7zcDIJctRWdwBRXmmO9neR1AUKG/+d6v5RuXRlvUaOmiC2J4pah/TgK5OsdvYgHER+6yw79f+neTbgreLdTdmErJnVflUmZOZiGkWrwDC67nkUZbXTL9WpJ471vdT9SYVEbOZw2Hv3zuf20GKIzcVXooBsIopr24IvAhpqur6zeFqFBFPRSfd4vWhiwX03aQzDnKO3kbIXrOOx3jxeeU1bzazTg6h2XHnp67rAlpwvVsxbL4sC/XYxbssJMniRTSC/VHtyc0tJt2L8X2LAQDMuKHzSeq2EQmYdBPQNY1GwNwKYrNQhRrrapTNrEbOffOHea8uS7h2ej88duYoR0yIUZzxvHcxrP5BXBVfBFzymWcsl8gRsXu0OkcwLV5d8jJx0cQqR9FHWehpOa+mu8WVuSYyAsfHbsJGvaUNv7n/iE7GOu9dbbrWrLF87l/0zuIa4MjL8VJ3aymJr7ZaRVwDQmAuF6WVyVHY+bNNxjkWY5V2IwdfMDMuLiui4IbE6fimZApquzrdlamsFnbXWr1iun24q3FMRQGePLvGcCWKFi9+DjplRxCSzUa7fmJDtru/ek8x2qDU9DJvyPZ+g57upgV/sryUdaFtdzXam7RnR53nppMUrNSGH/Ybjd2VN6qiAEfHrAU53fBzNaayzGVBs3j5uXk4zyZsxaCT3NWo1bDzHJ9wPu+Mn+xrPbUTEx468nK83d2/CD+JjRnzEFL9+4oG4YvKs33fF9tRid0gFI+0Tl6ENNzI4Pp7Eif4fi4IPP5sl4u71svN7AZ3NXLrLBdodmSoRkwpJ+pj0du+r84zuP7pRYehgxwzk4jI1Ug0huHdNRdW/675gT9zeGUhNiydBunCD4GTHxcsXs0U0+Bh8Qo7LF4B96ekdjV2yTODp2UJOPvICoztXeQtAqI52IFczULRUXChKN4X8k2sGGuY5jpyiEj7kO3HJgiHpBTCJ6zSuDgc1ktz5Yk1nrrkCZYXYVtcTNRKVqGoKCFg4vXYn6EJce7WtVspvGp3XRC/FHIkA7fF5+OZxDj8XR3ueWzRkIJNrBirBt4BJerMDkvlarTfwD/pMsf4m5+TUeUdMaay0BBezCK8tHPQo1O2bvFiluVMknHqYT0sl17H07TwPUtCd4Kg/Qbt8GSLBtv5ts8/plrHsVPuiBeSwZuhe2EXXvYYIElWfGPrOJqTxqu4aQqLl9SABFNwf2KG4z17ZwO7QGX6bzu1q9GcWwvG9PLNXrMjPkyEXCy1LcG+PKur+Q8Jq6W0Vkj6COLi5ILKrY4XoPWgFNezs4t5x7bZEccjPoB0kOoQZwr2u5SOsZRqSEFXaRs6SvuMa1SN/IXrejIYIrYHiYjqV++OuVrPyqRtOKyiABE0mCEF5GokGgMva6DI6X2FkiRppSf6z4Rh8QpqgUqFGON1xkpclPcbAEDPQttNrQlZjXbuFyxgsiBUxOzCv//M6t5w5cIP8Ltu/sHhgIuwsr9vF2ayGGzPLP/2LMzBM4sOC9TWhl8Af1SsLaC4puXDygg5K8ADusXL416lyBJ+QkdcpQdAe5EZ0bZZH0+6ClB7Jqkdu7toe4c+WtYsRIGkDZKf50jEHA+DZu26b/4wPcaLL9e7/GUX4ebjB1puyldNscVaibFpQmZmY4UXt4CmcjXahdcz+WenrPTeGMSYGEBLKgmSEehn8QoicZKQ8bLqTABZlLjc8tou4iSVCy9tudevS3yQ6JTpPJ4vh9/oObYYIrg1Pg83xk/zrd3WHHyldsWJsRsgKf7nXBTIqdyHAIyaX17rNiCMGAt5uhrTaRYvVsK3W373IMv1ASudMhY95J9QLO0KUPyXOSxeEZ9Cw1OVD62NsHXuCP8OUJOIIo59XPBSViPROJrBWsX8XI2NQMxqLD8C34a12mJDutmscmm6Gu391nicV9+SDigU6pWJp+Lda8yK+lWdvZsdG3QsxxlnLEq5mmu9MQFHvznh5i4Z/5rnPSOsXXyWxBcBZ77sud3O+dqTmtNiwP/Q/omGufCynmOe1ehGKiseJ1Pfdl1D0vU8pIrTcSSChCLA7Idxc2IBvtSLofIDqk9oN+RINEP4vISfT+2Log5RzeKlu2X2IRMPRU8FzvgrAKtruqP9Ji32ExVuwjzGjVsOCmHNxDoxdgN+PEF3M174kbFclnk2pvV82G8qzGYFZiliC43zkYJU35wsS454Rzfc2mxxgjRG97qJSrbjtM/fupiZVel3KbMU8tz5tcPSlwx7W3RiCON3yWPxaHKqowwK562kszNGY/hA7YuPWB/Itt6pfLzc7cljuXaynJTuQ3F9b+EVQgxhdJF2uL7v1sHBCz8RVcsy3IVXin6RbjSkiDuVwRzWwHAKN/BM5V33N+p3I4K4aa3zKvLdSpDwOlAJ0KQ58DZawuIF4P4Fw/HgguFGUdf0t6cLL5vF6775w7DqsqPwzOLRlmxFMasxN9O/EbQbYUUGTv0zcM7rluUdswRXhSND0zZk+9uWC7DtO5MkZOlWpP9LjgO6H+a53Xk1mlvUEUukRwLzfzPC2ncpWpfUvO54NekTGxdQvA8q02KjqjrnuIq1VO4ix4xVokB2IR5KTBOEi7bW7v16+nwkKnxeQo5exyekCK5GJuHJyGygUCvG2btYsF6pdldj2PVv7vpZx7Sitb3kzZaPfcT6INlddw3q+9HQxu1X0gJwEV6y/43wc+bMJNzvElDuFky8oOFq4++wEtzi5SWcg7jCvL573ot12qAS5GaELALt33njjIy2JFN85WGtbD48SeEMh6txazfvTDvLDd6jzt5b6iDX5W7MiV2nJZ24YCSJ2LKl+Xi5RZln+tUjkpar0WvdOELWrD2X94MiWs3ssyuOkGv8Y2PKWKSyeMlgTgtuQyPjIvdqyQx7ydVINI3mEF76TamFYrxK8zMxdaCzP2JwixeP8XK6GiuLOyAvM4yQ4Gq1aIE0XbAGvSYApVaR8vfLxqJUtzi5iZT9M/4XpzdcBcDFIqaIFi+rqxGCkEhFJKStZ3fVJHXBlTSEF+95qB9/p16ov+Bj7IB34chUVjzO+D7FePXysZgxpKtrnTg/ixernoeeRVbLoxhjZVzM9YeB3XXahTEjahVeXKhu3+ftDrnxWLPcClgSOPMV87VogRH+5k/Ce1kW1qo9cGX8HMcxhF3OE9Pnwzbk4dORdwJ6JwG7WzUkW3+vzCemEADqXCwUvMjtp4OuATpp1uTzxlZY1tnHMnDFeedi3exXgQnXIRHKDlQDy8/V6NeyiON1E+X9QXOiIZw6uoel3MWqfrfiC71MynZbcsOv4rMtrz8/4l5g4vXA3KeRnHiDRXA+kDguRfsnl7ZmNr5lAeoU6mxgJZakExF+DmWHwOPCS4/F0sVNPQsHEl68VpVX5fo4UyB79VtCehm03LrmVpcvAcVVeGX6uAC9SCUGZZcWRaEG72LCvuzThFctz16m4HqiSTRJNLWQqzFV3a10y0n4xHiJlpeglpt0KcyJoqpzjmN/xn4HnWQ02nY0+3apEyYJbuIOGQGtgZJH9pzKrT5Wi5cqWJCM8yIO7cxXcHaDFn+TTmZsr6IcSJLkHuMlzKOR9fcbf7OykZCOfwBVJdairpLu9pvQt9hh8eJD7iBYS2tZBnKi2vHv3N9gnEf7jSCqCAeqJoHuNeZrUfAIbqf/Ms2196Y6BNMbluLZ5HjH8Yli86nMuVgSX2TGlwH4sXwmkKPdwO1Wph4drRbYVK5Gt4r7/Luvyy4Dempxi2XCdpclpmN6w22o7paPqoEjgKOuQEiRAjXSVn0sXkFikLysajyxRpYkXDC+EjOGlhvvRTMycWtiAU6M3YCvWJnlUvZ4crJlO3UZnYEjLwf6HAMlI9fyjStQIflcU8Tgeia5j1PM1Nuo+oswPyHKz7XkUR+Qu/wy0QCVSYgj5Ht+Fzf8DH9PDjMsXqXSVtf1UomYdOqg8Zph61ipqwvdTXh9xnoG3j4nVdKG5OJqlPc3rp8ot3jtQRZ2hYrSLiPU3JDwOlBpjvisFstqTHGhDro/ObWQE11/LSW8xG3LLoJDzNqsiyfxT7Uv3uh2vv5B84IogWHKgM7CNyYhOxK0gKv2KXtJBtVu8QrZLF5MRUSR0SUvA0tPENwp3WuwSs9gdMSlBcDNSiZaTLYiH88N0MSXxOeDzcrDhdf984fhvPG6+06fk5cc3RtLpvTByPICY/39iKKLbnlMJK1SzXIMhVXm3/a5YwmuN8e7gZVgaP2DWJac7nq8gHWuDT/jLtT2PwXFHfgx6QJXv+HaxY488kzL61QWL96HUoTfqBTA/A0JIQd/TdZYalYBwNQBJYFuupqr0Ty+bUJrHbFRsRdeFpVwyPzdZEVCWDLNjKWKJ1U0IIyPmLMulH3MqlBcS8xoBbjw8p7DFuHl4Sn4SCh4+xd1tOe2ALNEyS3x+bgzPsfyHv8N7Mq1HtMTyaPxXPIo/CY5C4BmVYrrzXP8LF71iKAeEZRK2/BJ9BxcHHrBdb1UvULTqfyvSAwMZksukYR2ti3Ldh37e5zVcEXg7XNSW7yYM77wX8+mvR8AwF4tdOBL1g1L+z4P9HHpz9uKkPA6YGkG0TRCvxkUVFkWr/2fKVj7P8GqE1sI+hSRtsXLR3gJN8+gmx3VsxOO6u1dwdoNrjPczrYoQurjScxpuB6f9Fiof9Dqavzt3GFmpp0kBxc9hsXLekNP2IQXF4HG7YWpkGUJ7109EScODxawHQR3i5f5BZx5eE9MH95Lf0O/sYStVh9e5T8jrAiWP23kOdEQLhhfaRG6Rw3sabh8EyrztHghtysw5mJ9czZrachd8MQQwU7k+naCCAtzrXfnDrh//nAovTXLzCvJEdooJJvw5WQXAQv/Zr5O8VvZBqfwMip9Swy+bb4EJg8owee3eItJAPhHchBUyIYl50O1N2Y33GC8n6pNDZDa4mVkAwvCt1snlzhMfT27UKgX2p1JklV4yVCNempuiDFekkdsbBwhXDfgFTyemIRliWM9t1XLotjEtHqIv09Ox795hw8dPu590WKU1z+JdaoWM9iAMK6In2vU78qUYohDAYPsWbsL0FzO9SyCfKnWKH77rVqEObHrLOt9rFZZ+nTae3am3evS+J5SW7ySXUcYRaHTwa2os9jiys3i1Wjeuw8AEGPhZrMzNIUWFV7l5eUYNGgQqqurMWLECADAjh07MGnSJFRVVWHSpEnYuXNnSw7h4KU5guuHzAFu3A3kWEVIdjSE7Ggj2plw83rlJP/10hRefsfaGIvXs4tH4/Ez3XsfesEFUqqq1vwGwWOtLBYvxhAJycgK22pABBsAAMDuyUzqweNcgJleRW7x8t7k0f2KcephziDu44Z0xa9PHoILx1di+YXutabcY7zM47n+uP7IzNKD3Hlgua1YrRISbwZ84DahJMyVvDyz3lkiqRoBy66HWK4XeC0dYV3uIXhiKTKsAI/EipKBWNjj71jDemvnfo/WYmsry8Pu3tY4JfQYYwrxUArhpVu86kOm5Skp6U2FJeZq8fJyKYZDIWDqHZa6aSJ/Th4BwGxX81xyLDYys0NEEOHllTUXMVyN+gLhQeT46lLLumJyjP07jSWs80K2CS9N9LpfV8QYLy+LFwDUIQPXJxb6NnN/OGm1lNjdhPw74OPl2bK8XAoXZlHD4uV/DahHBHW2YrG/Tc7CP1k/y7IbE6dbtuTXON6LPyYmGm5WSeZtzKy4Wbyc8WzBsD8ofKxWah1TdBSJIYRkWl0KPNFdlDGEG2Xhb25a3OL1+uuv45NPPsHq1asBALfffjsmTpyIdevWYeLEibj9dvfsECIobT+JDCRJqwY/5w+pVrT964Gc2uIl1tVqyTMhG/c5f+XF+/plGsLL7SfWCDexflOptRUv7KpbgFSbIjTLTHjHx/3+9JG4+XhnGv3x1V1xwrAyXDGlDwaXuRfoFa18X94yFYDLxZ3fZD0sXooYB+MiJPQ3zD8jQqV7weLleh57Twau2gj0tFXY9wiujnkUmBXxKrthjEIC0KCJlxeSh2Pr0fcARf2EN2F+H4LlbYdLcUtuGcnINR+KuPAKeVhIfGO5DjsXW7N6+X6uk7THsm+OvdeeG7vgXgeNZzUalktB+EqShP72vqFnrAAbeY5FbJTXP2mxeAFwuBohwUd4Cd+tz+/X/htyXcceT2gTpbzCfgc9aeaChovxf1lz8AXTkgi45SkDccPV6Ee9FHXU4PqeFTrWs9eRs48ziPCKI2R+jx5lN5JMdli8lEYWpbWLQxkq6oRjzUADyuUtRkiEF/9U+wbeZwyRtGJaW4pWdzW++FSKZQwAACAASURBVOKLOP300wEAp59+Ol54wd1nTaSimeOzmouOPRw3WAdSQIsPvzH7iAe5FYLrxW17XZv/37yhWHXZUajTbxCG8ALwzbQ/AgCyI/px95+pta0ZsTD4APT9NyCE/vUPG4uPrNJuzEn9hsLvK2KMV7oEyXIURUg05F7LirfmQRe9ernd1Wi5YHvsU/xOBYtZUmWGCN3tcdN3a1Du1aEgSBFbrydls+Wp+f5Wlq+vbxeHumVSEF41sfsdriGjsnm+mT2n6sLLOgxzQqaM85Hc3+ef4y2MDOE17//wRqeT8Dl3p+Vo8WM3JU51bMOrMroYXA/AIXwdp7R0OKTpv4R9PvC6bsbnHBYvyVN4Wc6Lj7ZKBvAi2IsE211hPNZtfB/NHfkDCvF45mngx8NFbiY0V2PKHpVSxCJG9rJM/FvVAtl3+3QksP8WUxU3BrTzuI9n/fH6dLZ56eZqlG3C6zWMTLkvwEN4uVi37DX17Hi293JBs3gFXr3FaFHhJUkSJk+ejOHDh2PZsmUAgC1btqBLF82MXVJSgi1btrTkEA5ejBtqO5hF6WLM/BRj5xfSgMXuWvIHZQov94vzsYO7orK4A6L6E35upnmx71GgCQOjgn9eGfDzb4EiLQD3pUuPxEuXOnsfWsjQLE/5nTq7ZrwlbYrQeHId5rxJpiIUoBRHquB6AEBuF+CsVcBxWgcDXmrho8zRuCt+MhK5Qkp+9Tyg6zCg5lzbVoX9jDzL+DOeULFcHYOb4wtwT+JENCQCCkwPV2Mq0eKHceaFoe5Gtvaym55RmalbDvXfrSQIwDhCDuG3nnXF9fHTgRN+ZyxTdSuEIgHoWK4tzDEz8BIp3KVeFjEe5NxRb4Js9K3sPRl/KbkIv0ychJePes5IWmAuAs6tfx9gtrAy5ovtRxr0N1vXYP1+ReG1Sh2uWTG8LF6CG9TPYh2k3qDdkhSxJR6okHF8dVeLSI8JopHXe8uUGhBnoZTCKyZlYLcgamc23Iw9+m97aGyZZV2xnEQ6WYzG58HMbgoelmE34aXYXI3/1zAm0P4cLkswXHmcszdwrq2xu7GfhJbZq7IAk6ibmdnckg/oQWn81SYAb7/9NkpLS/HTTz9h0qRJ6NvXahKUJMnzKXLZsmWGWNu61T2FlkD7s3gFgad0DzzRf72QLjC6HwYEKN/SohYv2V94ca46pi9KO2Zicn8xu0y/+Xi4iPqWeNfYAgAU9gYGnADE9uKogXPw1n4AWd9ZrFn2cdUhA389/jNMG+Jeb8iPIBYvR/9NeLgzuglPv7rw2i3n477k8XhcbKuSXQgseh0O+Hfa+xggarrAYgkVKmQ8lJwGANgXCxiE6xFb5RVU/8jCkVj4yIe+mxxSlod//HcrSnJNQZyEos3HaXcBNYu1gH+RsPXJ3nnuJNx0628sS7jFSwYDDjsfKOwDVJnxlKnKRigex84/99vELPw68qDFlaXIWlD/rg59DNOeW6mEaE4B7pw8GFhhXe6weNkQrYR+P1+7xSskA2DA4Ppl2IMcnCtJ8HqQ83Ij78zrj467PzdeXz6pDwaW5uGhtzbAy8hi/57sMV6DenbFOcf2t+5feChIGK7GBuxG6hprcTmKbxPFxmsxls6vN6r9vSARwRIYhvfuDqz/0IhNdSsnYd+23dUYVPQ5LGdgkCNOAZ+L/baBygBTjRixVD1iAQBR7Rqbg7p2Ibxa1OJVWqoFTxYXF2PWrFn44IMP0LlzZ2zerKV2bt68GcXFxa6fXbRoEVavXo3Vq1ejqCi9DLRDgmaIrW8zZBlYsh44/n7/9SJZwLnvALMf9l9PJ2gh0MZgxnj5r5ebEcb546zZeN7xSwG4bjtw/vvaORuxENGMLHTrlAVk5JpWFGjlFewo4WijhHk4RXV+wL32V0qTvy68Inrbj0Ctirh7MtMaa2YXmnvrA1aiTrN+D3cZ+XHp0b3x14uPRD9bvJIsSVosV+cBjs/INpdnEHcJbxiuSNBcQb0nW77fVHWRJg4odV3OLV7Pq0ehvP5Ji/XN4mLnlg3Z+by+k2Xj6H7O+leO4HobqabnK0ktvicWt1q8+BTlmZ6S3eLVe6rxpyi86jO1MS5LTMfqCU8ay6+Z1hd5WWGcPKKbUQLDdbw2a/B7qiayeHHb6SP7oCDH+t2KY+dCKwMxTcSk6m8qR/EtM+fgy1eK9c28x2mfT0GuAjIYOhbpSRUeXgY/4XVMbCl+VvJY4NIVdoEmgUGKOMNU8uwWL1sttoIOTg+Ag8m34JusQcb31da0mPCqra3F3r17jb9feeUVDBw4EDNmzMBjjz0GAHjssccwc+bMlhrCIULbq/dGkV0YrGFtyUBHNpwbuRmhFhZewSxe7jRhXErItQirHT6u4lzzot+rqHGNn4OcR3dLdYrP9Z4CdBmCP2XPDbwfVIwHpiwFjrFW0f7TeVZ3hqNwrReNKJwotoxy3aQsoX9Xp9XST1RIusWLf0e+T+3H3gNk5IPprkbVI24vAQVjfcqkRCLu8W0MEnoUuMcL8e85qTIgrI2VuczHbWqO0VVAxCgn0YjfZnn9k1gU14r8jutjOy59vltu8lx4DZgFzHvGWCwGnnfsPw7Xdvo1bk/MNR4EhM1pY7V9cTfFTzXq510wXisFc3y1ZsFcz0pRXv8kPlf17OCocx5YXI36eCNSEg0BshqhRLCJmccejlq/pwST8cv4SY6P8fIac2LX4ZjYUmP5v0POhwCOBAaJZwPrld7dshodlip9PvyH9cD2SNdgFig457wCFaEM5zVrO7OdU1mw/AJQg5TKKO6Lh/s8iFpktguLV4u5Grds2YJZs7RicYlEAvPmzcPUqVMxcuRInHzyyXjooYfQo0cPPPtsIwuiHep0GwV88kfNDXWI8+aSceiU3bKViI/qXYg/f/w9egdpuG2Hu5m6pVfCIh14jNeMIV0xbVAXVHfLR+fcAE+CLgSJ8bLz6Q2TtaywuwBUz3dfKTMfWPwPfHP/OwB2BbsZSxIw+nzHYkfj9aAEvOi+fdV47NL7Ra66bCx27g9oUauchPe+0uJW3Yrt4ti7gTfuQEhvAVXaMQvrt9b636xGLARGLETtL7WkpHq4C6h3rpmCzCyfekoeDzoSGN5cMt54Xf7zleZHeI4GY4b1UZYV2Ota1rKIEd8oEg6lcjW6/21nfo3dZc5vutr2kyoTknasN+I4FFw8sQpnjClHp+wI/hvtDxU7PK1w9u+ty4AjsEdKoODLp5CVEcHG26fjH//dihc++cFYJ1vS+yRmmCLhD2eNQm0sgcue/dRYJtbTisM/xuuShvOhZEuWmM5w1BQm1x/bH6vy/4P/98ePHJ/l8+m/rBQ7kYvfj60H/uk//WUwyN2sgfGulettMVWiFTAkS4Fdjc4YLxWKLQFnJ8vBqQ1X492Mi4UV9e4AfIwBf9O8BE470F0tJ7wqKirw6aefOpYXFBTg1VdfbandHjoMOw2oGGsG2R7C8OB1B2etcs9sawSzhpZhXO9idGyMwCusAs7/p7WiejPDDT6yLGGKi8snHRpjnTACk6/9yTMVnSOOtb1S1jELZfrUKciJOtxHnix4Dhfc/HcADe439hFnAiPORPjdjQDMYO8gN6vlhefg7Z15GFM8Hm4tnfOys0yl5EaO+7xwa7TNkUWLV0SztmQKAeVbTnsbxyz7NxJR5moF5e5kTytDwLugY9uRDkBst2FBUlWhtpnt5v3pDVPQIRoy5ptbnP+IcvM6YXeBn3NUFbDmXf1Deh0um8jM5g2qhThEnnF8wZMfG8sKOmSBV+fwar/D+ZZ1doxFCZm37NzMsKUX7mbWCV2kHQCAr5UKDEl8ZriRsyO8Bpz3/mSokLILPN8HgATzH7MsSYgHjvFyuhqVDKtFb0XyMPwAW/kMQ3jxeRtsf+EUbu/WpEWD64kWRJIOKdH18qVHBco6stAtWFpzUBolujjFwWvNNAZeg8juJmkMroVCA384tUBpzrECQNe8jGaryr/w8HJ06+idpp8Oks8Nip9j7iIOEuM1qGcXLP1iCo7P87BkpnJJd6pw/1gQ4cVguBqzJbOuV6RzH+zAt4gm3d2fXMQ79GC3wxzrplXY8uxV+OzN56Cu1oUXg5lsYktksF83+DFJkgSc8xpidbUY3qOT431zgejO1M5xNGw919mo0/6IOi3iYsZxeXEesEn7O8bCOEL+l+chMkj+Qsn21uzYDXgn4xIAwA1ZVyO89T9GliIvHMvP8R6WiVypzrY95zxwWrxkjO9bAmx0H1NIllDnM5d/UjqjOLlF37aVb1hndAlb57arJVj/Dvh4WcCC3Dx29aB2NRJEc9KnpBEuvkMIfnEPFLCegubYhh98rM0Vk/ePK8e7VtJvDFcf088o+tlY+FH5HR5vP8TPRRDhteioChxZVeQaT6btOMU2Iu6C8qYTR7guB8zviDHT4pUlCK9MPa7LXs7E+LwocjjX7wA/S42eAUW9sa7nacBqzauSZAyIaQVgHRmkNgzhBQClwx2OW8e8FAPN9Zs8b0bPyZK0JtZwycrjPHlODaQdGwzhVYsM33ZBKiTfhyD7OL+HGQu2M5mJb5j5sMe/HgnAGQ1XYp1aaog0zo9Mt/qd8hQQ3w884dxnAiH0KMz2FF5KCldjiMXxUnIkpiofOrJwL4lfiI8yrdf5vl3y8PV504CbhIV6jJfRMiyg8OIhFI2L021eqFcjQRwE8Btfc7jvGhPjlQ78wtdcwqtJT7CnvgDMfdp42ZwJGn4WHMPipRtpggQkS5J7EH9aLHwJ02O34X21H9hpy4HjH0DFsImeq/PToQXXay48Q2RAc7lNH9wFjy50j1+UDYuXcHyy4tHRwWT1tUfj/au9x2WHt84CAHTwF16ppotjDtRuM/+WuavRKhpWJYdpf2Q4e2weO1jLFBzTqxCSUHrB3grIjgrJGMvJsevwi8TZlvdzfNq62evaMd1KlJAz8IZabRFpgFZh/56E3uKq7zRgkPa3XaIkIfu2fFNkyTdT8/NotTHX7dmPe5CNUGYusOgN4KgrAQA1FYXOa5qRVcsfWlJcr/RexDxbNXAiTgtCwosgDgKSzShmlKa4GgOQaGaLV5M8B73GA33M/nvNaezzG1eWHnOzc79mPQqaCdZkeoxGl741OKXhOkgVY7XCtX7uLKN+HYAsLdaGiY3fJQn3zRuGI6qcbWwA03rq5Vb22nVhThSdc7X/7jjRLaLNKgpE3YUs/zglLtS9DB8WwVx5tNZ2ylb02R7jdW3iTPx54uuurvZ75lTj3/8zRdu3UIrD3v7LDoNknL8PWD+8qEy2vB9EeI3ppZ2L7R2rgbFX4YmuP3ddf6V6mBEPlgq/BwpFlozWUyJJyBhT/xs81Okyw1KVYE7XuCRJQNehpsvWTeTZgutT9v49exUAICts7aPZlpDwIoiDgHw9jiUjFCC1OgUt7WrkMV7NFWvRnE1vW6uB7mEVWkzRHr3+WGMqjTeW++cPw5rrUjSy17GUURl6Kh7JWogVue7Ntt3g4toztl7827aOJEn45zVHY85I9yLAosvI0u4nRZkaPr29XE6KBBwXuwUr+94OLPiTazmbDFuMVwIhxKIe4lORDZEkCUWD96eweDFIUATLYIWtPEy2j/C655RqjOrZyUgKUSEB469BvccYvdjAm6Xrbb8yEUtp8eIN3kV2S7n4AYVIyBGhDITPnPfrbmILrmeShD0+7ZN4DcAs/XzZ+362BSS8COIg4K6ThuDG4/pjYGkTXVFo2UK0AFCQoyUpuJUfOFTIz4rg3lOq8cgZmotuWWJ6q+07EpIDl1/hlipVZYASwvtdFqCoY/BSHmaMmPv75xzpHvAfCGGblgbXLgVeRVJZvGRJwr9YBdYXHe25Dbe5G+RBQhLGNv/Ifr7rihavE4aV4uEzrMlCfhavI6uK8Ozi0QiLFkuYBW0tlHo3of6bOgp75v8NqDkPgOZm9rV4SRI+ZH1xS8UfLMt3SaYYMyxefvKDJ0q47StXS6Sp06v4S5KMx4c9iycS/q5pXmeuroGEF0EQzUCn7AjOOLxnoy02L15wuPF3S1u8HlgwHHfOHqxV4D+ISRXDO7O61IjZejw5BbhxNzDnj7givrgVRhcM0zqk/fubuUOx9AR3158bfC55NaA+ZlAX/Om80Y0aW66QrWiJ7U9h8ZJEK57r+9q/fj8D14eGAD8bsaF0hw5Oy5CICslw9R47uAsKbSVN/CxexpBsx+qaOHLGSucycwtgpSON+mRZqPeNz+NhCrsye1iW75LzjfHw05SEgu9ULdZsO7MlTxnCy2Vf0+7Crsn3YLWq9bpVIePCmUfiA/21wcl/AC41s0Z5SY39ZPEiCKI9MKRbPjpk8GyhlhVehTlRnDyiW4vuoy1pkrey33F4Ljm22cbSVPp31cQBzyqOhhTt5t11qO/n7oyfjOe7XGYIB6+sR8AUB+metykDOqNAt9xlRwXXX4qyGnYx6T0ev+QI560z0PDFzgl2F6atxIYK2RCubhqR/179MA5B/zyvZWWxjIedbXpEZNkcazZikPxcjfoO7W3H1iiaq1KWAAmaqDphRA+8fexr+HH2izgmdrt1Q/yA+b46C2I/Iw/1A+bie72i/+aMXgDM9lEGRX2BfNNNzTNw68niRRBEe6FarwbfpDpeBHoVaSUFgvS8bO9MHViC1y4faynUCQA482Xg5996fu7+5PH4qPgEQzi49RLlNDbWT5IkvPPzCbh7zhBrq6QUBXxNV6N/CQzb3lKOJ5CrURReYZvwGrvE8pLB3+0fxFVv9JjVlRcXXiPLO3l9xIEiS0aZjCyp3l946Tu0ZEYvehNPhU8AoJ1FfkQDyjph7qjuYN1q8BNsha7trsZzXhMOShNY/2T9MDN2E94qPAWAS69S2/eRqcfl1bUDixfV8SIIAoDmAly3ZW8gF8YBR815rqn+LcGyU0fgk027kJ/Vsm2sDGrOA3asb7HNVxS51KYKRd2L5Q6eA3ym9UkMK7JxI7aUe7DRFM92RljBrKG24rk8jursV13ranFN4GXx4u+n0lFPnF2D+b//p/E6iH4UK88766pZN8AgoTRfL+ERMT/XvVMWvt2xP1BYgaXJOYCIwi1SwW0usiQJFq963wPl37dl+12rwaQ3jG0ZFef1EhfuQtdm8RLj9pQwZP3tT1kl+ur2o7vn1QDPCZuwCURu8SLhRRBEuyEnGsLQ7s3TYqndccztvm+vuOgIfLhxR7PsKi8r7NusutlJcWytyvEP4NGCy4C/rUc0JBs3Va8YL6AFKonzm3SZe2FY7kr3jvGSLOtZMT9jL6Ia5DAsxxrKxG3xubgm/JTrBlTIuHHGABxeWWhkwQJaPOa2fTEEgW+SH2tcV2C5GSFgyfrUpRj4mDv1wrcdqnH1thmY6teRwRBetnW4jhKFl/49uVr1jO+GB9wJ45QVFOdmoGdhNjZsqzWsedm9RmvH4xGYb1i8yNVIEMSByglDS3HC0NK2HkazMLA0DwsP79nWwzjwkRWcPLoSCw7rjgsnVBrB1h4dhQCY98dmiy1U/O0JdjFix2wp5PIh65Zsr9J0R4aiWNvzDM/tMWgPQ7OHl1msWx2zI6jqHKyTh2S4VbXXu+u08iV5mWEguxDISu1yVGQJCEXwRP8H8SHrC5V5H6fhalQkYPgZwOxHLO/LktCiShdePOD/JLHtl19wvf65c8dWWI4NmfnAtVvN9Wyf5SVA4n6TsZUgixdBEI3i13Oq23oIRDskKxLCLcdrwdCGxcvH1djsyRxNLidh/dcLZ92x1EOzWHdCGXh04XDgZvcNqJDTcsN+fds0sHvLIO3eZCw796he+PjbXZg2SKvHxYVXbhp9b2WbMGbM+7vkfTHr4ypw3L3GcqOdtYvFq0NGGG9cMQ5lHYUgf74Pt0QJPYbPGI/4nii6bcKrMCeCxWMrcHx12z8skvAiCIIgWgQuNBI+WY1BY6oCkzK4XvuXORri8Pf9XI0m9neDxVwJL0IRW6yV0+KVTnkYWZaA8/8JxM3m190LsvC3S440Xu/eL1i8BJZfeHjKSv7G2PmYlAhw/vuWdTvqcY279P0Yx8KY8VFTeJmiqrzQlmhgdzWK8F6Nkm1V58gdx3H1Mf6101oLEl4EQRBEi6AEKCdhaVrdHAS0eHkZ4QzXZ0qLl93VGGBoNouX6451HjvTWl4iENEc7T8PThpRhre/2oYBXa2JJoPLUhfF5cOLSZnA8Q8APccCeVbrUV6WJuh21zVYlhsyykN4OfB1NWrLKou14xzewyMuNWDz7LaAhBdBEEQbcsnEqnYRd9IShAIJr2beaYo6XqkKqPoG+wufcVq8AgzNFuPlR0VRsDiuJ8+uwdaAwfYzq0sxs5GuNsNFC2g9Pl3grcucFi/tX7GAqr9A5h8QFp3yFPCFWex1aPeOePuq8UbmpwMSXgRBEIQbP5vUu62HYGHh4eXYV59olm3xXoNeIgdogf6YKbZ3+eTe2FEbwzF63JOdhC6CU9XJsu8mSHampXSC3eJll3IBhcOYyvT6LwZl0VEVWPaPr83h6P/6fZfcCjV9sPXcim5de3C9K24Wr77TtP8Eyjr6dL8g4UUQBEEcCNxw3IBm29agUs2lNaaXtzgwQ4dap+Bs1/xMPLJwlOf73HrUOVcURs6x2YVWkNFbPqLY6rx1G4WtJWNR9OOb2muHMGtdrpnWD9dME2KiUiQlAEBBThTrbj3G0XZM/IwkNdHVGJR2LLza78gIgiCIA5pBZXn47MbJOG5I17YeSmB+2qMJr5K89IRP2rrRLqxCUbxT84D5Oty2wssOP7wULUgRVmSHiLYIr8ZavNKllYR8YyDhRRAEQbQYuRn+WYapbuStDbd4pSu80k4PcInx2hsTXLwh/x6KrY2cOo0wEPbK9a74ZTUG3lH7lTftd2QEQRDEIUN7sU+cN1ZrulyY7R/87ozxSnNHLq62vfVCULrcvm7PZuHZ9D/LLEkJQVyNtpZBjaEdW7woxosgCIIgdBaP7YXFuvjyw17nqzli1I6oLATeaPJmWgS/+meXT+qNH/fUe35WtF/J9j6Mrh9wb/uTFu3Y4kXCiyAIgmgzmui5ah1cBIDdINVoiRDJARr2AQhWT6utMMtwON+7aGKV72ddY7wCCa+DM7iehBdBEATR9rRfzxAQ0SurC3FZdotXEM+ga82pJV8dEOqzKSFe3Eo2qmcnyF8EiN9qDuHVjicUCS+CIAiC8GPsz4FIB2CIWTg0K2KNUQrUJFuWgBm/BX74xFwYbl9B9F6YvRrTV153n1yNe1atw7xR3YFPc4EfkcKN2BwxXu3X4tV+R0YQBOGDvd8ccaDS/q09iGQBY5dYmjB365SFRxaOxLDuunswqIFl2GnAsb9u/jG2MIbFqxGfHVNZiGfPHY2QIsOsS+tzwqJ61f5Itvc6qWjHwossXgRBHJD8Y8l47I83T4V1ou2oKMzBaaN74LTR5W09lLQZ36cYj7yzEUB7dmw1Dzy4Xm1MWqOI2T/Ie52xVwFZBcDgOY3fDwkvgiCI5iUvK4w8HHxWr9nDy9CzsAlP+gcYsizhppkD23oYRAoMV2NTNxQkYzGcCYy5qGn7IeFFEARBBOGXJw1p6yEcmBRUAfu3t/UoDlqaqX5q8xRHDQLV8SIIgiCIFuSi1W26+2aLVLvgAyDs0/y5jXGr45XuFgC0vEWqHVu82u/ICIIgCKKd0+x2laI+QH635t5qk5EDNMkOxKwHgX7HAcX9Uq/bFMjiRRAEQRDEgYrpamyi8ioZBMz5Y9MHdABDFi+CIAiCIHwxLF5tPI6DARJeBEEQBNFUDnJFYjbJPsgPtBUg4UUQBEEQjaQdhxI1K1JzxXgRJLwIgiAIorEcKkIkK6y1SLK3Smp3RPPaegQpoeB6giAIgiB8OX5oKbbsrccZY8rbeij+nPc2sOXzth6FLyS8CIIgCKKRHCquRkWWcP64yrYeRmryu2v/tWPI1UgQBEEQTaTphUWJQwUSXgRBEARBEK0ECS+CIAiCIIhWgoQXQRAEQTSSQyTEi2hGSHgRBEEQBEG0EiS8CIIgCIIgWgkSXgRBEATRRA6VQqpE0yHhRRAEQRCNRDpUCnkRzUaLC69kMomhQ4fi2GOPBQCcccYZ6NmzJ6qrq1FdXY1PPvmkpYdAEARBEATRLmjxyvX33nsv+vXrhz179hjL7rrrLsyePbuld00QBEEQBNGuaFGL16ZNm7By5UqcffbZLbkbgiAIgiCIA4IWFV6XXnop7rzzTsiydTe/+MUvMHjwYPzsZz9DLBZrySEQBEEQRItDwfVEUFpMeK1YsQLFxcUYPny4ZfnSpUvxxRdf4MMPP8SOHTtwxx13uH5+2bJlGDFiBEaMGIGtW7e21DAJgiAIgiBajRYTXu+88w6WL1+O8vJynHLKKXjttdewYMECdOnSBZIkIRqNYuHChfjggw9cP79o0SKsXr0aq1evRlFRUUsNkyAIgiAIotVoMeG1dOlSbNq0CRs3bsTTTz+NCRMm4I9//CM2b94MAGCM4YUXXsDAgQNbaggEQRAE0aKM76MZBsoLs9t4JMSBQotnNdqZP38+tm7dCsYYqqur8eCDD7b2EAiCIAiiWVhwWA9MH9wVnbIjbT0U4gChVYTXuHHjMG7cOADAa6+91hq7JAiCIIgWR5IkEl1EWlDleoIgCIIgiFaChBdBEARBEEQrQcKLIAiCIAiilSDhRRAEQRAE0UqQ8CIIgiAIgmglSHgRBEEQBEG0EiS8CIIgCIIgWgkSXgRBEARBEK0ECS+CIAiCIIhWgoQXQRAEQRBEKyExxlhbDyIVhYWFKC8vb9F9bN26FUVFRS26j0MVOrctB53bloPObctA57XloHPbcqR7bjdu3Iht27a5vndACK/WYMSIEVi9enVbD+OghM5ty0HntuWgc9sy0HltOejcthzNeW7J1UgQBEEQtxurgQAACclJREFUBNFKkPAiCIIgCIJoJZQbb7zxxrYeRHth+PDhbT2EgxY6ty0HnduWg85ty0DnteWgc9tyNNe5pRgvgiAIgiCIVoJcjQRBEARBEK0ECS8AL730Evr06YPKykrcfvvtbT2cA4rvvvsO48ePR//+/TFgwADce++9AIAdO3Zg0qRJqKqqwqRJk7Bz504AAGMMF198MSorKzF48GCsWbOmLYd/QJBMJjF06FAce+yxAIANGzagpqYGlZWVmDNnDhoaGgAAsVgMc+bMQWVlJWpqarBx48Y2HHX7Z9euXZg9ezb69u2Lfv364b333qN520zcfffdGDBgAAYOHIi5c+eivr6e5m0jOfPMM1FcXIyBAwcayxozTx977DFUVVWhqqoKjz32WKsfR3vE7dwuWbIEffv2xeDBgzFr1izs2rXLeG/p0qWorKxEnz598PLLLxvL09YQ7BAnkUiwiooKtn79ehaLxdjgwYPZ2rVr23pYBww//PAD++ijjxhjjO3Zs4dVVVWxtWvXsiVLlrClS5cyxhhbunQpu/LKKxljjK1cuZJNnTqVqarK3nvvPTZq1Kg2G/uBwq9+9Ss2d+5cNn36dMYYYyeddBJ76qmnGGOMLV68mN1///2MMcbuu+8+tnjxYsYYY0899RQ7+eST22bABwinnXYa+93vfscYYywWi7GdO3fSvG0GNm3axMrLy9n+/fsZY9p8feSRR2jeNpI333yTffTRR2zAgAHGsnTn6fbt21nPnj3Z9u3b2Y4dO1jPnj3Zjh07Wv9g2hlu5/bll19m8XicMcbYlVdeaZzbtWvXssGDB7P6+nr29ddfs4qKCpZIJBqlIQ554fXuu++yyZMnG69vu+02dtttt7XhiA5sZsyYwV555RXWu3dv9sMPPzDGNHHWu3dvxhhjixYtYk8++aSxvrge4eS7775jEyZMYK+++iqbPn06U1WVFRQUGBcGcf5OnjyZvfvuu4wxxuLxOCsoKGCqqrbZ2Nszu3btYuXl5Y7zQ/O26WzatImVlZWx7du3s3g8zqZPn85eeuklmrdNYMOGDRZxkO48ffLJJ9miRYuM5fb1DmXs51bk+eefZ/PmzWOMObUBn7eN0RCHvKvx+++/R7du3YzXZWVl+P7779twRAcuGzduxMcff4yamhps2bIFXbp0AQCUlJRgy5YtAOh8p8ull16KO++8E7Ks/VS3b9+O/Px8hEIhANbzJ57bUCiEvLw8bN++vW0G3s7ZsGEDioqKsHDhQgwdOhRnn302amtrad42A6WlpbjiiivQvXt3dOnSBXl5eRg+fDjN22Yk3XlK87dxPPzwwzjmmGMANO+5PeSFF9E87Nu3DyeeeCLuuece5ObmWt6TJAmSJLXRyA5cVqxYgeLiYkoPbwESiQTWrFmD8847Dx9//DGys7MdsRk0bxvHzp078eKLL2LDhg344YcfUFtbi5deeqmth3XQQvO0Zbj11lsRCoUwf/78Zt/2IS+8SktL8d133xmvN23ahNLS0jYc0YFHPB7HiSeeiPnz5+OEE04AAHTu3BmbN28GAGzevBnFxcUA6HynwzvvvIPly5ejvLwcp5xyCl577TVccskl2LVrFxKJBADr+RPPbSKRwO7du1FQUNBm42/PlJWVoaysDDU1NQCA2bNnY82aNTRvm4FVq1ahZ8+eKCoqQjgcxgknnIB33nmH5m0zku48pfmbHo8++ihWrFiBJ554whC1zXluD3nhNXLkSKxbtw4bNmxAQ0MDnn76acyYMaOth3XAwBjDWWedhX79+uGyyy4zls+YMcPInHnssccwc+ZMY/njjz8Oxhjef/995OXlGSZzwsrSpUuxadMmbNy4EU8//TQmTJiAJ554AuPHj8dzzz0HwHlu+Tl/7rnnMGHCBHoS9qCkpATdunXDl19+CQB49dVX0b9/f5q3zUD37t3x/vvvY//+/WCMGeeW5m3zke48nTJlCl555RXs3LkTO3fuxCuvvIIpU6a05SG0W1566SXceeedWL58ObKysozlM2bMwNNPP41YLIYNGzZg3bp1GDVqVOM0RNPC0g4OVq5cyaqqqlhFRQW75ZZb2no4BxRvvfUWA8AGDRrEhgwZwoYMGcJWrlzJtm3bxiZMmMAqKyvZxIkT2fbt2xljjKmqys4//3xWUVHBBg4cyD788MM2PoIDg9dff93Ialy/fj0bOXIk69WrF5s9ezarr69njDFWV1fHZs+ezXr16sVGjhzJ1q9f35ZDbvd8/PHHbPjw4WzQoEFs5syZbMeOHTRvm4nrr7+e9enThw0YMIAtWLCA1dfX07xtJKeccgorKSlhoVCIlZaWst///veNmqcPPfQQ69WrF+vVqxd7+OGH2+pw2hVu57ZXr16srKzMuJ/xjFvGGLvllltYRUUF6927N/vrX/9qLE9XQ1DleoIgCIIgiFbikHc1EgRBEARBtBYkvAiCIAiCIFoJEl4EQRAEQRCtBAkvgiAIgiCIVoKEF0EQBEEQRCtBwosgiAMeRVFQXV1t/GevQt8UNm7ciIEDBzbb9giCOLQJtfUACIIgmkpmZiY++eSTth4GQRBESsjiRRDEQUt5eTmuvPJKDBo0CKNGjcJXX30FQLNiTZgwAYMHD8bEiRPx7bffAtCaD8+aNQtDhgzBkCFD8O677wIAkskkzjnnHAwYMACTJ09GXV1dmx0TQRAHNiS8CII44Kmrq7O4Gp955hnjvby8PPzrX//ChRdeiEsvvRQAcNFFF+H000/HZ599hvnz5+Piiy8GAFx88cUYO3YsPv30U6xZswYDBgwAAKxbtw4XXHAB1q5di/z8fPzpT39q/YMkCOKggCrXEwRxwJOTk4N9+/Y5lpeXl+O1115DRUUF4vE4SkpKsH37dhQWFmLz5s0Ih8OIx+Po0qULtm3bhqKiImzatAnRaNTYxsaNGzFp0iSsW7cOAHDHHXcgHo/j2muvbbXjIwji4IEsXgRBHNSIDZcb23xZFGKKoiCRSDR5XARBHJqQ8CII4qCGux2feeYZjB49GgAwZswYPP300wCAJ554AkceeSQAYOLEiXjggQcAaHFdu3fvboMREwRxMENZjQRBHPDwGC/O1KlTjZISO3fuxODBgxGNRvHUU08BAH77299i4cKFuOuuu1BUVIRHHnkEAHDvvfdi0aJFeOihh6AoCh544AF06dKl9Q+IIIiDForxIgjioKW8vByrV69GYWFhWw+FIAgCALkaCYIgCIIgWg2yeBEEQRAEQbQSZPEiCIIgCIJoJUh4EQRBEARBtBIkvAiCIAiCIFoJEl4EQRAEQRCtBAkvgiAIgiCIVoKEF0EQBEEQRCvx/wEBUnDhSBPYcgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAE9CAYAAADaqWzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOydeZgU1fm2n6rq7hlWFURFMCJGI4gIEcF9/VQU9xB/xiW472LUSDQGQ4yJJEZUUEGigsEVURZZ3EBkFRxg2Pd9gBmGgdmnp7ur6vuj6lSdqjrVXd0zPTPAe18XFz1d26mlz3nq3Y6k67oOgiAIgiAIIuvIjd0AgiAIgiCIwwUSXgRBEARBEA0ECS+CIAiCIIgGgoQXQRAEQRBEA0HCiyAIgiAIooEg4UUQBEEQBNFAhBq7AUE4+uij0alTp8ZuBkEQBEEQREq2bduGffv2CZcdFMKrU6dOyMvLa+xmEARBEARBpKRXr16+y8jVSBAEQRAE0UCQ8CIIgiAIgmggSHgRBEEQBEE0EAdFjBdBEARBEHUnHo+joKAA0Wi0sZtySJCbm4uOHTsiHA4H3oaEF0EQBEEcJhQUFKBVq1bo1KkTJElq7OYc1Oi6jpKSEhQUFOCkk04KvB25GgmCIAjiMCEajaJt27YkuuoBSZLQtm3btK2HJLwIgiAI4jCCRFf9kcm1JFcjQRAEQRANQklJCS6//HIAQGFhIRRFQbt27QAAixcvRiQSSbr97NmzEYlEcN5553mWjR07Fnl5eXjzzTfrv+H1CAkvgiAIgiAahLZt2yI/Px8AMGTIELRs2RJ//OMfA28/e/ZstGzZUii8DhbI1QhgfWEFPl60A7GE1thNIQiCIIjDiiVLluDiiy/GWWedhauuugp79uwBAAwfPhxdu3ZF9+7dceutt2Lbtm0YNWoUXnvtNfTo0QNz584NtP9hw4ahW7du6NatG15//XUAQFVVFfr164czzzwT3bp1w2effQYAePbZZ61jpiMI04EsXgDmb9qHF6euQb8z2iMSIi1KEARBEA2Brut4/PHHMXnyZLRr1w6fffYZnn/+ebz//vsYOnQotm7dipycHJSWluLII4/EQw89lJaVbMmSJRgzZgwWLVoEXdfRp08fXHzxxdiyZQuOP/54TJs2DQBQVlaGkpISTJw4EevWrYMkSSgtLc3KOZPwAqDIRnBcQiOLF0EQBHF48LevVmPN7vJ63WfX41vjr9edHnj92tparFq1CldccQUAQFVVtG/fHgDQvXt33H777bjxxhtx4403ZtSeefPm4aabbkKLFi0AADfffDPmzp2Lvn374umnn8af/vQnXHvttbjwwguRSCSQm5uLe++9F9deey2uvfbajI6ZCjLvwBZeqq43cksIgiAI4vBB13WcfvrpyM/PR35+PlauXIlvv/0WADBt2jQ8+uijWLp0Kc4++2wkEol6O+6pp56KpUuX4owzzsBf/vIXvPjiiwiFQli8eDH69++PqVOnom/fvvV2PB6yeIETXhoJL4IgCOLwIB3LVLbIyclBcXExFi5ciHPPPRfxeBwbNmxAly5dsHPnTlx66aW44IIL8Omnn6KyshKtWrVCeXlwK92FF16Iu+66C88++yx0XcfEiRMxbtw47N69G23atMEdd9yBI488Eu+++y4qKytRXV2Na665Bueffz46d+6clXMm4QXO1aiS8CIIgiCIhkKWZUyYMAEDBw5EWVkZEokE/vCHP+DUU0/FHXfcgbKyMui6joEDB+LII4/Eddddh/79+2Py5MkYMWIELrzwQsf+xo4di0mTJll///TTT7jrrrvQu3dvAMB9992Hnj174ptvvsEzzzwDWZYRDocxcuRIVFRU4IYbbkA0GoWu6xg2bFhWzlnS9abvX+vVqxfy8vKytv8vlxbgqfHL8eMzl+DEti2ydhyCIAiCaEzWrl2LLl26NHYzDilE1zSZbqEYL/DB9U1egxIEQRAEcRBDwgu28NJIeBEEQRAEkUVIeAEIkcWLIAiCIIgGgIQXAFmirEaCIAiCILIPCS8AIYWEF0EQBEEQ2YeEFwBFNi4DuRoJgiAIgsgmJLwAKORqJAiCIIisU1JSgh49eqBHjx447rjj0KFDB+vvWCyWdNu8vDwMHDgwreN16tQJ+/btq0uT6x0qoAqqXE8QBEEQDUHbtm2Rn58PABgyZIhnwutEIoFQSCxNevXqhV69ejVIO7MJWbxAwosgCIIgGou77roLDz30EPr06YNBgwZh8eLFOPfcc9GzZ0+cd955WL9+PQBg9uzZ1sTVQ4YMwT333INLLrkEnTt3xvDhwwMfb9u2bbjsssvQvXt3XH755dixYwcA4PPPP0e3bt1w5pln4qKLLgIArF69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", "text/plain": [ "
" ] }, "metadata": { "tags": [] - } + }, + "output_type": "display_data" } + ], + "source": [ + "# Plot Loss\n", + "fig = plt.figure(facecolor=\"w\", figsize=(10, 5))\n", + "plt.plot(loss_hist)\n", + "plt.plot(test_loss_hist)\n", + "plt.legend([\"Test Loss\", \"Train Loss\"])\n", + "plt.xlabel(\"Epoch\")\n", + "plt.ylabel(\"Loss\")\n", + "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "h7xb37iHRp8N", "pycharm": { "name": "#%% md\n" - }, - "id": "h7xb37iHRp8N" + } }, "source": [ "### 4.2 Test Set Accuracy\n", @@ -992,17 +717,28 @@ }, { "cell_type": "code", + "execution_count": 15, "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "R1ReGuNURp8N", - "outputId": "562404c5-2281-4741-cf8a-8b7119ecb839", "colab": { "base_uri": "https://localhost:8080/", "height": 0 + }, + "id": "R1ReGuNURp8N", + "outputId": "562404c5-2281-4741-cf8a-8b7119ecb839", + "pycharm": { + "name": "#%%\n" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total correctly classified test set images: 2923/10000\n", + "Test Set Accuracy: 29.23%\n" + ] + } + ], "source": [ "total = 0\n", "correct = 0\n", @@ -1033,27 +769,16 @@ "\n", "print(f\"Total correctly classified test set images: {correct}/{total}\")\n", "print(f\"Test Set Accuracy: {100 * correct / total}%\")" - ], - "execution_count": 15, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Total correctly classified test set images: 2923/10000\n", - "Test Set Accuracy: 29.23%\n" - ], - "name": "stdout" - } ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "zNJjSKATRp8N", "pycharm": { "name": "#%% md\n" - }, - "id": "zNJjSKATRp8N" + } }, "source": [ "Voila! That's it for static MNIST." @@ -1063,10 +788,10 @@ "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "2qUxjHwBRp8f", "pycharm": { "name": "#%% md\n" - }, - "id": "2qUxjHwBRp8f" + } }, "source": [ "## 5. Spiking MNIST\n", @@ -1075,29 +800,29 @@ }, { "cell_type": "code", + "execution_count": 33, "metadata": { + "id": "8K7_C-2rRp8g", "pycharm": { "name": "#%%\n" - }, - "id": "8K7_C-2rRp8g" + } }, + "outputs": [], "source": [ "from snntorch import spikegen\n", "\n", "# MNIST to spiking-MNIST\n", "spike_data, spike_targets = spikegen.rate(data_it, targets_it, num_steps=num_steps)" - ], - "execution_count": 33, - "outputs": [] + ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, + "id": "BvaNfns_Rp8h", "pycharm": { "name": "#%% md\n" - }, - "id": "BvaNfns_Rp8h" + } }, "source": [ "### 5.1 Visualiser\n", @@ -1106,22 +831,20 @@ }, { "cell_type": "code", + "execution_count": 28, "metadata": { - "pycharm": { - "name": "#%%\n" + "colab": { + "base_uri": "https://localhost:8080/" }, "id": "ll2D4jtdRp8i", "outputId": "616f69c3-e838-4503-d3aa-af41a2f903d7", - "colab": { - "base_uri": "https://localhost:8080/" + "pycharm": { + "name": "#%%\n" } }, - "source": [ - "!pip install celluloid # matplotlib animations made easy" - ], - "execution_count": 28, "outputs": [ { + "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: celluloid in /usr/local/lib/python3.7/dist-packages (0.2.0)\n", @@ -1132,118 +855,100 @@ "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->celluloid) (2.8.1)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->celluloid) (0.10.0)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.1->matplotlib->celluloid) (1.15.0)\n" - ], - "name": "stdout" + ] } + ], + "source": [ + "!pip install celluloid # matplotlib animations made easy" ] }, { "cell_type": "code", + "execution_count": 39, "metadata": { - "id": "mgpzXVbGRpm1", - "outputId": "e315266d-e073-4f2e-9d08-72dc72d91e6c", "colab": { "base_uri": "https://localhost:8080/" - } + }, + "id": "mgpzXVbGRpm1", + "outputId": "e315266d-e073-4f2e-9d08-72dc72d91e6c" }, - "source": [ - "data_it.size()" - ], - "execution_count": 39, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "torch.Size([128, 1, 32, 32])" ] }, + "execution_count": 39, "metadata": { "tags": [] }, - "execution_count": 39 + "output_type": "execute_result" } + ], + "source": [ + "data_it.size()" ] }, { "cell_type": "code", + "execution_count": 46, "metadata": { - "id": "ryIOfAa0VveY", - "outputId": "8fe6b9ab-198f-457c-c9a4-b6a3a10790e3", "colab": { "base_uri": "https://localhost:8080/", "height": 283 - } + }, + "id": "ryIOfAa0VveY", + "outputId": "8fe6b9ab-198f-457c-c9a4-b6a3a10790e3" }, - "source": [ - "fig, ax = plt.subplots()\r\n", - "ax.imshow(data_it[0, 0].cpu(), cmap='plasma')" - ], - "execution_count": 46, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "" ] }, + "execution_count": 46, "metadata": { "tags": [] }, - "execution_count": 46 + "output_type": "execute_result" }, { - "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] }, "metadata": { - "tags": [], - "needs_background": "light" - } + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.imshow(data_it[0, 0].cpu(), cmap='plasma')" ] }, { "cell_type": "code", + "execution_count": 38, "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "id": "cJQ0XUAZRp8i", - "outputId": "0920f979-23d2-4dd5-f039-8600aeeb3464", "colab": { "base_uri": "https://localhost:8080/", "height": 540 + }, + "id": "cJQ0XUAZRp8i", + "outputId": "0920f979-23d2-4dd5-f039-8600aeeb3464", + "pycharm": { + "name": "#%%\n" } }, - "source": [ - "from celluloid import Camera\n", - "from IPython.display import HTML\n", - "\n", - "# Animator\n", - "spike_data_sample = spike_data.unsqueeze(2)[:, 0, 0].cpu()\n", - "\n", - "fig, ax = plt.subplots()\n", - "camera = Camera(fig)\n", - "plt.axis('off')\n", - "\n", - "for step in range(num_steps):\n", - " im = ax.imshow(spike_data_sample[step, :, :].squeeze(0), cmap='plasma')\n", - " camera.snap()\n", - "\n", - "# interval=40 specifies 40ms delay between frames\n", - "a = camera.animate(interval=40)\n", - "HTML(a.to_html5_video())" - ], - "execution_count": 38, "outputs": [ { - "output_type": "execute_result", "data": { "text/html": [ "