{ "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting sound.py\n" ] } ], "source": [ "%%writefile sound.py\n", "import numpy as np\n", "import time\n", "from scipy.signal import lfilter\n", "\n", "\n", "class SoundController:\n", " # https://python-sounddevice.readthedocs.io/en/0.3.15/api/streams.html#sounddevice.OutputStream\n", " \n", " default_cfg = {\n", " \"device\": [1, 26],\n", " \"n_channels\": 10,\n", " \"sounds\": {\n", " \"noise\": {\"amp\": 0.5, \"channels\": [6]},\n", " \"background\": {\"freq\": 10000, \"amp\": 0.23, \"channels\": [6]},\n", " \"target\": {\"freq\": 660, \"amp\": 0.15, \"channels\": [6]}, \n", " \"distractor1\": {\"freq\": 860, \"amp\": 0.15, \"channels\": [1, 3], \"enabled\": False},\n", " \"distractor2\": {\"freq\": 1060, \"amp\": 0.25, \"channels\": [1, 3], \"enabled\": False},\n", " \"distractor3\": {\"freq\": 1320, \"amp\": 0.2, \"channels\": [1, 3], \"enabled\": False}\n", " },\n", " \"pulse_duration\": 0.05,\n", " \"sample_rate\": 44100,\n", " \"latency\": 0.25,\n", " \"volume\": 0.7,\n", " \"roving\": 5.0,\n", " \"file_path\": \"sounds.csv\"\n", " }\n", " \n", " @classmethod\n", " def get_pure_tone(cls, freq, duration, sample_rate=44100):\n", " x = np.linspace(0, duration * freq * 2*np.pi, int(duration*sample_rate), dtype=np.float32)\n", " return np.sin(x)\n", "\n", " @classmethod\n", " def get_cos_window(cls, tone, win_duration, sample_rate=44100):\n", " x = np.linspace(0, np.pi/2, int(win_duration * sample_rate), dtype=np.float32)\n", " onset = np.sin(x)\n", " middle = np.ones(len(tone) - 2 * len(x))\n", " offset = np.cos(x)\n", " return np.concatenate([onset, middle, offset])\n", "\n", " @classmethod\n", " def get_tone_stack(cls, cfg):\n", " # silence\n", " silence = np.zeros(2, dtype='float32')\n", " sounds = {'silence': np.column_stack([silence for x in range(cfg['n_channels'])])}\n", "\n", " # noise\n", " filter_a = np.array([0.0075, 0.0225, 0.0225, 0.0075])\n", " filter_b = np.array([1.0000,-2.1114, 1.5768,-0.4053])\n", "\n", " noise = np.random.randn(int(0.25 * cfg['sample_rate'])) # 250ms of noise\n", " noise = lfilter(filter_a, filter_b, noise)\n", " noise = noise / np.abs(noise).max() * cfg['sounds']['noise']['amp']\n", " noise = noise.astype(np.float32)\n", " empty = np.zeros((len(noise), cfg['n_channels']), dtype='float32')\n", " for ch in cfg['sounds']['noise']['channels']:\n", " empty[:, ch-1] = noise\n", " sounds['noise'] = empty\n", " \n", " # all other sounds\n", " for key, snd in cfg['sounds'].items():\n", " if key == 'noise' or ('enabled' in snd and not snd['enabled']):\n", " continue # skip noise or unused sounds\n", " \n", " tone = cls.get_pure_tone(snd['freq'], cfg['pulse_duration'], cfg['sample_rate']) * cfg['volume']\n", " tone = tone * cls.get_cos_window(tone, 0.01, cfg['sample_rate']) # onset / offset\n", " tone = tone * snd['amp'] # amplitude\n", " \n", " sound = np.zeros([len(tone), cfg['n_channels']], dtype='float32')\n", " for j in snd['channels']:\n", " sound[:, j-1] = tone\n", " \n", " sounds[key] = sound\n", "\n", " return sounds\n", " \n", " @classmethod\n", " def run(cls, selector, status, cfg):\n", " \"\"\"\n", " selector mp.Value object to set the sound to be played\n", " status mp.Value object to stop the loop\n", " \"\"\"\n", " import sounddevice as sd # must be inside the function\n", " import numpy as np\n", " import time\n", " \n", " commutator = {\n", " -1: 'noise',\n", " 0: 'silence',\n", " 1: 'background',\n", " 2: 'target',\n", " 3: 'distractor1',\n", " 4: 'distractor2',\n", " 5: 'distractor3'\n", " }\n", " \n", " sounds = cls.get_tone_stack(cfg)\n", "\n", " sd.default.device = cfg['device']\n", " sd.default.samplerate = cfg['sample_rate']\n", " stream = sd.OutputStream(samplerate=cfg['sample_rate'], channels=cfg['n_channels'], dtype='float32', blocksize=256)\n", " stream.start()\n", "\n", " next_beat = time.time() + cfg['latency']\n", " with open(cfg['file_path'], 'w') as f:\n", " f.write(\"time,id\\n\")\n", "\n", " while status.value > 0:\n", " if status.value == 2: # running state\n", " t0 = time.time()\n", " if t0 < next_beat:\n", " #time.sleep(0.0001) # not to spin the wheels too much\n", " if stream.write_available > 2:\n", " stream.write(sounds['silence']) # silence\n", " continue\n", "\n", " roving = 10**((np.random.rand() * cfg['roving'] - cfg['roving']/2.0)/20.)\n", " roving = roving if int(selector.value) > -1 else 1 # no roving for noise\n", " stream.write(sounds[commutator[int(selector.value)]] * roving)\n", " with open(cfg['file_path'], 'a') as f:\n", " f.write(\",\".join([str(x) for x in (t0, selector.value)]) + \"\\n\")\n", "\n", " next_beat += cfg['latency']\n", " \n", " if stream.write_available > 2:\n", " stream.write(sounds['silence']) # silence\n", " \n", " else: # idle state\n", " next_beat = time.time() + cfg['latency']\n", " time.sleep(0.05)\n", " \n", " stream.stop()\n", " print('Sound stopped')" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import time, os\n", "import multiprocess as mp\n", "import matplotlib.pyplot as plt\n", "\n", "from scipy.signal import lfilter\n", "from sound import SoundController" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Building sound stack" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import time, os\n", "from sound import SoundController\n", "\n", "cfg = SoundController.default_cfg\n", "sounds = SoundController.get_tone_stack(cfg)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "_ = plt.plot(sounds['noise'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Roving and onset window" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from sound import SoundController\n", "\n", "duration = 0.05\n", "freq = 440\n", "\n", "tone = SoundController.get_pure_tone(freq, duration)\n", "tone = tone * SoundController.get_cos_window(tone, 0.01)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAB46ElEQVR4nO29edQk13Uf9rvd1du3zIZZMDMACBAEKYGiCFFjRItNiRIpkbQtUIqYgLEl2paMSCJty3Hs0Efn+CiRk6PIkX0imxYM2Ywo2SYiR6SJ0KBIkZFNSyRFDGgQqyAMQQKYBbPPfFuv1S9/VL2q11Vvube+b2a+pe45c6a/7n79Xr+uusvv/u59pJRCLbXUUkstO1caN3oBtdRSSy213FipDUEttdRSyw6X2hDUUksttexwqQ1BLbXUUssOl9oQ1FJLLbXscIlu9AKqyP79+9Xtt99+o5dRSy211LKl5PHHH7+glDpQfH5LGoLbb78dx48fv9HLqKWWWmrZUkJEL9mer6GhWmqppZYdLrUhqKWWWmrZ4VIbglpqqaWWHS61Iailllpq2eFSG4Jaaqmllh0uG2IIiOgjRHSOiJ52vE5E9GtEdIKIniSitxivvZOInk9f+9BGrKeWWmqppRa+bFRE8JsA3ul5/V0A7kr/PQDg1wGAiJoAPpy+fjeA9xHR3Ru0plpqqaWWWhiyIYZAKfUFAJc8b7kPwG+pRL4MYA8RHQZwL4ATSqkXlVIjAA+n761lnfKNC6t46eKqeNynnzqDr59fEY1RSuGTT5zCxZWhaNxgHOPhr7yM0WQqGnfmah+/+/hJSFuonzi3jP/vT86KxgDAY9+8hOPf9F3edvnMM6/iGxdkv4FSCv/+v8j3sj+K8TuPvYJxLNvLV68OKu3li+dX8NlnXhWNAYCvfOMSHquwl3/wJ+fEe1kLX65XjuAogFeMv0+mz7meLwkRPUBEx4no+Pnz56/ZQreDKKXwtv/jP+I9H/4j0bhzSwP87L/5Kv673/iyaNyXX7yEv/XwE/if/99nReP+9Zdfwoc+/hQefuxl0bh/+Knn8Hf+3dfwX165Ihr3l//lV/DXfvM4rvbH7DHxVOG9D34JP/7gl0RznVsa4L//7cfx139LVvj4lW9cws//30/gF4V7+bGvvIy/97tP4l9/2Vov5JRf+tSz+Dv/7mv46suXRePe++CX8MBvP46ra/y9nE4V/pt/8SW8V7iXF1eG+Ku/+Rje++AXReNq4cv1MgRkeU55ni8/qdRDSqljSqljBw6UKqRrMeTccuJNXl4bY200YY97+vRVAMDZJZk3+tSpKwAgjkCePbMEAHj54ppo3Be/fgEA8MLZZfYYpRReXRoAAE6c40c8Z9MxAEQGRH83yVwA8OTJ5Df4unCcnu+VS33RuD/+xkUAwJ+elc13cXUEAHjhHP83OLuc7+XldDxH9He7sMIfU4tMrpchOAngVuPvWwCc9jxfyzrk5OVcGUgUw6kr+Y0qgRjOpYZjecA3OkB+Y790SWYIomZy2b4kMCDLw3xtrwjmM/fy5GX+uFNX8nHDScwedy5VlhIDDgDnU+P/8iWZMW42El9Mspf9Uf59Xhbs5SljL839Cck5wzEZjPl7eXZpgPs+/Ef4oxMX2GN2qlwvQ/AIgJ9M2UPfBeCqUuoMgMcA3EVEdxBRG8D96XtrWYdcMrytSwLP6+zV3BCIxqVK6LwQ19bKS4KHK6VwZS1Z2+U1/hovrlTbk3OGF3tFAIOYHu9FgSerozmp93sh3cOLgu+mlMLl1eQ7STz0V5eqXSfmOMm1YkYSFwTj/vMLF/C1V67goS+8yB6zU2Wj6KMfA/AlAG8gopNE9FNE9DNE9DPpWx4F8CKAEwB+A8DPAYBSagLggwA+A+A5AL+jlHpmI9a0k+XSan6zSJSlCX1oJc2Rc+kNvjyYiDw2PccVAeRytT/GOE7QQ63EOGIamyuCPTGVv0TpmQpZorz0nqwMJzOeN3ecBLNfHk4wSiM/yXViwmUS42heXyLjaEQEkutSw1aS77ZTZUO6jyql3hd4XQH4gOO1R5EYilo2SC5WjAjMG1XkbRtzLPXH6LaawTHxVGUGS6K8TKV6pc9foznuUkXjKNkT08OWKEtznVf7Y/Ta4b2cTlX2G0iM6oVl0zjyxy0Zc1Tey4pGVZKnySPO2hCEpK4s3oZycWWEVjPBfiXe79X+GO0ouSRWBHj/ymCCTjrOxOJ9sjqaYKqAdtTAlf6YTV/UCqvbaoiU16U0eui1mrgs9GL1XkqM6qW1MbqtdE8Ee7k8mGTjVoa8da6OJoinCp2ogStrI0ynvL3U+9BrNUVGdSX9jdvNhvj6itKcBPc6AYCVwdjYE/44bWzOLw/F9NidJrUh2ORyZW2E/yKk9i0PxrhpvoOFTpQpQI5c7Y9xy55e8hmCG251OMHh3d10bqYhSD//lj09xFOFVSYMohXBLXvnRIZAz3fbvjmZ8lobY998G7u6kciLvbo2wq1759I189e5Mpzg8O7kN1hi7uVaundH9/YwVQJjnO1lT2QcV4xxEuO41B9jz1wbC51I5GisDmPcvEt2fQG54R7FU9H1vBOlNgSbXH7qo8fxo//8i6IbbnUUY67TTG44gRK62h/j6N5ECXFvVKUUVkYT3JwZAqYXm96Yej6uctZK7/DurggmWE1ZOAd3dURK6Gp/jN29FhY6EdtYJfPFxp7w93J1OBErPa2Yj6ZGnAu1aWbS4T29GbgnJHpdh/d0sTrk70mylxEWuxH7OgESwya9voBZ2ErKaNtpUhuCTS6Pv5REA0+fusoeszacYKETYb7TFCmvpf4YR1JvlBuCr41iKIXMi+Uq2ZVUgRxcTG5wrkLR6zq42EV/HLNhkNXhBL1WU6zQlwZj7Oq2MN+JRJTOteEEBxY6APhKaDCeYqpgRFcyo5rtJXOd+jc4sNDBcDJFzNzLleEE7WYDe+ba7LkAYKk/wa7UqEogntXhBAcXuyCSQZaXV8fivdypUhuCTSxm64VXBBz21VGMuXYzUV6CG25tFGOxG6HXaoqVkNT71eMOLHbSuauN6zNZSqujGPOdCHPtSMTG6Y9j9NpNzHWiTHFy51vsRphvN9lKb6XiXq6U9pK3Tr3n0r1cGUywkH63VdH1NcF8O8JCNxJ56KvDCRa7ERbaERsui6cKK8NJFiXVEYFfakOwicXksJ8TVPvqG26u3WR72tOpQn+cGJDFLt9j0+/TntcS04AUlRdXOWslJ1Z6wwnmO03MtZsiz74/itFrNTHfboqMan8UY66jlZ7MqEq92LXh7J5w91L/BvsX2unn8H/zJOKMsrlZ6xwlRnWx25Ili9P5FgUGRBu1Q3VEwJLaEGxiedUo8Don4E+vDlMl1InYofswjT567WQc37OfhXi4irkcEfCVV6tJ2N1rAZAovRhz7QhzQrhMRwTzAkhpNJliFE8x326KYJCyceRVd6+OqkVXa8MYDQL2zaeGgPn9lgepIWgn1xeXkaMdjYVOEytMxTyOpxhOppjXhof93dLoqkKSeSfKhtQR1HJtxGTFXBXQ+1aHE8y3myDIYYK5dhO9dpNdGKaV165ehHazwYdqtNJLcXSuwVodTjDXTmAJybi10QQLnSbmWhFGkykm8TRrVeGTfgqzkbFmzhgAmGtH6V4yFXr6+YvdFtoRfy9Lnr3AqGq4DJDkFsZY6CZGdaoSJ4JTO6L3cjRpiPdkvhOJrktttA/tSq4vLqS0U6WOCDaxLKeMnz1zLZFHszZKvN/5Dh/D1cqj12qi12qKFfpCJ0Kn1RAYkGpwxuowxkKqFMx1B8cZewIAa8x19scxuq0kR8DOY5hGtdXkf7eRofRaAqWXJYvlOQINIQLy32A+NSDciKc/Svay15YbuYVOE90K1+WhNCKQJJl3otSGYBOLVv5HBfQ+pRRWRxoPj9iGQCudXju94YTKa6GC8qoCSyQRQTPzYtm5hTRH0BMqPTNHwGdSpYagE6HbamLAbDqnjeNCR2ZA9Lj9C9LEe5zlTZJxfAOi4TIArDyBUgprKTTUjSTXid6TVuqg8CIJ/V32zbdBxE+E71SpDcEmFm0IjuzpiSiISiGDT9bGMQvDXcvgjMQQcEP3tQIMIjEgc6Y3yg75NZyhlRcfUppv514sx0CO4ykmU5XCZVG6t+G91MprXmhU+1kkke4lc0/WUuOoFbPkNzChIe5eDsZTdKJG9htwIKVRnNBTze/Guy7z6KrbamBQMbrqCwgCX/z6Bbz1V/5AfEDTVpbaEGxiWR4kfO39Cx02Gyf30JvotJpQClljMZ/MQEMCLFa/r9tqiCClwTjBlTtRAw0SJDhTnLkaNCQb18++WzNrcTBknKa2aip0QZSkjW8yn8AQpJ52q9lAq0ls2GttGKfRlWwvh5NYvCfaOOnvphRvnN6TjvD6WsuMcSQaBwD/4j+9iJcvreEP/uQce8xWl9oQbGJZHiRJuV09Pn9a3wC9dpQl8DjefX88Scc10WvxMVx9M3cirbx4kcRwHKPbaoCIMNeOxEpoPvNi+Vh/z4gION9PK69eCmcAvH74etx8R5Zv0Z/diRroCfItw/EUnXR9EkhpMElgr9yzFxjxSLgn4zzi7KXX5ZBxreizHDpRUxQlrc5EEk02AwvIq9zriKCWTSHLg6SQZle3hdFkyrrhNB7dbTVyj42lvJIbZS41INWUV5Mdug8n06xR3ZwAUkoiiYbh2YcNpFIKo3S+uTRZzIGG+kaUJDGqxeiK+91yo9oQjouNvZTlhTpRkggHwIZPEmPcQKfFNwRF6BHgGeM8SmqkkCUfLgPkbCMgPzRH0vJ6q0ttCDaxLA/GWOzKWB3ay+pEzcxL5CmvWaYL2xudTNFuNtBoELqCSGKQsnH0nJKIoBPJ4IxMwabwAsDbS9OL1UaVsy96Pg2DcPMtg3GMqEGImnKYrWPupeC3M/eEs5fxVGEcqxloiBVxzhjHZBzn+81EBBIygmF4JHs5naqsAV9tCGrZFLI8mGAxZUsAPMrj0BIRcFgrs3h4orw4fXwG4xiddB5J6G5GBD0JNJRGBK1mA1GDWMdAauPYjZrZnJK8SdeMCDjzZcorUbI6URoel/PxJVGZGRH02oKoLIV4mg1Cu9lgYvb5d9OOBuc3WDNgtp4gkhgaEUGv1cQ4VqxjVNdGCStN/wbcHNTSYJz9VpIizq0uG3VC2TuJ6HkiOkFEH7K8/neJ6In039NEFBPRvvS1bxLRU+lrxzdiPdtFdMGPhPI4MCKCKrh2zwjduck8rRAkDBkzIuhEDfa5vhrOyMZJcGYDzuCMyyi1Qu/XjMokkUTy3RrZnCKFns6T7CUzApnkRpy7l4MZh0FDj5wcVL6X+jdgQUOTfD59H3ANSK/VBBGh2+bnrnSX38O7u7iwsnPOMVi3ISCiJoAPA3gXgLsBvI+I7jbfo5T6R0qpe5RS9wD4+wD+k1LqkvGWt6WvH1vveraTDFI2iMiDMrxRCa49MvHplix01wqh12qyFboZEUiU18y4VpM1zkxo67GcdZoVwh2BUZ2BogT0WDMikEVXpnFszjQr9I4b53vZZhrjwWQWs0+eC48bGb9Bdj2LoM58Pq4ByeAygVHVp9DdftM8xrFiw3pbXTYiIrgXwAml1ItKqRGAhwHc53n/+wB8bAPm3faiE6NzAoaMqYQk3ug4noIIiBok9rxML7ZSRNDiKS+lVIpryyIJ0zjmhoABL2RFdrK91O9pNw3lxYrmZiMCGRVXG0feniR7WYzKpBEB/zrRcE47ynMSHANizpcbEF5UZsJl3L3U52Dfti85VGinNKvbCENwFMArxt8n0+dKQkRzAN4J4HeNpxWAzxLR40T0gGsSInqAiI4T0fHz589vwLI3v/THceXkWtdIFrO85niKVjOhc0o8L1OZSAqFqkQEJqsG0F4sn4ue1C0IYC8jRyBJvJsJdFk0Zxg5QZ7GjAi4WP84VpgqyKOrGeiRD5dpQ99qGtcXR6FPpmgUHRSW8c+vL0m+pdQKfIecbLYRhoAsz7mu3r8I4I8KsND3KqXeggRa+gARvdU2UCn1kFLqmFLq2IEDB9a34i0i2muWeJXZjSqNCCYK7WZ+43Dn04VhetyUWcBmRgRcWKJoCMQ5gigpuCJiUmot3i83AjE9e/OzfGJGBPq34+xlAilJ4bKcjZP832DtycDIt0TNBpoNYl1f+nu0mg3xnnQ11q8hS1ZkbDgoFVqmaEOwU3oUbYQhOAngVuPvWwCcdrz3fhRgIaXU6fT/cwA+gQRq2nby+efO4t7/9XP4xoVV1vunU5VhxllfnXH4osxZHfLQvR3NGgIWZmwoL21IODBPKSJgJWFzxZyM4+UkTJyZiNgRiAlnSOmjOgnbFkBRpkLXe8mFa8QK3WDjZOMk0JAmCAj3siPcy4Gh0NvN5H+uccyhoQY7Ul3doe2rN8IQPAbgLiK6g4jaSJT9I8U3EdFuAN8H4JPGc/NEtKgfA/ghAE9vwJo2nXzsKy/j3PIQjz51hvV+7XmZdDtuKA2keHhGH+WF7q1mEtxJlJCZ4NTzcRXKrEKXQ0Ns5ZV5sbL5tMIxsX4ua8hUzADTOBYUOsCNQKrAbMWIQGZUtTLnFnnl0FAjM468PTHJAXyWkmkce61mVv8QkuwI1bR9teTM760s6z6PQCk1IaIPAvgMgCaAjyilniGin0lffzB9648C+KxSynSJDwH4BBHptfxbpdTvrXdNm1FOXk6qFU+c45WtZx5bJAulTWUZK02V5EUEreasF8u5UatEBFnS11BeI0HS1zQ8vEjC5v3y4DIgUV5iaKgl38sZiCdVYpy9LBpV7lxArlw7rQarInlQiMq4BXM6ImilvaUAJoRoOBrZ9RXz7oOFtGI6+w2MqNcluoHfrm5y8NFOiQg25GAapdSjAB4tPPdg4e/fBPCbhedeBPDmjVjDZpdXl5LTxl66yIOGMt5122ydHL4oh5O8OrWbOkBcDLdtKGZAorxyrJ8zLldChkKXNCCLcmW51OfsSZ7gzOZjKq9mg9BskCgxmhi52T2RQjzcvZxMi0lfaWFYHoFcWq0QlbUarOSt9sbbTcMQsKOkCkZ1PMVN87NGdTiOM+PgEt2RdbGbvG+nGIK6svg6yGAcZ6eNnV/hVSua3RpbzUQZcXuz6BtHJ0a5Hpv2uCQUSzMi4DJySsokZbqEMNxhCeKR00f1OocMb3QU53BZlFYys3MERaPKSqDPFobpz/KPmfXQ280GRnGYbVSKCJhwWXG+TtRkRZwma0gnmbl1C52W3KjOMKkEv8HKMM6OGE3+rg1BLRskZ9NoYLEbZTzlkJg3HBFhrsXrxzM0CmmICF0m9pvkCKpBQ+KIoKhMWrwkoAmXAZIEZ4F22uRFBOaeSOYb2owjk4orjQhsEA8Q3sthKbpiFpSVoCHenmijmsLAicHiXl+R3EExE/bZOE7PrbSaX/d7qg1BLRsmF9Io4A2HFrEynIhuuJ6hLKUFXkCiUDg33DhWebJY4EGZ3m8+zr9OW9IX4Ci92YigLaSPzuQWWHBGtb0cWrxYaUTAHVdk8eSGJzCuYr7FrCwGBHULBaO6rr1ks9Jm94QXEUyyA34kHWC3utSG4DqIxrFv3z8PYPZQepeYRVCArOjKPEi8lUIFITFzBOKkr7FGgKGESvACz9MrJ33l9FH9P5fyaCqvVrPBang2YxxFexmXlFdoL8sQD49tVN4TGTRkRi48R2M2UduOeNfl0IwImpIeWOXcAsfQrY4mmG8b9QeC9tVbWWpDcB3kanre8B2pIdCNrXzSL0UEfFqg6cUmjJwwbc6EQTKohglLFL3YEP5ejgh4N/igRHnk00ebaQJdj2fBGVW92AoJTl3pW44IuApdaFSte8mLkqI0gQ4kho5jHEexBWbjJt6rRgQF48hhG60N4+x8Bklb9a0utSG4DqKPmdT9SzgRQc4aypUXD1O1wBmMG9VMFud1BDwlVBwXWmcpwZl5bEIvlmscC3vCLboy4TK9Tk6SeRaWqKaY2XtpVPom/zMT9uOyEeck7Ksax5FRuZ7Nx6xAlxrV/CCi4vXFjKh1/YGgpfdWl9oQXAdZSiOCI3uSakUJX1vq/ZrwAqCTcrLKYq38QjecNjBFaIgbSRTpqlKGTCdKCoUmjAjEhMu4Te4SuKy4l8zfIFWwUUqXFO8JszjPBnvpNYTWmLw//+2UQrDoymYc2Y6G6aAw99LM0zQbhKhB7BxUiYHFNOJ6nTU0VMuGytX+GN1WA3vm2gB4lLQsWdw2E6Oy9gYA0IqIVVFpenpExPLY8srbRDFwIZ7MgBSUHtfwlOodgoagDJdxcwTtgtJj5QgqRGXjwnfjVnfneymjWNroo8nz/musWJTVbjYwZsNs+V522JFEOQJh502E+ZZkrNnvqTYEtWygLPUn2NVtYVHATS6xhtjUxaklIuCyhoq5hYDyyrjhQjy8MI5rQMyiJL1GgJdQbZcMgYxSq+eVFtlxx5lVzHqNeg3+cbPwnGRPZsYxI5DxZDoD8bQEEcHs9cWkNcfl3y5MjZ2tG5Ewt/TZ1oCsWd1Wl9oQXAdZGoyxu9fKaGm8g9OLrCFu64AY7agQurNhEKEhiF2GwH/zZAq9yOoIwhl6vjQCYeLhZv4D0EVQcuXF2cvpVGFUoJ12GAf2lKMd/ncDkshvdlzoN3AYEMZ8rUJEwK0jKLGGhLRm7jgXPTkUUSulZtYpPfT+4189if/t0ee25KlmtSG4DrJkHEJPxDMEw5TpotkZfFZHMSnHq6ItwSCMG9wF1YTHJd+j6P2GlPPYUpSUzBdQspNCtMMuglKzSo/hjY4KxlGvk6vQ28VaDuZvII4kUvZPo1EwIAHFVyVy1POVjGpgL+OpQjxVWddRPY6deC/mrgLzTaYKSuXXlSRHoJTC//A7X8NDX3gRz55ZYo3ZTFIbgusgq8MY850IRIT5dsQ67GI0KXqxAlx7xmMjAYYr89iKUA0fGtIwiCy3UCxKYsMZFi+W04ahBINwIJ5C/kM/Dir0ijCbfj0/S4K7J2WFzhlXpIFy8ybF65kFlxWiHe64cgU6L0eQ7aWZI2BCQ2brmK+9cpU1ZjNJbQiugwzSk8YAYKETsSKCElTTunaeVzZuRnmFoaii8ooaSW8jrtdchCVCbBAbzgzwIoli0hcAxlPGuCLMFvpuhT3JxglhNs2QCUM8s7kF7T2HII1i8jbbE0ZS29zLVrOBqUKQuVWEeDhRWfE6AXg1IEUGljSBbhoC7pnFurswALxyeY01ZjNJbQiug5j9eOY7TawOeYnKdiS7AfQ4aYJTKWWBlPhMF32Dcw99KTFkmNDQqODFZjRXxjqLe5I8H+DMFw0Py4udVcwAL5orwmz6Md+AzEJKYRro7PWl18uZr2jkzPVz5+Ml0O1GlZ3/ENYf6NfNcwxG8TRo5ADglGEIzMdbRWpDcB2kX4gIqkBD3OMcqyTlqioh6zhJyF+AQaTeaK7QKxoQIRRVRTHzx5UNiMgYF2pAOHtZbJ8BMKI5i6OhnxeNW8+esPMteXTVaoajqyI0pIs5OQc7nb6SKP9vO7oLp67UhqAWi5jNxOaZ0NCwyDyJeJWfxRCc0x8nv+GKyeKA52X12MKRS/EGz5WQzItlG5CCEmoxx41iVfKa2bCXtI6ggPUDvDYMRfiEb1RV4Xej7Hn/fOUEurkO3zpLEacwcgR49NGiowHwHBQNTZoFZQDvPI+LqyN0ogZeu38hazK5lWRDDAERvZOInieiE0T0Icvr309EV4noifTfP+CO3Q7SH8fopoVhc+2I1U56bOG+K5UwG1ziYllIuegALydhU3ocdlORBsr17F1eLCuSiMqRBEcRFZVXKPFe9Eb1Yzb7R5iTKNYfsD37uJAjSK+Z4Peb2PMtrL0UQp05I2q2EI2b9J0lFghyC1niXR8IFb5fr6yNsGeuhX3zbVxm9BLbbLLuE8qIqAngwwDegeQg+8eI6BGl1LOFt/5npdRfqDh2y8p0mvQ9yQ77bvEqhG0QD5BcrOYFboqVZRHxK4Sl/HCb58WtPzBpoBmcEYQXihBPI3s+PJ88krAlVKWKGeAVT1X1Ys1T1Mzx49CelKIkPqRUhAKBitBQnES4+jqwjTHnMMd558rqVGRso2L9ga7q50QEV9bG2DvXxp65FpYGE0ziadbkcCvIRqz0XgAnlFIvKqVGAB4GcN91GLslxDyEHuBzk8v00TDP2+aN6gSnD1JyMl2YSk+c4Cx8t2bKNmJFBDNz8ZLFRSXE9ZptSeZxrLy0U6tRFdBHywwZDpMqV3jaKHAYWNZksXRP2MliO13VN66yccz20uwvFY5UR0VDIDgr/Eo/KRrdN9/O/t5KshGG4CiAV4y/T6bPFeW7iehrRPRpInqjcCyI6AEiOk5Ex8+fP78By74+UuQ099oCQxCVbxyfl25T6PqxD1Kycd85PV1soTun4Keo0Ikoxd8ZOYJC/gNgRBKlZHHYa55OFSbTIo4eVl7mkYzmOHZNRvE3EPL69dy85nFyz941LhSB2HoUheaz5QgkrCEzMubkFmx1BABYUO7VtTH2zLWwN+0nttXgoY0wBLa4rnhVfBXAa5RSbwbwTwH8e8HY5EmlHlJKHVNKHTtw4EDVtV536Reax3WZJ43Z6giA0I1jZ1lUGdeJmvxGaQXFMAnw84uKWY+7pjkCG67t80andkZUaD7rnrCU0Gy1tf6MCcs4Fg0BLydRJBUknyej1OZ76b6mE3ry7G/AKQYcWWC2dsTbE9s4aUEZt0obAK70R9jTa2eGgHPmyGaSjTAEJwHcavx9C4DT5huUUktKqZX08aMAWkS0nzN2q0v5jNekSCVU1VquxAxX37o8KP15vrmAohKiIH/aFYEEvcOJTXmRmAYqoZ3a6KN+hT5bNW3Ox/FibZCSf41l5lbSOTYMzxWNaodR7Vs1b+KKynzXpW7dYI1UPfuSX8+z84W7zTogJSHji1vxrpTC5bUx9sy3sHe+BQC4vLbzDMFjAO4iojuIqA3gfgCPmG8gopspzQgR0b3pvBc5Y7e6aMaBNgQ9ZqM0NzTk9rxcUI35Gndci6W8LIaASe8z59KfIeX1S2inxUQ4wDWOwkjCYox5Rs42LqzQR/F0BgLhjitGEuz6A0vSF2AaR0tOwjef3UHh06GL7UFC4/S9VezIykkyjyZT7O61sLuXGAJ9PO1WkXWzhpRSEyL6IIDPAGgC+IhS6hki+pn09QcB/DiAnyWiCYA+gPtVkr20jl3vmjaTFA9O1/UEg3GcwUX2cXJoyJZw5FSMWpWXgJ0xS0NkeLEWXJtbPGWjgfrm01XTUkjJprxYBsQCs3EVMwC0GrPjQkbOniNgGHEXA4tleMoOim++jFRgMTzSZLHEQSlGxqH6nSxZrE/Oy6IdP5S7PEg+d7ETYbGTGAJO0ehmknUbAiCDex4tPPeg8fifAfhn3LGbWYaTGL/0qWfxI28+invv2Bd8v24n3StEBP1xjL2ecaVWxoww1UXn1J/nnMthQMYBep/2Ks3X2d5oVDAEzBtcWiGce4eyvjrWPWGMs9VkaOUV2kuzG6j+DI6HboPZWBReYYsJm1HlRARD3W1WmG9xRUm6XqbZcO9lgzDzOseAFH9zblPDtVGi9Oc7ERa66Zkjg61lCDYCGtpR8rlnz+Fff/ll/L3/52us9+c5gmSrdRQQYg7ZWkwAfu+kqhdrx7UJSiVFar412iAeVnWqzYsVMlY4tFM7VBOGlKxeJQMPd9Vy6PW7pEhxTdZZLbriVkDbaKe8vEk5R+BLFvvG+fJJVoiHUe/gZlLxcgulHEHgXtUHTc21IzQbhLl2EyvDnUcf3VHyhycS6uo3L66xKg77pZPG+N0hizhz8rxPmdixUaC6svSG/AWvUo+T1hEAvMRo8QbPaafy5K1eh2+u4jgOi8Q2jpucthpVhnEsRVeMZLEtYR+KynxkBK9Cn1iur3XUEZiv2cT63RgsuNIRqswaCU0vXUgPnlroRKxTCDeT1IZAKCfOrWSPX7yw4nlnIkXWELda0cW75il0WQsAG8uCgxnbqYtMhW5JcLJyBAVl2QmwlKyKmVGIZqsQrsrAYiVG4yna0WzOKGLnCGb3pAoVN1mnH1LyKWZf9XpV42hL2Fd3UMJwWQka0lF4gHaaRQSdtLFkN8ryBltFakMglBfPr+KNR3YB4LWbLRmCrH+J++Jy9QwCKrAsBHUEUhZJseWDnrsqnCFlrACJZymlgXIVc/JeqRJyz+c3PGUjVzXxzqHwFmE2IBxJWE9fu4bGsSrbaDxRjmgnDA21mnmeJmo20CBGjmA4GxEs1hHB9pa10QQXV0f4njtvAjB7GIVLsspinSNgdDQsFrYAwhvHlluoDA2FvFg5Y6UKLKHns3l6nOStDbOvUtWarIPR5sMazclhNikNFOAyvhxRmdBh4MBl67m+ivPxCAIuSq38uuS0+VjNcgR5RFAni7exnF9O2su+4eZd6LYaWQ9yn/RLBWWNmedt4jMEHHzaqoRYIb8wmWdLFkfEqyMQKnQbY0WvsyqcwcLDLeNC8xUZKxGjqZ41wckpDLNEZaFIIq/0lRkem1HlOSge+qj3+rJTcUPz2faS0zm2mJcDeF14V1PWUJ0j2CFyLjUEBxc72L/QwUVGGflgHCNqUHZhdhmNrIaFvuiAoYSEsISoP06FZJ6dBspIcIoVepl5oufjFcsJjaoHZvO2RXBANcl3qAKzKW/DwCoJ+9hS6QtoaChsHIvMrWbDj7+7CsPMz7SOi+OZzqrmZ4QYWNbri5NALxoCRr+nVYM1BAALnVadI9jOoiOCA4sd7Jtvs/qJmKeTAXmy2EdJywpbLEpIDA1JIomZcVVpeo1KtNMQPm37brxxZePYbBAaTNqpdC9t+DQ78V4yqske+RoG2pLFQc/eUvSm//at0UYqSNbJZW6VFbqvL5WdScVhYFkigiZlba9dktTuzCbsOY3/Vkcx2s1G9vstdiMsD2r66LaVc0sDADJDMBhPs0pFgBcRjKwhOANe8LRFCCXXknHynEQV79d+o8ppoPpvqRcLcBKj9m6gQLiTa9FD55z+ZWNE8SIJG1XSvyc2CBEIQ0o2uEx/jhSyzIrzvHRoO1xmrsW+zjKlluOgDCexJSLg5Qg0YwjIoaHQaYKbSWpDIJDzK0M0G4R9c23sm+Magjg7+xTI21H7WEO5h55fXLp4iqUshcVT/hBcpoQ4rQOcSWYODbRqstjW24gxTpqodBXZAeG9dBpVb9GVvKAsV+jVksVSxpe9cp3XYqJjgR7NtVjns0VJzKK+crI43LV0dRhjvp03aVjoRpgq3jkGm0VqQyCQ88tD7F9oo9EgQUQQZ6eTAQklLXRwiC1ZzCmeskM8nGSxvZhJvyYZlxcYBWCQkqfHq2rtWJRQCLNPPt8SgbDGCaOrDYySeHkaebLYH13JIJ6q83HrYjYy4gT8e1ns7wXwzjFYHU4wb0QE8yn8uzqsDcG2lAsrI+xf6AAA9s630R/HwerivqW5XOg4R5shAMLFU1aIh1E8ZYcXeFiszbNPXgsZEKEXa4HLknXKcwR6Pqny4mD9xUPazXF+L9ZSIczM09ijKxkUCGjaqRxSagWu58r0UUfbDXMtrnE2Sq1+zTvOBg2FIoLRJEsUA0AvfczpPLBZpDYEAtEHVAPIjqQL9R0vRgRAOAFlC6UBTvHU1A3xBLxft0LfWIaMLpazeWzX1osV4ui+autQtOOCM6RRUmAvbQe+AOE6Al+U5Dcg1fI0/oIyWcTJuZ5dyWL9mnOdNigqCp+INhjHWQ0BkEcEa+OtwxyqDYFArqbnkgLArm7abjZAE+uPp+haIgKflzF0eV6BMnkbNhpxGrN58Gl/byN5jiDPY8gKfmw0UEArL06yuMw+CUEuwOzxndzGbGVPm8t0keUWXDTQEO3UlSNoM+E5m6HzGx5fHUHIQSk7UeZaXOus4tgMx2VDwKGPDsbTjAQC5MzAGhraprI0mGSGYDFtNxuiiQ3HcZYg1hI6BlJ7O8WLkpOUKyoFznnAfoinGhbrGmfLY+j5dLRgn8sB8YTYPz4vVliIpucPVgg7FHoIzpAa4yx5a1Fe5uu2NZqfb85XKSpjUn/LOa9wbqEqk6pSLYflPui0msGCsv44zgpFgaQdNbADoSEieicRPU9EJ4joQ5bX/xIRPZn++yIRvdl47ZtE9BQRPUFExzdiPddKrvbHWSSwkBmCUERgzxFwThqzdZWUsiyAcGLUjtnzOmY6DYhLeTnyHyGv2a28/J591b0cTcoVwtl8QdaQnOnip536jar0t/MZAl5n1XKy2F9bYR8XNcIGpEqOIHFs7CSGECRrZQ0FI4J4NiLIDr0PQ0NKKfzH589lNUo3StZtCIioCeDDAN4F4G4A7yOiuwtv+waA71NKfTuAXwLwUOH1tyml7lFKHVvveq6VDMYxRpMpdmXQUGIIlgIRgTNH4IGGXDkCDo5evHGAMMVyWNGDcjWBA3zQkD1RGYokXMokaOS8uLZ8L4MGpGq+xVEN6xvno4H6xtkOhdd/e5PFrtxVKFKNpyCHUZWe0cA90KaKMbYli3k5glloSOcL1hgRwWefPYu/8n89hr/+WzfWB96IiOBeACeUUi8qpUYAHgZwn/kGpdQXlVKX0z+/jOSQ+i0lS/1E4e/KoCFmjmDkigjkrCEOz9ulvKqG4CEWSQnrb1TzRkPYr7uOgFtFa2nVHKhbKO5/Pq6aF1s1ugrmW1yQUsiAFH670KH33kgiyOtvlE5nCxtVZf29gUCyeB3QULGymFNHMCw4exoa4hiCTz91BgDwxCtXcPLyWvD910o2whAcBfCK8ffJ9DmX/BSATxt/KwCfJaLHiegB1yAieoCIjhPR8fPnz69rwVXkamoIijmCUHOpwWSaHXmnpRP5cUcnTY/lQZWP7+MUGEmZLkopO1UywLUfOjz7sPdrzxFwq2jtVEkZi0ePC1Vpu4qZgh0zhbUcLhpoqBWGD2ZjGQKL1xyiqxbrP/T8IYXuvr6kyeJwZf5w7KosluUIem0+NPTVl6/g1n09AMDxb14OvPvayUYYAtvBodZfiYjehsQQ/E/G09+rlHoLEmjpA0T0VttYpdRDSqljSqljBw4cWO+axVI0BL1WE80GeZPF8VRhNJnO9BoCko6G3hyBIyLgwBLWiIBB75MyXXyMFd84V5uCEDXT741WSfrKsX7ufCWmS0ChT6cKEwulNqS8RpazgJO//S0tqieLPdGV97qMS2vU84XadRSjllCOQDsorohTCuvpgjIXA2sSTzGZqlloqMWDhgbjGC9fWsOPfcct6EQNPHtmyfv+aykbYQhOArjV+PsWAKeLbyKibwfwLwHcp5S6qJ9XSp1O/z8H4BNIoKZNJzoXoHMDRISFjv8kIq3su62yYvB5GcOKWKwrWZxASv4e+nKFbqcShtoL2xgkM+OCMIi9qtVHlSzWViSfE1Z6Rdgrma/hp9R6PXtp0peH9Zc7sjYD8/laRShMHcrZnSMIUHEtURJrnO26bPj3RBsWJ9TpuO+m06TNeSlZHDjAfpA+bzp7UTNpQBcyBK9cSqCg1x6Yxx3752dOP7zeshGG4DEAdxHRHUTUBnA/gEfMNxDRbQA+DuAnlFJ/ajw/T0SL+jGAHwLw9AasacOlGBEAusug2xBo+lg5IghAQ55kcRhesMEZAUjJEkpHDcpes49xedq8iEBMO/UkfX3NxGw3N8BpOufaS06+ZXZcqNupft5GF9Zr8Y1zMmtc0ZXr+tKwi6MjqIavilg/h4pry7eExtmiskaDEHlqOVzXCTcH5YJInYYgO29kdtxcuxmEhl5ODcGt++Zw58EFfP38jTMEUfgtflFKTYjogwA+A6AJ4CNKqWeI6GfS1x8E8A8A3ATgn6cX0SRlCB0C8In0uQjAv1VK/d5613Qt5OqazRC0vNCQ9haKF0kwWRzPHpmnJejFWnraA4zQfRKXlAIRecflxsruebnaC/sYK/o72MQZgRghf2T57r68iRdntuDTAIMq6UjY+yClMJNKGF0F8jSuoj5zvo5FM/iZVJ6unp5xfmPs3stJBdjLfL08l90Y687BSXTfKg7LDEGn4OzNt6NgRKANwW375nDn/nl8+qkzGE7iUsL6esi6DQEAKKUeBfBo4bkHjcc/DeCnLeNeBPDm4vObUZZSz39XhYigBA2F6ghcSiiQGB3GU+xuly9WHtvIHrq7PDZfcRHgVui55+VIqFZkyIwnCmjbx7m8UZ8x9o2rmltw7okr2qlYR8A1IN6cRMc2zq2YQzRja+I9ZIydUKcbUvIRLczXi6KZQbbKYsAdXRXPJNfSazeDBWWnr/TRiRq4ab6NW/bNYaqAV68O8Jqb5r3jroVsBDS0I+Rqf4y5dnPmRlgM5AhcFwmHPlpFCdkOQAd4hWjW+TweW2Ws3wnxBJSeq46AYUDsUZKfIeNMvHMgJUtuwcfIceU/suhKGEmE8HBnjiAQSfj2RNp/KZmfkyOwX89V2GWAb0/s17M2BG5oqJwjABJoaDUADekmlkSEW/YkzKFTjONvr4XUhoApS0afIS1zncjbc1wbglKOIEBJcxmCduA8YC8WK0zKZeOc2PvG5gg6DCVkny9Ut1CxtsKZ4HQbcddZwHpc6Lu56wgCVdoVjaqLueX6fi5HI0w7rRZJVImunF1qmTkopyFw1BL4cwT+iODCyhAHFpPQ64g2BJdrQ7CpxWwvoWW+3czOK7WJ9hZsEcFo4ma6uIqZKlfDem4cwF5ZnI9zhNKe5K1ei01CSq9KW4TQfM7aCmHDM8Cfb9GUWpchCBZ4VTWqjnYKcgaWf1wS7Tgw+6mfbWT17D176aLUAkDkMTzVGVj6Nyg7bQCcUK7rHp9rR0FoKDnfJDEEh/d0AQCnrwy8Y66V1IaAKVdtEUEgIdR3RAShvifOHEGQneHwvBhMFxsW67vh8uStsAjKcz4A4KedumigyTi3F+tMOE79HTpdMFvou9mUpXecM4EeqiPwR2W+mgxby4fsKE5PbsEVXQFutpHLqEZNcnv2U7vDAPiNqo9dlnwHf57GlSNw3av6Hi+2kekxoaEDi+10niYOLnZw6sqNqS6uDQFTlgYT7OrN5tY1RcylTFxhYyfgsSUnJZVvnFYoWexUeuGWy+7QPdTKeHadQepiRY/NndAOJ0btMFtYMbj2UuqN6nEurN9VGNYMtBAPGVUncyu2t3zg1C24IkdzPeV1uiAlOdavn6uau3IpdO3xl7uP8pLF5nG0QIIW+CKCeKpwaXWIAwt5Vv7Inl4dEWx2WeqPZxhDADDXaWKqGN6CpY4AcOOOPmjIV+Xo9GI9MIjroBhzPutcjuRtqL2wM+nLCN3t3mioEM313cI9kZx7EjByUqWXU2pte+mmZlZlbo0n9toKTlGf67pMvofwt6twfen5pBEnmw5taTEBhOsIipTPuXbkhY0vrY4wVcD+xdwQHN3bq5PFm11s0JA+sNr1gw89rCHAjTuOJrG1N0ueGJV5v37Py44z6/mC3m/l+YrKK6yYXVXTvnG+HAHgi1zcSWYpxVU/F1LorhbiUqPKUeguzB5wQ1E+z978Hvb5qiXQ7dcXh4HlGOeKCByRhP574CCF5LVCZdaQj0hycTVpO73fjAh2d3H6St/p6F1LqQ0BQybxFCvDSSlZHGo3m+UILN1HAb8H5YczZDecD592HRQDhLzY0DjZfGHF7FYmgF95ecd5FJGz+6gQn87GCeGy5DmG0nM1DJQq5gBc5t7LEBxYrlxP5iNnPsK3l76ozGUck/nk13OwjmDkZg2NY+Ucd3k1KUTdO5cXvxzZ08NwMsWlVf/xt9dCdrQhePyly/gL//Q/47e//JL3fbpWwJYsBtyGIGMUCBNQPmgIsN/guleKFOJxhcR6XKjSV5qTcCdGdd7EPZ9PoXvhDA+u7R8nYxu5FHPyXFUvlkE7rcCkkl5fyTh3lOQb585dhaMra5TkU+gVo7JR5tnboSHXOt0FZf5Tyq72E2Vv6pTDuxMK6Zmr1z9PsGMNgVIKf//jT+LpU0v4pU89i8seK2zrMwQkOQIATnZAfxyj1aRS64MQ7uhri6BfL4qPZaHbIthCTq8SYsAg0h4yLvYP54hLL5zhYeT4lZc0WdzA1NHbKG8CJ1PoLiqufs7JpAq16/AY1Uo5Ag/W7x3nyV2FksVVSQzSk/ryRo8OGNcJDcWIGlRaZ+gA+0ynzOU65UhGIb3+eYIdawhOnFvBn55dwf1/5laMJlN89tlXne/NOo86cgQuq287nQxgVDk6WEO+G87VIjh5TrNILIbAo7xYOQJpYtSJ2YcbpVXxRsexm/teZZxvvtw4us6EkCU49Xy+NdoptX6GTEih++Zzfbfkc6vkrmSJ8OS5atGVN5JwRMYhqnfxdDItvQBsrA3BnjoiuLHymWcSxf/zb3899i+08aWvX3S+1xkRpD+2K1k8GMfotssXSThZ7O41BNg9PVfrhtlx5Yu5atLXnyNwdzt1edpRs4EG+dopuNsU6Net81UwPEmFsN9rtikGrxKqQHnU8/mx/vJ3CzG3EiMnT/r6OrLq193rtF9fmrVWFNcBRnpcEHoU7uXIRR9l1BEU4STAgI2H9nv8ytoYUYMyHQIAN8230Y4adURwPeX3nnkV33HbHty8u4t7bt2Lp08vOd8bMgS+HIHtIsmgoQr0USDkjfoSqjY4Qyt0KU0vhMXKMPt8XMUcgZfp4kuMuqMracJef+eoUdWLLf8GvgPeXYo5+Sw3PBdS6L72DdJIwpu78jDFciquzKgOPXvJybcUIaWo2UCz4e44Oxjbu4XOB04p0yxEs5aj0SAc3t3F6ToiuD5y8vIanj61hB9+480AgLsPL+LF8ytOithSX3cenS0oC51N2h/FpapiIHzYxXDi7roI2JWeN0mmvZq4vM6QAamSGG1HDbFnDwQYOa4cQUWs35db8MFePqXnMyBexTxx72WSp/HVjXgMgdhD9+cI3Mli93Xpz12FHRtnSwth/yU9zpeX863TFb0Px9MSKxDgQUNmfkDL4d1dnKkjgusjn33mLABkhuBbDu/CVAEvnLUfDBGOCBzQ0CS24oc51m+/SJwwiCcE91diuusP/Jgqo8WEOJmnEFkULOCn91WlgYYiCasSCiRvk/e44TlXBBI85McSSbR9rcAdiXC9Tl905WNSbWQtR+g6Md9TnMs5riIDy5cjGE6SthtRo3xtJkfLuiMCW9QfchJtdUlAQiGtcwTXSX7v6Vfx+kMLuGN/0vf7dQcXAAAvXnAbgqhBllazuqDMHRHYDEEWEbigIUeOoJMpIRk+7ePah/ja0mIm/ZyvcZnbi/Xf4D7M3htJONpCAw4vlhFd2Yy4vzjPvZeTUCQhxPqBBOKQ5hZ4hWGycf7rxDfOzxoKVnc7a0DckWO7WW67AeRNIm0ymNgJIVn+MAANFeXI7h5eXRo4T9y7VrIhhoCI3klEzxPRCSL6kOV1IqJfS19/kojewh270XLmah+PvXQJf/5NR7Lnbt07ByA/Q7QoV/tj7JlrlS6SZoPQiRqeiMDOKPDRRyfxFFPlUAoeGMR3w7GSxbYEbsOfI4ga5WML9Wc5lYkDqtHjfFRJaR1BqC20a5yrQypgNnTzQUryHEHD0gROf5YPD3fvpb/Nhz9KkhaU6b30RJyOpoZ6Pc5xTtqpK7pKnrd59r49GTqKOAF/23iXszefJYvtuuHKmt0QHN7TRTxVOLd8faOCdRsCImoC+DCAdwG4G8D7iOjuwtveBeCu9N8DAH5dMHZD5eNfPQWlgB+5JzcEvXbS+e+li3ZDYOszpGW+4+5AOhjF6FmTxe4Ep08J5TeczxuVKT19Q1lD/kAI7lJCIYaML0fgZZ4IE+G6LbSUSeWnc/oSnO5xUTD/4cP63Xh45RyBMAelmVS2dWZnSXgiTikUVbXITht+l4PiO5jGdUSk70RBF300rzFyQ0N7HBEBcP3bUW9ERHAvgBNKqReVUiMADwO4r/Ce+wD8lkrkywD2ENFh5tgNk4e/8jI+/Acn8NbXH8hgIS237ZvDS56IwGa9gaTFtCv8c+YIPPTREC0zeY/N8/J3azQ/2zafnPJo7waqP8tXkVyd6VKeT/PofYpZynQJwWV6PeX5QsrL3vba1QQOCOVpKkZXjhyBj3YaSoQD8uiKkyOQnn8wdhRj6s/yVdjbnCEgPVHQdTDNxJ4jaDcbiBpkRQumU4WlgTtHACTIRVGePb2En/hXf3xN6KUbYQiOAnjF+Ptk+hznPZyxAAAieoCIjhPR8fPnz1da6MXVEb79lt345R97U+m1226a80JDLkMw32k6ucIu1lDUIDTIDg352Au+U7xYOQJvstjuQTmraD2evbeni0OhJ+PkOQK9dh/s5YXZrEaVgWuL4Qx/wt6m8PR8lYxxhRyBnk8K1fjyNKHCMNe4/DhNW8+gdJylzbZvLzs+mM0LDbkNyNARERCR85Sy5cEESpULVAHzgJpZZT+cxPhrv/kYnjm9hG9eXLWuZT2yEYbAdkUVr3bXezhjkyeVekgpdUwpdezAgQPCJSbyc99/Jx5+4Lszq2vKLXvn8OrSwHoT+AzBXDvCmqv8fGyPCIgInahpnWvoMQTe5JpPCTFyBNL5JgF8WlpcpOfzeWzScTnzxJMsluYIPMwt/XsWW4roNZprKq7TG1152EZumK16JCGOkjxQp69y3VfLMcl+O180Z3NQQhGnK1kce6Iyd0TgKigDUt1gcRKzqmKj4ZyWXd0WFjpRCRr6wxcu4NWlAf7Rj387vufO/db51iMbYQhOArjV+PsWAKeZ7+GM3TCx4YZaDu/uQilYkzThiMBVWWz3FoCEOWSrW/DS5jwQj5/y6FZ6/vl849w3XDBHUGmcfD4vldCnmBm4tt1r5lAl7YaninGsotD12qW0U95eehLo3joCYQ+sQFTmjBw9Eaer4y+gk8VuZ88W9QNJnsAGG7vo6Fpu2dvDycuz6MSnn34Vi90If+6uak5wSDbCEDwG4C4iuoOI2gDuB/BI4T2PAPjJlD30XQCuKqXOMMdeFzm8OwnJXi1weH14HgD0WpE1IRRPFUaxvbIYcCdGq3rooSZdQIUcgS8JWNGL9XHfQ+2yXVRJl6fnaspmPueNrqri2o4WyO5xnhxBBUqtXqe3jkAYSYTalQOh60tGH+Vcz1WiK3+y2JMjcCTQXVE/kDCHbNDQFUvnUVPuPLCAE+dyKvs4nuJzz53F27/1kPN3W69E4bf4RSk1IaIPAvgMgCaAjyilniGin0lffxDAowDeDeAEgDUAf9U3dr1rqiKuhk/LwwTP80UEfYvVHzjOK9bSadnDTS/LIoMlZEqI1yhNqPQCXqX3fAAvHj4uPe+jgQKJp+czqtUVusc4OuAM21nAgJkjsEcg/qSvYy8DBWX+MxpkuQVfstifsE+e81bKe6EoGaw3jqdWaE6v3Qc9OiOClh3GHccKU1VuQa1lrt209iFzdSrQcufBBXz66TOZkfnjFy/hyto4K4C9FrJuQwAASqlHkSh787kHjccKwAe4Y2+E6CRNMVu/1Ld3HtUy146wYsEBXX3KtXSiZtYXxZRQqTsgrwe4Vp6XM1ncJOt30+t0e2z2ni4+GqheZ9UcgT1h7+vk6sstJIrZRV1MPtuV4HQrZu9h8i7P3gGDTKcKE8fRpHqdUpgted5vCKpAPK2mu04FcEUgfghRH/Va/NzRZJpVA9vG2a6TfnZMpX2++U6E88vD0vO6m7HLuXzdwQVMFfDNi6v4lpt34dNPn0Gv1cT3vf7awELADq0stsliJ8J8u1mKCEJ43lzbHhH0QxGBIwHlPygmXIDjbZRmgU/8XR59nTb9EI+315BYCbm9UQDO0798SshPlXR7sf4cgf+7mZ9tCidHYKOdhuE5yxqnfoXedtBOfR66uU73OFni3Vunko6ztlWP7WcfAMl3Uw4W3NBTk5G0mCg7e0PHCYRa5tr2HMFSQKfclXY6+JMzy4inCp955ize9i0HnPNshGxIRLAdhIhw8+5uKUcQMgTz7SbWxnHJy9Cnk3VcOQJHkYrr7FQgCcGJ/AnOKslil+elb4yJhaYXUkKadlqESXy9hkJ5k433YuUGJASz+fYE8PwGlj5DwCzttHgWQDBHICzwAnzQkBtmA9wtLTiRqi3iCdWbAJ7oyvPd9JqK8JE/WWyPCPITCD05AgtasDSwt6zRctfBBSx0Ihx/6RIO7+7iwsoQ7/y2w9b3bpTUhsCQI3t6pRawV9Y01csREXQiKJVcFKbFDuYIHBeXj7FCRM5TlnwH03i92EB1avIeu+e14AilTe+32Zj9/uHcgq8BmRtSsrfdcMNegLsJGaegzG0I3MokeY9d6blIBeZ8RUU1mkzdDfyc7B/3dQK4k8U+RlQ2n+e6FOcIvFFSyLFxRztAej0XmJtJx18PjGszBBM//NtrN60FZVfTTgUuFmPUbOA7X7MXX/z6RcRThV6riR/8loPW926U1NCQITfv6uLVQo6AAw0B5eZSnByBtMUEUM1rDsISnsIw87NNCRV4AQ78vQK9L+TZu5KAOVwmVZbhvZTi01UNSKgVRvFoxWxcCLMXFrCxoitvDyxZzitxUNyRo35Pab5YBa9nWzt2b01G2nSuCM/1HQfXa5nvJAVlxXFL/Ql2df0++DvuPoQXz6/iY195BX/+2w878xcbJbUhMOTwnh7OLQ9nLsywIbAfV9kP4IeuiCAUuuuLsijrgzMCnpejUMjljYYqoMVJ34BnX1V5ueoPRp6cRO6NOvBpTwIdcCivQJSUzOcy4rIcgU8x6+dt3y2cI7Azt/wVyX6Ix8X+8VJxPQYk697r+H4++ihQdmxCzt5cO8IkpZGbsjRw9y7T8mNvOYrvfM1eHN3Tw99+x+u9790IqaEhQ3RR2fnlYVZ9fGl1iG6r4YR45p0RgR8/dOUIfMliwK/0bOfXAnknRvsN7uOwV1fotnHxNKHbyRWz34utUlCWPO/3mn3wnDhHkHmj5XGTKec3mP3tNKW241GW0u8GuPMmrDyNkMQQOiXODV9VvC49B+gMJ7E3RwAgrQsy4N/0c9x1BOl5JcPZU8yW+mPs6voNwVw7wu/+7PdYGU7XQuqIwJCbd5cppBdXRrhpvuP8MXrZucWuiMB1cTXtrKEQNOSMCNw3jj+34A+J9Xts65TmFnJYQlaIFs4R2HMLIw81Np/P5zXLaK48fFpqQOzKK0Sp1a2ai7CEjy4MuGmnPoUOuPvxDFnQkIsRJY+S/L9BM3tPaT4fa0gb8cL9mkcE9nFzKZxTdBKXBhNnDUFRrocRAGpDMCO2FrAXV0fYv1DuCaJFY3dFaGiQcYw9BWXCSt/keXti1HcD5ONcsISf6SL3vOw3asgbbUf2w8yDnr3L+w0xZBxUyXHsLgzzzTeKlbeYKflseXGeXtPsGlW2Fsl8IYUegtnk1F/3uBAd2u2g+Mb58jT2cfoMEDc0pM8Psd/jvspioHxKGSciuN5SGwJDjlg6/11cHeKmhY5zTChZ7MsRjGzQUHrjuC7KtoPB4EveAn6owKcUkjWVldckVk7Pvu244ULeqFvphY2jF5/2FGu5sHdXT3vAA0V58Gl/wt6d4HQxvsJQjb2S2decUH+e3Vj5DY+P8RU1CA2LUfXVckwY9FFnpOq6Lh0OSigKd50xriMEZ45An0kwLEYE4RzB9ZbaEBiy2G1hVzfCycuz0NC+eXdE4EoWsyqLqySLXbi2h7GiP09azORnZ8iZLhyFbhunvXZf/UG1ZLH9PGDf+QD681yRRKXEu5dJ5d9LqeHx1Zvo5/2sNJlR9Xnoej73dbmxkarTqAbycq6DpDL6qGPcXKt8gP1wEmMwnjrJJzdKakNQkFv2zuFUGhEopZIcgQ8ackQE/ZFOFruV5dBCSRtN3B6UHidtUwC4lZeXseI9jUteRRvC3l1wRihKcnmxGT7tKNbywRkuz1ev06r0PK0bMiUkTDK7cHQOndM2X7hKO0A79RS+SaFHvU4p1OnrueWNJBxG1df63Xy+6Ljl9FEHNGQ5wH55kPYZCtBHr7fUhqAgR/f2cCqNCFaGE4ziKfbPe6Ah/WMXksWDSYxWk5yYcccVpnoqHAFPEVQgR+Dj2ocUutTTcyuhMD4NWCAlhhdrT8IGlJ6noMynvJwtLSpg/fo5aRVtKJe0HgMiZf/o5111Mb7rudV0FFayyAjVIlxnROC8V9McwbgY9QegIc0aMpzEq4HeZTdKakNQkKN7kl7gSilcWEnaxfqgoZ4l/APcp5NpcYWbnBtHqtCTcQ4YxNOS2KWEdEI3rPRkjJXKOQJH91GO4XHVA3jhDA+zJoRPF8f5zgJO1miPyoKFYTqaK+LaIUZUJC8M08+78yY+yFIOdbqiq7xLrQxS0nvS8XQBsM2nnT0XqUBHBCajMGtiWSeLN7fcsreH1VGMq/1xljTWnUlt0mwQuq1GqZS8P4q9TaL0RVf0hnxQDaCbgsmx2Creb9CrdCaLHZ49M0cgTeb5cgQND/vHlzepaoyrGscQLFGOHHXLB2GOgMH+sTW58x0dqcc5aaC+vfSQGNyJabuRC1JqHRAPPyIoGIJx7KwTAuwRwdLA34L6RkltCApyy96EQnrycj/LFdyyZ847Zr4dlXIEa+M4SyTbRBcClS5KBvtHijMD1ZRXKOnro4HaxoUSjq5CIU6fG9vZyiG4zFdQFk4WS+Eye9uNceU9YcJswuhKG5ZiZ0+9Jy4mVZXrK5lPnix2NV8MUmodxjjM1LPfq4Px1BlFADmRpI4ItqDcsjdR+q9cWsOpy30Q5YVmLulZDqnuj9wnFwEGJa2AO/pK3YHEgLi6SobYGVIMt9kgNHw3nBTOYPD6k/dVS4zaktMhhS5t+QD4O226xrmoklW/W1ih+6O5Knkan6PRceUI1sHAco3LCiQdCj2YZC7RQOOZ14uSt5iYvVeHnvOKgRwtWJ2JCLZhjoCI9hHR7xPRC+n/ey3vuZWI/oCIniOiZ4jobxmv/SIRnSKiJ9J/717PejZCXntgHkTAC+dWcOpKHwcXO8Hj4WztZpOzTP3KBLCHqSFYQloPAPjhk+CNWlF5OesIhE3uOJW+gN3b9u5l5O7QWTW6ckE1gD3JrD8n2FdnIlN6TuO4jjyNF+LxHHFZDRoK06Fd0KOvS635PnONQLiOwEYf9Tl7QOL5Lw/yU/ey08m2WUTwIQCfV0rdBeDz6d9FmQD4O0qpbwXwXQA+QER3G6//E6XUPem/G35S2Vw7wq175/D82WV888Iqbtvnh4WAJCIoQUOjiR8aSrFFabLY32IidKPK6KOAVl5liqv+TNca9Zpm18jLEUgTo04Ii1Fb4Srq8xtjcpyRHEoyl5VeDnsFjFzFqEzKkHEa4yDMJi+yS9bhShZX2ctqEYH+2wkNOWDcwXjqJYQAwGI3ypQ/kEQErSZ5I4kbIetdzX0APpo+/iiA9xTfoJQ6o5T6avp4GcBzAI6uc95rKq8/tIjnTi/hT15dxrce3hV8f3JucbHX0NTrLfgSV0E4w8l08dxwHs8r7DXPfjcuLFFUsqEcgatrqe/gdHMddi/W59lXa9fRjppuLzaYZC4YRy4N1EGplSr0cKI/PwjHFA7EY+9txEi8O2mgod+ubPj1Z7rm0p89M1eooKxlbzGRwL9+Fbqr18rgICDJEez2nEVwo2S9huCQUuoMkCh8AN7TE4jodgDfAeCPjac/SERPEtFHbNCSMfYBIjpORMfPnz+/zmX75c/cvhcvXljFynCCNx4JG4K5doTVUo5gkrEGbOLCHcNKyHfjyJkurIRqCbMP3HChPjdShc68wW3wSSUvNgiXlemqSiXthlsOhhLghzOqJuxDzC2XAQnvpQxm80WBVX8D6fXM6VILuNt1iJvOMaEhnSAG0oZzmwwWAhiGgIg+R0RPW/7dJ5mIiBYA/C6An1dKLaVP/zqAOwHcA+AMgF91jVdKPaSUOqaUOnbgwLU7xBkAfvBbD2WPv+/14ZOB5iwnEfXHoToCOyUtWFCWKiGr5yXEVJVSaQQSqvyUMV1cNNDquQV3i23ffKHoqh01MJkqTItsowoUXs2ykbKUqtZW8HME5euEKG9Nzp0vGHE6vO0hh8RQWGOoXTmgI1yXo2FfZ6NBiBrl30Dfg677LkpJE6U6grH7VDMtu3qtrJoYAK6sjbC4yRLFAOM8AqXU212vEdFZIjqslDpDRIcBnHO8r4XECPwbpdTHjc8+a7znNwB8SrL4ayWvO7iAB//yd6LBYAwBSURQZA2tBesI3DcO1/Myi5dCeLhNoXOUl60iOeR56TYETs9e2OQuBBO4ICUOLAEA4+kUHeNIzRDEY4PZQnmM0DhXIZrrLAnOAUbm52fj0lySjwaavM9mCPxGDkgjCaMQP+Sg2BhYoWgHsOd3Qo4GYI+odf7FpdSJKGsJMzMuwBoC0hyBAQ1dXhvh4GJYp1xvWS809AiA96eP3w/gk8U3UHLF/SsAzyml/nHhNfNE5h8F8PQ617Nh8s5vuxk/9MabWe+dbzexNix3H/UaAgc0xClmAuR4uNeDErKNJlmC0z7O5Xmx6wiERXbuPQkni/X7ivNJ8zQh+CofJ4uSXGdJsJPFwijJdbZyyEFxN8cL5KA8lFrxb8AwBLbfIJQjAPT5IWVmIA8ammQR/OXVMfbOuTsV3ChZryH4ZQDvIKIXALwj/RtEdISINAPoewH8BIAfsNBEf4WIniKiJwG8DcDfXud6bojMtZtYG+dnk47jKcax8kJDbQfuOJq4T50yx9lwzuANIOxXk42rcMPZPK9gjsDR5G4c+2srfPBJKOEIuPDwUAO/wpipH5bIxgm573qdUnjOV4gWosa6x4V/A5vhCTadExq55DWLo8EwxtYIN8Aa0q+VW0xMGcniCKN4mkUTl1ZH2De/BaEhnyilLgL4QcvzpwG8O338hwCsV4JS6ifWM/9mkblOBKVSOlm7mZ1O5k8WV2wx4YNBvHQ7KlEQQxAP4LjhAkooeU1uQNathCyFaAueQ79dXmywgZ+Rp9EQC8s4WuEMnvKqWlksTfq6jWPAsfHkd0I00BKTiunZOx2NIKQkg9mA9CApYYsJIGltDyS0UaWS3OFeT++yGyXrjQhqQbkV9SDQnhZwN53j4trl4ineeQRmklkrIV8E0mqWsdEQ80S/5mqBHKb3lVlKfkXpOscgDPEk85W/H8cYm20YWNBQVKarhmig+jPFyWIHxBOMHD200xA92TVfCHos0YwDdSp6PinMpseV83Kxt/W7Xqd5HyilmNBQ4ogs9Se4vJY0sdyO0FAtAHrt2VbUOnFchT4aYg3ZEqOhbqBAcnOoQj+eTKEHcwt2hR5iN7mhKBmcwYEXbOM41dbmuvJxIVy7PI4TXdnyLZzEaMvixYYptS7mlr8ewJc3qZKnCRtji3Fk5q6krLRsPst16YOFAH2QVH6vjuOE2cSpIwCS9tOb2RBsrhZ4W1R0RLA2TiKC7OB6j7cQNRtokKPpHEcJGTcBi2VheGw6muXh09U8L1flZ9QgD2PFDktw8h/muvL5wsZRv09LVg8gnC9EXdTjpEdOAm7v10updTC3RpO4mkJnQkpytpHb0QjnvFwdUoU5gsB3A8pnjPcDJxBquSmFgS6tjjJ94Gtrf6Okjgg2QOYKfcd1RND1RARA+bjK6VSxPTZToXBZFsDsjcrBRq0tJhg5ApfH5rtJ3V0lucZR6sWWISUN93jbIljgE65xdJ4YFlinHXt3r9HF3Bp7zprWc+nPL87HiiSMdep6gBAduljLUdnRqAqzBaJw/ZnmvaoZRL7uowCwPz3v/MLKEJfW9Pkmmy9ZXBuCDZBi33F9XvFc4CJJElB5uBlqfgXYE5yshKOl98x6PPvkM0PJPBvW71ZCmipZ7qsjV0LZOEaUZDOOHNqpdC+90FCFHIFvTD5OVnjoLOoL9W3yGEfXWdPmfJp1ZX5GiPElbZ8BlBU6wDMEndas06ZPJwv1GtLe/4XlIc4tDQDkxmEzSQ0NbYDkhmA2IvDVEQBlSlqo1N18bShV6JaQn8Oftt5wnGSxxYBwQnBbBBIslvPQTqUGhLUn2Xz5OjnURXu7Dl5iVFoPoD/T1mCNx0qztIoI5DH0+7QMmRGnnk8TvDieva3tNTdZvFKo+Rky9rITzTpt2cH1gRxBt9XEYjfCxdURoj6h12puuoPrgdoQbIjM62TxiJ8jAJKL0qSkjRlKqG1VQjxlkoyzGB5xgjOZ2+fp2bpKhtg4gNuA7Gq7bx5fopLDkDH3kufZN0vzcRW6q5jJ1YZar0VKqXXNN46n2RGKrrn0+4rr1N/bN86MAjn8fFtFcn59SaMkTmRsqSyehFtFFJ02HfWH6KNAEgGcXxkCSDoVbLaGc0BtCDZEdESgcwSrqcex0PVvbzFHwFPM5fbVHJaFNyII3nDyIihXQVkYzrAVCoX7ISXrskBRwj0ZMqMkva58Ll5UViVH0G42MufCHOfz0LP5LMnpPcK8iR7nJyOUx1WHOjnQkK/XkBxmC0JDUTOjhQPhg+tN2b/QxoXlISZThZt3bb72EkCdI9gQ0QpfG4CVtMmUr5gJSMNNg5KWNb8SwiBclgUwCynxoKFqIbi9+tafI8jGCb1fG+2Ux/4pM11CxxYCdq49v6DMtZcBPNzGLmPlCGxYP8eoymA2K6WWWW8CwOoQiY0qMzIuw2Vx0BDMGYWigBERMM4VOLKnh5OX+3j16gCHGb3LboTUhmADpNdqImpQ1lxqOTUI856DaQBtCMreqPccg6qJShukxEoW25NyPuqi/kxb7/0gnOFKcAo9dBb7p2KUZM0tZLUV8k6uRAjuZSWYzcHRb3vgjLwiOR/H7QaqP9+cy3zNOs7yG/DGJZHjbIEkdy/LfZRCdQTF42gHTPooANx+0zxOXUnOQL/tpvBBVzdCakOwAUJEyQEU/TwiWOhE3kpFoAwNDRkJKCvThRlKA3alFzojuXjDTQLsH8DNkAl5Xgk/vAyfSGmnErhMblTLuYUJc9y0UNSnoxYfbmxLFnP30n7SmHsubeCr7qXYqFr3klcPoNRsdXeos6oeZ2MNhXIEvZQ1pGmug8xpC6vQO/bPZ485B13dCKkNwQbJLqPd7MpwHISFgPJFqXFH30VpjQgqe7G8G7xYkcyjLjo47MFksb23kW9ccjB8gYHFZDYl65LDZcm6zEpTPgwyU7cQqBsB3An7qsliDtvIljfhfDczCuTlW9wkBqljw/luNhLDcDLN2sK7RDMANTzUT4khvUDUDwDfcdue7PG337I7+P4bIXWyeIMkiQgSQ7A6jIOJYqBMSZNEBNYcgRDXZiWLLRXJrBsush/UXiVHEEoWA2XaKberZ/LeMtOFB0XNeqP8+fJjTEOFYfoz7aevyaOyEJNKz2ejJ1eG2YQVyZICyfFEAe18XHBPLDmC4SQOQkNzhiGY7+Tnj4RqhQDgNTfN4698z+1oNgiHd/eC778RUhuCDZJd3RaW0iTx8nDCigg6rWaBkhaOCCrDGZ5x3JYWPaTKK8Dr1+NscEZoX6pSJYteLJeNA8xGSUPGntj6PbGiMkujQdZ3c+RpWHtpLeqTRSC8aMfNpJL+Btw6FaBsQHhFdgVDwDhpTFPB+4VaoblO2BAAwC/+yBtZ77tRUkNDGySL3SiLCFYGPGioU6gj0BGBL0y1KRN9M7iOHwTMUNpWf+BPyiXjCjdcBeoiL3R3jOPkFiyKmdd/SabQvcZYWHQ1YhpVW6O0IMRTsa9OeS/D0Y7unSWOCKy1HOEI13ZdcvbS1tKCmywGcmhobTRBs0HB32CryLq+BRHtI6LfJ6IX0v/3Ot73zfQAmieI6Lh0/FaQJCLQOQJeRFDMEWij4CtS0cpemvS1FpQx6HZWWiDD87KeiMa8UYtN4Lh4uB1eYDBkLPi0FNeWRGWml84xclX6NiXjZqOkZC/DMFuxXTZnT4ByFCjZSzPfwupl5YiuOGs05wBk0JCOBFaHMebazU1ZHFZF1mvOPgTg80qpuwB8Pv3bJW9TSt2jlDpWcfymll29aIY15Kve1FKsIxgwIoLs/FRLMs8PKZWx2GF64/gu5qpJOdepWj4vzzaO0/IaKNNOhwwjZzsPWMZ0MZWemvlMm7jhjDCubU0WCz37eKqgAjRQPU6aeAcseRpWdFXOt2RGtSE3xqG97BR+A6UUKyLQOZ2se8Ao9raZ32qyXkNwH4CPpo8/CuA913n8ppFd3Rb64xijyRRX+mPsmQv3EynRRxkRAeC54Rh87Vm2kfIeSgO4mTVhpdAsheBVksUc71CPG1uhmoBRLShLGWto9jdoh6iLDpgt8ig8PV+JdsrqNdSwevYhA9J27KWvRkJ/rt2zZ0RJhd8gdFCMzbPn7iWQQ4DjODGOoS6icyk7SNcPrI4mwTqhrSTrNQSHlFJnACD9/6DjfQrAZ4nocSJ6oMJ4ENEDRHSciI6fP39+ncveeNEHUFxYGWJtFGMvyxAkeLjm6HMiAkDDIMYNl46T0/TCFZW5AZlVKMEQPLJU7TKUVylRyfRGi7RTTrI4+VyyGxBh4p0DL9hgNg510RmVCfM0HKwfKEcgnD1JXierg1IFsuRel8UoMDiuEBFkeblQjqA1Cw31R3GwqeRWkqBJI6LPAbjZ8tIvCOb5XqXUaSI6COD3iehPlFJfEIyHUuohAA8BwLFjx1Tg7ddddATw4vlVAGCdS6oVwChOWAvDcfjGAco33JBxw1X27G09ZJgKXY/TYTU7UWmBCaT4NHtcQelJeg1JlZertxHHWOn3ztJOw7+dNP+h12nNEQgNiCS6Kq6TjfUXjSr3N0ivMc69Axj00dH2jAiC30Qp9XbXa0R0logOK6XOENFhAOccn3E6/f8cEX0CwL0AvgCANX4ryMHFpIfIn55dBsA7js5sKa1hohBmD5QToxJoqMgaqqq85ufD1MXifAlNT+bZc+AF/XrVcdJeQy6GjNQb1eMWAzUnrtoR6Z5w6gGScVQwqmEWj56verJYdp24IgnuXuqIOo9aAvTRUkFZjD2b8MjJqrJeaOgRAO9PH78fwCeLbyCieSJa1I8B/BCAp7njt4ocWEx66D7/amIIWDmC1LvTkcBgHKMbuAEA+w1HFKKP2nje/rN59Vx6jmw+TkRgTajK2yJwIZ5ispjDiNLjbK2TWQZkUs2LLcIZISVkxdHZnHlZi+18nMXRuAawnqviPbyXdugxaECM6Mr8P1hZ3CpGBHWy2JRfBvAOInoBwDvSv0FER4jo0fQ9hwD8IRF9DcBXAPwHpdTv+cZvRTm4KzEEz55ZAgDcNB8+hUhfXDoBleDF4YuryLXXIbEvkkjaMMx6ejxYohyCSyIJPW4STxFPlZfOCVQrZkped/THqTAu1FBPf+7MXnK8WOte8nMLGs5g00DXw/6p9BuUjWPQQamYSyomfQGdpwkfD6vn0GOS5+U5grmdBA35RCl1EcAPWp4/DeDd6eMXAbxZMn4rymInQrfVwFOnrgIAjuwJt5vNvAxtCMZhpQAkF60UswfKzJoRg87pSsqFbriix5ZBLozEqL2VsTAxylReNlybs5elcYIEunzcbFQ2SWmgvoNbgMT71WQEIpLBbBXyNMUaEA6TqqpCtzWr4x5CD+RV/ENGNT+QnAHdifJzIVZHkzoiqKUsRJTlCXZ1Iyx2w9BQsUjFTAb6pKj0ktwCI5IoKb2YQR8tKy8WO6MAZ3DhhSJVkkt5LCZ9tSKTVtFyoh09rhQlcb1YceJ9FtbjsHHM+XSHzrwmI0wDlRYe6tdLEWdgjbYCSc44ayEaYy/1/aUZetxkMZCeSWC0mOC2l9gKUhuCDZTXHkjazR7dy+s5XixS4VAQgXLjLO64BCqYLeWXKnSgGpzBSWibr+v5RLUVZtQiShbLOqsClupbgXFcL32Uq7yKTDFuYrSo0Ksm7DmFh7pAslSTwcwRFNlzob3Ue6avK05bFy29VnImwSSeYjSZYq61faCh2hBsoLzpaNJi9ltuXmS9X0cEOkcwGPMjgqLHxjIgNi+2Ak2PdQh9ia/NpS7OQkpDRo2EHjfjVY6ZNRlFuGyi+HsZF41xBTijQiSRKfTAtVKmSvLwcFeRHccYS68v63wxnzUkzS3o+0vvRX4qYPi+67WbGIxjrKZRwXwdEdRikx958xG88cguvO/e21jv75WgIX5EUDxykgdnkBiWyDyodD5uSX5VLzZTlkVWB4dtVPC0WeMsdFUuNDQuzMc3qgU44xoVQbWLRpWJhxfZRnwjLs+b6M8tHtnKTbxLYb2uhaAB8CKC+U6E5eEkay6pi0i3g2yf2GYTyF2HFvEf/uafY7+/SEkbjKes3ELRg+IoZsCe4Axh70WWhU5Uhumj68O1tSLKvFFOktlWGMbwtvUZ08l8MTtZXIRP2HBG+t3iqcJkqliK2RzH6S2l15iMk1ElS0Z1zDMErmRxSHSFfTauQkEZdy+Ljg3XqALA7l4Ly4MxrmpDwLhXt4rUEcENlFKRyjhmHX1nKyhje7HSiKA1e+Nwsf4SnCGoajXHcZVeSZkwKLV6vtlDWFSwxbYeV4LnmLUVo1i2l0WuPVcxF5VlBrMx1lnMQbWaYUqtLYHOybcUz+5eD1xWOSJgkC12dVu42h9nXYZ3b6OIoDYEN1CKrCEuN7nU00UAZxQTo1wlNBSyLEoKXWP2TC82n4/nsWllovs2sWG2CsYxGydMVOpumlLlVeTas6EhR56Gk1Adxfn5vBy6cDJfNZjNbK+SzBfOtxRPl+Pupd6znD7Kjwj0ueQ5NLR9AJXaENxA0ck3s38Jh5uctKOYPeKSdaM2GyV8OnQDNNLDN8oRAVehyyKC8o3KjAiMfkZ6Xk5xXpI3kTFWgISRMxQakEaDEDVIXMykv7t+Pxdmy8aNZayhbmkvJaw0eaTaaTUyOid3nO4cK3UYWs0Gmg3K95JZ3wLoVvM1NFTLBkujQei2GsapR7yIoBM1MkUJCArKKlAe9XxFZcINwUvjhMlpbqKyNG5crTAsOaOBY1SpwDYS7KXwu2m4MKc88lhD2bgK0RVgwCeM5C1gL1jkFkgOi9cz04AU94QzrmvcPzlriGEIui2M4inOLw8BALsZbWS2itSG4AZLr5UUqWTcZEZE0G01MZjEGQyyHppeqEgISG+4zIPi0TlzxSxjZxTpfeyQv4T9xiwvr9yqOdy6Qa+nCgzSbTWzNXIa3CWvl78bwDGqelwxupLlhditTyoni2cjXBGkJGSXAcm1Yl6XUYOCVdpAnhN45VIfRMDCNmoxURuCGyxz7Qhroxhr6U3OMQS9dhNKFWAQbuhusCw4vX+A2RtuwFQmeVKuYkRgFPxwEpXlcTxc21TMgDTfkjKp0j5KnPlmIgL2XtqjpLBRLRvjJkPpdQuQkhQa0g4Kp1U2MLsn02lyNClnvm6rkWH8XLgMKEQEzO8G5HTRVy6vYbETeQ/O2WpSG4IbLAk0NMHaUBsCHjQEzCpZLq6tlRe3f4yeryrWL/XsSwU/TIVug5S4sMRAyFgBZmEQ7p4A9oggvJcVPfviOKbS61gMCC/xPkuPFUE8VfdyItvLbJzBGuKMAfKI4OvnV3DTQrip5FaS2hDcYJlrR+iP4qzNBBcaAjDjDUmhIS4FEUhC6UHR82LQ+5oNmlFCnPlKyWKm8irRApkN/LqtZsJBn0mM8mCQEmOF4/22mpYoyT9fs5F0js0UcwYpcTnzMoVuMzycPbFRf3mY/SxUAzD30sgtcFlpwGxBJjcvBwAH01bzZ5eGuHlXuKnkVpLaENxg6bWT/iWaQioxBAMhDGJSHrUnxalbqJLg1OOkfO2OpQUA17M35+Hi2vr766ggafMhM6rcaEevs5S8Zf0GzTLlkZ1vkUWOZQPCy7fYCthY19dM0pdP59yIiKA/4tXuAMCRPb3s8c27a0NQywbKXMkQhL2TXHklCWM2rm3wvLnN3ADteclOdErW2SyF/EE83EI75SYOk3Ey77cYSQzGMbPfk0kDFeDTLQsDi+H9dlsNsddcYv8I8ibmPJIcFJD/1slBS7IclOT6srLZuHs51hHBhB0R7OpGmaN2qI4IatlIWewmZeurGhpiNLLqGiwSfQP1WMorzxHkEQHjhmuVb1RpRMBOFpcgHq7yKieZeYnDfD5uHyVgtrJYFiXlMIhsL5szEWDynCwiYOcILJASF3oEkhyBUoptVM0oSbInZkQg6Rlk/gZrgkPoiQjTNBF+Z9ppeLvIugwBEe0jot8nohfS//da3vMGInrC+LdERD+fvvaLRHTKeO3d61nPVpRd3QhLAzNZLIOGdDEaF84YTXJvjTtuNlnMw/r1Ok2vstWkINMiiwhMhc68ufX79XhuolKvj8vPB5LvP5kqTKdKxlhpNUoKvQqk1I54Z1sDxl6Ow9XPgLEnM0aV4WgY/aXGscJUya4vHd2aaw+OqxgR6N9gMJYdOfmz3/c6tKMGvvvOm9hjtoKsNyL4EIDPK6XuAvD59O8ZUUo9r5S6Ryl1D4DvBLAG4BPGW/6Jfl0p9Whx/HaX3b0WlvpjrA6TiGBeAg2N46wYTRIRJN5aCg0JPTYuY0W/x4wIODdplFV+Ctk/Nu47E5YA0uhKsCcmDJLj2vwaEGB9SWbOnugk82AihIb0nhjrFEFDk6k44tR0aMn1Zd1LbnRlRgSMNWr5Gz/wOjz2C2/HLcwzR7aKrNcQ3Afgo+njjwJ4T+D9Pwjg60qpl9Y577aRXb0WJlOFM1cH2d8hMXHtzBCwIokGlEpC90HGsmCG0uPZSIJz83RmIoKY5WkDmuddDdfODQ+XNZSzlCQJdLMNcn8sUHqGF6vn4/x2sxEBb0+AlJFTlT46lhnjrhGVZdcXc0/0PKLry7KXnN9AF3ECMmgISLoBbKdmc1rWawgOKaXOAED6/8HA++8H8LHCcx8koieJ6CM2aEkLET1ARMeJ6Pj58+fXt+pNJLpfySuX19Cg5OzjkJhMl4FACfXSaKM/jkXjTJ53XxhJ5OyMKdvzKuYkqrOG+MniobknTAoiMGtUecY490a1MuLsi5ng5DKpgEJVuJA+aha+cRS62UQxJyMIfruxYVS5ezmW7+V8J8obPQqhoe0qwV+JiD5HRE9b/t0nmYiI2gB+BMC/M57+dQB3ArgHwBkAv+oar5R6SCl1TCl17MCBA5KpN7XoDoavXFrDrl6LVa1owhkSD8o8/0DTJfkYbn7j6OdCYuYIBswW20AxIojZ+QggUSZ50lcQSUzivGqa2ZoCSJRrf8RP2M94sSKj2pzJEbANQSHJLCvO0wl0ZnRltFUXORqWSILLZhtkDgp/vvlOE6ujCZRSWBtNRNDQdpWg+6mUervrNSI6S0SHlVJniOgwgHOej3oXgK8qpc4an509JqLfAPAp3rK3j+iI4OTlPjvkNL3YTAmxWlMkN7N5o3Jx9KJC5xksIyIY80PwWUhJFhEMxjGbqgrMso20opVEBCMhnGH2ieqPEyMXap+h12kqdG41bKdAO5XUEQzG0yQhrnh7qb//YJSz2bgRp16fBOrstJoYpUlmyV7OdyIoBayOEuPf20Y9g6rKeqGhRwC8P338fgCf9Lz3fSjAQqnx0PKjAJ5e53q2nOicwKkrfexhG4L8Ru0LPKheeth2fxRndQFciEffcIMxP7lmRgR9QVKumJzmKK+oQWhQgf0joY8aEQEXZwYSA5d7o7zIRSdGE54937OX1kjk4/JCNM64qNlAlLZqlhzcYkJDUlZasj5ZdGX2YBoIrq/5FH69uDKcWfdOlvUagl8G8A4iegHAO9K/QURHiChjABHRXPr6xwvjf4WIniKiJwG8DcDfXud6tpzsm2tnj7lnoNqTxQyPLQvdJ4bSE8Auk2laiSlQ6DOnr/EjAr2+PtPwEFFqeGIZs8lMFguUl97vtdEkH8dM+gL5XnKjJDMi6I8mwnFpsRwzb6LXORxPs9+PY4xN45g3J+R59sAsNMSD2XI4kHudAMB8uncXakOQybpiIqXURSRMoOLzpwG82/h7DUCJeKuU+on1zL8d5NDuDogApcDuX5L18ZnIsNg8RyBLMheTefyIoGG0boizXi2c+YZGQpUbuutzGrLEIYeKa8m38PaynHjnMqn0fJK9LBZBcStbzRqQtdGERU8G8mhuTZLQbtv2UgZF5cliAeNroiEeWUSgzxXgOijbWerK4hssnaiJm+aTqOCwoH+JbqUrUUJzZjJvEqNBCaQSkl4hCciPCJozEQHfi00ignE8xSieZh4ca75JnFVpc8aZxXkDAaSU7eUoUehRg9gtl4HcqHL3cjYiEORbUmgoniqRstT5Ha2YORXv+hpcG8ViOieQG5AGcZvOzUYE3L1cSA3Bq5qy3a1zBLUh2ASi2/bevp9ftq6pc7n3y1d6CZwxRbfVDFanAib2OxEqdIPVIc4RGN6oED6RjDMZMpKIwMTD+6OpQKHPwiAyhR6nTJcYcwIDMjQVusAY98eyZoitZgOtJs1AQ5zclfbQk72M2dflbETAZ6Xp75LV7myjIyerSm0INoH83PffCQD4rteW0DOnaC60KFlcCN25yks35VpLWRbcG64TJS2eddEVd75ewchxm4Ilh/xMROMaDUI7ja4k/Wp6RkQwmAg8+2g2J8H53YBE6U3TJPMa82xrwDj4KI2SuDDbXCdthjjU7dH5kFJfmCzWDsLqaILBRAaXAciuFe44HRGcFhRxbnepY6JNIA+89bX4S9/1muwC5chCJ8LyIPHsOxGPzqm9SA1nSJNrq8NEye5lntVaZJHwMdwmVoYT0RkNetzqMIeGuOMyGGTEV3ozidFRzErWA7MwW38c4+Aidy9TYzxMxs0xr5W5dhOrw7yXFRdmm29HyThBRKDfN2MIGOOyiGA4EUVX82ZUNo7Z9Ov5DBrqA6gjAqCOCDaFEJHICADAQjfCyjDpUcRVsLkSmmJtGGOegfsCyJSOVuhSLHapP8Y4VgLDM6uEJEnA1ZmIQBaBrOjGfyxoyIAzJEY13ZOV1KhKvdgr6V5yoaGFdE+kCl1HnKsC4wik7RvGMVYzwxMep9e0KnYY0r0cJJAlx+gAyb0DAKcup4agV/vDtSHYorLYibAynGBlOMEiM9nViRogSuiHq4I+7FlEoHMEQqV3PqXpScatjeKsER9beaUGJEsWM41rYlQnWBsmkAsnuuq28r2sYhxXBnmehiP6u2jKI1dZzrUjDMZTrAyF0FAaSUiNarfVzAxIt8Ur8OqkhWBrFa+v1dFEVEew2InQbjYyaEjqhG1HqQ3BFpWFboSVwQTLgzEWO7zQlogMj23CvgG00lkbVosILmiangDiAYCLqyMAcmhIkkAHcqO6Kji20NzLNUFtRaa8hjrxzrsF9Z5oyiPbiHeqceZ1JLE64nv2+vMHwuuLiLIDmiRJ3wUzuhIYECLCTQvt7DMiBkNpu0u9A1tUdI5geTDJQl2OmMpL4mkDiee1OozZnvZ6IgIgV3qasx+SuXYBBuEarNSoro0mWGDCZcm6cu+X0ywQmFVeq0N+VLZQ2BMJxGOO4/4Gc+0oNao6kuDDj/n1xb8u59sR1oaJAeFfX3nualVwPQPIDAG3tmW7S20ItqgsdCMsp9CQhAetQ/cVwQ2nOeSXV0cYxVM2FKVvVM3X5o6rqvQWDFy7HTXYnt58OxIrZiBVeqMYKwJjrGG2q/0xhpMp24CUFHpFQyBRsqujCVaGMVpNYvc26hnXl0Qxz6XzLQ/4kYR2UC6tjjGa8K9LALhpPjEAB2pDAKA2BFtWFjsRRpMpLq2ORBinZnWsjfjJ4nbae+bsUqJMpAr9jNAQaGUsNQRznYSuemV1LFJCC90kuloVJND1utZGsUh5Rc0Guq1GtidcA1I5ImgXISV+RKAUcGl1KOrO2WtH6I90dCW7LtdGMZaHEywyWTyNRgIpnV3S1xef/XNkT1K8edQ4kH4nS20ItqiYSlYCDenE6MqQ326AiNBrN3F2WabQtfepb1QuTS/DwzWuLYRdzq8M2d8NyHMEayN+lAQk32dpMBYpL73OPEqSUR7Ppb8BP0dQgOfY0VVuQCR7spCRGPgUV0BDUWnOS3I9dyKcSWmgknFvOLQIAHj9zYvsMdtZ6nT5FpUFQ4FIeNC7ey2cXRpiNJmKMdxXM5YFb75iRMD1EPX7Tl3uo9kgNvddf58zVweymoxuqoSGE9ERhLt6LZy8vCaGJeYrKC9tHE9fSfZyD7OWIyueutJHg4AFQXEeAJxdkhmC3b0WrvbH2DM3wRFBy5T5dhNnrg4wGPPhMiD5fjpSlfzmP37sVkymCu89dit7zHaWOiLYoqKTXcljPs65u9fCSxdXAQB752UGRPOuJXTVZoPEOQKteHRrbk67ASD3Yk9eWmMrymRcclzoq1cHonHmnkiLAaV70omaaDUJp64k83Fblmso6NSV5LwLDjUWyA3Pyctr7AJCIDFQ41jhzJU+9hiddUOyu9fKvpskwp01qrKo7Kf/3Gu35bGTVaQ2BFtUzAZ1+xdkN5xm1ewV3Kh751tYTrnoElqghgoA/o2qlePKcCJUzMn3WR5ORN9NG5C1UYx987K91PRKiSFICt+ScZJoztxLblsE/b7lwUSkmPX+LQnHacW6OoqxT+Bo7J1vY3kgu06AZE90XyNJVFbLrNSGYIvK4V15kkvCfDA9SYnS0ywLACIvSkcu3VaDzTzZN9eGDgIkSsg0iJJox1Q8EgNiKmOJwZo5g0Kg9Pankd9CJ2J1OgWS79PI9lLyu+W/974KhkDPzZXZPRGwf4zfvPbuq0ttCLaomGXxrzu4IBhX7UY1FavE8Gie9n4BfBU1G1lrbi4EAswqLx0dcOTgrnycFC7TIvl+h4z59i/y16n3XaLwmg3CvtSIS/bSNKp7BHtS1dHYa7x3v+j6yiPjmgpaXdZlCIjovUT0DBFNieiY533vJKLniegEEX3IeH4fEf0+Eb2Q/r93PevZSUJE+G+P3YpvuXkRBwRKyLxZJEpPe2xz7aboII8D6Y0qvUm1Yt0rUCazSoj/3Q7vzqMrSQRiFiOJlFd6qEyzQaKEvd5DiYI1x0n2clfFKMncB8m4m4y1VbmeG1QfMLMeWW9E8DSAHwPwBdcbiKgJ4MNIDq+/G8D7iOju9OUPAfi8UuouAJ9P/66FKb/8X78Jn/obf5adTAWAW/bmSk/ixd6cKkul+OsDcmV5aJHPIAFyRXSrgMVjJkIl7B8z33KLgFd+1NjLKsqrKfjdzDlu3SfjvmuopfpeCvbE2L/De/i/+aHd1Tz7g5khkO1lLbOyLkOglHpOKfV84G33AjihlHpRKTUC8DCA+9LX7gPw0fTxRwG8Zz3r2WlCROI+KXceyGEkLs4MAG+4uRrv+q4UtjLhEI7ckR7Sc8cB/mE9APCamxJlZ37PkJie5Gtu4s935/58Dm7+A8g57EcEihLIfwMpFq738rUV91ICPZpU0zsEBy29/lB+XUk8+zfdshsA8K2Hd7HH1FKW65FmPwrgFePvkwD+q/TxIaXUGQBQSp0hooOuDyGiBwA8AAC33XbbNVrq9pc9c2380nu+TcTxBoB7bt2Dv/kDr8MPf9vNonF/8c1H8I2Lq/hr33uHaNwH3vY67F9s44fuPiQa96vvfTP+6MRFvP4QX3kBwEf+yjGcuToQKfTdcy380n1vnIGWOPKmo7vxd3/4Dfi+1x8QjXv3mw7jhXMr+Kk/K9vLn/v+12GhE+Edwr38tfu/A//pT89nhosr//Inj+HVpQHr4HotC50I/8t9bxRFLUDiaPyf99+Dt9xWo8rrEVKBWJ+IPgfAdvf/glLqk+l7/iOA/1Epddwy/r0Aflgp9dPp3z8B4F6l1N8goitKqT3Gey8rpYK/6LFjx9Tx46Wpaqmlllpq8QgRPa6UKuVzgxGBUurt65z7JACzfO8WAKfTx2eJ6HAaDRwGcG6dc9VSSy211CKU60EffQzAXUR0BxG1AdwP4JH0tUcAvD99/H4An7wO66mlllpqqcWQ9dJHf5SITgL4bgD/gYg+kz5/hIgeBQCl1ATABwF8BsBzAH5HKfVM+hG/DOAdRPQCgHekf9dSSy211HIdJZgj2IxS5whqqaWWWuTiyhHUlcW11FJLLTtcakNQSy211LLDpTYEtdRSSy07XGpDUEsttdSyw2VLJouJ6DyAlyoO3w/gwgYuZztIvSdlqfekLPWelGWr7clrlFKlkvYtaQjWI0R03JY138lS70lZ6j0pS70nZdkue1JDQ7XUUkstO1xqQ1BLLbXUssNlJxqCh270Ajah1HtSlnpPylLvSVm2xZ7suBxBLbXUUksts7ITI4JaaqmllloMqQ1BLbXUUssOlx1lCIjonUT0PBGdIKIdcz4yEX2TiJ4ioieI6Hj63D4i+n0ieiH9f6/x/r+f7tHzRPTDN27lGytE9BEiOkdETxvPifeBiL4z3c8TRPRrJDk0epOJY09+kYhOpdfLE0T0buO1bb0nRHQrEf0BET1HRM8Q0d9Kn9/e14lSakf8A9AE8HUArwXQBvA1AHff6HVdp+/+TQD7C8/9CoAPpY8/BOB/Tx/fne5NB8Ad6Z41b/R32KB9eCuAtwB4ej37AOArSFqvE4BPA3jXjf5uG7wnv4jkxMHie7f9ngA4DOAt6eNFAH+afu9tfZ3spIjgXgAnlFIvKqVGAB4GcN8NXtONlPsAfDR9/FEA7zGef1gpNVRKfQPACSR7t+VFKfUFAJcKT4v2IT1Jb5dS6ksqudt/yxiz5cSxJy7Z9nuilDqjlPpq+ngZyRkqR7HNr5OdZAiOAnjF+Ptk+txOEAXgs0T0OBE9kD53SCl1BkgufgAH0+d32j5J9+Fo+rj4/HaTDxLRkyl0pGGQHbUnRHQ7gO8A8MfY5tfJTjIENnxup3Bnv1cp9RYA7wLwASJ6q+e9O3mfTHHtw07Yn18HcCeAewCcAfCr6fM7Zk+IaAHA7wL4eaXUku+tlue23J7sJENwEsCtxt+3ADh9g9ZyXUUpdTr9/xyATyCBes6m4SvS/8+lb99p+yTdh5Pp4+Lz20aUUmeVUrFSagrgN5BDgztiT4iohcQI/Bul1MfTp7f1dbKTDMFjAO4iojuIqA3gfgCP3OA1XXMhonkiWtSPAfwQgKeRfPf3p297P4BPpo8fAXA/EXWI6A4AdyFJem1XEe1DCgssE9F3pSyQnzTGbAvRCi+VH0VyvQA7YE/S9f8rAM8ppf6x8dL2vk5udLb6ev4D8G4kLICvA/iFG72e6/SdX4uE1fA1AM/o7w3gJgCfB/BC+v8+Y8wvpHv0PDYx06HCXnwMCdQxRuKx/VSVfQBwDIly/DqAf4a0Qn8r/nPsyW8DeArAk0gU3eGdsicA/iwSCOdJAE+k/9693a+TusVELbXUUssOl50EDdVSSy211GKR2hDUUksttexwqQ1BLbXUUssOl9oQ1FJLLbXscKkNQS211FLLDpfaENRSSy217HCpDUEttdRSyw6X/x97FO84WPahjgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.plot(tone)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Building noise" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from scipy.signal import lfilter\n", "\n", "sample_rate = 44100\n", "\n", "filter_a = np.array([0.0075, 0.0225, 0.0225, 0.0075])\n", "filter_b = np.array([1.0000,-2.1114, 1.5768,-0.4053])\n", "\n", "noise = np.random.randn(sample_rate)\n", "noise = lfilter(filter_a, filter_b, noise)\n", "noise = noise / np.abs(noise).max() * 0.5\n", "noise = noise.astype(np.float32)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.plot(noise)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Testing sound pulses without MP" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import time, os\n", "import multiprocess as mp\n", "from sound import SoundController\n", "\n", "# sound selector: 0 - silence, 1 - tone 1, 2 - tone 2\n", "selector = mp.Value('i', -1)\n", "\n", "# loggin status: 1 - idle, 2 - running, 0 - stopped\n", "status = mp.Value('i', 2)\n", "\n", "cfg = SoundController.default_cfg\n", "#cfg['device'] = [1, 26] # 'M-Audio Delta ASIO'\n", "#SoundController.run(selector, status, cfg)\n", "\n", "# nothing happens for a second\n", "time.sleep(1)\n", "\n", "status.value = 2\n", "for i in range(6):\n", " time.sleep(1)\n", " selector.value = -1 if selector.value == 1 else 1\n", "\n", "# stop\n", "status.value = 0\n", "time.sleep(0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Testing sound pulses with MP" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import time, os\n", "import multiprocess as mp\n", "from sound import SoundController\n", "\n", "# sound selector: 0 - silence, 1 - tone 1, 2 - tone 2\n", "selector = mp.Value('i', 1)\n", "\n", "# loggin status: 1 - idle, 2 - running, 0 - stopped\n", "status = mp.Value('i', 1)\n", "\n", "cfg = SoundController.default_cfg\n", "cfg['device'] = [1, 26] # 'M-Audio Delta ASIO'\n", "sc = mp.Process(target=SoundController.run, args=(selector, status, cfg))\n", "sc.start()\n", "\n", "# nothing happens for a second\n", "time.sleep(1)\n", "\n", "status.value = 2\n", "for i in range(10):\n", " time.sleep(1)\n", " selector.value = -1 if selector.value == 1 else 1\n", "\n", "# stop\n", "status.value = 0\n", "time.sleep(0.2)\n", "sc.join()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "ds = np.loadtxt('test_sound_log.csv', delimiter=',', skiprows=1)\n", "plt.plot(np.diff(ds[:, 0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sounddevice playground" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'name': 'M-Audio Delta ASIO',\n", " 'hostapi': 2,\n", " 'max_input_channels': 6,\n", " 'max_output_channels': 10,\n", " 'default_low_input_latency': 0.0014512471655328798,\n", " 'default_low_output_latency': 0.0014512471655328798,\n", " 'default_high_input_latency': 0.09287981859410431,\n", " 'default_high_output_latency': 0.09287981859410431,\n", " 'default_samplerate': 44100.0}]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import sounddevice as sd\n", "[x for x in sd.query_devices() if x['name'].find('ASIO') > 0]" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sounddevice as sd\n", "import numpy as np\n", "import keyboard # using module keyboard\n", "\n", "sd.default.device = [1, 26]\n", "sd.default.samplerate = 44100\n", "stream = sd.OutputStream(samplerate=44100, channels=10, dtype='float32')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# 3rd channel - left arena speaker\n", "# 1st channel - right arena speaker" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "duration = 0.5\n", "\n", "x1 = np.linspace(0, duration * 220 * 2*np.pi, int(duration*44100), dtype=np.float32)\n", "x2 = np.linspace(0, duration * 440 * 2*np.pi, int(duration*44100), dtype=np.float32)\n", "y1 = np.sin(x1)\n", "y2 = np.sin(x2)\n", "sil = np.zeros(len(x1), dtype=np.float32)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "stream.start()\n", "\n", "try:\n", " while True: # making a loop\n", " if keyboard.is_pressed('q'): # if key 'q' is pressed \n", " break # finishing the loop\n", "\n", " stream.write(np.column_stack([y1, sil, sil, sil, sil, sil, sil, y2, sil, sil]) * 0.8)\n", " #stream.write(np.column_stack([y2, y2, y2, y2, y2, y2, y2, y2, y2, y2]) * 0.8)\n", " \n", "finally:\n", " stream.stop()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }