{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Loan default notebook\n", "\n", "Many credit decisioning systems are driven by scorecards, which are very simplistic rules-based systems. These are built by end-user organizations through industry knowledge or through simple statistical systems. Some organizations go a step further and obtain scorecards from third parties which may not be customized for an individual organization’s book. An AI-based approach can help financial institutions learn signals from their own book and assess risk at a more granular level. Once the risk is calculated, a strategy may be implemented to use this information for interventions. If you can predict someone is going to default, this may lead to intervention steps such as sending earlier notices or rejecting loan applications.\n", "\n", "## Setup\n", "\n", "This example assumes that the DataRobot Python client package has been installed and configured with the credentials of a DataRobot user with API access permissions. Retrieve your DataRobot API Token by logging into DataRobot and navigating to the Developer Tools in your profile.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "!pip install datarobot umap-learn nbformat hdbscan\n", "\n", "import datarobot as dr\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker as mtick\n", "import numpy as np\n", "import pandas as pd\n", "\n", "light_blue = \"#598fd6\"\n", "grey_blue = \"#5f728b\"\n", "orange = \"#dd6b3d\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Connect to DataRobot\n", "\n", "Read more about different options for [connecting to DataRobot from the client](https://docs.datarobot.com/en/docs/api/api-quickstart/api-qs.html)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# If the config file is not in the default location described in the API Quickstart guide, '~/.config/datarobot/drconfig.yaml', then you will need to call\n", "# dr.Client(config_path='path-to-drconfig.yaml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import data\n", "\n", "The data file is hosted by DataRobot using the URL in the following cell. Read in the data directly from the URL into a [Pandas DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) and display the results to verify all of the data looks correct. If you have your own data files you can access that data in several ways." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idmember_idloan_amntfunded_amntinstallmentgradesub_gradeemp_titleemp_lengthhome_ownership...revol_utiltotal_accinitial_list_statuscollections_12_mths_ex_medmths_since_last_major_derogapplication_typeacc_now_delinqtot_coll_amttot_cur_balis_bad
0329644640688571120011200343.89AA2Nokia Siemens Network10.0OWN...66.20%21f0NaNINDIVIDUAL00.0187717.0False
1328641240588531000010000328.06BB2creative financial group2.0MORTGAGE...74.20%11f0NaNINDIVIDUAL00.016623.0True
23286406405884880008000282.41CC4Techtron Systems7.0RENT...72%17w0NaNINDIVIDUAL00.017938.0False
3329643440688431600016000500.65AA4Bristol Hospital10.0MORTGAGE...75.20%56f0NaNINDIVIDUAL00.0372771.0False
43286395405883640004000125.17AA4Aspen Skiing Company10.0MORTGAGE...95.50%21w0NaNINDIVIDUAL00.0331205.0False
..................................................................
953286021405836940004000146.12DD3Morton Plant Hospital6.0MORTGAGE...84.80%21f0NaNINDIVIDUAL00.0112600.0False
962835185341743585008500264.88AA3The Adocate/Hearst News5.0MORTGAGE...28.70%19w0NaNINDIVIDUAL00.0112238.0False
97324112439840591300013000432.54BB3Southwest ISD3.0MORTGAGE...57.90%18f0NaNINDIVIDUAL0202.0120076.0False
98319804039309682000020000608.72AA1west texas a&m university5.0MORTGAGE...39.90%27f0NaNINDIVIDUAL00.0230748.0False
99318825739212511600016000387.40CC3Antea Group1.0MORTGAGE...54.60%28f0NaNINDIVIDUAL00.0194506.0False
\n", "

100 rows × 34 columns

\n", "
" ], "text/plain": [ " id member_id loan_amnt funded_amnt installment grade sub_grade \\\n", "0 3296446 4068857 11200 11200 343.89 A A2 \n", "1 3286412 4058853 10000 10000 328.06 B B2 \n", "2 3286406 4058848 8000 8000 282.41 C C4 \n", "3 3296434 4068843 16000 16000 500.65 A A4 \n", "4 3286395 4058836 4000 4000 125.17 A A4 \n", ".. ... ... ... ... ... ... ... \n", "95 3286021 4058369 4000 4000 146.12 D D3 \n", "96 2835185 3417435 8500 8500 264.88 A A3 \n", "97 3241124 3984059 13000 13000 432.54 B B3 \n", "98 3198040 3930968 20000 20000 608.72 A A1 \n", "99 3188257 3921251 16000 16000 387.40 C C3 \n", "\n", " emp_title emp_length home_ownership ... revol_util \\\n", "0 Nokia Siemens Network 10.0 OWN ... 66.20% \n", "1 creative financial group 2.0 MORTGAGE ... 74.20% \n", "2 Techtron Systems 7.0 RENT ... 72% \n", "3 Bristol Hospital 10.0 MORTGAGE ... 75.20% \n", "4 Aspen Skiing Company 10.0 MORTGAGE ... 95.50% \n", ".. ... ... ... ... ... \n", "95 Morton Plant Hospital 6.0 MORTGAGE ... 84.80% \n", "96 The Adocate/Hearst News 5.0 MORTGAGE ... 28.70% \n", "97 Southwest ISD 3.0 MORTGAGE ... 57.90% \n", "98 west texas a&m university 5.0 MORTGAGE ... 39.90% \n", "99 Antea Group 1.0 MORTGAGE ... 54.60% \n", "\n", " total_acc initial_list_status collections_12_mths_ex_med \\\n", "0 21 f 0 \n", "1 11 f 0 \n", "2 17 w 0 \n", "3 56 f 0 \n", "4 21 w 0 \n", ".. ... ... ... \n", "95 21 f 0 \n", "96 19 w 0 \n", "97 18 f 0 \n", "98 27 f 0 \n", "99 28 f 0 \n", "\n", " mths_since_last_major_derog application_type acc_now_delinq tot_coll_amt \\\n", "0 NaN INDIVIDUAL 0 0.0 \n", "1 NaN INDIVIDUAL 0 0.0 \n", "2 NaN INDIVIDUAL 0 0.0 \n", "3 NaN INDIVIDUAL 0 0.0 \n", "4 NaN INDIVIDUAL 0 0.0 \n", ".. ... ... ... ... \n", "95 NaN INDIVIDUAL 0 0.0 \n", "96 NaN INDIVIDUAL 0 0.0 \n", "97 NaN INDIVIDUAL 0 202.0 \n", "98 NaN INDIVIDUAL 0 0.0 \n", "99 NaN INDIVIDUAL 0 0.0 \n", "\n", " tot_cur_bal is_bad \n", "0 187717.0 False \n", "1 16623.0 True \n", "2 17938.0 False \n", "3 372771.0 False \n", "4 331205.0 False \n", ".. ... ... \n", "95 112600.0 False \n", "96 112238.0 False \n", "97 120076.0 False \n", "98 230748.0 False \n", "99 194506.0 False \n", "\n", "[100 rows x 34 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_path = \"https://s3.amazonaws.com/datarobot-use-case-datasets/Lending+Club+Dataset+Train.csv\"\n", "\n", "pathfinder_df = pd.read_csv(data_path, encoding=\"ISO-8859-1\")\n", "pathfinder_df.rename(columns={\"loan_is_bad\": \"is_bad\"}, inplace=True)\n", "\n", "pathfinder_df.head(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualize data\n", "\n", "Use the following snippets to display unique aspects of the data. The first cell groups the dataframe by average annual income for loans that default and those that do not. The second cell shows how often a loan defaults based on the `emp_length value`. The third cells shows the average default rate for loans for each state." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
is_badannual_inc
0False72630.592408
1True64442.019078
\n", "
" ], "text/plain": [ " is_bad annual_inc\n", "0 False 72630.592408\n", "1 True 64442.019078" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = pathfinder_df.groupby(\"is_bad\").agg({\"annual_inc\": \"mean\"}).reset_index()\n", "\n", "df1" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
emp_lengthis_bad
01.00.150927
12.00.154332
23.00.164575
34.00.156938
45.00.149490
56.00.162082
67.00.168053
78.00.160577
89.00.169727
910.00.149395
\n", "
" ], "text/plain": [ " emp_length is_bad\n", "0 1.0 0.150927\n", "1 2.0 0.154332\n", "2 3.0 0.164575\n", "3 4.0 0.156938\n", "4 5.0 0.149490\n", "5 6.0 0.162082\n", "6 7.0 0.168053\n", "7 8.0 0.160577\n", "8 9.0 0.169727\n", "9 10.0 0.149395" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "avg_value_df = pathfinder_df.groupby(\"emp_length\").agg({\"is_bad\": \"mean\"}).reset_index()\n", "\n", "avg_value_df" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
addr_stateis_bad
0AK0.098837
1AL0.188563
2AR0.165803
3AZ0.168299
4CA0.151439
5CO0.138211
6CT0.155527
7DC0.091549
8DE0.157895
9FL0.180175
10GA0.153999
11HI0.192926
12IL0.129351
13IN0.166667
14KS0.127615
15KY0.140515
16LA0.161716
17MA0.150280
18MD0.165319
19MI0.173405
20MN0.138249
21MO0.153558
22MT0.131579
23NC0.147039
24NE1.000000
25NH0.101695
26NJ0.181864
27NM0.160000
28NV0.175192
29NY0.173567
30OH0.150431
31OK0.163121
32OR0.136858
33PA0.159287
34RI0.200855
35SC0.145000
36SD0.104839
37TN0.000000
38TX0.133150
39UT0.161290
40VA0.164849
41VT0.208696
42WA0.159657
43WI0.149385
44WV0.110092
45WY0.103448
\n", "
" ], "text/plain": [ " addr_state is_bad\n", "0 AK 0.098837\n", "1 AL 0.188563\n", "2 AR 0.165803\n", "3 AZ 0.168299\n", "4 CA 0.151439\n", "5 CO 0.138211\n", "6 CT 0.155527\n", "7 DC 0.091549\n", "8 DE 0.157895\n", "9 FL 0.180175\n", "10 GA 0.153999\n", "11 HI 0.192926\n", "12 IL 0.129351\n", "13 IN 0.166667\n", "14 KS 0.127615\n", "15 KY 0.140515\n", "16 LA 0.161716\n", "17 MA 0.150280\n", "18 MD 0.165319\n", "19 MI 0.173405\n", "20 MN 0.138249\n", "21 MO 0.153558\n", "22 MT 0.131579\n", "23 NC 0.147039\n", "24 NE 1.000000\n", "25 NH 0.101695\n", "26 NJ 0.181864\n", "27 NM 0.160000\n", "28 NV 0.175192\n", "29 NY 0.173567\n", "30 OH 0.150431\n", "31 OK 0.163121\n", "32 OR 0.136858\n", "33 PA 0.159287\n", "34 RI 0.200855\n", "35 SC 0.145000\n", "36 SD 0.104839\n", "37 TN 0.000000\n", "38 TX 0.133150\n", "39 UT 0.161290\n", "40 VA 0.164849\n", "41 VT 0.208696\n", "42 WA 0.159657\n", "43 WI 0.149385\n", "44 WV 0.110092\n", "45 WY 0.103448" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "avg_value_df = pathfinder_df.groupby(\"addr_state\").agg({\"is_bad\": \"mean\"}).reset_index()\n", "\n", "avg_value_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initiate modeling\n", " \n", "Create a DataRobot project to train models against the assembled dataset." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "EXISTING_PROJECT_ID = None # If you've already created a project, replace None with the ID here\n", "if EXISTING_PROJECT_ID is None:\n", " # Create project and pass in data\n", " project = dr.Project.create(sourcedata=pathfinder_df, project_name=\"Predict loan defaults\")\n", "\n", " # Set the project target to the appropriate feature. Use the LogLoss metric to measure performance\n", " project.analyze_and_mode(target=\"is_bad\", worker_count=\"-1\")\n", "else:\n", " # Fetch the existing project\n", " project = dr.Project.get(EXISTING_PROJECT_ID)\n", "\n", "project.wait_for_autopilot(check_interval=30)\n", "# Uncomment and replace the project ID if the project already exists\n", "# project = dr.Project.get(\"612cb904ce5d5617d67af394\")\n", "\n", "# Get the project metric (i.e LogLoss, RMSE, etc...)\n", "metric = project.metric\n", "\n", "# Get project URL\n", "project_url = project.get_uri\n", "\n", "# Get project ID\n", "project_id = project.id" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### View project in UI\n", "\n", "If you want to view any aspects of the project in the DataRobot UI, you can retrieve the URL for the project with the snippet below and use it to navigate to the DataRobot application in your browser." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'https://app.datarobot.com/projects/62cda041ab0bc3275f7a4a86/models'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display project URL\n", "project_url" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Initiate modeling" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "autoscroll": "auto" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "In progress: 0, queued: 0 (waited: 0s)\n" ] } ], "source": [ "project.wait_for_autopilot(check_interval=30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate model performance \n", "\n", "In order to measure model performance, first select the top model based on a specific performance metric (i.e., `LogLoss`) and then evaluate several different types of charts, such as Lift Chart, ROC Curve, and Feature Importance. There are two helper functions (detailed below) that assist in producing these charts.\n", "\n", "You can reference more information about how to evaluate model performance in the [DataRobot platform documentation](https://docs.datarobot.com/en/docs/modeling/analyze-models/index.html).\n", "\n", "In the snippet below, use models built during Autopilot to create a list of the top-performing models based on their accuracy.\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "def sorted_by_metric(models, test_set, metric):\n", " models_with_score = [model for model in models if model.metrics[metric][test_set] is not None]\n", "\n", " return sorted(models_with_score, key=lambda model: model.metrics[metric][test_set])" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "autoscroll": "auto" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The top performing model is Model('Elastic-Net Classifier (L2 / Binomial Deviance)') using metric, LogLoss\n" ] } ], "source": [ "models = project.get_models()\n", "\n", "# Uncomment if this is not set above in the create project cell\n", "metric = project.metric\n", "\n", "# Get the top-performing model\n", "model_top = Project.get_top_model()\n", "\n", "print(\n", " \"\"\"The top performing model is {model} using metric, {metric}\"\"\".format(\n", " model=str(model_top), metric=metric\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "# Set styling\n", "dr_dark_blue = \"#08233F\"\n", "dr_blue = \"#1F77B4\"\n", "dr_orange = \"#FF7F0E\"\n", "dr_red = \"#BE3C28\"\n", "\n", "# Function to build histograms\n", "\n", "\n", "def rebin_df(raw_df, number_of_bins):\n", " cols = [\"bin\", \"actual_mean\", \"predicted_mean\", \"bin_weight\"]\n", " new_df = pd.DataFrame(columns=cols)\n", " current_prediction_total = 0\n", " current_actual_total = 0\n", " current_row_total = 0\n", " x_index = 1\n", " bin_size = 60 / number_of_bins\n", " for rowId, data in raw_df.iterrows():\n", " current_prediction_total += data[\"predicted\"] * data[\"bin_weight\"]\n", " current_actual_total += data[\"actual\"] * data[\"bin_weight\"]\n", " current_row_total += data[\"bin_weight\"]\n", "\n", " if (rowId + 1) % bin_size == 0:\n", " x_index += 1\n", " bin_properties = {\n", " \"bin\": ((round(rowId + 1) / 60) * number_of_bins),\n", " \"actual_mean\": current_actual_total / current_row_total,\n", " \"predicted_mean\": current_prediction_total / current_row_total,\n", " \"bin_weight\": current_row_total,\n", " }\n", "\n", " new_df = new_df.append(bin_properties, ignore_index=True)\n", " current_prediction_total = 0\n", " current_actual_total = 0\n", " current_row_total = 0\n", " return new_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Lift chart\n", "\n", "A [lift chart](https://docs.datarobot.com/en/docs/modeling/analyze-models/evaluate/lift-chart.html#lift-chart) shows you how close model predictions are to the actual values of the target in the training data. The lift chart data includes the average predicted value and the average actual values of the target, sorted by the prediction values in ascending order and split into up to 60 bins.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Function to build lift charts\n", "\n", "\n", "def matplotlib_lift(bins_df, bin_count, ax):\n", " grouped = rebin_df(bins_df, bin_count)\n", " ax.plot(\n", " range(1, len(grouped) + 1),\n", " grouped[\"predicted_mean\"],\n", " marker=\"+\",\n", " lw=1,\n", " color=dr_blue,\n", " label=\"predicted\",\n", " )\n", " ax.plot(\n", " range(1, len(grouped) + 1),\n", " grouped[\"actual_mean\"],\n", " marker=\"*\",\n", " lw=1,\n", " color=dr_orange,\n", " label=\"actual\",\n", " )\n", " ax.set_xlim([0, len(grouped) + 1])\n", " ax.set_facecolor(dr_dark_blue)\n", " ax.legend(loc=\"best\")\n", " ax.set_title(\"Lift chart {} bins\".format(bin_count))\n", " ax.set_xlabel(\"Sorted Prediction\")\n", " ax.set_ylabel(\"Value\")\n", " return grouped" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "autoscroll": "auto" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "No handles with labels found to put in legend.\n", "No handles with labels found to put in legend.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAI4CAYAAABndZP2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACCIklEQVR4nOzdeXic1Xn+8e8zu1bLkqzNsixblhd5wWC22IQdQlaShrZAmo00hCQ0IQspJGmSpk2blqZJ+gtZgJBAFkhLwk4AA2GzARuMMXjfbVmyZEnWLo1mpPP7Y8ZGtmVbsjUaaXR/rkuXZuY9551nBrBvznvec8w5h4iIiEgq8SS7ABEREZHhpoAjIiIiKUcBR0RERFKOAo6IiIikHAUcERERSTkKOCIiIpJyFHBEBAAze6eZbez3fJaZvW5mbWb2hZM897Nm9vcnX2VymNkOM7v4KMcO+d5EZHRQwBEZZ472l7Vz7gXn3Kx+L30NeNY5l+Wc+59j/SU/0szs12b2r8dp8y9m9qaZRc3sOwMcv9rMdppZh5k9YGa5J1LLAN+biIwCCjgicjRTgbXJLuJwZuYdZNMtxELaowOcYy7wC+CjQCHQCfx0uGoUkeRTwBERAMzsfDOrjj9+BrgA+ImZtZvZPUAZ8HD8+deOco7LzWy1mbWa2VYzu6zf4almtix+yetJM8vv1+//zGyvmbWY2fPxAHLg2K/N7Gdm9piZdQCfAj4CfC1ey8MD1eKcu8s592egbYDDHwEeds4975xrB/4J+CszyzrGV3SGma0zs/1m9iszCx3+vcWf7zCzr5rZmvjn+UO/tvlm9oiZNZtZk5m9YGb6c1gkAfQflogcwTl3IfACcL1zLtM5dxWwC3h//Pl/Ht7HzM4E7gZuBHKAc4Ed/ZpcDXwSKAACwFf7HfszUBk/tgr43WGnvxr4HpAVf4/fAf8Zr+X9J/AR5wJv9Pu8W4EeYOYx+nwEeBdQEW/3zWO0/RvgMmAasAD4RPz1rwDVwCRiI0dfB7RfjkgCKOCIyHD5FHCnc26pc67PObfHObeh3/FfOec2Oee6gP8FFh444Jy70znX5pwLA98BTjGzCf36PuicWxY/b/cw1JoJtBz2WguxAHU0P3HO7XbONRELW1cdo+3/OOdq4m0f5u3PGgGKganOuUh8/o4CjkgCKOCIyHCZAmw9xvG9/R53EgsZmJnXzL4fv6TVytujPvn92u8ezkKBdiD7sNeyGfhy1kA17ARKjtF2wM8K3EJsbtCTZrbNzG4aXLkiMlQKOCIyWMcbadhN7PLNUF0NXA5cDEwAyuOv2zHe+2RHPdYCpxx4YmbTgSCw6Rh9pvR7XAbUDPVN46NUX3HOTQfeD3zZzC4a6nlE5PgUcETGJ7+Zhfr9+AbRpw6YfozjvwQ+aWYXmZnHzCab2exBnDcLCAONQDrwb8NQC2bmj0/u9QC++Oc8cAfW74D3x9ewyQC+C/zJOXesEZzPm1lp/HbyrwN/GESdh9f0PjObYWYGtAK98R8RGWYKOCLj02NAV7+f7wyiz78D34zfAfTVww8651YQm0T8Q2LzWZ4jdqv58dxN7JLPHmAd8PIg+vwSqIrX8sBR2txO7LNdBXwj/vij8VrXAtcRCzr1xELW547znr8HngS2xX+OuQ7PUVQCTxG7RPYS8FPn3LMncB4ROQ7T/DYRERFJNRrBERERkZSjgCMiIiIpRwFHREREUo4CjoiIiKScwdwaOmaY1+/MH0p2GSIiIjKMXLi9wTk3aSh9Uivg+EMESxcluwwREREZRt1bn9s51D66RCUiIiIpRwFHREREUo4CjoiIiKSclJqDIyIiIqNbTnYm3/j8VVSUFeOxt/fU7XOOrbtq+d6t99Dc2n7S76OAIyIiIiPmG5+/ijMWzsPnD0K/gINz5Obm8Y3PX8WN/377Sb+PLlGJiIjIiKkoKz4y3ACY4fMHqSgrHpb3UcAREREZJzKqFie7hNhlqcPDzQFmh1y2Oqn3GZaziIiIyKiXWbUk2SWMGAUcERGRccCfNznZJYwoTTIWERFJYRlViw8ZuSm84kYA2tcto2Pd8hGvp885cG7gy1TOxY4PAwUcERGRFNaxYQXBogq692wka/551N13S1Lr2bqrltzcvAHvoopGwmzdVTss76OAIyIiksKyF72L3vb9dG5cQdb885JdDt+79Z7jroMzHBRwREREUlT6zDPwZefR9OzvKUqL8NvIV/lIKJe6bn/SampubR+WdW6OR5OMRUREUlCgsJz0ytNpXn4/9Ea5aV4tZ2fWcPP84bkENNppBEdERCTFeDMnMuGM99D88oM0XP4Cab63J+5+ZlYjn5nVSFfUyL13YfKKTDCN4IiIiKQQ8wXIWfxB2tcuI9Kwh6oH53Lfjhz64hmnM2rcs20icx6Ym9xCE0wBR0REJIVMOPO99Oyrpmv7GwDs7fIzb2InBnRFjaDX0RrxJHUezkhQwBEREUkRGXOXYP4gbaufPvjah8v2U5oe5c4teZz3+Exu35RHYVo0iVWODM3BERERSQHByTNJK5tL4zO/BdcHQFlGD/99ZjXvWlrJqqZ0AL60siyZZY4YjeCIiIiMcb4Jk8g+7RKaX3oAF+4EwGuOXy3ZwY/XFRwMN+NJQgOOmV1mZhvNbIuZ3TTA8cvNbI2ZrTazV83snMH2FREREbBAGjmLP0jb6qeJNtcffP0f5+2lu9f44bqCJFaXPAm7RGVmXuBW4BKgGlhpZg8559b1a/Y08JBzzpnZAuB/gdmD7CsiIjK+mYecsz9A9+6NdO/ecPDld0xq59MzG1j82GwcA+z5NA4kcgTnTGCLc26bc64HuBe4vH8D51y7cwd31coA3GD7ioiIjHdZp1yA643S/tYLB1+b4I/yqyU7+fzLZdR2pfadUseSyIAzGdjd73l1/LVDmNmHzGwD8ChwzVD6xvtfG7+89arrjQxL4SIiIqNdqHw+gcJyWlY8wtvjA46fnLWbP+/J5rE9E5JZXtIlMuAMNCZ2xB7ozrn7nXOzgQ8C/zKUvvH+tznnTnfOnW7e8ZtURURk/PDnlZA17500L78fFwkffP3vpjcxe0I3N68acExgXEnkbeLVwJR+z0uBmqM1ds49b2YVZpY/1L4iIiLjhSctkwlnf4CWVx+nt63p4Oszsrr5t9NquGzpDLp7dZN0Ir+BlUClmU0zswBwJfBQ/wZmNsMstle6mZ0GBIDGwfQVEREZdzw+ct7xQTq3rKJn77aDL/s9ffz6nB18b00R61rSkljg6JGwERznXNTMrgeeALzAnc65tWZ2Xfz4z4EPAx8zswjQBfxtfNLxgH0TVauIiMhYkL3oUno7muncuOKQ179zSi21XX5+sSk/SZWNPvb2TUxjnyeU5YKli5JdhoiIyLBLrzydUFkVTc/+Hnrf3mrhgqJWbn/HLs56bDaN4dTcoKB763OvOedOH0ofXaQTEREZ5QKF5aTPPIPm5fcfEm7ygxHuWLyLT79UlrLh5kQp4IiIiIxi3owcss94Dy2vPExfV1u/I46fv2MX92yfyF/2ZietvtFKcU9ERGSUMp+fnMUfomPdciIN1Ycc+8zMBorSIlz1/LQkVTe6KeCIiIiMUtlnvJeexj10bVt9yOtzc7r4xoK9XPBEJZE+XYwZiL4VERGRUSijagmeYBptrz91yOshbx93nbODr68qYWtbKEnVjX4KOCIiIqNMcPJM0srn0fLSg+D6Djn276ftYV1ziN9uy01SdWODLlGJiIiMIr4Jk8g+7RL2v3AffeHOQ469t7SFd09u5axHZzHwrkZygAKOiIjIKGGBNCa844O0rX6GaHPdIceK0yL85KxdXP38NFoi+uv7eHSJSkREZDQwDzlnv5/wno10715/6CEcdyzewW2b8nlpX2aSChxbFHBERERGgawF5+P6eml/84Ujjn2pqp6g1/GfbxUlobKxSQFHREQkyUJT5xEomkbLK48Ah26htCivgy9W1XPNsnJ6nebdDJYCjoiISBL5c4vJmn8uzcvvx0XChxzL9PXy6yU7+fKKUnZ1BJJU4dikgCMiIpIknlAGE86+nJbXnqC3remI4z84o5oX6zP4466JSahubNM0bBERkWTweMlZ/EE6t71OT+3WIw7/9dT9nD2pg8WPzUpCcWOfAo6IiEgSZJ92Kb0drXRueOWIY2UZYX5wRjWXP1NBR9SbhOrGPl2iEhERGWHpMxbhyymg5dXHjzjmNcdd5+zkv9cW8HpTehKqSw0KOCIiIiMoUDCV9Fln0rz8fuiNHHH85vl7aY94+PH6giRUlzp0iUpERGSEeDNyyD7zvbS8/BB9na1HHF8yqZ1rKhtY/NhsnLZiOCkawRERERkB5vOTs/iDdKxbTqSh+ojjOYEody7ZwedeLmNvlz8JFaYWBRwREZERkH3Ge+hprKFr2+oBjjpuPWs3j1Tn8PieCSNdWkpSwBEREUmwjDmL8QTTaXv9qQGPf7yiicrsbr6+qmSEK0tdCjgiIiIJFCypJG3afFpeeghc3xHHK7O7+ddT9/DxF8sJ9+mv5eGib1JERCRBfNn5ZC+6lOaXHqAv3HHE8YCnj7vO2cF33yhmfUtaEipMXQo4IiIiCWCBEBMWf4i2N/5CdH/dgG3+eWEt1R0Bbt+cP8LVpT7dJi4iIjLczJhw1gcI79lE9651Aza5qLiVK6bu5+zHZoNuCR92CjgiIiLDLHPB+eD6aH/z+QGPTwpGuO0du7hm2VQaw/qrOBF0iUpERGQYhabOJVhUQcsrDwNugBaOXyzexe+25fJcXdZIlzduJDTgmNllZrbRzLaY2U0DHP+Ima2J/yw3s1P6HdthZm+a2WozezWRdYqIiAwHX24xWfPPo3n5/bhIeMA2n53VwKRglO++UTzC1Y0vCRsXMzMvcCtwCVANrDSzh5xz/S9GbgfOc87tN7N3A7cBZ/U7foFzriFRNYqIiAwXTyiDnLMvp+W1J+htaxywzbycLm6ev5fzH59J1GneTSIlcgTnTGCLc26bc64HuBe4vH8D59xy59z++NOXgdIE1iMiIpIYHi8T3vFBuratpqd264BN0ryxW8Jveq2Ebe3BES5w/ElkwJkM7O73vDr+2tF8Cvhzv+cOeNLMXjOza4/WycyuNbNXzexVN8CurCIiIomWfdol9HW10bHh5aO2+f6iPazZn8bvt+eOYGXjVyKnbg809jbQbCvM7AJiAeecfi8vcc7VmFkBsNTMNjjnjpiO7py7jdilLTyhrAHPLyIikihpM07Dl1PI/r/8/qht3l/azCXFrbolfAQlcgSnGpjS73kpUHN4IzNbANwBXO6cO3jR0jlXE/9dD9xP7JKXiIjIqBEoKCNj9tk0L3+Ao11FmJzew/87azefXFZOa8Q7whWOX4kMOCuBSjObZmYB4Ergof4NzKwM+BPwUefcpn6vZ5hZ1oHHwKXAWwmsVUREZNAyqhbjzZhA9pnvo+WVh+nrbBmwncccdyzeyc82TuKVhowRrnJ8S9glKudc1MyuB54AvMCdzrm1ZnZd/PjPgW8BecBPzQwg6pw7HSgE7o+/5gN+75x7PFG1ioiIDEVm1RKCk2fSsf4lIvt2H7Xdl6vq8BrcsrZwBKsTSPBKxs65x4DHDnvt5/0e/z3w9wP02waccvjrIiIiSeeJXWaKNtXStfX1ozY7Pa+D62fv45w/z6JPt4SPOK0PLSIiMggZVYvJrFpy8HnatAWkTVtA+7pldKxbfkjbTF8vvz5nBzesmEJ1Z2CkSxUUcERERI7LmzkRf24J0dYG2lY/w8Rz/4a6+245avsfnbmbZ/dm8cDunJErUg6hgCMiInIU5vOTMWcxaeXz6NjwMp1bXgfXd8w+V5Y3sSivkyWPzRqhKmUgCjgiIiIDCE2ZQ+aC8+ip20njk7+mL9xx8Fj7umUD9inPDPOfp+/h/U9X0NmrW8KTSQFHRESkH9+EArJOvQjz+Gh56SEiTUcs4XbEnBsAnzl+vWQHt7xVyBv700eiVDkGBRwRERHA/CEy550Tu/177Yt0bX+ToyzAP6CvL6ilJeLlJxsmJa5IGTQFHBERGeeMtOkLyKhaQrh6I41P3ImLdA/pDOcUtPGJGY2c/ehsnLZiGBUUcEREZNzy55WQtfBiXLSH5hf+j2jLviGfY2Igyp1LdnLdS2XUd/sTUKWcCAUcEREZdzyhDDLnn0dgUhntbz5L9+4NJ3gmx0/P3sUDu3J4smbCcJYoJ0kBR0RExg/zkF65iIxZZ9K1/U0an/jlUTfJHIxPzmhkWmYPH3+xfPhqlGGhgCMiIuNCoGAqWQsvorejhaa//J7e9v0ndJ6itAh3n7Odb68u4Z8X1nLJk5X09CVy72o5EQo4IiKS0jzp2WSdcgG+CQW0vfEMPbVbT+p8N82rZXFBB/973ja+vbqEja2hYapUhpM5N/hb4EY7TyjLBUsXJbsMEREZDTw+MmafSXrFqXRufo2OTSuhr/eET9d05WrSfEf+ndkVNXLvXXgShcrxdG997jXn3OlD6aMRHBERSZoDl3s++sI06obxDqRgSSVZp5xPpGkvjU/dTV9XK5m+PiaEepng72VCoJfsg7/7yAlEyfb3HXxtQiDW7uBzfy8Bj6OnF3we8Bh0Ro0Hd+Vw86rJw1a3DB8FHBERSZoDl3tunl/LDSvLjtLKkeZ1B4PGwXDSL4wceJ6T4SM3L4cJvtdI736c7OJuJpT1kuXvpbvXQ2vES0uPl9aIh+Yeb+x5xEtrj5fmHi97Ov0Hn7f0xI9FvLT0eGiLevnhGbv5VGUjXVEj6HW0RjzDGsxk+CjgiIjIiDv8cs9nZjXymVmN9PbBC/WZZPt7yek3yhLts35h40BIORBOPLT0BtmdNYfNE6dRv3sX9bt209pTfDCstEa8RN3JL8BXEIpy+6Y87tyczzWVDRSlRU/6nJIYmoMjIiIjriSthycv3Ux5Zg9eg55eeL0pnV9tzmNnZzA2ghLxxH97j3mXUqhsLpnzz6Vn73ba33qevnDnCH4SGQmagyMiIqNewNPHLafvIeiJ/Q92V9QIeB2rm9K4a1v+oM/jyykg69SLMfPQ/NIDRJtqE1WyjEEKOCIiMmLSvb3ce952OqIeVjWlU1PtG/LlHguEyJz7ToKTK2l/6wW6d7yZ4KplLFLAERGREZETiHL/BdvY2BLk86+U0dtvTsyXjjrBuD8jbfopZFYtpnv3htgqxJFw4gqWMU0BR0REEq4wFOHhi7bwTG0WN62aDEPccdufN5msUy/GRbrZ//z/Em1tSEyhkjIUcEREJKHKMsI8dvEW7t6ax3++VchQwk1sU8zzCUwqpW3Ns4SrNyauUEkpCjgiIpIwsyd08fCFW/mvtYX8YtOkwXc0D+mVp5Mx6ww6t71BwxNPwklsiinjjwKOiIgkxKK8Du47fxs3vzaZe3fkDrpfoLA8tilm+36anvkdvR3NiStSUpYCjoiIDLtzC9v4zTt38NmXynhsz4Rjts2oWkzHuuV4MyaQueACfBPyaVv9DD17t41QtZKKFHBERGRYva+0mVvP3s1Hni/nxfqs47bPrFoCGOkVC+nY/Cotrzx8UptiioACjoiIDKOrpzXyr6fV8MFnKni9Kf247YOlswDwZU2Mb4rZlugSZZxIaMAxs8uAHwNe4A7n3PcPO/4R4B/jT9uBzzrn3hhMXxERGV0+O2sfX6qq491LK9nYGjp6Q4+PnLM/QLCk4uBLoSlzCE2ZQ/u6ZXSsWz4C1UqqS1jAMTMvcCtwCVANrDSzh5xz6/o12w6c55zbb2bvBm4DzhpkXxERGRUcN8/fy1XT9nPxkzPZ1REYsJUF00mvWEja9IVEm2ppevYeIg3VFF5xI3X33TLCNUuqS+QIzpnAFufcNgAzuxe4HDgYUpxz/WP6y0DpYPuKiEjyGY7/XLSHdxa2c/GTldR3+49o482cSPrMMwiVzqK7eiP7n7uX3ramJFQr40kiA85kYHe/59XAWcdo/yngz0Pta2bXAtcC4AueYKkiIjJUXnP87OxdVGSFedfSGbREDv0rxZ9fSvrM0wnkltC5bTUNT/wSN8BO3+3rlo1UyTKOJDLgDLRUpRuwodkFxALOOUPt65y7jdilLTyhrAHbiIjI8Ap6+rj7nB0EvX287+kZdPV6YgfMCE6eScbMMzB/kM7Nr9LyyiPQe/SNNDXnRhIhkQGnGpjS73kpUHN4IzNbANwBvNs51ziUviIiMvIyfb3873nbaAz7+LsXpxPp82A+P6Hy+WRULqK3q52O9S8Trt2S7FJlHEtkwFkJVJrZNGAPcCVwdf8GZlYG/An4qHNu01D6iojIyMsNRHngwq28sT+NL66YAsEsMmecRtq0+fTU76L5lUeINtUmu0yRwQccM8twznUMtr1zLmpm1wNPELvV+07n3Fozuy5+/OfAt4A84KdmBhB1zp1+tL6D/lQiIjLsitNiO4L/uTqbf95+CpmLziBYUkH3znU0PfNbejtakl2iyEHm3LGnrZjZYmKXkDKdc2VmdgrwGefc50aiwKHwhLJcsHRRsssQEUk50zLDPHrRFn5dO4PbAh/BN2ESnVtW0bXtDVykO9nlSYrr3vrca86504fSZzAjOD8E3gU8BOCce8PMzj2B+kREZAyaOzHMQxdv58fdl/O7CefQvWkl3cvv13YKMqoN6hKVc253/BLSAfq3WkQkxZk/yDvnF/Hb2U/zzcbLuXd1mJ66Xye7LJFBGUzA2R2/TOXMLAB8AVif2LJERCRZPOnZpFcu4tLp8OPgz7l25Wz+vHljsssSGZLBBJzriO0JNZnY7dtPAp9PZFEiIjLyfBOLyJh5OoGCci7a/yf+0/skf/t0Ocv3aYkxGXuOG3Cccw3AR0agFhERSYJAcQUZM8/Am55N55bX+GDTb/n2/N28/+kK3th//B3BRUaj4wYcM/sVA6wi7Jy7JiEViYhI4nl8pE2tIr3ydFxvhM5NK+mu3sQXZu/lc7P2cenSSra0HWNHcJFRbjCXqB7p9zgEfAitKiwiMiZZIC22o3fFqUT376X19aVE9u0GHN8+pZYPlTVz8ZOVVHcOvCO4yFgxmEtUf+z/3MzuAZ5KWEUiIjLsvJkTSa88ndCU2Ufs6G04/vuMas7M7+DiJytpCB+5I7jIWHMiWzVUAmXDXYiIiAw/f95k0meeQSCvhM5tb9D4xC/p67ejt88cty/eyeT0CO9+qpLWiDeJ1YoMn8HMwWkjNgfH4r/3Av+Y4LpERGSIMqoWx3bmNiNYUknGrDMwf1psR+8Vj0Jv5JD2IW8fv3vndgA+8EwF3Qd2BBdJAYO5RJU1EoWIiMjJyaxaQl9PN+kzFtHX3UHHhhWEa7YwwH0iZPl7+eP529jT6efTy6cSdXbkCUXGsKMGHDM77VgdnXOrhr8cEREZKm/mRNKmzQcgkF9K64pHiTQd/V6Q/GCEBy/cyoqGDL68shSHwo2knmON4PzgGMcccOEw1yIiIoNkvgChKbPJmPMOvOnZB18Plc4iVDqL9nXLYperDlOa3sMjF23h/l05/PMbxaBwIynqqAHHOXfBSBYiIiLHFygoIzR1HsHiCnr27aL19afo2bsdXB+FV9xI3X23HLXvjKxuHrloKz/bmM+P1xeOYNUiI29Qd1GZ2Tygitg6OAA45+5OVFEiIvI2T/oE0srnkTZ1Ln2RMF073qTtjb/geroGfY4FEzt54IKt/PMbJdy1NS+B1YqMDoO5i+rbwPnEAs5jwLuBFwEFHBGRRPH6CZXOJK18Hr7sfLp3raf5pQeINtcftUv7umUDvr54Ujv3nLedG1aUcv+uiYmqWGRUGcwIzhXAKcDrzrlPmlkhcEdiyxIRGZ/8+ZNJmzqf4ORKIo176NzyOuHardDXe9y+A825ubSkhTsW7+KTy6bydG32AL1EUtNgAk63c67PzKJmlg3UA9MTXJeIyLjhScsibepcQlPngeula8dbtD/5An3dHSd13ium7ue/Tq/mr5+dzisNGcNUrcjYcKzbxH8C3AOsMLMc4HbgNaAdWDEi1YmIjLCitAh3n7Odj74wjbruBG5Z4PERmjyDUPl8/DmFdFdvpGXlo0Sbaofl9J+qbODr8/fyvqdn8FZz2rCcU2QsOdYIzmbgv4ASYqHmHuASINs5t2YEahMRGXE3zatlcUEHN8+v5YaVw78rjS+3mLSp8wiVziKyfy/dO96kec/90Bcdtvf46ty9XDOjkUuerGRbe3DYzisylphzR65weUgDs6nAlfGfELGgc49zbnPiyxsaTyjLBUsXJbsMERmDmq5cTZrvyD8Pe/qMj71QTkfUQ1fUQ2evh86oh65eD51RO/j4WIvleUIZhMrmklY+F8xL98636Nq5lr6utmGr/8DI01vNIc4r7OD9T1dQ06UdwSU1dG997jXn3OlD6XPcgHNIY7NTgTuBBc65UbcjmwKOiAzVpGCEy8tauHpaI6fldeI18Hkg0gc72wO82ZyGB0jz9ZHh6yPN20e6r490bx9pPkd6/LXuXusXfDx09nrp9qQTDuTQ7c+iozNMW2sbHR3d8ePxdtFYUHq7XyxIdUQ9h53PQ98xtlP48Zm7+HRlI/u6vZz6cBVNPSeyl7LI6HQiAWcwt4n7gcuIjeBcBDwH/PMJVSgiMgrkBaNcPqWZD0/dz2l5XTyxJ5sfrivkXSWtfKKyka6oEfA6nq7NGuRlKkeaNxZ2siZOZGLZdHKKpxDo3Id39yZ8zbtItwhpPkj3BkjzxULSxPRov8DkDr7eP0j1D1RR93aIOhCA5k/swtMv9xSk9bLnb96kK2rk3rswUV+hyKh3rEnGlwBXAe8lNqn4XuBa59zJTesXEUmCiYEo75/SwhVT93NmfgdLa7K5fdMkHq/JPriL9tXTm7h9Ux53bs7nmsoGitIGNy/GAulYWRWufB7t/iD7dr5F91Mv0NvREm8xHHsWO4KeWIjqH3xK03u4fvY+3lHQQcjr6IwaD+7K4eZVk4fhPUXGrmON4Hwd+D3wVedc0wjVIyIybCb4o7xvSgtXTG3mHZPaeaY2m7u25HHlc9Po7D3yKvtVz7+9AsaXjjdyYx6CRdMIlc8nMGkK4dqttL3xFyL7dg33xzjwhoT7jHCPh/09b7+6Zn8675rcyrlF7XRFjaDX0RrxJPYOMJExQHtRiUhKyfL38t7S2EjNOQXtPLc3i3u2T+TvXiinI3ryUwe92fmklc8jVFZFb3sz3TvepHXlY7hoz/E7J0hBKHpCI08iqWxIk4xHO00yFhmfMn2xUPPhqc2cW9jGC/WZ/HHHRB7dM4G2yNBDTUbV4kNWBTZ/iNCU2aSVz8MTyqR711q6drxFb/v+4fwYInIUCZlkfDLM7DLgx4AXuMM59/3Djs8GfgWcBnzDOfdf/Y7tANqAXiA61A8mIqkt3dvLe0pb+fDU/VxQ1MbyfZnctyOHTy8voyVycn+0ZVYtoWPdSwQKp5JWPp9AYTk9ddtpX/siPXU7gdT5H0ORVJWwgGNmXuBWYosDVgMrzewh59y6fs2agC8AHzzKaS5wzjUkqkYRGVvSvH1cNjk2UnNxcSuvNGRw346JfO7lMvYP023R3qxcAPLf+xn6utrp2vEWrauexEXCw3J+ERkZiRzBORPY4pzbBmBm9wKXAwcDjnOuHqg3s/cmsA4RGcOCnj7eNTk2UnNpSRuvNabzx505fHHFFBrDw/NHmC+nkKxTLiAwacrB17xpWXjTsgjv3aZwIzIGJTLgTAZ293teDZw1hP4OeNLMHPAL59xtAzUys2uBawHwaUlykVQQ8PRxSUkbH566n8tKWnljfxp/3DmRr64sZV94OO4OMvz5kwlOriRUUonr6yO8ZxNtbz5HtKmWwitupO6+W4bhfUQkWRIZcAZacnMoF66XOOdqzKwAWGpmG5xzzx9xwljwuQ1ik4xPrFQRSTa/p4+Litv4cFkz7yltYW1zGn/cmcPNr00enluePV4CBWUESyoJlsygr6udcM1m9i/7E72tuhIukmoSGXCqgSn9npcCNYPt7Jyrif+uN7P7iV3yOiLgiMjY5TPHBUWxkZr3TWlhY0uIP+7M4VurS6jtGoZQ4/UTLJpGcHIlwaLpRFsbCe/ZxP6//K7fInxHal+37OTfW0SSKpEBZyVQaWbTgD3Etnq4ejAdzSwD8Djn2uKPLwW+m7BKRWTYHdj88aMvTDtkBMZrjvMK2/jw1GY+MKWZrW1B7ts5kX9ZU8yezpPfHNL8QYLFMwhOriRQUEakqZbwnk20r3mWvu7BLcTe/xZxERmbEhZwnHNRM7seeILYbeJ3OufWmtl18eM/N7Mi4FUgG+gzsxuAKiAfuN/MDtT4e+fc44mqVUSG303zallc0MHN82v58qtTeGdBOx+eup/Ly1rY1R7gvp05LPnzbHZ1nHyo8YQyYpeeJlfizy2mp34X4T2baX31cVykexg+jYiMNVroT0SGVdOVq0nzHfnnSp+Df3q9hD/uzGFnx8nfEODNmBAPNTPxZecR3ruN8J7NhPduh97ISZ9fREaPUbfQn4iML0VpEb75eglfmFNPWUYEM+jphSdqsvmHV8pOerKwNzuf0ORYqPGGMuiu2ULH+uX01O8C1zdMn0JEUoECjoicsICnj8UFHVxS3MrFJa2Upkd4dm8WO9sDTMmI0B01Al5HTaf/hMONL7c4FmpKZmIeD901m2lb/TSRhj1oRWERORoFHBEZAkdldjgeaNpYMqmdDS0hltZm84VXyni1MZ1eZ9xz7jZuO9HNH83w50+Jh5pKXDRM957NtLzyMNHmusR9NBFJKZqDIyLHlO3v5YKiNi4uaeWS4jZ85lham8VTNdk8szdreLZI8HgJFE4lVDKTYEkFvR2tdNdsIrxnM71tTSd/fhEZ0zQHR0ROmsccp+Z2cklJG5cUtzJ/Yhcv78vgqdpsfrphEutbQgy8jufQmM9PoGg6ockzCRSWE23ZR/eeTbSvX05fZ+vJfxARGdcUcESE4rQIFxW3cklJKxcWtVHf7eep2iz+/c0iXqzPpLvXc0LnzahafMiaMhZII1hSQWjyTPz5pUQa9hCOz6npC3cO18cREVHAERmPgp4+Fhe0c0lJGxcXtzI5PcJf9maxtCabb6yaTPUwLLgHkFm1hK7tawiWVBKaXIlvYhE9dTvo3rWellcewUV7huV9REQOp4AjMi44ZvabHLx4Ujvr45OD/6Hf5ODh4svOJ1BcAUDeJZ8gXLOVzs2rCNftgL4hTDgWETlBCjgiKerwycFecyytzeY3W3P55LKpNA/H5OADPF4Ck6YQLK4gVFaFJxB6+1AgjbTyefR2thCu3TJ87ykicgwKOCIpwmOO03I7ubjf5OCX9mXwVE02t26YxIZhmhx88P1CGQSKphMsriBQUEa0ZR/h2q00Pft7elsbASi84kbq7rtl2N5TRGSwFHBERrmjbVoJscnBF8cnB19Q1EZdt5+narL4tzeLWHYSk4OPxpdTSLC4gmDxdLyZE+mp2054zyZaX3sC19M1rO8lInIyFHBERrn+m1b+42ulLC5o59L45ODi9Ah/qc1iaW02N6+aPCy7cR/C6ydYUEaguIJgcQUu2kO4dittbz4XW0n4ONsjtK9bNrz1iIgMkhb6ExmljrVp5ffWFLG0JpvXmtLpG8bJwQCetKz4KE0F/vxSovtrCdduJVy7jd72/cP6XiIig6GF/kRSwAR/lAuK2rl/Vw6XT2kmzefwGIR7jUeqJ/CVlaUnvWnloQx/bjGB4th8Gm9aJuG92+na+RYtKx7BRcLD+F4iIiNDAUckyTzmWJTbefBup7k58cnBtdn4zPHh8ma64ptWNnR7hyXcmC9AoLA8NlJTNI3ecCc9tVtpe/0pIo01aBNLERnrFHBEkqAkrYeLitsOmRy8tCabf10Tmxwc7otNDr7n3G3cfqKbVh7Gm5ETu+OpuAJ/bjGRxmrCtdtoX7dMWyOISMrRHByRERD09LGk38rB/ScHP12bNfyTgyG2K3fe5IPzacwfpGfvNsK1W+mp24nrjQz/e4qIJIDm4IiMGo5Z2WEuKWnl4uJW3jGpg7XNaSytzeJzL5clZHIwgPlDBIumxebTFE2jt6OFcO1WWlY+SnR/3bC/n4jIaKWAIzJMDkwOPhBqAJbWZvPrLfl8/MVyWiKJ+c/Nm5VLsHgGweLp+HIK6Nm3i57abbSveY6+7vaEvKeIyGingCNyggaaHLx8XyZP1WTx4/UFbGoNMlwrBx+yK7fHSyC/9OB8GvN4CNdupWPjK/TU79ZeTyIiKOCIDElJWs/BrRAuKG6jttPPU7VHTg4ebplVS+jtaIlvizCVaFtj7NLTSw8QbdmXkPcUERnLFHBEjiHo6eOcwvaDu3AXhiL8ZW8WT9Zk84+vTaamKwGTgwEwfLlFBIumESyaFquluIJw7VZaX38KF+5M0PuKiKQGBRyRQxw5Ofit5jSW1mZz3UtlrErQ5GAAC6QRLCyPbWBZVA7O4QllHDweKp1FqHQW7euWvX25SkREBqSAI+PG0TatzAlEuaCojYvj69I4F5sc/KsETw4G8E0sIhi/48mblUdP/S569m6n/a3n6etqO9hOu3KLiAyNAo6MGwc2rfz6glp+ty0vvgt3G1UTEjc5+HCHj9L0dXcSrttO25svEGmoPu7mlSIiMjgKOJLyDt+08tqZjVw7s5FoH3zgmQqWJ3ByMMRHaYqmEyiahi87L34b93ba174w6BWEtSu3iMjQKOBISgt4+vjW6yV845Rasv19eAy6osYDu3K4edXkYd60MsYCIYKF0wgUTSNYWE5fTxfhvdvpWPsCPQ17oK93yOfUnBsRkaFJaMAxs8uAHwNe4A7n3PcPOz4b+BVwGvAN59x/DbavyLFM8Ef59MwGPjurgbXNIZbVZ3DZ5LaDm1a2RjzDGm5iozTTCBRNf3uUZu922te+qH2eRESSIGEBx8y8wK3AJUA1sNLMHnLOrevXrAn4AvDBE+grcoQp6T1cP6eev5vexJ/3ZPPBZ6bzZnP6sG5aCQdGaeJzaQ4ZpXmRnobqExqlERGR4ZPIEZwzgS3OuW0AZnYvcDlwMKQ45+qBejN771D7ivS3YGInN1TVc2lJK7/ZmsdZj86mut8Gllc9P/3g4y+tLDuh9/BNLIzPpYmN0kT27SasURoRkVEpkQFnMrC73/Nq4Kzh7mtm1wLXAuALDrlIGcscFxW38aWqeuZM6ObWDZO4YcUUWiPeYTl7/1GaQGE5rqdbozQiImNEIgPOQPfZugFeO6m+zrnbgNsAPKGswZ5fxjCfOf66fD83VNXhAX60voD/3TGRyDDcCfX2KM00fNn5/UZpltHX2XLyxYuIyIhIZMCpBqb0e14K1IxAX0lRWf5erpnRwPWz97GlLcg/vV7CkzXZDGXNmkM2rQTMHyJQWB6fIDyt3yjNMo3SiIiMYYkMOCuBSjObBuwBrgSuHoG+kmJK0nr43Ox9fGJGI0/XZvE3z03n9ab0EzpXZtUSwjVb377jaUK/UZp1yzVKIyKSIhIWcJxzUTO7HniC2K3edzrn1prZdfHjPzezIuBVIBvoM7MbgCrnXOtAfRNVq4xOVRO6uKGqnveWtnDP9lwWPzaLXR0nMM/K6ydYOJVgcQUAE858L+G67XSsX07Pvt0apRERSUHmXOpMW/GEslywdFGyy5CT4ji3sJ0vVdVzSm4nP9swiTs257O/Z2hZ3BPKIFhcQbBkBoGCqZj3yP7atFJEZGzo3vrca86504fSRysZy6jgNcdflTXzxao6Mn19/Gh9AVc+N21IWyj4JkwiWDKDYHEF3swcwnu307VzHS0rHsVFwoA2rRQRGS8UcCSpMny9fLyikX+Ys4/qDj//tqaYP+/Jxg1m4rB5CEyacjDUOOcI126h7c3ntXGliMg4p4AjSVEYivDZWfu4prKRF+sy+dgL5axszDhuP/OHCBZPJ1hcQaCwnGhbE+GaLexf9kd6WxuP21+bVoqIjA8KODKiZmZ388U59XyorJn/3TGR8x+fybb2Y08c9mbmECyeQbCkAl9OIT37dhGu2Urb6mfoC3cM6f0150ZEZHxQwJER4FgyqYMb5tZxRl4nt23KZ8FDc2gIH22zS8OfV0KwpIJg8QzMHyRcu5WOTSvpqdsFfSe3j5SIiKQ+BRxJGI85PlDawpeq6sgN9vI/6yfxsRem0dV75MRh8/pjC+6VVBAsmk5vdwfh2q20rHyM6P69SaheRETGMgUcGXZp3j4+WtHIF+bU09Dt47/XFfJw9QT63KEThz2hzPgoTQX+/FIiTbWEa7bEF9zT5pUiInLiFHBk2OQHI3xmVgPXzmzglX0ZXLt8Ksv3ZdB/KwXfhIKDl568mRPit3KvpeWVR3DRnuQVLyIiKUUBR4asKC3C3eds56MvTKOu28/0zDBfrKrnr6fu50+7crj4yUo2t4ZijT3e2K3c8UnCrq+PcM0W2t58lkjDHt3KLSIiCaGAI0N207xaFhd08KMzdwOwpKCDX27OY+HDc6jv9mOBEKGy6QdXEY62NcZu5X7hPnrbjn8rt4iIyMlSwJFBa7pyNWm+t7f2+GBZbGPK7l7jX7fOJVg2g4nFFfhyCuip30W4Zgutrz+FC3cmq2QRERmnFHBk0M54ZDZ/vGAbM7PDmEFnr4dHWyr5t76PMfG8SbFbuTeuoKdet3KLiEhyKeDIoLx7cgs/PnM3nX1+HBB2foKeKG29fraseIHo/rpklygiInKQAo4cU2Eowg/O2MPCSRG+Gvkcn8xcziu9E7in9yKu8j5NSW4LweIKBRwRERlVFHBkQIbjmrldfHveLv7Qez5f3fcO9m9Zy0M1feAaKbxiKp+598CEYW1/ICIio4sCjhzKPMyrmMT/LNxAyGdcse3DvLauht72+5NdmYiIyKAp4AgAnrQssqfP5Suz93BN4Cm+v72KW1c6+nrXDtheu3KLiMhopoAzrhmBommkTz+FdxR08m++29nWbJy1fBrVnb3H7KlduUVEZDRTwBmHPKEM0srnkzZtARk9jdzI3bzHs52vrpjMn3bl0H9rBRERkbFIAWccCRRMJW36KQQKptJdvZF3bv8Ft8xZy+M12Zz2wmyae/Svg4iIpAb9jZbiLJBGWvk80qafgotG6Nr2BplrH+Inp25j1uRuPr6snGX1mckuU0REZFgp4KQof34padNPIVg0PbZlwopHiTbV8OmZDXzzXXu5bVM+H3uxnHCfJ9mlioiIDDsFnBRi/iChqXNJn34KYHRuW03b60/hImHmTOjip+/ajXNw6dIZbGhJS3a5IiIiCaOAkwJ8ucWkTz+FYEkl4b3baF21lEhDNQBBTx9fW1DHp2c28N03ivnl5jycJhGLiEiKU8AZo8znJ1RWRdr0hZjPT9e2NbS9+ctDdu4+p6CNn5y1m/UtIc5+dBY1XYEkViwiIjJyFHDGGF9OAWnTFxIqnUVP/S7a1zxLT/3OQ9rkBKJ879Qa3lXSypdWlvJwdU5yihUREUkSBZyxwOsjVDqb9IpT8IQy6dr2Bo1P3klfd8dhDR0fLmvmltOreXB3Dqc9MofWiDcpJYuIiCRTQgOOmV0G/BjwAnc4575/2HGLH38P0Al8wjm3Kn5sB9AG9AJR59zpiax1NPJm55E+7RRCZVVEGvfQvu4levZuB9wRbaek9/CjM3czNbOHq5+fxssNuvVbRETGr4QFHDPzArcClwDVwEoze8g5t65fs3cDlfGfs4CfxX8fcIFzriFRNY4GGVWLD932wOMlNHkmaRUL8Wbk0LV9DY1P3UVfV9uA/T3m+OzMfdw0fy8/2VDAlc9PI6Jbv0VEZJxL5AjOmcAW59w2ADO7F7gc6B9wLgfuds454GUzyzGzYudcbQLrGlUyq5bQsW453swc0qYvJK2sikhzPZ2bXiVcuxVc31H7zs/p5Kdn76az18OFT85kc2toBCsXEREZvRIZcCYDu/s9r+bQ0ZmjtZkM1BK7DvOkmTngF8652wZ6EzO7FrgWAF9wWAofMRYbacl559/gm5BP9863aPrL7+ntaD5mt5C3j6/P38vHZzTyrddLuHtrrm79FhER6SeRAWegv3EPnzxyrDZLnHM1ZlYALDWzDc65549oHAs+twF4QllHTk4ZhTKqFpNZteTg82DhVABcb/S44eaColb+31m7WdWYzpmPzKau25/IUkVERMakRAacamBKv+elQM1g2zjnDvyuN7P7iV3yOiLgjEUd65YfnHdTeMWN1N13y3H75AaifH/RHs4rbOOLK6fw+J4JiS5TRERkzErkbNSVQKWZTTOzAHAl8NBhbR4CPmYxZwMtzrlaM8swsywAM8sALgXeSmCto5jjyvImXnv/epp7vJz2yByFGxERkeNI2AiOcy5qZtcDTxC7TfxO59xaM7sufvznwGPEbhHfQuw28U/GuxcC98fuIscH/N4593iiak2m9nXLjnpsakaY/zlrN0VpEa54djqvNWaMYGUiIiJjl8VuYEoNnlCWC5YuSnYZJ81rjn+YXc9X5tbxo3WF/Hh9AVGnScQiIjI+dW997rWhroenlYxHmVNzO7n17F3sD3s59/FZbG8fY3eGiYiIjAJaES6JitIiPHnJJgpDEdK9vXz/tGruv2ArP1k/ifc+PUPhRkRE5ARpBCeJbppXy+KCDn569i6qcrpZXp/B6Y/MpiGsW79FREROhgJOEjRduZo039tzn95T2gpAYSjCp5aXJ6kqERGR1KFLVElQ9eBc7t0+kc5obOJwZ9S4Z9tE5jwwN8mViYiIpAYFnCTY2+WnNeIh6HV0RY2g19Ea8WhVYhERkWGiS1RJUhCKcvumPO7cnM81lQ0UpUWTXZKIiEjK0Do4IiIiMqqdyDo4ukQlIiIiKUcBR0RERFKOAo6IiIikHAUcERERSTkKOCIiIpJyFHBEREQk5aTUbeJm1gZsTHYd40Q+0JDsIsYRfd8jS9/3yNL3PXLG6nc91Tk3aSgdUm2hv41DvU9eToyZvarveuTo+x5Z+r5Hlr7vkTOevmtdohIREZGUo4AjIiIiKSfVAs5tyS5gHNF3PbL0fY8sfd8jS9/3yBk333VKTTIWERERgdQbwRERERFRwBEREZHUkxIBx8wuM7ONZrbFzG5Kdj2pzMymmNlfzGy9ma01sy8mu6ZUZ2ZeM3vdzB5Jdi2pzsxyzOw+M9sQ/3f8HcmuKZWZ2Zfif468ZWb3mFko2TWlEjO708zqzeytfq/lmtlSM9sc/z0xmTUm0pgPOGbmBW4F3g1UAVeZWVVyq0ppUeArzrk5wNnA5/V9J9wXgfXJLmKc+DHwuHNuNnAK+t4TxswmA18ATnfOzQO8wJXJrSrl/Bq47LDXbgKeds5VAk/Hn6ekMR9wgDOBLc65bc65HuBe4PIk15SynHO1zrlV8cdtxP4CmJzcqlKXmZUC7wXuSHYtqc7MsoFzgV8COOd6nHPNSS0q9fmANDPzAelATZLrSSnOueeBpsNevhy4K/74LuCDI1nTSEqFgDMZ2N3veTX6C3dEmFk5cCrwSpJLSWU/Ar4G9CW5jvFgOrAP+FX8kuAdZpaR7KJSlXNuD/BfwC6gFmhxzj2Z3KrGhULnXC3E/ocVKEhyPQmTCgHHBnhN974nmJllAn8EbnDOtSa7nlRkZu8D6p1zryW7lnHCB5wG/Mw5dyrQQQoP3ydbfO7H5cA0oATIMLO/S25VkkpSIeBUA1P6PS9Fw5wJZWZ+YuHmd865PyW7nhS2BPiAme0gdun1QjP7bXJLSmnVQLVz7sCI5H3EAo8kxsXAdufcPudcBPgTsDjJNY0HdWZWDBD/XZ/kehImFQLOSqDSzKaZWYDYJLWHklxTyjIzIzZHYb1z7r+TXU8qc87d7Jwrdc6VE/v3+hnnnP4PN0Gcc3uB3WY2K/7SRcC6JJaU6nYBZ5tZevzPlYvQpO6R8BDw8fjjjwMPJrGWhBrzu4k756Jmdj3wBLFZ+Hc659YmuaxUtgT4KPCmma2Ov/Z159xjyStJZNj8A/C7+P8sbQM+meR6UpZz7hUzuw9YRezuzNcZR9sIjAQzuwc4H8g3s2rg28D3gf81s08RC5l/nbwKE0tbNYiIiEjKSYVLVCIiIiKHUMARERGRlKOAIyIiIilHAUdERERSjgKOiIiIpBwFHBE5hJl9I77D8xozW21mZw2x/yfMrGSIfcr773h82Otd8TrWmdnPzeyE/9wys2fN7PT448fMLOcYbT/YfyNZM/uumV18ou8tIiNrzK+DIyLDx8zeAbwPOM05FzazfCAwhP5e4BPAWwzfiuJbnXML4xsyPkNsc8CDK2ibmc85Fx3qSZ1z7zlOkw8CjxBf7M85962hvoeIJI9GcESkv2KgwTkXBnDONTjnagDM7KL4JpRvmtmdZhaMv77DzL5lZi8CVwGnE1ssb7WZpZnZIjN7zsxeM7Mn+i0Tv8jM3jCzl4DPH6+weIhZDsyIjxL9n5k9DDxpZhnxmlbGa7w8/h5pZnZvfDTqD0DagfPF686PP/5YvM0bZvYbM1sMfAC4Jf45Kszs12Z2xSC+i382s1XxY7OH4Z+JiJwABRwR6e9JYIqZbTKzn5rZeQBmFgJ+Dfytc24+sdHfz/br1+2cO8c591vgVeAjzrmFxFao/X/AFc65RcCdwPfifX4FfME5947BFGZm6cSW838z/tI7gI875y4EvkFsK4szgAuIBZOMeI2dzrkF8fddNMB558b7X+icOwX4onNuObEl7W90zi10zm3t1/5430WDc+404GfAVwfz2URk+CngiMhBzrl2YiHgWmAf8Acz+wQwi9jGiJviTe8Czu3X9Q9HOeUsYB6wNL61xzeBUjObAOQ4556Lt/vNMcqqiPddBjzqnPtz/PWlzrmm+ONLgZvi7Z4FQkBZvMbfxj/bGmDNAOe/ELjPOdcQb9c0QJvDP9OxvosDl89eA8qPcy4RSRDNwRGRQzjneomFhGfN7E1iG/KtPk63jqO8bsDaw0dp4pN7B7tPzNb4aNCx3tOADzvnNh72PgzifWwItRxofyzh+O9e9GesSNJoBEdEDjKzWWZW2e+lhcBOYANQbmYz4q9/FHiOgbUBWfHHG4FJ8cnLmJnfzOY655qBFjM7J97uIydZ+hPAP8R3pcbMTo2//vyBc5vZPGDBAH2fBv7GzPLi7XIH+Bz9DeW7EJEkUcARkf4ygbvit2SvAaqA7zjnuontrP1/8VGdPuDnRznHr4Gfxy8XeYErgP8wszeIjQQtjrf7JHBrfJJx10nW/S+AH1gTv938X+Kv/wzIjH+WrwErDu/onFtLbH7Oc/Ea/zt+6F7gxvhk4op+7YfyXYhIkmg3cREREUk5GsERERGRlKOAIyIiIilHAUdERERSjgKOiIiIpBwFHBEREUk5CjgiIiKSchRwREREJOUo4IiIiEjKUcARERGRlKOAIyIiIilHAUdERERSjgKOiIiIpBwFHBEBwMzeaWYb+z2fFd9Ju83MvnCS537WzP7+5KtMDjPbYWYXH+XYId+biIwOCjgi48zR/rJ2zr3gnJvV76WvAc8657Kcc/9zrL/kR5qZ/drM/vU4bf7FzN40s6iZfeewY+ebWZ+Ztff7+fiJ1DLA9yYio4Av2QWIyKg1Fbg32UUczsy8g2y6hVhIu+4ox2ucc6XDU5WIjDYawRER4OCoRnX88TPABcBP4qMb9wBlwMPx5187yjkuN7PVZtZqZlvN7LJ+h6ea2bL4Ja8nzSy/X7//M7O9ZtZiZs+b2dx+x35tZj8zs8fMrAP4FPAR4GvxWh4eqBbn3F3OuT8DbSf51RxwhpmtM7P9ZvYrMwvF6zv4vcWf7zCzr5rZmvjn+UO/tvlm9oiZNZtZk5m9YGb6c1gkAfQflogcwTl3IfACcL1zLtM5dxWwC3h//Pl/Ht7HzM4E7gZuBHKAc4Ed/ZpcDXwSKAACwFf7HfszUBk/tgr43WGnvxr4HpAVf4/fAf8Zr+X9J/gxC8yszsy2m9kPzSzjOO0/ArwLqABmAt88Rtu/AS4DpgELgE/EX/8KUA1MAgqBrwPuBOsXkWNQwBGR4fIp4E7n3FLnXJ9zbo9zbkO/479yzm1yznUB/wssPHDAOXenc67NORcGvgOcYmYT+vV90Dm3LH7e7mGodUP8/YuBC4FFwH8fp89PnHO7nXNNxMLWVcdo+z/OuZp424d5+7NG4u851TkXic/fUcARSQAFHBEZLlOArcc4vrff404gE2Jzaszs+/FLWq28PeqT36/97uEs1Dm31zm3Lh6YthObq3PFcbr1r2EnUHKMtgN+VuAWYnODnjSzbWZ20xBLF5FBUsARkcE63kjDbmKXb4bqauBy4GJgAlAef92O8d7DPerhDnu/gUzp97gMqBnym8RGqb7inJsOvB/4spldNNTziMjxKeCIjE9+Mwv1+xnMHZV1wPRjHP8l8Ekzu8jMPGY22cxmD+K8WUAYaATSgX8bhlowM398cq8H8MU/pzd+7HwzK7OYKcD3gQeP856fN7NSM8slNnfmD4Oo8/Ca3mdmM8zMgFagN/4jIsNMAUdkfHoM6Or3851B9Pl34JvxO4C+evhB59wKYpOIfwi0AM8Ru9X8eO4mdslnD7AOeHkQfX4JVMVreeAobW4n9tmuAr4Rf/zR+LHTgJeADmA58BZwvMUMfw88CWyL/xxzHZ6jqASeAtrj7/9T59yzJ3AeETkO0/w2ERERSTUawREREZGUo4AjIiIiKUcBR0RERFKOAo6IiIiknJTabNO8fmf+ULLLEBERkWHkwu0NzrlJQ+mT0IAT32jvx4AXuMM59/3Djl8O/AvQB0SBG5xzL8aP7SC2SV4vEHXOnX7c9/OHCJYuGtbPICIiIsnVvfW5nUPtk7CAE19Q61bgEmKby600s4ecc+v6NXsaeMg558xsAbH9afovDHaBc64hUTWKiIhIakrkHJwzgS3OuW3OuR7gXmLLsR/knGvvt9FcBtpVV0RERIZBIgPOZA7dnK46/tohzOxDZrYBeBS4pt8hR2xDutfM7NqjvYmZXWtmr5rZq643Mkyli4iIyFiWyDk4A21cd8QIjXPufuB+MzuX2Hyci+OHljjnasysAFhqZhucc88P0P824DYATyhLI0AiIiKjWE52Jt/4/FVUlBXjsbejQp9zbN1Vy/duvYfm1vaTfp9EjuBUc+juu6UcY/fdeHipMLP8+POa+O964H5il7xERERkDPvG56/ijIXzKCgsIb/fT0FhCWcsnMc3Pn/VsLxPIgPOSqDSzKaZWQC4Eniof4N+u+piZqcBAaDRzDLMLCv+egZwKbHN8ERERCQJMqoWD8t5KsqK8fmDYIdd6DHD5w9SUVY8LO+TsEtUzrmomV0PPEHsNvE7nXNrzey6+PGfAx8GPmZmEWI7/f5t/I6qQmKXrQ7U+Hvn3OOJqlVERESOLbNqCR3rlp/0eTxmR4abA8wOuWx1MhK6Do5z7jHgscNe+3m/x/8B/McA/bYBpySyNhERERkcf25JsksYspRayVhERESGT0bVYjKrljCJ/fwk8F2uv+IL7COH9nXLhmU0J5EUcERERGRAHeuWE5hUxnX+X3FG4Ub+fuc/ccPKspM6Z59z4NzAl6mcix0fBgo4IiIiMqD9V68h5Hn94PPPzGrkM7Ma6YoaufcuPKFzbt1VS25u3pETjZ0jGgmzdVftSVYdo93ERURE5Aie9Amc0/4fvNqURW98UKUzatyzbSJzHph7wuf93q33sHL1W9TX1dDQ76e+roaVq9/ie7feMyz1awRHREREjpC96F20bl1D1fx2DOiKGkGvozXioa7bf8LnbW5t58Z/v334Cj0KBRwRERE5RNq0BXj8AW7OepTaTj9La7O4c3M+11Q2UJQWTXZ5g6KAIyIiIgd50rLInPdOpr9xG5ed3sLCh6tojXgB+NJJTjAeSZqDIyIiIgdln3Yp3Vte5Qdz3+Qbr08+GG7GGo3giIiICAChqXPxhDL4cPQxuns93LN9YrJLOmEawRERERE8oQyy5p+Hf81DfOuUGr60ohQYnm0TkkEjOCIiIkLWqZfQuf0N/mP6Gu7bMZE3m9OTXdJJ0QiOiIjIOBeaMhtfZg5z6p/iPaUtfPeNomSXdNIUcERERMYxC6aTecqFtL36Z350+i7+6fUSWiJj/wKPAo6IiMg4lr3wIrp3vsXf5a2lp9f4/bbcZJc0LBRwRERExqng5Jn4cgoIbH6eb51Syw0rS3FjeGJxf2N/DEpERESGzAIhshZeRMvLD/KDBbv4084c1uwf2xOL+1PAERERGYeyTrmI7uoNzHdbeP+UFhY+NCfZJQ0rXaISEREZZwLFFfjziul46wV+dOZuvpUiE4v7U8AREREZR8wfJPvUS2h97Qk+Pm0vvc74bYpMLO5PAUdERGQcyVpwAeHaLWS2bOc7p9Ryw4rUmVjcnwKOiIjIOBEoLCdQUEb7m8/xnYW13L8rhzdSaGJxf6l1wU1EREQGZL4A2addSutrT7Awu4UPTGnm1IdTa2JxfxrBERERGQcy559HT/1OIvU7+NEZu/n26hKae1J3nEMBR0REJMX5J5URLJ5O2xt/4aMVTQD8ZmvqTSzuL6EBx8wuM7ONZrbFzG4a4PjlZrbGzFab2atmds5g+4qIiMjxmddP9qJ30bpqKTmeTv55YQ03rJySkhOL+0tYwDEzL3Ar8G6gCrjKzKoOa/Y0cIpzbiFwDXDHEPqKiIjIcWTOeyeRxj307N3Gt06p5cFdObzelJoTi/tL5AjOmcAW59w251wPcC9wef8Gzrl255yLP80A3GD7ioiIyLH58yYTLJ1F2+pnWJjbyQfLmvnnN4qTXdaISGTAmQzs7ve8Ov7aIczsQ2a2AXiU2CjOoPvG+18bv7z1quuNDEvhIiIiY57XR/bpl9H2+lMQ6eJHZ+zmn98oZn8KTyzuL5EBZ6CLe+6IF5y73zk3G/gg8C9D6Rvvf5tz7nTn3Onm9Z9orSIiIikls2oJ0eY6wjWb+bvpTXgM7tqSl+yyRkwiA041MKXf81Kg5miNnXPPAxVmlj/UviIiIvI2X24xoalzaX39aXICUb57ag03rEj9icX9JTLgrAQqzWyamQWAK4GH+jcwsxlmZvHHpwEBoHEwfUVERGQAHi8TTr+MttVP43q6+NaCWh7ePYFV42BicX8JuxDnnIua2fXAE4AXuNM5t9bMrosf/znwYeBjZhYBuoC/jU86HrBvomoVERFJFRlz3kG0rYlw9UYWTOzkr6Y2c1oKr1h8NPb2TUxjnyeU5YKli5JdhoiISFL4cgrJOefDNC29Cxdu5+lLN/Obbbn8akt+sks7Kd1bn3vNOXf6UPpoJWMREZFUYB6yT7+M9jXP0hfu4OrpTfg9jl+Po4nF/Y2Pe8VERERSXMbss+nraqN71zom+KP8y6k1/PWz08fVxOL+NIIjIiIyxvkmTCJ9xqm0rnoSgG+dspfHqifwWmNGkitLHo3giIiIjGVmsQX93nyevq525ud0ckX5/nE5sbg/jeCIiIiMYekzz6Svp5vuHW8Cjh+eWc133yimMTy+xzAUcERERMYob1YuGTNPp/W1JwC4atp+Qt4+fjVOJxb3N77jnYiIyJhlZJ/+btrXLqOvs5Vsfy/fO20Pf/vsdPrc+JxY3J9GcERERMag9MpF0Bula9tqAP5pQS1/rp7AynE8sbg/BRwREZExxpuZQ8bssw5empqb08XfTNvPt1aXJLmy0UMBR0REZIzJXnQZHetfprejGXD86Izd/OsbReN+YnF/CjgiIiJjSFrFqWAeOresAuDKaftJ9/XxyzG+HcNwU8AREREZIzzpE8isWkzrq38GHFn+Xr53ag1fWjlFE4sPo7EsERGRMSCjajH+/FI6Nq6kt30/AN9cUMuTNVmsaNDE4sNpBEdERGQMyKxagscXoHPzSiA2sfiqafv5p9c1sXggCjgiIiKjnDcjB4CWVx8H5wDHD8+o5l/XFNEQ9ie1ttFKl6hERERGqYyqxWRWLTn4PP/STwLwrtpfkenfyB2bNbH4aBRwRERERiOPD08wg2h7My0rHiHvwr+j7r5byPL38u33r+fq56dpYvExKOCIiIiMMt7sfHLOeh+Rln00PXUXLtpz8Ng35teytCaLVzSx+JgUcEREREaRtOmnkDn3HNrWPEv3zrUHX29ft4w5E7q4evp+Fj08O4kVjg0KOCIiIqOA+UNkL3oX3owJNP3l9wdvBQcoSotw9+Rf4y11/NuaIvZpYvFxKeCIiIgkmT9/MhPOeC/dNZtpWfEI9PUecvymebUsKeigKezldk0sHhQFHBERkaQxMuacTVrFqbS+9jg9tdsOOdp05WrSfO7g8/xQL+0fWU1X1Mi9d+EI1zq2aB0cERGRJPCkZTHxvL8lMGkKTU/ddUS4Aah6cC7/uz2HaF/seWfUuGfbROY8MHeEqx17NIIjIiIywoIlM8g67VI6t7xG54YVgBuw3b5uH6fndeI16IoaQa+jNeKhrltzcI4noQHHzC4Dfgx4gTucc98/7PhHgH+MP20HPuuceyN+bAfQBvQCUefc6YmsVUREJOE8PrIWnE+weBotyx8g0lRz9KbmuGPxTtL9fdyxOY/bN+VzTWUDRWnRESx47EpYwDEzL3ArcAlQDaw0s4ecc+v6NdsOnOec229m7wZuA87qd/wC51xDomoUEREZKd6sPCac9X562xppfOpuXCR81LaG46dn7aIwFGHOA3Pp7o3NKPnSyrKRKnfMS+QIzpnAFufcNgAzuxe4HDgYcJxzy/u1fxkoTWA9IiIiSZE2bQGZ895J25vP073jzeO0ju0zNSM7zAeerjgYbmRoEhlwJgO7+z2v5tDRmcN9Cvhzv+cOeNLMHPAL59xtA3Uys2uBawHwBU+mXhERkWFl/mBsbZvMiTQ9ew+9bU3H6eH4j0V7OC2vk/c+PYPOXu+I1JmKEhlwBtogY8BZVGZ2AbGAc06/l5c452rMrABYamYbnHPPH3HCWPC5DcATyhp4lpaIiMgI8+eVMOHM9xGu3UrLikePWNvmSI5/XljLOwvbec9TM2iLKNycjEQGnGpgSr/npcARs6nMbAFwB/Bu51zjgdedczXx3/Vmdj+xS15HBBwREZHRxciYfRZpM06j7bUnCNduHVSvm+bX8Z7JLVz2VCXNPbrJ+WQl8htcCVSa2TRgD3AlcHX/BmZWBvwJ+KhzblO/1zMAj3OuLf74UuC7CaxVRETkpHlCmUw4871g0PT03fR1tQ+q35eq6riyvIlLl1bSGFa4GQ4J+xadc1Ezux54gtht4nc659aa2XXx4z8HvgXkAT81M3j7dvBC4P74az7g9865xxNVq4iIyMkKFFeQvehddG19nY71L3O0tW0O99lZ+/j7ygYuebKSeq1vM2zMudSZtuIJZblg6aJklyEiIuOJx0vW/PMIlsygZcWjRBr3DLrrNTMa+Nq8Oi5dWsmujkACixzburc+99pQ18PTOJiIiMgJ8mblxta2ad9P41N3HXNtm8NdPa2Rm+fv5V0KNwmhgCMiInICQuXzyZp/Lu1vvUDX9jVD6nvF1P3866k1XPZUJdvatcRJIijgiIiIDFJG1WI6N71K9qJL8Wbn0/TcvfS2Nh6/Yz/vL23mltOred/TM9jUGkpQpaKAIyIiMkiZVUsIlc2lZ+92Wp7+LfQNbV+od5W08P/O2s0H/1LB2ua0BFUpoIAjIiJyfB4vGTPPAKB9zbOEazYP+RTnF7Vx2+Jd/PWz01ndlD7cFcphFHBERESOxuMl5x2XEyyuOPhSzuIPAtC+bhkd65YfpeOhlkxq565zdnD1c9NY0ZCRiErlMAo4IiIihzMPoalzyZzzDqJtjTQ+/Rui+/dSeMWN1N13y5BOdWZ+B78/bzsff7GcZfsyE1SwHE4BR0RE5CAjVDaHjKrF9HW2Dnldm8MtzO3kf8/bxrXLy3h2b9Yw1inHo4AjIiICBEtnkVm1hL6eLlpfe4LIvt1HtGlft2zQ55ub08X9F2zlH16ZwhM1E4azVBkEBRwRERnXgiUzyKhaAn29tL3xDD11O47adrBzbmZmd/PwhVu48dVSHq7OGZ5CZUgUcEREZEwoSotw9znb+egL06gbhj2bAkXTyKw6BzweOta+OOhdv49nWmaYRy/awjdfL+G+nROH5ZwydAo4IiIyJtw0r5bFBR3cPL+WG1aWnfB5AgVlZMw9B48/SPvaZYT3bBq2GssyevjzxVv49zeL+P32vGE7rwydAo6IiIxqTVeuJs339sbQn5nVyGdmNdIVNXLvXTjo8/jzJ5M59xw8oUw61i2ne/cGBrvj92CUpPXw2MWb+fH6Au7ckj9s55UTo4AjIiKjWtWDc/n1ku2cW9iBGTgHezr9/HTjJKZmhNnZcey9nHwTi8icew6+rIm0r3uJ7l1rYycZRgWhCI9dvIVfbs7nZxsnDeu55cQo4IiIyKjlM8f1s+s5La8TB3RHjYDXsbElyLycLr44p57WiJelNdksrc3i+b2ZdPZ6Y31zCsisWoIvp4CO9S/TvONNcH3DXmNeMMqjF23hDzsm8sN1hcN+fjkx5oY5xSaTJ5TlgqWLkl2GiIgMg5K0Hu5+5w7aIx56nbGrw8+dm/O5prKBorQoVz0/HcOxYGIXl5S0cklJG6fmdvJqcw4v2Gm8EFjMa+uq6dq2Bvp6E1JjTiDKYxdvYWlNNt9eXQxYQt5nvOve+txrzrnTh9JHAUdEREadi4tbuW3xTn62YRL/tbYQN4jg4M2cSMHcRZxf3MmSjr9wQfpW0ry9LK3N5qmabJ6uzaKpZ/guXGT5e3n0oi28tC+Df3xtMgo3iaOAo4AjIjKmeczxzQW1fLyiiU8sm8oLdcdf/debMYGMOYsJFk+nY/OrdG1ZhYtGAJieGY6P7rTyzoJ2NraGWFqTzVO1WaxoyKDXnVgoSff28tBFW3lrfxo3rCxF4SaxFHAUcERExqyitAi/XrKDXgefXFZO/QBr3WRULT642J4nLYuMOe8gNHkmnVtfp3Pzq7hI+KjnD3j6OHtSB5cUxy5nlWX08OzeLJbWZvFUTTa7OwODqjPk7eNP529lV0eAz75cNqjRJTk5CjgKOCIiY9J5hW3cuWQnv9ycx/ffKqLvKCMrhVfcyL5HfkrG7LMJTZlD1/Y36Ni0EtfTPeT3LAxFuCgedi4qbqMxHJ+sXJPNC/WZdPd6DmlflBbhN+dsp6fPqO/286nlU49apwwvBRwFHBGRMcVjjq/Nq+Payn18avlU/rI3++htg+lMev/n6Qt30bXzLTo2rsCFO4elDsNxam4XF5e0cmlJKwsmdvHyvgyeqs1maU0W61tC/M+Zu/n7yka2twVY8HDVCV/ekqFTwFHAEREZMyYFI9y5ZCcBr+MTL5ZT2zXw9gvZi95F2rQFR7zevm7ZoPeGGqpsfy/nF7VxcXErn6psxDNAlhnqQoNy4hRwFHBERMaEJQXt3LVkB7/dlsu/rCk+cjTE4yU0ZTbpFadhgRBdW1+na8ebFFz+Beruu2VEay1K6+EnZ+3m4uI2gl5HZ9R4cFcON6+aPCx7YsnxnUjA0UJ/IiIyYgzHV+bW8fnZ+/jMS2U8WTPhkOOetCzSKxYSKp9PtLmO9nXL6Nm7LUnVxuztCrCn04/P4+iKGkGvozXiUbgZ5RIacMzsMuDHgBe4wzn3/cOOfwT4x/jTduCzzrk3BtNXRETGltxAlDuW7CTH38s7/zyL6n53LfknTSF9xmkE8qfQtWst+5/9Pb3tzUeco33dshGs+G0FoSi3b8o7ZKFBGd0GfYnKzDKccx2DPrGZF9gEXAJUAyuBq5xz6/q1WQysd87tN7N3A99xzp01mL4D0SUqEZHR6ez8du5+5w7u2zmRb71eQtQZ5vUTmjqX9IpTAejcuorunetwvZEkVyujTUIuUcVDyB1AJlBmZqcAn3HOfe44Xc8EtjjntsXPcy9wOXAwpDjn+s8OexkoHWxfEREZCxxfmLOPL1fV8bmXy3hszwS8mTlkVpxKWtlcehp207r6KSL7die7UEkxg7lE9UPgXcBDAM65N8zs3EH0mwz0/ze2GjjrGO0/Bfx5qH3N7FrgWgB8x95RVkRERk5OIMpt79hFUVqEcx+fyd6s2eSccxr+nEK6drxJ41N30dfVluwyJUUNag6Oc2632SEz3Aeza9lACwQMeD3MzC4gFnDOGWpf59xtwG0Qu0Q1iLpERCTBFuV18JtzdvBobS6frv0wvncuIrMnTOfWVTQvfyBhm1+KHDCYgLM7fpnKmVkA+AKwfhD9qoEp/Z6XAjWHNzKzBcQugb3bOdc4lL4iIjLaOD47q4GbF9Txj/Xv5amiD+DcNlpXPEqkqTbZxck4MpiAcx2xu5kmEwseTwKfH0S/lUClmU0D9gBXAlf3b2BmZcCfgI865zYNpa+IiIwu2YE+fnF+IxU5fXyo69tsqK+h6+U76QsP+v4UkWFz3IDjnGsAPjLUEzvnomZ2PfAEsVu973TOrTWz6+LHfw58C8gDfhq/BBZ1zp1+tL5DrUFERBLPgumcVVXMr2Y/x7NdFVz88hRad98Pri/Zpck4dtzbxM3sVwww/8U5d02iijpRuk1cRCTxDuzo7ZtYRPqMU/lU2W6+7L+Pr75RyR/We5NdnqSgRK1k/Ei/xyHgQ2g+jIjI+OTxklm1hGDRdLKCxr9yK7PCtVy4tJzNrQo3MnoM5hLVH/s/N7N7gKcSVpGIiIw63uw80srnUza1hJ8Gvst3awv47xmvsKw+k3NfraS715PsEkUOcSJbNVQCZcNdiIiIjC7mCxCaMptQ+Xx82Xl4/EFu8N3JGbaBP562lZsjf89v2jx09yZmR2+RkzGYlYzbiM3Bsfjvvby9f5SIiKQYf34paeXzCZbMoKd+Fx3rl7P3/PtJ8709HTNEhB8Gfsa/LTBy1y1MXrEiRzGYS1RZI1GIiIgkjyeUSah8Lmnl86E3SteON2lb8yyup4vpmWEe2JXDX03dj8fA74HOqPHgrhxuXjU52aWLDOioAcfMTjtWR+fcquEvR0RERox5CJbMIK18Pv68Yrp3b6TllUeI7t8LwNycLm48o46Lilu5bdMk/rAjl49Mb6K7z0vQ20trxENdtz/JH0JkYMcawfnBMY454MJhrkVEREaANzuftGnzSZsyh2hrI1073qT55QehNwrAmfkd3DhvL4vyOvnJ+gL+YcUU2iJe7jl3G7dvyuPOzflcU9lAUVo0yZ9E5OiOuw7OWKJ1cEQk0YrSItx9znY++sK0MTV6Yb4AobI5pJXPxxPKpGvnW3TveIvejuZ4C8f5Re3847y9TMvs4b/XFXD31jzdHSWjQqLWwcHM5gFVxNbBAcA5d/fQyhMRGftumlfL4oIObp5fyw0rR/8Npf5JU2IThosr6KnfSfvaF+mp28mB9VsNx3tLW/javDqy/b3csraQP2zPJeoG2vNYZOwYzErG3wbOJxZwHgPeDbzonLsi4dUNkUZwRCRRmq5cfchdRAd0RY3cexeOfEHH4EnLIm3qXELl83HRCF071tC9az2up+tgG685/nrqfr46r45wr3HLW0U8VD2BPgUbGYUSNYJzBXAK8Lpz7pNmVkhs928RkXGj6sEq7lqyg3MKO/AYOAd7Ov38bGM+5ZlhdrQHk1ugx0uwuIK0aQvwTyyiu3oDLa88RHR/3SHNAp4+PlrRxJer6qjp9HPTa5N5qjaL2EogIqljMAGn2znXZ2ZRM8sG6oHpCa5LRGSUcFxY1MZ3FtYyLSsMxEZtAl7HxpYgcyaE+cu7NtEe8bK0Joultdk8X5dJRzRx2xYc2AsKwDdhEmnl8wmVzSHSso/u7W/S/NIDBycMH+zj6+VTlY18cU49a/ance3yqSzbl5mwGkWS7Vi3if8EuAdYYWY5wO3Aa0A7sGJEqhMRSaLFk9r5zsJaCtMi/MsbxXx46n72dvkOuYvo0y9NxXDMn9jFJcVtfGFOPXeds4PXGtNZWpPN0pos3mxOYzhHSDKrltDX3RmfMJxO1463aHrmt/R2tBzRdmIgynWz9nHdrAZeqMvkr/4ynTf2pw9bLSKj1VHn4JjZF4ErgRLgXmJhpxnIds6tGakCh0JzcERkOJyW28m3F9YwMzvM99YUcc/2XHqHMDclw9fLeYXtXFLSysXFbWT4e3mqJpunarN4ujabxvAJ7JLj9REsmk6odBahKbPp3r2Brh1vHjJhuL/CUIQvzKnnEzMaeXj3BH6wrpDNraEjzysyBpzIHJzBTDKeSizoXEnsLqp7gHucc5tPtNBEUcARkZMxN6eLby2oZVFeJ99/q4i7tuYS6Tv526SnZYYPhp1zC9vY0hbiyZosnqrJ5pWGjKOHJ4+PYNE0QqWzCE6uxLxHBqP2dcsOXq4CKMsI86Wqev6mfD9/2D6RH64rZHdn4KQ/g0gyJSTgHNLY7FTgTmCBcy5xF5hPkAKOiJyIGVnd/NMptZxb2M5/ry3k9s35CVv/xe/p4+xJHVxS3MYlJa1Mzejh+bpMnqzJ5qnabHZ1pREsnEZwyiyCRdOJNNcR3r2R7prNuHAnAIVX3Ejdfbccct5Z2d18dW4d7y5t4c7N+fxkwyTqx9A6PSLHkqgRHD9wGbERnIuA54iN4DxwgnUmjAKOiAxFWUaYr8/fy3tKW/l/6yfx042TEjo5eCCFoQgXlnTwrmm9XDSpgWbL5i8dFSytTueZDW10dIYPaV+UFuHeD0X52z/5qOv2c2puJ1+bt5d3TOrgpxsn8YuN+bRETuASmMgoNqwBx8wuAa4C3ktsUvG9wAPOuY6TLTRRFHBEZDCK0yJ8bd5e/rp8P7/YOIn/WT9p5EOBx0ugcCqh0tkEi6cTbWkgXL2B2e2vc1F+HZeUtLEwt5MVDRk8VZPFkzXZrGsJ8aMzdvP3Mxt5dHc2aT5H1YRufrS+gDs359HZO+oG1kWGxXAHnL8Avwf+6JxrGob6Ek4BR0SOJT8Y4Stz6/loRSN3b83jB2sLT2zC74kyz9uhpqSCaEsD3dUbCe/ZRF/3kf/vmOXv5fzCNi4uaePvKxvwDDBVp7vXmHjPwsTXLpJECZ+DM9op4IjIQHICUb44p55Pz2zg/3ZM5D/eKmJv1wjNTzEPgYKyeKiZQbStMRZqqjfR190+6NMUpfXwkzN3c0lJKwEvdEaNB3flcPOqyWNqTyyRE5GwvahERMaiTF8vn5u9j+tn7+OR6gksfmw2uzpG4I6ig6FmVizUtO8nvHsj7etepK9r8KGmv71dAfZ0+fF6YgsNBr2O1ohH4UbkKBRwRCTlhLx9XDuzgS9V1fHs3iwufKKSLW3DtwZM/5WEDzIjMKmMYOksQpMribY3E67eSPu65fR1tQ3L+xaEoty+Ke+QhQZFZGAKOCKSMvyePj45o5F/nFfHioZ03vvUDNa1pA37+2RWLYkFHDMCk6YQLJ1NqGQGvZ2tdFdvpPHp39DX2Trs73vV82/vkvOlMbCTuUgyKeCIyJjnNcfV05r4xoK9rG8JccWz03m9KUHbEVhsfZysUy8hOLmSvgOh5pnf0dd55FYJIpIcCQ04ZnYZ8GPAC9zhnPv+YcdnA78CTgO+4Zz7r37HdgBtQC8QHerkIhFJXUVpEe4+Zzsfe6Gcc4va+eaCvdR2+blm2VSWJ2ADSQukkb3oUkKTZx58Lb1iIQBd21bTuWnlsL+niJychAUcM/MCtwKXANXASjN7yDm3rl+zJuALwAePcpoLnHMNiapRRMamm+bVsqSgg1fft4GtbUG+sGIKz+7NZDg3tPTlFBAsmk6guAJfdh499TtpefVxevZuY9L7PnfESsIiMrokcgTnTGCLc24bgJndC1wOHAw4zrl6oN7M3pvAOkQkRTRduZo039tLW+SFeskLdfKn87eSe+/Ckzq3ef0ECqYSKJ5OsHg6LholvHcrHWtfpKehGvp6T7J6ERlJiQw4k4Hd/Z5XA2cNob8DnjQzB/zCOXfbcBYnImOHzxx/O62J6k4/uYFeMv19BL3ukLVgToQ3IycWaIqm48+bTGR/LT21W9m/aSW97fuP2q993bIT/SgiMkISGXAGGiseyqqCS5xzNWZWACw1sw3OueePeBOza4FrAfAFT6hQERmdQt4+Pl7RyJeq6tnWFuALK8r4UNl+PlXZeGJrwZgHf/5kgsUVBIumY4EQPbXb6Nq+hpaXH8JFewZ1miNuEReRUSeRAacamNLveSlQM9jOzrma+O96M7uf2CWvIwJOfGTnNoitZHwyBYvI6JDl7+XTlQ1cP6eeVxsy+NiL5axoyADgMzP3DWktGAumEyyaRrC4gkDBVHrb9xPeu42WlY8S3V83Eh9HRJIgkQFnJVBpZtOAPcR2I796MB3NLAPwOOfa4o8vBb6bsEpFZFTIC0b53Kx9XDtzH0/VZvP+p2ewtvnQdWwGsxaML6eQYHwujTczl576XYRrt9L2+tP0hUftfsEiMowSFnCcc1Ezux54gtht4nc659aa2XXx4z83syLgVSAb6DOzG4AqIB+438wO1Ph759zjiapVRJKrJK2HL1bV83fTm7h/Vw7nPT6Lbe3HvuTcfzVh8/kJFJQTLJ5OoGg6LtpDuHYb7W+9QM++anB9I/ExRGQUSeg6OM65x4DHDnvt5/0e7yV26epwrcApiaxNRJJvWmaYL8+t46/KmvnttlzOfHQ2ezoHt1dUZtUSXE+YQPF0/LklRJpq6KndRsfGV+htb05s4SIy6mklYxEZcXNzuvjq3DouLm7l9s35LHioisbwsf84Mp8f/6QygoXlBArLAfBNyKdr62paXnoAF42MQOUiMlYo4IjIiDkjr4Mb59VxRn4HP1lfwBdWTKEt4j1qe19OIYGicoKF5fhyiujr6cSXkXPweNq0BaRNW0D7umW6s0lEDqGAIyIJ5jivsJ2vzdvLjKww/72ukI+9WE53r+eIlp5QBoH4CE2wsJy+cBc9dTvo2LgiNpem9+1RmsIrbtRqwiJyVAo4IpIQhuM9pa18be5eJgR6uWVtIX/YnkvU9Vsiy+MjMKn0YKjxpmXSU7eTnrodtL/5PH1dbcn7ACIypingiMiw8prjiqn7+ercOiLOuOWtQh7cnUNfPNh4s/MPzqPx500m2lJPT90OWl97gmjTXga7HqhWExaRY1HAEZFhEfD08ZHpTXxlbh21nX6+vmoyS2uzsEA6gclTCRbFJwf39RLeu4OubW/Q8srDuEj4hN5Pc25E5FgUcERkyIrSIvz20iY+8kQubREPn6ps5Itz6nmrOcRnXipnRd8sAoXl5M4px5uVS2TfbsJ1O+jY8LJu4RaREaGAIyJDdtO8Wt6R2cT/nd/M1MweljVO5CNb382GzEUE3lFGVlsT4bodtK15lkhjjRbaE5ERp4AjIoPgKM/s4Y33ryfgfXuOzBn5nQC8u6SZ69rmEt61gdZXn8D1dCWrUBERQAFH5IQVpUW4+5ztfPSFaYPfzXpMcEzL7OG03E5Ozevk1NxOFuZ20eX8LOuZQVGwm+lWS9CidLkAj/eewTfWVdK6RrupiMjooYAjcoJumlfL4oIObp5fyw1H2fRxtDMc07PCnJbbxcLct8NMR9TD6rYc1kTK+KWnivWRRdS1RgnX7eT7eQ8xc0qUbucnQA/1WzewfU1nsj+KiMghFHBEhqjpytWk+d6+TPOZWY18ZlYjXVEj996FySvsOAxHRVaY0/I6OTW3i1NzOzklt4u2iIfXG9N5vW0iP22az/rOU2jNm0OfN0xPw0566nfSs+/eg3c75Z/bzO2b8niw/KtcvuO/KEqLJvmTiYgcyZwb3JoTY4EnlOWCpYuSXYakuKkZYe4+Zwen53fiMXAOog72dvmp6/LTEPbRGPbS0O2LP/bR0B3/HX+8v8eLw47/ZsdwrEtkhqMyO8yp8VGZU/O6OGViJ809Pl5vSmNVYzqrWyew1juLtomzCBRMxfyBWJip30lP/S76OluP+f79d/MWEUmk7q3PveacO30ofTSCIzJIxWkRrp25j2sqY6M1AF1RI+B1/HZrLresLSI/GCUvFCU/GPvJC0apyAqTF+xlUij2PC8YJdvfS1OPj8bueBiKh5/GeChq6BeKGsM+9nX76Dpsa4MDl8i+vqCWn24o4NS8zti8mdxOFkzsoqnHx+uN6axqSuM/3ypkdXMmrZnlBAunEiicindGLpGGPfTW76Rl22qiLfuG9H0o3IjIaKYRHJHjOC23k+vn1POuklb+sH0iP904iX85tYa9XT7u3JzPNZUNFKVFuer56YM+p88cufGwk98/EIV6DwlHeaEok+Jt+hw0hn1MTo/gGWDwp7cPvvNGcWx0pimdph4fvpwCAgXlBAqn4s8tIdq6L7YVQv1O3b4tImPGiYzgKOCIDMBrjg9Maeb62fuYnB7hZxvz+fWWPFoiyRr0dGT4+sgLRpmVHeYrc/dy9qROgl5HZ9R4cFcON6+azD5PfmyEpmAqgYKy2GaV9TtjoWbfLly0J0n1i4icOF2iEjlJOYEon6ho5LOz9rG7M8D/W1/Aw9UT6HUnN1/m5BkdUS8dUS+7OoK8b0oz5xR20O38BL0RunOmEj3/WnK9PnrqdxLeu422NX+hr6s9yXWLiCSHAo4IMCOrm8/P3sfflO/n8T3ZXPX8dFY1pSe7rCOYL4B/UiklBa38pnM2f/C9j7/p/hP51NO8/E/0tjYmu0QRkVFBl6hkHHNcUNTG9bP3cXp+J7/cnMftmyZR2zV6Fu0zrx9//mQCBWUEJpXhzcqjr6cTX0bOEW3b1y3TxF8RSUm6RCUyCCFvH1dNa+Lzs/fhHPxkQwEfeWEa3YfdpZQUXh+BvFig8U+agm/CJKL799JTvzu2r1NTLfT1HmxeeMWN1N13SxILFhEZnRRwZNwoSevh2pkNfLKykZUN6Xz11VKe3ZsJJ7kezUnxePHnlRCYVEagoAxfTgHR5np69u2i/a0XY3c69WkhPRGRoVLAkZS3KK+D62fv49L4bd4XPlHJ1rZQcorxePHnFsUCzaQyfLlFRFsaiOzbRcf6l+hp2AO9kUGfrn3dsgQWKyIydingSErymuPy+G3eJfHbvG9YUTryt3mb52Cg8U+agj+3hN62Rnr27aZj0woiDdW46OADzeE050ZEZGAKODKmHb5dQU4gyidnNHLdzNht3v+T4Nu8j9iuwAxfTuHBScH+vBJ625vp2bebzi2riDQ8dHBPJxERSZyEBhwzuwz4MeAF7nDOff+w47OBXwGnAd9wzv3XYPuKwNvbFfzHomr29/hG/DbvzKolhGu2xgPNFPx5k+ntaiNSv4uubW/Q8sojuEh3wusQEZFDJew2cTPzApuAS4BqYCVwlXNuXb82BcBU4IPA/gMBZzB9B6LbxMePw3f0PqC715h4z8KEvrc3Oy8+KXgqocmVRFsb6dm3i576XfTs243r6Uro+4uIjDej7TbxM4EtzrltAGZ2L3A5cDCkOOfqgXoze+9Q+8r4VZQW4f+tn8TnZu8j3efwGIdsVzDcvBk5b19yKijDPF48gbcnKfuy8/Bl59EX7iS8Z9Owv7+IiAxdIgPOZGB3v+fVwFkj0FdSkMccFxe3cs2MRs4tbOdPu3JYWpPNB8pa6IoaQa+jNeKhrvvkF+nzhDJjgSYeavB4Y9sf1O2g7a3n6etsPdhW69CIiIxOiQw4A83qHOz1sEH3NbNrgWsB8AUHeXoZK0rSevjYjCY+WdHAvrCfX27O4++XT6U96uWec7dx+6a8Q3b0PhEWSCMwaUo81EzFE0g7eMmpY+MKetuahvlTiYhIoiUy4FQDU/o9LwVqhruvc+424DaIzcEZepky2njMcWlJbLRmSUE79+2cyN8+P53Vh00avur56Qcff2ll2aDPf2A/p8Ck2I7b3owJRBqq6anfRcu2NURb6gd9Lq1DIyIyOiUy4KwEKs1sGrAHuBK4egT6yhhVmt7Dx2c08omKRmo6/fxySz6fXDaVjqj35E7s8RHILyFQMBX/pDJ82flEmmrp2beTtlVPEtlfB67vhE6tdWhEREanhAUc51zUzK4HniB2q/edzrm1ZnZd/PjPzawIeBXIBvrM7AagyjnXOlDfRNUqyeM1x7snt/DJGY2cNamD/9sxkb/6y3TebB78Ld5HrkXjwZ9bfHAOjS+3iGjzPnr27aT9refj2x/0Hv2EIiIy5mk3cUmKsowwn5jRyMcrmtjZHuCXW/L4086JdJ3AhpeFV9xI41N3H5wY7M+bTG/7/vht27tOerVgERFJrtF2m7jIIXzmeE9pC9fMaGBRXid/2JHL+5+uYF1L2pDP5c3MIVBQTqBwKgATzngPPft20bVtDS2vPKrF9URExjkFHEm48swwn5zRyEcrGtnaGuSXW/K58vnpdA9htMYCIQIFUwkUTCVYWI4FQnj8b98155uQj29CPn09XYRrNifiY4iIyBiigCMJ4ff08b7SFq6Z0cgpuV3cs30i715aycbWQe7i7fHiz5tMsHAqgYJyvFkTiTRUE67bQefm1+htazzYVGvRiIjI4RRw5KQcvtnl9Mww11Q28HfTm9jQEuLOLXlc8WwO4b7jj9b4JkwiUFgeu9spbzLR1gZ66nbQtuYZIo21J3ynk4iIjD8KOHJSDmx2ecfiHXgN5k7s5nfbcrlkaSWbjzNa4wllEiicejDUuEgPPfU74ptUPjzoXbe1Fo2IiBxOAUdOyOGbXV5c0g7ENrv8+lH2gzKfH/+kKQTjk4M9wfTYnU71O2l/64VDtkAYCq1FIyIih1PAkRPyqeVT+dnZu8j09eH1HGWzSzP8E4sPjtL4JhQQ2V9LT90OWlY8RrS5LnkfQEREUpoCjgxJaXoP31+0h0V5nby8L4OLS9rodn6C3gitEQ8NvkmkTS+PXXaaNIXezlZ66nfSsf4lehqqoffE9osSEREZCgUcGZSAp48vzKnni3Pq+cWmSfz98qn8askO7thSyANlN/DXHf9LWbljYsGV9NTtJFy9kbZVT9IX7kx26SIiMg5pJWM5rouLW/nBGdVsag3ytVdL2WXFZC28iGBh+RFt29ct05wYEREZVlrJWIZVWUaY/1y0h3kTu7lp86k8519C4JwKJno8hGu3sn/zq/TU76bwr76kdWhERGRUUcCRIwQ9fXx5wX6un7WX21sX81V3FR2FrfTWbqXlpQeItuxLdokiIiLHpIAjB/kmFPC+2V7+bdorbHBTeVf1B9myu4nw3rtwPV1H7ad1aEREZLRRwBnPvD4CBWUEiyqonJzNd9LuZTrVfHn1HB7f2APuhUGdRnNuRERktFHAGWc8aVkEi6cTLK7An1+Kr3k319kDfCrtTX60Lp8r1k+lp087cYuIyNimgJPyDH9uEYHiCoLFFXjTMgnv3U7Xzrc4d89v+I+FO3i1IZ2zH51JdWcg2cWKiIgMCwWcFJFRtfjgpSLzBQgUlhMsriBYNI3ecCc9tVtpe/0pIo01VGR18YPTqynLiPDZl8t4dm9WkqsXEREZXgo4KSKzagmuJ0yguAJ/bhGRxj2Ea7fRvm7ZwT2e0r29fHNhHdfMaOAHawu5deMkIoPY5VtERGSsUcAZw8zrJzR1LukVCwHwZufRtWUVLfU7cb2Rfi0dHypr5j8W7WFZfSZnPjqH2i5/UmoWEREZCQo4Y5AnPZv0GaeRPn0h5ns7qKRPP4X06accsprwrOxufnBGNYWhCNcsm8qL9bocJSIiqU8BZwzx55eSXrmIQP4Uuna+RcOTv6KvswWAwituPGQ14UxfLzfP38tHK5r4jzcL+fmmSfQ6S1bpIiIiI0oBZ7TzeAlNmU36jEWYz0/nllW0rnjssEtQ/Tn+pnw//3ZqDc/szeKMR2ZT163LUSIiMr4o4IxSnlAGadMXkjb9FKLN9bSvfYGevdsHbFuUFuG3ka/yzwXpfPOUvWT7e/noi+W8tC9zhKsWEREZHRRwRhnfxCLSZywiWDyd7t3r2f/cvfS2NR2zz7cW1LA4s4kHLzRuXjWZ2zfn06fLUSIiMo6Zcy7ZNQwbTyjLBUsXJbuMoTMPwcmVpFcuwhvKpHPr63RtX4OLhI/Zbf9Vqwl5j/zn1xU1cu9dmKBiRURERlb31udec86dPpQ+CR3BMbPLgB8DXuAO59z3Dztu8ePvATqBTzjnVsWP7QDagF4gOtQPNhZYIETatAWkV5xKb0cLnRtXEq7dAscJnfnBCNfP3kdHxKjt9FGUFiXN5+iMGg/uyuHmVZNH6BOIiIiMTgkLOGbmBW4FLgGqgZVm9pBzbl2/Zu8GKuM/ZwE/i/8+4ALnXEOiakwWb3Y+6TNOI1Q6i3DNFpqX30+0uf64/UrTe/jinHqunt7E/+2YyJI/z+bLc+v4VGUjXVEj6HW0RjyaVCwiIuNeIkdwzgS2OOe2AZjZvcDlQP+Aczlwt4tdJ3vZzHLMrNg5V5vAupImUFxB+oxF+LLz6Nq2msYnfklfuPO4/SqyuvnK3Ho+MKWZu7fmseiROeyNL9RXEIpy+6Y87tyczzWVDRSlRRP9MUREREa9RAacycDufs+rOXR05mhtJgO1gAOeNDMH/MI5d9tAb2Jm1wLXAuALDkvhw8l8AULl80ifcRqup5vOLavo3r0BXN9x+87P6eTGeXWcX9TOzzfmM//BKvb3HPqP7Krnpx98/KWVZcNev4iIyFiUyIAz0G08h08uOVabJc65GjMrAJaa2Qbn3PNHNI4Fn9sgNsn4ZAo+Gf03uwTwZuTELkNNraKnbietK/9MpHHPoM51Vn4HX5u3l1NzO/nx+gI+93IZ7VFvokoXERFJOYkMONXAlH7PS4GawbZxzh34XW9m9xO75HVEwBktMquW0LFuOYGCMtJnLMKfV0LX9jdpXHoXfV1tgziD48KiNr42r46pmT38YG0hVz8/jbA2wxQRERmyRAaclUClmU0D9gBXAlcf1uYh4Pr4/JyzgBbnXK2ZZQAe51xb/PGlwHcTWOvJ8ca+xtxLPoFhdG55jeZXHobe48+HMRzvn9LC1+bVkebt45a1hfzfjonaVkFEROQkJCzgOOeiZnY98ASx28TvdM6tNbPr4sd/DjxG7BbxLcRuE/9kvHshcH/sLnJ8wO+dc48nqtYTlVG1mMyqJQef+ydMAsCTlnnccOM1x1+X7+fGuXV09Xr4jzcLeaR6Am7Aq3YiIiIyFFrob5gcvtnl0QQ9fXy0ookvV9WxqyPAf75VyDN7sxh4OpKIiIiMuoX+5G0Zvl4+XdnAF+bUs6opnWuWTeXlBu0VJSIikggKOMOkfd2yAV+fGIjy2Vn7uG5WA8/uzeTyZyp4szl9hKsTEREZXxRwhkn/W8QhtsP3F+bU87GKRh7ancOFT1SypS2UpOpERETGF92DPAyK0iI8eckmCkMRpmaE+fGZu3ntfevxm+PsR2fzuZfLFG5ERERGkEZwhsFN82pZUtDBk5dsIi/Uyx2b8ln40Bz2hbUnlIiISDIo4JyEpitXk+Z7+y60mRN6APjCnHq+80ZJssoSEREZ93SJ6iRUPTiXe7dPpDMau8W7M2rcs20icx6Ym+TKRERExjcFnJOwt8tPa8RD0OvoihpBr6M14qGuW5emREREkkmXqE5SQSjK7ZvyuHNzPtdUNlCUdvztGURERCSxtJKxiIiIjGonspKxLlGJiIhIylHAERERkZSjgCMiIiIpRwFHREREUo4CjoiIiKQcBRwRERFJOSl1m7iZtQEbk11HkuQDDckuIkn02ccnffbxSZ99fJrlnMsaSodUW+hv41Dvk08VZvaqPvv4o8+uzz7e6LOP388+1D66RCUiIiIpRwFHREREUs7/b+/+Y62u6ziOP1/jYvyq0MhSoF1FxYCQX5ag2QRtVA7YYpUzA2trc4bUEsPRXOVqlM1qpbCmeJkwUcnKLAMGgStNDYILiKCU4VUKGNPMH5j66o/v57LD9V7uRbnfT3zP+7Gxe873fr/f8/p8z+F73vdzvufzqVqB8/PcATKKttenaHt9irbXp2j7EajURcYhhBBCCFC9HpwQQgghhChwQgghhFA9lShwJE2WtF3Sk5Lm5s5TFkmDJf1B0jZJWyXNzp2pbJJ6SPqrpPtyZymTpP6Slkt6PD3/43NnKoukr6XX+xZJd0jqlTtTd5K0SNIeSVtqlp0gaZWkJ9LP43Nm7C4dtP2G9LpvlvRLSf0zRuw27bW95ndXS7KkATmydbeO2i5pVnqv3yrpB53t55gvcCT1AG4CPgEMAy6RNCxvqtK8Bnzd9geBc4Ar66jtrWYD23KHyOAnwO9tnwmcRZ0cA0kDgauAcbZHAD2Az+VN1e2agMltls0FVts+HVid7ldRE29u+ypghO2RwA7g2rJDlaSJN7cdSYOBi4BdZQcqURNt2i7pAmAqMNL2cOCHne3kmC9wgA8DT9r+m+1XgWUUB6HybO+2vSHdfoHiTW5g3lTlkTQI+BRwS+4sZZL0LuB84FYA26/afi5rqHI1AL0lNQB9gGcz5+lWth8A9rdZPBVYnG4vBqaVmaks7bXd9krbr6W7fwYGlR6sBB087wA/Aq4BKvsNoQ7afgUw3/aBtM6ezvZThQJnIPB0zf0W6uhNvpWkRmA08HDmKGX6McV/9Dcy5yjbqcBe4Lb08dwtkvrmDlUG289Q/OW2C9gNPG97Zd5UWbzP9m4o/tABTsycJ5cvAvfnDlEWSVOAZ2xvyp0lgzOAj0p6WNI6SWd3tkEVChy1s6yylW17JPUDfgF81fa/c+cpg6SLgT221+fOkkEDMAZYYHs08CLV/YjiEOlak6nAKcDJQF9Jn8+bKuQgaR7Fx/RLc2cpg6Q+wDzgutxZMmkAjqe4HGMOcJek9t7/D6pCgdMCDK65P4iKd1nXktSTorhZavue3HlKdC4wRdJTFB9LTpS0JG+k0rQALbZbe+uWUxQ89eBC4O+299r+L3APMCFzphz+JekkgPSz0+76KpE0A7gYuNT1M5jbEIrCflM67w0CNkh6f9ZU5WkB7nHhEYqe+8NeZF2FAudR4HRJp0g6juKCw3szZypFql5vBbbZvjF3njLZvtb2INuNFM/5Gtt18Ze87X8CT0samhZNAh7LGKlMu4BzJPVJr/9J1MkF1m3cC8xIt2cAv86YpVSSJgPfAKbYfil3nrLY3mz7RNuN6bzXAoxJ54N68CtgIoCkM4Dj6GRm9WO+wEkXm30FWEFxorvL9ta8qUpzLnAZRe/FxvTvk7lDhVLMApZKagZGAd/LG6ccqddqObAB2ExxDqv08PWS7gAeAoZKapH0JWA+cJGkJyi+UTM/Z8bu0kHbfwa8E1iVznkLs4bsJh20vS500PZFwKnpq+PLgBmd9d7FVA0hhBBCqJxjvgcnhBBCCKGtKHBCCCGEUDlR4IQQQgihcqLACSGEEELlRIETQgghhMqJAieEcAhJ89Jsvc3pa7gfOcLtZ0o6+Qi3aexg1uRGSS+nHI9JWijpLZ+3JK2VNC7d/t3hZqKWNK128lpJ35F04Vt97BBCuRpyBwgh/P+QNJ5ihNgxtg9IGkAxoFZXt+8BzAS2cPRGFN9pe1SaXHMNxcSSB0ftltRQM/lil9nubMyoacB9pEEUbdfrEPkhHJOiByeEUOskYF/NjL37bD8LIGlSmtxzs6RFkt6Rlj8l6TpJfwQuAcZRDEK4UVJvSWPT5HjrJa2omWJgrKRNkh4CruwsWCpiHgROS71Ed0v6DbBSUt+U6dGUcWp6jN6SlqXeqDuB3q37S7kHpNtfSOtsknS7pAnAFOCG1I4hkpokTe/Csfi2pA3pd2ceheckhPAWRIETQqi1EhgsaYekmyV9DEBSL6AJ+KztD1H0/l5Rs90rts+zvQT4C8UcQaMoJkP8KTDd9liK0Ui/m7a5DbjK9viuBFMx2eAkihGMAcZTjGY6kWISwjW2zwYuoChM+qaML9kemR53bDv7HZ62n2j7LGC27QcppkOYY3uU7Z0163d2LPbZHgMsAK7uSttCCEdfFDghhINs/4eiCPgysBe4U9JMYCjFJJc70qqLgfNrNr2zg10OBUaQhtUHvgkMkvRuoL/tdWm92w8Ta0ja9k/Ab23fn5avsr0/3f44MDettxboBXwgZVyS2tYMNLez/4nActv70nr721mnbZsOdyxaPz5bDzR2sq8QQjeJa3BCCIew/TpFkbBW0maKyRw3drLZix0sF7C1bS9Nuri3q/PE7Ey9QYd7TAGftr29zePQhcfREWRpXf9wDqSfrxPn2BCyiR6cEMJBkoZKOr1m0SjgH8DjQKOk09Lyy4B1tO8FiskQAbYD700XLyOpp6Thtp8Dnpd0Xlrv0rcZfQUwS6mikTQ6LX+gdd+SRgAj29l2NfAZSe9J653QTjtqHcmxCCFkEgVOCKFWP2Bx+kp2MzAM+JbtV4DLgbtTr84bQEezODcBC9PHRT2A6cD3JW2i6AmakNa7HLgpXWT88tvMfT3QE2hOXze/Pi1fAPRLbbkGeKTthra3Ulyfsy5lvDH9ahkwJ11MPKRm/SM5FiGETGI28RBCCCFUTvTghBBCCKFyosAJIYQQQuVEgRNCCCGEyokCJ4QQQgiVEwVOCCGEEConCpwQQgghVE4UOCGEEEKonP8B64p8MaMKEFcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "lift_chart = model_top.get_lift_chart(\"validation\")\n", "\n", "# Save the result into a Pandas dataframe\n", "lift_df = pd.DataFrame(lift_chart.bins)\n", "\n", "bin_counts = [10, 15]\n", "f, axarr = plt.subplots(len(bin_counts))\n", "f.set_size_inches((8, 4 * len(bin_counts)))\n", "\n", "rebinned_dfs = []\n", "for i in range(len(bin_counts)):\n", " rebinned_dfs.append(matplotlib_lift(lift_df, bin_counts[i], axarr[i]))\n", "\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ROC Curve\n", "\n", "The receiver operating characteristic curve, or [ROC curve](https://docs.datarobot.com/en/docs/modeling/analyze-models/evaluate/roc-curve-tab/roc-curve.html#roc-curve), is a graphical plot that illustrates the performance of a binary classifier system as its discrimination threshold is varied. The curve is created by plotting the true positive rate (TPR) against the false positive rate (FPR) at various threshold settings.\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
accuracyf1_scorefalse_negative_scoretrue_negative_scoretrue_positive_scorefalse_positive_scoretrue_negative_ratefalse_positive_ratetrue_positive_ratematthews_correlation_coefficientpositive_predictive_valuenegative_predictive_valuethresholdfraction_predicted_as_positivefraction_predicted_as_negativelift_positivelift_negative
00.8436870.00000012386682001.0000000.0000000.0000000.0000000.0000000.8436871.0000000.0000001.0000000.0000001.000000
10.8440660.00483512356682301.0000000.0000000.0024230.0452241.0000000.8440070.5144130.0003790.9996216.3974151.000379
20.8439390.00643112346680420.9997010.0002990.0032310.0386950.6666670.8440740.4772470.0007580.9992424.2649431.000459
30.8443180.01438812296678940.9994010.0005990.0072700.0598460.6923080.8445680.4497020.0016410.9983594.4289801.001045
40.8444440.0253161222667216100.9985030.0014970.0129240.0725490.6153850.8451990.4239010.0032830.9967173.9368711.001792
......................................................
1100.1848480.2760717233123164490.0348700.9651300.9943460.0618930.1602860.9708330.0432290.9696970.0303031.0254191.150703
1110.1752530.2740615155123365270.0231970.9768030.9959610.0494500.1588920.9687500.0396980.9797980.0202021.0164971.148234
1120.1656570.272086377123566050.0115230.9884770.9975770.0330490.1575260.9625000.0337000.9898990.0101011.0077561.140826
1130.1564390.27039401123866810.0001500.9998501.0000000.0048370.1563331.0000000.0196730.9998740.0001261.0001261.185274
1140.1563130.27036500123866820.0000001.0000001.0000000.0000000.1563130.0000000.0000441.0000000.0000001.0000000.000000
\n", "

115 rows × 17 columns

\n", "
" ], "text/plain": [ " accuracy f1_score false_negative_score true_negative_score \\\n", "0 0.843687 0.000000 1238 6682 \n", "1 0.844066 0.004835 1235 6682 \n", "2 0.843939 0.006431 1234 6680 \n", "3 0.844318 0.014388 1229 6678 \n", "4 0.844444 0.025316 1222 6672 \n", ".. ... ... ... ... \n", "110 0.184848 0.276071 7 233 \n", "111 0.175253 0.274061 5 155 \n", "112 0.165657 0.272086 3 77 \n", "113 0.156439 0.270394 0 1 \n", "114 0.156313 0.270365 0 0 \n", "\n", " true_positive_score false_positive_score true_negative_rate \\\n", "0 0 0 1.000000 \n", "1 3 0 1.000000 \n", "2 4 2 0.999701 \n", "3 9 4 0.999401 \n", "4 16 10 0.998503 \n", ".. ... ... ... \n", "110 1231 6449 0.034870 \n", "111 1233 6527 0.023197 \n", "112 1235 6605 0.011523 \n", "113 1238 6681 0.000150 \n", "114 1238 6682 0.000000 \n", "\n", " false_positive_rate true_positive_rate \\\n", "0 0.000000 0.000000 \n", "1 0.000000 0.002423 \n", "2 0.000299 0.003231 \n", "3 0.000599 0.007270 \n", "4 0.001497 0.012924 \n", ".. ... ... \n", "110 0.965130 0.994346 \n", "111 0.976803 0.995961 \n", "112 0.988477 0.997577 \n", "113 0.999850 1.000000 \n", "114 1.000000 1.000000 \n", "\n", " matthews_correlation_coefficient positive_predictive_value \\\n", "0 0.000000 0.000000 \n", "1 0.045224 1.000000 \n", "2 0.038695 0.666667 \n", "3 0.059846 0.692308 \n", "4 0.072549 0.615385 \n", ".. ... ... \n", "110 0.061893 0.160286 \n", "111 0.049450 0.158892 \n", "112 0.033049 0.157526 \n", "113 0.004837 0.156333 \n", "114 0.000000 0.156313 \n", "\n", " negative_predictive_value threshold fraction_predicted_as_positive \\\n", "0 0.843687 1.000000 0.000000 \n", "1 0.844007 0.514413 0.000379 \n", "2 0.844074 0.477247 0.000758 \n", "3 0.844568 0.449702 0.001641 \n", "4 0.845199 0.423901 0.003283 \n", ".. ... ... ... \n", "110 0.970833 0.043229 0.969697 \n", "111 0.968750 0.039698 0.979798 \n", "112 0.962500 0.033700 0.989899 \n", "113 1.000000 0.019673 0.999874 \n", "114 0.000000 0.000044 1.000000 \n", "\n", " fraction_predicted_as_negative lift_positive lift_negative \n", "0 1.000000 0.000000 1.000000 \n", "1 0.999621 6.397415 1.000379 \n", "2 0.999242 4.264943 1.000459 \n", "3 0.998359 4.428980 1.001045 \n", "4 0.996717 3.936871 1.001792 \n", ".. ... ... ... \n", "110 0.030303 1.025419 1.150703 \n", "111 0.020202 1.016497 1.148234 \n", "112 0.010101 1.007756 1.140826 \n", "113 0.000126 1.000126 1.185274 \n", "114 0.000000 1.000000 0.000000 \n", "\n", "[115 rows x 17 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "roc = model_top.get_roc_curve(\"validation\")\n", "\n", "# Save the result into a pandas dataframe\n", "roc_df = pd.DataFrame(roc.roc_points)\n", "\n", "roc_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dr_roc_green = \"#03c75f\"\n", "white = \"#ffffff\"\n", "dr_purple = \"#65147D\"\n", "dr_dense_green = \"#018f4f\"\n", "\n", "threshold = roc.get_best_f1_threshold()\n", "fig = plt.figure(figsize=(8, 8))\n", "axes = fig.add_subplot(1, 1, 1, facecolor=dr_dark_blue)\n", "\n", "plt.scatter(roc_df.false_positive_rate, roc_df.true_positive_rate, color=dr_roc_green)\n", "plt.plot(roc_df.false_positive_rate, roc_df.true_positive_rate, color=dr_roc_green)\n", "plt.plot([0, 1], [0, 1], color=white, alpha=0.25)\n", "plt.title(\"ROC curve\")\n", "plt.xlabel(\"False Positive Rate\")\n", "plt.xlim([0, 1])\n", "plt.ylabel(\"True Positive Rate\")\n", "plt.ylim([0, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feature Impact\n", "\n", "[Feature Impact](https://docs.datarobot.com/en/docs/modeling/analyze-models/understand/feature-impact.html) measures how important a feature is in the context of a model. It measures how much the accuracy of a model would decrease if that feature was removed.\n", "\n", "Feature Impact is available for all model types and works by altering input data and observing the effect on a model’s score. It is an on-demand feature, meaning that you must initiate a calculation to see the results. Once DataRobot computes the feature impact for a model, that information is saved with the project.\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.04, 'Feature Impact')" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "feature_impacts = model_top.get_or_request_feature_impact()\n", "\n", "# Limit size to make chart look good. Display top 25 values\n", "if len(feature_impacts) > 25:\n", " feature_impacts = feature_impacts[0:24]\n", "\n", "# Formats the ticks from a float into a percent\n", "percent_tick_fmt = mtick.PercentFormatter(xmax=1.0)\n", "\n", "impact_df = pd.DataFrame(feature_impacts)\n", "impact_df.sort_values(by=\"impactNormalized\", ascending=True, inplace=True)\n", "\n", "# Positive values are blue, negative are red\n", "bar_colors = impact_df.impactNormalized.apply(lambda x: dr_red if x < 0 else dr_blue)\n", "\n", "ax = impact_df.plot.barh(\n", " x=\"featureName\", y=\"impactNormalized\", legend=False, color=bar_colors, figsize=(10, 8)\n", ")\n", "ax.xaxis.set_major_formatter(percent_tick_fmt)\n", "ax.xaxis.set_tick_params(labeltop=True)\n", "ax.xaxis.grid(True, alpha=0.2)\n", "ax.set_facecolor(dr_dark_blue)\n", "\n", "plt.ylabel(\"\")\n", "plt.xlabel(\"Effect\")\n", "plt.xlim((None, 1)) # Allow for negative impact\n", "plt.title(\"Feature Impact\", y=1.04);" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Make predictions\n", "\n", "### Test predictions\n", "\n", "After determining the top-performing model from the Leaderboard, upload the prediction test dataset to verify that the model generates predictions successfully before deploying the model to a production environment. The predictions are returned as a Pandas dataframe. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data_path_scoring = (\n", " \"https://s3.amazonaws.com/datarobot-use-case-datasets/Lending+Club+Dataset+Pred.csv\"\n", ")\n", "scoring_df = pd.read_csv(data_path_scoring, encoding=\"ISO-8859-1\")\n", "pathfinder_df.rename(columns={\"loan_is_bad\": \"is_bad\"}, inplace=True)\n", "\n", "prediction_dataset = project.upload_dataset(scoring_df)\n", "predict_job = model_top.request_predictions(prediction_dataset.id)\n", "prediction_dataset.id\n", "\n", "predictions = predict_job.get_result_when_complete()\n", "pd.concat([scoring_df, predictions], axis=1)\n", "predictions.positive_probability.plot(kind=\"hist\", title=\"Predicted Probabilities\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deploy a model to production\n", "\n", "\n", "If you are happy with the model's performance, you can deploy it to a production environment with [MLOps](https://docs.datarobot.com/en/mlops/index.html). Deploying the model will free up workers, as data scored through the deployment doesn't use any modeling workers. Furthermore, you are no longer restricted on the amount of data to score; score over 100GB with the deployment. Deployments also offer many model management benefits: monitoring service, data drift, model comparison, retraining, and more." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/plain": [ "Deployment(Late Shipment Predictions)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Retrieve a prediction server\n", "prediction_server = dr.PredictionServer.list()[0]\n", "\n", "# Get the top performing model. Uncomment if this did not execute in the previous section\n", "# model_top = sorted_by_metric(models, 'crossValidation', metric)[0]\n", "deployment = dr.Deployment.create_from_learning_model(\n", " model_top.id,\n", " label=\"Predicting Loan Defaults\",\n", " description=\"Predicting Loan Defaults\",\n", " default_prediction_server_id=prediction_server.id,\n", ")\n", "deployment.id" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Configure batch predictions\n", "\n", "After the model has been deployed, DataRobot creates an endpoint for real-time scoring. The deployment allows you to use DataRobot's batch prediction API to score large datasets with a deployed DataRobot model. \n", "\n", "The batch prediction API provides flexible intake and output options when scoring large datasets using prediction servers. The API is exposed through the DataRobot Public API and can be consumed using a REST-enabled client or Public API bindings for DataRobot's Python client." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Set the deployment ID" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before proceeding, provide the deployed model's deployment ID (retrieved from the deployment's [Overview tab](https://docs.datarobot.com/en/docs/mlops/monitor/dep-overview.html) or from the Deployment object in the Python client: `deployment.id`)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "deployment_id = \"YOUR_DEPLOYMENT_ID\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Determine input and output options\n", "\n", "DataRobot's batch prediction API allows you to score data from and to multiple sources. You can take advantage of the credentials and data sources you have already established previously through the UI for easy scoring. Credentials are usernames and passwords, while data sources are any databases with which you have previously established a connection (e.g., Snowflake). View the example code below outlining how to query credentials and data sources.\n", "\n", "You can reference the full list of DataRobot's supported [input](https://docs.datarobot.com/en/docs/predictions/batch/batch-prediction-api/intake-options.html) and [output options](https://docs.datarobot.com/en/docs/predictions/batch/batch-prediction-api/output-options.html).\n", "\n", "Reference the DataRobot documentation for more information about [data connections](https://docs.datarobot.com/en/docs/data/connect-data/data-conn.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The snippet below shows how you can query all credentials tied to a DataRobot account." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dr.Credential.list()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output above returns multiple sets of credentials. The alphanumeric string included in each item of the list is the credentials ID. You can use that ID to access credentials through the API." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The snippet below shows how you can query all data sources tied to a DataRobot account. The second line lists each datastore with an alphanumeric string; that is the datastore ID." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5e6696ff820e737a5bd78430\n" ] } ], "source": [ "dr.DataStore.list()\n", "print(dr.DataStore.list()[0].id)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Scoring examples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The snippets below demonstrate how to score data with the Batch Prediction API. Edit the `intake_settings` and `output_settings` to suit your needs. You can mix and match until you get the outcome you prefer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from CSV to CSV" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if False:\n", " results_df = deployment.predict_batch(source=Path(\"inputfile.csv\"))\n", " result_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from S3 to S3" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"s3\",\n", " \"url\": \"s3://theos-test-bucket/lending_club_scoring.csv\", # Provide the URL of your datastore here\n", " \"credential_id\": \"YOUR_CREDENTIAL_ID_FROM_ABOVE\", # Provide your credentials here\n", " },\n", " output_settings={\n", " \"type\": \"s3\",\n", " \"url\": \"s3://theos-test-bucket/lending_club_scored2.csv\",\n", " \"credential_id\": \"YOUR_CREDENTIAL_ID_FROM_ABOVE\",\n", " },\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from JDBC to JDBC" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"jdbc\",\n", " \"table\": \"table_name\",\n", " \"schema\": \"public\",\n", " \"dataStoreId\": data_store.id, # Provide the ID of your datastore here\n", " \"credentialId\": cred.credential_id, # Provide your credentials here\n", " },\n", " output_settings={\n", " \"type\": \"jdbc\",\n", " \"table\": \"table_name\",\n", " \"schema\": \"public\",\n", " \"statementType\": \"insert\",\n", " \"dataStoreId\": data_store.id,\n", " \"credentialId\": cred.credential_id,\n", " },\n", " )" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }