{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "1af0d1e1-7b4d-4267-b336-e841303d19e7", "metadata": {}, "outputs": [], "source": [ "#You don't need to change anything in this block, although the modules need to be installed to run this notebook\n", "\n", "#We import numpy to handle vectors and some math\n", "import numpy as np\n", "\n", "#We import pandas to create a data frame of the experiment data\n", "#Such a table can later be used for plotting our results\n", "import pandas as pd\n", "\n", "# Import plotly, which is used for visualization\n", "import plotly.express as px\n", "import plotly.io as pio\n", "pio.renderers.default = 'iframe'" ] }, { "cell_type": "code", "execution_count": 2, "id": "1616842d-eb1e-454f-9d30-868f1a0c8425", "metadata": {}, "outputs": [], "source": [ "# generate N random particles in a 2d environment with a given pattern:\n", "def generate_pattern(N):\n", " return np.random.rand(N, 2)" ] }, { "cell_type": "code", "execution_count": 3, "id": "eff15957-5a55-49de-91aa-875609fc0126", "metadata": {}, "outputs": [], "source": [ "# record data into dataframe (used for plotting)\n", "def make_df(data, t, type_name):\n", " df = pd.DataFrame(data, columns=[\"x\", \"y\"])\n", " df['t'] = t\n", " df['type'] = type_name\n", " df['pid'] = range(len(data))\n", " return df" ] }, { "cell_type": "code", "execution_count": 4, "id": "e71b6798-1678-4bd4-9bba-018a2ea8ed85", "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\sin{\\left(x \\right)} + \\cos{\\left(y \\right)}$" ], "text/plain": [ "sin(x) + cos(y)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# how to calculate a gradient with sympy\n", "from sympy import symbols, diff, sin, cos, exp, sqrt\n", "\n", "# we define a function f with symbols x, and y, representing the x, and y dimension\n", "x, y = symbols('x y')\n", "f = sin(x) + cos(y)\n", "f\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "09f6b3b2-6c4f-4362-a20c-c07515560d70", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: sympy_plot_backends in /opt/conda/lib/python3.11/site-packages (3.0.0)\n", "Requirement already satisfied: packaging in /opt/conda/lib/python3.11/site-packages (from sympy_plot_backends) (23.2)\n", "Requirement already satisfied: appdirs>=1.4.4 in /opt/conda/lib/python3.11/site-packages (from sympy_plot_backends) (1.4.4)\n", "Requirement already satisfied: numpy>=1.21.1 in /opt/conda/lib/python3.11/site-packages (from sympy_plot_backends) (1.26.0)\n", "Requirement already satisfied: sympy>=1.10.1 in /opt/conda/lib/python3.11/site-packages (from sympy_plot_backends) (1.12)\n", "Requirement already satisfied: matplotlib>3.4.2 in /opt/conda/lib/python3.11/site-packages (from sympy_plot_backends) (3.8.0)\n", "Requirement already satisfied: mergedeep>=1.3.4 in /opt/conda/lib/python3.11/site-packages (from sympy_plot_backends) (1.3.4)\n", "Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib>3.4.2->sympy_plot_backends) (1.1.1)\n", "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.11/site-packages (from matplotlib>3.4.2->sympy_plot_backends) (0.12.0)\n", "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.11/site-packages (from matplotlib>3.4.2->sympy_plot_backends) (4.43.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib>3.4.2->sympy_plot_backends) (1.4.5)\n", "Requirement already satisfied: pillow>=6.2.0 in /opt/conda/lib/python3.11/site-packages (from matplotlib>3.4.2->sympy_plot_backends) (10.0.1)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib>3.4.2->sympy_plot_backends) (3.1.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.11/site-packages (from matplotlib>3.4.2->sympy_plot_backends) (2.8.2)\n", "Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.11/site-packages (from sympy>=1.10.1->sympy_plot_backends) (1.3.0)\n", "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib>3.4.2->sympy_plot_backends) (1.16.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABi90lEQVR4nO3dd3xT1f8/8FeSNulu6d6DPcsoUErLUCpDQBAEQVREBP2IA/HrwJ+C4EY/ykf0I+pHwQUiCoggKENGoRQolD0KtHQPKG262yT390fbCAKFQpOT5L6ejwcP7c3Nzevkpu27595zjkKSJAlEREREZPWUogMQERERUfNgYUdERERkI1jYEREREdkIFnZERERENoKFHREREZGNYGFHREREZCNY2BERERHZCBZ2RERERDbCTnQAS2IwGJCTkwNXV1coFArRcYiIiIggSRJKS0sRGBgIpbLxPjkWdpfJyclBSEiI6BhEREREV8nMzERwcHCj+7Cwu4yrqyuAujfOzc3NJK9hMBiwa9cuxMbG3rDqtjVybbtc2w2w7Wy7vNou13YDbLup267VahESEmKsUxrDwu4yDZdf3dzcTFrYOTs7w83NTZYffjm2Xa7tBth2tl1ebZdruwG23Vxtv5nbxOT17hMRERHZMBZ2RERERDaChR0RERGRjWBhR0RERGQjWNgRERER2QgWdkREREQ2goUdERERkY1gYUdERERkI1jYEREREdkIFnZERERENoKFHREREZGNsIjCbseOHRg5ciQCAwOhUCiwZs2aKx6XJAlz5sxBQEAAHB0dER8fj9TU1Cv2KSoqwqRJk+Dm5gYPDw9MnToVZWVlZmwFERERkVgWUdiVl5eja9eu+PTTT6/5+IIFC/Dxxx9j8eLFSEpKgrOzM4YMGYKqqirjPpMmTcKxY8ewadMmrFu3Djt27MD06dPN1QQiIiIi4exEBwCAYcOGYdiwYdd8TJIkLFy4EK+++ipGjRoFAPj222/h5+eHNWvWYMKECThx4gQ2btyIffv2oWfPngCARYsW4e6778YHH3yAwMBAs7WFiIiISBSLKOwak5aWhry8PMTHxxu3ubu7Izo6GomJiZgwYQISExPh4eFhLOoAID4+HkqlEklJSbj33nuveezq6mpUV1cbv9ZqtQAAg8EAg8HQ7G1Jv1iOFfsyUVpQi7i45j++pWt4T03x3loyubYbYNsv/6+cyLXtcm03IN+2S5KEZ39Mgae+FlFVtXB2sDfJ6zTlfbX4wi4vLw8A4Ofnd8V2Pz8/42N5eXnw9fW94nE7Ozt4enoa97mWd955B/Pmzbtq+65du+Ds7Hy70a+yJ1eHzw9Vw8dRgbt27oRCoWj217AGCQkJoiMIIdd2A2y7XMm17XJtNyC/tp8t1mPdkSpoVEBs4m5oVKb5vV5eXn7T+1p8YWdKs2fPxqxZs4xfa7VahISEIDY2Fm5ubs3+ej1rdPjm+FYUVurhFtEF3UM9m/01LJnBYEBCQgLi4uKgVFrE7Z1mIdd2A2w72y6vtsu13YB8275j/QkA6ejuq8KgAf1M1vaGK4o3w+ILO39/fwBAfn4+AgICjNvz8/PRrVs34z4FBQVXPE+n06GoqMj4/GvRaDTQaDRXbVcqlSY5OS4Oagzq4It1h3Ox/kg+osK9m/01rIGp3l9LJ9d2A2w72y4vcm03IK+2GwwSfj9Sd1UwOsDOpG1vynEt/t2PiIiAv78/tmzZYtym1WqRlJSEmJgYAEBMTAyKi4uRnJxs3Gfr1q0wGAyIjo42e+bGjIysK07XH8mFwSAJTkNERES3Yv/5S8jTVsHVwQ6dvVWi4xhZRI9dWVkZzpw5Y/w6LS0NKSkp8PT0RGhoKGbOnIk333wTbdq0QUREBF577TUEBgZi9OjRAIAOHTpg6NChmDZtGhYvXoza2lo89dRTmDBhgsWNiO3f1huOdkC+thr70osQ3dJLdCQiIiJqot8O5QAABnf0g72yWGyYy1hEj93+/fvRvXt3dO/eHQAwa9YsdO/eHXPmzAEAvPjii3j66acxffp09OrVC2VlZdi4cSMcHByMx/jhhx/Qvn17DBo0CHfffTfi4uLwxRdfCGlPYzR2KvT0q6un19Z/KIiIiMh66PQGbDiaC+DvK3GWwiJ67AYOHAhJuv5lSYVCgfnz52P+/PnX3cfT0xPLli0zRbxmFx2gws5sHTYczcPr93SCvcoi6msiIiK6CXvOFeFCWQ1aONkjppUXEq8/AYfZsaIQoIOnCp5O9igqr8HusxdFxyEiIqImaLgMO6xLgMV1zlhWGplQKRUY1qWu6/Y3Xo4lIiKyGjU6AzYeq+uiG2Fhl2EBFnbCNFyT/+NoHqp1esFpiIiI6GYknClESWUtfFw1iI6wvAGQLOwE6RnWAv5uDiit1mHbqULRcYiIiOgm/HaobtDE8C4BUCktbwUpFnaCKJUKYxcuL8cSERFZvsoaPf6svww7sqvlXYYFWNgJNbJr3Rx7W04UoKJGJzgNERERNWbryQKU1+gR3MIRPUJbiI5zTSzsBIoMdkeYlxMqa/XYfKLgxk8gIiIiYX5NyQYA3NM1EAqF5V2GBVjYCaVQKDAysq7Xbm0KL8cSERFZqpLKWuM98fd0s6xVrS7Hwk6whsux208XoKSiVnAaIiIiupY/juahRm9AOz9XtPd3Ex3nuljYCdbO3xXt/FxRq5fwx3ELmrqaiIiIjBqWAbXk3jqAhZ1FaBhZw9GxRERElqegtAq7z14AUHd/nSVjYWcBRtTfZ7f77EVcKKsWnIaIiIgut/5wLgwS0D3UAyGeTqLjNIqFnQUI93ZGZLA79AYJG47kio5DREREl/m1foDjKAvvrQNY2FmMhq7dhhmtiYiISLyMixVIySyGUgEMj2RhRzdpeP0qFHvTi5BbUik4DREREQHA2kN1c9fFtvaGj6tGcJobY2FnIQLcHdE73BMAB1EQERFZAkmSjJdhR1rBZViAhZ1FaRhCveYgCzsiIiLRTuaVIrWgDGo7JYZ29hcd56awsLMgw7sEwE6pwPFcLVLzS0XHISIikrWGuevuaOcDNwd7wWluDgs7C9LCWY2B7XwAAGvq16MjIiIi85Mkybjc56huQYLT3DwWdham4cPza0oOJEkSnIaIiEieDmRcQnZxJVw0drizva/oODeNhZ2Fie/gB2e1ClmXKpF8/pLoOERERLLUMGhicCc/ONirBKe5eSzsLIyjWoUh9Tdo8nIsERGR+en0Bqw/XDevrKUvIfZPLOws0Oj6y7HrD+eiVm8QnIaIiEhedp29iIvlNfByViO2tbfoOE3Cws4C9W3lBW8XDS5V1GLH6ULRcYiIiGSlYdDE3V0CYK+yrlLJutLKhJ1KiZFd61aiWJPCOe2IiIjMpapWjz+O5QEARnWzrsuwAAs7i9VwOXbT8TyUVesEpyEiIpKHLScKUFatQ5CHI3qEthAdp8lY2FmoyGB3RHg7o6rWgD/r/3IgIiIi01p9sG7g4qhugVAqFYLTNB0LOwulUCiMXcC8HEtERGR6ReU12HaqAABwb3frmZT4cizsLFjD5diE1EIUllYLTkNERGTb1h/Ogc4goXOQG9r4uYqOc0tY2FmwcG9ndA3xgEEC1h1mrx0REZEpNVyGHW1FS4j9Ews7Czeal2OJiIhMLv1COQ5kFEOpAO6xwtGwDVjYWbgRkYFQKRU4lFmMtAvlouMQERHZpIbVnuLa+MDX1UFwmlvHws7C+bhqEFc/6/WvXGKMiIio2UmShDX1l2HHWOmgiQYs7KzA6O51XcK/puRAkiTBaYiIiGzLwcxipF+sgJNahcGd/ETHuS0s7KzA4I7+cLRXIe1COQ5nlYiOQ0REZFMaeuuGdPKHk9pOcJrbw8LOCjhr7HBXx7q/INbwciwREVGzqdEZ8NuhugGK1jp33eVY2FmJhsuxvx3KhU5vEJyGiIjINuw4XYhLFbXwcdWgbysv0XFuGws7K9GvjQ+8nNW4UFaNnWcuiI5DRERkE1bXXwm7p2sg7FTWXxZZfwtkwl6lNM6rs+oAL8cSERHdLm1VLTYdzwdgG5dhARZ2VmVsj2AAwJ/H8qCtqhWchoiIyLptPJKHGp0BbXxd0CnQTXScZsHCzop0CnRDWz8XVOsM2HAkV3QcIiIiq7bqYBYAYHT3ICgUCsFpmgcLOyuiUCgwpr7X7hdejiUiIrpl2cWV2HOuCEBdYWcrWNhZmdHdgqBQAHvTipBZVCE6DhERkVVaW78Ge3SEJ4I8HAWnaT4s7KyMv7uDcYmx1QfZa0dERNRUkiRhdf1l2DE9bKe3DmBhZ5UaPoSrDmRxiTEiIqImOp6rxen8MqjtlBjaOUB0nGbFws4K1S15okL6xQocyLgkOg4REZFVWV1/n3p8B1+4O9oLTtO8WNhZISe1HYZ29gfAQRRERERNodMbsKb+/rrR3WzrMizAws5qNcxpt+5QDqpq9YLTEBERWYedqRdwoawaXs5q3NHeV3ScZsfCzkr1aemFAHcHaKt02HqyQHQcIiIiq/Bzct2giXu6BcLeBpYQ+yfba5FMqJQK47w7qw5kCU5DRERk+Uoq/l5C7L6oYMFpTIOFnRUbU1/YbTtViAtl1YLTEBERWba1h3NQozegvb8rOgW6i45jEizsrFgbP1dEBrtDZ5Dw26Ec0XGIiIgs2i/1l2FttbcOYGFn9cYYL8dydCwREdH1nCkoQ0pmMVRKBUbZ4GjYBizsrNzIroGwUypwJLsEp/NLRcchIiKySL/U348+sK0PfFw1gtOYDgs7K+flosHAdnXDtdlrR0REdDW9QTJOSmzLl2EBFnY2YWz9EmNrDmZDb+ASY0RERJfbdeYC8rRVcHe0x50dbG/uusuxsLMBd3bwhZuDHfK0Vdh99oLoOERERBal4TLsPV0DobFTCU5jWizsbIDGToWRXQMB/D3xIhEREQHaqlpsPJoHwPYvwwIs7GzGuJ4hAICNR/NQUlkrOA0REZFl+P1wLqp1BrT2dUFksG3OXXc5FnY2omuwO9r4uqBaZ8C6w5zTjoiICPj7StZ9UcFQKBSC05geCzsboVAoMK5nXRfzyv28HEtERJR+oRz7z1+CUgHc29125667HAs7GzK6exBUSgVSMotxpoBz2hERkbw1rKUe18YHfm4OgtOYBws7G+Lr6oA72vkAYK8dERHJm8Eg4ReZzF13Oaso7PR6PV577TVERETA0dERrVq1whtvvAFJ+nvONkmSMGfOHAQEBMDR0RHx8fFITU0VmFqM+6LqBlGsOpgNnd4gOA0REZEYe9IuIru4Eq4Odhjc0U90HLOxisLuvffew2effYZPPvkEJ06cwHvvvYcFCxZg0aJFxn0WLFiAjz/+GIsXL0ZSUhKcnZ0xZMgQVFVVCUxufne294WXsxqFpdXYfrpQdBwiIiIhGgZNjIgMhIO9bc9ddzmrKOx2796NUaNGYfjw4QgPD8d9992HwYMHY+/evQDqeusWLlyIV199FaNGjUJkZCS+/fZb5OTkYM2aNWLDm5naTonR9TeI8nIsERHJUXm17rK56+QxaKKBnegAN6Nv37744osvcPr0abRt2xaHDh1CQkICPvzwQwBAWloa8vLyEB8fb3yOu7s7oqOjkZiYiAkTJlzzuNXV1aiurjZ+rdVqAQAGgwEGg2kuYzYc11THB+qWGPsqIQ2bT+SjUFsJLxfLWOzYHG23RHJtN8C2X/5fOZFr2+XabsDy2r7ucA4qavQI93JCt2B3k+YyR9ubcmyFdPmNahbKYDDglVdewYIFC6BSqaDX6/HWW29h9uzZAOp69GJjY5GTk4OAgADj88aPHw+FQoEVK1Zc87ivv/465s2bd9X2devWwdnZ2TSNMZPXd1ciXWvAxPZqDAm3Fx2HiIjIbN5OqsTpSwbc18YeI1qpRce5beXl5RgxYgRKSkrg5ubW6L5W0WP3008/4YcffsCyZcvQqVMnpKSkYObMmQgMDMTkyZNv+bizZ8/GrFmzjF9rtVqEhIQgNjb2hm/crTIYDEhISEBcXByUStNdCX/E/jxe/+04DhZr8Ga/WIuYlNFcbbc0cm03wLaz7fJqu1zbDVhW288VluH0xp1QKoDnx8aZfJoTc7S94YrizbCKwu6FF17Ayy+/bLyk2qVLF5w/fx7vvPMOJk+eDH9/fwBAfn7+FT12+fn56Nat23WPq9FooNFcfZlSqVSa/INp6tcY3T0Ib/9+EifzSnEirwydgyxnGRVzvL+WSK7tBth2tl1e5NpuwDLa/vOButWXBrbzRYCHk9le15Rtb8pxreKTV1FRcVWjVCqV8ZpzREQE/P39sWXLFuPjWq0WSUlJiImJMWtWS+HhpMZdneqGd6/cnyk4DRERkenp9Ab8Uj8p8fj6NdTlxioKu5EjR+Ktt97C+vXrkZ6ejtWrV+PDDz/EvffeC6BuOa2ZM2fizTffxNq1a3HkyBE8/PDDCAwMxOjRo8WGF2hc/YSMvx7KQbVOLzgNERGRaW07VYjC0mp4OatxZ3tf0XGEsIpLsYsWLcJrr72GJ598EgUFBQgMDMTjjz+OOXPmGPd58cUXUV5ejunTp6O4uBhxcXHYuHEjHBzksYTItfRr4wN/Nwfkaauw+XgBhkcG3PhJREREVmpF/RWqMT2CoLazir6rZmcVrXZ1dcXChQtx/vx5VFZW4uzZs3jzzTehVv890kWhUGD+/PnIy8tDVVUVNm/ejLZt2wpMLZ5KqcDY+vl7VibzciwREdmugtIqbD1ZAEC+l2EBKyns6NY1LDG243Qh8krktQoHERHJx+oD2dAbJHQP9UAbP1fRcYRhYWfjIryd0Su8BQwSjDeUEhER2RJJkoyXYe+XcW8dwMJOFsbV99r9nJwFK5iPmoiIqEkOZFzCucJyONqrZH8/OQs7Gbg7MgBOahXSLpRjX/ol0XGIiIia1Yp9db11wyMD4Oog79WWWNjJgIvGDiMjAwEAP+7NEJyGiIio+ZRX67DucC4AeQ+aaMDCTiYm9K77sK8/kouSylrBaYiIiJrH+sO5qKjRo2X9PeVyx8JOJrqFeKCdnyuqdQasTckWHYeIiKhZ/FQ/aGJczxCLWBddNBZ2MqFQKHB/r7peu+V7MzmIgoiIrN6ZgjLsP3+pbt7WHkGi41gEFnYy0jAT9/FcLY5ma0XHISIiui0Nk+/f0c4Hvm7yXWnqcizsZMTDSY2hnfwBAMv3cRAFERFZr1q9Ab8k191aNI6DJoxY2MlMwyCKtSk5qKjRCU5DRER0a/46WYALZdXwdtHgzva+ouNYDBZ2MtMnwgthXk4oq9Zhff3wcCIiImvzY/3cdWN7BMFexXKmAd8JmVEqFcZ5fhq+KYiIiKxJdnEltp0qAABM6B0qOI1lYWEnQ+OigqFSKpB8/hJS80tFxyEiImqSn/ZlwiABMS29EOHtLDqORWFhJ0O+bg7G+xFWsNeOiIisiE5vMM5dNzGavXX/xMJOpibWD6L45UAWqnV6wWmIiIhuzvbThcgtqUILJ3sM6eQnOo7FYWEnU/3b+MDfzQGXKmqx6Xi+6DhEREQ3Zfneut66+6KCobFTCU5jeVjYyZSdSolxPYMB8HIsERFZh7ySKmw9WdcZcX8vXoa9FhZ2Mja+ZwgUCmBn6gVkFlWIjkNERNSon/bXDZroHeGJ1r4uouNYJBZ2Mhbi6YS41t4A/l5EmYiIyBLpDZLxCtMDnOLkuljYydyE+q7sn/ZnQqc3CE5DRER0bTtSC5FdXAl3R3sM7ewvOo7FYmEnc3d19IOXsxr52mpsPVkgOg4REdE1LU+qW+N8TI8gONhz0MT1sLCTObWdEvfVD6L4of6bhoiIyJIUaKuwpb7zYSIvwzaKhR0Z71XYkVrIQRRERGRxViZnQW+Q0DOsBdr6uYqOY9FY2BHCvJzRr403JAlYvpe9dkREZDkMBsn4u4m9dTfGwo4AAJOiwwDUDaKo0XEQBRERWYaEMxeQdakSrg52uLtLgOg4Fo+FHQEABnXwha+rBhfKavDn8TzRcYiIiAD8fSVpTPcgOKo5aOJGWNgRAMBepcSEXnXrxy7jIAoiIrIAhaXVxmUvJ0bzMuzNYGFHRvf3DoVSAew+exFnC8tExyEiIpn7aX8mdAYJ3UI80N7fTXQcq8DCjoyCPBxxRztfAH/PF0RERCSC3iAZryBNYm/dTWNhR1eY1Kfum+fnA1moqtULTkNERHK17VSBcaWJkV0DRcexGizs6AoD2voiyMMRxRW12HA0V3QcIiKSqe/3nAcAjIsK5koTTcDCjq6gUiqMgyh+2MPLsUREZH6ZRRXYdroQADCpT5jgNNaFhR1d5f5eIVApFdh//hJO5ZWKjkNERDKzbG8GJAmIa+2NCG9n0XGsCgs7uoqvmwMGd/QDACxLOi84DRERyUm1To8V+zIBAA+yt67JWNjRNT1QPwJp1YFsVNToBKchIiK52Hg0D0XlNfB3c0B8B1/RcawOCzu6pthW3gjzckJptQ6/HcoRHYeIiGSiYdDEhN4hsFOxTGkqvmN0TUqlAg/UL7b8A+e0IyIiMziZp8W+9EtQKRWY2Jtz190KFnZ0XfdFBUOtUuJwVgkOZRaLjkNERDauYTaGwR394OfmIDiNdWJhR9fl5aLB8MgAAMC3iRxEQUREplNWrcOqA1kAOGjidrCwo0Y9FFP3zfXb4RwUldcITkNERLZqzcFslNfo0dLbGX1beYmOY7VY2FGjuod4oEuQO2p0BuPwcyIiouYkSZJx0MSkPmFQKBSCE1kvFnbUKIVCYey1+37PeegNkuBERERkaw5kXMLJvFI42CtxX49g0XGsGgs7uqF7ugbCw8ke2cWV2HqyQHQcIiKyMd/V38c9MjIQ7k72gtNYNxZ2dEMO9irc37Nu/dhvE9PFhiEiIptysawavx/JA8BBE82BhR3dlAf7hEGhAHamXsC5wjLRcYiIyEb8tD8LNXoDugS5o2uIh+g4Vo+FHd2UEE8n3NmubmmX7/Zw6hMiIrp9Or3BOGji4Rj21jUHFnZ00xoGUfycnIXyaq4fS0REt2fziQJkF1fC01mNkV0DRcexCSzs6Kb1b+ODcC8nlFbpsCYlW3QcIiKyct/sTgcATOgVAgd7ldgwNoKFHd00pVJhvLH1u8TzkCROfUJERLfmVF4pEs9dhOqy3y10+1jYUZOMiwqBg70SJ/NKsS/9kug4RERkpb6pn2VhcEc/BHo4ig1jQ1jYUZO4O9ljdLcgAH9/UxIRETVFSUUtVh+ou6Vnct9wsWFsDAs7arKGQRR/HM1DgbZKcBoiIrI2K5MzUVmrR3t/V0RHeIqOY1NY2FGTdQp0R8+wFtAZJCzbmyE6DhERWRG9QcK3iQ1TnIRzXdhmxsKObklDr92ypAzU6AyC0xARkbXYdqoAGUUVcHOww+junOKkubGwo1syrHMAfFw1KCitxoajuaLjEBGRlVhaP8XJ/b1C4KS2ExvGBrGwo1uitlPiwei6Xruvd6WLDUNERFbhbGEZdqZegEIBPNQnXHQcm8TCjm7ZA9GhUKuUOJRZjAMZnPqEiIga9219b92g9r4I9XISG8ZGsbCjW+bjqjEuAbOEvXZERNSI0qpa/JycBYBTnJgSCzu6LVNiwwEAG47kIq+EU58QEdG1/ZKchfIaPVr5OCOutbfoODaLhR3dls5B7ugd4QmdQcJ3e9JFxyEiIgtkuGyKk8l9OcWJKbGwo9v2aH2v3bKkDFTV6sWGISIii5Nw5gLOXSiHi8YOY3oEi45j01jY0W27q6M/gjwccamiFmsOZouOQ0REFuarhDQAwH1RwXDRcIoTU7Kawi47OxsPPvggvLy84OjoiC5dumD//v3GxyVJwpw5cxAQEABHR0fEx8cjNTVVYGL5UCkVmNy3buqTJbvSIUmS4ERERGQpzhSUYvvpQigUf9+XTaZjFYXdpUuXEBsbC3t7e2zYsAHHjx/Hv//9b7Ro0cK4z4IFC/Dxxx9j8eLFSEpKgrOzM4YMGYKqKt7Qbw739wyFo70Kp/JLkXj2oug4RERkIRrmOr2rgx/CvJzFhpEBq+gPfe+99xASEoIlS5YYt0VERBj/X5IkLFy4EK+++ipGjRoFAPj222/h5+eHNWvWYMKECWbPLDfuTvYYGxWE7/dk4Otd6ejLEU9ERLJ3qbwGqw7UTXEyNS7iBntTc7CKwm7t2rUYMmQIxo0bh+3btyMoKAhPPvkkpk2bBgBIS0tDXl4e4uPjjc9xd3dHdHQ0EhMTr1vYVVdXo7q62vi1VqsFABgMBhgMpln/tOG4pjq+SJP7hOH7PRnYcjIfaYWlV/1lZsttb4xc2w2w7Zf/V07k2na5thu4ftu/TzqPqloDOge6oWeYh02+N+Y47005tkKyghuiHBwcAACzZs3CuHHjsG/fPjz77LNYvHgxJk+ejN27dyM2NhY5OTkICAgwPm/8+PFQKBRYsWLFNY/7+uuvY968eVdtX7duHZyd2V18K/69vwpHLugxOMwOD3TQiI5DRESC6AwS/m97JYqrJUyP1KBvoFX0JVmk8vJyjBgxAiUlJXBzc2t0X6t4lw0GA3r27Im3334bANC9e3ccPXrUWNjdqtmzZ2PWrFnGr7VaLUJCQhAbG3vDN+5WGQwGJCQkIC4uDkqlVdzi2CSSfyGmLN2P3XkS3p8cA1cHe+Njtt7265FruwG2nW2XV9vl2m7g2m1fczAbxdWH4euqwaz7BkJtZ5vviTnOe8MVxZthFYVdQEAAOnbseMW2Dh064JdffgEA+Pv7AwDy8/Ov6LHLz89Ht27drntcjUYDjebqXiWlUmnyb0pzvIYIA9r6oqWPM84VlmPVwRxMib36ngpbbfuNyLXdANvOtsuLXNsN/N12SZLwdf26sA/HhMFBbRXlxm0x5XlvynGt4pMXGxuLU6dOXbHt9OnTCAurm2IjIiIC/v7+2LJli/FxrVaLpKQkxMTEmDWr3CmVCkypXwNw6e50GAwWf6WfiIia2d60IhzN1kJjp8QD0WGi48iKVRR2zz33HPbs2YO3334bZ86cwbJly/DFF19gxowZAACFQoGZM2fizTffxNq1a3HkyBE8/PDDCAwMxOjRo8WGl6ExPYLh5mCH8xcrsPlEvug4RERkZg0TEo/pEQxPZ7XgNPJiFYVdr169sHr1aixfvhydO3fGG2+8gYULF2LSpEnGfV588UU8/fTTmD59Onr16oWysjJs3LjROPCCzMdZY2f8C+1/O9MEpyEiInM6f7Ecm+r/qJ8aFy42jAxZzUXvESNGYMSIEdd9XKFQYP78+Zg/f74ZU9H1PNI3HP/beQ5704uQklmMbiEeoiMREZEZ1K1ABAxo64PWvq6i48iOVfTYkfXxd3fAPd0CAQBf7jwnOA0REZmDtqoWK/dnAuCExKKwsCOTeSyuJQBgw5FcZBZVCE5DRESm9tP+LJTX6NHG1wX92nAFIhFY2JHJdAx0Q1xrbxikuq55IiKyXXqDhG92nwcAPBoXAYVCITiRPLGwI5Oa1r+u127FvgxoK2sFpyEiIlM5UKBHdnElPJ3VuLd7kOg4ssXCjkyqfxtvtPNzRXmNHsv3ZYqOQ0REJiBJEjak1f3xPik6FA72KsGJ5IuFHZmUQqHA1H51N9B+szsdOk5YTERkc/alX8K5EgPUdko8HBMuOo6ssbAjkxvVLRA+rhrkaauRlKsTHYeIiJrZF/WzH4ztHgQf16uX6iTzYWFHJqexU+GR+mXGNqbrIEnstSMishWp+aXYerIQCsB4hYbEYWFHZjEpOhSO9ipklhqw++xF0XGIiKiZNMxV2t1XhZbezoLTEAs7MgsPJzXui6obJfW/BC4zRkRkCwq0VVhzMAcAcHeEveA0BLCwIzN6NDYcCgDbT1/A6fxS0XGIiOg2Ldmdjhq9AVFhLdC6BUfCWgIWdmQ2YV7O6OFX943/Py4zRkRk1cqqdfh+T92ExNN5b53FYGFHZjU0vK6rfs3BHBRoqwSnISKiW/Xj3gyUVunQ0scZg9r7io5D9VjYkVm1aaFCj1AP1OgN+JrLjBERWaVavQFf198vPa1fSyiVXD7MUrCwI7N7YkDdMmM/7DkPbRWXGSMisjbrD+cip6QK3i4aLh9mYVjYkdnd2c4XbXxdUFqtww97MkTHISKiJpAkCZ/vqLtP+pG+YVw+zMKwsCOzUyoVeHxAKwDAVwlpqKrVC05EREQ3K+HMBZzI1cJJrcKDfcJEx6F/YGFHQtzTNRCB7g64UFaNVQeyRcchIqKb9EV9b934niHwcFILTkP/xMKOhFDbKTG1X929dp/vOAu9gcuMERFZuqPZJdiZegEqpQJT4zjFiSViYUfCTOgVAg8ne5y/WIENR3NFxyEiohv477YzAICRkQEI8XQSnIau5bYKu9raWmRmZuLUqVMoKipqrkwkE84aOzwcEw4AWLz9LCSJvXZERJbqbGEZNhzNAwD8a2BrwWnoeppc2JWWluKzzz7DgAED4ObmhvDwcHTo0AE+Pj4ICwvDtGnTsG/fPlNkJRv0SN9wONgrcTRbi4QzF0THISKi6/h8+1lIEhDfwQ/t/F1Fx6HraFJh9+GHHyI8PBxLlixBfHw81qxZg5SUFJw+fRqJiYmYO3cudDodBg8ejKFDhyI1NdVUuclGeDqrMaFXKIC6XjsiIrI8OcWVWH2wbqDbk3e0EpyGGmPXlJ337duHHTt2oFOnTtd8vHfv3nj00UexePFiLFmyBDt37kSbNm2aJSjZrsf6ReC7Peex68xFHMosRtcQD9GRiIjoMl/uPIdavYQ+LT3RI7SF6DjUiCb12C1fvtxY1JWWll53P41GgyeeeAKPPvro7aUjWQhu4YRRXQMBsNeOiMjSFJXX4Me9mQCAJ3lvncW75cET/fr1Q15eXnNmIRlrmLB447E8nCssE5yGiIgaLN2VhspaPboEuaNfG2/RcegGbrmw6969O6Kjo3Hy5MkrtqekpODuu+++7WAkL+38XTGovS8kCfh8+znRcYiICEBZtQ5Ld6cDAJ4c2AoKhUJsILqhWy7slixZgkceeQRxcXFISEjA6dOnMX78eERFRUGl4rpx1HT/GljXa7fqYBayiysFpyEioh/2nIe2SoeWPs4Y0slfdBy6CU0aPPFP8+bNg0ajwV133QW9Xo9BgwYhMTERvXv3bq58JCM9wz3Rp6Un9pwrwhfbz2LeqM6iIxERyVZVrR7/S0gDADwxoBWUSvbWWYNb7rHLz8/Hs88+izfffBMdO3aEvb09HnnkERZ1dFueubNuFPXyfZkoKK0SnIaISL5+OZCFwtJqBLo7YHS3INFx6CbdcmEXERGBHTt2YOXKlUhOTsYvv/yC6dOn4/3332/OfCQzMa280CPUAzU6A/63M010HCIiWdLpDcb7naf1bwm1HVcgtRa3fKa+/vprHDx4EMOHDwcADB06FH/99Rc++ugjzJgxo9kCkrwoFAo8Xd9r9/2e8ygqrxGciIhIftYfyUVGUcUVk8iTdbjlwm7ChAlXbevRowd2796NrVu33lYokreB7XzQKdANFTV6LNnFXjsiInMyGCR8svUMAGBK33A4qjkg0po0e99qeHg4du/e3dyHJRmp67WrmwRz6a50lFTWCk5ERCQfG4/lIbWgDK4OdpgcGy46DjVRkwq7jIyMm9qvRYu65Uays7ObnogIwOCO/mjj64LSah2+S0wXHYeISBYMBgkfb6lb5/3R2Ai4OdgLTkRN1aTCrlevXnj88cexb9++6+5TUlKCL7/8Ep07d8Yvv/xy2wFJnpRKBZ6q77X7KiEN5dU6wYmIiGzfphP5OJlXCheNHR6NjRAdh25Bk+axGz58OFxcXHDXXXfBwcEBUVFRCAwMhIODAy5duoTjx4/j2LFj6NGjBxYsWMAVKOi2DO8SgI82nUb6xQosS8rAtP4tRUciIrJZkvR3b90jfcPh7sTeOmvUpB6777//Hi+++CJycnJQWlqKgIAAXLhwAampdR+ESZMmITk5GYmJiSzq6LbZqZTGBae/2HkOVbV6wYmIiGzXX6cKcCxHCye1ClPj2FtnrZrUYxcYGIiUlBQMGTIElZWVePvtt+Hr62uqbES4t0cQ/rMlFdnFlfhpfyYejgkXHYmIyOZIkoT/bKkbCftwTDhaOKsFJ6Jb1aQeu+effx4jR45Ev379oFAo8MMPP2Dfvn2orOS6nmQa9iolnqhfQ3bxtrOo0RkEJyIisj07Ui/gUGYxHOyVeKwfe+usWZMKu6effhr79+/H0KFDIUkSPv30U8TExMDNzQ0dOnTAhAkT8O6772LDhg2myksyNC4qGL6uGuSUVOHn5CzRcYiIbIokSfjP5tMAgAejw+DtohGciG5Hk+exi4yMxP/7f/8PrVq1wp49e1BaWoqEhATMnDkTLVq0wK+//orx48ebIivJlIO9Cv+q77X79K8z7LUjImpGu89exIGMYmjslJjOQWpWr0n32F2uYcAEAERHRyM6Otr4tSRJt5eK6B8m9g7FZ9vOGu+1e7BPmOhIREQ2oWEk7MTeofB1cxCchm6XSVb1VSgUpjgsyZiDvQpPXtZrV63jCFkiotu159xFJKUVQa1S4okBrUTHoWZgksKOyBQm9A6Fv5sDckuq8NO+TNFxiIis3qKtdb119/cKgb87e+tsAQs7shoO9io8eUdDr91Z9toREd2GvWlF2HXmIuxVCuPsA2T9WNiRVRnfMwT+bg7I01ZhBXvtiIhuiSRJ+PefpwDU/VwN8nAUnIiaCws7sioO9irMuOPve+24GgURUdMlnq2/t85OaVyXm2wDCzuyOuN7hSDQ3QH52mr8uDdDdBwiIqsiSRL+valu3roHeociwJ29dbaEhR1ZHY2dCk/eUfcX5n+3nWWvHRFRE2w/XYjk85egsVMaZxsg28HCjqzS+J51vXYFpdVYzl47IqKbIkkSPqzvrXs4Jozz1tkgFnZkldR2Ssy4k712RERNsflEAQ5nlcBJreK8dTaKhR1ZrXFRdSO5Ckur8UMSe+2IiBpjMPzdWze5bzi8uCasTWJhR1br8tFcn207g/JqneBERESW649jeTiRq4WLxg7T+3FNWFvFwo6s2n1RwQj1dMKFshos3Z0uOg4RkUXSGyR8tLmut+7RuAi0cFYLTkSmwsKOrJq9SolZd7UFACzefhYlFbWCExERWZ51h3NwOr8Mbg52mBoXIToOmRALO7J6I7sGop2fK0qrdPhi51nRcYiILIpOb8B/NtetCTutX0u4O9oLTkSmxMKOrJ5KqcDzg+t67b5OSEdhabXgREREluPXlBycu1COFk72mMLeOpvHwo5swl0d/dA1xAOVtXp8+tcZ0XGIiCxCtU5vvLfu8QGt4KKxE5yITI2FHdkEhUKBF4e0AwAsS8pA1qUKwYmIiMRbnpSBrEuV8HXVYHJMuOg4ZAYs7MhmxLb2Rt9WXqjRG/DxllTRcYiIhCqr1mHR1rorGM/Gt4GjWiU4EZkDCzuyKf9X32v3c3IWzhaWCU5DRCTO1wlpuFheg3AvJ4zvGSI6DpkJCzuyKT1CWyC+gx8MEowzrBMRyU1ReQ2+2HEOAPD84HawV/HXvVxY5Zl+9913oVAoMHPmTOO2qqoqzJgxA15eXnBxccHYsWORn58vLiQJ8/zgtlAogPWHc3E0u0R0HCIis/vvX2dQVq1Dp0A3DO8SIDoOmZHVFXb79u3D559/jsjIyCu2P/fcc/jtt9+wcuVKbN++HTk5ORgzZoyglCRShwA33NM1EADw7z9PCU5DRGRe2cWV+DbxPADgxaHtoVQqBCcic7Kqwq6srAyTJk3Cl19+iRYtWhi3l5SU4KuvvsKHH36IO++8E1FRUViyZAl2796NPXv2CExMojwX3xYqpQJ/nSrE3rQi0XGIiMxm4abTqNEb0KelJ/q38RYdh8zMqia0mTFjBoYPH474+Hi8+eabxu3Jycmora1FfHy8cVv79u0RGhqKxMRE9OnT55rHq66uRnX135PZarVaAIDBYIDBYDBJGxqOa6rjWzJztj3U0xHjewZj+d5MvPP7Cfz8RB8oFGL+auU5Z9vlRq5tt4R2p+aX4pcDWQCAFwa3hSRJkCTJ5K9rCW0XxRxtb8qxraaw+/HHH3HgwAHs27fvqsfy8vKgVqvh4eFxxXY/Pz/k5eVd95jvvPMO5s2bd9X2Xbt2wdnZ+bYzNyYhIcGkx7dk5mp7tLMBq1TAwcxifLjyL/TyF/tx5zmXJ7ZdfkS2e9HBKhgkIMpPhdL0I9iRbt7Xl+s5B0zb9vLy8pve1yoKu8zMTDz77LPYtGkTHBwcmu24s2fPxqxZs4xfa7VahISEIDY2Fm5ubs32OpczGAxISEhAXFwclEqruhJ+20S0/awiFYu2nsH6TBWeGRsnZGQYzznbzrbLg+h2p2QWI3ljIpQK4O0JMWjj52q21xbddpHM0faGK4o3wyoKu+TkZBQUFKBHjx7GbXq9Hjt27MAnn3yCP/74AzU1NSguLr6i1y4/Px/+/v7XPa5Go4FGo7lqu1KpNPkH0xyvYanM2fbHB7TC8r0ZSL9YgZ/2Z+EhgTOv85yz7XIj17aLaLckSVjwR91gsbE9gtEuwN2sr99AruccMG3bm3Jcq3j3Bw0ahCNHjiAlJcX4r2fPnpg0aZLx/+3t7bFlyxbjc06dOoWMjAzExMQITE6iuWjs8Gx8WwDAws2pKKvWCU5ERNT8tp0uxJ5zRVCrlJh5V1vRcUggq+ixc3V1RefOna/Y5uzsDC8vL+P2qVOnYtasWfD09ISbmxuefvppxMTEXHfgBMnHhF4hWJKQhnMXyvHF9rOYNbid6EhERM1Gpzfg7fUnAACT+4YhyMNRcCISySp67G7GRx99hBEjRmDs2LHo378//P39sWrVKtGxyALYq5R4cWhdMfflzjQUaKsEJyIiaj4rk7OQWlAGd0d7PHVHG9FxSDCr6LG7lm3btl3xtYODAz799FN8+umnYgKRRRvSyR89Qj1wIKMYH21OxTtjuoiORER028qrdcblE58Z1AbuTvaCE5FoNtNjR9QYhUKB2Xd3AACs2JeBMwWlghMREd2+L3acQ2FpNUI9nfBQnzDRccgCsLAj2egV7om7OvrBIAHvbeRSY0Rk3Qq0VfhixzkAwEtD20Ntx1/pxMKOZOaloe2hUiqw6Xg+lxojIqv24abTqKzVo3uoB+7ucv2pvUheWNiRrLT2dcH9vUIAAG/9fgIGg+mX2iEiam6n8krx0/5MAMCrwzsIWzKRLA8LO5KdmfFt4KRW4VBmMX47nCM6DhFRk72z4QQMEjCssz+iwjxFxyELwsKOZMfX1QFPDmwFAHh3w0lU1ugFJyIiunk7Uwux7VQh7JQKvDS0veg4ZGFY2JEsPdavJYI8HJFbUoUvd54THYeI6KboDRLe/v0kAODBPmEI93YWnIgsDQs7kiUHexVeGlb3l+5n284ir4STFhOR5fs5ORMncrVwdbDDM4M4GTFdjYUdydbIyAD0CPVAZa0e7//B6U+IyLKVVtUaf1Y9O6gNPJ3VghORJWJhR7KlUCgwZ2QnAMAvB7JwOKtYbCAiokZ8svUMLpTVoKW3Mx6OCRcdhywUCzuStW4hHhjdLRAA8Ma645AkTn9CRJYn7UI5vt6VBgB4dUQHTkZM18VPBsnei0Pbw8FeiX3pl/D7kTzRcYiIrvLW+hOo1Uvo39YHd7TzFR2HLBgLO5K9QA9HTO9fN/3JOxtOoKqW058QkeXYmVqIzSfyoVIqMGcEJyOmxrGwIwLwxICW8HPTIOtSpfFyBxGRaDq9AW+sOw4AeKhPGFr7ugpORJaOhR0RACe1HV4cUjf9yadbzyBfy+lPiEi8ZXszcDq/DC2c7PFcfFvRccgKsLAjqndv9yB0C/FAeY0e7/x+QnQcIpK54ooafLjpNABg1l1t4e5kLzgRWQMWdkT1lEoF5o/qBIUCWJOSg71pRaIjEZGMLdyciuKKWrTzc8XE3qGi45CVYGFHdJnIYA9M6BUCAJi79hj0Bk5/QkTmdzq/FN/tOQ8AmDOyI+xU/HVNN4efFKJ/eGFIe7g72uNErhbLks6LjkNEMiNJEl5bcxR6g4TBHf0Q29pbdCSyIizsiP7B01mN5wfX3aT8wZ+nUVReIzgREcnJ2kM5SEorgoO9Eq+N6Cg6DlkZFnZE1/BA71B0CHBDSWUt15ElIrMprarFW+vrBm/NGNgaIZ5OghORtWFhR3QNdiol5o+qW0f2x30ZXEeWiMziP5tTUVBajXAvJ0zr31J0HLJCLOyIrqNXuCdGdwuEJNUNpDBwIAURmdCpvFIs2Z0OAHj9nk5wsFeJDURWiYUdUSNm390BzmoVDmYU45cDWaLjEJGNkiQJc36tGzAxpJMfBnI9WLpFLOyIGuHn5oBnBrUBALy74SRKKmoFJyIiW8QBE9RcWNgR3cCU2Ai08XXBxfIavPfHSdFxiMjGXD5g4qk7WiO4BQdM0K1jYUd0A2o7Jd4c3RkAsCwpA8nnLwlORES2hAMmqDmxsCO6CdEtvTAuKhgA8P9WH0Gt3iA4ERHZgpN52isGTGjsOGCCbg8LO6KbNPvuDvBwssfJvFIs3ZUuOg4RWTmDQcIrq45Ab5AwtJM/B0xQs2BhR3STPJ3VeGVYBwDAR5tPI7u4UnAiIrJmy/Zm4EBGMVw0dnj9nk6i45CNYGFH1AT3RQWjV3gLVNToMW/tMdFxiMhKFWir8N7GusFY/ze4LfzdHQQnIlvBwo6oCZRKBd4c3QV2SgX+PJ6PTcfzRUciIis0b91xlFbp0DXYHQ/FhIuOQzaEhR1RE7Xzd8Vj/epGrr2+9hgqanSCExGRNfnrZAHWH86FSqnA22O6QKVUiI5ENoSFHdEteHZQGwS3cER2cSUWbk4VHYeIrERFjQ6vrjkKAHg0NhydAt0FJyJbw8KO6BY4qlWYP6ruZuevEtJwNLtEcCIisgb/2ZyK7OJKBHk44rm72oqOQzaIhR3RLbqzvR+GRwZAb5Dw4s+HObcdETXqWE4J/peQBgCYP6oTnNR2ghORLWJhR3QbXh/ZCe6O9jieq8WXO8+JjkNEFkpvkPDK6qPQGyTc3cUfgzr4iY5ENoqFHdFt8HHVGBfsXrg5FecKywQnIiJL9M3udBzKLIarxg5zR3LOOjIdFnZEt2lsjyD0a+ONGp0BL686AoNBEh2JiCzI+YvlWPBH3Zx1Lw1rDz83zllHpsPCjug2KRQKvH1vFzipVdibVoRlezNERyIiC2EwSHj5lyOoqjUgpqUXHugdKjoS2TgWdkTNIMTTCf83uB0A4N0NJ5FbwuXGiAhYvi8DiecuwtFehXfHdoGSc9aRibGwI2omk/uGo3uoB8qqdXh19VFIEi/JEslZdnEl3vm97hLsC0PaIczLWXAikgMWdkTNRKVU4L2xkbBXKbDlZAF+O5wrOhIRCSJJEl5ZdQRl1TpEhbXA5L7hoiORTLCwI2pGbf1cMeOO1gDqlhu7UFYtOBERifDLgWxsP10ItZ0S742N5LJhZDYs7Iia2ZMDW6O9vyuKymt4SZZIhgq0VZj/2zEAwKy72qK1r4vgRCQnLOyImpnaTol/j+8KO6UCG4/lYe0hXpIlkgtJkvDar8egrdIhMtgdj8VFiI5EMsPCjsgEOgW645lBbQAAc9cew6UqLjdGJAd7cvXYdKIA9ioFFtwXCTsVf82SefETR2Qi/xrYCl2C3KGt0mHJsRpekiWycXklVfjueN19tU/f2Qbt/d0EJyI5YmFHZCL2qrpLsmqVAocL9ViZnCU6EhGZiCRJeGnVEVTogK7B7nhyYCvRkUimWNgRmVBbP1c8d1dbAMCb608g61KF4EREZArfJ2VgZ+oF2CuBD3gJlgTiJ4/IxB6Li0BrDyXKqvV46ZfDXEuWyMakXSjH2+tPAADGt1WjFUfBkkAs7IhMTKVU4LEuGjjYK7HrzEX8kHRedCQiaiZ6g4Tnf0pBZa0eMS29MCjMTnQkkjkWdkRm4O+sxItD6taSfev3EzhbWCY4ERE1h893nMWBjGK4auyw4L4uUCo4ETGJxcKOyEwe7hOG2NZeqKo1YOaPKajRcQoUImt2PEeLjzadBgDMvacTgjwcBSciYmFHZDZKpQL/HtcN7o72OJJdgo82nxYdiYhuUVWtHs+tSEGtXsLgjn4Y2yNIdCQiACzsiMzK390B747pAgBYvP0s9py7KDgREd2KdzecxKn8Uni7qPH2mC5Q8BIsWQgWdkRmNqxLAMb3DIYkAbNWpKCkolZ0JCJqgq0n87F0dzoA4INxXeHtohEbiOgyLOyIBJg7shPCvZyQU1KF/7fmCFelILISBdoq/N/KwwCAR2MjMLCdr+BERFdiYUckgLPGDgsndIdKqcC6w7lYfTBbdCQiugGDQcLzKw+hqLwGHQLc8NKwdqIjEV2FhR2RIN1CPDBzUBsAwJxfjyHjIlelILJkX+9Kw87UC3CwV+LjCd2gsVOJjkR0FRZ2RAI9eUdr9ApvgbJqHZ7+8SCnQCGyUEezS/DexpMAgNdGdEQbP1fBiYiujYUdkUAqpQIf3V83BcqhzGIsqP/FQUSWo6JGh2d+PGic2uSB3qGiIxFdFws7IsGCWzjh/fsiAQD/S0jD5uP5ghMR0eVeW3MM5wrL4eemwXtjIzm1CVk0qyjs3nnnHfTq1Quurq7w9fXF6NGjcerUqSv2qaqqwowZM+Dl5QUXFxeMHTsW+fn8BUnWYXAnf0yJDQcA/N/Ph5BTXCk2EBEBAH7an4lfDmRBqQAW3t8dLZzVoiMRNcoqCrvt27djxowZ2LNnDzZt2oTa2loMHjwY5eXlxn2ee+45/Pbbb1i5ciW2b9+OnJwcjBkzRmBqoqaZPawDIoPdUVxRi2eWH0StnvfbEYl0Kq8Uc349CgCYdVdbxLTyEpyI6MbsRAe4GRs3brzi66VLl8LX1xfJycno378/SkpK8NVXX2HZsmW48847AQBLlixBhw4dsGfPHvTp00dEbKImUdsp8cnEHhj+8U7sP38JH206jReHthcdi0iWyqt1ePKHZFTVGtC/rQ+eHNhadCSim2IVhd0/lZSUAAA8PT0BAMnJyaitrUV8fLxxn/bt2yM0NBSJiYnXLeyqq6tRXV1t/Fqr1QIADAYDDAbT9JY0HNdUx7dkcm17U9od3MIB74zpjKeWp+C/286id3gL9G/rY+qIJiPXcw6w7Zf/19pIkoRXVh/B2cJy+Ltp8O/7ugCQYDA0PpG4tbf7drDtpm17U46tkKxsynuDwYB77rkHxcXFSEhIAAAsW7YMU6ZMuaJIA4DevXvjjjvuwHvvvXfNY73++uuYN2/eVdvXrVsHZ2fn5g9PdJO+PVaNrZk6uKqBeX0d4elgFXdNENmEbZm1WHqsBkoF8HJvB7RtwfnqSKzy8nKMGDECJSUlcHNza3Rfq+uxmzFjBo4ePWos6m7H7NmzMWvWLOPXWq0WISEhiI2NveEbd6sMBgMSEhIQFxcHpVJev6zl2vZbaXd0jB5jFyfieG4pvj2rxvJp0VY5GapczznAtltr20/karFscyIA4PnBbfHYgFY3/VxrbvftYttN2/aGK4o3w6oKu6eeegrr1q3Djh07EBwcbNzu7++PmpoaFBcXw8PDw7g9Pz8f/v7+1z2eRqOBRnP14s1KpdLkH0xzvIalkmvbm9JuR40Six/siZGfJCAlswRv/34Kb4zubOKEpiPXcw6w7dbU9pLKWsxYVjdR+B3tfPCvAa2hVDZ9ahNra3dzYttN0/amHNcq3n1JkvDUU09h9erV2Lp1KyIiIq54PCoqCvb29tiyZYtx26lTp5CRkYGYmBhzxyVqFqFeTlg4oRsUCuC7PefxS3KW6EhENstgkDBrRQrSL1YgyMMR/x7f7ZaKOiLRrKKwmzFjBr7//nssW7YMrq6uyMvLQ15eHior6+b6cnd3x9SpUzFr1iz89ddfSE5OxpQpUxATE8MRsWTV7mjni2fr15N9ZfURHMspEZyIyDb9Z0sqtpwsgNpOicUPRsGT89WRlbKKwu6zzz5DSUkJBg4ciICAAOO/FStWGPf56KOPMGLECIwdOxb9+/eHv78/Vq1aJTA1UfN45s42uKOdD6p1BjzxfTJKKmpFRyKyKZuP5+M/W1IBAG/f2wVdgt0FJyK6dVZR2EmSdM1/jzzyiHEfBwcHfPrppygqKkJ5eTlWrVrV6P11RNZCWb+ebIinIzKLKjFzxcEbTrtARDfnXGEZnluRAgB4qE8Y7osKbvwJRBbOKgo7IrnzcFLjs0lR0Ngp8depQizcfFp0JCKrV1atw+PfJaO0WoeeYS3w2oiOoiMR3TYWdkRWonOQO966twsA4OOtZ7D+cK7gRETWS5IkvPjzIaQWlMHXVYP/TuoBtR1/JZL146eYyIrcFxWMqXF1o8KfX5mCo9kcTEF0K/677Sx+P5IHe5UCnz3YA75uDqIjETULFnZEVmb2sPbo39YHVbUGTP92PwpLq2/8JCIy2ng0F+//cQoA8Po9nRAV5ik4EVHzYWFHZGXsVEosmtgdLX2ckVNShSe+T0a1Ti86FpFVOJpdgudWHAIAPNI3HJOiwwQnImpeLOyIrJC7oz3+93BPuDnYIfn8Jby6+iisbNlnIrMr0FZh2rf7UVmrR7823nh1eAfRkYiaHQs7IivV0scFnzzQA0oFsDI5C18lpImORGSxqmr1mPZdMnJLqtDKxxmfPNADdir+CiTbw081kRXr39YHrw6vm6Lh7d9PYPPxfMGJiCyPJEl44efDOJRZDA8ne3w1uRfcHe1FxyIyCRZ2RFZuSmw4JvYOgUECnl5+EIezikVHIrIoi7aewW+HcmCnVOC/k3og3NtZdCQik2FhR2TlFAoF5o/qjP5tfVBZq8ejS/cjs6hCdCwii7DqQBY+3FQ3ofcbozujbytvwYmITIuFHZENsFcp8d9JPdAhwA0XyqoxZek+lFRyTVmSt4TUC3jx58MAgOn9W2Ji71DBiYhMj4UdkY1w0djh60d6wt/NAWcKyvDEd8mo0RlExyIS4niOFk98nwydQcLIroF4eWh70ZGIzIKFHZENCXB3xJIpveCisUPiuYt4+ZfDnAaFZCe7uBJTlu5FWbUO0RGe+GBcJJRKhehYRGbBwo7IxnQIcMN/J/WASqnAqoPZ+Pefp0VHIjKbkopaPPL1XuRrq9HWzwVfPNwTGjuV6FhEZsPCjsgG9W/rg7fv7QwA+OSvM5zjjmShWqfH9O/2I7WgDH5uGiyZ0pvTmpDssLAjslH39wrFC0PaAQDeWHccqw5kCU5EZDo6vQEzf0xBUloRXDR2WPJIbwR5OIqORWR2LOyIbNiTA1vhsbgIAMALPx/mBMZkkwwGCbNXHcGGo3lQq5T4/KEodAx0Ex2LSAgWdkQ2TKFQ4JW7O2BMjyDoDRJmLDuAvWlFomMRNRtJkvDW7yewMjkLSgXw8cTuiG3NuepIvljYEdk4pVKB98ZGIr6DL6p1Bkxdug/HckpExyJqFou2/n0P6YL7umJoZ3/BiYjEYmFHJAP2KiU+eaAHeod7orRah8lf78XZwjLRsYhuy9JdacZVJeaM6Ij7ooIFJyISj4UdkUw42Kvwv0d6omOAGy6U1eCBL/cg/UK56FhEt2Tl/ky8/ttxAMDM+DZ4tP5eUiK5Y2FHJCNuDvb4/rFotPNzRb62GhO/3MN1Zcnq/JKchRd/qVsqbEpsOJ4d1EZwIiLLwcKOSGY8ndX4/rFotPJxRm5JFSZ8sQfZxZWiYxHdlDUHs/F/Px+CJAEP9gnFnBEdoVBwVQmiBizsiGTIx1WD5dP6IMLbGdnFlZj4xR7klVSJjkXUqF9TsjHrpxRIEjCxdyjm39OZRR3RP7CwI5IpXzcHLJsWjVBPJ2QUVWDilyzuyHKtO5yD51akwCABE3qF4K3Rnbn+K9E1sLAjkrEAd0csmxaNIA9HpF0ox/jPE3nPHVmcdYdz8OyPdUXduKhgvH1vFxZ1RNfBwo5I5oJbOGHF432MPXf3f56INI6WJQvx0/5MPLP8IPQGCWN6BOHdsZEs6ogawcKOiBDcwgk/PR6DVj7OyCmpwvjPE5GaXyo6FsncN7vT8eLPh2GQgIm9Q/D+fV2hYlFH1CgWdkQEAPB3d8CKx2PQ3t8VhaXVuP+LPVyhgoT577YzmLv2GABgalwE3r63C4s6opvAwo6IjLxd6kbLdglyR1F5DSZ+sQf707m2LJmPJEn44I9TWLDxFADgmUFt8OrwDhz9SnSTWNgR0RVaOKvxw7RoRIW1gLZKh0n/S8Lm4/miY5EM6A0S5vx6DJ/8dQYA8PKw9ph1V1sWdURNwMKOiK7i5mCP76dG4872vqjWGfD498n4aX+m6Fhkw6pq9ZjxwwF8t+c8FArgjVGd8MSAVqJjEVkdFnZEdE2OahU+fygKY3sEQ2+Q8OLPh/HpX2cgSZLoaGRjiitq8NBXSdh4LA9qlRKfTOyBh2LCRcciskos7IjouuxVSnwwLhL/GljXc/L+H6cw77fj0BtY3FHzyC6uxH2LE7Ev/RJcHezwzaO9MTwyQHQsIqvFwo6IGqVQKPDS0PZ4bURHAMDS3el4/LtklFfrBCcja3ciV4ux/92NMwVl8HdzwMonYhDTykt0LCKrxsKOiG7K1LgILJrYHWo7JTafyMe4xYnILakUHYus1Kbj+Rj72W7kaavQxtcFq57si/b+bqJjEVk9FnZEdNNGdg3E8ml94O2ixvFcLUZ9sguHs4pFxyIrIkkSFm8/i+nf7UdFjR59W3lh5RMxCPRwFB2NyCawsCOiJokKa4HVT8airZ8LCkqrMf7zRGw4kis6FlmBap0eL/x8GO9uOAlJAiZFh+KbR3vDw0ktOhqRzWBhR0RNFuLphF/+1RcD2vqgqtaAf/1wAB/+eYqDKui6LpRV48H/JeHn5CwoFcC8ezrhzdGdYa/iryGi5sTvKCK6Ja4O9vhqck880jccAPDx1jOY+s0+FFfUiA1GFudAxiWMXJRgHPm6dEpvTO4bzomHiUyAhR0R3TI7lRKv39MJH47vCo2dEttOFWLkJwk4nqMVHY0sgCRJ+GZ3Ou7/PBG5JVVo5eOM1U/Gon9bH9HRiGwWCzsium1jegRj1ZN9EeLpiMyiSoz5bBdWH8wSHYsEqtZJeO6nQ5i79hhq9RKGdwnAr0/FobWvi+hoRDbNTnQAIrINnQLd8dtTcXj2xxRsP12I51Ycwp6zF3GnB++7k5uzBWWYv6cS2WUVsFMqMPvuDng0lpdeicyBPXZE1Gw8nNT4+pFeeGZQGygUwIr9WXg9sRIncnlpVg4kScKypAyM/HQXsssk+LpqsHx6H0yNi2BRR2QmLOyIqFmplArMuqstfpgaDV9XDXLLJdz7WSK+2Z3OdWZt2KXyGjzxfTJeWX0EVbUGdPJS4renYtEr3FN0NCJZYWFHRCbRt7U3fn8mDl19VKjRGTB37TFM+zYZF8qqRUejZrb7zAUM+89O/HEsH/YqBV4Z1h7P93SAj6tGdDQi2WFhR0Qm4+msxsweGswZ0QFqVd1SZIM/2oH1hzmhsS2oqtXjrfXHMemrJORpq9CyftTrY/0ioOSlVyIhWNgRkUkpFAo80jccq2f0RXt/VxSV12DGsgOY8cMBXGTvndXal16EYf/ZiS93pkGSgIm9Q7Du6Th0DnIXHY1I1ljYEZFZdAp0x9qn4vDMna2hUiqw/kguBn+0g8uRWZmKGh1eX3sM4z9PRNqFcvi5afD1Iz3xzphIOKk50QKRaCzsiMhs1HZKzBrcDmuejEU7P1dcLK/Bv344gMe+2Y+sSxWi49EN/HWyAEMW7sDS3emQJGB8z2D8+dwA3NneT3Q0IqrHP6+IyOy6BLtj7dOxWLTlDBZvP4vNJ/Kx68wFPDOoDabGRUBtx785LUl2cSXm/3YMfxzLBwAEujvgnbGRGMAVJIgsDgs7IhJCY6fC/w1ph3u6BeLVNUexN60I7208iVUHsjBvVCf0beUtOqLs1egM+CohDR9vSUVlrR4qpQJT4yLwzKA2cNHw1weRJeJ3JhEJ1dbPFSum98GqA9l4+/cTSC0owwNfJuGujn6YPaw9WvpwCSpzkyQJfxzLx3sbTyLtQjkAoHe4J94Y3Rnt/F0FpyOixrCwIyLhFAoFxkYFY1AHX/z7z9NYtjcDm47n46+TBXiwTxieHdQGLZzVomPKwsGMS3hr/QnsP38JAODtosbsYR0wpkcQV48gsgIs7IjIYng4qfHG6M6Y3DcMb/9+EltPFmDp7nSsOpCF6f1b4pHYCF4CNJEzBWX4aPNp4xyDDvZKTO/XEtMHtOJ7TmRF+N1KRBanta8rvn6kF3aduYA315/AiVwtPvjzNP6XkIbp/Vtickw4nFlsNIszBWVYtDUVaw/lQJIAhQIYFxWMWXe1g7+7g+h4RNRE/MlIRBYrtrU31j0dh/VHcrFw82mcKyzHgo2n8L+daZjWryUeiA6Fu6O96JhWKTW/FJ/+dQZrD+XAUL+E7+COfnjurrboEOAmNhwR3TIWdkRk0VRKBe7pGojhXQKw9lA2/rM5FekXK/DexpP4ZGsqJvQOxZTYcAS3cBId1eJJkoTdZy/iy53nsO1UoXH74I5+eGZQG64aQWQDWNgRkVVQKRW4t3swRkYG4teUHHyx4xxO5Zfiq4Q0LN2djuFdAvBwTBiiwlrwJv9/qKrVY93hXHyVkIYTuVoAdZdch3T0x1N3tmZBR2RDWNgRkVWxUykxNioYY3oEYUfqBXyx4yx2nbmItYdysPZQDtr6uWBi71CM6R4Mdyd5X6Y9mafFj3szsepAFrRVOgCAo70K43sG49G4CIR5OQtOSETNjYUdEVklhUKBAW19MKCtD45ml+DbxHT8digXp/PLMO+343h3w0kM6+yPe7oFol8bH9ir5LGaRVF5DTYczcXPyVk4mFFs3B7k4YgHokMxKToUHk6cOobIVrGwIyKr1znIHQvu64pXR3TErwez8UNSBk7mlWJNSg7WpOTAw8kewzoH4J6ugegV3gJ2NlbklVTW4o9jeVh3OBe7zlyAvn40hJ1SgfgOfpgYHYq41t5QKXmJmsjWsbAjIpvh5mCPh2LC8WCfMBzKKsGag9lYdzgXF8qqsXxvBpbvzYC7oz0GtvPBne19MaCtj1X2XkmShDMFZfjrVAH+OlmIfelF0DUMbQXQOcgNIyMDMaZHMHxcNQKTEpG52Vxh9+mnn+L9999HXl4eunbtikWLFqF3796iYxGRGSkUCnQL8UC3EA+8NqIj9py7iLUpOfjjeB6KK2rxa0oOfk3JgVIBdA3xQO8IT0RHeCIqzNMip0+RJAkZRRXYl34J+9KKkHDmArKLK6/Yp62fC0ZGBmJE10BEePPeOSK5sqnCbsWKFZg1axYWL16M6OhoLFy4EEOGDMGpU6fg6+srOh4RCaBSKhDb2huxrb3xlr4zDmYWY+vJAvx1sgAn80pxMKMYBzOK8fn2c1AogPb+bogMckfHQDd0CnRD+wA3s668IEkSckqqcDJXixO5WhzL0SL5/CUUlFZfsZ/aTomYll4Y2M4HA9v5spgjIgA2Vth9+OGHmDZtGqZMmQIAWLx4MdavX4+vv/4aL7/8suB0RCSanUqJXuGe6BXuiZeGtkd2cSX2nL2IvWlF2JtehLQL5ThRX1BdLsjDEWFeTgjzckKopzNCPB3h46KBl4sGXs5quDvaQ3mT969V1epRXFGLSxU1KCqvQdalCmQWVSLzUgUyiipwrrAcJZW1Vz3PXqVAZLAHeoV7ondEC8S09IajWtUs7wsR2Q6bKexqamqQnJyM2bNnG7cplUrEx8cjMTHxms+prq5GdfXffwVrtXU/zA0GAwwGg0lyNhzXVMe3ZHJtu1zbDVh+2wPcNLi3eyDu7R4IACjQViE5oxjHc7Q4Xl/g5WmrkV1cieziSuw+e/Gax1EpFXDR2EFtp4TGTgm1Sgl7lQKl5RWw37cdtXoDavUSyqt1qKjR3zCXnVKBVr4u6ODvivb+rugW4oHIYHc42F9ZyFnq+2rp591U5NpugG2//L+mfI2boZAkSbrxbpYvJycHQUFB2L17N2JiYozbX3zxRWzfvh1JSUlXPef111/HvHnzrtq+bt06ODvzsgYRAdoaCXnlBhRUGFBYIdX9t1JCaY0EbY2ESl3Tj6lUAC72gItaAS8HJXwcFfB2UsDHUQlfJwUCXZSw5whWIqpXXl6OESNGoKSkBG5ujS/5ZzM9drdi9uzZmDVrlvFrrVaLkJAQxMbG3vCNu1UGgwEJCQmIi4uDUmlbUy7ciFzbLtd2A/Joe43OgEsVNSir0qFGb0C1zoAanQFVtTqcOHYMPbpFQm2vglqlhKNaBU8nNVw0djd96dYayeG8X4tc2w2w7aZue8MVxZthM4Wdt7c3VCoV8vPzr9ien58Pf3//az5Ho9FAo7l6KgClUmnyD6Y5XsNSybXtcm03YNttd1ArEaC++kepwWAA8k6iV4SXzbb9Rmz5vDdGru0G2HZTtb0px7WZd1+tViMqKgpbtmwxbjMYDNiyZcsVl2aJiIiIbJXN9NgBwKxZszB58mT07NkTvXv3xsKFC1FeXm4cJUtERERky2yqsLv//vtRWFiIOXPmIC8vD926dcPGjRvh5+cnOhoRERGRydlUYQcATz31FJ566inRMYiIiIjMzmbusSMiIiKSOxZ2RERERDaChR0RERGRjWBhR0RERGQjWNgRERER2QgWdkREREQ2goUdERERkY1gYUdERERkI1jYEREREdkIFnZERERENoKFHREREZGNsLm1Ym+HJEkAAK1Wa7LXMBgMKC8vh1arhVIpr7parm2Xa7sBtp1tl1fb5dpugG03ddsb6pKGOqUxLOwuU1paCgAICQkRnISIiIjoSqWlpXB3d290H4V0M+WfTBgMBuTk5MDV1RUKhcIkr6HVahESEoLMzEy4ubmZ5DUslVzbLtd2A2w72y6vtsu13QDbbuq2S5KE0tJSBAYG3rBXkD12l1EqlQgODjbLa7m5ucnuw99Arm2Xa7sBtp1tlxe5thtg203Z9hv11DWQ14VwIiIiIhvGwo6IiIjIRrCwMzONRoO5c+dCo9GIjmJ2cm27XNsNsO1su7zaLtd2A2y7JbWdgyeIiIiIbAR77IiIiIhsBAs7IiIiIhvBwo6IiIjIRrCwa2ZvvfUW+vbtCycnJ3h4eFxzn4yMDAwfPhxOTk7w9fXFCy+8AJ1O1+hxi4qKMGnSJLi5ucHDwwNTp05FWVmZCVrQPLZt2waFQnHNf/v27bvu8wYOHHjV/k888YQZkzeP8PDwq9rx7rvvNvqcqqoqzJgxA15eXnBxccHYsWORn59vpsTNIz09HVOnTkVERAQcHR3RqlUrzJ07FzU1NY0+z1rP+6efforw8HA4ODggOjoae/fubXT/lStXon379nBwcECXLl3w+++/mylp83nnnXfQq1cvuLq6wtfXF6NHj8apU6cafc7SpUuvOr8ODg5mStw8Xn/99ava0L59+0afYwvnG7j2zzOFQoEZM2Zcc39rPt87duzAyJEjERgYCIVCgTVr1lzxuCRJmDNnDgICAuDo6Ij4+Hikpqbe8LhN/VlxO1jYNbOamhqMGzcO//rXv675uF6vx/Dhw1FTU4Pdu3fjm2++wdKlSzFnzpxGjztp0iQcO3YMmzZtwrp167Bjxw5Mnz7dFE1oFn379kVubu4V/x577DFERESgZ8+ejT532rRpVzxvwYIFZkrdvObPn39FO55++ulG93/uuefw22+/YeXKldi+fTtycnIwZswYM6VtHidPnoTBYMDnn3+OY8eO4aOPPsLixYvxyiuv3PC51nbeV6xYgVmzZmHu3Lk4cOAAunbtiiFDhqCgoOCa++/evRsTJ07E1KlTcfDgQYwePRqjR4/G0aNHzZz89mzfvh0zZszAnj17sGnTJtTW1mLw4MEoLy9v9Hlubm5XnN/z58+bKXHz6dSp0xVtSEhIuO6+tnK+AWDfvn1XtHvTpk0AgHHjxl33OdZ6vsvLy9G1a1d8+umn13x8wYIF+Pjjj7F48WIkJSXB2dkZQ4YMQVVV1XWP2dSfFbdNIpNYsmSJ5O7uftX233//XVIqlVJeXp5x22effSa5ublJ1dXV1zzW8ePHJQDSvn37jNs2bNggKRQKKTs7u9mzm0JNTY3k4+MjzZ8/v9H9BgwYID377LPmCWVCYWFh0kcffXTT+xcXF0v29vbSypUrjdtOnDghAZASExNNkNB8FixYIEVERDS6jzWe9969e0szZswwfq3X66XAwEDpnXfeueb+48ePl4YPH37FtujoaOnxxx83aU5TKygokABI27dvv+4+1/t5aE3mzp0rde3a9ab3t9XzLUmS9Oyzz0qtWrWSDAbDNR+3hfMtSZIEQFq9erXxa4PBIPn7+0vvv/++cVtxcbGk0Wik5cuXX/c4Tf1ZcbvYY2dmiYmJ6NKlC/z8/IzbhgwZAq1Wi2PHjl33OR4eHlf0dMXHx0OpVCIpKcnkmZvD2rVrcfHiRUyZMuWG+/7www/w9vZG586dMXv2bFRUVJghYfN799134eXlhe7du+P9999v9HJ7cnIyamtrER8fb9zWvn17hIaGIjEx0RxxTaakpASenp433M+azntNTQ2Sk5OvOF9KpRLx8fHXPV+JiYlX7A/Ufe/bwvkFcMNzXFZWhrCwMISEhGDUqFHX/XlnyVJTUxEYGIiWLVti0qRJyMjIuO6+tnq+a2pq8P333+PRRx9tdE11Wzjf/5SWloa8vLwrzqu7uzuio6Ove15v5WfF7eJasWaWl5d3RVEHwPh1Xl7edZ/j6+t7xTY7Ozt4enpe9zmW5quvvsKQIUNuuBbvAw88gLCwMAQGBuLw4cN46aWXcOrUKaxatcpMSZvHM888gx49esDT0xO7d+/G7NmzkZubiw8//PCa++fl5UGtVl91X6afn5/VnONrOXPmDBYtWoQPPvig0f2s7bxfuHABer3+mt/LJ0+evOZzrve9b83n12AwYObMmYiNjUXnzp2vu1+7du3w9ddfIzIyEiUlJfjggw/Qt29fHDt2zGzrc9+u6OhoLF26FO3atUNubi7mzZuHfv364ejRo3B1db1qf1s83wCwZs0aFBcX45FHHrnuPrZwvq+l4dw15bzeys+K28XC7ia8/PLLeO+99xrd58SJEze8kdYW3Mp7kZWVhT/++AM//fTTDY9/+X2DXbp0QUBAAAYNGoSzZ8+iVatWtx68GTSl7bNmzTJui4yMhFqtxuOPP4533nnHYmYnb4pbOe/Z2dkYOnQoxo0bh2nTpjX6XEs+73R9M2bMwNGjRxu91wwAYmJiEBMTY/y6b9++6NChAz7//HO88cYbpo7ZLIYNG2b8/8jISERHRyMsLAw//fQTpk6dKjCZeX311VcYNmwYAgMDr7uPLZxva8bC7iY8//zzjf51AgAtW7a8qWP5+/tfNRqmYeSjv7//dZ/zz5ssdTodioqKrvscU7mV92LJkiXw8vLCPffc0+TXi46OBlDX8yP6F/ztfA6io6Oh0+mQnp6Odu3aXfW4v78/ampqUFxcfEWvXX5+vtnP8bU0te05OTm444470LdvX3zxxRdNfj1LOu/X4u3tDZVKddWo5cbOl7+/f5P2t3RPPfWUcSBXU3th7O3t0b17d5w5c8ZE6UzPw8MDbdu2vW4bbO18A8D58+exefPmJvek28L5Bv7+HZ2fn4+AgADj9vz8fHTr1u2az7mVnxW3i4XdTfDx8YGPj0+zHCsmJgZvvfUWCgoKjJdXN23aBDc3N3Ts2PG6zykuLkZycjKioqIAAFu3boXBYDD+AjSXpr4XkiRhyZIlePjhh2Fvb9/k10tJSQGAK76JRLmdz0FKSgqUSuVVl9QbREVFwd7eHlu2bMHYsWMBAKdOnUJGRsYVf/mK0pS2Z2dn44477kBUVBSWLFkCpbLpt/Ja0nm/FrVajaioKGzZsgWjR48GUHdZcsuWLXjqqaeu+ZyYmBhs2bIFM2fONG7btGmTRZzfppAkCU8//TRWr16Nbdu2ISIiosnH0Ov1OHLkCO6++24TJDSPsrIynD17Fg899NA1H7eV8325JUuWwNfXF8OHD2/S82zhfANAREQE/P39sWXLFmMhp9VqkZSUdN2ZMG7lZ8VtM8mQDBk7f/68dPDgQWnevHmSi4uLdPDgQengwYNSaWmpJEmSpNPppM6dO0uDBw+WUlJSpI0bN0o+Pj7S7NmzjcdISkqS2rVrJ2VlZRm3DR06VOrevbuUlJQkJSQkSG3atJEmTpxo9vY11ebNmyUA0okTJ656LCsrS2rXrp2UlJQkSZIknTlzRpo/f760f/9+KS0tTfr111+lli1bSv379zd37Nuye/du6aOPPpJSUlKks2fPSt9//73k4+MjPfzww8Z9/tl2SZKkJ554QgoNDZW2bt0q7d+/X4qJiZFiYmJENOGWZWVlSa1bt5YGDRokZWVlSbm5ucZ/l+9jC+f9xx9/lDQajbR06VLp+PHj0vTp0yUPDw/jiPeHHnpIevnll43779q1S7Kzs5M++OAD6cSJE9LcuXMle3t76ciRI6KacEv+9a9/Se7u7tK2bduuOL8VFRXGff7Z9nnz5kl//PGHdPbsWSk5OVmaMGGC5ODgIB07dkxEE27J888/L23btk1KS0uTdu3aJcXHx0ve3t5SQUGBJEm2e74b6PV6KTQ0VHrppZeuesyWzndpaanx9zYA6cMPP5QOHjwonT9/XpIkSXr33XclDw8P6ddff5UOHz4sjRo1SoqIiJAqKyuNx7jzzjulRYsWGb++0c+K5sbCrplNnjxZAnDVv7/++su4T3p6ujRs2DDJ0dFR8vb2lp5//nmptrbW+Phff/0lAZDS0tKM2y5evChNnDhRcnFxkdzc3KQpU6YYi0VLNnHiRKlv377XfCwtLe2K9yYjI0Pq37+/5OnpKWk0Gql169bSCy+8IJWUlJgx8e1LTk6WoqOjJXd3d8nBwUHq0KGD9Pbbb0tVVVXGff7ZdkmSpMrKSunJJ5+UWrRoITk5OUn33nvvFQWRNViyZMk1P/+X/w1pS+d90aJFUmhoqKRWq6XevXtLe/bsMT42YMAAafLkyVfs/9NPP0lt27aV1Gq11KlTJ2n9+vVmTnz7rnd+lyxZYtznn22fOXOm8X3y8/OT7r77bunAgQPmD38b7r//fikgIEBSq9VSUFCQdP/990tnzpwxPm6r57vBH3/8IQGQTp06ddVjtnS+G37//vNfQ/sMBoP02muvSX5+fpJGo5EGDRp01XsSFhYmzZ0794ptjf2saG4KSZIk0/QFEhEREZE5cR47IiIiIhvBwo6IiIjIRrCwIyIiIrIRLOyIiIiIbAQLOyIiIiIbwcKOiIiIyEawsCMiIiKyESzsiIiIiGwECzsiIiIiG8HCjoiIiMhGsLAjIiIishEs7IiImsny5cvh6OiI3Nxc47YpU6YgMjISJSUlApMRkVwoJEmSRIcgIrIFkiShW7du6N+/PxYtWoS5c+fi66+/xp49exAUFCQ6HhHJgJ3oAEREtkKhUOCtt97CfffdB39/fyxatAg7d+5kUUdEZsMeOyKiZtajRw8cO3YMf/75JwYMGCA6DhHJCO+xIyJqRhs3bsTJkyeh1+vh5+cnOg4RyQx77IiImsmBAwcwcOBAfP7551i6dCnc3NywcuVK0bGISEZ4jx0RUTNIT0/H8OHD8corr2DixIlo2bIlYmJicODAAfTo0UN0PCKSCfbYERHdpqKiIvTt2xcDBw7E4sWLjduHDx8OvV6PjRs3CkxHRHLCwo6IiIjIRnDwBBEREZGNYGFHREREZCNY2BERERHZCBZ2RERERDaChR0RERGRjWBhR0RERGQjWNgRERER2QgWdkREREQ2goUdERERkY1gYUdERERkI1jYEREREdkIFnZERERENuL/A+nr8vw+IIzdAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# with %pip install, we install a required package\n", "%pip install sympy_plot_backends\n", "\n", "\n", "# spb allows plotting functions\n", "from spb import plot, graphics, contour\n", "plot(x*x)" ] }, { "cell_type": "code", "execution_count": 6, "id": "66b0153e-e7fc-4fee-a0ce-92e7c0a4a7b9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cos(x)\n" ] }, { "data": { "text/plain": [ "[cos(x), -sin(y)]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# diff is able to calculate the (partial) derivative of the function f by either x or y\n", "partial = diff(f, x)\n", "print(partial)\n", "\n", "# a vector of the partial derivatives is by definition the gradient of the function\n", "grad = [diff(f, x), diff(f, y)]\n", "grad" ] }, { "cell_type": "code", "execution_count": 7, "id": "cc733a22-9dd4-4bb4-9a06-5fd0410ff582", "metadata": {}, "outputs": [ { "data": { "image/png": "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2rOTyWQKXIhz57Ti9OnT8dRTT3ndoJakp6djypQpGDJkCIYOHYoXX3wRNTU1mDZtGoDGRHvrrbciKysLAPDII49g+PDheOGFFzBmzBhs2LABBw8exBtvvKFaG/Wsujicz4ojIvLSO+eTtG4CGcjOnTsd3rdr1w7r169Ht27d/LJ+v3/tVqdOnbBjxw5/r9bugQcewE8//YTFixfDZrNh4MCB2LJli/3mhZKSEgQFXb/ULykpCevXr8eTTz6JJ554Aj179sTmzZvRt29f1dpIREREpDa/hziTyYThw4f7e7UO5s2b5/L06a5du5pMmzhxIiZOnKhqm4iIiIgCid+dSkRERBQATzzxBDp06OC39fm9EkdERERETWVkZPh1fazEERERERkQQxwRERGRATHEERERERkQr4kjIiIiUtGVK1dgs9lw8eJFRERE+O3mBlbiiAyGDxslItK/Cxcu4LXXXsPw4cNhsVjQtWtX9O7dGxEREejSpQtmzpyJAwcO+PQ7GOIkVF0crnUTiIgMh39AkbtWrlyJrl27Yt26dUhJScHmzZtRUFCA//znP8jLy0NmZiauXr2KkSNHYtSoUThx4oRXv4enU0k4/P5UIiLS0oEDB7Bnzx7cfvvtTn8+dOhQPPzww8jOzsa6devw+eefo2fPnh7/HoY4IiIiIj9677337P++cOEC2rVr53Q+s9mM2bNne/17eDqViIiISCW//vWvYbPZVFk3QxwRERGRSgYNGoSEhAQcP37cYXpBQQHuu+8+n9bNECcp3txgbLzAmiiweMyRt9atW4epU6di2LBh+OKLL/Cf//wHv//97xEfH49WrVr5tG5eE0dC4s0NRESkF0uXLoXZbMa9996L+vp6jBgxAnl5eRg6dKhP62UljoiIiEgl5eXleOSRR/DMM8+gT58+aNOmDaZOnepzgAMY4oiIiIhUExsbiz179uCDDz5Afn4+/vGPf2DWrFl47rnnfF43Q5zEeF2csfEaHaLA4LFGvli7di0OHz6MMWPGAABGjRqFnTt3YtWqVZg7d65P62aII2FtK+mldROIiEhFq1evRteuXRESEoKEhATs37+/2fk/+OADxMXFISQkBP369cOnn36qehsffPDBJtMGDx6MvXv3YseOHT6tmyGOiIiIDOf9999Heno6MjMzcejQIQwYMACpqak4c+aM0/n37t2L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8fHxOHDgAF566SW8/vrrTeY10udE3pHqmriIiAjExcU1+woODvZq3bGxsbBarcjNzbVPq6qqwr59+1xer+AP7m5TYmIiKioqkJ+fb192x44daGhosAczdxQUFACAQ1ANlODgYMTHxzv8Hzc0NCA3N9fl/3FiYqLD/ACwfft2VT8TT3izTTeqr6/HN998o8ln4k96/6z8paCgQFeflaIomDdvHjZt2oQdO3YgNja2xWWM8Fl5s103MsKx1dDQgNraWqc/M8LnRD7S+s4KvTp16pRy+PBhZenSpUrbtm2Vw4cPK4cPH1YuXLhgn6dXr17Kxo0b7e///Oc/K+3bt1c++ugj5euvv1bGjh2rxMbGKpcuXdJiE5oYNWqUMmjQIGXfvn3KF198ofTs2VOZNGmS/ec//PCD0qtXL2Xfvn2KoijKyZMnlaefflo5ePCgUlxcrHz00UdKt27dlLvuukurTVA2bNigmM1mJScnR/n222+VWbNmKe3bt1dsNpuiKIry0EMPKYsWLbLP/+WXXyqtW7dWnn/+eeXYsWNKZmam0qZNG+Wbb77RahOa8HSbli5dqmzdulUpKipS8vPzlQcffFAJCQlRjh49qtUmOHXhwgX7cQNAWblypXL48GHl1KlTiqIoyqJFi5SHHnrIPv93332nhIWFKY899phy7NgxZfXq1UqrVq2ULVu2aLUJTXi6TatWrVI2b96snDhxQvnmm2+URx55RAkKClI+++wzrTahiTlz5ijh4eHKrl27lLKyMvvr4sWL9nmMeFx5s116P7YWLVqk7N69WykuLla+/vprZdGiRYrJZFK2bdumKIoxPyfyDUOcC1OmTFEANHnt3LnTPg8AZd26dfb3DQ0NylNPPaVERkYqZrNZGTFihFJYWBj4xrvw888/K5MmTVLatm2rWCwWZdq0aQ6htLi42GEbS0pKlLvuukvp0KGDYjablR49eiiPPfaYUllZqdEWNHrllVeUzp07K8HBwcrQoUOVr776yv6z4cOHK1OmTHGY/+9//7vyX//1X0pwcLBy++23K5988kmAW9wyT7Zp/vz59nkjIyOV++67Tzl06JAGrW7etcdr3Pi6ti1TpkxRhg8f3mSZgQMHKsHBwUq3bt0cji898HSbnn32WaV79+5KSEiI0qFDByU5OVnZsWOHNo13wdn23Ni3GfG48ma79H5sPfzww0qXLl2U4OBgJSIiQhkxYoQ9wCmKMT8n8o1JURQlAAU/IiIiIvIjqa6JIyIiIhIFQxwRERGRATHEERERERkQQxwRERGRATHEERERERkQQxwRERGRATHEERERERkQQxwRERGRATHEERERERkQQxwRERGRATHEERERERkQQxwRBdR7772H0NBQlJWV2adNmzYN/fv3R2VlpYYtIyIyFpOiKIrWjSAieSiKgoEDB+Kuu+7CK6+8gszMTKxduxZfffUVbr31Vq2bR0RkGK21bgARycVkMmH58uWYMGECrFYrXnnlFXz++ecMcEREHmIljog0MXjwYBw9ehTbtm3D8OHDtW4OEZHh8Jo4Igq4LVu24Pjx46ivr0dkZKTWzSEiMiRW4ogooA4dOoTk5GS8/vrryMnJgcViwQcffKB1s4iIDIfXxBFRwHz//fcYM2YMnnjiCUyaNAndunVDYmIiDh06hMGDB2vdPCIiQ2EljogC4ty5c0hKSkJycjKys7Pt08eMGYP6+nps2bJFw9YRERkPQxwRERGRAfHGBiIiIiIDYogjIiIiMiCGOCIiIiIDYogjIiIiMiCGOCIiIiIDYogjIiIiMiCGOCIiIiIDYogjIiIiMiCGOCIiIiIDYogjIiIiMiCGOCIiIiIDYogjIiIiMqD/B1IlVsUTroBYAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# the 2d function can be plotted as follows:\n", "graphics(contour(f, (x, -1, 3), (y, -2, 2)), grid=False)" ] }, { "cell_type": "code", "execution_count": 8, "id": "3e4c8a1c-5538-40b0-9826-c20eb521a16c", "metadata": {}, "outputs": [], "source": [ "# the gradient function traslated to python code\n", "def grad_function(x: np.array):\n", " return np.array([np.cos(x[0]), -np.sin(x[1])])\n", "\n", "# forces between a pair of particles i, j\n", "def force_ij(i, j, dist, particles, k=0.3):\n", " xi_minus_xj = particles[i, :] - particles[j, :]\n", " f = -k * (np.linalg.norm(xi_minus_xj) - dist) * xi_minus_xj\n", " return f\n", "\n", "# force for particle i\n", "def force_i(i, particles, d=0.1, k=0.3):\n", " f = np.array([0.0, 0.0])\n", " for j, x in enumerate(particles):\n", " if j == i:\n", " continue\n", " f = f + force_ij(i, j, d, particles, k=k)\n", " f += 0.01 * grad_function(x)\n", " return f\n", "\n", "# forces for all particles\n", "def force(particles, k=0.1, d=0.1):\n", " return np.array([force_i(i, particles, d=d, k=k) for i, _ in enumerate(particles)])\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "66ff3a1b-ce35-4c4a-83a8-9dd394f17e6d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# run an experiment with N random particles and a random pattern\n", "l = []\n", "data = []\n", "N = 10\n", "w = 0.3\n", "pattern = generate_pattern(N)\n", "x = generate_pattern(N)\n", "v = np.zeros_like(x)\n", "for t in range(30):\n", " # record the current state at time t\n", " data.append(make_df(x, t, \"particle\"))\n", " # update v and x\n", " v = force(x, k=0.3, d=0.2) + w * v\n", " x = x + v\n", "df = pd.concat(data)\n", "\n", "# show the result\n", "fig = px.scatter(df, x=\"x\", y=\"y\", color=\"pid\", animation_frame=\"t\", animation_group=\"pid\", facet_col=\"type\")\n", "fig.update_layout(xaxis_range=(0, 2), yaxis_range=(-1, 1), width=800, height=800)\n", "fig.update_traces(marker={\"size\": 12})\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "3b0f2862-b831-4ccc-90ba-acd590a7f4a8", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 5 }