Skip to content

Instantly share code, notes, and snippets.

@trevormunoz
Created March 11, 2017 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trevormunoz/f50835fa83390d06aa86b4cc80625dcf to your computer and use it in GitHub Desktop.
Save trevormunoz/f50835fa83390d06aa86b4cc80625dcf to your computer and use it in GitHub Desktop.
Exploring Python tools for geospatial data
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Getting geometries for mapping Atlanta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"10 March 2017"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import os\n",
"import json\n",
"import zipfile\n",
"import pandas as pd\n",
"import geopandas as gpd\n",
"import osmnx as ox\n",
"from shapely.ops import cascaded_union\n",
"from shapely.geometry import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Counties"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>bbox_east</th>\n",
" <th>bbox_north</th>\n",
" <th>bbox_south</th>\n",
" <th>bbox_west</th>\n",
" <th>geometry</th>\n",
" <th>place_name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-84.097575</td>\n",
" <td>34.186214</td>\n",
" <td>33.502228</td>\n",
" <td>-84.851021</td>\n",
" <td>POLYGON ((699601.8114425663 3710009.973385015,...</td>\n",
" <td>Fulton County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-84.031687</td>\n",
" <td>33.970829</td>\n",
" <td>33.614670</td>\n",
" <td>-84.350225</td>\n",
" <td>POLYGON ((745740.0592038987 3726267.670597084,...</td>\n",
" <td>DeKalb County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-83.799059</td>\n",
" <td>34.168231</td>\n",
" <td>33.747276</td>\n",
" <td>-84.276822</td>\n",
" <td>POLYGON ((751640.0798766782 3760807.690705092,...</td>\n",
" <td>Gwinnett County, Georgia, United States of Ame...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-84.374728</td>\n",
" <td>34.081327</td>\n",
" <td>33.743574</td>\n",
" <td>-84.739660</td>\n",
" <td>POLYGON ((708886.2865171614 3758638.730906881,...</td>\n",
" <td>Cobb County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-84.243835</td>\n",
" <td>33.648796</td>\n",
" <td>33.352352</td>\n",
" <td>-84.459137</td>\n",
" <td>POLYGON ((735901.4259747062 3715242.191576846,...</td>\n",
" <td>Clayton County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>-83.807214</td>\n",
" <td>33.448063</td>\n",
" <td>33.180637</td>\n",
" <td>-84.123634</td>\n",
" <td>POLYGON ((768006.0769988894 3681855.681648433,...</td>\n",
" <td>Butts County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-84.257599</td>\n",
" <td>34.412430</td>\n",
" <td>34.073333</td>\n",
" <td>-84.659231</td>\n",
" <td>POLYGON ((715989.7503760209 3773277.376425762,...</td>\n",
" <td>Cherokee County, Georgia, United States of Ame...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>-84.578021</td>\n",
" <td>33.806135</td>\n",
" <td>33.573109</td>\n",
" <td>-84.910851</td>\n",
" <td>POLYGON ((693554.7816948302 3734102.443542688,...</td>\n",
" <td>Douglas County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>-84.382103</td>\n",
" <td>33.550789</td>\n",
" <td>33.256752</td>\n",
" <td>-84.627625</td>\n",
" <td>POLYGON ((720536.2989526612 3702561.80335084, ...</td>\n",
" <td>Fayette County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-83.925728</td>\n",
" <td>34.335129</td>\n",
" <td>34.049366</td>\n",
" <td>-84.259323</td>\n",
" <td>POLYGON ((752805.8348464108 3777711.501542385,...</td>\n",
" <td>Forsyth County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>-83.923042</td>\n",
" <td>33.647433</td>\n",
" <td>33.297615</td>\n",
" <td>-84.354347</td>\n",
" <td>POLYGON ((746193.7241841839 3693476.177824521,...</td>\n",
" <td>Henry County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>-83.674683</td>\n",
" <td>33.743870</td>\n",
" <td>33.368023</td>\n",
" <td>-84.054344</td>\n",
" <td>POLYGON ((773597.9557658795 3712641.398472292,...</td>\n",
" <td>Newton County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>-83.912888</td>\n",
" <td>33.786633</td>\n",
" <td>33.526173</td>\n",
" <td>-84.184143</td>\n",
" <td>POLYGON ((761152.4402170861 3726481.002667776,...</td>\n",
" <td>Rockdale County, Georgia, United States of Ame...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>-83.505768</td>\n",
" <td>33.930358</td>\n",
" <td>33.597149</td>\n",
" <td>-83.982134</td>\n",
" <td>POLYGON ((779437.9459358496 3742593.393792731,...</td>\n",
" <td>Walton County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>-83.537465</td>\n",
" <td>34.127505</td>\n",
" <td>33.894943</td>\n",
" <td>-83.869082</td>\n",
" <td>POLYGON ((789171.3500395236 3767116.03134302, ...</td>\n",
" <td>Barrow County, Georgia, United States of America</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>-84.496979</td>\n",
" <td>33.511780</td>\n",
" <td>33.190952</td>\n",
" <td>-85.015121</td>\n",
" <td>POLYGON ((684538.7088929475 3700217.179949568,...</td>\n",
" <td>Coweta County, Georgia, United States of America</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" bbox_east bbox_north bbox_south bbox_west \\\n",
"0 -84.097575 34.186214 33.502228 -84.851021 \n",
"1 -84.031687 33.970829 33.614670 -84.350225 \n",
"2 -83.799059 34.168231 33.747276 -84.276822 \n",
"3 -84.374728 34.081327 33.743574 -84.739660 \n",
"4 -84.243835 33.648796 33.352352 -84.459137 \n",
"5 -83.807214 33.448063 33.180637 -84.123634 \n",
"6 -84.257599 34.412430 34.073333 -84.659231 \n",
"7 -84.578021 33.806135 33.573109 -84.910851 \n",
"8 -84.382103 33.550789 33.256752 -84.627625 \n",
"9 -83.925728 34.335129 34.049366 -84.259323 \n",
"10 -83.923042 33.647433 33.297615 -84.354347 \n",
"11 -83.674683 33.743870 33.368023 -84.054344 \n",
"12 -83.912888 33.786633 33.526173 -84.184143 \n",
"13 -83.505768 33.930358 33.597149 -83.982134 \n",
"14 -83.537465 34.127505 33.894943 -83.869082 \n",
"15 -84.496979 33.511780 33.190952 -85.015121 \n",
"\n",
" geometry \\\n",
"0 POLYGON ((699601.8114425663 3710009.973385015,... \n",
"1 POLYGON ((745740.0592038987 3726267.670597084,... \n",
"2 POLYGON ((751640.0798766782 3760807.690705092,... \n",
"3 POLYGON ((708886.2865171614 3758638.730906881,... \n",
"4 POLYGON ((735901.4259747062 3715242.191576846,... \n",
"5 POLYGON ((768006.0769988894 3681855.681648433,... \n",
"6 POLYGON ((715989.7503760209 3773277.376425762,... \n",
"7 POLYGON ((693554.7816948302 3734102.443542688,... \n",
"8 POLYGON ((720536.2989526612 3702561.80335084, ... \n",
"9 POLYGON ((752805.8348464108 3777711.501542385,... \n",
"10 POLYGON ((746193.7241841839 3693476.177824521,... \n",
"11 POLYGON ((773597.9557658795 3712641.398472292,... \n",
"12 POLYGON ((761152.4402170861 3726481.002667776,... \n",
"13 POLYGON ((779437.9459358496 3742593.393792731,... \n",
"14 POLYGON ((789171.3500395236 3767116.03134302, ... \n",
"15 POLYGON ((684538.7088929475 3700217.179949568,... \n",
"\n",
" place_name \n",
"0 Fulton County, Georgia, United States of America \n",
"1 DeKalb County, Georgia, United States of America \n",
"2 Gwinnett County, Georgia, United States of Ame... \n",
"3 Cobb County, Georgia, United States of America \n",
"4 Clayton County, Georgia, United States of America \n",
"5 Butts County, Georgia, United States of America \n",
"6 Cherokee County, Georgia, United States of Ame... \n",
"7 Douglas County, Georgia, United States of America \n",
"8 Fayette County, Georgia, United States of America \n",
"9 Forsyth County, Georgia, United States of America \n",
"10 Henry County, Georgia, United States of America \n",
"11 Newton County, Georgia, United States of America \n",
"12 Rockdale County, Georgia, United States of Ame... \n",
"13 Walton County, Georgia, United States of America \n",
"14 Barrow County, Georgia, United States of America \n",
"15 Coweta County, Georgia, United States of America "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Source: https://en.wikipedia.org/wiki/Atlanta_metropolitan_area#Definitions\n",
"counties = {\n",
" 1950: ['Fulton County, Georgia', 'DeKalb County, Georgia', 'Gwinnett County, Georgia', 'Cobb County, Georgia', 'Clayton County, Georgia'],\n",
" 1970: ['Butts County, Georgia', 'Cherokee County, Georgia', 'Douglas County, Georgia', 'Fayette County, Georgia', 'Forsyth County, Georgia', 'Henry County, Georgia', 'Newton County, Georgia', 'Rockdale County, Georgia', 'Walton County, Georgia'],\n",
" 1980: ['Barrow County, Georgia', 'Coweta County, Georgia']\n",
"}\n",
"atlanta_metro_80 = ox.gdf_from_places(counties[1950] + counties[1970] + counties[1980])\n",
"ox.project_gdf(atlanta_metro_80)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAFpCAYAAAC2164gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd0ZFd+H/jvve9VRiHn1EgNNDpHstmJzTAzpDicJGt2\nJK/WmvRsr2Qf7cpHx7bWOjq7a+2R19Z4pTOyzhs2OWuvZEnWaCSNh+QMOYwd2DmjkRs5hwJQud69\nv/2jgGaT0w10AxVQVfdziGlMd+G9XwW837vpdxkRQVEURVHWi6c7AEVRFCWzqUSiKIqibIhKJIqi\nKMqGqESiKIqibIhKJIqiKMqGqESiKIqibIhKJIqiKMqGqESiKIqibIhKJIqiKMqGqESiKIqibIhK\nJIqiKMqGqESiKIqibIhKJIqiKMqGqESiKIqibIhKJIqiKMqG6OkOQNncTNP8LIBSANp9XzoA26f+\nBAACwMGYhzNeAMauf+ub3/heGsJWFCWFVCJRHso0zXrG2I/zy6pDbBkYA2OcMc45Z5wzzjljnN37\nIQbGNZ2TlJga7J4FoBKJomQ5lUiU1UQZ12LN+455H/cHY5EwJgc6nckISlGUzUWNkSirCZKU67rZ\n4JoOInIkOiBFUTYflUiU1YSJpLaeH+SaBhDppmmqz5iiZDnVtaWsxgLAiQiMsTUffL/4cAqziMgF\nIJCU6B7CNM0GAF7EJwZwAD2GYSylMgZFySUqkSgPZRiGNE2TQMTwmIkEABjXLBKWGylMJKZp1oKx\nLrvDFQZjkELoJMWPAHwtCefiAFwA3AA8y98D8dlr2n1/777va8YwjNcTHYuipJNKJMrqGBNEUmfr\n6AVlnAsIuBMVimmaDIAdgGP56/7vdQAMQLPN7ozsfPrlfADwTY1i4OZHbaZpfg4fX8w9AE4DmAdj\n/4xzXsAYzwdjXgB5y4+JH5fgAMhOgB1ENhDZCGQjIhsAnTEeY5wLzjXBOJcfP3kGrmmScx1c06Dp\nNsY1nfsmhz2maboMw4gk6nVRlHRTiURZFQMTRLSuz4mm2wlEf3Pqte9HEf+srXzF16LEj6sB0Aik\ng5bXqRBpdG/8jjgIGpGMP5YxwRiTjPH4n5xLxjgxxghgAAPyS6vuZT2XtxAuT0EzGP6SazrTNJ2H\n/ItOKxq+IKzYDzz5xb9dWFmncU0D13RwroFrGhjXwDkH4/y+75f/ZPzeYxhjNsTX0jySqz/9K2v5\n9VSJRMkaKpEoq2MQJOXaj3uAlgMn8iKBpf1gDIwzMMbjYy3x8RMwxj/x/b0/OcNKUmBgK3f3K49Z\nWRT5SBdvh8uDtsPPf2L68uLsBPqunG5jnP9PeUVlqGhoW9fzWxfGJIjWNYFBUTYrlUiUVTEwi2h9\nicTp8cLpeewlKEnnLSpHXfu+EoCVFJRXp/TcDIxI/d4pWUZ9oJXVMWatt0WyWTHOUVrbnKaTs5WB\neEXJGmqOv7KWmMyyRJJOjDEJdQOnZBmVSJRVxdeCqESSOAxQiUTJMiqRKGuJZVvXVjox1bWlZCGV\nSJS1BIY7LgfuXj8XFLFoumPJfPFEolokSlZRH2hlVcKKfTmwMLsn5Pf9cTjQ6vYUlqQ7pMzGlvds\nyXKmaep48OLRmGEYA2kMTUkClUiUVXFNPwrguBRWJeNZf/1LPgJDvITKuiyv7rchfmG2rfK9/SFf\nDny8wn9lU7L42hzG7IxxD2PMyRhzAXCBMSeAla/4zxK5CXCCyLlc4ZkYQ4yIHBRf/a8DAGNM4FML\nR4UVtX/vlVf+iqQ8DeDPVQ207KASibIqxtjvltQ2NTo9+XB5C9MdTsYjIptms7926rXvW/j4Qv7x\nF8EGkA5AJyIn4hdnO4G05YWMHGCSMSbB4n8ur/QncLayyh+ca8RWVuYzDs41LO9Dxrlu41zTdb6y\nKRljnDHGVh7P+fLiT87vrehf+f7j1f/x0i9M0wACSErEqwNo98553/O6JxYJYaL/zi/NjQ/+srRi\n9QB+J6VvgJIUKpEoq2MsWlRRC09habojyQ4k7VUtO4/aXZ6VCsn3rfBfXt2/XAXg3sX6vtIsy5UA\nODK0e8zmcKGsfqtjZqSfCFhMdzxKYqhEoqwlRrTunhjlAbzF5Tnduhu48ZGfSP4ViF5JdyxKYmTk\nXY2SUlE1/TeBGKNcfz1DSz4HiP6tYRiz6Y5FSQyVSJS1qJXtCcQYg8zxBZ4lNQ2Sa/ofLk8cULKA\nSiTKWmJqZXsiMeR6i6R22z6H3eX+DOP8t9Idi5IYKpEoawmSFOmOIWsw1bUFrulo3nfcDbD/wzTN\n1JZfVpJCJRJldURLUqhEkkiqhQc43Hlw5xcBwJfSHYuycSqRKKsi0JIUVrrDyCqMqaEBAPAWlzsY\n43vVWEnmU4lEWRVJuaBaJIlEgEokAIDS2mZmc7r+Iddtb5mm+WXTNO3pjklZH5VIlFWRlAtCtUgS\niIGE6toCALvLje1HX3RXNrWfdLi9/x/X9L9SrZPMpBKJspagtGIqkyQI4xxSqpdzBdc0VDa2a9ue\n+oxbSvEygJp0x6Q8PpVIlLXESI0OJwxjnNSY0ycRSQQX5oB4CYWZdMejPD5VIkVZi4QqkZIwjHOo\nMac4IsLS7ARGuq4Fo6HgIte0/+tb3/xmON1xKY9PJRJlLZJUJkkYxhjL9XUkABDyL2LgxrlAJOif\nBuiUFOL3DcNQL0yGUolEWYsgqRJJojDGWa6XSJkfH6LBWxdCBPrXJOV3DcNQTbQMpxKJspYoSTXN\nKGEYYyRzOy/PjQ8GpBTfMQzjj9Idi5IYarBdWUtEqkSSMIxzlutzF6paduQB+N9M09TSHYuSGKpF\noqwlLIXI7VvoBOKcg6QgADm7XiISDEDTbde++Y2vqy6tLKFaJMpaIssXPiUBGOPI9cQc8M1Ywor9\nXbrjUBJHJRJlLREpc7xTP4G4pkMKK6dfz7zicp1r2j81TTMv3bEoiaESibKWiCojnziarkFYuZ1I\nCstr4CkozQPwS+mORUkMlUiUtUSkSiQJwzUb1Mp2wFNU6gHQmO44lMRQiURZS5ikzNmB4UTjXIOU\nIqdfz4XpcUwPdocBXE53LEpiqFlbyloiUiWShGGc5/RWu5MDXXKs5+YSSfE1wzDeTHc8SmKoRKKs\nJaJaJInDOM/JHRIXpscw0dfhDy75giTFU4Zh9Kc7JiVxVCJR1mKBSCWSBOFcQ66tbA8uzqH/2pkg\nSfnrAP6bYRihdMekJJYaI1HWEiNSLZJEYZqGXHs9GeNAfAHmFgBqF8QspBKJshaLVIskYeItktzq\n2nJ5C9G4+ykXgP8dwOfTHY+SeKprS1lLDETqhiNBNN2WU7O2rGgES/PTCC35wBj3E8m/SXdMSuKp\nRKKsJUZQiSRRdJsDubTAc+DmR37//EwfgGtE8j+q8ZHspBKJshbVtZVAms0GKXKjRSKlwOLMpBug\npw3DWEh3PEryqESirCUGIlXuO0F0uyNnpv8uzkxA0/Xb3/zG11USyXKqy0JZiwDASG2SmBC6bgdJ\niWx/PYkIYz03A8KK/bt0x6Ikn2qRKGtpAEAgYmA50SOTVFzXATCQFGBa5v36kZQILMyCpIRms8Pl\nLQRjDESEqcFuYUXCKKlt0ubGBigaCgwA+Mt0x6wkX+Z9kpWU0nT7n+aXVsTAmJr/nyCMMUgpwTOk\nw5CkxMLMOKYGuwOB+Wkn49ok43yOpCzVbXZv+ZZWTzQSsqaHehaIaGxqsLuFadotKayvGoYRS3f8\nSvKpRKKsjsFRVFlvZ6o1kjgMQIZ0bRERei69Fwwuzk9KKb4Dor/+9je/MQ4ApmmyqLA+N953+zeI\naIqk/F3DMEbSHbOSeiqRKGtRGSThGAiZkUhmR/oRXJyfkMJqMwzjE/XvDcMgAG8ufyk5TCUSZS0h\nmWMrsR+FiEURCQWWB87jg+f3fw+i+N8RxWdp3f89gEzII76pUQx3XlkkKX/500lEUe6nEomyOoKf\npLqG3C+4OI/ui++CMSaB+JgHwAAGYmAAY2AArUxOWPm7+EMYYwxaJkwBjkVC4Fz72Te/9a0L6Y5F\n2dxUIlHWQCJDuvNTIhxYQs/Fd1Fa04TabXvXNX3+2ts/yIh6W8GF+YiUoiPdcSibn0okirIKIsLc\n2CCFAwuIBP3SNzWqFVXUUu22veseO2KMUSZUC1iYGbNIyh+mOw5l81MLEhVlFb6pUQzevsAWZsYB\nMK310LNo3HNkw0lgM9fbksLC4K0LQsRiHq7pf2Sa5ldM07SlOy5l81ItEmUt0Uzoz08WKxqG3ekW\n24+8kLhVH4zRZt2TZLTrujU91KPrDifaj3wWgYW5I9OD3btC/kW8curU96UQ3zUMoyvdcSqbi0ok\nyqqIKJIJ/fnJMjc6IPOKShO6dJCBbcpdEokkpoZ69Oqtu1DR0KYBgNOTj5LqBm84sISZkb5/MjPS\n/61Tr77WKazYfwDwA8MwwmkOW9kEVNeWsjqicK62SIKL8wj5fby+/WBiD8wY5Cbs2hrruSm4psmS\n6i0/929Ojxe1bXttu5/5oqt+x6F9nqLSP2Vcm3nl1Kt/YprmtjSEq2wiqkWirIqIQpvx7jkVGNdA\nRIiGg3Dm5SfuuIzRZhsjCfkXMDXYo7U9+Rx0u/Ohj+NcQ1FlHYoq6/IiQT9mRvq+PTPc92vLrZR/\nj3grJZK6yJXNQLVIlFURyZzt2nJ6vPAUlMiJ/sTOgGWMkRCbK5H0Xz1NhRU10p1f9Mg/43DnoaZ1\nj777mS/FWymFK62UU3+sWim5RbVIlLVEiAQhB0ulMMYQXJznpXXNCT4uhxSba5GnlAKewtJ13Vgy\nzldaKd5I0I+Z4b5/PDPS981Tr77WLazYHwL4a8MwggkOWdlEVItEWYukTCkMlWDCsiCFhfyy6oQe\nl3HOaBO1SMKBJYholLm8hRs+lsOdh5q2Pbbdz3zJtWXnE3vyisq+yziffuXUq6+Yprk3AeEqm5Bq\nkShrkRlTqjbBVgoeS8sC9MQto2B8c7VIRrquCU9RGfMWlSXsxpJxjsKKWhRW1OZFQwHMjN79temh\nnl8+9eprw8KyvgPQnxuGsZSo8z0K0zTrAEjDMEZTed5coBKJshbK9t38HsaKRgEkfvEg4xrfLGMk\nE/0dwj87qW0//lLSzmF3eVDdslOrat7uXpyZbJse6vkPS3OT33nl1Vd/KC3rjwGcX64knBSmaTLG\n+D9mXPsTkkKapmlL5vlykUokylpiFJ+rmiHbMCVOLBIEGIPN6UrocTnnbLPM2uKaznWHU9idrqS/\nv4xxFJRVoaCsyhOLhDA7OvC16aHuLwphTZvf+95/BNF/MQxjLpHnNE0zn2v6f2GcvyCFYJpuiwkr\ntgvAjUSeJ9epRKKsJSCs2Oa46qXYvTEDSYkdTWSbYz8SkhKhJV9aQrE5XKhsaucVjds8/rkpz/RQ\n7+8vzIz9walXX3tdWLE/AvD+RlsNpmke5Jr+90VV9cVSCLuIRYXN4dRmR+++CJVIEkolEmUtYZIi\nJ+f/Bpd80DSduK4neMYaw3ImSetMuJB/AXPjg3zb4c+mLQbGGLwlFfCWVLitaARz44Nfmhrs/owV\njSx973vf+yMies0wjMnHOaZpmoxx/r9wTf8/t+x8wlVUWYeb7/9IVG/dpfnnpy0Aqm5YgqlEoqyF\nKCO2YUqcxdkJTA/2iJB/gdtdHoEE/54wBmyGagEDN8+Tw5UnXd6CTdFtqdsdKN/Sysrqt+YFFmbz\npod6f9c3OfJ7p1597V1hxf4fAG8ZhrFq69g0zWKu6X9pd7mfat533OVw58GKhmFFw1pBWTVceQWO\nubHBf/PKK6eapRT/q2EY8yl6ellNJRJlbVmeRiJBP+5ePyutWJRxTado0M+9pZVaYUUdqpt3ZOXv\niJQCYf8C2/uZX9oUSeR+jDHkFZYir7DUJawY5sYHX5ga7D4aCwcj33vllf9EUpoP2hveNM0jXNP+\nrqSmMb+mbY+d8/hTmxzohiuvUOg2u6bb7Nh54vP2oY5Lv7I0O3nANM2TiR6XyUVZ+UuiJFRWp5Fo\nOIjeyx+QzeFklbXNLBoJs/KGVugJnO67GTHGwRhfqW6c7nAeStNtKKtrQVldize4OO+dHu797fmx\nwd8+9epr54UV+w6AHwMQjGv/imv67zTsPuwqLK/5xDF8kyOirL7lXsK0OZxo2nvUPtp9vW1mqLfP\nNM2vG4bxtyl+allFJRLlEWRPLolFQrBiUdidbkSCfvRefh8OtxctB08yzlOzPtfpycfUQBcrrm6A\nOwGLANdDCguMc0RCgU2dSO7nzi/Clh2HHLVt++CbHD4xNdi9LxJYEmBsyOH2NjfvO+qyuzyf+Bkp\nBaLhoFbwqeTCGENt2157UUWtvefSe39umuZ2wzAGUvh0sopKJMpasiaLRENB3PrgR8t7qjMwzpFX\nXC5b9h9PaYWHmra98Ptm0Hn2J/AUloqKxm1aQVn18t7vySeFhZ6L70mbw0WegpJN17W1Fk3XUVLT\niJKaRm/Iv4DgwlxhcdUWsAfcCMyO9MPmcJLD5Xngi+spLEVhRR2bGxt4CcB3kx17tlKJRMkZ0XAA\nmm6j9qMvMCkEnB4vkIYyQZxzbD10ErMjdxH2L2oD189BkoS3uEI07z+mTQ12y7mxAdhdHqreultL\ndKtl8PZFEYuE2I4TL2mpaoUliyuvAK68gof+++zogCyuql81QzPOGXJwnVQiZfanSFEeAxGBcY3s\nTvdKEkkbXbejoqENW3Yewu7nvoLtR15AOLDArr3115jo62DFVVs4CFrv5fcp4eVUCMgrKuMrg9HZ\nSkqJcGCRFVbUrppIbHanjXH+pGmaOVeYNFFUIlHWkjVdW5sV5xzOvHzsOP4Sb33iOex+9sussmk7\nWg6cgKbpsuv8z2h+YhhWdOPbfBBJBBZmucOTuP1VNqvFmXEwzpnLu3pp/LItW7nD7f0S121XTNM8\nkKLwsopKJMrasqTW1nLNsE37ZDjXkFdUivu7m9qe+qwWDQdp8NYFuvne32PozmW5kYTin5uGsGJU\n2dSeiJA3temhHiqsqJVrjT3Z7E60P/VZd23b3j1c0z8wTfNLKQoxa6hEoqyFIUWDwElHlHG7qui6\nDXue/TLf+/wvspZDJ7E0M4nOj96iSCiwruNZsSg0TZeZPjbyKEKLPiqqrHukJ8o4R2ltE9t68KRb\ns9n/7HuvnPrnyY4vm6jBdiVnMMYAyrRU8jFvURnaj77A75x5E2M9N2Tj7qceOxvYnC4IYWV9Fgku\nzkMKi3uLyh/r5zyFJdj21GfdHaff+APTNP8CwDQArNT9Mk2zAUANgI/WWmWfS1QiUdaSsRfeT4tP\nD920PVuPhHOO+p2H0HfpfR5YmIOnoPixfj7gmyWu6Zn9IjyCqYEueEsrBVvHjAKHy4OS6gaaGx+8\nBMBNUuadeu37nQAEY3yH7nBa0oq9DyB5tfczjEokylrYarlkuOOytTA9ptndebL10DMJnQY0eOui\nFQ4ustaDz2gPWiPwuJZbJBnPW1SGwso6DNw4R1sPPcNsDtcjr0GZGuhCZVN7dk/XArA0NyVq2vau\n+3nWbT/gKiivqbO73NBtDoT9C3uIJHSHC06313Hj3b991jTNX+Fc+3dSil8xDOODRMafaViublqU\nC0zTdGq6/QdgqEJ8nrwGQAKILf8JxLOEE4AdRHbEby4sMDYHgJOUBVJYDU5PvgSWi9be+8gQIkE/\nr2hqx2T/HTjcefLeIRnAVhIQu/c/yz9232fuvgvgysVweSctFvYvcACwOVx0/+Pjh2O0MnxDRAAR\nI6KVAfX4sRgDW34cAJAUTAoLe577Ssa3ssKBJXSdf1tKK8Y1m4OKKuuosmk7tzmcD/0ZEYvi+js/\nRHXrHlQ2bkthtKkVDQdx+4MfY/ezX4KWpFI308N9crjjEre7PIiGAqOabusUVuxXDcMYN03zKMCe\nA+g1AG4A3QB2A+g1DCNgmmYVgCrDMK4kJbg0UIkki5mmWcs1vbd53zHH8kUVH19sV953Bs45GI/X\nXmKcg6SEiEVXLsQIBxZBku6/iK/8KHSbE4Xl1Vian0YkuPTxYVc2er/vXB/XTWcrJXCxUk8d9ycB\nzsEQ78+3u/IQCSyBcQaAgaRcfnx8B2BJEpxry7Fry48DSBJIiniVXRnPJZFQEJN3O2nv85mfSFZI\nKTE3NoDJu51EJNF2+Hlmsz84mRBJjPfepumhHla2pRXVLTtTHG1qjHReRWBhVrQ9+XxSW16xSAgk\nCYO3zoeX5qacAE4AbItms5mabtejIb8NALim/Q7AfhdEi1KK32KMnSIiG4AnAQiu6f9cCus/A3jn\nvrEYHYA3U6oTq0SSxUzTrNF0W/ee576SGcWUkizkX0D3+Z9RNrRIPk1KiZ6L74rg4pxWVFkvatv2\narrdgWg4BCmsTyzAnJ8cwdDtS3LXyS/wbJy9dfuDH4vyhlatrH5r6s754Y8DkaD/X3BN/1bd9gMH\niipqEViYQ8+l9wRjbL5++8FSYcXESNc1Vt9+gKSw2FjvrUkiyi+uqnf5JkdiRNRPUvyEca2MiD5P\nUhQAeM4wjHdS9kTWSSWSLGaaZpWm23pVIokLB5bQ+dFbtDcLE8mKkH8BAzc+EpGgX8srLhdLs5Ma\nQCiurJfFNY08r6gMIELH2TdJCkH5JRW8bvtBZEtCkZaF6+/+EDuOv5TSYpRLc1Pov3Ym5Mkvlk37\njnm4Fm8MLc1OIhYJo7CyFveP+xMR/PPT0O0OuPIKIGJRLM1Pwz83ZdldHj2/tBIB3yyG71yekkLs\nBDC3MkvMNM0CxthvEsHJGOv89re/9f+m7Ik+hEokWcw0zUqu6f17n//FxG46nqEiQT/unP0J9j7/\ni+kOJelmRvvhn5tGWX0LONcxfOcKBZfmwQBWUtMEIWI0O9LPAKB+xyGU1jalO+SEmLzbiZmRfrnj\n+C9kfGYkIvReei+wNDfl4ZreS0Q/45p2UAprZ0FZDbM73drUYJcGoNwwjOl0xqpmbWU3iSyavrtR\nus0e39ApsJT2WlvJVlrThNKaj5ND6xPPMCklZkf6MDNyV1pWlDPGoek6Pr1/RyabGx8URVX1GZ9E\ngPiEkZaDJz0gwtz4YEssEm5x5uUjr7AUut0BAIgEl4IL02M/OPXqa35hxYwHbfiVCiqRZDeZFfNd\nE0Sz2VFW1yLunHlTyy+tEs37j2X9NNj7cc5RVr8VwSUfmx8fQv2OgyisqE3azKZUk1IiEvTzojWK\nNGaSldmHJTWND/z3mtY9bq5pT8SiES3gm/mfAfzr1EYYlxWZW3koyuSV3MlQ175fq99xEMHF3Nxd\ndWl+GvNjg2zb4c+gpKYxa5IIAPgmR8A1Dc5VyspnG2dePhr3HHHUtu3VGePfNk0zLdd01SLJblK1\nR34eSQkpLC6lzJpB5tVIKeGbHMbS3DTmxweprKFVOvPys641NjPcJwsr6sBStUPYJuLOL4LN4XRE\ngv5nAbyd6vOrRJLdJEA590u1lpKaRoz33WI33/s7NO07Bm9RWbpD2jApJYbvXCbf5CgVlldxZ14h\nSAr4pkZlOLDENE2H3eWWzfuOad6SiqxLIgAQ8vtQ1bIj++8MHqKsfmveeO+tX0caEknOvug5Qg22\nPwDjHI17jkDEohjtvJbucDZESonOj94SN975IS3NTKC6ZQe3olExO3pXzo8PyfySSt6y/zjb+fTL\nrO3J5zVvSUW6Q04K//wsSAqeV1ia7lDSprhqC5NSvGCaZmK31HwEqkWS3aQaa3+wvKIyVDZtl9PD\nvUAG31ANd1wmKxrlbYefZ05PPhhjKKvfmpUtjtVMDXYhv7RqXUUas4Vud8BbUiEWp8e/BuBPU3nu\njP0FUh4JEUi9xw9RWtfCRSzKrWg43aGsi5QS8xNDaNj1BHPlFTxy4cZsFPDNiKLK+pxNIivK6lo8\nmm77Z6k+r7rIZDe59kNyl6br0HQb7t44n+5Q1iWwMAsAzJPD3TlAfKGpFY1o+aWV6Q4l7fJLKgGg\n0TTNlG6BqRJJdpNq+u/DaboNzrwCsVrF3M1s6m4nCsprRC63RABgvK+DiCS4pnrqGecoqWnUGdd+\nLZXnVYkku5GatfVwRBIB34xmRSMZOZIU8i9Y+Vk6A+tx5JdWMMY5xnpuqhY4gOLqBhtj7Oumaabs\nd1+l8OymfrFWwVj8PkpKsWmSrZRypcsKnOuIhvwoKK/Gg8aQrWhE8xSUpDrETae4agucnnx0ffQW\nzysqRUFZdbpDSiuXtxC6ze6KCuspAGdTcU6VSLKbmv67Bk9BifTPTfFoOJjSarEPMjPch7HeW1IK\ni6/sHcM1jYY6LlHbE89xZ17+Jx7PGFvZzSXnufOLUL11N+5eO4vKlh1UXt/KVirw5hrGGEpqm9yT\ndzu/gRQlElX9N8uZpkn7PvvVnJ7Rs5rlCqsyGg6yHcdfSvmLND8xjJHOa8KKRTTOOapadlJZXQtb\n2VqYiDDafV1OD/Xw6pZdqFje2XBufAhDty5g1zNfzKoyJxvlmxrF0O1LUkrBG3Y9mVUFKR9HJOhH\nx5k3l0iKEsMwYsk+n2qRZD8CEYNKJA/EGENd+wHeceYN3Dn7E9F+5HMpvY0d7bkhiiprtfKGNtgc\nTrCVLR7vi6+2bS9nYJgZ7RdlW1q18Z6bmB7qQf3OJ1QS+ZTC8hoUltfw6aEe3L1+DsVVW0T99gMa\ny4FSOPdzuPPgdOdRyL/wGQCvJ/t8ufXq5iLGBJEaKlmNMy8fVS07EVryaSOdV2FFIyk5r5QS0oox\nl7cQdqf73pjNp4lYFJMDnYiGAtqNn/0N5iaGqOXg0yiuqk9JnJmorH4r2g4/D9/kMPdNjaY7nLQo\nqW3O13Tbt1NxLtUiyXIMTBCRep/XUNnUDhGLisXZSTYz3Mfrdz6RtAv13PggRjqvSpvDzRnjrGiN\n82g2Oxr3HAFAcBeUwO5052Jdwsfm9haioLwak3fvyKLKupy7aS6qrMNo97UXTNP0GIYRSOa51AUm\n2zFINQ62NsY4arft0wBgeqgXo11XRXFVclZKzwz3w51fzDXdLsq279cepapHUWVdMkLJepVNO1jH\n6deZlOJ9ov7CAAAgAElEQVSBM9+yGouvlbKikaeQ5EKOOZelc4/q2npcNocTeEg3UyJ4CophxSKi\ncc9hLZeLDKaC0+OFbnfI+fGhdIeSUr6pUXR8+HpICutPAXyQ7POpFkmWY4CEapE8lmg4mNS71+Lq\nBkwN9eTY7XH6eEsq2VDHJfgmR0Rt+37N4fKkO6SkEVYMwx2Xw76pUZ8U1i8ZhnE6FedVLZJsx5gg\ntb3VI4uGg/BNjpDLW7jqhV7K9bfyouEAiCSksNZ9DOXRNe4+zFqfeBaxaIR3nH4DkVBShwvSZmlu\nCrc//HHQNzX6V1JYralKIoBqkeQC1bX1iKKhADrOvAHNZpcNuw//XCKRUmJ29C7Gem6QiEWZzeEW\nBWVVmju/CA6PF97i8kc6j6eoFCDCeF+HrGndrW7mUsBTUIJth59n3Rfekf1XPkTrk8/xbJk6LYXA\naPf16OxIf0BK8T8ahpH06b6fphJJ9hNqsP0RMQ4ioGX/09qDVrmP9dzE1EAnSmqaZFXzDm1pfkqb\nHekXS3NTLBYOcqZpsqS6kVe37n7oFr6BhVn0XHqfvCUVVFbfopJIirUcPMk7zrwh+6+dEVsPnsz4\n7sXgwhz6r58NWNHIe1KKf2QYxmw64lCJJNsxJtQYyaNhnIExhmgkBJe34Of+3WZ3wOZw0ZadhzQA\nKHE1oKS6QQMAKSwszEzwse7rNDc+QPkllVwKgfKGNuQVxQfU/b4Z9F89I4sq61C//SBXU3hTj3OO\nii2tfKznJoQVy9gFnSQlxvs7rMm7nWEi+U9A9OeGYaTtF10lkizHVNfWIyEi9F85LZ15+SgorXxg\nS0EIAZvTJQH83J0s13QUVdSisKyazYz0Y3F2QnBNQ8+l9zTONRJWjAEEm8PJ69sPqJI1aVRU3YDx\nvg555+xP2PZjL2bcporhwCL6r50NREOBayTF1wzDGEl3TCqRZD/VtbUGKQSGOi7JcHAJu05+4aHd\nTQwAW6MGJuMcZfUtrKy+RQPiCWppdoJZsSiGOi6TFYsy3/QYiipqE/sklEem6zbsfPrz/OZ7f0+D\nNy+Ixj1PZUQmISJMD/XIse4bYSL6l0Tyu+lshdxPJZKsxyyVSB5OWBa6z78thRVD+1Of5avdnXJN\ne+zZWowx5JdWAQCKq7aw8b7buHvtLAo/8w+Qa/WfNhPONbjzixANBzPiTbBiUQzc/Cjkn5u+K6X4\nsmEY3emO6X4Z8SIqG8BgQXVtPdTwnctCCIu2H3+J29dYX6DbHZAitu4+KcuKYaLvNrzFZVIV0Uy/\nquadLOCbYX7fTLpDWdXC9Bhuf/jjoH9u+s+ksPZvtiQCqBZJLhBSCEgh4vtbcK7uhJfNjt4l3+QI\nj/eTr/2aMLANzVvgYADjqGhqVwPtm0BeUSl0u4P6Ln/Adp38wqbbqlcKCyOdVyNz44OLUoivGobx\nXrpjepjN9copydDRc+m9HWDMAoC8wpJw6xPP5aU7qHTzTY1iuOMya9hz+JE3tOI2HbSB3RS5rqOi\noQ0DN8/TrhMvM5XQ02vi7h1IIRjjnHovf0DN+45xzWZPd1gAgOCSD/1XTwesaORtKcSvGYbhS3dM\nq1GJJMt98+u/9tWV703T3B4JBj5KZzybQSTox8CNj1Dbvh+F5Y8+6K3p9g1vy1u9dRdmRvrINzXK\nVCHG9Jkc6MJE3220HHgabm8R6zr/tuw4+ya1PvEcS0YJFZISM6P9iEXCcOcXoaC06oE9A0SE6cFu\nOdpzM0Qkfx1E/3mzDKivRiWS3BIlopzuU4kE/ei++C7ll1aitLbpsV4LxjgSsSanIL7xkiiqrMuI\n2ULZZnqoF+O9N9G87zjyisoAAO1HX9D6rpyWned+yhp2HUZBWVXCzielwN3r5+TizAS3O91i8u4d\nLb+kkup3HGQ2h+ve46LhEAZunAsGF+f7SYovGYbRl7AgkkwlktwSI5I5mUiIJCb678iJ/js8v7SK\nmvYeXUe/UmJeuqrmnbj94X/XYpEQ7r+QKMk3M9qP0a5raNp3FN6Sik/8W/P+Y3ys5ybuXj9LxVVb\nqLp1N9fX2dUVDQfRee6nICKQlNBsdtpx/Bdgd7q1meE+DHdeZR1n3kTttn1weryIhoIYvHUhBKLv\nSCl+zzCMjCrEphJJbokiB1skS7OTGO+7LUP+BbQcfBreorJ1DU5wXUMiplLbnS7YnR4xNdij1bTu\n3vDxlEczNz6IkY4raNxz5N6U7E+r3roLxdUNrO/KB7Lj9BtU176fFZbXPPIEFWHFEFyYw2j3ddJt\nTqrbcYADgKegRFuZ0FFa14zimkb0Xf5ADHdc5lJYDIwRZ9p1KeVPMi2JACqR5JoYkcypEd6QfwF9\nVz5Eflk133HiGHR9/YOpum5DoqoEVG3dpQ1cP4fS2iY43Dk/9yHp5ieGMXTrIhp2H0ZBefWqj3V6\nvNhx/CVt8NZFGrp9kfzz07Kuff+9bkgrFoWm2z5RnSAWCWOo45JcmB7jmm6TNoeLWg8/p+kPKcHC\nOcfWQ/FaX9FwCIH5aSas2OGRrqtvmab5PxiG8XcJeeIpohJJbokSUc70yxMRpga7pd3toaa9Rzb+\nvBM4Zbe4sg5zY3dl75UPWPO+48zp8Sbs2MonLcxMYPDmedTvfAKFj1FRYMvOQ0y3O7A4M86A+Ocp\n7F/AnbM/QUFZtSyubuDRUAD++WmxODuh2Z1u2vn0F2B3OB/rZs3udMG+vN0y49wx3Hn19wBkVCLJ\nqbtTJXcQEe7eOCd8kyNo3J2AJAKA6zbQBvYh+bSmvce4w51Hd87+BL2X3hfhwFLCjq3ELc5M4O61\n06jZto+Kly/Wj8OKhmHForz38gfi2lt/je6L7yKvqIwsK8ZGuq5Zs2MDEoxp7U99DjuOv6TZHc4N\nxVtYUQuSYrtpmoUbOlCKqRZJbmEANv1UwkQI+RewOD3Od554ien2jf1yf4yQqAF3IN690bL/BLei\nUfRfP8PunP0JSmoaRE3rHi1Tq9JuJkuzU+i/dgY1rXuprK55XW9cZdN2LM5MCBGLonn/cUSCSyip\nbV5ZwJrw6+fy+86ScexkyqhglQ3LmYF2m90JELHAwhwKylbvE0833W5H66FneDiwhL7LH6Bz9i1q\nP/I5xrWc6YVMuKW5KfRd/QDVrXuorL5l3Z97hzsPu05+4b43ojIR4a3K6SmIRoJLP3jl1Ks+AO9I\nYX3fMIwF0zSPAugD4ANQD+BlAK8YhrGQ9KDWoLq2ck5u5BKbw4mqrbtp4OZ5uZFtce/HuQ6AEjJz\n60GcHi/aj72oSSlopOuqSMpJcsDS/DT6rnxI1Vv3UHn91oz7wG89dNJT177/RFl9yxd0u+P3GedT\nr7z6ag+A0wDGGeezXNOuA/j3AL6e3mjjVIskt2TcL9VGFFfVsdHua0xaMXC7Y8PHW5m+SSTBWHJa\nC5xzbD14knee+ync+UUoqWlSe5c8Bv/8DPouf0BVLTupfMvWjLxR1m12lNQ0AgBqWve4hRVDYGGu\nxZWXD67pELGYOxoJovv8zwDgv6Y12GUqkeQWjTHkTCngwMIcdN0udbsjYRcUxlh8wD2JmyE5PV7U\nbtuH4Y7LEJYlKxraMvKCmGr++Vn0Xn6fqlp2Uja9ZppuQ/59iyc13Qbf1Ai4pv/wW9/8xmQaQ7sn\na15s5ZHYGeM5k0jyCkshrChfnJlI4FFZ0rq27lda24SWQycx1nOTz40PJf18mS6wMIvey+9RZfP2\nrEoiD2NFIyCSU+mOY0XWv+DKJ9gZ4zkxawuI75EOxpFXWJq4gzIkpN7Wo/AWlaG6ZSeGbl+ksZ6b\nUm1Q9mCBhXn0XHyPKhvbqbKxPSeuacKKxUjKr5imuSXdsQAqkeQaOzjLmRaJ21sEkATXE9mDm5oW\nyYqKxm1offI5Nj3UywZunFMD8J8SXJxHz8V3qKJxG1U2b8+Z61lJbZPNU1hazDXtv5ummfbSCDnz\nwisAAALl1oB7oi/68TGS1F7P3d5CtB1+ns1PDGtjvbcQ8i+m9PybVXDJh+4L71BFQxtVNe/IqWuZ\n21uIlgMnNE9haQvX9HdN00zrRio59eIruVP9NxoOouv82+QpLE3oVZ8xRjLFiQRYHoBv3w/f5Ijs\nOvdTTA/1kohFUx7HZhFaWkD3hZ9R+ZZWqmrZmZPXMU23oeXACafLW7gDwLfSGYuatZVbYrlQ/ZdI\nou/Kh9Lh8aL10DOJnV7FGEmxsc2t1qu8fivK67dy39QoBm+ex/Cdy7C78qhx95PMk8hxoE0u5F9A\n14WfUVndVqreuisnk8gKxjgc7jweWJh92TTNcQBvGIYRTnUcOf0m5KDE1vjYpKYGeygaDqHlwImE\nf74ZUt+19WmF5TXY89xX2N7P/AMUlFWxnkvvI7S0qXdiTZiQfwHd539GpbVNOZ9EVpTVtzjsTvdJ\nhzvvz7imv2+aZnGqY1AtktwSzYWurYWpUVlQVqnxZKz1YAxSbI4xb8411LXvhxWN0J2zP2V2l5uq\nmnewwopaZGOtruDiPLovvkOltc1U07qHq4WacZ6CEuw88Xnn8k6Me5ZmJ2+YpvkvAPw3wzBS8mFV\nGT23BEnKrL958BaXawHfXHJ+gRiINlndy8Y9T7Hdz3wRxdUNbLT7hrzx7t8isDCb7rASKhxYQvfF\nd6i8vo1q2/aqJPIAnGto2nvU0bD7cI3d6X6Vce1HqRqEV4kkt4SJSM/m9QjhwCImBzpR1bQ9KUvP\nGVjK1pE8Dt3uQHXLTux+5ou8uLoRvZc/QDQcTHdYCRFYmEXnuZ9SaU0TVW/NzYH1R8UYQ2F5DdqP\nfM7lKSh+GmAB0zSfSfZ51ZuSQwzDkABEonb524zmxgZhc3qouKYhaefY7Il4y46DcOUXye4L75Cw\nYukOZ0P88zPoufgeVTRuo5q2vep69Yg0mx2tTzzrbt5/XOea/uNXTp36o2SuN1FvTK5hTG7GO+pE\nySsqhYhFkvcEWWoXJK5Xy/4TXNNtsuP0G7QwPZbucNZlaX46XjureQdVNe9Q3VnrUFBWhe1HX3R5\nCksNrmk3knWerO8vVz6JgWV1qY1IKABNtyXzCVImJGLOOdqPfE4b672Nu9fPUX5ppWzc85TGWGbc\nOy7NT9+r4psLtbOSye5yo6SmybE0O9l46tXX7ghh3QbRHwC4CeApAB9sdFBeJZJcw5DViSTsX5J2\nlyepO0Jl0qtX3bIDpbVNrOP069w/PwNvcXm6Q1rT0uwk+q6epqqWXahoaFVJJAGKq+pRUFaFgG92\n22j39a2hJd8v3vfPzwJ4dyPHV29SzmEym8dIvCXlPLg4n7QnyNjmHGxfjd3pgqeolIbvXCEprHSH\ns6rZ0bvovfIBqlt3o6KhVfVlJZCm25BfWon2I5/Tdj/7ZeSXVgrG+BiADzd6bJVIcgwDRKZdCB9H\nQVkVGONsarA7aefIxBZd877jXMSiNHjr4uZYBPMAM8N9GOq4jMY9R5CJOxtmEk3T4ffNxojkZw3D\n2PDdhUokuSZLu7YCvlncvX5OjHRdk8VV9Wx6uC8pF8x0FG1MBM45Wp94lvumRrXZsYF0h/Nzpod6\nMNJ5FU17j6CwvCbd4WS9if4OC0RXAdxJxPFUIsk5TGRbIgn4ZtFz6V0IEdP8c9OYGuyGt6Q8OZ/t\nDJm19SAOdx627DyEoVsXEQn60x3OPZMDXRjtuo6mfcdQUFad7nCy3sL0OCbudgalsL62vCRgw9Rg\ne+7Jqum/0XAQvZffR9mWVtRs3Q0AXEoJznlSukYY4xnZIllRXLUFM8N98u71c2h78jnOeHrvJSfu\ndmKi7xaa9x+H977tZJXkmBrsiY11X4+RFL9gGEbCtt5ULZLckzV9z1Ysir4rH0pXfpFcTiIA4t04\nycIYY5naIlnRcvBpHg0H0HftTFpL0Y/13sZE32007z+hkkgKWLEoRruvCynFEcMwziTy2CqR5Bgp\nhceKRtIdxoZN3u2kG+/+LcBALQeeTtnnmDHO0rEfSSJxrqH10LM8tDhPN977eyzNTqY8htGu65ga\n6ETLwaczYkpyNpgdvUuc858YhnE90cdWXVs5hmva9Wg4cNiDknSHsi5EhKHbF+X8+BBv3n8cBaVV\nSV0z8nPiO1ul9JTJ4MzLx66TX+DjfbfRc+k9uAuK5daDJ3kqqgaPdl3H9HAvWp94Bu78lFc8z0kk\nJaYGuoLCiv3fyTi+apHkGMb4/KP0zEgp41+WBcuKwYpGYUXDiIZDiIZD9/5/cHEe0XAQ4cASpJX8\nNQrTw700Nz7EWw8/j4LSqqSf79M451mRSFZUNe/A7ue+Aisaoa7zP0t6bS6VRNJjdmwAQljdAM4m\n4/iqRZJjiKhi8NZ5DN48v/I3H6/UfmiGYSv/xb9f+RkicE0DEYGkhKewlNqefC5pYzBWNIKx7uus\ncc8RuL2FyTrNqhjnkFJk1QZhum7D9iMvaLdPvy77r52lpr1HuaYn/tIw2n1DJZE0iEXDGOm8GpLC\n+rZhGEkZ4FOJJMcwYKC6de/+kuotwHIRvHvF8BiLl0ln8Uc+TpG8u9fPyoWpMS4tCzwJFyErGkHX\n+bfJmVcoC8urU9uddR/GOUjKrEokAMB1HW2HP8M7z/1Udp1/m7Ydfp5xLXHv41jPTUzevYPSuha4\nvEUJO66ytuGOKyGAThmGcTlZ51BdW7nH4poGzWaHptug6TZwTY9/cQ2MczDGHyuJAEDD7sPcmVcg\nB25dSPgdjxWLovfyBySFoNYnnk1bEgEAzrSVFknWsTtd2Pn057m0YjTUcTlhMwom+jswNdiNqq27\nMDc+SH1XPpTZMOEjEyzNTWFxZiwghfiXyTyPSiS5J2nrK+p3HuIL02MsuDifkGOSlJge6qFb7/8I\nUgrZfuQFnsypvY+CcQ7aJFvtJgPnGlqffI77Jkf41GD3hhPm5EAXJvo70HLgBKqatmPn8c+zWDRM\nt0+/jsWZiUSErDwEEWH4zhW/FOI3DcMIJPNcqmsr9yTtbtrtLURZ/VbZd/U07Xr65Q21HMKBJfRd\n/ZBENEr1O59gxZV1aW2JrIh3bWVni2SF3elG877jrO/qh7Q4My69JZU8v7QSTrcXj7OAcXqoF+M9\nN9G8/zjyisoAALrdjvanPqtN9N9B/7XTKK5uFLVtezWubYq3N6vMjt6laCgwCuC/JvtcqkWSY4jI\nn8yV2dVbd3IQ8dGu9U9VDyzMofPcT+HKK8DOk1/gxZV1CYxwYxjXILNo1tbDeEvKse2pzzLd5uCz\nI/2i66O3cf3dv0XIv/BIPz811IPRrmto3Hv0gYsNK5vase2pz2Fxeox1nHmDQku+RD+FnBYNhzDS\neTUshfXVRJVBWY1qkWQp0zQZABsANwDPyp+McY9MYtcM5xoa9x5hvRffQ35Z1WMvNiMiDN48L4uq\n6vmWHYc23YA2jw+2pzuMlHB6vGjYfRgANAAYuPERdV94h9Vs3Y2S2qaHjqNNDfVgrDteOyu/tHLV\n428//hIf7rhEnR+9jeqWnVTe0MbUTogbN9J5NQTQnxiGkbRdEe+nEkmSLF/InwZw2TCMpXX8fDGA\nVgANAGq5pjUzrtUD8GIlMRC5iMgJwAaQRgQOkAaCFv87gHHN4pxbjGuSa5rkmkbuguROvcwrLEVl\ny07Zf+0Mdp38Auf80bstAr4ZRMNBtq19fxIjXD/OtYyutbURDbsPs/5rZzHceQULM+Oyed+xn+vR\nmL6XRI4j/xHKnnDOsWXnE6y4qgH918+Qb2qEGvcc4XanOynPIRf456exOD0WklL8XqrOqRJJ8rQB\neJcxHjv12ve7pLB+RFK+DmAUy3d4y382AKgFUKPptt1gbLsUVj3j3GZ3eUIOt5c73HlOu9Ntszmc\nH8+w0rR7M6045/Gpu8uzrRhj4Jq+0p9tX/5KqYqGNu6bHJb9V8/IlgMnHqkLNRYJY7jjiswvrWKP\nk3xSiWkapJQ5e8vctPcIouEgbr3/I+6bGv1Eyffp4b57VXwfJYncz1tSjl0nXua9Vz+UHaffwJad\nT6BoE3VpZgoiicFbFwNSit8wDCNlJZ5VIkke3e50L24/9mK+3ze7c2l2YptvcuTXRSymgbH4YC0D\n2Z1u6XDl6XaX2+lwezWnxwuH2wvd7gBjLOUJIFEYY2jc/RS/c+ZNfPqC8yDzE8MYvHUBrrwCath9\neNOO3XHOkc07TD4Ku9ONquadGLlzhQrLaxgAzIz0Y7TzKhr3Hl21O2s1XNfReugZPjPSj8FbF8g3\nOSLrdxzUUlG2JVtMD/dRLBq+A+AvUnlelUiSR8dyyyC/pAL5JRV6Teue/HQHlUoOdx5q2vbQ4M0L\nlP/0y/xBCxWJCKPd1+XMcB+va9+PkprGzdkUWca4BsrhFsmKioY2jPfdYtNDvZJpnI/cuYLGvUdQ\nULbxsjWltU3IL61iPZfexe3Tr1PLvuMs2d2x2SAWDWOs+0ZYCuvryVrB/jCb9s4vC2hspeWRw0rr\nWpgzz4u+62d+7jZeSoG718+K2dG72Hb4MyipaUxHiI+Fcy3nWyRAvPVQ3rANw3cu85GOK2jccySh\nm1LZnS7sOPYLWlFlHeu68A4m7naSet1XN9p1PQzg+4Zh3Er1uVUiSR4NavYJGGNo2P0UD8zP8Omh\nnnt/T1Ki/+ppGfDNsh3HfoE78zKjsca03Jm1tRZ3fiEY1+I7G5YnZ2fDum37UVLTiIm+26zz3Fsy\nHHjseSs5wT8/Dd/EcFgK61+l4/wqkSSPxrKrHNO6OVwe1O84hNGemyQtKz7F99YFEVz0of3Yi1y3\nO9Id4iPjjGfsVruJ5JsaxdCti2jY9eS6x0QeVSwcFM68QrI73ezO2Z9garCb1HvwMWHF0H/tbFBK\n8Y8Mw3i0hT4JpsZIkkdP9zamm0lRZR1mhnqp//o5cucXYmF6jLcffZHpmTaQqlqZ8E2NYuD6OdRt\nP0hFlXVJf0GsWAR5hSWsdts+LMyMY+DGR+SbHKHGPU9xm8OV7NNvemO9t6JSWD82DOPv0xWDutIl\nT34ySnFnKsYYKlt2cP/8FJ8a7GZbDz3D7E51Ecg0vqmx5SRygEpqGlKSVTXNhpUijwWlVdh14mVO\nRLh9+g34pkZTEcKmFfIvYGa4LyqF9RvpjEMlkuSRqvX9Sb7JYaHbHXL7sReZOz9DS4nHu7Zyslmy\nMDWGgetnl5NIY8peg8DinFZS03Tv/3NdR9uTz/GarbswcOMjGrh5XogUbKq22RARhm5dDIDodwzD\nmEpnLCqRJE9Aitz7cD9MLBLG7OiA1rjnaEavWtZ0PWcH2wdvXZDVrXtSmkSA+MSMWCT4c39fVr8V\n24++wAK+GXScfp2CC3OpDCvt5ieGEPIvjBPJP0l3LCqRJE8kV0tpPMjS7AR0u0N4CjK0JbKMazqI\ncm8diW9qFESSl9U1p/y5l9W3YLTn5gOzt93lwY7jL2mFFbWs68I7GO+7LXNhmrAVjWC443JICutX\nDcNI+x2r6sRPqpy73nyCFAKDty4I39SoBiKU1DZt6sWGj0LTcrNFMt53W5TUNjOW4g1hrFgUxVVb\nMDXQzZfmph5aBLSufT+KKreg/9qH8E2Nyqa9R7nD5UllqCk10nUtTER/ZhjGR+mOBVCJJClM0/wc\ngC+lO450IiL0XHpPxsIhtBx8GlKIx64EvBlx3ZZz038tK4qwf1Fr2nMkpecN+Rdw58ybsLs8IJJY\nq1RKXlEJdj79Bd5/7bS8c+ZN1G8/gOLqhtQEm0JLc1PwTQ4HpBC/le5YVqhEkmCmaZYCeLOisV16\ni8tztuswFgkhuDDL9zz/i9isBRjXQ9f1nFvZPtZ9Ey5voXS481L6eSYiMMbhzi9G3bb9eJQJGpxz\ntOw/wefGBzF0+xL5pkbllh2HNM2WsWXrPoFIYuj2pYAU4p8ahrGY7nhW5OyFLonCAGQ0FAjHouFY\nuoNJl/G+29LuyhPZlESAeIsERDnVKvFNDsuKhraUXytcefnQdBuKKusee+V8cdUW7DzxEgv7F3H7\n9Bvkn59OUpSpNT3UK2PRUBeAv053LPdTiSTBlks3f2V+YugvJvo6wumOJ9WIJGbHBjA3OsCb9x/P\nriwCfNy6ypFE4psaAUnJ16renAyMcbgLisXizNi6fl63O7H92ItaSU0j6730Pka6rkmZwRNgoqEg\nxnpuRKRl/cNUF2Vci0okSWAYxt8B+G7OXG2WiVgUnefekiOdV2X11l1werzpDikpGGPI5AvS4xjr\nvS1K61pkuqo0lNQ0agvT4xvqS6xp3Y22w5/B/MQQ3TnzZsZu6zt053KQCH9oGEZnumP5NJVIkieW\nS7N7YpEQBm5dkFII2nXyi7yicVu6Q0oexnJi5pZlRREJLGmltU1pu054i8shrBifGxvY0HFc3gLs\nOP55zVNYis6P3sbE3TsZNU3Y75uBf24yRFL823TH8iBqsD15ZC40R6xYFMMdl4VvakSzu/Jo66GT\nWopniKYBAyH73910DbLfLxoOxL9JQI0zzjkadj3JSmoa0X/tLHwTI7Jp7xFu3+TThKUUGLx5PiCF\n/E3DMELpjudBsv03Pp0EcqCUxvz4IBZmxnn70Rex49iLWiavWlc+KV2D7Pcb671FnGsorEjctrve\n4nLsOvky1+x2dJx5E3PjQwk7djJM9HVYsWj4PEB/lu5YHkYlkuSRuXDXml9WDZKC6blWoDLL31rf\n1FjaBtnvZ0UilF9WhUS3cjnXsPXA07y+/QCGbl+k/mtnhIhFE3qORAgszGFqoCsoLetXN9sA+/1U\nIkkeCcr+pe02h3O5FlIk3aGkDMuBMZLx3luipLY5bYPsK1z5hSRF8iY2FNc0YPvxl1g4sITbp1/f\nVNOEiQjDdy4HJMnfNgxjfVPXUkQlkuQR2XjbKqwYxvs6aG58COHAEnouviftTrdweQvSHVrKMMYo\nmwtyWtEIwoEFrayuOe3Xh7B/EckudWJ3OLH96AtaSW0T67n0PsZ6bsrNcKMwM9xLYf/iIIhOpTuW\nta2fFvAAACAASURBVORYf0RKyWwsNz7SeU34pkY4wKSIRbinsBTbj76YdetF1pJJM34e12jPDbjz\ni4XDnZfW95WIEPL7tNpte1Nyvpqtu1FUUYfeyx9gYXosXq/LnZeSc39aLBLCaPeNsBTWVzdDUca1\nqESSPFnZtRVYmGGVTdtZRUPbynNL+11ryjFG2XiTsGJhclTW7TiY9puDxZkJgEAub1HKXmt3fhF2\nPv0y7796Rt45+ybqth9ESRrqdQ11XA4B9J8Mw7id8pOvQ+5dBFJHZmPXlhWNMpstc/ZYVx7P/MQw\niCQvLHu8kiTJMNZ7U5bWNqe64HC8XteB47x+xyEMd1ymvqupHYhfnBnH0uzkohTi36TspBukEkny\niGy8a80rLJXzUyPZlyEfW3a+BBN9t0VZXQule5AdACKBJV5UtSVt51+p1xUJpm4gXgoLg7cuBKWw\nvm4Yxs/v5rVJqa6t5MnKTnR3YbE2NzYgAKS96yOdsrH4TTQcQji4pDXXtaQ7FIT8iyAp4XC50hqH\nbo8PxI9230DPpfdRWF4jGeckhSAg/p9ms7Pqrbs0m8O54fON93XEhBDvGobxRgLCT5n033ZkL4ks\n3NlqfnxYFpTX5HQSYWBZmUnGeq4jr7BM2F3pXVRKUuLutTNUWFFLun3jF+dEqGndjdYnnoOUgpOU\nGtc0XdNtumaz6cGledZx5g0szW1s2/SQfxFTg91RacWMBIWdMqpFkjxZNWuLiLA4M45wYJE3HziR\n7nA2gexLJAvT47Jh1+G03yRM9HdIKxbFll1PbqobXU9BEZr3HXvQP/Hx3tvovfwBKpvaZWXTds4e\ns6QLEWHw5vkAiH5ns68ZeRCVSJJHAJmbSIgkpga6aXKgCyIWYUQErulU3bKT2RPQhE8FKSWkFYUV\njUKIGKQlIIUFIQVIWPF/FxYYY+BcA5GEFAJSxr9ICEgpQVIsT/dlYAwQVpQPd16D3eH6xGOJpCQp\niYjw/7d330FyJfed4L+Z+cp2VXvvG91AN4CG94OxxMyQQ4qUtBLF3ZPuguQMXuzeKlbcuzUXt6s9\nE7GrXW0E96SQTnsPY6gLUjpJJJekqBmRMxiLwcB7oL33vrq7fL3MvD+qG4PBwDXKvDL5iSh0obvq\nvV91VefvpZeQkqwtELW2woGUQkAKQShjcq1VBPF/b7eSoLiqjjR07L1dmA9e/jjm980zxI8JSEnW\n9kIhAOLnEpxQFv9T9pRWmm17n9IWJoYwcuMcWvc9g6Ly6of+rhYmhkAIIYXlVUl9DzYquLKE6aFu\nuuXgc0mfzZ5KNW3bUVhRjf6LH2J1YUZs2n2UavZHH5SyODmMcGBlVErxJykMM2VUIkmdrBz+KwSH\nb2YCEz1XpJRC1rbtoMVVdaCaHZTSrHk9PWdPmgHfvAZCQCkFIRSEUkkIBSHk0/uUQkoJKUX8+4RJ\nQmn8OZSCUCbXnk8AIYUEiirqCKEUlGmwMUYo0yhlDJQySiiLF4DkjuYvEv8nGgliuv8mmnYcWvtg\nEICQtfMSLM9NYXlmkjd07L39Ovy+eVrV0kE9xWUglCEe2+08Q1bmpzHWdQlbn/giBq98LCLBVU2Y\nJsZ7rgibw0nHbp0XBYdffGihNj3UxSsaN5P467SGGY2g/+KHKK1pQkFRmVVhPLaCojLsePqrtPfC\ne/zmqTfRuucpeErKH/o8MxbFePflkODm/6DrelbuT6ASSeqQbEgjkaAfC5PDMri8KIIrS5SbUcI0\nOy9vaGW1bZ1Z8AruLRoOkk17nsRda0WR+9xPCzMawXT/TazMT3O70426LTs/24xECFYWpu/6FoHL\nU4SC4nsXSGX1mzDZd10EfAu0unU7Hbt1UV45+SPiKPCS9oPHMHj1NK5/8LdwF5bwzQeeu+fKzJGg\nH9FQgJXXb0rei90gKSVGbpzjmt1OGrbty56qyF2opqHj8Atsou8a+i68j5q27aKqueOBTV0TvVcj\nUsq/1HX9QhpDTSqVSFKHIMMb0oOrPvSeeQeOAq90F5aw+o7dKCgqg9UzmpNBCk60DNunW7M7UNXc\ngVgkxGaGulDb1ok7h9lSSu/Zif+gbX0ppSipaaRzo328/fDzrKSqnsSb6yghlGLLgedocGUR3Z+8\nzcZuxcupwvIalFR/uprueM8VWVhWLWwOl2Xv+9LUCFaX5mjnU19J+7yRVKjbvBOF5TUYvHwKweVF\n0dR5kDLN9rnHBZYXsDQ5EhaC/wsLwkwalUhSJ2Ov5lcXZrAwMcSXZsZZaU2TbOo8kP1/ufeUeW9B\nXfsuAMDS9ChGbp7nms2Bui072VozGmKRELt16i2+1h8izVj0oX+jUkopBL/9Hq73l6xzF5aivKHN\nXJoe1exOl1yaHkNBSQWxO5wQQmB1cQate6zbFjkSCmD01kU0bt9PNtKvkOm8JRXYevQl2nf+XX7z\n1Jty65EvkjuHCEspMHL9XEAI8R1d15csDDVhKpGkDsnEgmys6xJfmBiinpIK2n7oGNyF6Vt+Ir1I\nRq+HVdnSgUhglc1ODqNqUwdsdic8xeVo3LYfEpLF+03i/TAP6wB3e4vIwvgAVuanUXifjvXGbfu0\nxm37YEYjpO/C++Lmhz8n7YeOYXVhBppmh6ekIhUv86GkFBi68rEoKClHaU1Tzl3Q2B1OVDZuYRO9\nV3F3A8X82KCMRoI9gPxza6JLHpVIUsfypq34onfLcHmKQAhBNBzC/NgA2/bkS7BqMbo0kpk816Nu\n804AwKVf/jXYWg2CUIryhtYNH6uicTME5xi8fArNu47c3S/0GZrdgY7DL9DhG2d595m3mWZziJrW\njQ9XTZaZoW4RCQWx49CxnEsiABCNhDHecwWbdj0Bm+PTyZWxSBgTvVfDgpvfzOR9Rh5VTr55GcKi\nP81Pjdw4x7tP/wLj3ZcFAIRWl0A1m8iDJBLfMySDE0myVbV0oLZ9F0aun4UZffDeMIRStOw8wlye\nQmlGw7TUgkUJASC4soipgVt0056j9I6RaDmFMgbKmJgZ7hZ3vi/j3ZdDAF7Vdf26ddElj0okqUNA\nrKuRxKJh+GbGWeP2A5gfH6DLc5OYGrgpCsuq8uY9z+SmrXUEyUt4lY2bYXcV8JGb5x9pCGnD1v2k\nYeteca9O4FTjpomByx/LsroWeC1qVksHTbNhx9NfpUJwefPUm/AvzcG/NIfluYmQ4Oa/sTq+ZMmb\nQsUClvaRjN68wB0FXl5evwlltS1y6Opp8FhUNmzfb1lMaZVFuxgms+a0ef8zbHVhhi5MDj/0sZ6S\nclQ0brakDBjrusgJoaJx2z4rTp9W60OCKxo3o+/CB+g99y4E57qu66tWx5Ysqo8kdSzLIiH/Mlbm\np9n2p74MAGjcvp80xhNIbrYf3EO8ZSsLmrYIMDPUDcqYrGruIJQl9hZpdicatx8gozfPoaCoDM4C\nb5ICTR7f7AR8M+N025MvWd36m1a1bZ0wI+HYwuTwheOvvPwjq+NJJlUjSR1LOttDqz4MXjolC8uq\npN1p7eJ71srsUVvrSmuapH9pFtODXSS4kpwRoKU1jXAXl4uJnisZN0s6Gg5h+PoZ1G3ZRfLt8xla\n9WFhcjgiBf8Nq2NJNpVIUietV1sB3wK6Tv9C9Jx5Bw5PoWzZfTSvrvbuRrKkaaup8yBpP/Q8NJud\nL89NYGFiCEIkXv437zhMVxdn6fz4YMZUy6SUGLr6sXB7S0RFo/VL1aebf2keBBjTdX3K6liSTSWS\n1CHpGre1NDOOvvPvwV1YSnc+92to2/sUzYXZwQnJslFbZXUtxDczYY7duoiVucTLGbsj3sQ13nOF\nZEpCnRnuEeHAKtr2Pp2XH06bwwkJFBuGkXMXeXn5hqYLSUPTln9pDsPXzqBx+340dR4A1VS3FwAQ\nQiGTcGWfLi5vMbU5XRoIJOdmUo5ZWtMIQohIx85+DxNcWcJU/w26afdRmq+fUXdRKWwOZxHTbN+z\nOpZkU4kkdUwpZcp+v4KbmB3tk/0XP0RVy1ZYNRcgUxFKaTKaiNJlsu8aZ0xD9abt5EETCjfKXVhK\n+i9+gIBvPmnH3CjBTQxcPhUf6ltaaVkcVrM73Wg//Lybc/O3DcM4bHU8yaQSSeqEpBApufQS3ET3\nmXfk9OAtWd++G7Vt21NxmqwW7yPJ/KYtYZoI+ZchhEBJdQOqN21FMud1tO59ihRV1smBS6cQWvUl\n7bgbMXrrEic0P4b6PozN7kTjtv2MabY/tDqWZFKJJHUYSGr2bZ/ovc6FGZOdT3+VPs6SGvmBpKNl\nMWG3Pn6Ld3/yNqTgzOkpTPrxKaXYtPsocRR4MXjldNp/IfPjA9I3M0a3HHgub4aePwyz2QFCYlbH\nkUz52ViZHoyAJP0Pd6L3Gl+YGGBbDj2fVTvIpRshhGRFjUQItO59CoVlqd2ZsKy+BeNdl0kk6E/b\nOmvhwArGuy6T5l1HkG9DfR+ExyKAlNZ3XCWRKolSRwNJbiLhZgyzIz1sy8FjcHuLk3nonBNfaysz\nRis9CLlzJ8UUKq/bhIKSctlz9h0ZDQc/8zPBzaSPcBOCY+Dyx7KwolYms88nF5ixKIQQOTUEWCWS\n1GGEkKSWZP6lOTDNzt2FJck8bE4SQkiSJQsBpmuY8uZ9zxCb043xnqsCiK93dePDn8sr7/wI1977\nCcKB5K3YMdl7TQgzJpp3Hs65oa6J4tEol4LPWB1HMqmmrdTREp2TOHLjXDAS9KNx+wE3pRSri7PQ\nbPbMb6/JBFLI7NljPn1vaW1bJxm49BHpCQVkNBICALH7hd9kI9fPyu4zvySN2w6gpLoBiSwrv7ow\ng/mxAdp+5AXV/HoPsWg4CiCrN7K6m0okqUMFN23D184EKdOYlEJw0+SCxwQ3TSk4hxAmBOdUCk6k\nEFRKSaSUDFLS+NBh6SaE9t869WYbZdoSAJentDJ3tpBLJUJJNjRtpXtMQFFFLbY9+WVM9l0nRZW1\nqGzcwihlaNn1BJkfG8DorQtyfqxfNu88TG0O14YTihmNYPDqaVS3boPLU5SiV5HduBkzAeTMgo2A\nSiSpNCql+O8Xp0YKAbgAxAAEAATvuK3/PwQgunaLrd2iAMzjx18RhmF0Avi53eW2N20/kCVX2dbK\nls52AJBpHl3mLPBi0+4nPvf98oZWlNY0kf5LH4obH/4ckBJOT5Fo3fMkfZQOeiklhq+fEXZXgaze\ntC072hUtILgpEf+bzxkqkaTI2q5nf5XocQzD+Bql7C8atu4tKK1tTqjJIZ9kTWd7hu3kSDUNWw5+\ngcUncxIMXf0EXad/gbZ9z8DucuNBtZT5sQEZ8C2Q7c/8imrPeoC1RBJ86AOziEokGcwwDDuh9Act\nu48WFFXUWB1OViGUQgouYeWmMHdZmh7D3NhAPMFJASkhY9EIy8Q1wdZ3LGzdc5RO9F5D34X3IYWA\nq7BYtO19mtoczs88PhL0Y7znCmnZdQSaZrci5KwhOAdUjURJo52azUFUEnk0wjQxNz4A3/SYCAVW\niH9xlsyM9K71QUhodiff+dyvWtbkMtl3jTsLCpmrsByEEBBCSUl1AzL9/a3bshN1W3ZCCI7ec++i\n/+IHYusTX7xd65BSYPDqaVFYVkWKK+syJnFnqrVEomokStrscxR4M799xkL+pXnMj/XDvzTHY9Ew\nszsLRHFVPalr30VcniKA0LWmGIlr7/2U+WbHUVxZb0msUkKW1DSitKbJkvMnilKGLfufo1dO/giC\nm6AsXnzMDPeKaCiI9kPPqyTyCITgBKpGoqSDYRg7KGPfrdu8U00JvoMZjWJmpBsrc1MiGgoQKSXx\nllXxms07WGFZNWwO533b5yub2+Vk3w1RXFlvXUdw5rVibUgosApCKMjasN6QfwVT/Tdo296n1FDf\nRyAEhxkJOwGMWx1LMqlEkrkOFRRXEHdRqdVxWC4aDmJ6sAvLc5PcjISZ01skSqobqbesCu7CEhBC\nHikxlNY0kdmhbsuSCKEEgeWF+DyNLC10Xd4iEErl7EgfKSyvxsClj2RxZR28ZVWqNvIIAr4FUKYN\nvfztby5bHUsyqUSSuf424Jv//YFLH5W37nnSna0Fz+MKB1YxPXgLqwsz3IxGWEFxGa9t62RFFbXQ\n7I7H+mU43B5IxPe0t2KOQ3FVPZ0d7kVBUWnWLvtPKUVT50Ey3n2ZT/RcYVSzkaYdh6wOK2ssTY1G\nhDATHs2ZaVQiyVC6rs8YhrHFvzR3bml6bGdpbXa2q29EcGUJM0PdWF2c5dyMMm9pJa/bsosVVdSA\n2ewJ1yQIIdDsDhnyrxArEknd5p3UNzPOheBZPcfC6SmEEJx6y6pEy84jajfODfDNTZhSiJ9aHUey\nqUSSwXRdjxiG8d2FiaE/Ka1tSs+SrWnmX1rAzHAXAr55wU2TFpZX84Zt+1hReTUo05Je4ErBwZh1\n5TghVGbLRMn7mRvpA49FSdvep0m+1ZQTZXO4CI9FXwRwyepYkkklksz3U79v7rszwz1mVXN7Trxf\nq4uzmBnqlsHlRSmESYsq6njT9oPMW14FSlNbyttdHjk/PoiiilpL2vQJkB1LtzxA7eZO+GYnxOW3\nf0jtTpds3fe0JTW8bFRUXuMM+5errY4j2UgmToZSPsswjDZC2dX2Q8fc2bryr292AnOjfTK4siSl\nELS4qp6X1jQyT2nl7clv6RAOrKD7k1+ivmMvyus3pe2867o++aUorWmkVc0daT93spnRKIZvnAWP\nRXn7oWNZ3VyXKgsTQ7C7Cm5vMRxcXkTv+fdmBTer11a/yAmqXpoFdF3vB/Dmyvy01aE8ltFbFzF8\n7QzsTrfctOsJuusLv47mHYdYYXlNWpMIADgLCtGy8wmMd13C6kL6V/LOpjXAHkaz29G4bR+CK0ts\nauCm4GZObfqXsOmhLj568/xK3/n3MNZ1MSKlhKuwBIRSD4BtVseXTCqRZDjDMMiJE6/+a8a0r2Rb\nh3s0HMTw9bNYmBhE276n0dR5kHrLqiwf+lpUWYuazTvk4JWPpZn2wi8+OTJX2J1utO1/BvNjA/LW\nqTdlNBSwOqSMMT82EAbwhwCq58eHfAvjg5IQgsKyKlCm/YFhGDnRVA2oPpKMcuLEiX9ImfZ/SsBJ\ngAvcjJ2nTPuHNoerbdOeJ12UaoiGgxCcQ4p7t7MLISDMKMxYFDwWBTdjEILfXmiPcxPCNCF4DNw0\n4//nHJJzIQSXkDK+Gu36P1IiFglp68+XQq4thkjixyS3v0oCgFAqtxx6njrdHvSeO8mZ5qBVLR3C\nU1KRUU0flU1byPTATYSWl+Atq0zbeaUUkmTNPimPxltSgR3Pfo3dPPWmmBq8RapbtkKzO8E0LT4B\nLxoBY1p8r/I8smn30YKes+/8H5TSAcH5sdGui1c0h1Nr6jzo7r/00bHgytKPAPyq1XEmg0okGcIw\njEpC6F8KIbC2IGwDCPl1wU1Egqvo+viteKGNOwrveyEElFJJKQNhTFKmyduPlQBlDJRpkjINTLMR\nm9NNmGajlDFKKQOhdG0dKAKAgFCGWDgIT2kFbA732vMZIOMjoIQQ61+JFBz9Fz9EcHkBTrcHsUiE\nte17Fs4Cb0YlESA+FJhqNmnGImkt1AmQSxWSz2jcup8OXTstlqZGqRQCTk+hiAT9FJCQQsLpLRI1\nrdtpLm+9G4uEsTw3gaWp0VW/b95BmXZFcHNQ1/WbhmH89uDlU3/VvPMINJvdBsjNVsebLCqRZA4P\nCDG3P/UVjRDyaYFOaXxJio0tH0/u+poajOHuDKHZHXLs1iU5cuM8AUCYlrkfMUKIlPF1j9J4Upqz\nA1y8ZZXY+dyvUSDerLk4NUILCsvgLauEGY1ieqiLDl39BEUVtbyguIy5vcXwlFTcbuqUUiIaCsDu\nKsiq7RIENzE32icXp0ZXw4EVO6XsJDdjPwDw1suvfNO3/jhd1//6tdff2Dd26+JLgps/k1L8kYVh\nJ1XOfqizjWEYx5yeoh9vO/qlQqtjSUQkFEAkuIqRG+ek0+3F5gPPZWyJcPXkjwFAMs3GXUWlpHX3\n0ZTXnLrPnJRFFTWkpjWn+lofWTjox3jXRRkNh2QsHCRSCsJsDim4ScRaf5W3rJq37Xs642qx9yLi\ntfBgcHnxE8HN/wzgfV3XI1bHlW6Ze7mYZyjTfqe4si7rF2h0uArANBvMaITU7X3a6nAeqG3/MwgH\nVgmlTBvruoiu07/krXufZHZn6t4GQkAyaSOrdHO6PWjb90y83RRAYHkBkWCAaDY7nJ5C+JfmMHLj\nfFYkESkFhq5+EgouL54W3Pyyrut5O2xNJRKLGIZhR3xLXTeAr1OmfaO8oS0n3o+l6VFoNgd3e4sz\nukAoKCpDQVEZAMBTWoGxW5dw69Rbsv3w80mfYDd45WNzZX5ak0KgpMqaZewz0Z3vAQD4psfhKS4T\nyPARpVJKjNw4H1ldmLkquPnVfE4igEokaWcYBmOa7fsAvkEZW5JCel2FxeHGbftddqfL6vASJqXA\nVP8NWdG4OaOTyN1sdic27X6CTfReFb1n38WO575GkjnHJexfIdWbtqGkugF2V9ZXPFOmfuse3Pro\nTbowMYSyuharw7knKSXGuy5FfTPjfYKbL+q6HrY6JqupRJJmlLH/y1lQ+LW2/c+QWCRcanO4wDTN\nZnVcyeKbGYfgHDWt260O5bHUbt5JA0sL4vr7P0P7wWPE6UlSlxUhkmk2ONw5uWRa0tidbjR2HsTo\nzfPSjEVlVXN7RtVMpJSY7L0WW5gcHhbcfErX9VWrY8oEKpGkiWEYjDL2h5rd+e3WvU+5mWYDy538\nAQBYmZ/CyPVzqGvflbEd7A9DCMHmA8/SkZvnxfD1s7LjyAtJKchIfIhYMg6V80prGmFzOEn/xQ9J\nef2mjPo7mR64Zc6N9U8Ibh7Vdd338Gfkh4zK9rnKMIwKyrR3nZ6if9x+6Hm3ZndYHVJKzI3288KK\nGlQ0ZvfweEIpSmubaCTkT+JBVSLZCG9pJTSbnS9Nj1kdym0zQ918Zrh7RnDziK7r81bHk0lUjSSF\nDMMoZZrtvxFCj5RUN/DGbfudVi8PkkoFxeVkfnyAA5+bXpJ1YuEQpBAkHFiFs8Cb8PFyaY2tdKne\ntI1N9FxBSXUjrJqPJIXA8twk5scHAv6lOb/g/Iiu69m56F0KqUSSIoZhUMq0vyuubtjbsHWvjVKW\nOfXzFPGUlNPpwVs5UVqWVDdgaXoMw9fOiGQ0b6mmrY2raGzD3Ggvv/nR39HiyjrRuH1/2i5QIqEA\n5scHzPnR/hiAXm7G/hjAj1Vz1r2pRJI6X7I5XJ2NW/fZc7kWcqfJ/hvcW1aVEy+WMg3hwAqKKmqT\n1EdCoSb/blzHE19ivedOYn58gDVs25fSGe+CcyzPT2F+tM/v981TQuj3BTf/WNf1myk7aY5QiSR1\n7HanW+RLEgEAHouhqLwmazva7ySFQDQUIDWtnck5IKGQgkuketmaHBP2LyO06oOjILULPgRXltBz\n5h1OGbvMzdj/DeCvjuuvBFN60hyiEkkKGIbBADQIYebVJShlDLmyJwWhFCAEQHKaowglEEKoRLIB\nsUgI/Rc+QGltC3wzY2Ki54qs79iTtOatudG+cMC3QJjNTpbnJjkIfvDyt791PFnHzycqkdyHYRgH\nABwDcFLX9fMbeF4HpewDzeF0VbVszatJA7nSdCOlQNi/AkiJ0OoyvGXOhI9JCYUUqrf9UQluou/C\nB9LpLRJN2/ez8vpW2nvuHdR37EnaOZbnp7SVuSmNUPZdKfi7AH6ZtIPnGZVI7sEwjMOUsXdLa1ts\ni1PD/+7EiVe/I6U48ShbYzLN9u+rWjoqqjdty7srT5vdgXBgxeowEjY32o+J3qsglCISCiDxMVtr\nfST32UNG+SwpJYaufsIFN9G270UGAC5vEQihsv/CB6J139Ms0b4SKSVW5qY0AF85/srLbyYj7nyW\nPw34G7PF6SmSDVv3ah2HX3TZnK7/QjXbJcMwtj7siRKy3uZw5V0SARBvCsrya24pBQQ34XR7+Z4X\nvn7ffd1XF2cxPz6ImaFuTPbfwHj3ZYzcOIfBK6cRXP10YE8k6MfIjbMILC+Aaiw/PxcbNNl3Xfh9\n86Tj8IuMrvUxUkrR+exXyerSHAuuLCZ8Dt/MOACYAN5J+GCKSiT38cOwf2VhdWEazgIvtj/1FXfd\n5p27CGXnDMN45l5PMAyj2DCMfwQhm3J1wuHDhFZ9xOlN7mKH6bQwOYzLv/wbTPXfhO0B656Fg370\nXXgfM0PdYnFqlK8uzPCwf4VzM2aGAysY7758+7FjXZewND2GwvJqXla3Sf29PcTCxLCcG+0jWw58\ngWr2z+6oqGl2eEoqxHj3ZZ7oeebHB2KEkD/RdT2a6LEU1bR1PyEpxbnA8lJ9YXkNIYSgorGNOAq8\nnsHLp940DON3EU/Cf67rumkYxmFC2S89JeWkpLrBU1heY3X8liirbcbsSK+s3rQ1qQseposZCcNV\nWCK2HnmR4gGTKunaDpLbn/ry5xLDRM8VuTQ9RiZ6r4FQimgogNKaZp7OORDZyr80h7FbF0jTjkNw\n3eeCxFNcThenRhKu94b9KxEp5d8lehwlTiWSuxiGUUyZ9n2b0/VcRUPrZ5oiCsuq0Lb/Gffg5VN/\nSghl3Ix9wzCM/48y7d/Wd+z2lte3WhV2Rqhu3U7nJ4bk4uTIfZuEMhllGmR8r+MH1hyozX7f/o6i\nyjoSXPWZgeUFSCEI1TR4y6pUk9ZDhAOr6L/0Iapb4ysk34+3rBozw92Y6L0majfvoBvpKxm5cS4Q\nWF4weSxGY5GQF0BtEkJXoBLJbYZhbCaU/S5l7HdKa5oK6jv2OCj7/EWkp7gcO5/7NZfgHFMDN56N\nhoJPFBSXu8vqsq/gTDZCCNyFJSLgm2PZmEge1XptS0r5uQlynpIKbN7/rPq72gAzGkHf+fdkUXkt\nHjZIxVNShvZDz5PecycRCayKuvZd9FFXVF6aGtWE4N8A0A9gEYBaLytJ8v4DbxjGQcq0n1CmxqWn\nRQAAF4BJREFUlZQ3tNpKqxuZu6j0oc+jjKFuyy4bgJxf+mQjPMXldHa0LyvX2yKUIhJY1a6c/LEs\nrqwXzTsO3vM10Nt7jAsQknUvM6OsbVUrNIdTtuw68ki/TJe3CFuPfokMXf1Edp3+BbYe/RIcroKH\nPk9zOCPRUGBa1/WehANXPiPvO/+YZvvTuvZdNbu+8OvO+vbdj5RElPsrq2shZiSclaVrWV0L2o+8\ngKrmdhJcXnjgYwkhajhvgqSUGLl+VsSiYbQfOrahz4zd6Ub7oWOUMsZDq4+2/FVhWbWdUPbtxwpW\neaC8TyQgxGV3upFPS5mk1FpTTySYxCXY04QQAre3GM6CQkSCftZ/6SPzAQ/OmQmYVgn4FrA8N0Xa\nD79AH3dwBiEUeMT3oaat08k07VuGYfzWY51Mua+8Lz25Gfu+b2Y877fKTBbNZkdRVR0fuXUhay/X\ni6vqsWn3UfgXZh7Q9KtqJIkSPAam2YTd8fgrB9gcTuJfmnukTGJzONG272kXZdr3Trz62nce+6TK\n5+R9IoGUf7M0My7VEt/JU1JVz6KB1ay9XCeEwFNaCSEFAvdp4lJNW48v5F/B1Xf/GwYufQRmsyX0\nOanZvIPOjw/g1sdvyenBLjxssqLTUwSH28Ok4P8pkfMqn5X3iUTX9QECjK0uzlodSs5wF5YiFo2w\naCR7K3qUUdgcLumbmbjfQ9TFx2OKhQMghIjtT/8KOo58MaEBP0XlNdj5hX9ACorLyeLUiOg5exLR\n0P0X7Z3qvyHC/uVhAOWJnFf5rLxPJADAuflfF8aHQlbHkSscbg8Ky6t537mTCc9AtkJwZRHXP/hb\nCDOGmrZ7LyOvaiSPRwiOid5rwuUtlnan+/YIuERQStG0/QC2Hf0S1exO7l+690Whf2kOc6N9ESnl\nb+q6vprwiZXbVCIBACn/0jc7QQW/f9+qsjHNnQdZNBRkixPDVoeyYXOj/ULT7Nh69CXyoIJO1Ug2\nbvTmBW7Gomjd+3RKRvYVFJWxubEBYUYjCK4s3h4QIaXE4NXTQcH5t3Rdv56Kc+czlUgA6Lo+TSm9\nsBRfyE1JAmazo7K5XY71XJHhQHZd/HlKKmgsGhYPXDONEKlqJBszO9onfbMTtP3QMZqMmsi9NG7b\nh2goIK+99xN0f/I2gsvxPpPg8gKEafp1Xf+rlJw4z6lEsoabsT+eHxvIrhIvw1Vv2kqKKmpkz9l3\nhGlmz9p4pTVNYEwj4z1X7vsYAqJqJBvgX5rDRM9V0rLrCWJ3ulN2Hs3uwI5nv8aadx4BANicbgRX\nfeg9/34MhPy/KTtxnlOJ5FM/D64s2mLR7O0gzjRMs6Gp8wB1F5ai69TfC2FmR9MhoRQl1Y3Svzh7\n/0xBCISqkTySSCiAgUsfobplK4rKq9NyzuKKWtgcLnHjw79F9+lfAFL+y1e+/a1/mZaT5yGVSNbo\nuh6klL3tm1bNW8lECEXzzkOUaTbSf/mjrCh5pRAoKCmnYf8yjYYCD3hg1o5wThtuxtB3/j3pKamU\nNW3b03ZeqmnYtOcpCpAggC3Hj7/yR2k7eR5SieQO3Iy9sTA5pJq3ksxmd6J55yES9C3QbKiVTA91\ni8HLp+AuLBWa4/77kqjVEB5MCoGBSx8JSplo2f1E2ldAtjkcgBQuXdf70n3ufKP+Ej7r70OrPlss\ni+c/ZCqXtwSa3SEXpkasDuWhCAFxFhTyjiMvPKBTWNVG7hZYXsTsSC+mB29hou8a+i99JMKBFXQc\nfoGlqnP9QTS7A4RSceLV1/552k+eZ1QiuYOu6yFK2du+WdW8lWyEEJTVtcjpwVsZP7ekoLicmLHI\nQ66g1RYjdxu5flbMDPcI3+ykDCwtgFJK2w89T6lmzSLjlDI0dR5ihJD/xZIA8kjeLyN/N27G3liY\nGH62oqHNa3UsuaaqZSudHe3D4sQwSuuarQ7nvlYXZkAofWimUIs23oUQVLd00IrGzVZHctvi5HBY\nCv5Dq+PIdSqRfN7fh1aXbLFIGLYEFpNTPo8yBpe3mPuXF1hxTWNSZjWnQklNI+ZG+8h492XUd+y5\n52Pii/8+OJFIKSCFgOAcQghIwSG4efu+FCJ+X679TIi12fISpbXNyLbtigkhMpNGsgnOsbo4Q6WU\n/5vVseQ6lUjuout66LXX33jbNzv+1YqGNqvDyTnOAi8WJ4fl/NgAcReVmB2HX8i4z6DLU4SWXU9g\n8MrHiEXDQSmlkEJIKbgU8a/gplnYf/ED6XAVrAghiBSCSiGolIJKKZgUggEgIIQTQmIEJAZCwoSQ\nCECiIIgAiAKIrN3CAEKQMsLN2G/ZHC4UVWTXTrAkw5bWDweWIYWwA6iH2g0xpTLujzgTcDP2vUXV\nvJUSDR17WUl1vDbSe/49Lbjqg9tbbHVYn+Mtq4KnpCK6PDtxSXD+KuKF/p03CcAfCfrXk8C9vsb0\n48c3XLK+9sb3igXnLybppaScEBxmNAIzFqWSZ04XmLuwFPUde+RE79VThmF8Qdf1c1bHlKtUIrm3\nt4KqeSslCKXwllYCACqb2kXfuXdJx5EXyaPuu50uhBA07zhkv/7Bzw4A+HKaF/nzZ9O6byPXz5m+\n2XENAHEXl1kdzmdUNm0hTLO5xrouffTqa6/7pBTflUL8Z13XM6cNLgeoRHIPa81b7/hmx39FNW+l\nTu3mHZTHorz7zNtk69GXaCIbHKWCGYuAMk1yEd0G4Gy6ziulXI2GAgj5lz/Td/Lpff6ZfhYp5Vo/\ny9pXKSGFkGttcVJKIShlpKZth52lYAQVN6Mob2hFQ8fepB87GcrqWmhpbbM9uLJYOXLj/L+LhYO7\nAPx3VseVS1QiuY+15q1nVPNW6hBC0LBtHxOC85sf/hyEEAlIUtG0BTUt22DVsNF1PWdPhqUQ3wNw\nIa0nluLDmeGel2ZHemMAoiBkvR9lvdlsvT8lLIEwpIxIKaOAjEopo5AyAsBcu8UAmISyf1tS01Re\nUFSatDC7z7wtIkE/FaapuQpLknbcVCCEoKCoDFsOPOe+9v5Pvw6VSJJKJZL7eyu4smSLRcOw2TPr\nSjmXrDUhsZrW7RBCkLDfh9FbFzE/NiBsDpcorqpntW2daZ+0EVz1gceiTgD/NN3NIK+8/PLrAF5P\n5jFfe/2N3yOEJHUzp9CqjzbvOAzN4URBUWY1ad1PNBwApcxndRy5JjPHX2YAXdeDlLGTy/ffIU9J\nIofbA5enECXVjdj57K+ioWMPdRcWa/NjA5a0ZTvdXjg9RUHKtP/divOnRnJHVBFC4XB74C2pyNih\n3HcL+BYAyH7DMNRFdBJlx7tvEW7GvqfW3ko/QilKa5tR09oJwU3Wd/FDke75CZQxbNr1hFtK+Xtp\nPXGqEBIUCYyokkJgovcqH7p2hg9d/YQPXvnYlEKAZ9GgAAAoq2uBy1uykzJN7dmeRCqRPNibwZUl\nuxmNWB1HXnK4Pdj6xBcR9i+TqYEb6Q+AEMTnfeQAKXnvuXcxN9b/WE83YxHMDvcwQDJCCWOaplW2\ntMNbUpHkQFOLMg1VLR1uQukTVseSS1QieYC1peXf8amdEy3jcHtQ29ZJ5kb65OLkcNrOG/KvYGa4\nGyBkIW0nTSHOzUIAGLt1EZN912IbPwIBCEXLziNo3nEYTZ2HULd5Z7LDTAuXpwhSiF2GYXzN6lhy\nhUokDxFv3hpWzVsWKq1tRuO2fWT4+lmE/StpOWff+XdDS1OjHwkz9jtpOWGqSbkJ8cE1+6YHu2xz\no30bSiaEEOTKiscOtwete59yEUr/2jCM3VbHkwtUh9PDvRlcWbSZ0QgeuIe3kjKEENhdBaCaTdrd\nnrSM4GLMFjOjkX+h6/rFdJwv1XRdlwA4gEuGYfzGRN/1v3C4vfCWVWF1YQYFxWVgmg1SCCxOjUBw\nvjYnJT4/hZuxXMkjAABvaSXK61vZ3GjfSwDuv6ey8khUInkIXdeDr73+xnu+2fGXyutbrQ4nb9kc\nLkjBSdi/DHcK5yyE/CsIrSwhFgnZAEyl7ETW+imk+LP+ix98Z/0bNqc7xmMRJjinAOD0FJkEIKCU\nEEIJIYSUNeTW599TUqEtTg5/HcAfWB1LtlOJ5BGsLS3/ZHl9q5qcaBGH24PK5nbed/49uuOZr5FU\nTFZcXZxF/8UPwpSyQSnFf9B1fSzpJ8kAuq5zAP/cMIx/BWAbgD5hxk4ARACYACH/U0Vjmy3XV3XQ\nbHaAELvVceQClUgezZvBlUW7at6yVmXjFjYz2IVwyJ+ShR5nR3qDUoh/9fIrr/xp0g+egXRdjwG4\nuvbf317/vmEYPxm7dfETl6cIniwblfWopJSYnxiMSilVs1YSqM72R6DreoBS9p7aOdFa8+MD0uH2\nimQnkWg4iKmBm3xlfooC+MukHjwL6bp+BiAv9134IBoJ+q0OJyUigVX4ZiZCwoz9M6tjyQUqkTyi\nteYtNXrLQja7k0gpktrlGwn6cePDn/OZoe7vSyGe1XV9MZnHz1a6fvx1KXhsqv/GYwwVznyawwlI\n6VTvd3Kopq1H9/PgyqIWi4Rgc7isjiUvFVfVY7znCvPNTqK4MvFNn6SUGOu6FGJM+9HL3/7WNxOP\nMHcYJ078tmZ30Lr23TarY0kJKQECtZR8kqgaySPSdT1IKPvZ4tRoDg2CzC6a3YHyhlY5M9ydlOOt\nzE/DvzS3yM2YnpQD5gjDMA5QSk+07X/Wlav78TCbDUyzS8MwvmJ1LLlAJZINEGbs/5kf68/NRuMs\n4XR7SSSwIsxoOOFjTfZe9Qtu/s+6roeSEFpOMAyjhjL29807j7gycefKZCGEonnHQTcI+bFx4sSX\nrI4n26lEsjEfxCKhaHBVrUJtldLaJhQUl8ubH70phfn4Cwb6ZsYRCQWWAfwkedFlN8MwHJRpv6hs\n7vAWV9ZZHU7KFZbXoHHbfjvTbGoeSYJUItkAXdcFJP5rz5l3Ypff/mH0+vs/CwuROXtU5wPKNGza\nfZQ5Crxy5Oa5x25mXFmYjglu/pGu67mxKGOCDMMglGmve0sr22pat+dmv8g9FFfWQZjmVsMwMntn\nrgynEskGCcF/XwreLAWvMmORhK6KlcdDCEF9xx66PDeFx11ePhJYDQEYTG5k2YtQ+s9sDuevNu88\n7Iqvq5UfNLsDhRU1lFL2E8MwcnPSTBqoRLJBuq5LXdcndV33EULCiezxoDy+gqIyEErJyvzGVzGR\nUiK4smQDcDn5kWUfwzCeI5T9Qdu+ZwqYljeVkduaOw/aCorLjhJKTxqG4bE6nmykEkkiCA0LoWok\nViCEgFAqH3fCnOCmDUB6lhLOYIZh1BLKftK6+6jL4c7PMpTZ7GjZfZRJIXYA6LQ6nmyk5pE8BsMw\nKLPZfyy5mdQ9sJWNqd+yi4zeuiCXpkdXpJAQ3ISUIt4uIyUkQCDl2n8lABBAAhJESlkAYNmy4DPH\ndil4ITdjJvK4PKCMAYRwSDlgdSzZKG8/OAmSUoijTZ2HbM6CQqtjyVultc2YHuoOBZcX/yOAMwCC\nAKIAxNpN3ue+ALC6ttZUvrsBYHpmuMdVXFVfZHUwVlmemwJj2rWXv/2tOatjyUYqkTwGXdflq6++\n9oNwYPl3ATCr48lHc6P9Yma42x+LhASA7+m6Pm11TFnqS8xmr6xt68zrZu7Z4Z5Vbsb+i9VxZKu8\n/vAkQgj+g4WJ4dBak4mSRtFwEOPdl8xoKPDrUogqlUQSYiuqqA17y6qsjsMy4cAKgitLBMAPrY4l\nW6lE8vgucDMWCqnJidYgNArgPV3Xo1aHkuUigvO8XnNqYWKIQ8o/UyscPD6VSB6TrusSUv5gaXpM\njf9NM5vDCaenkFBNO20YhmqeTUxECp7X1erg8lJISqGGgidAJZIECMH/YnFSNW+lGyEUHYefL7A7\nCzoBfNXqeLJcRORxIlmcHEFgeT4A4C2rY8lm6mouMevNW55U7iOealJKSCEguAkhOATnIITgznkF\nUsr4kFop4o+XEoQQWDWBTXC+Phckb0caJUlE8PxMJCsLMxi9eT4gBP+KruuqjToBKpEkYH301tL0\n2O+6C0uy9nc5ePmUf3lu0kUojRJCIiAkIjkv2/bklzWH2wMhOPovfuj3L866QYggIHxtLwdb59O/\nolmxP8vS1CjMSPgWgO+n/eS5JSIfc5mZbNd/8QMBiTBl2tcNw7ik63peJtRkyNrCL1MIwX+wODn8\nSu3mHZ5sXaMoGg5yAMeOv/LKB+vfe+317/WbsWgrCQVw86M3OQhiAJr048fHP33MG2NmNFK/nkg+\n08QnJSTWazFrNR4hgDtqNOu1G9x1X3AOIfinz739MwEp4t8L+OYhBN8DwAtgKU2/qlwUydeFRysb\nN5uOAm/ZRM/V7wAwoNZee2wqkSTuIjdjoYWJIY9mdwC4sxlI3i44AQCEIJ5qCLCWdNaTj93lRkFR\nGXyzE4gEV+MTsKUEsH4c3FkwS0CKtfMIKYSUUor4XSEFNzmkBNU0KjgXwjQF5zEABIyx2wV7vIAW\nCAdWXYhP2LuDHOs7/169lIJSxi68/O1vPXGP197VdfoX9ff4/vqxBAiRBJAgxCQgMRBiAuAghBOA\nIz450Fz7fvxnQAjxiYVRALHbNyljAGJy7T6hVJNCqNnpiQnnQo1ECgEzFo03z3Iz3jxLKWwO5313\nNK3v2GMHgNX5Gb6yMPX7hmH8rwBmdV3Pz8yaAJVIEqTrunz1tdf/9UTv1eOIF4J33sw7vgIAQXyA\nA127zwAQKUWRMM1De7/4DQxdOR0DIW8ACAGSQ4JLSL5WiN45M5sjXmCbd50nhvgMbwnAvXY/GD8e\nAMB1x+PWb0Fd1y/d+bq4GfsKgGIAQS7EPRe04mbsi2uvQ67/Lh7nd6hYKiIFf2BVer02KQX/3Ne7\nv7deiN95oRKvRYr494TgUgq5DlIKIbiQgkshRPyiKH5/7ZgchFAQSj+tuYrbtVQiOKeCx2yCcxuh\nNEQIDRFCwiAkBCld3IzVazZHwFVYQpp3HHTbHC4IzuNLoqxp6jzgHrx6+usB3/w/AqGXARxJ9S89\n1xA14sh6hmGUUcomdr/wm47Lb/8wIgWv1XV90eq4lNxnGEYDCBmw2Z1hKQWRUhJISaSUVAqhSSni\nJS4hJiEkRkBMEBIFIVECREFIBEAYQGTttgop/QDCUsoopIxIyIiUMgwp12uZd19sRRC/oInedYut\nHZsBsOPTi6b1WwxAAPHFNxfuVZMwDGMLADuh9J9IIf5Hm9MdiIWDBZVNWyL1HXsc648zoxFce299\njzPyTV0//udJ+yXnAVUjyQxcxq/sQQgREsi/tbwVS+i6PmYYxuZYJOTEp4XzekEdQrwgN/Xjx7Py\nilPX9d61u//0xIkTt2LhYBcA3+xI78Wiilqsz+hnmg3FVfUR38y4gxDyRwBUItkAlUgsZhjGJgDb\npOB2ACCESsSvvhQlLXRdH7E6hnQ4fvz4n67fP/Hqa/+m78L7/37XsX8AptkgBEck6Dcp094S3Pw9\nK+PMRiqRWMgwDAJgQLM7IkUVtUEAbkKJgKqRKEpKScH/gFB67OrJH3+hetM2EVxZMiNB/1uCm7+l\n+vo2Ts1st5Cu65Jptk/qtuxyNHUedAOqRqIo6aDrupRCPA/gN2ZHeq+uLs7MC24eV0nk8agaicUE\n55dGbpw7Mj3YFdn+1Jcda8OC1dL0ipJia0njx2s3JQGqRmIxQshNELISCa465NqEPXw6XFhRFCXj\nqURisVdeefnPIGUxoXTm8tt/I81YLApg3uq4FEVRHpWaR5IhDMNgAIRqo1UUJduoRKIoiqIkRDVt\nKYqiKAlRiURRFEVJiEokiqIoSkJUIlEURVESohKJoiiKkhCVSBRFUZSEqESiKIqiJEQlEkVRFCUh\nKpEoiqIoCVGJRFEURUmISiSKoihKQlQiURRFURKiEomiKIqSEJVIFEVRlISoRKIoiqIkRCUSRVEU\nJSEqkSiKoigJUYlEURRFSYhKJIqiKEpCVCJRFEVREqISiaIoipIQlUgURVGUhKhEoiiKoiREJRJF\nURQlISqRKIqiKAlRiURRFEVJiEokiqIoSkJUIlEURVES8v8DpSsnHkBcn7UAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x119734b00>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(<matplotlib.figure.Figure at 0x119734b00>,\n",
" <matplotlib.axes._subplots.AxesSubplot at 0x119a74550>)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ox.plot_shape(ox.project_gdf(atlanta_metro_80))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"geometries = list(atlanta_metro_80.geometry)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Turn all the county polygons into a single multi-polygon that we can use to clip other geodata (roads, rail, etc.)\n",
"cu = cascaded_union(geometries)\n",
"geojson = json.dumps(mapping(cu))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"with open('/Users/umd-laptop/Downloads/atlanta_metro_80.geojson.json', 'w') as outfile:\n",
" outfile.write(geojson)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"At this point it's easier to do the next few operations from the commandline …"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Turn the Atlanta metro area multi-polygon into an ESRI Shapefile:\n",
"\n",
"`ogr2ogr -f \"ESRI Shapefile\" ./atlanta_metro_80.geojson.json ./atlanta_metro_80.shp`\n",
"\n",
"Use that shapefile to clip shapefiles of e.g. rail lines:\n",
"\n",
"`ogr2ogr -clipsrc ./atlanta_metro_80/OGRGeoJSON.shp atlanta_metro_rail.shp ~/Downloads/rail00l_shp_nt00306/rail_l.shp`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Roads"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Federal TIGER/Line Shapefiles for roads are provided on a county-by-county basis. So, I downloaded the county-level file for early of the metro area counties (ca. 1980) above."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"ROADS_DATA_DIR = '/Users/umd-laptop/Downloads/atlanta_metro_80_all_roads/'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Unzip them …"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for dirpath, dirnames, filenames in os.walk(ROADS_DATA_DIR):\n",
" full_paths = [os.path.join(dirpath, f) for f in filenames]\n",
" for item in full_paths:\n",
" with zipfile.ZipFile(item, 'r') as zfobj:\n",
" contents = zfobj.extractall(path='./data/atlanta_metro_80_roads/')"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"dataframes = []\n",
"for dirpath, dirnames, filenames in os.walk('./data/atlanta_metro_80_roads/'):\n",
" full_paths = [os.path.join(dirpath, f) for f in filenames]\n",
" shpfiles = list(filter(lambda x: x.endswith('shp'), full_paths))\n",
" for s in shpfiles:\n",
" # Read each shapefile into a GeoDataframe\n",
" geodataframe = gpd.read_file(s)\n",
" dataframes.append(geodataframe)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Concatenate them all into a single dataframe …"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"all_counties_roads = gpd.GeoDataFrame(pd.concat(dataframes, ignore_index=True))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save as a shapefile …"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"all_counties_roads.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all')"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>FULLNAME</th>\n",
" <th>LINEARID</th>\n",
" <th>MTFCC</th>\n",
" <th>RTTYP</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>US Hwy 29 Bus</td>\n",
" <td>1104468621978</td>\n",
" <td>S1200</td>\n",
" <td>U</td>\n",
" <td>LINESTRING (-83.655872 33.95594299999999, -83....</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Chapel Church Spr</td>\n",
" <td>110445770327</td>\n",
" <td>S1400</td>\n",
" <td>M</td>\n",
" <td>LINESTRING (-83.68271999999999 33.973244999999...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Griffith St S</td>\n",
" <td>110445768944</td>\n",
" <td>S1400</td>\n",
" <td>M</td>\n",
" <td>LINESTRING (-83.71049499999998 33.993239, -83....</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Manger Ave E</td>\n",
" <td>110445768167</td>\n",
" <td>S1400</td>\n",
" <td>M</td>\n",
" <td>LINESTRING (-83.713318 33.93008499999999, -83....</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Manger Ave E</td>\n",
" <td>110445768166</td>\n",
" <td>S1400</td>\n",
" <td>M</td>\n",
" <td>LINESTRING (-83.71364899999999 33.933253999999...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" FULLNAME LINEARID MTFCC RTTYP \\\n",
"0 US Hwy 29 Bus 1104468621978 S1200 U \n",
"1 Chapel Church Spr 110445770327 S1400 M \n",
"2 Griffith St S 110445768944 S1400 M \n",
"3 Manger Ave E 110445768167 S1400 M \n",
"4 Manger Ave E 110445768166 S1400 M \n",
"\n",
" geometry \n",
"0 LINESTRING (-83.655872 33.95594299999999, -83.... \n",
"1 LINESTRING (-83.68271999999999 33.973244999999... \n",
"2 LINESTRING (-83.71049499999998 33.993239, -83.... \n",
"3 LINESTRING (-83.713318 33.93008499999999, -83.... \n",
"4 LINESTRING (-83.71364899999999 33.933253999999... "
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_counties_roads.head()"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"126858"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(all_counties_roads)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For easier manipulation, I actually want them defined into separate shapefiles by road type so I filter my master dataframe by that attribute …"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"county_roads = all_counties_roads[all_counties_roads['RTTYP'] == 'C']\n",
"interstates = all_counties_roads[all_counties_roads['RTTYP'] == 'I']\n",
"us_roads = all_counties_roads[all_counties_roads['RTTYP'] == 'U']\n",
"local_roads = all_counties_roads[all_counties_roads['RTTYP'] == 'M']\n",
"state_roads = all_counties_roads[all_counties_roads['RTTYP'] == 'S']\n",
"other_roads = all_counties_roads[all_counties_roads['RTTYP'] == 'O']"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"uncategorized_roads = all_counties_roads[all_counties_roads['RTTYP'].isnull()]"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 112,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(all_counties_roads) - (len(county_roads) + len(interstates) + len(us_roads) + len(local_roads) + len(state_roads) + len(other_roads) + len(uncategorized_roads))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(Got 'em all)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save back out as shapefiles …"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"county_roads.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all/by_type/county_roads')\n",
"interstates.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all/by_type/interstates')\n",
"us_roads.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all/by_type/us_roads')\n",
"local_roads.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all/by_type/local_roads')\n",
"state_roads.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all/by_type/state_roads')\n",
"other_roads.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all/by_type/other_roads')\n",
"uncategorized_roads.to_file('./data/atlanta_metro_80_roads/atlanta_metro_80_roads_all/by_type/uncategorized_roads')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load the various files into CARTO to take a look at them …"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from IPython.display import display, HTML"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<iframe width=\"100%\" height=\"520\" frameborder=\"0\" src=\"https://trevormunoz.carto.com/viz/05f2ae50-05fc-11e7-ad25-0e233c30368f/embed_map\" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"embed = HTML('<iframe width=\"100%\" height=\"520\" frameborder=\"0\" src=\"https://trevormunoz.carto.com/viz/05f2ae50-05fc-11e7-ad25-0e233c30368f/embed_map\" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe>')\n",
"display(embed)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment