From 1c95743e953630b7702bb3d42d39215222c7c701 Mon Sep 17 00:00:00 2001 From: Ford Date: Wed, 30 Oct 2024 21:56:19 -0600 Subject: [PATCH] NSRDB parallel API calls :) --- pvdeg/store.py | 2 - pvdeg/weather.py | 82 +- scripts/load_nsrdb_distributed.ipynb | 1485 +++++++++++++++++++++++++- 3 files changed, 1455 insertions(+), 114 deletions(-) diff --git a/pvdeg/store.py b/pvdeg/store.py index 7875aa2..cc7644f 100644 --- a/pvdeg/store.py +++ b/pvdeg/store.py @@ -6,8 +6,6 @@ import zarr import os -from pvdeg.weather import pvgis_hourly_empty_weather_ds - from pvdeg import METOROLOGICAL_DOWNLOAD_PATH def get(group): diff --git a/pvdeg/weather.py b/pvdeg/weather.py index f3051e2..a567869 100644 --- a/pvdeg/weather.py +++ b/pvdeg/weather.py @@ -1034,7 +1034,13 @@ def _weather_distributed_vec( return weather_ds, meta_dict, None -def emtpy_weather_ds(gids_size, periodicity, database): +# THE NSRDB shapes could be moved to their own definition +# organization style question? +def emtpy_weather_ds( + gids_size, + periodicity, + database + )->xr.Dataset: """ Create an empty weather dataframe for generalized input. @@ -1060,8 +1066,7 @@ def emtpy_weather_ds(gids_size, periodicity, database): import dask.array as da - # pvgis default shapes - shapes = { + pvgis_shapes = { "temp_air": ("gid", "time"), "relative_humidity": ("gid", "time"), "ghi": ("gid", "time"), @@ -1073,15 +1078,22 @@ def emtpy_weather_ds(gids_size, periodicity, database): "pressure": ("gid", "time"), } - # additional results from NSRDB - nsrdb_extra_shapes = { + nsrdb_shapes = { 'Year': ("gid", "time"), 'Month': ("gid", "time"), 'Day': ("gid", "time"), 'Hour': ("gid", "time"), 'Minute': ("gid", "time"), + 'temp_air':("gid", "time"), 'dew_point': ("gid", "time"), - 'albedo': ("gid", "time") + 'dhi': ("gid", "time"), + 'dni': ("gid", "time"), + 'ghi': ("gid", "time"), + 'albedo': ("gid", "time"), + 'pressure': ("gid", "time"), + 'wind_direction': ("gid", "time"), + 'wind_speed' : ("gid", "time"), + 'relative_humidity': ("gid", "time"), } attrs = {} @@ -1091,63 +1103,20 @@ def emtpy_weather_ds(gids_size, periodicity, database): dims_size = {'time': TIME_PERIODICITY_MAP[periodicity], 'gid': gids_size} if database == "NSRDB" or database == "PSM3": - shapes = shapes | nsrdb_extra_shapes - - weather_ds = xr.Dataset( - data_vars={ - var: (dim, da.empty([dims_size[d] for d in dim]), attrs.get(var)) - for var, dim in shapes.items() - }, - coords={'time': pd.date_range("2022-01-01", freq=periodicity, periods=TIME_PERIODICITY_MAP[periodicity]), - 'gid': np.linspace(0, gids_size-1, gids_size, dtype=int)}, - attrs=global_attrs, - ) - - return weather_ds - - - -def pvgis_hourly_empty_weather_ds(gids_size): - """ - Create an empty weather dataset for pvgis hourly TMY data - - Parameters - ---------- - gids_size: int - number of gids, equivalent to number of unique locations - - Returns - ------- - weather_ds: xarray.Dataset - Weather dataset of the same format/shapes given by a `pvdeg.weather.get` geospatial call or `pvdeg.weather.weather_distributed` call or `GeosptialScenario.get_geospatial_data`. - """ - import dask.array as da - - - - shapes = { - "temp_air": ("gid", "time"), - "relative_humidity": ("gid", "time"), - "ghi": ("gid", "time"), - "dni": ("gid", "time"), - "dhi": ("gid", "time"), - "IR(h)": ("gid", "time"), - "wind_speed": ("gid", "time"), - "wind_direction": ("gid", "time"), - "pressure": ("gid", "time"), - } - attrs = {} - global_attrs = {} + # shapes = shapes | nsrdb_extra_shapes + shapes = nsrdb_shapes + elif database == "PVGIS": + shapes = pvgis_shapes + else: + raise ValueError(f"database must be PVGIS, NSRDB, PSM3 not {database}") - dims = {'gid', 'time'} - dims_size = {'time': 8760, 'gid': gids_size} weather_ds = xr.Dataset( data_vars={ var: (dim, da.empty([dims_size[d] for d in dim]), attrs.get(var)) for var, dim in shapes.items() }, - coords={'time': pd.date_range("2022-01-01", freq="h", periods=365 * 24), + coords={'time': pd.date_range("2022-01-01", freq=periodicity, periods=TIME_PERIODICITY_MAP[periodicity]), 'gid': np.linspace(0, gids_size-1, gids_size, dtype=int)}, attrs=global_attrs, ) @@ -1162,6 +1131,7 @@ def pvgis_hourly_empty_weather_ds(gids_size): # TODO: implement rate throttling so we do not make too many requests. # TODO: multiple API keys to get around NSRDB key rate limit. 2 key, email pairs means twice the speed ;) +# TODO: this overwrites NSRDB GIDS when database == "PSM3" def weather_distributed( database: str, coords: list[tuple], diff --git a/scripts/load_nsrdb_distributed.ipynb b/scripts/load_nsrdb_distributed.ipynb index b959886..2a3639b 100644 --- a/scripts/load_nsrdb_distributed.ipynb +++ b/scripts/load_nsrdb_distributed.ipynb @@ -6,26 +6,71 @@ "metadata": {}, "outputs": [], "source": [ + "from dask.distributed import LocalCluster, Client\n", + "from dotenv import load_dotenv\n", "import pvdeg\n", - "import os\n", - "from dotenv import load_dotenv" + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting Up\n", + "\n", + "As in [load_pvgis_distributed.ipynb](./load_pvgis_distributed.ipynb) we need to get ready to make our parallelized API calls. The notebook linked here goes through the process in more detail but we need to import our API key and email. This cell will not work for you unless you replace the `api_key` and `email` with your personal NSRDB api keys. [REQUEST A KEY](https://developer.nrel.gov/signup/).\n", + "\n", + "We also need to initalize a dask client. `pvdeg.weather.weather_distributed` will not work without it. It will fail silently and not populate and of the results in the resulting `weather_ds` called `geo_weather` in the example below. It is hard to recognize that this has occured so be careful. Make sure to initialize a dask client first. Visiting the link takes you to a daskboard that shows what dask is doing." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "http://127.0.0.1:8787/status\n" + ] + } + ], "source": [ "load_dotenv()\n", "\n", - "api_key = os.getenv(\"API_KEY\")\n", - "email = os.getenv(\"EMAIL\")" + "### REPLACE WITH YOUR API KEY AND EMAIL ###\n", + "api_key = os.getenv(\"api_key\")\n", + "email = os.getenv(\"email\")\n", + "###########################################\n", + "\n", + "workers = 4\n", + "\n", + "cluster = LocalCluster(\n", + " n_workers=workers,\n", + " processes=True, \n", + " )\n", + "\n", + "client = Client(cluster)\n", + "\n", + "print(\"Daskboard link\")\n", + "print(client.dashboard_link)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Requesting Weather\n", + "\n", + "As with the other script [load_pvgis_distributed.ipynb](./load_pvgis_distributed.ipynb). We will create a list of tuple (latitude, longitude) pairs and call the function on all of them at once. failed will represent a list of failed gids, unique location ID's that correspond to points in space on the NSRDB. These are different than on PVGIS where they are arbitrary indexes that do NOT correspond to a spatial location on earth.\n", + "\n", + "We will request \"PSM3\" data from the Physical Solar Model that represents a typical meteorological year (TMY) from the NSRDB. We will have to supply the api key and email from above here. Refer to the linked script to see this in further detail. The only difference between the scripts, lies in the NSRDB/PSM3 data requiring Api keys." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -37,9 +82,20 @@ "geo_weather, geo_meta, failed = pvdeg.weather.weather_distributed(database=\"PSM3\", coords=coords, api_key=api_key, email=email)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Viewing Results\n", + "\n", + "Same as in the other tutorial, our results are stored in an xarray dataset with a dask backend so you will have to use `.compute()` on the dataset to inspect the individual values of the dask arrays. \n", + "\n", + "Click on the `Data variables` dropdown to expand the dataset viewer." + ] + }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -409,33 +465,853 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.Dataset> Size: 701kB\n",
-       "Dimensions:            (time: 8760)\n",
+       "
<xarray.Dataset> Size: 2MB\n",
+       "Dimensions:            (gid: 2, time: 8760)\n",
        "Coordinates:\n",
        "  * time               (time) datetime64[ns] 70kB 2022-01-01 ... 2022-12-31T2...\n",
-       "    gid                int32 4B 0\n",
-       "Data variables:\n",
-       "    temp_air           (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    relative_humidity  (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    ghi                (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    dni                (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    dhi                (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    IR(h)              (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    wind_speed         (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    wind_direction     (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n",
-       "    pressure           (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314
  • gid
    PandasIndex
    PandasIndex(Index([0, 1], dtype='int32', name='gid'))
  • " ], "text/plain": [ - " Size: 701kB\n", - "Dimensions: (time: 8760)\n", + " Size: 2MB\n", + "Dimensions: (gid: 2, time: 8760)\n", "Coordinates:\n", " * time (time) datetime64[ns] 70kB 2022-01-01 ... 2022-12-31T2...\n", - " gid int32 4B 0\n", - "Data variables:\n", - " temp_air (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " relative_humidity (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " ghi (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " dni (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " dhi (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " IR(h) (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " wind_speed (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " wind_direction (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314\n", - " pressure (time) float64 70kB 6.366e-314 6.366e-314 ... 6.366e-314" + " * gid (gid) int32 8B 0 1\n", + "Data variables: (12/15)\n", + " Year (gid, time) float64 140kB dask.array\n", + " Month (gid, time) float64 140kB dask.array\n", + " Day (gid, time) float64 140kB dask.array\n", + " Hour (gid, time) float64 140kB dask.array\n", + " Minute (gid, time) float64 140kB dask.array\n", + " temp_air (gid, time) float64 140kB dask.array\n", + " ... ...\n", + " ghi (gid, time) float64 140kB dask.array\n", + " albedo (gid, time) float64 140kB dask.array\n", + " pressure (gid, time) float64 140kB dask.array\n", + " wind_direction (gid, time) float64 140kB dask.array\n", + " wind_speed (gid, time) float64 140kB dask.array\n", + " relative_humidity (gid, time) float64 140kB dask.array" ] }, - "execution_count": 13, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "geo_weather.isel(gid=0).compute()" + "geo_weather" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.Dataset> Size: 2MB\n",
    +       "Dimensions:            (gid: 2, time: 8760)\n",
    +       "Coordinates:\n",
    +       "  * time               (time) datetime64[ns] 70kB 2022-01-01 ... 2022-12-31T2...\n",
    +       "  * gid                (gid) int32 8B 0 1\n",
    +       "Data variables: (12/15)\n",
    +       "    Year               (gid, time) float64 140kB 2.005e+03 ... 2.002e+03\n",
    +       "    Month              (gid, time) float64 140kB 1.0 1.0 1.0 ... 12.0 12.0 12.0\n",
    +       "    Day                (gid, time) float64 140kB 1.0 1.0 1.0 ... 31.0 31.0 31.0\n",
    +       "    Hour               (gid, time) float64 140kB 0.0 1.0 2.0 ... 21.0 22.0 23.0\n",
    +       "    Minute             (gid, time) float64 140kB 30.0 30.0 30.0 ... 30.0 30.0\n",
    +       "    temp_air           (gid, time) float64 140kB 22.0 21.0 21.0 ... 22.0 22.0\n",
    +       "    ...                 ...\n",
    +       "    ghi                (gid, time) float64 140kB 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0\n",
    +       "    albedo             (gid, time) float64 140kB 0.1 0.1 0.1 ... 0.01 0.01 0.01\n",
    +       "    pressure           (gid, time) float64 140kB 1.02e+03 1.02e+03 ... 1.01e+03\n",
    +       "    wind_direction     (gid, time) float64 140kB 94.0 93.0 92.0 ... 103.0 108.0\n",
    +       "    wind_speed         (gid, time) float64 140kB 6.4 6.1 5.9 5.6 ... 7.9 7.9 7.8\n",
    +       "    relative_humidity  (gid, time) float64 140kB 73.29 77.92 ... 73.29 73.29
    " + ], + "text/plain": [ + " Size: 2MB\n", + "Dimensions: (gid: 2, time: 8760)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 70kB 2022-01-01 ... 2022-12-31T2...\n", + " * gid (gid) int32 8B 0 1\n", + "Data variables: (12/15)\n", + " Year (gid, time) float64 140kB 2.005e+03 ... 2.002e+03\n", + " Month (gid, time) float64 140kB 1.0 1.0 1.0 ... 12.0 12.0 12.0\n", + " Day (gid, time) float64 140kB 1.0 1.0 1.0 ... 31.0 31.0 31.0\n", + " Hour (gid, time) float64 140kB 0.0 1.0 2.0 ... 21.0 22.0 23.0\n", + " Minute (gid, time) float64 140kB 30.0 30.0 30.0 ... 30.0 30.0\n", + " temp_air (gid, time) float64 140kB 22.0 21.0 21.0 ... 22.0 22.0\n", + " ... ...\n", + " ghi (gid, time) float64 140kB 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0\n", + " albedo (gid, time) float64 140kB 0.1 0.1 0.1 ... 0.01 0.01 0.01\n", + " pressure (gid, time) float64 140kB 1.02e+03 1.02e+03 ... 1.01e+03\n", + " wind_direction (gid, time) float64 140kB 94.0 93.0 92.0 ... 103.0 108.0\n", + " wind_speed (gid, time) float64 140kB 6.4 6.1 5.9 5.6 ... 7.9 7.9 7.8\n", + " relative_humidity (gid, time) float64 140kB 73.29 77.92 ... 73.29 73.29" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "geo_weather.compute()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spot Check\n", + "\n", + "We can plot the entire TMY air_temperature to check that our data has loaded correctly. \n", + "\n", + "Explanation of steps\n", + "\n", + "geo_weather is our weather xarray dataset. We can index into the first entry at the 0th index by using isel (index-select). This will grab the data from the first gid. Then we pick the air temperature attribute. This can be replaced with bracket notation so `.temp_air` becomes `[\"temp_air\"]. \n", + "\n", + "This selects a single array from the dataset that is labeled as \"temp_air\". This array will be a dask array so the values will be stored out of memory, we would have to load it using `.compute()` to directly inspect it but when plotting with matplotlib it will load the array for us." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABny0lEQVR4nO3deXwU9f0/8Ndsjk1C7kASQhIIh9wgckY8QFFEalVo61VFa7VatFVarX5b26/f1kLbby/7Q/tta8FW8aq39UYBqdzKjcgVCFc4c5A72fn9EXazMzuzOzM71+6+nj58kJ2dnc9nd2Y/897PKYiiKIKIiIjIJh6nM0BERESJhcEHERER2YrBBxEREdmKwQcRERHZisEHERER2YrBBxEREdmKwQcRERHZisEHERER2SrZ6QzI+Xw+HD58GFlZWRAEwensEBERkQaiKKKhoQElJSXweMLXbbgu+Dh8+DDKysqczgYREREZUF1djdLS0rD7uC74yMrKAtCV+ezsbIdzQ0RERFrU19ejrKwscB8Px3XBh7+pJTs7m8EHERFRjNHSZYIdTomIiMhWDD6IiIjIVgw+iIiIyFYMPoiIiMhWDD6IiIjIVgw+iIiIyFYMPoiIiMhWDD6IiIjIVgw+iIiIyFYMPoiIiMhWDD6IiIjIVgw+iIiIyFYMPoiINGpu68RfVuzBnuNnTD/2G5sO46Mvakw/LpEbMfggItLoD0u/xC/f/gKX/na5qcc9UteM7z33Ob61eL2pxyVyKwYfREQara86bclxTzW2WXJcIrdi8EFE5DBRDP5bVN+RKE4w+CAichEfYw9KAAw+iIgcxpoPSjQMPoiIXIQ1H5QIGHwQETlMRHfE4WPNByUABh9ERA5jvEGJhsEHEZHDgmMP1nxQImDwQUTksOBOpuzzQYmAwQcRkcOC4w2OdqFEwOCDiMhFWPNBiUBX8PHkk09i1KhRyM7ORnZ2NiorK/HOO+8Enm9pacHcuXNRUFCAzMxMzJ49GzU1XCiJiCgczvNBiUZX8FFaWooFCxZgw4YNWL9+PS655BJcffXV2LZtGwDg/vvvx5tvvomXXnoJy5cvx+HDhzFr1ixLMk5EFD+6Aw7GHpQIkvXsfNVVV0keP/bYY3jyySexevVqlJaW4qmnnsKSJUtwySWXAAAWLVqEoUOHYvXq1Zg0aZJ5uSYicoBg0XGDAw6OdqFEoCv4CNbZ2YmXXnoJjY2NqKysxIYNG9De3o5p06YF9hkyZAjKy8uxatUq1eCjtbUVra2tgcf19fVGs0REMWbD/tPYfrgO35zUF4Kgfmv/dM8JfPzFMZxp7YRH6OoXcaa1AxcO7Ilpw4rw/LoDqG/uwGXDijC2b57iMQ6ebsJbm4/gxonlyE5LAQCs3XcKq/eexK2T+wW2qdl/shHr93evavvAS5swok8OZp3XB0vWHMDppnakJAkozUvHdePL0d7pw9OfVmHywJ4Y2jtb8ZibD9biubUHsGbfqcC2u57ZgPL8HshKS8YtlX3Rv1em4ms/P3Aaa/edwq2T+8GbnAQAWLP3JPaeaMQNE8oBAP/acBC7jjWgJCcdt1T2BQA8/WkVRpflwiMI+HBHDVKSPLh2TB+U5WcEjt3e6cPi/1ThUG0zzi3LxTVj+oT9bIj00h18bNmyBZWVlWhpaUFmZiZeffVVDBs2DBs3bkRqaipyc3Ml+xcVFeHo0aOqx5s/fz4effRR3Rknotg3+8lPAQB98tJxyZAi1f1u/Osaxe1vbjqMASt6YM/xRgDAM6v3Y+uj0xX3vWbhpzhxphU7jtTjj9ePOXvc1ejwiRAA3HvpoLB5feClzZLHL204iJc2HMQzq/dj17EzkudGl+Vi1Z6T+MW/dwAAqhbMVDzmtxavx4kzrZJt66pOY11VV5DzeXUtXp87WfG1ty5ah7rmdmSlpeDGiV3BxnV/WQ0AGNArE7kZKfjhS5sC+w8pzsKJM2347ze3AwDye6TiVGMbAOCplfuw6WeXB/b99+YjeOztHYHHF5/TC3k9UhXzQWSE7tEugwcPxsaNG7FmzRrcfffdmDNnDrZv3244Aw8//DDq6uoC/1dXVxs+FhHFpr1ngwcj9gS99kxrh+p+/pv8f3afDGzrODu0ZO+JyOmvrTqluF0eeABATX0rthyqi3hMeeAht6m6VvW5uuZ2AMC2w6HpHDjVhKN1LZJtR+pasOtYQ+CxP/AIPpbfzpoGyePm9s6w+STSS3fNR2pqKgYOHAgAGDt2LNatW4c//vGPuO6669DW1oba2lpJ7UdNTQ2Ki4tVj+f1euH1evXnnIiIbMF+KGS2qOf58Pl8aG1txdixY5GSkoKlS5cGntu5cycOHDiAysrKaJMhIjKFUtcSszuSWtUxVQ+l92k0hmDsQWbTVfPx8MMPY8aMGSgvL0dDQwOWLFmCZcuW4b333kNOTg5uv/12zJs3D/n5+cjOzsa9996LyspKjnQhItewIzAQBEinLXWAYOI7ZfBBZtMVfBw7dgy33HILjhw5gpycHIwaNQrvvfceLrvsMgDA73//e3g8HsyePRutra2YPn06nnjiCUsyTkRkRJhBNeal4XDdh9pEZUbfO5tdyGy6go+nnnoq7PNpaWlYuHAhFi5cGFWmiIisYkdgYEeAY2ceGHyQ2bi2CxElFMWbssnBgtOxhyCYG2Ix9CCzMfggIleLybVOHI4+RFFUzIPxDqcxeA7I1Rh8EJGrmb3Kqy0dTp2OPkzGlXbJbAw+iMjVOk2+84Wbxj1edDW7cLQLuReDDyJyNTs6O5pdU+F0fCOKIjuckqsx+CAiVzP7xud0YGAXM98mgw8yG4MPInI10/t82BB8xPq9Wv4Rxfr7Ifdh8EFErmZ2nw87iC4YnGpm3xYGH2Q23QvLEZE6URTxz9X7MagwC5UDCiTPvbiuGmv2nUK/ggzcdkEFMr36vn7/2X0Ch2qb8Y1xZZLty788juU7jyO/RwpunNgXn+w6ju1H6lGYlYbrx5fhb5/sQ9XJRjS1dSC/RyrSU5KRlZaMWyr7oiBTfVHHQ7XN+L/le9DW4cOdF/VH/16ZAIDmtk78c3UVGls7Ud/SjiRB6FqWXgBa2n3wJnuQl5GKg6ebkJ6ahE5f16343LJcfGNcGdo6fHj60yrsOR66Gqzi57mqStfndMlvl6FPbjoKeqQiOckDUQTaO32B56tPNeOHL23CyaAVZYPv05/sOo7NB+sw+7xSvLCuGkfrW3TXlty75HOcDFo19nvPfQ5BADyCgLSUrt987Z3a7ujrqk5hfL/8wGNRFPGPVfsDj59dcwAt7T40Bq3ou+CdL1CUnSY5zvx3dqCmXn0V3R+8uAmNrR3o4U3Gy58dlDznb3bp9In4+8p96N+rBy4dWgQA6Oj0YfGnVRhVmosJFfkhxyVSwuCDyESr9pzET1/fBgCoWjAzsP1wbTMefHlz4LE3xYM7Lxqg69g3/W0NAGBESQ6GlWQHts/5+9rA3698dkiyPPy7W49gXdVp5bzuPYkXv6O+6OOPX92CZTuPAwB2HKnH6/dcAAD43Qc78ddP9unKOwAsWXMAFw3qhdc2HsKCd77Q9JoVu07gf9//Ulc6e483Yu/xxrD7/GvDQdXnbn6q6/P86yd7UdvUrrpfOMGBBwC8semwoeMAXef9y1/MCDzecaQBP3tjm2QfebBwsrEtJA/hAg+lYwTzh0krdh3HY2/vAADsm38lBEHAu9uO4hf/3oGUJAG7Hrsy0tshAsBmFyJT7TupfNNrauuQPN5/sslwGkfrm1WfCw48AKgGHgCwdt+psOn4Aw8A2HSwTtMxI2ls68Dmg7Wa99+noXbEKkYDD7O1dfgkjxtl15Id/DUfJ890BzT+ppg9x7quOa01OUQAgw8iU6kN2ZS3mSdqMc2ZMqPnc6APjNJ56+S5pCgw+CCygZn3C6dnz4ymH6Nb71exNPrWif63/vMW/Dlx+C1Fg8EHkQ3cMPrBLNHcqOPnU3COE9eSP+AJDjx9PuV9ibRg8EFkg5BmlwS9C/PXcvSc+AiVml14LikaDD6IbBBP5XQ080fE0+fgFCdu+ko1H+zzQdFg8EFkA1NvGEE3ACc6cEbV7OLS+1UsTbnuZM1HcH8jkc0uFAUGH0Qm0n4TM+cO4sSNKJobtdur6mNhNI4Tn6E/RdZ8kFkYfBDZwKpyOhaLf6dH64QTCzO5O3HPVwp43B5Ikrsx+CCyQbQjFNR+kTvT7GI8eHD7DSsWaj6cHO0S/PE4Md8IxQ8GH0QmUrstRzvaJXj/4DQcKf7jcp6PrjcVC/dTJ4a4+oOy4OAxFj4rci8GH0Q2iPYXv9rrnahJiHaeDzfPeeL2mhnAoT4foj/t7m3s80HRYPBBZINoi2m1X5mxVv7Hws3d7Zz4BP3nLbhZis0uFA0GH0QmUhsJEnWzi4tqC6KdXt3dHU7d8zmrcaJfij9JSZ+PGPisyL2Snc4AkRadPhFPf1qF/ScbcU5xFm6a2NfS9D7ZdRzH6lsxe2yp5tecamzDwo/3BB7/9PWtyPQmo8MnYtnOY5J9X1hfje9PG4SlO2pQmp+BqYMLQ45XfaoJL6yrhk8UUdvcvcLqUyv34fwBPZGa7MFrnx8y8O663bZoLYpz0lDb1A5RBNJSPMhJT0H16dCVc19aX42LzumF1XvDr4Ybzv6Tjfj3liMh23/97k7cOLEcGandRVJDSzv+9/0vDaelxwvrq5GW4kFTW6ct6em1as9JVA4oAOBMX4tv/2M9Zo7qjX9v7j53s574FEN7Z2Pl7hOSfY83tOLZNfvPXlMi2n0ikgQByUkCRBG446L+6JObDgBoae/EP1ftx9QhhdhV04DVe0+iwyciNdmDmyb2xcDCTFvfJ9lHEF3Wvbu+vh45OTmoq6tDdna209khl3h+7QE89MqWwONlP5yCfj17WJZev4f+DQD44P6LMKgoS9NrHn5lC55be0BzGj0zvThxphUAULVgZsjzox99H3XNysu6L5g1EjNG9sboR9/XnJ4ZxvfLw7qq04Zfn+wR0KFy9/zh5efgnksGBR7Pe3EjXvksuuAqnvivkX9vPoK5Sz5zODfKqhbMxA9e3ISXPzuouk9hlhdrfzwNAPDb93fiTx/tVtxvRJ9svHXvhZbkk6yh5/7Nmg+KCTuO1Esen2ntsCXdmvpWzcHHO1tDf9GH4w881KgFHgCwsboWU4eE1pZYLZrAA4Bq4AEAK748IQk+/iP7Re13xfBi5KSnwOMR0NjagdaOrtqKtJQkZKeloLWjE01tnahrbkdruw+pyZ6QX+cAMGVwLyzbeVxX/m+YUAYA6JObDp/YVdsliiKO1regqa0TqUkeJHkENLd3Ij0lCR5BQIfPh9YOH7YfrsfJxraQY84+r6t2LTVZgEcQIAhAbnoqPtxRgy+ONoTsL2/umFCRj7X71GujLh1SiE92n0Bbh7ZhMuP65mH9fmPnWRRFvLEpfMB4rKH7uv/sgHo6Ww/Vqz5HsY/BB8Uku+rrPDq6J9jdkyFR29z/fPNY3a95cV01Hnx5c+DxX28Zh8uGFeEvK/bgl29/oekYfQsyMH/WKN1p++04Uo8Zf/xEsq00Lx2//cZoxf1vndwP437xYch2+Xl/8TuVgZo6uZ9+ZRi+dUEFth2uw8zHVwIAfvO1UVj0nypsPxJ6cx/aOxt/mzMO5/7PB5rek1yCXpJkADucUkyy7carI6Kws9wVBM6zoIvsPCqtVWK1JD2RLACPCQvO+NMMTjtcPgQAHp35DKb3knRz52OyFoMPikl23XftKhz1d70SYmI2Tj3kI3osWovvbFpnt+sJLqPMj957utruegJvf5rBgUykoCaaoMcniro+p1ha0I/MxeCDYpKVNR/BN3U9haOdq70KAqu49RBkJ9L/2cm3W0nvTV1tfz3n3V+LERz4RKrZSIriM+E1SVox+KCYZOWv/uBDm1H1rYXeYEow8BoKZecPb73XkqBSOutpbvOnKa35CDMfDaJftVhXwM6qj4TF4INikpX33U6DNR/R0N3owpoPXUJPY9eHF0X3Bt309vkwo9klSSH4iFSzoTefwXTX4BlOiWIdgw+KSVZ2tgwu3HWNdomyrdyO1yQq+alxotlFb1KqNSUG+lQEBxSR3nM0tX16Z+JlxUfiYvBBMcnKG6901VC7Opzq21+AwNEuOoQEH2f/dXPNhzwIUFpZVmuawYdK8ghhb/rRfCZ6r0nGHomLwQfFJCt/9PucaHYx0OHUmSXGYpN81FLg83Zxh1O12hojfT6CA59IwYXdNXiUmBh8UEyyssOppM+HZalIGetwak1e4lFozYd/ng/7RBt8+K9LPU0b3aNdhJBtSqL9XukPoln3kagYfFBMsvLGKwY1u7h2tIsg8FemCew6v11p6d1f+gJfoNlFf5ryeT6smr9Gb/DC0CNxMfigmGTlEvNGm12imufDyGsYexjW3eHUvjSV+nyESz9kYrTAsvbaT7w/yJDM82Hhe9bd54PRR8Ji8EExycqaD2mzi00dTrWt+SXBmg/tQiYZ8293MA+RyGs+Os9e9EZOu101PEZm6qXExIXlyNX2HD+D59cewNOr9ku2WzraJejY/1xdhV/NHhW4cXy6+wTe3HwERdlezKnsh7weqaak+beVe3H/tHMC7fHrq9RXKQWAxZ9W4eDpZlPSdot1Vafx329sw8bqWgwvyZasfhottVucnc0uuuf5kO3+w5c2ISstGS+uV1+uXo28n4fa29a68q2ai3+zDO2dkb+bL6w7gI3VdfhwR01U6QV7d+tRtHZ04oKBPfH8umpcM6YP+uSmm3Z8MheDD3K1+1/YiM0H60KfsPBHf0NLR+DvF9cfxJUje2PK4K7l62/825rAc6cb2/Do1SNMSfNPH+3GlMGFGNs3DwBwU1A6aswsuM3SJzcdh2qNB0WLP60CAGysrjUnQ2dV9OwhedyvIAMAkJWmvQg8f0BBVHlITQqtaL56dB/V/eU1Je9sPRqyT3F2GgBgfL88rKvqWp6+Z2YqTpxpAwDkZaQAALzJ3WnnpqeiKDsNQOj3au+JxrNpd9ewpCQJmgIKADjT2hF5JwA/enmLpv06faKmoK21oxN3PbMBAHD5sCK8v70G66tOYdFtEzSlQ/Zj8EGuphh4wL61XQCg6kQjMDh0vw+215gWfABAY1DB3RrlL1C5XllefGVUbzS0dKChpR3vbdMeuJTkpGFYSU5IsJPkEQJNAQDwx+vPxXnlefjrJ3vR3ikGfkXnZaTgbyv3KR77mnNL0NTWife3R87PDy47BxcP7qU538FG9MnB768bjZNn2tAry4tRpbkAgEuGdgV8G/afDnlNZf8C9C3IQENLBwqzvbhn6kBDafulJnuw+Lbx2LD/NM60diA3PRW3X1hh+HjfnTIAXxlVAgD43TfOxfPrDqC9U8S1Y/rgaH0LDp1uxqT+XQFTWkoSFt06HscbWjGiTzZ++pVhKM/PwFMq5+Vfd1Vi5a6TyEhNQlpqEh55bavk+ZsmlkMQgKa2Tuw/2aT4+ZlBa/DRERQc+a+lj3cetyRPZA4GHxSTrJ3h1Njroq3B77QwoPrFNSMwfXhx4HG/h/6t+bV/mzMew0qyccn/Lgv8MgaAX88ehYdf2YK2zq4g4+pzu37F/49CQLb5UB3W7pM2Jf3sqmG4bXLXzfezA6cx64lPVfMwtm8e7r10kOY8K7l2TGnINm9yEm6b3E/x5vncnZOiSk/JlMGFgVq0aNxxYQUevGJI4HFZfgYemN79eGjv7JDXTB1SKNn/h5cPVg0+xvbNx9i++QC6mjOCzbvsHHxPdi4m/vJD1NSb10zmp/VHBvs/xR52OKWYZNfCcuGYPUeBle8pmr4N/l+eWvsNKIm0a6T1Rtz62Tgl0sq02o6hcT9ZUtGs/aKX1tPOOW9iD4MPikmWzvPh0Myhnea2tEhEc7vonitCvl37UZX21bN6sJVnJPZCD3MCJq3HkAfZSi+zKjbU/F1k8BFzGHxQjLJrbRd1oYVwdDcEK6uOtf7KVeK/+chvVvqWTg/dFvxuI+XPylr1WJxl04zKB63BR0jNh42fl9YfGWx2iT0MPigmuaHmw+wy2MqmhWhusEkKU3TrPabyr+Xg1YOdq/mwc3E5s5gRAGh93/Jzo3SurIpH2OcjfjH4oJhk7WgXbfuZPQGZ25td5DcYPTftSMFFxH4ELg3MnGJGnjUfQ37eXdjng6FH7GHwQTHJyh86ase2smYCsLjZJYqbldprow2+pH0+IuwbVUrhxWTNh42ZDq35sC1pzd851nzEHgYfFJMsrflQudV1ytp6zP7BbOV7iiavar909RwzUvDj5IiTmBztYmOWnRztorV5lbFH7GHwQTHJysJGrcCTb5cXwdHew9z6602tf4Ge7Cp3ONXR54PDXSTsbPqQ13DZ2UyltebDpV8dCoPBB8UkK4fDqhV48uDA7ELYyj4f0RTOavc5PedA6RDBeYr0a9rK8x2bNR92NrtIH3O0C5mBwQfFJK3DYY1QK8ZCgg+T07W2Kck4tV/ZerKrOM9H0N+R7mdW3ltiss+HjQGAlnk+rMI+H/GLwQfFJDvXdulOU7ZBCPvQcLpWdGyN5pj+wEF+0xEBzW860sRUEWs+rJznIwbbXewMAORp2flpaT3tjD1iD4MPiklWljVqBZm8w2nI66JM19/sEikdI6Kq+VBrdtFV4ivVfHCeD6PsbXZx7gPS+iODwUfs4cJyCa65rRN//88+jCrNwYWDjK0YCgBr953C7mNncOPEcsn2HUfq8fHOY5hT2Q89vMl4e8sRvLP1KAp6pCIrLRk3TixH75z0kOO9tfkw3g+z8urh2mZ0+kQs/rQKEyvy4RNFvLnpMNJTk3H9+DKU5HYfs6mtA3/7ZB8Onm5CXXM7JlYU4LbJ/VT7bMjLsf9+cztOnGlDfUu7ZPve443YdrgOw0tyUH2qCccboltY6/Glu3D9+DL89RPlxb6c4m92aYtipd1IN3gnb3CxOM+HvUNtbUsqhFIc/u/NRyBCxKDCLDy39gBaOzrxymeHFF+/sboW55blGkr71c8PIiXJE1g5OJLdx87gtc8PocMnoqmtAwKAKUMKMdWEhQTjEYOPBPevDdX4zXs7AQBVC2YaPs43/m8VAKB/rx6BZbwB4O5nNqDqZBM6OkXccWF/fPfZzySv23m0AX+5ZZxk28kzrbhnyedh09tVcwYvrq/Gz9/aDgDomZmKE2faAHQFPH8NOuav3vkCT6/aH3j83rYajO2bh9EqhZJPocT7fx/vVtz3O//cgJU/ugQzH/8kbH61OFrfgne3HcWv3v0i6mMBwJDiLHxxtAEA0CvTK3luZJ8cbDlUBwA4f0ABPt1zEgAwoSI/ZPXZ1KSuCtIva85ItvfK9OLGCeVY/GkVLh9WFDYvWWkpIdvK8jICf6enJoV9/QUDC8I+H42stNBiMFthm5tkp5ubv74FGdh/sglTB4f+AJGfu9yM1JB9rhheLPmOyRX0SMXJxjbd+ZLXrjW2dmDukq4ypHdOGo7UtYR9/TUL/2OoXDve0Ir7X9gEAJg6uBA9vJE/72m/Wx6y7elV+6MqV+OZu79hZLmDtc2mHu/AqSZJ8FF1sgkAsGbfSdxS2Tdk//e3h9Zu1DW3h2yTy0pLxvbD9YHH/sADAD6QHXON7GYKdBViavTU4B483fX51beoH0+Pg6ebFLcneQRcNrQIbZ0+fPTFMU3HeuKm83CothlH61owvES6xPqfbhiDF9dXIy0lCd8YV4ath+rQ4RNROaAAr288hIaWDtTUt2DqkEKkpYQGBr+8diQm9S/A8D456FuQgStH9g6bl/svG4SXPzsYePw/Vw/HFSOKA48zvcn42y3jsHrvSZw404p2n4h+BRlISfKgINOLr48t1fSejRheko1fzR6JL442IC8jFWkpHszU+GvXam9/70K8u/UI6ls6cLyhFYdqm/GVUb1xxfDwn7dWr373fBw41YTzB/TE6xsPYeao0OOeU5SJ33xtFFbvPYVRpTm4ZEjoL/n7LzsHpXkZ2H+qETX1rRjQKxMdnT7sO9GI7PQU3Hp+P+RmpOAvK/bi2TUHwubphglleG5tNYDQ5pTWoNq3SIFHNILLh7YOH3p4w+xMhjD4INto7cugZS89HU6Vdu0M83o39pz/8zfH4rKztQszH/8E24ICLyVDirPQv1cm+vfKVHy+X88eePCKIYHHxTlpgb9vqeyn+BpvsidQ+Pub13LSU3Db5IqI+S/Ny0BWWjIazgZpSmlMG1aEaRFqUKwgCAKuG18eeUcHDCvJxjBZ4GimMeV5GFOeBwD49oX9FfcRBAFfH1eGr48rUz1ObkYq7rhI+fXBHrt2ZMTgY/6sUXhj42E0tnU69l0MTtWN5UE8YIfTBGdnT38zZysURe1zPyjtFzYvDpY1au89uN1dS3u/FeUli2Cyi78fjvw6tnqJA6V0ou3/bVeeYw2DD7KFKOr5BRF5Pz1fZ6Vklfp1GDm22dTSDu4TqaVzpiWTcrEMJZv4L3F5mWHXJRicbrTfJStGr8UDBh9krjDfMzOHzflEMapam3B5cbKaVS3t4BEZWmo+rCjvrJxllCiY/wqXX3F2fTeDvz/RJsnYQxmDjwRn1yhDQTC3z4ee+6DSruHy4mQtqXqzixD0t02ZkWHtMdnFP7w7pMnCpmtQUvMRdfDBL44SBh9krjA3RjO/g/qaXfT1+XC02UWt5kPyt5Y+HyzwKHb5g23599Suqzr4x0m0wQODD2UMPshcYb5nmms+NDa7aO9wqvz6cMd2G0k/Dw01H+xwSrEs0Owiu+js+m4GJxN98BFlZuIUgw8KsPrXsuY+H1o6nOqq+tCZF1c2u3T/raXVxYq3wNoUsosQqPmQdTi16RIM/qEUbZrscKqMwQcFmPLFDnNnNLvDqVZ6+3w4WfOhmnJw8KGp5sP898AilOziURntYl+HU/OCDwbtyhh8JLjg+5gpX+ywo100HkLLPB/aDmUoDbd3ONXU58OsDAUfk2Uo2cR/uYfO82FP+sFlYbTlIms+lOkKPubPn4/x48cjKysLhYWFuOaaa7Bz507JPlOmTIEgCJL/77rrLlMzTdaw+jui9Uuo6cuuZ7SLwvHCjnbRfmjTqb13vQuvMVCgWOZRmWTMLpKhtiYei7rpCj6WL1+OuXPnYvXq1fjggw/Q3t6Oyy+/HI2NjZL97rjjDhw5ciTw/69//WtTM03WsHoeBzc1u7i1w6mWScY0Nbu4sJEk9taOJaf4rxXHml1MHO3CZhdlutZ2effddyWPFy9ejMLCQmzYsAEXXXRRYHtGRgaKi4vlLycXCr6RWf0d8WlckT3cuit+evKqOMNpmAM4Wlao1nx0/62tz4dJ+SFyQGB6ddl22zqcmtjnQ0t5loiiWliurq5rSe78/HzJ9meffRbPPPMMiouLcdVVV+GRRx5BRkaG0iHQ2tqK1tbWwOP6+vALZlltY3UtXv3sIEpy0zHn/H6BFT23HKzDW1sOQ4CAr43tg4GFWaanvWbvSew53hhYtMsq72w5gs8OnEZ7p4jFn1YFtv9n9wnsOX4Gt02uQEqS9kqx59cqLxT1zpYjQcfuWq00kmP1Lfjf93ZG3O/dbUdxxfDIAe7WQ3U4cCp0pdj573yBr4wqwQvrqjGhIh8j+uSg6kQj/rZyL15YVx3xuMG+99znuvYP5/GPdituF/T2+WB5R3Fg/ts7MHNUb0wdXIjn1h7A9iP67w91Te3IyUiRbNt97Axe2lCN9JQkdPpEXDKkEGPK83C0rgX/XF2Fd7ceDez7xLLdeGTmMDy/rhqHa5vR3N6JrLRkiCLQ4fOhtd0Xtp7RaLPLyl0n8PbWI0gSBGSkJuHGieXoW9ADALDvRCOeWb0fDS3tSEtJgkcQcLqpDaV56bj1/Ar0ynL/MryGgw+fz4f77rsPkydPxogRIwLbb7zxRvTt2xclJSXYvHkzfvSjH2Hnzp145ZVXFI8zf/58PProo0azYbprFv4n8PeppjY8PGMoAODb/1iHmvqum+fK3cfx1r0Xmp72dX9ZDQDo36uHZFl6M7W0d+LuZz9TfO72p9cDAHrnpOOq0dqWFF9fdQoPvbIl8Nib4lFN57bF6yIeb8E7X2Dl7hOa0n5329GI+9zxj/WK22ub2nHDX1dj88GuALpqwUw8+PJmrN13SlPawd7YdFjzvhed0wsrvjyuO43stO6vav9ePSJ+RpdZsDrsZcOK8MH2GozoY2yV1alDCvH6xsMYbuEqreR+4b4Ds87rAwA4VNsMAFiz7xTW7DsFYJvh9B7/aBce+cowybZpv1suefynj3ajasFM3PDX1dh3QtqN4JXPDuHdrUfR1NZpKP3apjb0yU3X/bpvPrVG8nhjdS1e+E4lAODBf23CuqrTiq870dCGX31tlP6M2sxw8DF37lxs3boVK1eulGy/8847A3+PHDkSvXv3xqWXXoo9e/ZgwIABIcd5+OGHMW/evMDj+vp6lJWpL91spw1BJ9cfeADA1kPW1s4cONVkWfDR1hm57UOppkDN/pPSfXukdl1S/qXXI5FPFb4mzM2/JCcN3pSkkMIhnCN1LarP+QMPPyOBhxaXDCnE4OIsZHqT8bWxpfj4i2OSgC2Sn8wcKqlp+/6lg1BT34K2Dh8uGdoVZEzol4/jDa1YtvMYemV5cb0FS8T/79dH4/WNh3DlyN6GXv+TmcMwtHc2pmuosaL4tWDWSPzo5c34ZFdoAP3jK4fqPp432YPzyvOwYf9pJHkEnFOUiXOKsvDShoMAumpg5cGHGrWyxWjgYabgslEt8ACADQfUn3MTQ8HHPffcg7feegsrVqxAaWlp2H0nTpwIANi9e7di8OH1euH1urOKKB5rrkUNMYGeDlLyPf19KcKtGhssWda8E64/w6NXj8Cpxlb86GXtN243+Put4yWPpw4plDyeWJGPg6ebA7/25L42VvodK8j04v9uHhey3+DiLFwwqGeUuVWXk56CWyr7GX59rywv7ro4tAygxFKSm467Lh4QEnx4kz0oyNR/L3juzkk4rzxPsu1wbXMg+BDsWsBKhd1NoLHSwVVX8CGKIu699168+uqrWLZsGSoqKiK+ZuPGjQCA3r2N/Vpykhun2Y6W2bOHyi90/yOtn528WIhUTkSzkq1byN+BKIZfqTYe3jNRMKXvudHiVunbEfx9cjj2sF2s3LV0BR9z587FkiVL8PrrryMrKwtHj3a1uefk5CA9PR179uzBkiVLcOWVV6KgoACbN2/G/fffj4suugijRrm/DUouDmMP0yfwCu2N3rXFaA/viDfaOChI5L/ERIhhV6oVOBUgJQCjw8OV5sDROzTdSrbfR2LkvqUr+HjyyScBdE0kFmzRokW49dZbkZqaig8//BB/+MMf0NjYiLKyMsyePRs/+clPTMuwnWLkHOpidW2O//CGf8VEKCj0TrblRvJAQxTDv6/Yf8dEkZlZZiS5qJywe86dWLlv6W52CaesrAzLly8Pu09MicOqDy3vKJpF2/xdPbTOZiovIyLdhN1TpBgXWvMBeMI1u7ioICUyhULxYLS0VSozgrc5XYwbST+afhux0ueDFbphxMYp1Edbs4ueDqfKMxAarWEJd5sV4XwVqhnkcYZPjNDsYm12iGynVDoYvWkqlQnBwbzT92IjySfClOwMPsJw+qK1gtVRcaDDqcbZTEMkQLNLSM1HhGaXeHjPRMGUiiGjJZNSP7FwwbzdjJS50SxGFyu3LQYfYcTnaBcN+0QxdbloYc2HgPio+ZC/B1EUwzc3xcF7JorEaHHrUbiLJUlqPpwtx43VfETT7GL4pbZi8BFGrJxEPbRc1NGMdvEf3/BolzB32ng5HfJAQ0T4obZE8cbMTpgR+3yYlpIxRoKfqIIPx9+xNgw+woiNU6iPpmtazyRjITUf/n+1zvMhyB6HFw9NEMqjXdT3j4O3TCRh5g87pa9HrHc4jabPh9PvVysGH2E4XV1nBU2xh67jyTucdv2rYRZ3RRFHu8TBjVgecIkQw492YZdTijNmlqxKtaXBXyenawKMpB5Vn48YuW0x+EgwWqc9N3z8aPt8JMIMp/LRLr5IHU4tzhCRzcz8Yac4z4ebRrvYPNQ2VjD4CCMBzr+iaDqcIlDzYWyej0ji4Uas1OcjfLNLHLxpoiBWF61CjPf5iK7mw+l3rI3hVW3jwfbD9XhxfTVSkgQ0t3eiuU3aVrCzpgEPvbwZHTYPuo62dqKlvRNPf1qFCwf1wjDZ8uVarsv/9/FutLR3Ij01CUfqWpCW4oFPBJpaO3DHRf0xvCQHWw7W4Z2tR7DoP1WS19Y1t6OhpR1/+HCX5vw+v/YAMtOSMbo0F18cbQi7r9b78MOvbEG7jraf2xat1bxvtHSPdrE4P0TxTOu9+AcvbrImfdnjTdW1eGF9NTK9yWjr8OFMaweuGl2CTG8y3th4CCKAapWVxV9cV421VeFX3z4cZiVvN0no4OPKxz+JuM/z66ptyElXwOB3prUjqmM9t/YA5r/zBZ5dcwArHpwqeU5rc8jfVu5T3P7ZgVqseHAqvv2Pdaipbw15vr6lHUvWHMCHO2o0pdPU1hlYXj41KXxFXGl+OvafVP5Syj239oCm/fw+3nlc1/5a5WWkhGyTBxpjyvPweZhlsFnxQfGmNDc98PeEinys3XcK04YWhnmFuixv+NtY75w0Tcd5+bODhtKPRF7kXr3wPyH7/GvDQWR5k9EQoex/8OXNZmbNUQkdfBhVmpceeSedgn+l98mN7vhr9nZFxgcUoudo63D8x1QKPAAgKy0Zh04rLw0fSZtKTcVPZg5FcU4ahhRn44DG4CMaHiF8b/PvXTIQe0404t+bj4Q9zt1TBmDmyNDVnOVNLD+8/Bzc/JR6zQubXSjeDCrKwuM3jEFRlhcluel4a/MRXDumj+7jfP/SQSjMVg4uRpfmYNPBOkysyI82u5p4kz1o7Qgtw7R2eI0UeGiVlRYbt3X2+TAgKy3012y0zGzZCXexWz1xmhUtVN++sD++MqoEgD034qfmjMfo0hzF50rz0jHv8sF44PLBYY8xvl8efnTFEIzoE3qc4Pdw18UDUJDpRd+CjOgyTRRjvjq6BBP7F6AsPwN3TxmAYo01FMHunjJA9blJ/QuiyZ4us87rgz9/c2zg8f+7cQwGFWZ2PYiNLhi2Y/BhgCUdeswMPsIcy+q+SD5RtDRAsKPDabjs+z+/SG9RaxDmDxTDDbUlImVhv4dnn7Pj3i9AkOTFI3Q/ZuyhjMGHS5g5Fj38kSxe28Xib5odLRCCIET8lCJNdqY3QI2HydOI7BZu6L3/OTsGf3gEaY2mYHP6sYjBhwFWNF3YNaDG6nSsHuZlxzwf4SohtL4/vZ9zEmMPIt20zAxsxyRjgiDNiyCp+bA5+oiRYIfBhwGWtLqYeFBnm12srZ2wo4JASy1EpF00f8yi9jSJSErLEHV7aj4ESV4kM6zGSDBgNwYfBlhxLYkqf0d/NPkz1je7WFk7YUeHUwHqc2v4P72I+dDb7MI+H0S6hfsa2hnPC4K01Ouq+Tjb7GJfNs4mbneCxjD4MMCaZhdR8W8jwr3cZ3DNFa26Opxad3w7vlfh+nyIgZqK8MfQ3uFU2/GIKFS4HwH+mgg7ZvwUZH0+PEHNMLbPOBojNS0MPoywuOoj2ms13Mutr/kQLQ0Q7GieCNvn4+znF6l2R+vn7C+Ykhh9EJkq0OxiU3rBX2GOdomMwYcBVnc4jb7mI0yzi9UdThH7fT60NO1EHGqrs4aJE4kRmSxQ82F9UqIo+w4LQT9Q7I4+YqQoYfBhgDUVH/ZcoXbM82ElO75X4Ue7aMuH3k8hicEHkan83yiry6QuYpiaDza7KGHwYYA1o13MO76TzS4++S8Ak9nS4TRMGoFPL2J/U63NLl3/stWFyFx2NnvIaz48QlDwY3E/u1jF4MOAmO5wavk8H9bWTtjT7KL+XHewYG5GONqFyFx2TvIlyqYYECB0N/tYn3xMYvBhQEzXfFj8TbT++JYeHkCkwMLf4TQ8vfnkPB9E5ur+SllfaIgQQ+b56J5nhOGHkthY/s4kR+ta8NTKvTha3wpvsvG461BtM9bsPYmJOhcu6uj0YfGnVRjfLx+jy3Kx5/gZ/HvzEdw4sVyy3/+8tR1vbj4Mb7IH3xhXhkuHFqGuqR1P/WcfTjW24quj+2BCmJUaj9W3KG5v6/Dhz8v36Mqzku8997nqc/+3Ym/Ux3ealkqISM0/Wmuv/HtxtAuRudQmGVu6o8aS9NRnOPXnQ8Q/V++3JG09vjhaj2U7j+PW8/shLSXJsXwkVPDx2Ns78Oamw6Yc67q/rEbVgpm6XvPm5sP4xb93IL9HKj575DLMe2EjNh2sQ/WpJtxzycDAfnXN7Vi28zgA4L1tNahaMBMP/GsT3t/e9aV5fm01dv/yStV02lWWpv9wRw3e2xb9F+8Nkz5DLUaX5Uoe56RHt6JwWX46qk81h90nKy0Fp5vaAo/zMlJwuqkdAHDV6LOr60ZIZ+ao3mGf9y+/PfDsypfZMbIMNpEdrhtXhhfWV0d1jMDNX1KrLOL2p9dHdVwlvbK8ktXOs9KSQ4KfnTUN+Onr20xPW84bIaCY++xn2HO8EUmCgDsu6m95ftQkVIm3as/JqF4/77Jz8LsPvjT8+s0H6wAApxq7bmybzj5e+sUxzJ06UPV1oihi+ZfHA487InTcULtBnzzTqiu/Zrj1/H7o4U3C2n2ncLqpHbuPndH0uuLsNMwYWYw5lf0k24f2zsKs8/rglc8Oac7Dxef0wrllueiZmYpZ55XijU2H8eya/dh6qD5k3999YzQqevZARkr3V+Oft0/E+9uOIicjFV8bWwpAvZnk/mnnIDcjJbCfmufvnIRN1bWYdV4fAMA3J/WFxyPg1+/ulOz38t3na36fRPHioRlDFIOPvgUZuGhQL3T4xMB3R033DKPd5aXWFpD+vXpg1pg+6PQBv/+wu8zvmZmKGSN6o7a5Hacb25CVlowRfXJw44Ry5PVIxe+vG422Dh+Gl2QH1Y52JdrY2qEt8SDThxfhwKlm7DgiLatGl+ViU3Vt4PHs80qx78QZfHagFhmp4YOPPccbAQD/2XOCwUesuHRoYVTBh9rEVKIohq2m19tkqLq7Rf0KfnzlUNQ2t2Hhx9Imne9OGYAHrxgi2fZfr27BkjUHIh7zJ18Ziq+MKgnZLggCvn1Bf0nwcemQQnz13BJ8//mNisd6+lsTJI9vmFCOkX1y8JU/rQzZd9Z5XUFDrywvdtY0AABG9MnBiD45sowo5/v70wapvSWJMeV5GFOeF3icm5GK704ZGBJ8jO2bJ38pUdzL65GKtBQPWtqltbi/vHYkJg/sqekYijUfGtP/76uG46JzeuEZWTPJQzOGhv1hce2Y7ufkNR96y/Frx/TB7687F8caWjDhsaWB7UN7Z+OZ2ydg5H+/DwC46+IBeGjGEHx+4DSufeJT7U2+DndFSagOp9Hee6Nds0QtfZ8YaXisOazqVSAIyp+NUu2A1jyEXSpb9pSoklY4kfpYRDoc+4cS2U/P1y4w2iVom9Ybs//7HVLW6Lhjy/t8GB1pKJ8DyCObyj0w67LOSdWc7gabWMFHlK/3WPRpiaIYYXisOZeJVTdMQRAUO2kqpac1SAgXG8iPIRpYTyba0SWMPYjsp2eeH+U+H9pe6y8fQsoazamHDvXVO+rFv788D4KgXD7qXUvG6VE4CRV8RCvqmg+V7SLsmRLdqtVmPQIUIw2lgkJr2aFntUqfaKTmI1L64Y/HobFE1lIqr/R87bp7XAT1+dAYPgiyf4MOoDsD/jT11nx0Lzopr/kQlD8bhZqesMdns4t9om52sep+E7HZRd9VopZNy2o+ED4Sl++r/ajanhFV0gp79AgfRqTDMfYgspbSd0xXs0sUNR+CSs2HHqF9Pozd7eU17sHDeLsO7N/e9a/2Yf6s+bBNtL/8rZqKoavmI8zzJnU4tep+6fEIKv07tNWGKB5TR81H15daZ81HxJqN8K+3qhaJiNTpmQm4u9lD/2gXfzKh/cuM9/nQe6tXm01ZUNgWvJ/WGhbWfNgo+l+r1nQ4jTTaxSxW9vlQOrTWfiBqx1Sj9FHpDQwj/aKJWDPC2IPIdoZqPoK2aW52OftieTmgp5j2lzH+4EdvGa82AWFXh9PQ/ZVqesIen8GHfaLucBp1s43yAcyu+bD7vihA+ReJ0jatNQZhV5aVPzbQ5yNS52HGFkTOUvoOGllY0liHU+m/gdfrSFepb5oe/qBFfhyPoFzTLA92IrFntV91iRV8RDvCwaKfu6IY/kLQ2zantrdVi8oFLx8diRn7yT8qEeaPdol0PHY4JbKfrg6nCgu7aS0C1fp86LlfRzvaxU/eRBxptIvepR2cklDBR7Tk59un826u9r2JdLGYFTRYFeh2LaKkHokH01p2hKshkQdjPp8V83yw2YXISYqj5XS8XmnoqdYAQHWeD0N9PsSzaWt+6dnXdQnt8yHI5vmQp6czAYcw+NBBfhHorrZS6/OBSM0uoU+GC3zUvqBW9W6OFIlLtmlsu7K65iPiJGKRXq8vOSIygZ4fGYHRJkHbtP6Q86djRm23v7zSfb/wdziVlZlq5bg/r1p/FHO0i43MHmprWjNGxGaXUEba66xqdgkZ+hXYrrBNxzHVhAQfov5CItJol8gznDL8ILKbkWYXI+0uguzfwMv1NLvIZhzVH3sov0DtOEKE5+Wsuh9olVDBh9n0BgCqa7tEiEG7bq7SbZ1G2lAsandRm/RG8VeK1j4fYZ6Tf1pG5vmI2OcjQkatGnZNRF0UO5zqmSlI1uwh/zscc2Y4lb5G92gXld1DO9x3bQl0ONV8fNZ82OJ4QysOng6/lHok8uqvTpXQsbapDX/48Ev89PWt2HV2cTK5/36je2nl9k4RP3hxo2q6z609ELLA0r82HERtUxv+vHwPjtSpv6/gPFp1qakVB8pttlpHu+i4uxsa7cKaDyJX01ibGunlogi0tHfiz8v34KGXt2h7rcpoFz3kk35ZXdPgLwPPaFw997MDtRbmJrKECT7qW9qjen2WNxk9ZEsV7zvRqLjvHz7chT98uAv/WLUfl/1+heI+iz+tkjz2L3OsZME7X4Rs+/GrWzHn72ux4J0vcP1fVkueSw/K57qqU4G/9XaQ1crj6fpyy2WlhS6afG5ZLoCuVWPDUXqtX89M6Wsn9c9X/ZUwUr4a7Vne5NBLP79HauDviRX5ALqW8NYqJSn6gKQ4Oy0kD0TUJTstRfvOQc0ef/poFxa88wXe3XZUVzpZsvQqCnpoT97/hxjyhyZl+cplT15GquRxn9x0AEBaaneZ1twWWh67jXoJH2ci/TIeUpyFKYML0dHpw+mmdrz82cHAczdOLMf148uQKzvpbZ0++WEAAG9uOqy43ewfy5sO1gEA9p9skmzP8nZ/YRqDomCrAm+PIGBkqfQmf/6AAnxlVO+QfS8fVoT5s0ZiVGkOZj4euqQ9ANwzdSBGlSoHDQBQFHSDBoC5lwzEIZVarcdvGKO4PS0lCYtuHY91VafgEQS0d/pw1eiSwPPXTyiHxyNgUv8C1XwsuWMi/rXhILK8yRAEQfJ6oxbdNh5vbzmCZI8Hs87rE/XxiOLFbZP7oVzHjwF/cesTRWzYf1rz6/5w3bmBdCb1z8fPrxmBAycbMaBXJiYPVC8PQtIPNIOE1nxcO6YPXv38UODx3VMGAACeXLYHQNePo7svHhB4/sXvVOK37+/EoKJM3HFhfwDAC3dOwpZDdbhufDkAID/o/tTW4ZP8CA1W0CMVJxvbcPmwIs3vxQoJE3xE6mD4068Mw/kDewYe+4OPK4YX45fXjuw+jkcINGWo1SSoJWVXRX1w22Jws4uV1X7pKdIL/Y4L+yMjNfTy8ngE3DChPOyxbpxYrrlZo6JnD3iTkxSHzg7tnY2Knuq/VKYOKcTUIYWKz6WlJOGWyn5h0z5/QE+cP6Bn2H30Gto7G0N7Z5t6TKJYJP9GzxpTqu/1Qf1N9fQVuWZMd9CfnOTBzZP66ko3kP7Zf+WjXSZW5OO3Xx8dCD5uPb8ffnTFEADdwcfdUwYgL6gmdkJFPl74TqXk+BP7F2Bi0I+j4B/Y4fqX5GSk4GRjG26/oMLQ+zJLwjS7RLyXqQ6DFVV3U7+ZO9sfIDhfwX9b1cFIcT4PE9pKdb1G4TN3ukMVEZlH93D6oEm+nOiiFbK2i3/orCBI+pwplVNGiq7g9xi2c6vKEF67JUzwEWlSKbVmGfk5DN5NrcOpas2Hbec6uLbD+huw8jBb42/WyOyh7P9JFN+Mz+Xj1I8Q6VBbf1kcOnGZSakpTDymJJAPk9I1KmGCj8hDK5XJT2LwL2y1X9ZOD8OU1nxYH4gorzNg/HhGXqp0elnxQRQ/9K4k3T3DqdM1H9KCKJop27WmqWXeKKd/sCVO8BFpITGNNR/B179as4val8SuZdhFlT4fVk6vHrrN+Hs1UmvCtVaI4ou8HDDc7GJWhnRS6/OhZcp2o3nuXlxOfZ/u59jsYotINyf1X+rqfT7UJvpyutlF2s8j6G/LUlSaz8M4I7UmijUfTi9eQESGKa3mqu8AXf841fdL3ufD5/Nvt67mI7i2R42/XHS6hj5hgg+j02mH6/OhVrXl9G9w9dEuVjW7hG6Lps+Hkdcqdzg1nAUichmDsYfu0S5mCQRLZwsiMbBdup+ZxZT/fYYr69WCILslTPAReQl1bSci+CJWH2rrdPjRLfgitK7ZRQh5z9FE1WZF5Iw9iOKH3nIheG0VN4x28ZfFTvf5COxrXrKGJE7wEanPh8r28L2GVY7lonk+pMGHNbdjQQg9tt01H0o41JYodkXbmBtc8+GE4KG+Xf+qjTIxL4fa+nwo9z2xW+IEHwZrPkJvqt1/6x1qaxdf0MSrav0/zGT6aBfT+nwQUbwwOtTWsR8hsvT92ZDfa3xKE2UbzLOspUdRYLQLO5zaw2iH0zCDXVQvatWTalNUEtzR0paF5QSlnun2zvNBRPEltClXZ82HZKit/WWKvObFXxSH9vkwv+Yj7FDbQBBkWrKGJE7wEbHZRdtQ2+CL2L3NLt1/iypNMGZSXL3W5nk+FLHqgyhu6C0XuofaOjXaRdoEojrU1sw+H/5jhtlHLR92S5zgI8InrXaBhqv5UBtq6/gv96BsxeI8H2Z9fow9iOKH8WYXZzpXygOB7tEusg6nCq81WnbpmmSMzS72iDTUVvONOegwB083hTy940g99p1oDNle29SGv6zYqzER/dbuO4Xth+vxo39txtqqU4HtpxrbAAB1ze3449JdlqTtij4fxpMjIheSf6f1N7t07f/pnpPOjnYRRdS3tOMPH3wJwNrRLi0dXR1Ith2uD2w7Vt+C33/wJXYfa5Ck5/Rv5IQJPiJ90NnpKYrbJ1bkSx4HLxO/qbo2ZP+7n9mgeJwfvLgJze2d4TMRhW/+bQ2ufPwTvLC+WrL9TGtXmr99f6fqay8YqG9lVvly91lpySiWLXOflab8eQbLzVDeJ1lD5HL+gK7VHK86ez4yvKEr6E7qr335ayJyl9NNbVG9PrgUWbP3lOp+F5/TK6p0tKT/+sbDOHn2h2BWWldZlX3232El3atY+7cZXdm67Wzw8b3nPg9s++XbO/DHpbtw73Mbz25RHvJrt9ASO04JgoAl356INzcfRkZqMgQAbZ0+5PdIRb+CHiFLry9/YApW7j6Br48tk2x/cPoQPLe26wbfQ+GGV3UytDYEAJZ/edycN6KirVOpy3T3hR4u/dsm98O0oYW4YFAvrK86hYde2aK6b4/UJDx92wQs/eIYth6qw5DiLIzskwNBEPDH68/FO1uO4vLhRWGXsvd75vaJeH97DdJSPGhp9+HkmVZMH16M5KTIMfGvvzYKS3ccw9fGdi2znelNxqLbxmN3zRlUn25Cr0wvbjK4FDYROS+/hxcnzrQGHutdhTX43qr2w++nXxmGGyaU41+fHcSZlg5UDjDvB0twn4/G1o7A9u9dOggA8Oy3J2Fd1SncMKE88Nyz356ETQdrMX14sWn5WHa27N9xpKs2xOeSmo+ECT4A4PyBPXG+xl/5fQt6oG9B6A00r0cqfjJzKH7x7x2qk4y5QVG2FzX1rYH2PbVhwQCQnpKEWydXAAAGFmaGDT5uv6ACeT1S8bWxpYEbv9/V5/bB1ef20ZzHEX1yMKJPTuQdFZTmZWDO+f0k26YOLsTUwYWGjkdE7lKcIw0+jHY4DWfWeX2QnpqEmy34oeJP3SeKgT4YXx9bipLcdADAyNIcjJTVIittM5v6fCP2SphmFzN1D2dyOCNhJAWi7q5Mhgs+9FyFbn7PRBQ/5MGD0Q6netIwVdAMp072s5AnGehwyj4fscdf+6c22sUN5MO8wgUfer6AXKyNiOwgb2XR3eHUtJ2MCZ7h1P8j0Ol+FoD6ZGd2Y/BhgL/t0c3Tdyf584jINR96rkEXv2UiiifyiQuje7nhfYzqXttFDOpn4Xzw4WOzS+zyR69hmzIcFgg+/DUfYaIGPdG4e98xEcWTkFJJ990y8gusvAEH5vkQHW52CZnVTGW7zRh8GBALfT78VZY+Lc0urPkgIpeRl0tGp1cPx8pmkOBDd69oa1lymnVPMuYsBh8G+EeCunm0i7zZJVxe9VyEbm5qIqL4IQ8M9N4stQQWVv749wR1+ndXnw935IXBhwFCoObDvTdiT3eDIwCgw6yajyjyRESkVdQznGrax/qaD1F0T20D4J55Phh8GOAfxtrp4jtxIOo++zh8oKSjz4eLAy4iih/ym6MlQ20tvQF3l8Hdi7k5H364ZcQigw8D/CvkuvlGnCQbkcM+H0QUS0Lm+dBZb+D0fT645sNf/DrR1BEyz0cs1nzMnz8f48ePR1ZWFgoLC3HNNddg507pmiEtLS2YO3cuCgoKkJmZidmzZ6OmpsbUTDstFka7+IcD+7NoVlZd/JaJKI6E1Hzo/KmsJVixdKjt2X9FiK654QPBk4zFUJ+P5cuXY+7cuVi9ejU++OADtLe34/LLL0djY/cqrvfffz/efPNNvPTSS1i+fDkOHz6MWbNmmZ5xJ3lioM9HUlDUbSa3VNkRUXwLCT50HyDyLnaMdpFOMmZZctoFamGczYautV3effddyePFixejsLAQGzZswEUXXYS6ujo89dRTWLJkCS655BIAwKJFizB06FCsXr0akyZNMi/nDgoEH8prublCd5+PyMGCngDFxfEWEcWR0OnVrehwah0hqM+Hv9h0pNlFlmT3JGMxvKptXV0dACA/v2vZ+Q0bNqC9vR3Tpk0L7DNkyBCUl5dj1apVisFHa2srWlu7Fw+qr6+PJku28A+1XVt1CmdaO/Ds6v043dSOqYPVl2YON9rECv4+Hx/uqMHPrhoedl83910hosQUOs+H3tdraXaxvubj8aW7gjZalpyiI3XNOHGmLfD4oy9qAvcip5uADHc49fl8uO+++zB58mSMGDECAHD06FGkpqYiNzdXsm9RURGOHj2qeJz58+cjJycn8H9ZWZnifm6SnZYS+PvGv67G/He+wJ+X78F1f1kd1XGz0sxbZLi2qR0AUH2qOaRvysSKfMnj3IwUyePBRVmSx4VZXmSfzdvQ3tLniIisUNlfury97g6nQX8nqUQuVjY9KB3a7pqPG2T3pG8tXh/42+kWIMPBx9y5c7F161Y8//zzUWXg4YcfRl1dXeD/6urqqI5nh4lBX4rNB+vC7puTnqK4/cJBPdHn7NLKQNeX4zsX9Q88nnfZOSGvmXfZOeiRmqQpjw0t7YG/faKIy4cVBR7/dc44/PprozB36gD87hujMbBQGlA88c3zcNfFA3DftEH43qWDsOi28Xj225Pw6FeH49oxpZrSJyKKxncuHoBpQ7vLrWiG2hZnp4U8/8ztEy2u+Qg9ttX9LObPGgmg+75TdbJJdV+nO5wa+ql9zz334K233sKKFStQWtp9MyouLkZbWxtqa2sltR81NTUoLi5WPJbX64XX6zWSDcckeQQMLMzE7mNnIu6bnR76Ed82uR9+dtVw7D7WgGm/WwEAmDt1IHpldX8OUwcX4ncffCl53fXjy/CXFXs15dEju8r9lR/zZ41EdloKvjFOvYZpQK9MPDRjSMj2kaU5mtImIopWarIH35xUjg93dI2WNPteecGgnuYeUAOr+1kMLu76Ial03wnJSyw1u4iiiHvuuQevvvoqPvroI1RUVEieHzt2LFJSUrB06dLAtp07d+LAgQOorKw0J8cuofW8KXWn6L4AhaBt0gtT6cLQE6kGVzMG97Z2uqqNiEir4DJP743b6a5sSsW11TUfegZDOH0v0FXzMXfuXCxZsgSvv/46srKyAv04cnJykJ6ejpycHNx+++2YN28e8vPzkZ2djXvvvReVlZVxM9LFT2vbnWLwIfiPIT1epEPqiVSTgnYWg8a8OD2fPxGREdHcuJ3oVK8YLFlc/uo5ekw1uzz55JMAgClTpki2L1q0CLfeeisA4Pe//z08Hg9mz56N1tZWTJ8+HU888YQpmXWTaM5boN5DkNZ0yB/L6QkcPLKaj+7pffXllYjIDfTeLIPDDScmR3Si5qN7bpHIbzim5vnQ8obS0tKwcOFCLFy40HCm4onSZ+a/QILPvRDyOLrOSvJ9u2fYY/RBRLFBXkbq4fQUAk6MdgmeW0Trvk7h2i4GaW52UdjmDwA8spoOjweSxyGv03GxBB87uObD6WiXiMiIaO7bTszMrFyG25Omptm3Y6nDKXXT+kVQmtO/u9kl+HhC5A6nOs6WpMNp0NoC7PNBRLEommYXJypBlMpa+ShEswVP6a51X6cw+DBIe82HwigTf7OLJPiQPla8cKMZ7QL2+SCi2BJVeSUq/mkf+/ub6mx2cRaDD4P013x0v8AfRMiHkUkfK6SpI3/BgYpPFANDr9jng4gSjRM1H0rN5Fb3s9BT8+F0LTiDD4M0z/OhsH/oLB9naz5kj+UM13yAfT6IiOzk9tEuTv8OZfBhkNYaBKW+Ft3zfEhrOqTBhULUbHSeDzE4CGL0QUSxIZryStrJ1Il5PkJZXdvQvZp5ZE7fCxh8GKT9GvK3uwS9Fv5ml+5t8knGlGc41Z6/4JEzCJrhlDUfRJRoHGl2caTPRxfWfMQxzc0ugZqPoNcqzfMhb3ZROJauScbkM5xyng8iSiCiwx1OFft8WD3Ph7/ZRce+TmHwYZCeeT62H65HS3v3ZPvdQ22lx1DqlGokTSB0tAtnOCWiWBPV3B5Bd+BTjW3RZ0YnJ/p8+O8uPg1TurLZJUZpH+0i4q5nNii+ODWp++Nv6/RFbHbRc+FmpXVPXtvV4dR/DEYfRBQbSnLTDb+2d26a6nPnFGUaPq5WSiVtVlqKpWl6dNR8JDncBq9renXqprnDKYADp5qkrz37b3pqUmBbR6co64AqPf6z354YMc0eqUlobOvE/dPOwYkzrd15EIMXltOUbSIix1X07IEnbjoPPTO9ul87vCQnZNs3J5WjNC8D04YWmZG98GTl9cg+OZg5srfFSWqLPp7+1gTHgw/WfBikt8+H5LWB0S7S/cINtZ08sGfEtPzBy5UjiyWvF9HdAYkVH0QUS64c2RsTKvINvXbK4F6SxwU9vLjr4gEYWGh/zce3L6yQ/OC0Ms3A6EaV8v5CDfcTqzH4MEhPs0vIa89eIsGRp08Uow4M1Pp1SPt8MPogosQgL+3sLP6cKGrla7uoZcENtwEGHwZFt7Cc/1/pRGBKc4Ho0d3HSPpiyWgX/YclIopJ8nLazk6W8rTs6G8XmOcjwuhGN/wIZfBhkOZzpxB9KDa1ydpdjFwcwTUfkleL7HBKRIlHXtzZ2c1BvpKunUWvP2039/Fj8GGQ1ghaueYj9LUipAGDkYtGrXYjuM8Hgw8iShzy6QzsS1ne4m5HrYt8bRenh9OGw+DDoGj6fCjxieFHu2g9RlfeZM0uYnA1nO7DEhHFJPmPOCebG+yohRBCml2sT9MoBh8G6RlqG/pahf1E6XYjF02nyhTqIkROMkZECcdN5Z0deeme58P95T2DD4O0RrGKQ20VajV8YuhCc8rHU69JCa5qk3RmDVpYjs0uRJQoQjqc2trvQsqOWhf/vUVpQVO3YfBhkPb+pgpDbZVqPiBKjxnFNRMy1BaRh14REcUbeVnoZB8IO1KWzzHm5vKewYdBmptdFGs+lHaUPqH2JTESPYti91Bbj5u7PxMRmUhejtpaESAr/O2p+egSC/M6MfgwSHOzi8I25ZoP6RclmmtGaZIxUaU/CBFRvAqt+bCPvOy3pewNGe3iXgw+DDMefSj2+fBJZziNpq1OabSL2gRkRETxKnTlcIcyYlPaIfcNFxf3DD4M0jzUVnOfD9k++rOk+lrx7H8Aaz6IKHHIizs7O2A6Ms+HJH2RHU7jkdabeHuntnk+Qi5Uk5tdqk81A3B372ciIjM5+WPLiRlOg2t6/uvVLahrbrc+UYMYfBgUTRQbHABkeZMBAEN6ZyE3IyWw3ZuchLF98wAAg4uyAtsvHx55KWh53oK/Ak4vo0xEZJfTTdKbr50dMIuy02xPOziF59ZWW55eNJKdzkCs8kQI226p7It/rNqv+FzwNfjsHROxsboW15zbBylJAn7ztVEoyExFemoSfveN0Xhj42HMGNk7sP+PrxyKVz47FDbt0JqP7vBD/oUgIopXBT1SJY/t/On1tbGl+OXbO9DS7gNgTy1MLNVss+bDoEg1HzdP6hvmtd1Glebilsp+SE32QBAEfH1cGS4Z0lW70begB+69dBAGFmYG9i/I9GJmUDAS6fhAcGdT9vkgosTRO1de+2Bf2hmpyfjh5YO707Yj9Imh8p3Bh1ERTnK4Kraoq98ivVz2fGdQ9MFmFyJKFCHzfNicvmTWalv6fFifhlkYfBgUqXor3D3e+thDukdw8OHmSWeIiMzk9MJywenbEnxYn4RpGHwYFOkkh6thiPYCifQFkj/Nmg8iSkROz/MRXN7a0ezCPh8JINI5DnsRRHmBRIofBFkSnUEdThl7EFGicHrOLYHNLqoYfBgUsdnFypqPSM/L8hZc8xFLkTERUTRCZ/y0t/wLrvmwo+x1cuE8vRh8GBTpFFtZwxCp2UWeNoMPIkpE8rLQ7ppf2/t8xFDxzuDDoMgBgPrz2uY8DZN2xOfVaz7Y54OIEkVInw+bawaC7wMseqUYfBgUKcK0NAKNYqgtvwBElCgcbnWR/Qhlh9NgDD4MijjaxcKLIFL0HjLa5WyHU0HgUFsiShzym7HdpZ9ktAubXSQYfBgUeZ6PMM/LV5HTKWKti+xxp88/vW8MXZlERFGSl3h2F4HB6dnT4TR2MPgwKKqhtlGKONQ2ZLRL179W1sYQEblNaM2Hc6Nd7Eg5lmq2GXwYFLH2IcwnG32H0wjNLrLH/pqPGLouiYiiFlLmOdjnw47yN5b69DH4MKijM3wIEa6WIcpWF02dXYMDlIOnm7vyFEtXJhFRlEJHu9hLOtrFhmaXGPqFyeDDoJc2HAz7fLgLrSAzVfU5LWqb2sM+L0DAqNKcwON/nc1rU1tnVOkSEcUSp9d2yU5PDvydlZYcZk9rpSS5Lyhh8GGBZ789UbV24tIhhbh8WHFUx+/hDX8RCwLw1dElIdunDu4VVbpERLFE/iPQ7srfiRUF+Pk1I/D760ajb0EPexMP8tg1Ix1LWw2DDwtMHthT9bnbJlcgNTm6j70w2xtxH49HQGleOgDAd7adZ1y//KjSJSKKJU7P85HkEXDzpL64dkypvQnLFOekYcaI6H70mo3Bh0XULnIzLv7Ia7tI//XPMRZDzYFERFFzeoZTt+ia48npXEgx+LCI2kVuxvmPPM+HIPnXX/ORqF88IkpMTs/z4RbC2f/chMGHRVQvchPOf6Re0/KaD5E1H0SUgDixYhfWfCQQ9dgj+itA69Iu/n+7az6IiBKH06Nd3EKA+947gw+LqJ1oU/p8RKz5ECT/+oLWdiEiShQhHU6dyYbzBPe9dwYfFrGw1UXD1O7S/c5OcOq6Nj8iIiuFdDhN0CJQgOC6987gwyJqJ9pjwkDzyKva+jucdmHNBxElIqfXdnELQXBf/xcGHxZRbXYx5dj68tAdfLjr4iMishJHu3TxCO4Luxh82MyMi19r5Ul3zYf0MRFRIvDI7nCJuryVIMB1NwAGH7YzodlFYwTTPdSWzS5ElHjc1tTglK7Yw12fBYMPm9n5XeieZMz/mIgocUW7onis4jwfZEoAoDWa755enX0+iCjxyMvKBI094L56DwYftjOjGlDvIXw+NrsQUeKRl7e+BK36YM1HHBnRJ9vQ6zpNuPgbWto17eev6RDZ7EJECUhe3uZlpDqUE2cJAM4rz3M6GxIMPgyaf+2owN+3X1CBZI3dqP21ENEo6OEN/P3RDy5W3c+fo04u7kJECWhgr8zA33OnDsCk/gUO5sY5giDg6+PKMH/WSHw47yKnswOAwYdh6andH92t5/dDv549NL3OjEq/9NSkwN99C9TTDenzYULaRESxIjW5u9S7eVI/JCXoWFsBQJJHwA0TyjGwMMvp7ABg8GGYk0O4BJW/Q/YLBB/Sx0REiaG70EvQuAOAO8t+Bh8GBQcfek6sGf2dtKbt798cmOeDdR9ElEA8Wn+pxTk3lv0MPgwKrr7TUwsimhF9BCUXbvgsaz6IKJEFl82JPOGYG986gw+DBEH5b1vS1rkf+3wQUaJj8OEuDD4MCq75sLtKS/NkYfKhti68AImI7JDIxR+bXeKIvN+F1lNrxmgXrR2n5Pu58QIkIrIDaz7chcGHQZLgQ8frTOnyoXNVW/UNRETxS9I8nsB3OwYfcUTei9rOk6t9bRfpfi68/oiILBP8Yy+Ryz831noz+DBIMlmNjtoM0caljeSXGxeWI6JExWYXd9EdfKxYsQJXXXUVSkpKIAgCXnvtNcnzt956KwRBkPx/xRVXmJVf1wi+keuaMd2UZhd9q9r6JfIkO0SUeILLwIQOPpzOgALdwUdjYyNGjx6NhQsXqu5zxRVX4MiRI4H/n3vuuagy6UaCpOJDtLVaS/tQW1mzixuvQCIiGyRy+efG956s9wUzZszAjBkzwu7j9XpRXFxsOFOxIPhciqK9zSmaI3iOdiEiIheW/Zb0+Vi2bBkKCwsxePBg3H333Th58qTqvq2traivr5f8HwuCmz5sbnUxPNrFjdEvEZEdErn8c+N7Nz34uOKKK/CPf/wDS5cuxa9+9SssX74cM2bMQGdnp+L+8+fPR05OTuD/srIys7NkidSk7o8u05usuVahd05a1Gn3LcjQtJ8bLzgiIrvkpKcE/k5K4ALRjf1ddDe7RHL99dcH/h45ciRGjRqFAQMGYNmyZbj00ktD9n/44Ycxb968wOP6+vqYCEBSkz345+0T0N7pk1zg4fzphjHo3ysz6rSHl+TgD9ediz556WH3C+3z4b4LkIjIKrkZqXhqzjh4k5OQnJS4gzvdWPKbHnzI9e/fHz179sTu3bsVgw+v1wuv12t1Nixx4aBegb+13NdnjuxtWtrXjOkTcR95ntx4ARIRWenSoUVOZ8FxbvzdaXkoePDgQZw8eRK9e5t3441Vti9AJw8+XHgBEhGRtdw42EB3zceZM2ewe/fuwON9+/Zh48aNyM/PR35+Ph599FHMnj0bxcXF2LNnDx588EEMHDgQ06dPNzXjscjuZo+QZhcXXoBERGQtN/7w1B18rF+/HlOnTg089vfXmDNnDp588kls3rwZTz/9NGpra1FSUoLLL78cP//5z2O2aSWWseaDiIjcSHfwMWXKFIhhVkd77733osoQWYexBxFR4nHjD8/E7f6bAEIWlnPhBUhERNZy40hHBh9xLHQtF/ddgEREZC03lvwMPuIYZzglIiI3lv0MPkzixmqtkGYXh/JBRETOceMMpww+4lhozYf7LkAiIrKWG0t+Bh8JxI0XIBERWcyFhT+DD5O48NyGrKDLig8iosTjxgkmGXwkEDe2+xERkbXcWPQz+IhjIZPBufACJCIia7mx6GfwYRK3RJaFWerT2Lski0REZJELB/UEAKQmdd/e01KSnMqOKt3Tq5MxL91VaUs6i2+boPocR7sQEcW3P90wBm9sOoyZI3vj/e016JXpRQ+v+2717stRnBrfL9+WdIaVZAf+DulwaksOiIjIKbkZqbilsh8A4IYJ5c5mJgw2uyQQVnwQEZEbMPhIIG4cbkVERImHwYdJ3FirEDLYxYV5JCKixMPgI4Ew9iAiIjdg8JFIGH0QEZELMPgwSSz0p4iFPBIRUfxj8JFA2OeDiIjcgMGHSWLhxh4DWSQiogTA4MMk8pElbhC6qi3DDyIich6DjwTC2IOIiNyAwYdJYuHGHgNZJCKiBMDgI46JsragWAiQiIgo/jH4SCiMPoiIyHkMPkwyfXgxAGBMea7taVf2LwAATBncS7K9rrld8pg1H0RE5AbJTmcgXnxrcgWy0pIx5ZxC29P+zddH4c1NR3D1uSWS7UOLs7H5YF3gsYfRBxERuQCDD5Okpybhlsp+km0pSQLaO60fg1ual4G7pwwI2V6U7ZU8ZuhBRERuwGYXCzk+nbmspoMVH0RE5AYMPqzkspu948EQERERGHxYyuPwvV6ePms+iIjIDRh8WMjpmgan0yciIlLC4MNCTtd8yGs6WPNBRERuwODDQk4v5CZPnTUhRETkBgw+LOR0TQNrPoiIyI0YfFjI6Xu9vOaFwQcREbkBgw8LOd7sIq/5cDwcIiIiYvBhKadrGuTBhtP5ISIiAhh8WMpt93q35YeIiBITgw8LOb2QGzucEhGRGzH4sJDTN/vQ5Bl9EBGR8xh8WGj22FIAwMXn9HIk/aG9syWPnQ6GiIiIACDZ6QzEs3umDkTv7DRcPrzYkfQvHNQTuRkpqG1qB8B6DyIicgfWfFgoKy0Ft06uQEluuiPpC4KA71w0QPKYiIjIaQw+4lxwvMHQg4iI3IDBR5wLXtzO6dE3REREAIOPuBcccDD2ICIiN2DwQURERLZi8BHnWPNBRERuw+AjzgX3+eBoFyIicgMGH3EuOOBg6EFERG7A4CPOSWs+nMsHERGRH4OPOCet+WD0QUREzmPwEecE1nwQEZHLMPiIcx72+SAiIpdh8BHngvt8MPogIiI3YPAR54L7ebDPBxERuQGDj3jHPh9EROQyDD7iHFtdiIjIbRh8xDnJUFtWfRARkQsw+EggDD2IiMgNGHzEOUmzC6MPIiJyAQYfCYSjXYiIyA0YfMQ5yQynPNtEROQCvB3FOUnw4Vw2iIiIAhh8JBCOdiEiIjdg8JFAGHoQEZEbMPiIc5Lp1Rl9EBGRCzD4SCAc7UJERG6gO/hYsWIFrrrqKpSUlEAQBLz22muS50VRxE9/+lP07t0b6enpmDZtGnbt2mVWfkkngWu7EBGRy+gOPhobGzF69GgsXLhQ8flf//rXePzxx/HnP/8Za9asQY8ePTB9+nS0tLREnVkiIiKKfcl6XzBjxgzMmDFD8TlRFPGHP/wBP/nJT3D11VcDAP7xj3+gqKgIr732Gq6//vrocktRYc0HERG5gal9Pvbt24ejR49i2rRpgW05OTmYOHEiVq1apfia1tZW1NfXS/4n80gWlmOfDyIicgFTg4+jR48CAIqKiiTbi4qKAs/JzZ8/Hzk5OYH/y8rKzMxSwivM8gb+TvIw+CAiIuc5Ptrl4YcfRl1dXeD/6upqp7MUVyZW5OOX147EP2+fwOCDiIhcQXefj3CKi4sBADU1Nejdu3dge01NDc4991zF13i9Xni9XsXnKHqCIODGieVOZ4OIiCjA1JqPiooKFBcXY+nSpYFt9fX1WLNmDSorK81MioiIiGKU7pqPM2fOYPfu3YHH+/btw8aNG5Gfn4/y8nLcd999+MUvfoFBgwahoqICjzzyCEpKSnDNNdeYmW8iIiKKUbqDj/Xr12Pq1KmBx/PmzQMAzJkzB4sXL8aDDz6IxsZG3HnnnaitrcUFF1yAd999F2lpaeblmoiIiGKWIIqi6HQmgtXX1yMnJwd1dXXIzs52OjtERESkgZ77t+OjXYiIiCixMPggIiIiWzH4ICIiIlsx+CAiIiJbMfggIiIiWzH4ICIiIlsx+CAiIiJbMfggIiIiWzH4ICIiIluZuqqtGfwTrtbX1zucEyIiItLKf9/WMnG664KPhoYGAEBZWZnDOSEiIiK9GhoakJOTE3Yf163t4vP5cPjwYWRlZUEQBFOPXV9fj7KyMlRXV3PdGJfhuXEvnhv34rlxr0Q8N6IooqGhASUlJfB4wvfqcF3Nh8fjQWlpqaVpZGdnJ8zFEGt4btyL58a9eG7cK9HOTaQaDz92OCUiIiJbMfggIiIiWyVU8OH1evGzn/0MXq/X6ayQDM+Ne/HcuBfPjXvx3ITnug6nREREFN8SquaDiIiInMfgg4iIiGzF4IOIiIhsxeCDiIiIbJUwwcfChQvRr18/pKWlYeLEiVi7dq3TWYor8+fPx/jx45GVlYXCwkJcc8012Llzp2SflpYWzJ07FwUFBcjMzMTs2bNRU1Mj2efAgQOYOXMmMjIyUFhYiAceeAAdHR2SfZYtW4bzzjsPXq8XAwcOxOLFi61+e3FlwYIFEAQB9913X2Abz41zDh06hG9+85soKChAeno6Ro4cifXr1weeF0URP/3pT9G7d2+kp6dj2rRp2LVrl+QYp06dwk033YTs7Gzk5ubi9ttvx5kzZyT7bN68GRdeeCHS0tJQVlaGX//617a8v1jV2dmJRx55BBUVFUhPT8eAAQPw85//XLJuCc9NFMQE8Pzzz4upqani3//+d3Hbtm3iHXfcIebm5oo1NTVOZy1uTJ8+XVy0aJG4detWcePGjeKVV14plpeXi2fOnAnsc9ddd4llZWXi0qVLxfXr14uTJk0Szz///MDzHR0d4ogRI8Rp06aJn3/+ufj222+LPXv2FB9++OHAPnv37hUzMjLEefPmidu3bxf/9Kc/iUlJSeK7775r6/uNVWvXrhX79esnjho1Svz+978f2M5z44xTp06Jffv2FW+99VZxzZo14t69e8X33ntP3L17d2CfBQsWiDk5OeJrr70mbtq0SfzqV78qVlRUiM3NzYF9rrjiCnH06NHi6tWrxU8++UQcOHCgeMMNNwSer6urE4uKisSbbrpJ3Lp1q/jcc8+J6enp4v/93//Z+n5jyWOPPSYWFBSIb731lrhv3z7xpZdeEjMzM8U//vGPgX14boxLiOBjwoQJ4ty5cwOPOzs7xZKSEnH+/PkO5iq+HTt2TAQgLl++XBRFUaytrRVTUlLEl156KbDPjh07RADiqlWrRFEUxbffflv0eDzi0aNHA/s8+eSTYnZ2ttja2iqKoig++OCD4vDhwyVpXXfddeL06dOtfksxr6GhQRw0aJD4wQcfiBdffHEg+OC5cc6PfvQj8YILLlB93ufzicXFxeJvfvObwLba2lrR6/WKzz33nCiKorh9+3YRgLhu3brAPu+8844oCIJ46NAhURRF8YknnhDz8vIC58qf9uDBg81+S3Fj5syZ4re+9S3JtlmzZok33XSTKIo8N9GK+2aXtrY2bNiwAdOmTQts83g8mDZtGlatWuVgzuJbXV0dACA/Px8AsGHDBrS3t0vOw5AhQ1BeXh44D6tWrcLIkSNRVFQU2Gf69Omor6/Htm3bAvsEH8O/D89lZHPnzsXMmTNDPj+eG+e88cYbGDduHL7+9a+jsLAQY8aMwV//+tfA8/v27cPRo0cln2tOTg4mTpwoOTe5ubkYN25cYJ9p06bB4/FgzZo1gX0uuugipKamBvaZPn06du7cidOnT1v9NmPS+eefj6VLl+LLL78EAGzatAkrV67EjBkzAPDcRMt1C8uZ7cSJE+js7JQUmgBQVFSEL774wqFcxTefz4f77rsPkydPxogRIwAAR48eRWpqKnJzcyX7FhUV4ejRo4F9lM6T/7lw+9TX16O5uRnp6elWvKWY9/zzz+Ozzz7DunXrQp7juXHO3r178eSTT2LevHn4r//6L6xbtw7f+973kJqaijlz5gQ+W6XPNfhzLywslDyfnJyM/Px8yT4VFRUhx/A/l5eXZ8n7i2UPPfQQ6uvrMWTIECQlJaGzsxOPPfYYbrrpJgDguYlS3AcfZL+5c+di69atWLlypdNZIQDV1dX4/ve/jw8++ABpaWlOZ4eC+Hw+jBs3Dr/85S8BAGPGjMHWrVvx5z//GXPmzHE4d4ntxRdfxLPPPoslS5Zg+PDh2LhxI+677z6UlJTw3Jgg7ptdevbsiaSkpJCe+zU1NSguLnYoV/HrnnvuwVtvvYWPP/4YpaWlge3FxcVoa2tDbW2tZP/g81BcXKx4nvzPhdsnOzubv6xVbNiwAceOHcN5552H5ORkJCcnY/ny5Xj88ceRnJyMoqIinhuH9O7dG8OGDZNsGzp0KA4cOACg+7MNV34VFxfj2LFjkuc7Ojpw6tQpXeePpB544AE89NBDuP766zFy5EjcfPPNuP/++zF//nwAPDfRivvgIzU1FWPHjsXSpUsD23w+H5YuXYrKykoHcxZfRFHEPffcg1dffRUfffRRSDXi2LFjkZKSIjkPO3fuxIEDBwLnobKyElu2bJF8WT/44ANkZ2cHCujKykrJMfz78Fyqu/TSS7FlyxZs3Lgx8P+4ceNw0003Bf7muXHG5MmTQ4akf/nll+jbty8AoKKiAsXFxZLPtb6+HmvWrJGcm9raWmzYsCGwz0cffQSfz4eJEycG9lmxYgXa29sD+3zwwQcYPHhw3FbrR6upqQkej/QWmZSUBJ/PB4DnJmpO93i1w/PPPy96vV5x8eLF4vbt28U777xTzM3NlfTcp+jcfffdYk5Ojrhs2TLxyJEjgf+bmpoC+9x1111ieXm5+NFHH4nr168XKysrxcrKysDz/uGcl19+ubhx40bx3XffFXv16qU4nPOBBx4Qd+zYIS5cuJDDOQ0IHu0iijw3Tlm7dq2YnJwsPvbYY+KuXbvEZ599VszIyBCfeeaZwD4LFiwQc3Nzxddff13cvHmzePXVVysO5xwzZoy4Zs0aceXKleKgQYMkwzlra2vFoqIi8eabbxa3bt0qPv/882JGRkbcD+eMxpw5c8Q+ffoEhtq+8sorYs+ePcUHH3wwsA/PjXEJEXyIoij+6U9/EsvLy8XU1FRxwoQJ4urVq53OUlwBoPj/okWLAvs0NzeL3/3ud8W8vDwxIyNDvPbaa8UjR45IjlNVVSXOmDFDTE9PF3v27Cn+4Ac/ENvb2yX7fPzxx+K5554rpqamiv3795ekQdrIgw+eG+e8+eab4ogRI0Sv1ysOGTJE/Mtf/iJ53ufziY888ohYVFQker1e8dJLLxV37twp2efkyZPiDTfcIGZmZorZ2dnibbfdJjY0NEj22bRpk3jBBReIXq9X7NOnj7hgwQLL31ssq6+vF7///e+L5eXlYlpamti/f3/xxz/+sWRILM+NcYIoBk3XRkRERGSxuO/zQURERO7C4IOIiIhsxeCDiIiIbMXgg4iIiGzF4IOIiIhsxeCDiIiIbMXgg4iIiGzF4IOIiIhsxeCDiIiIbMXgg4iIiGzF4IOIiIhsxeCDiIiIbPX/AZKh+tS7u+ORAAAAAElFTkSuQmCC", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.plot(geo_weather.isel(gid=0).temp_air)" + ] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "weather_arg = {\n", - " 'api_key': api_key,\n", - " 'email': email,\n", - " 'names': 'tmy',\n", - " 'attributes': [],\n", - " 'map_variables': True\n", - "}\n", + "### Next Steps\n", "\n", - "weather, meta = pvdeg.weather.get(database=\"PSM3\", id=(25.783388, -80.189029), **weather_arg)" + "Now we have data ready to use for geospatial calculations. This is shown in the other distributed script [load_pvgis_distributed.ipynb](./load_pvgis_distributed.ipynb). You can also see how to do this in [Geospatial Templates.ipynb](../tutorials_and_tools/tutorials_and_tools/Geospatial%20Templates.ipynb)" ] } ],