trainings/PythonAI/JupyterLab/PythonAI_3.ipynb
2025-04-09 10:28:19 +02:00

625 lines
82 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "34b79531-3498-4b34-a147-ec21449f8816",
"metadata": {},
"source": [
"# Dzień 3"
]
},
{
"cell_type": "markdown",
"id": "24bfa403-53ee-4b10-ab9e-a90dd87ac184",
"metadata": {},
"source": [
"## Data wrangling / prezentacje danych"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0f8b7ac6-af7c-4f88-b878-4752c198f2c4",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "cba0359b-1e1d-4c97-ad8d-a52867071de0",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>datatype</th>\n",
" <th>station</th>\n",
" <th>attributes</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2018-01-01T00:00:00</td>\n",
" <td>PRCP</td>\n",
" <td>GHCND:US1CTFR0039</td>\n",
" <td>,,N,</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2018-01-01T00:00:00</td>\n",
" <td>PRCP</td>\n",
" <td>GHCND:US1NJBG0015</td>\n",
" <td>,,N,</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2018-01-01T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NJBG0015</td>\n",
" <td>,,N,</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2018-01-01T00:00:00</td>\n",
" <td>PRCP</td>\n",
" <td>GHCND:US1NJBG0017</td>\n",
" <td>,,N,</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2018-01-01T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NJBG0017</td>\n",
" <td>,,N,</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78775</th>\n",
" <td>2018-12-31T00:00:00</td>\n",
" <td>WDF5</td>\n",
" <td>GHCND:USW00094789</td>\n",
" <td>,,W,</td>\n",
" <td>130.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78776</th>\n",
" <td>2018-12-31T00:00:00</td>\n",
" <td>WSF2</td>\n",
" <td>GHCND:USW00094789</td>\n",
" <td>,,W,</td>\n",
" <td>9.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78777</th>\n",
" <td>2018-12-31T00:00:00</td>\n",
" <td>WSF5</td>\n",
" <td>GHCND:USW00094789</td>\n",
" <td>,,W,</td>\n",
" <td>12.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78778</th>\n",
" <td>2018-12-31T00:00:00</td>\n",
" <td>WT01</td>\n",
" <td>GHCND:USW00094789</td>\n",
" <td>,,W,</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78779</th>\n",
" <td>2018-12-31T00:00:00</td>\n",
" <td>WT02</td>\n",
" <td>GHCND:USW00094789</td>\n",
" <td>,,W,</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>78780 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" date datatype station attributes value\n",
"0 2018-01-01T00:00:00 PRCP GHCND:US1CTFR0039 ,,N, 0.0\n",
"1 2018-01-01T00:00:00 PRCP GHCND:US1NJBG0015 ,,N, 0.0\n",
"2 2018-01-01T00:00:00 SNOW GHCND:US1NJBG0015 ,,N, 0.0\n",
"3 2018-01-01T00:00:00 PRCP GHCND:US1NJBG0017 ,,N, 0.0\n",
"4 2018-01-01T00:00:00 SNOW GHCND:US1NJBG0017 ,,N, 0.0\n",
"... ... ... ... ... ...\n",
"78775 2018-12-31T00:00:00 WDF5 GHCND:USW00094789 ,,W, 130.0\n",
"78776 2018-12-31T00:00:00 WSF2 GHCND:USW00094789 ,,W, 9.8\n",
"78777 2018-12-31T00:00:00 WSF5 GHCND:USW00094789 ,,W, 12.5\n",
"78778 2018-12-31T00:00:00 WT01 GHCND:USW00094789 ,,W, 1.0\n",
"78779 2018-12-31T00:00:00 WT02 GHCND:USW00094789 ,,W, 1.0\n",
"\n",
"[78780 rows x 5 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(\"data/nyc_weather_2018.csv\")\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "89adf686-81fe-4aa8-8935-d3b91216d536",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>datatype</th>\n",
" <th>station</th>\n",
" <th>attributes</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>114</th>\n",
" <td>2018-01-01T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYWC0019</td>\n",
" <td>,,N,</td>\n",
" <td>25.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>789</th>\n",
" <td>2018-01-04T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYNS0007</td>\n",
" <td>,,N,</td>\n",
" <td>41.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>794</th>\n",
" <td>2018-01-04T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYNS0018</td>\n",
" <td>,,N,</td>\n",
" <td>10.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>798</th>\n",
" <td>2018-01-04T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYNS0024</td>\n",
" <td>,,N,</td>\n",
" <td>89.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>800</th>\n",
" <td>2018-01-04T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYNS0030</td>\n",
" <td>,,N,</td>\n",
" <td>102.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68631</th>\n",
" <td>2018-11-16T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYRL0005</td>\n",
" <td>,,N,</td>\n",
" <td>170.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68637</th>\n",
" <td>2018-11-16T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYWC0018</td>\n",
" <td>,,N,</td>\n",
" <td>191.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>74879</th>\n",
" <td>2018-12-14T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYWC0018</td>\n",
" <td>,,N,</td>\n",
" <td>3.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77120</th>\n",
" <td>2018-12-24T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYWC0018</td>\n",
" <td>,,N,</td>\n",
" <td>18.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78432</th>\n",
" <td>2018-12-30T00:00:00</td>\n",
" <td>SNOW</td>\n",
" <td>GHCND:US1NYWC0018</td>\n",
" <td>,,N,</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>173 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" date datatype station attributes value\n",
"114 2018-01-01T00:00:00 SNOW GHCND:US1NYWC0019 ,,N, 25.0\n",
"789 2018-01-04T00:00:00 SNOW GHCND:US1NYNS0007 ,,N, 41.0\n",
"794 2018-01-04T00:00:00 SNOW GHCND:US1NYNS0018 ,,N, 10.0\n",
"798 2018-01-04T00:00:00 SNOW GHCND:US1NYNS0024 ,,N, 89.0\n",
"800 2018-01-04T00:00:00 SNOW GHCND:US1NYNS0030 ,,N, 102.0\n",
"... ... ... ... ... ...\n",
"68631 2018-11-16T00:00:00 SNOW GHCND:US1NYRL0005 ,,N, 170.0\n",
"68637 2018-11-16T00:00:00 SNOW GHCND:US1NYWC0018 ,,N, 191.0\n",
"74879 2018-12-14T00:00:00 SNOW GHCND:US1NYWC0018 ,,N, 3.0\n",
"77120 2018-12-24T00:00:00 SNOW GHCND:US1NYWC0018 ,,N, 18.0\n",
"78432 2018-12-30T00:00:00 SNOW GHCND:US1NYWC0018 ,,N, 5.0\n",
"\n",
"[173 rows x 5 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.query(\n",
" 'datatype == \"SNOW\" and value > 0'\n",
" 'and station.str.contains(\"US1NY\")'\n",
")"
]
},
{
"cell_type": "markdown",
"id": "d903b952-d663-4981-b68b-bf28cdd66d65",
"metadata": {},
"source": [
"# Earthquakes"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "194ee33c-e694-48ee-91a1-cc42b991c8ee",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "e0671fa8-749b-4f74-acc7-782c5dc86d60",
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv(\"data/earthquakes.csv\")"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "8f569c5a-3cca-4b71-b1bb-3e53e62d8c39",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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j8ejG264uj/1L/T3l9rWWX8D/OM//qP27dsnl8ult956Sx6PR2lpaV4j6MD1hjAO9CJut1uFhYW65557jGfHfLFz506v9aKiIklq93qVa2WxWDR8+HCtXbtWN910k95///1OPT8AAL3Ru+++qxtuuEG33nrrFet+85vf6IsvvrjqV5H97ne/06lTp4z1trY2vfzyy7rtttt08803X1ObLxYSEqLJkydr5cqVamlp0dGjRzv1/EBPwgRuQC/y6quv6m9/+5vPo+LS1xPDPP/882pqatLdd9+tffv26dlnn9XkyZN17733XnPb3nzzTW3YsEHTpk3TrbfeKo/Ho1deeUVnz57VhAkTrvn8AAD0FnPmzFFYWJjuuece2e12ff755/rP//xPvfzyy/rnf/5nfec735H09bwsmZmZeuyxx/Td735XFotF5eXlWrdune64446r/nsgMjJS999/v5555hmFhIRow4YN+tOf/tTu9WYdNXv2bAUHB2vMmDGKjo6W0+lUXl6ebDab7r777k75DKAnIowDvUhBQYFCQkL02GOP+Xxsnz599Oabb2rRokV69tlnFRwcrNmzZ+vXv/51p7QtLi5ON910k1avXq3PPvtMQUFBGjx4sLZt26YZM2Z0ymcAANAbJCcna+vWrdq+fbvOnj2rG2+8UcOHD9eOHTv05JNPGnVhYWGy2+1as2aNTp06pba2Ng0cOFCLFi3SihUrFBISclWfl56erjvuuEM/+9nP9Omnn+q2227Tzp07r/r1pt/m+9//vrZt26b//b//txoaGhQZGal7771XL774ovHDAnA9sng8Ho+/GwEAAAAAwPWEZ8YBAAAAADAZYRwAAAAAAJMRxgEAAAAAMBlhHAAAAAAAkxHGAQAAAAAwGWEcAAAAAACT9dr3jH/11Vf67LPPFBoaKovF4u/mAAAgj8ejc+fOKSYmRjfcwO/h14q+HgDQ3fjS1/faMP7ZZ58pNjbW380AAKCd2tpa3Xzzzf5uRo9HXw8A6K6upq/vtWE8NDRU0tdfQlhYmJ9bAwCA1NjYqNjYWKOPwrWhrwcAdDe+9PW9NoxfuF0tLCyMDhoA0K1wS3XnoK8HAHRXV9PX88AaAADw8t5772nq1KmKiYmRxWLRq6++auxrbW3VT3/6UyUkJCgkJEQxMTH64Q9/qM8++8zrHG63WwsXLlRkZKRC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",
"text/plain": [
"<Figure size 1200x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = df.mag\n",
"fig,axes = plt.subplots(1,2,figsize=(12,4))\n",
"for ax, bins in zip(axes, [7,35]):\n",
" ax.hist(x,bins=bins)\n",
" ax.set_title(f'{bins} bins')\n",
"# plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "f343201e-180e-42a7-ae74-d6e4716c7197",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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xsvLy5Went7jmrS0tG7zDx48qNTU1B7vTwMAgjmO/NzcXH388cfasWOHamtrtXbtWtXV1cnr9Uq6ftti5cqVXfO9Xq9Onz6t3Nxc1dbWaseOHSouLta6dev6rgsAGMQc36POyspSS0uLNm3apIaGBs2YMUNlZWVKTk6WJDU0NAQ9Uz1x4kSVlZVp7dq12rp1qxISErRlyxY9+eSTvb6m2+3Whg0berwdMhjR7+BGv4NbOPp1/Bw1AKB/8a4PALAcQQ0AliOoAcByBDUAWM6aoB5qr0510u/evXv1+OOP695771VsbKzS0tL01Vdf9WO1d87p97fT0aNHFRkZqYcffji8BfYxp/22tbWpoKBAycnJcrvduv/++7Vjx45+qvbOOe13165dmjlzpkaMGKH4+Hg9//zzamlp6adqQ3f48GEtXbpUCQkJcrlc2r9//23X9ElWGQt8/vnnJioqynz00UempqbGvPLKK2bkyJHm9OnTPc4/efKkGTFihHnllVdMTU2N+eijj0xUVJTZs2dPP1ceGqf9vvLKK+Z3v/ud+cc//mF++OEHk5+fb6Kiosy//vWvfq48NE777XT+/HkzadIkk5mZaWbOnNk/xfaBUPpdtmyZmTt3rikvLzenTp0yf//7383Ro0f7serQOe23srLSDBs2zLz//vvm5MmTprKy0kyfPt0sX768nyt3rqyszBQUFJjS0lIjyezbt++W8/sqq6wI6jlz5hiv1xs0NnXqVJOXl9fj/Ndee81MnTo1aOyFF14w8+bNC1uNfclpvz158MEHzcaNG/u6tLAItd+srCzzm9/8xmzYsOGuCmqn/X755ZfG4/GYlpaW/iivzznt95133jGTJk0KGtuyZYtJTEwMW43h0Jug7qusGvBbH52vTr3xVaihvDr1xIkTunLlSthq7Quh9Huja9euqbW1tU9f+hIuofb7ySef6KefftKGDRvCXWKfCqXfAwcOKDU1VW+//bbuu+8+PfDAA1q3bp3+97//9UfJdySUftPT03XmzBmVlZXJGKP//ve/2rNnj5544on+KLlf9VVWhfT2vL7UX69OtUUo/d7o3Xff1cWLF/X000+Ho8Q+FUq/P/74o/Ly8lRZWanIyAH/EXUklH5PnjypI0eOKCYmRvv27VNzc7NefPFFnTt3zvr71KH0m56erl27dikrK0uXL1/W1atXtWzZMv3hD3/oj5L7VV9l1YDvqDuF+9WptnHab6fdu3frzTffVElJicaOHRuu8vpcb/vt6OjQM888o40bN+qBBx7or/L6nJPv77Vr1+RyubRr1y7NmTNHS5Ys0ebNm7Vz5867YlctOeu3pqZGa9as0RtvvKGqqir99a9/1alTp7reFzTY9EVWDfh2pb9enWqLUPrtVFJSolWrVumLL77QwoULw1lmn3Hab2trq06cOCGfz6eXX35Z0vUgM8YoMjJSBw8e1KOPPtovtYcilO9vfHy87rvvvqB3rU+bNk3GGJ05c0aTJ08Oa813IpR+CwsLNX/+fL366quSpIceekgjR45URkaG3nrrLav/RexUX2XVgO+oh9qrU0PpV7q+k37uuef02Wef3VX38pz2Gxsbq2+//VbV1dVdh9fr1ZQpU1RdXa25c+f2V+khCeX7O3/+fP3yyy+6cOFC19gPP/ygYcOGKTExMaz13qlQ+r106VK3dzVHRERI6tv/vsoGfZZVjn71GCadj/cUFxebmpoak5OTY0aOHGl+/vlnY4wxeXl5ZsWKFV3zOx95Wbt2rampqTHFxcV35eN5ve33s88+M5GRkWbr1q2moaGh6zh//vxAteCI035vdLc99eG039bWVpOYmGieeuop891335mKigozefJks3r16oFqwRGn/X7yyScmMjLSbNu2zfz000/myJEjJjU11cyZM2egWui11tZW4/P5jM/nM5LM5s2bjc/n63oUMVxZZUVQG2PM1q1bTXJysomOjjazZ882FRUVXX+WnZ1tFixYEDT/0KFDZtasWSY6OtpMmDDBFBUV9XPFd8ZJvwsWLDCSuh3Z2dn9X3iInH5//393W1Ab47zf2tpas3DhQjN8+HCTmJhocnNzzaVLl/q56tA57XfLli3mwQcfNMOHDzfx8fHm2WefNWfOnOnnqp37+uuvb/l3MVxZxWtOAcByA36PGgBwawQ1AFiOoAYAyxHUAGA5ghoALEdQA4DlCGoAsBxBDQCWI6gBwHIENQBYjqAGAMsR1ABguf8D1f3Y2+n8ofoAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 300x300 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(3,3))\n",
"outside = fig.add_axes([0,0,1,1])\n",
"inside = fig.add_axes([0.2,0.6,0.2,0.2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "01a34069-53fa-470b-99a1-b2e1f50e5a12",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAqoAAAKZCAYAAABwawlpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVaZJREFUeJzt3X9wVFWe//9XJyEddKabBaQJEGJwBKOUOHQWSJispUKzwDJFlfMhFrMEGKgypQ6GDMwQs6VCWZvRHVlFSZQhgbI2MlkEXD61GaT/UAiEmR2yHcsx2dUFxgTtmEpcOkGdIOF8/+BDf6dN+NFNfpwkz0fV/eMezrn97ntv0y9Odx8cxhgjAAAAwDJxA10AAAAA0BOCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArBR1UD169KiWLFmiCRMmyOFw6O23377umCNHjsjr9SopKUlTpkzRa6+9FkutwLDB6wwAgBiC6pdffqkZM2bo1VdfvaH+Z86c0aJFi5Sdna1AIKCnnnpK69at0759+6IuFhgueJ0BACA5jDEm5sEOhw4cOKClS5detc8vfvELHTx4UA0NDeG2vLw8vf/++zpx4kSsDw0MG7zOAADDVUJfP8CJEyfk8/ki2hYsWKCysjJ98803GjFiRLcxnZ2d6uzsDO9funRJX3zxhcaMGSOHw9HXJQP9whijjo4OTZgwQXFxN/d18VheZxKvNQBA7+nN97Ur+jyoNjc3y+PxRLR5PB5dvHhRra2tSk5O7jamuLhYmzdv7uvSACs0NTVp0qRJN3WMWF5nEq81AEDv6433tSv6PKhK6jYzc+XbBlebsSksLFRBQUF4PxQKafLkyWpqapLL5eq7QoF+1N7erpSUFH33u9/tleNF+zqTeK0BAHpPb7+vSf0QVMePH6/m5uaItpaWFiUkJGjMmDE9jnE6nXI6nd3aXS4Xb54YcnrjI/ZYXmcSrzUAQO/rza+O9fk6qpmZmfL7/RFthw8fVkZGxlW/NwcgOrzOAABDUdRB9fz586qrq1NdXZ2ky8vi1NXVqbGxUdLljxJzc3PD/fPy8vTJJ5+ooKBADQ0NKi8vV1lZmTZs2NA7zwAYgnidAQAQw0f/J0+e1AMPPBDev/L9tpUrV2r37t0KBoPhN1NJSktLU1VVldavX6/t27drwoQJ2rZtmx5++OFeKB8YmnidAQBwk+uo9pf29na53W6FQiG+N4chw8b72saaAACDQ1+8h/T5d1QBAACAWBBUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAK8UUVEtKSpSWlqakpCR5vV5VV1dfs39FRYVmzJihW265RcnJyVq9erXa2tpiKhgAAADDQ9RBtbKyUvn5+SoqKlIgEFB2drYWLlyoxsbGHvsfO3ZMubm5WrNmjT788EPt3btXf/jDH7R27dqbLh4AAABDV9RBdevWrVqzZo3Wrl2r9PR0vfTSS0pJSVFpaWmP/X/3u9/p9ttv17p165SWlqYf/OAHevTRR3Xy5MmbLh4AAABDV1RB9cKFC6qtrZXP54to9/l8qqmp6XFMVlaWzp49q6qqKhlj9Pnnn+utt97S4sWLY68aAAAAQ15UQbW1tVVdXV3yeDwR7R6PR83NzT2OycrKUkVFhXJycpSYmKjx48dr1KhReuWVV676OJ2dnWpvb4/YAAAAMLzE9GMqh8MRsW+M6dZ2RX19vdatW6enn35atbW1OnTokM6cOaO8vLyrHr+4uFhutzu8paSkxFImAAAABrGogurYsWMVHx/fbfa0paWl2yzrFcXFxZo7d642btyoe++9VwsWLFBJSYnKy8sVDAZ7HFNYWKhQKBTempqaoikTAAAAQ0BUQTUxMVFer1d+vz+i3e/3Kysrq8cxX331leLiIh8mPj5e0uWZ2J44nU65XK6IDQAAAMNL1B/9FxQUaOfOnSovL1dDQ4PWr1+vxsbG8Ef5hYWFys3NDfdfsmSJ9u/fr9LSUp0+fVrHjx/XunXrNGvWLE2YMKH3ngkAAACGlIRoB+Tk5KitrU1btmxRMBjU9OnTVVVVpdTUVElSMBiMWFN11apV6ujo0Kuvvqqf/exnGjVqlB588EE9//zzvfcsAAAAMOQ4zNU+f7dIe3u73G63QqEQXwPAkGHjfW1jTQCAwaEv3kNi+tU/AAAA0NcIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJViCqolJSVKS0tTUlKSvF6vqqurr9m/s7NTRUVFSk1NldPp1B133KHy8vKYCgYAAMDwkBDtgMrKSuXn56ukpERz587V66+/roULF6q+vl6TJ0/uccyyZcv0+eefq6ysTN/73vfU0tKiixcv3nTxAAAAGLocxhgTzYDZs2dr5syZKi0tDbelp6dr6dKlKi4u7tb/0KFDeuSRR3T69GmNHj06piLb29vldrsVCoXkcrliOgZgGxvvaxtrAgAMDn3xHhLVR/8XLlxQbW2tfD5fRLvP51NNTU2PYw4ePKiMjAy98MILmjhxoqZOnaoNGzbo66+/jr1qAAAADHlRffTf2tqqrq4ueTyeiHaPx6Pm5uYex5w+fVrHjh1TUlKSDhw4oNbWVj322GP64osvrvo91c7OTnV2dob329vboykTAAAAQ0BMP6ZyOBwR+8aYbm1XXLp0SQ6HQxUVFZo1a5YWLVqkrVu3avfu3VedVS0uLpbb7Q5vKSkpsZQJAACAQSyqoDp27FjFx8d3mz1taWnpNst6RXJysiZOnCi32x1uS09PlzFGZ8+e7XFMYWGhQqFQeGtqaoqmTAAAAAwBUQXVxMREeb1e+f3+iHa/36+srKwex8ydO1efffaZzp8/H2776KOPFBcXp0mTJvU4xul0yuVyRWwAAAAYXqL+6L+goEA7d+5UeXm5GhoatH79ejU2NiovL0/S5dnQ3NzccP/ly5drzJgxWr16terr63X06FFt3LhRP/nJTzRy5MjeeybAEBTtmsUVFRWaMWOGbrnlFiUnJ2v16tVqa2vrp2oBAOhdUQfVnJwcvfTSS9qyZYvuu+8+HT16VFVVVUpNTZUkBYNBNTY2hvt/5zvfkd/v17lz55SRkaEf//jHWrJkibZt29Z7zwIYgq6sWVxUVKRAIKDs7GwtXLgw4vX1l44dO6bc3FytWbNGH374ofbu3as//OEPWrt2bT9XDgBA74h6HdWBwNqOGIqud19Hu2bxr371K5WWlurUqVPhtldeeUUvvPDCDX/Pm9caACBWA76OKoD+EcuaxVlZWTp79qyqqqpkjNHnn3+ut956S4sXL77q43R2dqq9vT1iAwDAFgRVwEKxrFmclZWliooK5eTkKDExUePHj9eoUaP0yiuvXPVxWAoOAGAzgipgsWjWLK6vr9e6dev09NNPq7a2VocOHdKZM2fCP3TsCUvBAQBsFtX/TAWgf8SyZnFxcbHmzp2rjRs3SpLuvfde3XrrrcrOztZzzz2n5OTkbmOcTqecTmfvPwEAAHoBM6qAhWJZs/irr75SXFzkSzo+Pl7S5ZlYAAAGG4IqYKlo1yxesmSJ9u/fr9LSUp0+fVrHjx/XunXrNGvWLE2YMGGgngYAADHjo3/AUjk5OWpra9OWLVsUDAY1ffr0a65ZvGrVKnV0dOjVV1/Vz372M40aNUoPPvignn/++YF6CgAA3BTWUQUGiI33tY01AQAGB9ZRBQAAwLBBUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlWIKqiUlJUpLS1NSUpK8Xq+qq6tvaNzx48eVkJCg++67L5aHBQAAwDASdVCtrKxUfn6+ioqKFAgElJ2drYULF6qxsfGa40KhkHJzc/XQQw/FXCwAAACGj6iD6tatW7VmzRqtXbtW6enpeumll5SSkqLS0tJrjnv00Ue1fPlyZWZmxlwsAAAAho+oguqFCxdUW1srn88X0e7z+VRTU3PVcbt27dKpU6f0zDPP3NDjdHZ2qr29PWIDAADA8BJVUG1tbVVXV5c8Hk9Eu8fjUXNzc49jPv74Y23atEkVFRVKSEi4occpLi6W2+0ObykpKdGUCQAAgCEgph9TORyOiH1jTLc2Serq6tLy5cu1efNmTZ069YaPX1hYqFAoFN6amppiKRMAAACD2I1Ncf4/Y8eOVXx8fLfZ05aWlm6zrJLU0dGhkydPKhAI6IknnpAkXbp0ScYYJSQk6PDhw3rwwQe7jXM6nXI6ndGUBgAAgCEmqhnVxMREeb1e+f3+iHa/36+srKxu/V0ulz744APV1dWFt7y8PE2bNk11dXWaPXv2zVUPAACAISuqGVVJKigo0IoVK5SRkaHMzEzt2LFDjY2NysvLk3T5Y/tPP/1Ub7zxhuLi4jR9+vSI8ePGjVNSUlK3dgAAAOAvRR1Uc3Jy1NbWpi1btigYDGr69OmqqqpSamqqJCkYDF53TVUAAADgehzGGDPQRVxPe3u73G63QqGQXC7XQJcD9Aob72sbawIADA598R4S06/+AQAAgL5GUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKwUU1AtKSlRWlqakpKS5PV6VV1dfdW++/fv1/z583XbbbfJ5XIpMzNT77zzTswFAwAAYHiIOqhWVlYqPz9fRUVFCgQCys7O1sKFC9XY2Nhj/6NHj2r+/PmqqqpSbW2tHnjgAS1ZskSBQOCmiwcAAMDQ5TDGmGgGzJ49WzNnzlRpaWm4LT09XUuXLlVxcfENHeOee+5RTk6Onn766Rvq397eLrfbrVAoJJfLFU25gLVsvK9trAkAMDj0xXtIVDOqFy5cUG1trXw+X0S7z+dTTU3NDR3j0qVL6ujo0OjRo6/ap7OzU+3t7REbAAAAhpeogmpra6u6urrk8Xgi2j0ej5qbm2/oGC+++KK+/PJLLVu27Kp9iouL5Xa7w1tKSko0ZQIAAGAIiOnHVA6HI2LfGNOtrSd79uzRs88+q8rKSo0bN+6q/QoLCxUKhcJbU1NTLGUCAABgEEuIpvPYsWMVHx/fbfa0paWl2yzrt1VWVmrNmjXau3ev5s2bd82+TqdTTqczmtIAAAAwxEQ1o5qYmCiv1yu/3x/R7vf7lZWVddVxe/bs0apVq/Tmm29q8eLFsVUKAACAYSWqGVVJKigo0IoVK5SRkaHMzEzt2LFDjY2NysvLk3T5Y/tPP/1Ub7zxhqTLITU3N1cvv/yy5syZE56NHTlypNxudy8+FQAAAAwlUQfVnJwctbW1acuWLQoGg5o+fbqqqqqUmpoqSQoGgxFrqr7++uu6ePGiHn/8cT3++OPh9pUrV2r37t03/wwAAAAwJEW9jupAYG1HDEU23tc21gQAGBwGfB1VAAAAoL8QVAEAAGAlgioAAACsRFAFLFZSUqK0tDQlJSXJ6/Wqurr6mv07OztVVFSk1NRUOZ1O3XHHHSovL++nagEA6F1R/+ofQP+orKxUfn6+SkpKNHfuXL3++utauHCh6uvrNXny5B7HLFu2TJ9//rnKysr0ve99Ty0tLbp48WI/Vw4AQO/gV//AALnefT179mzNnDlTpaWl4bb09HQtXbpUxcXF3fofOnRIjzzyiE6fPq3Ro0f3SU0AAFwNv/oHhokLFy6otrZWPp8vot3n86mmpqbHMQcPHlRGRoZeeOEFTZw4UVOnTtWGDRv09ddf90fJAAD0Oj76ByzU2tqqrq4ueTyeiHaPxxP+392+7fTp0zp27JiSkpJ04MABtba26rHHHtMXX3xx1e+pdnZ2qrOzM7zf3t7ee08CAICbxIwqYDGHwxGxb4zp1nbFpUuX5HA4VFFRoVmzZmnRokXaunWrdu/efdVZ1eLiYrnd7vCWkpLS688BAIBYEVQBC40dO1bx8fHdZk9bWlq6zbJekZycrIkTJ8rtdofb0tPTZYzR2bNnexxTWFioUCgU3pqamnrvSQAAcJMIqoCFEhMT5fV65ff7I9r9fr+ysrJ6HDN37lx99tlnOn/+fLjto48+UlxcnCZNmtTjGKfTKZfLFbEBAGALgipgqYKCAu3cuVPl5eVqaGjQ+vXr1djYqLy8PEmXZ0Nzc3PD/ZcvX64xY8Zo9erVqq+v19GjR7Vx40b95Cc/0ciRIwfqaQAAEDN+TAVYKicnR21tbdqyZYuCwaCmT5+uqqoqpaamSpKCwaAaGxvD/b/zne/I7/frpz/9qTIyMjRmzBgtW7ZMzz333EA9BQAAbgrrqAIDxMb72saaAACDA+uoAgAAYNggqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFgppqBaUlKitLQ0JSUlyev1qrq6+pr9jxw5Iq/Xq6SkJE2ZMkWvvfZaTMUCAABg+Ig6qFZWVio/P19FRUUKBALKzs7WwoUL1djY2GP/M2fOaNGiRcrOzlYgENBTTz2ldevWad++fTddPAAAAIYuhzHGRDNg9uzZmjlzpkpLS8Nt6enpWrp0qYqLi7v1/8UvfqGDBw+qoaEh3JaXl6f3339fJ06cuKHHbG9vl9vtVigUksvliqZcwFo23tc21gQAGBz64j0kIZrOFy5cUG1trTZt2hTR7vP5VFNT0+OYEydOyOfzRbQtWLBAZWVl+uabbzRixIhuYzo7O9XZ2RneD4VCki6fAGCouHI/R/lvRQAAho2ogmpra6u6urrk8Xgi2j0ej5qbm3sc09zc3GP/ixcvqrW1VcnJyd3GFBcXa/Pmzd3aU1JSoikXGBTa2trkdrsHugwAAKwTVVC9wuFwROwbY7q1Xa9/T+1XFBYWqqCgILx/7tw5paamqrGxcdC8obe3tyslJUVNTU2D6iNU6u4/oVBIkydP1ujRowe6FAAArBRVUB07dqzi4+O7zZ62tLR0mzW9Yvz48T32T0hI0JgxY3oc43Q65XQ6u7W73e5BE0KucLlcg65mibr7U1wcq8QBANCTqN4hExMT5fV65ff7I9r9fr+ysrJ6HJOZmdmt/+HDh5WRkdHj91MBAAAAKYblqQoKCrRz506Vl5eroaFB69evV2Njo/Ly8iRd/tg+Nzc33D8vL0+ffPKJCgoK1NDQoPLycpWVlWnDhg299ywAAAAw5ET9HdWcnBy1tbVpy5YtCgaDmj59uqqqqpSamipJCgaDEWuqpqWlqaqqSuvXr9f27ds1YcIEbdu2TQ8//PANP6bT6dQzzzzT49cBbDUYa5aouz8NxpoBAOhPUa+jCmDoYh1VAECs+uI9hF9xAAAAwEoEVQAAAFiJoAoAAAArEVQBAABgpQEJqiUlJUpLS1NSUpK8Xq+qq6uv2f/IkSPyer1KSkrSlClT9Nprr3Xrs2/fPt19991yOp26++67deDAgQGte//+/Zo/f75uu+02uVwuZWZm6p133onos3v3bjkcjm7bn//85wGp+b333uuxnv/6r/+K6GfbuV61alWPdd9zzz3hPn19ro8ePaolS5ZowoQJcjgcevvtt687xpb7GgAAW/V7UK2srFR+fr6KiooUCASUnZ2thQsXRixp9ZfOnDmjRYsWKTs7W4FAQE899ZTWrVunffv2hfucOHFCOTk5WrFihd5//32tWLFCy5Yt0+9///sBq/vo0aOaP3++qqqqVFtbqwceeEBLlixRIBCI6OdyuRQMBiO2pKSkAan5iv/+7/+OqOfOO+8M/5mN5/rll1+OqLepqUmjR4/W//k//yeiX1+e6y+//FIzZszQq6++ekP9bbmvAQCwmulns2bNMnl5eRFtd911l9m0aVOP/X/+85+bu+66K6Lt0UcfNXPmzAnvL1u2zPzt3/5tRJ8FCxaYRx55pJeqjr7untx9991m8+bN4f1du3YZt9vdWyV2E23N7777rpFk/vd///eqxxwM5/rAgQPG4XCYP/3pT+G2vj7Xf0mSOXDgwDX72HJff1soFDKSTCgU6rPHAAAMTX3xHtKvM6oXLlxQbW2tfD5fRLvP51NNTU2PY06cONGt/4IFC3Ty5El988031+xztWP2R93fdunSJXV0dGj06NER7efPn1dqaqomTZqkv/u7v+s24zoQNX//+99XcnKyHnroIb377rsRfzYYznVZWZnmzZsX/k8oruircx0LG+5rAABs169BtbW1VV1dXfJ4PBHtHo9Hzc3NPY5pbm7usf/FixfV2tp6zT5XO2Z/1P1tL774or788kstW7Ys3HbXXXdp9+7dOnjwoPbs2aOkpCTNnTtXH3/88YDUnJycrB07dmjfvn3av3+/pk2bpoceekhHjx4N97H9XAeDQf32t7/V2rVrI9r78lzHwob7GgAA20X9X6j2BofDEbFvjOnWdr3+326P9pixiPUx9uzZo2effVb/9m//pnHjxoXb58yZozlz5oT3586dq5kzZ+qVV17Rtm3b+r3madOmadq0aeH9zMxMNTU16Ve/+pX+5m/+JqZjxirWx9i9e7dGjRqlpUuXRrT3x7mOli33NQAAturXGdWxY8cqPj6+24xQS0tLt5mjK8aPH99j/4SEBI0ZM+aafa52zP6o+4rKykqtWbNG//qv/6p58+Zds29cXJz++q//uldm+W6m5r80Z86ciHpsPtfGGJWXl2vFihVKTEy8Zt/ePNexsOG+BgDAdv0aVBMTE+X1euX3+yPa/X6/srKyehyTmZnZrf/hw4eVkZGhESNGXLPP1Y7ZH3VLl2dSV61apTfffFOLFy++7uMYY1RXV6fk5OQBq/nbAoFARD22nmvp8nJP//M//6M1a9Zc93F681zHwob7GgAA6/Xaz7Ju0G9+8xszYsQIU1ZWZurr601+fr659dZbw7/Q3rRpk1mxYkW4/+nTp80tt9xi1q9fb+rr601ZWZkZMWKEeeutt8J9jh8/buLj480vf/lL09DQYH75y1+ahIQE87vf/W7A6n7zzTdNQkKC2b59uwkGg+Ht3Llz4T7PPvusOXTokDl16pQJBAJm9erVJiEhwfz+978fkJr/+Z//2Rw4cMB89NFH5o9//KPZtGmTkWT27dsX7mPjub7i7//+783s2bN7PGZfn+uOjg4TCARMIBAwkszWrVtNIBAwn3zySY8123Jffxu/+gcAxKov3kP6PagaY8z27dtNamqqSUxMNDNnzjRHjhwJ/9nKlSvN/fffH9H/vffeM9///vdNYmKiuf32201paWm3Y+7du9dMmzbNjBgxwtx1110R4Wog6r7//vuNpG7bypUrw33y8/PN5MmTTWJiorntttuMz+czNTU1A1bz888/b+644w6TlJRk/uqv/sr84Ac/MP/+7//e7Zi2nWtjjDl37pwZOXKk2bFjR4/H6+tzfWVpr6tdb5vv679EUAUAxKov3kMcxvy/X3AAGPba29vldrsVCoXkcrkGuhwAwCDSF+8hA/JfqAIAAADXQ1AFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVog6qR48e1ZIlSzRhwgQ5HA69/fbb1x1z5MgReb1eJSUlacqUKXrttddiqRUAAADDSNRB9csvv9SMGTP06quv3lD/M2fOaNGiRcrOzlYgENBTTz2ldevWad++fVEXCwAAgOEjIdoBCxcu1MKFC2+4/2uvvabJkyfrpZdekiSlp6fr5MmT+tWvfqWHH3442ocHAADAMNHn31E9ceKEfD5fRNuCBQt08uRJffPNN3398AAAABikop5RjVZzc7M8Hk9Em8fj0cWLF9Xa2qrk5ORuYzo7O9XZ2Rnev3Tpkr744guNGTNGDoejr0sG+oUxRh0dHZowYYLi4vhdIwAA39bnQVVSt3BpjOmx/Yri4mJt3ry5z+sCbNDU1KRJkyYNdBkAAFinz4Pq+PHj1dzcHNHW0tKihIQEjRkzpscxhYWFKigoCO+HQiFNnjxZTU1NcrlcfVov0F/a29uVkpKi7373uwNdCgAAVurzoJqZman/+3//b0Tb4cOHlZGRoREjRvQ4xul0yul0dmt3uVwEVQw5fJ0FAICeRf3FuPPnz6uurk51dXWSLi8/VVdXp8bGRkmXZ0Nzc3PD/fPy8vTJJ5+ooKBADQ0NKi8vV1lZmTZs2NA7zwAAAABDUtQzqidPntQDDzwQ3r/yEf3KlSu1e/duBYPBcGiVpLS0NFVVVWn9+vXavn27JkyYoG3btrE0FQAAAK7JYa78ssli7e3tcrvdCoVCfPSPIcPG+9rGmgAAg0NfvIewJg4AAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVsFhJSYnS0tKUlJQkr9er6urqGxp3/PhxJSQk6L777uvbAgEA6EMEVcBSlZWVys/PV1FRkQKBgLKzs7Vw4UI1NjZec1woFFJubq4eeuihfqoUAIC+QVAFLLV161atWbNGa9euVXp6ul566SWlpKSotLT0muMeffRRLV++XJmZmf1UKQAAfYOgCljowoULqq2tlc/ni2j3+Xyqqam56rhdu3bp1KlTeuaZZ27ocTo7O9Xe3h6xAQBgC4IqYKHW1lZ1dXXJ4/FEtHs8HjU3N/c45uOPP9amTZtUUVGhhISEG3qc4uJiud3u8JaSknLTtQMA0FsIqoDFHA5HxL4xplubJHV1dWn58uXavHmzpk6desPHLywsVCgUCm9NTU03XTMAAL3lxqZdAPSrsWPHKj4+vtvsaUtLS7dZVknq6OjQyZMnFQgE9MQTT0iSLl26JGOMEhISdPjwYT344IPdxjmdTjmdzr55EgAA3CRmVAELJSYmyuv1yu/3R7T7/X5lZWV16+9yufTBBx+orq4uvOXl5WnatGmqq6vT7Nmz+6t0AAB6DTOqgKUKCgq0YsUKZWRkKDMzUzt27FBjY6Py8vIkXf7Y/tNPP9Ubb7yhuLg4TZ8+PWL8uHHjlJSU1K0dAIDBgqAKWConJ0dtbW3asmWLgsGgpk+frqqqKqWmpkqSgsHgdddUBQBgMHMYY8xAF3E97e3tcrvdCoVCcrlcA10O0CtsvK9trAkAMDj0xXsI31EFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKMQXVkpISpaWlKSkpSV6vV9XV1dfsX1FRoRkzZuiWW25RcnKyVq9erba2tpgKBgAAwPAQdVCtrKxUfn6+ioqKFAgElJ2drYULF151mZxjx44pNzdXa9as0Ycffqi9e/fqD3/4g9auXXvTxQMAAGDoijqobt26VWvWrNHatWuVnp6ul156SSkpKSotLe2x/+9+9zvdfvvtWrdundLS0vSDH/xAjz76qE6ePHnTxQMAAGDoiiqoXrhwQbW1tfL5fBHtPp9PNTU1PY7JysrS2bNnVVVVJWOMPv/8c7311ltavHjxVR+ns7NT7e3tERsAAACGl6iCamtrq7q6uuTxeCLaPR6PmpubexyTlZWliooK5eTkKDExUePHj9eoUaP0yiuvXPVxiouL5Xa7w1tKSko0ZQIAAGAIiOnHVA6HI2LfGNOt7Yr6+nqtW7dOTz/9tGpra3Xo0CGdOXMm/P+V96SwsFChUCi8NTU1xVImAAAABrGEaDqPHTtW8fHx3WZPW1paus2yXlFcXKy5c+dq48aNkqR7771Xt956q7Kzs/Xcc88pOTm52xin0ymn0xlNaQAAABhioppRTUxMlNfrld/vj2j3+/3KysrqccxXX32luLjIh4mPj5d0eSYWAAAA6EnUH/0XFBRo586dKi8vV0NDg9avX6/GxsbwR/mFhYXKzc0N91+yZIn279+v0tJSnT59WsePH9e6des0a9YsTZgwofeeCQAAAIaUqD76l6ScnBy1tbVpy5YtCgaDmj59uqqqqpSamipJCgaDEWuqrlq1Sh0dHXr11Vf1s5/9TKNGjdKDDz6o559/vveeBQAAAIYchxkEn7+3t7fL7XYrFArJ5XINdDlAr7DxvraxJgDA4NAX7yEx/eofAAAA6GsEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoxBdWSkhKlpaUpKSlJXq9X1dXV1+zf2dmpoqIipaamyul06o477lB5eXlMBQMAAGB4SIh2QGVlpfLz81VSUqK5c+fq9ddf18KFC1VfX6/Jkyf3OGbZsmX6/PPPVVZWpu9973tqaWnRxYsXb7p4AAAADF0OY4yJZsDs2bM1c+ZMlZaWhtvS09O1dOlSFRcXd+t/6NAhPfLIIzp9+rRGjx4dU5Ht7e1yu90KhUJyuVwxHQOwjY33tY01AQAGh754D4nqo/8LFy6otrZWPp8vot3n86mmpqbHMQcPHlRGRoZeeOEFTZw4UVOnTtWGDRv09ddfX/VxOjs71d7eHrEBAABgeInqo//W1lZ1dXXJ4/FEtHs8HjU3N/c45vTp0zp27JiSkpJ04MABtba26rHHHtMXX3xx1e+pFhcXa/PmzdGUBgAAgCEmph9TORyOiH1jTLe2Ky5duiSHw6GKigrNmjVLixYt0tatW7V79+6rzqoWFhYqFAqFt6ampljKBAAAwCAW1Yzq2LFjFR8f3232tKWlpdss6xXJycmaOHGi3G53uC09PV3GGJ09e1Z33nlntzFOp1NOpzOa0gAAADDERDWjmpiYKK/XK7/fH9Hu9/uVlZXV45i5c+fqs88+0/nz58NtH330keLi4jRp0qQYSgYAAMBwEPVH/wUFBdq5c6fKy8vV0NCg9evXq7GxUXl5eZIuf2yfm5sb7r98+XKNGTNGq1evVn19vY4ePaqNGzfqJz/5iUaOHNl7zwQAAABDStTrqObk5KitrU1btmxRMBjU9OnTVVVVpdTUVElSMBhUY2NjuP93vvMd+f1+/fSnP1VGRobGjBmjZcuW6bnnnuu9ZwEAAIAhJ+p1VAcCaztiKLLxvraxJgDA4DDg66gCAAAA/YWgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBi5WUlCgtLU1JSUnyer2qrq6+at/9+/dr/vz5uu222+RyuZSZmal33nmnH6sFAKB3EVQBS1VWVio/P19FRUUKBALKzs7WwoUL1djY2GP/o0ePav78+aqqqlJtba0eeOABLVmyRIFAoJ8rBwCgdziMMWagi7ie9vZ2ud1uhUIhuVyugS4H6BXXu69nz56tmTNnqrS0NNyWnp6upUuXqri4+IYe45577lFOTo6efvrpXqkJAICr6Yv3EGZUAQtduHBBtbW18vl8Ee0+n081NTU3dIxLly6po6NDo0ePvmqfzs5Otbe3R2wAANiCoApYqLW1VV1dXfJ4PBHtHo9Hzc3NN3SMF198UV9++aWWLVt21T7FxcVyu93hLSUl5abqBgCgNxFUAYs5HI6IfWNMt7ae7NmzR88++6wqKys1bty4q/YrLCxUKBQKb01NTTddMwAAvSVhoAsA0N3YsWMVHx/fbfa0paWl2yzrt1VWVmrNmjXau3ev5s2bd82+TqdTTqfzpusFAKAvxDSjGs2SOX/p+PHjSkhI0H333RfLwwLDRmJiorxer/x+f0S73+9XVlbWVcft2bNHq1at0ptvvqnFixf3dZkAAPSpqINqtEvmXBEKhZSbm6uHHnoo5mKB4aSgoEA7d+5UeXm5GhoatH79ejU2NiovL0/S5Y/tc3Nzw/337Nmj3Nxcvfjii5ozZ46am5vV3NysUCg0UE8BAICbEnVQ3bp1q9asWaO1a9cqPT1dL730klJSUiKW0OnJo48+quXLlyszMzPmYoHhJCcnRy+99JK2bNmi++67T0ePHlVVVZVSU1MlScFgMOIfiK+//rouXryoxx9/XMnJyeHtySefHKinAADATYnqO6pXlszZtGlTRPv1lszZtWuXTp06pX/5l3/Rc889d93H6ezsVGdnZ3ifJXMwXD322GN67LHHevyz3bt3R+y/9957fV8QAAD9KKoZ1ViWzPn444+1adMmVVRUKCHhxnIxS+YAAAAgph9T3eiSOV1dXVq+fLk2b96sqVOn3vDxWTIHAAAAUX30H+2SOR0dHTp58qQCgYCeeOIJSZf/txxjjBISEnT48GE9+OCD3caxZA4AAACimlGNdskcl8ulDz74QHV1deEtLy9P06ZNU11dnWbPnn1z1QMAAGDIinrB/4KCAq1YsUIZGRnKzMzUjh07ui2Z8+mnn+qNN95QXFycpk+fHjF+3LhxSkpK6tYOAAAA/KWog2pOTo7a2tq0ZcsWBYNBTZ8+/ZpL5gAAAACxcBhjzEAXcT3t7e1yu90KhUJyuVwDXQ7QK2y8r22sCQAwOPTFe0hMv/oHAAAA+hpBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsFJMQbWkpERpaWlKSkqS1+tVdXX1Vfvu379f8+fP12233SaXy6XMzEy98847MRcMAACA4SHqoFpZWan8/HwVFRUpEAgoOztbCxcuVGNjY4/9jx49qvnz56uqqkq1tbV64IEHtGTJEgUCgZsuHgAAAEOXwxhjohkwe/ZszZw5U6WlpeG29PR0LV26VMXFxTd0jHvuuUc5OTl6+umnb6h/e3u73G63QqGQXC5XNOUC1rLxvraxJgDA4NAX7yFRzaheuHBBtbW18vl8Ee0+n081NTU3dIxLly6po6NDo0ePjuahAQAAMMwkRNO5tbVVXV1d8ng8Ee0ej0fNzc03dIwXX3xRX375pZYtW3bVPp2dners7Azvt7e3R1MmAAAAhoCYfkzlcDgi9o0x3dp6smfPHj377LOqrKzUuHHjrtqvuLhYbrc7vKWkpMRSJgAAAAaxqILq2LFjFR8f3232tKWlpdss67dVVlZqzZo1+td//VfNmzfvmn0LCwsVCoXCW1NTUzRlAgAAYAiIKqgmJibK6/XK7/dHtPv9fmVlZV113J49e7Rq1Sq9+eabWrx48XUfx+l0yuVyRWwAAAAYXqL6jqokFRQUaMWKFcrIyFBmZqZ27NihxsZG5eXlSbo8G/rpp5/qjTfekHQ5pObm5urll1/WnDlzwrOxI0eOlNvt7sWnAgAAgKEk6qCak5OjtrY2bdmyRcFgUNOnT1dVVZVSU1MlScFgMGJN1ddff10XL17U448/rscffzzcvnLlSu3evfvmnwEAAACGpKjXUR0IrO2IocjG+9rGmgAAg8OAr6MKAAAA9BeCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKwUU1AtKSlRWlqakpKS5PV6VV1dfc3+R44ckdfrVVJSkqZMmaLXXnstpmKB4YbXGgBgOIs6qFZWVio/P19FRUUKBALKzs7WwoUL1djY2GP/M2fOaNGiRcrOzlYgENBTTz2ldevWad++fTddPDCU8VoDAAx3DmOMiWbA7NmzNXPmTJWWlobb0tPTtXTpUhUXF3fr/4tf/EIHDx5UQ0NDuC0vL0/vv/++Tpw4cUOP2d7eLrfbrVAoJJfLFU25gLWud1/zWgMADCZ98R6SEE3nCxcuqLa2Vps2bYpo9/l8qqmp6XHMiRMn5PP5ItoWLFigsrIyffPNNxoxYkS3MZ2dners7Azvh0IhSZdPADBUXLmfe/q3Iq81AMBgc633tVhFFVRbW1vV1dUlj8cT0e7xeNTc3NzjmObm5h77X7x4Ua2trUpOTu42pri4WJs3b+7WnpKSEk25wKDQ1tYmt9sd0cZrDQAwWPX0vharqILqFQ6HI2LfGNOt7Xr9e2q/orCwUAUFBeH9c+fOKTU1VY2Njb32xPtae3u7UlJS1NTUNKg+QqXu/hMKhTR58mSNHj36qn14rQ0ug/E+tAnn7+Zw/m4e5/Dm3Mj7WrSiCqpjx45VfHx8txmdlpaWbjM5V4wfP77H/gkJCRozZkyPY5xOp5xOZ7d2t9s96G4cl8s16GqWqLs/xcV1/00jr7XBbTDehzbh/N0czt/N4xzenJ7e12I+VjSdExMT5fV65ff7I9r9fr+ysrJ6HJOZmdmt/+HDh5WRkdHjd+YA8FoDAECKYXmqgoIC7dy5U+Xl5WpoaND69evV2NiovLw8SZc/SszNzQ33z8vL0yeffKKCggI1NDSovLxcZWVl2rBhQ+89C2AI4rUGABjuov6Oak5Ojtra2rRlyxYFg0FNnz5dVVVVSk1NlSQFg8GIdR7T0tJUVVWl9evXa/v27ZowYYK2bdumhx9++IYf0+l06plnnunxI0pbDcaaJeruT9ermdfa4MP5uzmcv5vD+bt5nMOb0xfnL+p1VAEAAID+0HvfdgUAAAB6EUEVAAAAViKoAgAAwEoEVQAAAFhpQIJqSUmJ0tLSlJSUJK/Xq+rq6mv2P3LkiLxer5KSkjRlyhS99tpr3frs27dPd999t5xOp+6++24dOHBgQOvev3+/5s+fr9tuu00ul0uZmZl65513Ivrs3r1bDoej2/bnP/95QGp+7733eqznv/7rvyL62XauV61a1WPd99xzT7hPX5/ro0ePasmSJZowYYIcDofefvvt644ZiPu6L157w01v/z0w3ER7D15x/PhxJSQk6L777uvbAi0X7fnr7OxUUVGRUlNT5XQ6dccdd6i8vLyfqrVPtOevoqJCM2bM0C233KLk5GStXr1abW1t/VStXfrqfe66TD/7zW9+Y0aMGGF+/etfm/r6evPkk0+aW2+91XzyySc99j99+rS55ZZbzJNPPmnq6+vNr3/9azNixAjz1ltvhfvU1NSY+Ph484//+I+moaHB/OM//qNJSEgwv/vd7was7ieffNI8//zz5j/+4z/MRx99ZAoLC82IESPMf/7nf4b77Nq1y7hcLhMMBiO2gar53XffNZLMf//3f0fUc/HixXAfG8/1uXPnIuptamoyo0ePNs8880y4T1+f66qqKlNUVGT27dtnJJkDBw5cs/9A3Nd98dobbvri74HhJNrzd8W5c+fMlClTjM/nMzNmzOifYi0Uy/n74Q9/aGbPnm38fr85c+aM+f3vf2+OHz/ej1XbI9rzV11dbeLi4szLL79sTp8+baqrq80999xjli5d2s+V26Ev3uduRL8H1VmzZpm8vLyItrvuusts2rSpx/4///nPzV133RXR9uijj5o5c+aE95ctW2b+9m//NqLPggULzCOPPNJLVUdfd0/uvvtus3nz5vD+rl27jNvt7q0Su4m25itB9X//93+veszBcK4PHDhgHA6H+dOf/hRu6+tz/Zdu5AU8EPd1X7z2hpu++HtgOIn1/OXk5Jh/+Id/MM8888ywDqrRnr/f/va3xu12m7a2tv4oz3rRnr9/+qd/MlOmTIlo27Ztm5k0aVKf1ThY9Nb73I3o14/+L1y4oNraWvl8voh2n8+nmpqaHsecOHGiW/8FCxbo5MmT+uabb67Z52rH7I+6v+3SpUvq6OjQ6NGjI9rPnz+v1NRUTZo0SX/3d3+nQCAw4DV///vfV3Jysh566CG9++67EX82GM51WVmZ5s2bF14Y/4q+Otex6O/7uq9ee8NJX/49MBzEev527dqlU6dO6ZlnnunrEq0Wy/k7ePCgMjIy9MILL2jixImaOnWqNmzYoK+//ro/SrZKLOcvKytLZ8+eVVVVlYwx+vzzz/XWW29p8eLF/VHyoNdb7yH9GlRbW1vV1dUlj8cT0e7xeNTc3NzjmObm5h77X7x4Ua2trdfsc7Vj9kfd3/biiy/qyy+/1LJly8Jtd911l3bv3q2DBw9qz549SkpK0ty5c/Xxxx8PSM3JycnasWOH9u3bp/3792vatGl66KGHdPTo0XAf2891MBjUb3/7W61duzaivS/PdSz6+77uq9fecNJXfw8MF7Gcv48//libNm1SRUWFEhKi/o8Uh5RYzt/p06d17Ngx/fGPf9SBAwf00ksv6a233tLjjz/eHyVbJZbzl5WVpYqKCuXk5CgxMVHjx4/XqFGj9Morr/RHyYNeb72HDMgr3+FwROwbY7q1Xa//t9ujPWYsYn2MPXv26Nlnn9W//du/ady4ceH2OXPmaM6cOeH9uXPnaubMmXrllVe0bdu2fq952rRpmjZtWng/MzNTTU1N+tWvfqW/+Zu/iemYsYr1MXbv3q1Ro0Zp6dKlEe39ca6jNRD3dV+89oab3v57YLi50fPX1dWl5cuXa/PmzZo6dWp/lWe9aO6/S5cuyeFwqKKiQm63W5K0detW/ehHP9L27ds1cuTIPq/XNtGcv/r6eq1bt05PP/20FixYoGAwqI0bNyovL09lZWX9Ue6g1xvvIf0aVMeOHav4+Phu/3ppaWnplrqvGD9+fI/9ExISNGbMmGv2udox+6PuKyorK7VmzRrt3btX8+bNu2bfuLg4/fVf/3WvzPLdTM1/ac6cOfqXf/mX8L7N59oYo/Lycq1YsUKJiYnX7Nub5zoW/X1f99Vrbzjpr78Hhqpoz19HR4dOnjypQCCgJ554QtLl4GWMUUJCgg4fPqwHH3ywX2q3QSz3X3JysiZOnBgOqZKUnp4uY4zOnj2rO++8s09rtkks56+4uFhz587Vxo0bJUn33nuvbr31VmVnZ+u5555TcnJyn9c9mPXWe0i/fvSfmJgor9crv98f0e73+5WVldXjmMzMzG79Dx8+rIyMDI0YMeKafa52zP6oW7o8g7Jq1Sq9+eabN/SdFmOM6urqeuXmj7XmbwsEAhH12HqupcvLYPzP//yP1qxZc93H6c1zHYv+vq/76rU3nPTX3wNDVbTnz+Vy6YMPPlBdXV14y8vL07Rp01RXV6fZs2f3V+lWiOX+mzt3rj777DOdP38+3PbRRx8pLi5OkyZN6tN6bRPL+fvqq68UFxcZk+Lj4yX9/zODuLpeew+J6qdXveDK8hBlZWWmvr7e5Ofnm1tvvTX8C+1NmzaZFStWhPtfWd5g/fr1pr6+3pSVlXVb3uD48eMmPj7e/PKXvzQNDQ3ml7/8ZZ8tmXSjdb/55psmISHBbN++PWI5pHPnzoX7PPvss+bQoUPm1KlTJhAImNWrV5uEhATz+9//fkBq/ud//mdz4MAB89FHH5k//vGPZtOmTUaS2bdvX7iPjef6ir//+783s2fP7vGYfX2uOzo6TCAQMIFAwEgyW7duNYFAILzsiQ33dV+89oabvvh7YDiJ9bV9xXD/1X+056+jo8NMmjTJ/OhHPzIffvihOXLkiLnzzjvN2rVrB+opDKhoz9+uXbtMQkKCKSkpMadOnTLHjh0zGRkZZtasWQP1FAZUX7zP3Yh+D6rGGLN9+3aTmppqEhMTzcyZM82RI0fCf7Zy5Upz//33R/R/7733zPe//32TmJhobr/9dlNaWtrtmHv37jXTpk0zI0aMMHfddVdEuBqIuu+//34jqdu2cuXKcJ/8/HwzefJkk5iYaG677Tbj8/lMTU3NgNX8/PPPmzvuuMMkJSWZv/qrvzI/+MEPzL//+793O6Zt59qYy+ssjhw50uzYsaPH4/X1ub6ytNfVrrct93VfvPaGm97+e2C4ifYe/EvDPagaE/35a2hoMPPmzTMjR440kyZNMgUFBearr77q56rtEe3527Ztm7n77rvNyJEjTXJysvnxj39szp49289V26Gv3ueux2EM89cAAACwz4D8F6oAAADA9RBUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgpaiD6tGjR7VkyRJNmDBBDodDb7/99nXHHDlyRF6vV0lJSZoyZYpee+21WGoFAADAMBJ1UP3yyy81Y8YMvfrqqzfU/8yZM1q0aJGys7MVCAT01FNPad26ddq3b1/UxQIAAGD4cBhjTMyDHQ4dOHBAS5cuvWqfX/ziFzp48KAaGhrCbXl5eXr//fd14sSJWB8aAAAAQ1xCXz/AiRMn5PP5ItoWLFigsrIyffPNNxoxYkS3MZ2dners7AzvX7p0SV988YXGjBkjh8PR1yUDAAAgSsYYdXR0aMKECYqL652fQfV5UG1ubpbH44lo83g8unjxolpbW5WcnNxtTHFxsTZv3tzXpQEAAKCXNTU1adKkSb1yrD4PqpK6zYJe+bbB1WZHCwsLVVBQEN4PhUKaPHmympqa5HK5+q5QAAAAxKS9vV0pKSn67ne/22vH7POgOn78eDU3N0e0tbS0KCEhQWPGjOlxjNPplNPp7NbucrkIqgAAABbrza9p9vk6qpmZmfL7/RFthw8fVkZGRo/fTwUAAACkGILq+fPnVVdXp7q6OkmXl5+qq6tTY2OjpMsf2+fm5ob75+Xl6ZNPPlFBQYEaGhpUXl6usrIybdiwoXeeAQAAAIakqD/6P3nypB544IHw/pXvkq5cuVK7d+9WMBgMh1ZJSktLU1VVldavX6/t27drwoQJ2rZtmx5++OFeKB8AAABD1U2to9pf2tvb5Xa7FQqF+I4qAACAhfoir/X5d1QBAACAWBBUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAK8UUVEtKSpSWlqakpCR5vV5VV1dfs39FRYVmzJihW265RcnJyVq9erXa2tpiKhgAAADDQ9RBtbKyUvn5+SoqKlIgEFB2drYWLlyoxsbGHvsfO3ZMubm5WrNmjT788EPt3btXf/jDH7R27dqbLh4AAABDV9RBdevWrVqzZo3Wrl2r9PR0vfTSS0pJSVFpaWmP/X/3u9/p9ttv17p165SWlqYf/OAHevTRR3Xy5MmbLh4AAABDV1RB9cKFC6qtrZXP54to9/l8qqmp6XFMVlaWzp49q6qqKhlj9Pnnn+utt97S4sWLr/o4nZ2dam9vj9gAAAAwvEQVVFtbW9XV1SWPxxPR7vF41Nzc3OOYrKwsVVRUKCcnR4mJiRo/frxGjRqlV1555aqPU1xcLLfbHd5SUlKiKRMAAABDQEw/pnI4HBH7xphubVfU19dr3bp1evrpp1VbW6tDhw7pzJkzysvLu+rxCwsLFQqFwltTU1MsZQIAAGAQS4im89ixYxUfH99t9rSlpaXbLOsVxcXFmjt3rjZu3ChJuvfee3XrrbcqOztbzz33nJKTk7uNcTqdcjqd0ZQGAACAISaqGdXExER5vV75/f6Idr/fr6ysrB7HfPXVV4qLi3yY+Ph4SZdnYgEAAICeRP3Rf0FBgXbu3Kny8nI1NDRo/fr1amxsDH+UX1hYqNzc3HD/JUuWaP/+/SotLdXp06d1/PhxrVu3TrNmzdKECRN675kAAABgSInqo39JysnJUVtbm7Zs2aJgMKjp06erqqpKqampkqRgMBixpuqqVavU0dGhV199VT/72c80atQoPfjgg3r++ed771kAAABgyHGYQfD5e3t7u9xut0KhkFwu10CXAwAAgG/pi7wW06/+AQAAgL5GUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKwUU1AtKSlRWlqakpKS5PV6VV1dfc3+nZ2dKioqUmpqqpxOp+644w6Vl5fHVDAAAACGh4RoB1RWVio/P18lJSWaO3euXn/9dS1cuFD19fWaPHlyj2OWLVumzz//XGVlZfre976nlpYWXbx48aaLBwAAwNDlMMaYaAbMnj1bM2fOVGlpabgtPT1dS5cuVXFxcbf+hw4d0iOPPKLTp09r9OjRMRXZ3t4ut9utUCgkl8sV0zEAAADQd/oir0X10f+FCxdUW1srn88X0e7z+VRTU9PjmIMHDyojI0MvvPCCJk6cqKlTp2rDhg36+uuvY68aAAAAQ15UH/23traqq6tLHo8not3j8ai5ubnHMadPn9axY8eUlJSkAwcOqLW1VY899pi++OKLq35PtbOzU52dneH99vb2aMoEAADAEBDTj6kcDkfEvjGmW9sVly5dksPhUEVFhWbNmqVFixZp69at2r1791VnVYuLi+V2u8NbSkpKLGUCAABgEIsqqI4dO1bx8fHdZk9bWlq6zbJekZycrIkTJ8rtdofb0tPTZYzR2bNnexxTWFioUCgU3pqamqIpEwAAAENAVEE1MTFRXq9Xfr8/ot3v9ysrK6vHMXPnztVnn32m8+fPh9s++ugjxcXFadKkST2OcTqdcrlcERsAAACGl6g/+i8oKNDOnTtVXl6uhoYGrV+/Xo2NjcrLy5N0eTY0Nzc33H/58uUaM2aMVq9erfr6eh09elQbN27UT37yE40cObL3ngkAAACGlKjXUc3JyVFbW5u2bNmiYDCo6dOnq6qqSqmpqZKkYDCoxsbGcP/vfOc78vv9+ulPf6qMjAyNGTNGy5Yt03PPPdd7zwIAAABDTtTrqA4E1lEFAACw24CvowoAAAD0F4IqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArBRTUC0pKVFaWpqSkpLk9XpVXV19Q+OOHz+uhIQE3XfffbE8LAAAAIaRqINqZWWl8vPzVVRUpEAgoOzsbC1cuFCNjY3XHBcKhZSbm6uHHnoo5mIBAAAwfDiMMSaaAbNnz9bMmTNVWloabktPT9fSpUtVXFx81XGPPPKI7rzzTsXHx+vtt99WXV3dDT9me3u73G63QqGQXC5XNOUCAACgH/RFXotqRvXChQuqra2Vz+eLaPf5fKqpqbnquF27dunUqVN65plnbuhxOjs71d7eHrEBAABgeIkqqLa2tqqrq0sejyei3ePxqLm5uccxH3/8sTZt2qSKigolJCTc0OMUFxfL7XaHt5SUlGjKBAAAwBAQ04+pHA5HxL4xplubJHV1dWn58uXavHmzpk6desPHLywsVCgUCm9NTU2xlAkAAIBB7MamOP+fsWPHKj4+vtvsaUtLS7dZVknq6OjQyZMnFQgE9MQTT0iSLl26JGOMEhISdPjwYT344IPdxjmdTjmdzmhKAwAAwBAT1YxqYmKivF6v/H5/RLvf71dWVla3/i6XSx988IHq6urCW15enqZNm6a6ujrNnj375qoHAADAkBXVjKokFRQUaMWKFcrIyFBmZqZ27NihxsZG5eXlSbr8sf2nn36qN954Q3FxcZo+fXrE+HHjxikpKalbOwAAAPCXog6qOTk5amtr05YtWxQMBjV9+nRVVVUpNTVVkhQMBq+7pioAAABwPVGvozoQWEcVAADAbgO+jioAAADQXwiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlWIKqiUlJUpLS1NSUpK8Xq+qq6uv2nf//v2aP3++brvtNrlcLmVmZuqdd96JuWAAAAAMD1EH1crKSuXn56uoqEiBQEDZ2dlauHChGhsbe+x/9OhRzZ8/X1VVVaqtrdUDDzygJUuWKBAI3HTxAAAAGLocxhgTzYDZs2dr5syZKi0tDbelp6dr6dKlKi4uvqFj3HPPPcrJydHTTz99Q/3b29vldrsVCoXkcrmiKRcAAAD9oC/yWlQzqhcuXFBtba18Pl9Eu8/nU01NzQ0d49KlS+ro6NDo0aOv2qezs1Pt7e0RGwAAAIaXqIJqa2ururq65PF4Ito9Ho+am5tv6BgvvviivvzySy1btuyqfYqLi+V2u8NbSkpKNGUCAABgCIjpx1QOhyNi3xjTra0ne/bs0bPPPqvKykqNGzfuqv0KCwsVCoXCW1NTUyxlAgAAYBBLiKbz2LFjFR8f3232tKWlpdss67dVVlZqzZo12rt3r+bNm3fNvk6nU06nM5rSAAAAMMRENaOamJgor9crv98f0e73+5WVlXXVcXv27NGqVav05ptvavHixbFVCgAAgGElqhlVSSooKNCKFSuUkZGhzMxM7dixQ42NjcrLy5N0+WP7Tz/9VG+88YakyyE1NzdXL7/8subMmROejR05cqTcbncvPhUAAAAMJVEH1ZycHLW1tWnLli0KBoOaPn26qqqqlJqaKkkKBoMRa6q+/vrrunjxoh5//HE9/vjj4faVK1dq9+7dN/8MAAAAMCRFvY7qQGAdVQAAALsN+DqqAAAAQH8hqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEoEVQAAAFiJoAoAAAArEVQBAABgJYIqAAAArERQBQAAgJUIqgAAALASQRUAAABWIqgCAADASgRVAAAAWImgCgAAACsRVAEAAGAlgioAAACsRFAFAACAlQiqAAAAsBJBFQAAAFaKKaiWlJQoLS1NSUlJ8nq9qq6uvmb/I0eOyOv1KikpSVOmTNFrr70WU7EAAAAYPqIOqpWVlcrPz1dRUZECgYCys7O1cOFCNTY29tj/zJkzWrRokbKzsxUIBPTUU09p3bp12rdv300XDwAAgKHLYYwx0QyYPXu2Zs6cqdLS0nBbenq6li5dquLi4m79f/GLX+jgwYNqaGgIt+Xl5en999/XiRMnbugx29vb5Xa7FQqF5HK5oikXAAAA/aAv8lpCNJ0vXLig2tpabdq0KaLd5/OppqamxzEnTpyQz+eLaFuwYIHKysr0zTffaMSIEd3GdHZ2qrOzM7wfCoUkXT4BAAAAsM+VnBblHOg1RRVUW1tb1dXVJY/HE9Hu8XjU3Nzc45jm5uYe+1+8eFGtra1KTk7uNqa4uFibN2/u1p6SkhJNuQAAAOhnbW1tcrvdvXKsqILqFQ6HI2LfGNOt7Xr9e2q/orCwUAUFBeH9c+fOKTU1VY2Njb32xGGv9vZ2paSkqKmpia96DANc7+GF6z28cL2Hl1AopMmTJ2v06NG9dsyogurYsWMVHx/fbfa0paWl26zpFePHj++xf0JCgsaMGdPjGKfTKafT2a3d7XZzow8jLpeL6z2McL2HF6738ML1Hl7i4npv9dOojpSYmCiv1yu/3x/R7vf7lZWV1eOYzMzMbv0PHz6sjIyMHr+fCgAAAEgxLE9VUFCgnTt3qry8XA0NDVq/fr0aGxuVl5cn6fLH9rm5ueH+eXl5+uSTT1RQUKCGhgaVl5errKxMGzZs6L1nAQAAgCEn6u+o5uTkqK2tTVu2bFEwGNT06dNVVVWl1NRUSVIwGIxYUzUtLU1VVVVav369tm/frgkTJmjbtm16+OGHb/gxnU6nnnnmmR6/DoChh+s9vHC9hxeu9/DC9R5e+uJ6R72OKgAAANAfeu/brgAAAEAvIqgCAADASgRVAAAAWImgCgAAACtZE1RLSkqUlpampKQkeb1eVVdXX7P/kSNH5PV6lZSUpClTpui1117rp0rRG6K53vv379f8+fN12223yeVyKTMzU++8804/VoubFe3r+4rjx48rISFB9913X98WiF4V7fXu7OxUUVGRUlNT5XQ6dccdd6i8vLyfqsXNivZ6V1RUaMaMGbrllluUnJys1atXq62trZ+qRayOHj2qJUuWaMKECXI4HHr77bevO6ZXspqxwG9+8xszYsQI8+tf/9rU19ebJ5980tx6663mk08+6bH/6dOnzS233GKefPJJU19fb37961+bESNGmLfeequfK0csor3eTz75pHn++efNf/zHf5iPPvrIFBYWmhEjRpj//M//7OfKEYtor/cV586dM1OmTDE+n8/MmDGjf4rFTYvlev/whz80s2fPNn6/35w5c8b8/ve/N8ePH+/HqhGraK93dXW1iYuLMy+//LI5ffq0qa6uNvfcc49ZunRpP1eOaFVVVZmioiKzb98+I8kcOHDgmv17K6tZEVRnzZpl8vLyItruuusus2nTph77//znPzd33XVXRNujjz5q5syZ02c1ovdEe717cvfdd5vNmzf3dmnoA7Fe75ycHPMP//AP5plnniGoDiLRXu/f/va3xu12m7a2tv4oD70s2uv9T//0T2bKlCkRbdu2bTOTJk3qsxrR+24kqPZWVhvwj/4vXLig2tpa+Xy+iHafz6eampoex5w4caJb/wULFujkyZP65ptv+qxW3LxYrve3Xbp0SR0dHRo9enRflIheFOv13rVrl06dOqVnnnmmr0tEL4rleh88eFAZGRl64YUXNHHiRE2dOlUbNmzQ119/3R8l4ybEcr2zsrJ09uxZVVVVyRijzz//XG+99ZYWL17cHyWjH/VWVov6f6bqba2trerq6pLH44lo93g8am5u7nFMc3Nzj/0vXryo1tZWJScn91m9uDmxXO9ve/HFF/Xll19q2bJlfVEielEs1/vjjz/Wpk2bVF1drYSEAf8rClGI5XqfPn1ax44dU1JSkg4cOKDW1lY99thj+uKLL/iequViud5ZWVmqqKhQTk6O/vznP+vixYv64Q9/qFdeeaU/SkY/6q2sNuAzqlc4HI6IfWNMt7br9e+pHXaK9npfsWfPHj377LOqrKzUuHHj+qo89LIbvd5dXV1avny5Nm/erKlTp/ZXeehl0by+L126JIfDoYqKCs2aNUuLFi3S1q1btXv3bmZVB4lornd9fb3WrVunp59+WrW1tTp06JDOnDmjvLy8/igV/aw3stqAT1eMHTtW8fHx3f711dLS0i2JXzF+/Pge+yckJGjMmDF9VituXizX+4rKykqtWbNGe/fu1bx58/qyTPSSaK93R0eHTp48qUAgoCeeeELS5SBjjFFCQoIOHz6sBx98sF9qR/RieX0nJydr4sSJcrvd4bb09HQZY3T27FndeeedfVozYhfL9S4uLtbcuXO1ceNGSdK9996rW2+9VdnZ2Xruuef4RHQI6a2sNuAzqomJifJ6vfL7/RHtfr9fWVlZPY7JzMzs1v/w4cPKyMjQiBEj+qxW3LxYrrd0eSZ11apVevPNN/ku0yAS7fV2uVz64IMPVFdXF97y8vI0bdo01dXVafbs2f1VOmIQy+t77ty5+uyzz3T+/Plw20cffaS4uDhNmjSpT+vFzYnlen/11VeKi4uMHvHx8ZL+/9k2DA29ltWi+ulVH7myvEVZWZmpr683+fn55tZbbzV/+tOfjDHGbNq0yaxYsSLc/8qSB+vXrzf19fWmrKyM5akGkWiv95tvvmkSEhLM9u3bTTAYDG/nzp0bqKeAKER7vb+NX/0PLtFe746ODjNp0iTzox/9yHz44YfmyJEj5s477zRr164dqKeAKER7vXft2mUSEhJMSUmJOXXqlDl27JjJyMgws2bNGqingBvU0dFhAoGACQQCRpLZunWrCQQC4aXI+iqrWRFUjTFm+/btJjU11SQmJpqZM2eaI0eOhP9s5cqV5v7774/o/95775nvf//7JjEx0dx+++2mtLS0nyvGzYjmet9///1GUrdt5cqV/V84YhLt6/svEVQHn2ivd0NDg5k3b54ZOXKkmTRpkikoKDBfffVVP1eNWEV7vbdt22buvvtuM3LkSJOcnGx+/OMfm7Nnz/Zz1YjWu+++e8334r7Kag5jmGsHAACAfQb8O6oAAABATwiqAAAAsBJBFQAAAFYiqAIAAMBKBFUAAABYiaAKAAAAKxFUAQAAYCWCKgAAAKxEUAUAAICVCKoAAACwEkEVAAAAViKoAgAAwEr/H6kO7vAeojMTAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 800x800 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(8,8))\n",
"gs = fig.add_gridspec(3,3)\n",
"top_left = fig.add_subplot(gs[0,0])\n",
"mid_left = fig.add_subplot(gs[1,0])\n",
"top_right = fig.add_subplot(gs[:2,1:])\n",
"bottom = fig.add_subplot(gs[2,:])"
]
},
{
"cell_type": "markdown",
"id": "dae22787-4927-4491-bc31-2e5a0ff01542",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 44,
"id": "177d2a31-a0d8-4d9b-ade3-2fdf5156baa9",
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'ydata_profiling'",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[44]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[34;01mydata_profiling\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ProfileReport\n\u001b[32m 3\u001b[39m profile = ProfileReport(df)\n\u001b[32m 4\u001b[39m profile.to_file(\u001b[33m'\u001b[39m\u001b[33mreport.html\u001b[39m\u001b[33m'\u001b[39m)\n",
"\u001b[31mModuleNotFoundError\u001b[39m: No module named 'ydata_profiling'"
]
}
],
"source": [
"from ydata_profiling import ProfileReport\n",
"\n",
"profile = ProfileReport(df)\n",
"profile.to_file('report.html')"
]
},
{
"cell_type": "markdown",
"id": "25f38639-b9e3-4358-84b6-4068ca224aa4",
"metadata": {},
"source": [
"# Polars"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "d835bac6-aa5b-4f34-a7a4-7dec7aa1e146",
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'polars'",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[34;01mpolars\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[34;01mpl\u001b[39;00m\n\u001b[32m 3\u001b[39m \u001b[38;5;66;03m# create a DataFrame from a CSV file\u001b[39;00m\n\u001b[32m 4\u001b[39m df = pl.read_csv(\u001b[33m\"\u001b[39m\u001b[33mdata/earthquakes.csv\u001b[39m\u001b[33m\"\u001b[39m)\n",
"\u001b[31mModuleNotFoundError\u001b[39m: No module named 'polars'"
]
}
],
"source": [
"import polars as pl\n",
"\n",
"# create a DataFrame from a CSV file\n",
"df = pl.read_csv(\"data/earthquakes.csv\")\n",
"\n",
"# filter the DataFrame to only include rows with magnitude greater than 7\n",
"filtered_df = df[df[\"mag\"] > 7]\n",
"\n",
"# group the DataFrame by the \"location\" column and compute the sum of the \"mag\" column for each group\n",
"grouped_df = filtered_df.groupby(\"location\").sum()\n",
"\n",
"# sort the grouped DataFrame by the sum of the \"mag\" column in descending order\n",
"sorted_df = grouped_df.sort(by=\"mag\", ascending=False)\n",
"\n",
"# display the first 10 rows of the sorted DataFrame\n",
"print(sorted_df[:10])\n"
]
},
{
"cell_type": "markdown",
"id": "3861ff7e-23c0-4247-8c0c-17c1007d501a",
"metadata": {},
"source": [
"## Praca domowa - plik taxi_trips (ma 80GB :D)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a0e609fb-2284-4b34-b2be-22f24474d515",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "07b61bfc-3319-4d37-b954-f5bec17c6d95",
"metadata": {},
"source": [
"# Uczenie maszynowe"
]
},
{
"cell_type": "markdown",
"id": "2a32ad88-3da9-41d5-b9b5-09583322113e",
"metadata": {},
"source": [
"## Wprowadzenie\n",
"### Definicja\n",
"uczenie maszynowe to dziedzina sztucznej inteligencji - komputery uczą się na danych i potrafią podejmować decyzje bez programowania\n",
"### Zastosowania\n",
"filtr spamu, rozpoznawanie obrazów, rekomenracje produktów\n",
"### Perceptron - najmniejsza jednostka obliczeniowa ludzkiego mózgu"
]
},
{
"cell_type": "markdown",
"id": "ac24ed9e-629b-4146-9c65-a7f0ff47ab4c",
"metadata": {},
"source": [
"## Biblioteki\n",
"### TensorFlow\n",
" - od Google\n",
" - prostszy w obsłudze, łatwy do nauczenia się\n",
"### PyTorch\n",
" - od Facebooka\n",
" - ma bardzo wysoki próg wejścia - wszystko robi się ręcznie, nie ma gotowców - trzeba umieć programować w Pythonie\n",
"### scikit-learn\n",
" - zbudowany na NumPy, SciPy i MatPlotLib"
]
},
{
"cell_type": "markdown",
"id": "336d7f54-7373-435e-ba21-4cd5249909b7",
"metadata": {},
"source": [
"## Uczenie nadzorowane\n",
" - dane muszą być idealne"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "78f25a02-f822-477b-8f75-a8ec220a90ac",
"metadata": {},
"outputs": [],
"source": [
"import numpy as "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f67a65d4-f8c6-4a83-92c8-efd0727e79c0",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}