diff --git a/doc/_config.yml b/doc/_config.yml index 6726806ae..4b865e77b 100644 --- a/doc/_config.yml +++ b/doc/_config.yml @@ -11,6 +11,7 @@ execute: exclude_patterns: - 'howto/*-connect.ipynb' + - 'integrations/mindsdb.ipynb' # Define the name of the latex output file for PDF builds latex: diff --git a/doc/_toc.yml b/doc/_toc.yml index 953bb8119..7462e6d3e 100644 --- a/doc/_toc.yml +++ b/doc/_toc.yml @@ -9,25 +9,24 @@ parts: - file: intro - file: connecting - file: plot - - file: duckdb - - file: pandas + - file: plot-large - file: csv - file: compose - - file: plot-legacy + + - caption: Integrations + chapters: + - file: integrations/duckdb + - file: integrations/pandas + - file: integrations/mindsdb - caption: API Reference chapters: - - file: api/magic-sql - - file: api/magic-plot - - file: api/magic-render - - file: api/configuration - - file: api/python + - file: api + - file: configuration - caption: How-To chapters: - file: howto - - file: howto/postgres-install - - file: howto/postgres-connect - caption: Community chapters: diff --git a/doc/duckdb.md b/doc/integrations/duckdb.md similarity index 70% rename from doc/duckdb.md rename to doc/integrations/duckdb.md index 30ab0bfef..73ef2f464 100644 --- a/doc/duckdb.md +++ b/doc/integrations/duckdb.md @@ -159,10 +159,14 @@ SELECT * FROM track LIMIT 5 ## Plotting large datasets -```{versionadded} 0.5.2 +*New in version 0.4.4* + +```{note} +This is a beta feature, please [join our community](https://ploomber.io/community) and let us know what plots we should add next! ``` -This section demonstrates how we can efficiently plot large datasets with DuckDB and JupySQL without blowing up our machine's memory. `%sqlplot` performs all aggregations in DuckDB. + +This section demonstrates how we can efficiently plot large datasets with DuckDB and JupySQL without blowing up our machine's memory. Let's install the required package: @@ -191,17 +195,39 @@ In total, this contains more then 4.6M observations: SELECT count(*) FROM 'yellow_tripdata_2021-*.parquet' ``` +Now, let's keep track of how much memory this Python session is using: + +```{code-cell} ipython3 +import psutil +import os + +def memory_usage(): + """Print how much memory we're using + """ + process = psutil.Process(os.getpid()) + total = process.memory_info().rss / 10 ** 9 + print(f'Using: {total:.1f} GB') +``` + +```{code-cell} ipython3 +memory_usage() +``` + +```{code-cell} ipython3 +from sql import plot +``` + Let's use JupySQL to get a histogram of `trip_distance` across all 12 files: ```{code-cell} ipython3 -%sqlplot histogram --table yellow_tripdata_2021-*.parquet --column trip_distance --bins 50 +plot.histogram('yellow_tripdata_2021-*.parquet', 'trip_distance', bins=50) ``` We have some outliers, let's find the 99th percentile: ```{code-cell} ipython3 %%sql -SELECT percentile_disc(0.99) WITHIN GROUP (ORDER BY trip_distance) +SELECT percentile_disc(0.99) WITHIN GROUP (ORDER BY trip_distance), FROM 'yellow_tripdata_2021-*.parquet' ``` @@ -214,35 +240,78 @@ FROM 'yellow_tripdata_2021-*.parquet' WHERE trip_distance < 18.93 ``` -### Histogram +Now we create a new histogram: ```{code-cell} ipython3 -%sqlplot histogram --table no_outliers --column trip_distance --bins 50 --with no_outliers +plot.histogram('no_outliers', 'trip_distance', bins=50, with_=['no_outliers']) ``` -### Boxplot - ```{code-cell} ipython3 -%sqlplot boxplot --table no_outliers --column trip_distance --with no_outliers +memory_usage() ``` -## Querying existing dataframes +We see that memory usage increase just a bit. + ++++ + +### Benchmark: Using pandas + +We now repeat the same process using pandas. ```{code-cell} ipython3 import pandas as pd -from sqlalchemy import create_engine +import matplotlib.pyplot as plt +import pyarrow.parquet +``` -engine = create_engine("duckdb:///:memory:") -engine.execute("register", ("df", pd.DataFrame({"x": range(100)}))) +Data loading: + +```{code-cell} ipython3 +tables = [] + +# https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page +for i in range(1, N_MONTHS): + filename = f'yellow_tripdata_2021-{str(i).zfill(2)}.parquet' + t = pyarrow.parquet.read_table(filename) + tables.append(t) + +table = pyarrow.concat_tables(tables) +df = pyarrow.concat_tables(tables).to_pandas() ``` +First histogram: + ```{code-cell} ipython3 -%sql engine +_ = plt.hist(df.trip_distance, bins=50) ``` ```{code-cell} ipython3 -%%sql -SELECT * -FROM df -WHERE x > 95 +cutoff = df.trip_distance.quantile(.99) +cutoff +``` + +```{code-cell} ipython3 +subset = df.trip_distance[df.trip_distance < cutoff] +``` + +```{code-cell} ipython3 +_ = plt.hist(subset, bins=50) +``` + +```{code-cell} ipython3 +memory_usage() +``` + +**We're using 1.6GB of memory just by loading the data with pandas!** + +Try re-running the notebook with the full 12 months (change `N_MONTHS` to `12` in the earlier cell), and you'll see that memory usage blows up to 8GB. + +Even deleting the dataframes does not completely free up the memory ([explanation here](https://stackoverflow.com/a/39377643/709975)): + +```{code-cell} ipython3 +del df, subset +``` + +```{code-cell} ipython3 +memory_usage() ``` diff --git a/doc/integrations/mindsdb.ipynb b/doc/integrations/mindsdb.ipynb new file mode 100644 index 000000000..d85bca102 --- /dev/null +++ b/doc/integrations/mindsdb.ipynb @@ -0,0 +1,713 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0b7616c7-3bb2-4238-b98e-93153b923688", + "metadata": { + "tags": [] + }, + "source": [ + "# Mindsdb tutorial\n", + "In this guide we'll show an integration with MindsDB.\n", + "\n", + "We will use Jupysql to run queries on top of MindsDB.\n", + "Train the model on top of it via SQL.\n", + "Once the model is ready, we will use sklearn-evaluation to generate plots and evaluate our model.\n", + "\n", + "MindsDB is a powerful machine learning platform that enables users to easily build and deploy predictive models. One of the key features of MindsDB is its integration with Jupysql, which allows users to connect to and query databases from Jupyter notebooks. In this article, we will take a deeper dive into the technical details of this integration, and provide examples of how it can be used in practice. We will explore a customer churn dataset and generate predictions if our customer will churn or not. Once we're done with that we will evaluate our model and see how easy it is through a single line of code.\n", + "\n", + "The integration between Jupysql and MindsDB is made possible by the use of the sqlite3 library. This library allows for easy communication between the two systems, and enables users to connect to a wide variety of databases and warehouses, including Redshift, Snowflake, Big query, DuckDB, SQLite, MySQL, and PostgreSQL. Once connected, users can run SQL queries directly from the MindsDB environment, making it easy to extract data from databases and use it to train predictive models.\n", + "\n", + "Let's look at an example of how this integration can be used. Suppose we have a database containing customer churn data, and we want to use this data to train a model that predicts if a customer will churn or not. First, we would need to connect to the database from our Jupyter notebook using the jupysql library. This can be done using the following code:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b1f50ced-ff60-42c9-a062-7de4d22bc2d9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "# Install required packages\n", + "%pip install --quiet PyMySQL jupysql sklearn-evaluation --upgrade" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "fa78d6c7-bd63-404c-a3af-3731db1ad699", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The sql extension is already loaded. To reload it, use:\n", + " %reload_ext sql\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn_evaluation import plot\n", + "\n", + "# Import jupysql Jupyter extension to create SQL cells\n", + "%load_ext sql\n", + "%config SqlMagic.autocommit=False" + ] + }, + { + "cell_type": "markdown", + "id": "5ea94621-7988-45b2-91b5-f3714caff986", + "metadata": {}, + "source": [ + "**You'd need to make sure your MindsDB is up and reachable for the next stages. You can use either the local or the cloud version.**\n", + "\n", + "**Note:** you will need to adjust the connection string according to the instance you're trying to connect to (url, user, password).\n", + "In addition you'd need to load [the dataset file](https://github.com/mindsdb/mindsdb-examples/blob/master/classics/customer_churn/raw_data/WA_Fn-UseC_-Telco-Customer-Churn.csv) into the DB, follow this guide on [how to do it](https://docs.mindsdb.com/sql/create/file)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a83e6b8d-74ee-48b4-8a2c-800f87be442f", + "metadata": {}, + "outputs": [], + "source": [ + "%sql mysql+pymysql://YOUR_EMAIL:YOUR_PASSWORD@cloud.mindsdb.com:3306" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8e329923-aa88-49da-a447-f0a3b65d550e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* mysql+pymysql://ido%40ploomber.io:***@cloud.mindsdb.com:3306\n", + "2 rows affected.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Tables_in_files
churn
home_rentals
" + ], + "text/plain": [ + "[('churn',), ('home_rentals',)]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%sql SHOW TABLES FROM files;" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d8e26cc8-2b4b-4931-998d-a9197cc9f32c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* mysql+pymysql://ido%40ploomber.io:***@cloud.mindsdb.com:3306\n", + "5 rows affected.\n" + ] + }, + { + "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", + "
customerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetServiceOnlineSecurityOnlineBackupDeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalChargesChurn
7590-VHVEGFemale0YesNo1NoNo phone serviceDSLNoYesNoNoNoNoMonth-to-monthYesElectronic check29.8529.85No
5575-GNVDEMale0NoNo34YesNoDSLYesNoYesNoNoNoOne yearNoMailed check56.951889.5No
3668-QPYBKMale0NoNo2YesNoDSLYesYesNoNoNoNoMonth-to-monthYesMailed check53.85108.15Yes
7795-CFOCWMale0NoNo45NoNo phone serviceDSLYesNoYesYesNoNoOne yearNoBank transfer (automatic)42.31840.75No
9237-HQITUFemale0NoNo2YesNoFiber opticNoNoNoNoNoNoMonth-to-monthYesElectronic check70.7151.65Yes
" + ], + "text/plain": [ + "[('7590-VHVEG', 'Female', 0, 'Yes', 'No', 1, 'No', 'No phone service', 'DSL', 'No', 'Yes', 'No', 'No', 'No', 'No', 'Month-to-month', 'Yes', 'Electronic check', 29.85, '29.85', 'No'),\n", + " ('5575-GNVDE', 'Male', 0, 'No', 'No', 34, 'Yes', 'No', 'DSL', 'Yes', 'No', 'Yes', 'No', 'No', 'No', 'One year', 'No', 'Mailed check', 56.95, '1889.5', 'No'),\n", + " ('3668-QPYBK', 'Male', 0, 'No', 'No', 2, 'Yes', 'No', 'DSL', 'Yes', 'Yes', 'No', 'No', 'No', 'No', 'Month-to-month', 'Yes', 'Mailed check', 53.85, '108.15', 'Yes'),\n", + " ('7795-CFOCW', 'Male', 0, 'No', 'No', 45, 'No', 'No phone service', 'DSL', 'Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'One year', 'No', 'Bank transfer (automatic)', 42.3, '1840.75', 'No'),\n", + " ('9237-HQITU', 'Female', 0, 'No', 'No', 2, 'Yes', 'No', 'Fiber optic', 'No', 'No', 'No', 'No', 'No', 'No', 'Month-to-month', 'Yes', 'Electronic check', 70.7, '151.65', 'Yes')]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql \n", + "SELECT *\n", + "FROM files.churn\n", + "LIMIT 5;" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "c124b1e0-510c-4dd4-ab17-9251a6f4662c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* mysql+pymysql://ido%40ploomber.io:***@cloud.mindsdb.com:3306\n", + "0 rows affected.\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "CREATE MODEL mindsdb.customer_churn_predictor\n", + "FROM files\n", + " (SELECT * FROM churn)\n", + "PREDICT Churn;" + ] + }, + { + "cell_type": "markdown", + "id": "224f6c6b-5ecc-4652-b376-5c7c66544798", + "metadata": {}, + "source": [ + "## Training the model\n", + "\n", + "Training the model have 3 different statuses: Generating, Training, Complete.\n", + "Since it's a pretty small dataset it'd take a few minutes to get to the complete status.\n", + "\n", + "Once the status is \"complete\", move on to the next section.\n", + "\n", + "**Waiting for the below cell to show complete**" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "11e4e8a8-a9c0-4d33-ad37-e29d4b3b8dbf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* mysql+pymysql://ido%40ploomber.io:***@cloud.mindsdb.com:3306\n", + "1 rows affected.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
status
complete
" + ], + "text/plain": [ + "[('complete',)]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "SELECT status\n", + "FROM mindsdb.models\n", + "WHERE name='customer_churn_predictor';" + ] + }, + { + "cell_type": "markdown", + "id": "31dd94bb-d732-4734-bb20-fff43290aa47", + "metadata": {}, + "source": [ + "Now that our model is reeady to generate predictions, we can start using it.\n", + "In the cell below we'll start by getting a single prediction.\n", + "\n", + "We are classifying if a user will churn, it's confidence and the explanation based on a few input parameters such as their internet service, if they have phone service, dependents and more." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b8bb44bf-bb37-49eb-8ae8-9b9a49cfd7bb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* mysql+pymysql://ido%40ploomber.io:***@cloud.mindsdb.com:3306\n", + "1 rows affected.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ChurnChurn_confidenceChurn_explain
Yes0.7752808988764045{"predicted_value": "Yes", "confidence": 0.7752808988764045, "anomaly": null, "truth": null, "probability_class_No": 0.4756, "probability_class_Yes": 0.5244}
" + ], + "text/plain": [ + "[('Yes', '0.7752808988764045', '{\"predicted_value\": \"Yes\", \"confidence\": 0.7752808988764045, \"anomaly\": null, \"truth\": null, \"probability_class_No\": 0.4756, \"probability_class_Yes\": 0.5244}')]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "SELECT Churn, Churn_confidence, Churn_explain\n", + "FROM mindsdb.customer_churn_predictor\n", + "WHERE SeniorCitizen=0\n", + "AND Partner='Yes'\n", + "AND Dependents='No'\n", + "AND tenure=1\n", + "AND PhoneService='No'\n", + "AND MultipleLines='No phone service'\n", + "AND InternetService='DSL';" + ] + }, + { + "cell_type": "markdown", + "id": "9f99eeac-f5df-4d66-9dff-72ed53ad20e6", + "metadata": {}, + "source": [ + "We can get a batch of multiple entries.\n", + "\n", + "In the cell bellow we're getting 5 rows (customers) with different parameters such as monthly charges and contract type." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c75c9ebd-df84-4dca-be61-4c3b0c29ac6a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* mysql+pymysql://ido%40ploomber.io:***@cloud.mindsdb.com:3306\n", + "5 rows affected.\n" + ] + }, + { + "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", + "
customerIDContractMonthlyChargesChurn
7590-VHVEGMonth-to-month29.85Yes
5575-GNVDEOne year56.95No
3668-QPYBKMonth-to-month53.85Yes
7795-CFOCWOne year42.3No
9237-HQITUMonth-to-month70.7Yes
" + ], + "text/plain": [ + "[('7590-VHVEG', 'Month-to-month', 29.85, 'Yes'),\n", + " ('5575-GNVDE', 'One year', 56.95, 'No'),\n", + " ('3668-QPYBK', 'Month-to-month', 53.85, 'Yes'),\n", + " ('7795-CFOCW', 'One year', 42.3, 'No'),\n", + " ('9237-HQITU', 'Month-to-month', 70.7, 'Yes')]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "SELECT t.customerID, t.Contract, t.MonthlyCharges, m.Churn\n", + "FROM files.churn AS t\n", + "JOIN mindsdb.customer_churn_predictor AS m\n", + "LIMIT 5;" + ] + }, + { + "cell_type": "markdown", + "id": "707a4fbd-5bf0-462c-87bd-dea42b8c7a99", + "metadata": {}, + "source": [ + "## Classifier evaluation\n", + "\n", + "Now that our model is ready, we want and should evaluate it.\n", + "We will query the actual and predicted values from MindsDB to evaluate our model.\n", + "\n", + "Once we have the values we can plot them using sklearn-evaluation.\n", + "We will start first by getting all of our customers into a `pandas dataframe`.\n", + "\n", + "**Note:** Take a close look on the query below, by saving it into a variable we can compose complex and longer queries." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "7c3e5df2-3ac8-4355-996b-a321ec55d52a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* mysql+pymysql://ido%40ploomber.io:***@cloud.mindsdb.com:3306\n", + "7043 rows affected.\n" + ] + } + ], + "source": [ + "%%sql result << SELECT t.customerID, t.Contract, t.MonthlyCharges, m.Churn, \n", + "t.Churn as actual\n", + "FROM files.churn AS t\n", + "JOIN mindsdb.customer_churn_predictor AS m;" + ] + }, + { + "cell_type": "markdown", + "id": "6ecf0d7c-5d15-41fa-a3c3-9ef39f55a2b1", + "metadata": {}, + "source": [ + "In the cell below, we're saving the query output into a dataframe.\n", + "\n", + "We then, take the predicted churn values and the actual churn values into seperate variables." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "44655fd9-7008-4b4d-8b99-7732e1922e98", + "metadata": {}, + "outputs": [], + "source": [ + "df = result.DataFrame()\n", + "y_pred = df.Churn\n", + "y_test = df.actual" + ] + }, + { + "cell_type": "markdown", + "id": "c6bc42c2-32c1-4749-8f1a-bf5c2d8cdf3c", + "metadata": {}, + "source": [ + "## Plotting\n", + "Now that we have the values needed to evaluate our model, we can plot it into a confusion matrix:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e7b17c6a-2fa6-4df4-b9cc-1ce10e7f7b31", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAHHCAYAAAC2rPKaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbAUlEQVR4nO3dd1gU1/oH8O/SlrqABZCASBEEAxZMFImFGxSVWCIpGlQ0oFcFC1iIsWElscR2FdMU9WrUxJKIRkWxizEWlKDyUyxoBDUiIEhnfn8QJtkAK0sRdu/3c595HnfOmTPv7MXw+p4zMxJBEAQQERERqSGNhg6AiIiIqL4w0SEiIiK1xUSHiIiI1BYTHSIiIlJbTHSIiIhIbTHRISIiIrXFRIeIiIjUFhMdIiIiUltMdIiIiEhtMdEh+h9w8+ZN9O7dG8bGxpBIJNi7d2+djn/37l1IJBJER0fX6bjqoFWrVhg5cmRDh0H0P4uJDtErkpKSgn//+9+ws7ODrq4uZDIZPD09sWrVKuTl5dXruQMCApCYmIhFixZhy5Yt6NSpU72eTx1du3YNERERuHv3bkOHQkRKkPBdV0T1b//+/Xj//fchlUoxYsQIvP766ygsLMTp06exa9cujBw5El999VW9nDsvLw/6+vqYOXMmFi5cWC/nEAQBBQUF0NbWhqamZr2co6H98MMPeP/993Hs2DH07Nmz2scVFBRAQ0MD2tra9RccEVVJq6EDIFJ3d+7cwZAhQ2BjY4O4uDi0aNFCbAsODsatW7ewf//+ejv/kydPAAAmJib1dg6JRAJdXd16G1/VCIKA/Px86OnpQSqVNnQ4RP/TOHVFVM+WLFmCnJwcfPvtt3JJTjkHBwdMmjRJ/FxcXIwFCxbA3t4eUqkUrVq1wqeffoqCggK541q1aoV33nkHp0+fxptvvgldXV3Y2dlh8+bNYp+IiAjY2NgAAKZNmwaJRIJWrVoBAEaOHCn++e8iIiIgkUjk9sXGxuKtt96CiYkJDA0N4eTkhE8//VRsr2qNTlxcHLp16wYDAwOYmJhg4MCBuH79eqXnu3XrFkaOHAkTExMYGxtj1KhRePHiRdVf7J969uyJ119/HVevXkWPHj2gr68PBwcH/PDDDwCAEydOoHPnztDT04OTkxOOHDkid/y9e/cwfvx4ODk5QU9PD02bNsX7778vN0UVHR2N999/HwDg5eUFiUQCiUSC48ePA/jr/4tDhw6hU6dO0NPTw5dffim2la/REQQBXl5eaN68OR4/fiyOX1hYCFdXV9jb2yM3N/el10xE1cdEh6ie7du3D3Z2dujatWu1+gcFBWHOnDno2LEjVqxYgR49eiAyMhJDhgyp0PfWrVt477330KtXLyxfvhympqYYOXIkkpKSAACDBw/GihUrAABDhw7Fli1bsHLlSqXiT0pKwjvvvIOCggLMnz8fy5cvx4ABA3DmzBmFxx05cgQ+Pj54/PgxIiIiEBYWhrNnz8LT07PSdS4ffPABnj9/jsjISHzwwQeIjo7GvHnzqhXjs2fP8M4776Bz585YsmQJpFIphgwZgh07dmDIkCHo168fPvvsM+Tm5uK9997D8+fPxWN//fVXnD17FkOGDMHq1asxduxYHD16FD179hQTre7du2PixIkAgE8//RRbtmzBli1b4OzsLI6TnJyMoUOHolevXli1ahXat29fIU6JRIINGzYgPz8fY8eOFffPnTsXSUlJ2LhxIwwMDKp1zURUTQIR1ZusrCwBgDBw4MBq9U9ISBAACEFBQXL7p06dKgAQ4uLixH02NjYCAOHkyZPivsePHwtSqVSYMmWKuO/OnTsCAGHp0qVyYwYEBAg2NjYVYpg7d67w9/80rFixQgAgPHnypMq4y8+xceNGcV/79u0FMzMz4enTp+K+K1euCBoaGsKIESMqnO/jjz+WG/Pdd98VmjZtWuU5y/Xo0UMAIGzbtk3cd+PGDQGAoKGhIZw7d07cf+jQoQpxvnjxosKY8fHxAgBh8+bN4r7vv/9eACAcO3asQv/y/y8OHjxYaVtAQIDcvi+//FIAIPz3v/8Vzp07J2hqagqTJ09+6bUSkfJY0SGqR9nZ2QAAIyOjavU/cOAAACAsLExu/5QpUwCgwloeFxcXdOvWTfzcvHlzODk54fbt2zWO+Z/K1/b8+OOPKC0trdYxaWlpSEhIwMiRI9GkSRNxv5ubG3r16iVe59/9vcIBAN26dcPTp0/F71ARQ0NDuYqXk5MTTExM4OzsjM6dO4v7y//89+9HT09P/HNRURGePn0KBwcHmJiY4NKlS9W42jK2trbw8fGpVt8xY8bAx8cHEyZMwPDhw2Fvb4/FixdX+1xEVH1MdIjqkUwmAwC5qRJF7t27Bw0NDTg4OMjtt7CwgImJCe7duye3v2XLlhXGMDU1xbNnz2oYcUUffvghPD09ERQUBHNzcwwZMgQ7d+5UmPSUx+nk5FShzdnZGX/88UeFtSj/vBZTU1MAqNa1WFlZVVhXZGxsDGtr6wr7/jlmXl4e5syZA2tra0ilUjRr1gzNmzdHZmYmsrKyXnrucra2ttXuCwDffvstXrx4gZs3byI6Olou4SKiusNEh6geyWQyWFpa4rffflPquH/+0q5KVbdyC9V4akRV5ygpKZH7rKenh5MnT+LIkSMYPnw4rl69ig8//BC9evWq0Lc2anMtVR1bnTEnTJiARYsW4YMPPsDOnTtx+PBhxMbGomnTptWuYAFQOlE5fvy4uMA8MTFRqWOJqPqY6BDVs3feeQcpKSmIj49/aV8bGxuUlpbi5s2bcvsfPXqEzMxM8Q6qumBqaorMzMwK+/9ZNQIADQ0NvP322/jiiy9w7do1LFq0CHFxcTh27FilY5fHmZycXKHtxo0baNasWaNZdPvDDz8gICAAy5cvFxd2v/XWWxW+m+omn9WRlpaGCRMmoHfv3njnnXcwderUSr93Iqo9JjpE9Wz69OkwMDBAUFAQHj16VKE9JSUFq1atAgD069cPACrcGfXFF18AAHx9fessLnt7e2RlZeHq1avivrS0NOzZs0euX0ZGRoVjy+8o+uct7+VatGiB9u3bY9OmTXIJw2+//YbDhw+L19kYaGpqVqgarVmzpkK1qjwxqyw5VNbo0aNRWlqKb7/9Fl999RW0tLQQGBhYreoVESmHDwwkqmf29vbYtm0bPvzwQzg7O8s9Gfns2bP4/vvvxeestGvXDgEBAfjqq6+QmZmJHj164Pz589i0aRMGDRoELy+vOotryJAhCA8Px7vvvouJEyfixYsXiIqKgqOjo9wi3Pnz5+PkyZPw9fWFjY0NHj9+jHXr1sHKygpvvfVWleMvXboUffv2hYeHBwIDA5GXl4c1a9bA2NgYERERdXYdtfXOO+9gy5YtMDY2houLC+Lj43HkyBE0bdpUrl/79u2hqamJzz//HFlZWZBKpfjXv/4FMzMzpc63ceNG7N+/H9HR0bCysgJQllgNGzYMUVFRGD9+fJ1dGxEx0SF6JQYMGICrV69i6dKl+PHHHxEVFQWpVAo3NzcsX74co0ePFvt+8803sLOzQ3R0NPbs2QMLCwvMmDEDc+fOrdOYmjZtij179iAsLAzTp0+Hra0tIiMjcfPmTblEZ8CAAbh79y42bNiAP/74A82aNUOPHj0wb948cXFvZby9vXHw4EHMnTsXc+bMgba2Nnr06IHPP/9c6YW79WnVqlXQ1NTE1q1bkZ+fD09PT/EZQH9nYWGB9evXIzIyEoGBgSgpKcGxY8eUSnQePHiA0NBQ9O/fHwEBAeJ+f39/7Nq1C9OnT0ffvn0b1fdDpOr4risiIiJSW1yjQ0RERGqLiQ4RERGpLSY6REREpLaY6BAREZHaYqJDREREaouJDhEREaktPkenESotLcXDhw9hZGRUp4+dJyKiV0MQBDx//hyWlpbQ0Ki/mkJ+fj4KCwtrPY6Ojg50dXXrIKLGh4lOI/Tw4cMKb10mIiLVc//+ffEJ2HUtPz8fLY2N8KSwuNZjWVhY4M6dO2qZ7DDRaYSMjIwAAPFvtYGhVuVvXyZSdVaR4xo6BKJ6k52bBxvvaeJ/z+tDYWEhnhQWI/4t51r9rsgpLoHH6esoLCxkokOvRvl0laGWJoyY6JCakhnqNXQIRPXuVSw/MNLRqtXvComGei+RYKJDRESkyiSSsq02x6sxJjpEREQqTCKR1KpypO43vfD2ciIiIlJbrOgQERGpOvUuytQKEx0iIiKVJkHtMh31zpI4dUVERERqixUdIiIiFcabrhRjokNERKTCJBqSWj0LR92fo8OpKyIiIlJbrOgQERGpMs5dKcREh4iISIXxgYGKceqKiIiI1BYrOkRERKpMA0BtFhSrecmDiQ4REZEKk/z5v9ocr86Y6BAREakyLkZWSM0LVkRERPS/jBUdIiIiVcZXXSnERIeIiEiF8fZyxTh1RURERGqLFR0iIiJVxsXICjHRISIiUmGculKMU1dERESktljRISIiUmW860ohJjpERESqjGt0FOLUFREREaktVnSIiIhUGBcjK8ZEh4iISIUx0VGMiQ4REZEq4xodhbhGh4iIiNQWKzpERESqjLeXK8REh4iISIVJUMs1Omqe6XDqioiIiNQWKzpERESqjIuRFWJFh4iISIWV315em00ZUVFRcHNzg0wmg0wmg4eHB37++WexvWfPnhXGHzt2rNwYqamp8PX1hb6+PszMzDBt2jQUFxfL9Tl+/Dg6duwIqVQKBwcHREdH1+j7YUWHiIiIqs3KygqfffYZWrduDUEQsGnTJgwcOBCXL19G27ZtAQCjR4/G/PnzxWP09fXFP5eUlMDX1xcWFhY4e/Ys0tLSMGLECGhra2Px4sUAgDt37sDX1xdjx47F1q1bcfToUQQFBaFFixbw8fFRKl4mOkRERKrsFd911b9/f7nPixYtQlRUFM6dOycmOvr6+rCwsKj0+MOHD+PatWs4cuQIzM3N0b59eyxYsADh4eGIiIiAjo4O1q9fD1tbWyxfvhwA4OzsjNOnT2PFihVKJzqcuiIiIlJltZ22+nPqKjs7W24rKCh46alLSkqwfft25ObmwsPDQ9y/detWNGvWDK+//jpmzJiBFy9eiG3x8fFwdXWFubm5uM/HxwfZ2dlISkoS+3h7e8udy8fHB/Hx8Up/PazoEBEREaytreU+z507FxEREZX2TUxMhIeHB/Lz82FoaIg9e/bAxcUFAPDRRx/BxsYGlpaWuHr1KsLDw5GcnIzdu3cDANLT0+WSHADi5/T0dIV9srOzkZeXBz09vWpfFxMdIiIiwv379yGTycTPUqm0yr5OTk5ISEhAVlYWfvjhBwQEBODEiRNwcXHBmDFjxH6urq5o0aIF3n77baSkpMDe3r5er6EynLoiIiJSZeXTT7XZAPEuqvJNUaKjo6MDBwcHuLu7IzIyEu3atcOqVasq7du5c2cAwK1btwAAFhYWePTokVyf8s/l63qq6iOTyZSq5gBMdIiIiFSaRENS6622SktLq1zTk5CQAABo0aIFAMDDwwOJiYl4/Pix2Cc2NhYymUyc/vLw8MDRo0flxomNjZVbB1RdnLoiIiKiapsxYwb69u2Lli1b4vnz59i2bRuOHz+OQ4cOISUlBdu2bUO/fv3QtGlTXL16FaGhoejevTvc3NwAAL1794aLiwuGDx+OJUuWID09HbNmzUJwcLBYRRo7diz+85//YPr06fj4448RFxeHnTt3Yv/+/UrHy0SHiIhIhdXkoX//PF4Zjx8/xogRI5CWlgZjY2O4ubnh0KFD6NWrF+7fv48jR45g5cqVyM3NhbW1Nfz8/DBr1izxeE1NTcTExGDcuHHw8PCAgYEBAgIC5J67Y2tri/379yM0NBSrVq2ClZUVvvnmG6VvLQeY6BAREam2V/wKiG+//bbKNmtra5w4ceKlY9jY2ODAgQMK+/Ts2ROXL19WKrbKcI0OERERqS0mOkRERKS2OHVFRESkyl7xKyBUDSs6REREpLZY0SEiIlJhZWuRa3PXVR0G0wgx0SEiIlJlnLpSiFNXREREpLZY0SEiIlJlr/g5OqqGiQ4REZEKY56jGBMdIiIiVcY1OgpxjQ4RERGpLVZ0iIiIVBpLOoow0SEiIlJlzHMU4tQVERERqS1WdIiIiFQZKzoKMdEhIiJSYZI//1eb49UZp66IiIhIbbGiQ0REpOrUuyhTK0x0iIiIVBnX6CjEqSsiIiJSW0x0iIiISG1x6oqIiEiFSSQSSGrxZs7aHKsKmOgQERGpMq7RUYhTV0RERKS2WNEhIiJSZRJJ2Vab49UYEx0iIiJVxqkrhTh1RURERGqLFR0iIiIVxoKOYkx0iIiIVBkzHYU4dUVERERqixUdIiIiVca7rhRiokNERKTKOHWlEKeuiIiISG2xokNERKTCWNBRjIkOERGRKuMaHYU4dUVERERqi4kOERERqS1OXREREakyLtJRiIkOERGRCpNIJJDUYp1NbY5VBZy6IiIiIrWlchUdiUSCPXv2YNCgQQ0dCjUiWx48xdYHT/EgrxAA0NpQFxNtzeDVTAYAeFxQhMibaTiVkYPc4hLYGUgR0socfc2NxTFu5xZg8c00XMzKRVGpgDaGugizt0DXJoZin9/zCzHr+u+If5YDA00N+FmaYrp9C2hpqPe/iKjhnbyQjGXRh3Dp2l2kPcnCrpXBGPR2RwBAUVExZq/Zg59PJeL2709gbKiHt7u4IHKyHyzNTMUxLl27h09W/IALSXegqaGBwd7uWD79Qxjq61Y439PMHHTwi8Dvj5/h6Zk1MJHpv7JrJSVx6kqhRlXRSU9Px4QJE2BnZwepVApra2v0798fR48ebejQAAA9e/aERCLB9u3b5favXLkSrVq1apigCADQQqqNcAcL7OvcGj+92RpdTQ0x5so9/F9OPgBgStJ93H5RgG/atcKhLo7o09wYwYn38Ft2njhG4JU7KBEEbOtoh32dW8PZSA+BCXfwuKAIAFAiCPj48l0UCQJ2veGAZW2t8cPDZ/jidnqDXDP9b8nNK0Q7RyusmTmsQtuL/EJcup6Kmf/ujws75uKHFcH4v7vpGDRhjdjn4eNn6D16GRxamiF+6ywcWB+KaykPMWrWhkrPFzRnI1wdrerteqgOSepgU2ONJtG5e/cu3N3dERcXh6VLlyIxMREHDx6El5cXgoODGzo8ka6uLmbNmoWioqKGDoX+xru5DF7NZLDVl8LOQIppDhbQ19TA5awXAICLWS8QYN0M7Y310VJfigl25pBpa+K352XtGYXFuPOiEONamcHZSA+2+lKEO1ggr1QQk6WTT5/jZm4+VrS1RlsjPXg1kyHM3gJb7j9FYWlpg107/W/o280VCyYOxrt/VnH+zthIH4e/noIP+rwBJ1sLdGlnj9Wf+uPitXtITXsKAIg5cRXaWlr4z0x/ONla4I3XbbFu9nDsjr2IW6mP5MaL2nEMWc/zMGWkzyu5NlItUVFRcHNzg0wmg0wmg4eHB37++WexPT8/H8HBwWjatCkMDQ3h5+eHR4/kf8ZSU1Ph6+sLfX19mJmZYdq0aSguLpbrc/z4cXTs2BFSqRQODg6Ijo6uUbyNJtEZP348JBIJzp8/Dz8/Pzg6OqJt27YICwvDuXPnqjwuPDwcjo6O0NfXh52dHWbPni2XhFy5cgVeXl4wMjKCTCaDu7s7Lly4AAC4d+8e+vfvD1NTUxgYGKBt27Y4cOCAwjiHDh2KzMxMfP311wr7RUVFwd7eHjo6OnBycsKWLVuU+DaoNkoEAT+lZyKvpBQdjcvK7e7G+oh5lInMomKU/tleUFKKLqZl01Km2pqw05did9ozvCgpRXGpgG2/Z6CZjhZcZXoAgMtZL+BkqIvmUm3xXD2aGuF5SSn+L6fg1V8okQJZz/MgkUhgYlT2d6CwsBg62prQ0PjrP/t6umU/y6cv3RT3XUt5iIXr9yF6cSA0OCWrEsoXI9dmU4aVlRU+++wzXLx4ERcuXMC//vUvDBw4EElJSQCA0NBQ7Nu3D99//z1OnDiBhw8fYvDgweLxJSUl8PX1RWFhIc6ePYtNmzYhOjoac+bMEfvcuXMHvr6+8PLyQkJCAiZPnoygoCAcOnRI6e+nUazRycjIwMGDB7Fo0SIYGBhUaDcxManyWCMjI0RHR8PS0hKJiYkYPXo0jIyMMH36dACAv78/OnTogKioKGhqaiIhIQHa2mV/uYODg1FYWIiTJ0/CwMAA165dg6GhYZXnAgCZTIaZM2di/vz5CAgIqDTePXv2YNKkSVi5ciW8vb0RExODUaNGwcrKCl5eXkp8M6SMGzl5GPxrCgpKS6GvqYEv29mgtWHZ2oP/uNogJPEe2p+4Bi0JoKehgS/btUIrfSmAsv9QbO1oizFX7qHtsd+gIQGaamshur0tjLXL/po8KSxGMx35vzLln58UFgHQe3UXS6RAfkERZqz4AUP6vgmZYdnPpVfnNpiybAeWbTyIicO8kfuiADNW7gIApP+RBQAoKCyC//Qv8XnY+2jZoiluP3jSYNdASnjFa3T69+8v93nRokWIiorCuXPnYGVlhW+//Rbbtm3Dv/71LwDAxo0b4ezsjHPnzqFLly44fPgwrl27hiNHjsDc3Bzt27fHggULEB4ejoiICOjo6GD9+vWwtbXF8uXLAQDOzs44ffo0VqxYAR8f5SqNjaKic+vWLQiCgDZt2ih97KxZs9C1a1e0atUK/fv3x9SpU7Fz506xPTU1Fd7e3mjTpg1at26N999/H+3atRPbPD094erqCjs7O7zzzjvo3r37S885fvx46Orq4osvvqi0fdmyZRg5ciTGjx8PR0dHhIWFYfDgwVi2bFml/QsKCpCdnS23kfLs9KU40Lk19r7hgGFWTTEl6T5u/jnt9EVKOrKLS7C1oy1+erM1Am2aIzjxHm7klK3REQQBs288RFMdLXzfyR4/vuGA3mbGCLpyV1yjQ6QKioqK8eHUKAgQsG72cHF/W4fXsHHhx/hi0yEYvjEOll5hsH2tGcybyqDx57/oP125C23sWmBYf4+GCp8a0D9/DxUUvLxSXVJSgu3btyM3NxceHh64ePEiioqK4O3tLfZp06YNWrZsifj4eABAfHw8XF1dYW5uLvbx8fFBdna2WBWKj4+XG6O8T/kYymgUiY4gCDU+dseOHfD09ISFhQUMDQ0xa9YspKamiu1hYWEICgqCt7c3PvvsM6SkpIhtEydOxMKFC+Hp6Ym5c+fi6tWr1TqnVCrF/PnzsWzZMvzxxx8V2q9fvw5PT0+5fZ6enrh+/Xql40VGRsLY2FjcrK2tqxUHydPR0EArfSlcZfoId2gBZyM9bLj/B+69KMCmB0+x1MUank2M4GKkh8l25nCT6WPz/bL1C2ef5SDuj2yscW2JTiYGeF2mj4VtXoOuhgQ/pD0DADTX0cIfhfJzyOWfm+tog6ihlSU565H68CkOfTVFrOaU+8i3Cx4eX4H7R5bhyelVmDtuIJ48ew5bq+YAgGPnb+CHwxeg0340dNqPRq+gsn+cmXWfhIi1e1/15dArZm1tLfe7KDIyssq+iYmJMDQ0hFQqxdixY7Fnzx64uLggPT0dOjo6FWZizM3NkZ5eduNGenq6XJJT3l7epqhPdnY28vLyoIxGkei0bt0aEokEN27cUOq4+Ph4+Pv7o1+/foiJicHly5cxc+ZMFBYWin0iIiKQlJQEX19fxMXFwcXFBXv27AEABAUF4fbt2xg+fDgSExPRqVMnrFmzpqrTyRk2bBhsbGywcOFCpWKuzIwZM5CVlSVu9+/fr/WYBJQKAgpLBeT9uVD4n8sNNACUp9h5JYK4T66PBCjPwzsY6yM5J18u2Tn19DmMNDXQ2lBa9xdApITyJOdW6iMc/noqmppUPQ1v3swYhvq62HHoPHSl2ujl0RYA8P2K8bj8QwQufT8Xl76fi68iRgIATkSHY/yQf72Ky6CaKH+pZ202APfv35f7XTRjxowqT+nk5ISEhAT88ssvGDduHAICAnDt2rVXdcVKaRSJTpMmTeDj44O1a9ciNze3QntmZmalx509exY2NjaYOXMmOnXqhNatW+PevXsV+jk6OiI0NBSHDx/G4MGDsXHjRrHN2toaY8eOxe7duzFlypSXLjIup6GhgcjISERFReHu3btybc7Ozjhz5ozcvjNnzsDFxaXSsaRSqbh6vXwj5Xx+Kw2/PMvB/bxC3MjJw+e30nDuWS4GWZjAXl8XrfR08On135GQ9QL3XhTg63tPcDojB72bl33XHY31YaytiSlJ93Hted6fz9R5iPt5RfBqZgQA6N7UCK0NdBH6WyquPc/DiafPsTwlHcOtm0Kq0Sj+KpEay3mRj4QbqUi4UVaxvvv7H0i4kYrUtKcoKirG+2FRuJh0F1s+G4OS0lKk/5GF9D+yUFj0V2K+dttRXLp2D/93Nx3rvovDxMXbsHiSn/iMHHtrM7ze2krcbK2aAQCc7Sxh1pT/XWq06uj28n/+HpJKq/4HnI6ODhwcHODu7o7IyEi0a9cOq1atgoWFBQoLCyv83n706BEsLCwAABYWFhXuwir//LI+MpkMenrKrYdsFIuRAWDt2rXw9PTEm2++ifnz58PNzQ3FxcWIjY1FVFRUpdM+rVu3RmpqKrZv34433ngD+/fvF6s1AJCXl4dp06bhvffeg62tLR48eIBff/0Vfn5+AIDJkyejb9++cHR0xLNnz3Ds2DE4OztXO2ZfX1907twZX375pVyJbdq0afjggw/QoUMHeHt7Y9++fdi9ezeOHDlSi2+IFHlaWIywpPt4UlAMIy0NtDHSw+YOtujWtCxJ2djBFp/fTEPQlbvILS6Bjb4Uy9taiw8UbKKjhU0dbLH0Vjo+unQbxaUCWhvq4qt2NnAxKvtLpSmR4Nv2rTDrxu8Y/Ost6GtqwK+FKcLsLBrsuul/x4Wku3j746Xi5ylLdwAARgzoirnjB2Lf8QQAQMf3IuSOO7phGnq+Ubb+8fxvdxCx7kfkvChAG1sLRM0ZjuH9u76S+Em9lZaWoqCgAO7u7tDW1sbRo0fF37XJyclITU2Fh0fZ2i8PDw8sWrQIjx8/hpmZGQAgNjYWMplMLAh4eHhUuAs6NjZWHEMZjSbRsbOzw6VLl7Bo0SJMmTIFaWlpaN68Odzd3REVFVXpMQMGDEBoaChCQkJQUFAAX19fzJ49GxEREQAATU1NPH36FCNGjMCjR4/QrFkzDB48GPPmzQNQtogqODgYDx48gEwmQ58+fbBixQql4v7888/Rtav8fygGDRqEVatWYdmyZZg0aRJsbW2xceNG9OzZU+nvhapniYvidU22+lKsb9dKYR83mT62dLRT2MdKTwfRHWyVDY+o1nq+0QYlid9W2a6ordymxUF1ek5qHCQQZ59qfLwyZsyYgb59+6Jly5Z4/vw5tm3bhuPHj+PQoUMwNjZGYGAgwsLC0KRJE8hkMkyYMAEeHh7o0qULAKB3795wcXHB8OHDsWTJEqSnp2PWrFkIDg4Wq0hjx47Ff/7zH0yfPh0ff/wx4uLisHPnTuzfv1/56xNqsxKY6kV2djaMjY2R2LMtjLQ0GzoconphvWJSQ4dAVG+yc/Jg6hGCrKyseluOUP674vEnAyHTrfkNEdn5RTD77MdqxxoYGIijR48iLS0NxsbGcHNzQ3h4OHr16gWg7IGBU6ZMwXfffYeCggL4+Phg3bp14rQUUPYcu3HjxuH48eMwMDBAQEAAPvvsM2hp/VV/OX78OEJDQ3Ht2jVYWVlh9uzZGDlypNLXx0SnEWKiQ/8LmOiQOlPnREfVNJqpKyIiIqoBvtRTISY6REREqoyJjkK8J5aIiIjUFis6REREKkzy5/9qc7w6Y6JDRESkyjh1pRCnroiIiEhtsaJDRESkyljRUYiJDhERkSpjoqMQEx0iIiKVxkxHEa7RISIiIrXFig4REZEKk0hq+VJP9S7oMNEhIiJSaZy5UohTV0RERKS2WNEhIiJSZZy7UogVHSIiIlJbTHSIiIhIbXHqioiISIVx5koxJjpERESqjJmOQpy6IiIiIrXFig4REZEq43N0FGJFh4iIiNQWKzpEREQqTCKRQFKLdTa1OVYVsKJDREREaouJDhEREaktTl0RERGpMt5erhArOkRERKS2WNEhIiJSZRqSsq02x6sxJjpERESqjM/RUYhTV0RERKS2WNEhIiJSZRIJIKlF3ULNFyMz0SEiIlJptbzrSs3nrjh1RURERGqLFR0iIiJVxsXICjHRISIiUmnMdBRhokNERKTKmOcoxDU6REREpLZY0SEiIlJlfNeVQkx0iIiIVBkTHYU4dUVERERqixUdIiIiVcaKjkJMdIiIiFQab7tShFNXREREpLaY6BAREakySR1sSoiMjMQbb7wBIyMjmJmZYdCgQUhOTpbr07NnT0gkErlt7Nixcn1SU1Ph6+sLfX19mJmZYdq0aSguLpbrc/z4cXTs2BFSqRQODg6Ijo5WLlgw0SEiIlJt5Wt0arMp4cSJEwgODsa5c+cQGxuLoqIi9O7dG7m5uXL9Ro8ejbS0NHFbsmSJ2FZSUgJfX18UFhbi7Nmz2LRpE6KjozFnzhyxz507d+Dr6wsvLy8kJCRg8uTJCAoKwqFDh5SKl2t0iIiIVNkrXox88OBBuc/R0dEwMzPDxYsX0b17d3G/vr4+LCwsKh3j8OHDuHbtGo4cOQJzc3O0b98eCxYsQHh4OCIiIqCjo4P169fD1tYWy5cvBwA4Ozvj9OnTWLFiBXx8fKodLys6REREhOzsbLmtoKCgWsdlZWUBAJo0aSK3f+vWrWjWrBlef/11zJgxAy9evBDb4uPj4erqCnNzc3Gfj48PsrOzkZSUJPbx9vaWG9PHxwfx8fFKXRcrOkRERKqsjio61tbWcrvnzp2LiIgIhYeWlpZi8uTJ8PT0xOuvvy7u/+ijj2BjYwNLS0tcvXoV4eHhSE5Oxu7duwEA6enpckkOAPFzenq6wj7Z2dnIy8uDnp5etS6PiQ4REZEqq6NE5/79+5DJZOJuqVT60kODg4Px22+/4fTp03L7x4wZI/7Z1dUVLVq0wNtvv42UlBTY29vXPNYa4NQVERERQSaTyW0vS3RCQkIQExODY8eOwcrKSmHfzp07AwBu3boFALCwsMCjR4/k+pR/Ll/XU1UfmUxW7WoOwESHiIiIlCAIAkJCQrBnzx7ExcXB1tb2pcckJCQAAFq0aAEA8PDwQGJiIh4/fiz2iY2NhUwmg4uLi9jn6NGjcuPExsbCw8NDqXiZ6BAREamyV3x7eXBwMP773/9i27ZtMDIyQnp6OtLT05GXlwcASElJwYIFC3Dx4kXcvXsXP/30E0aMGIHu3bvDzc0NANC7d2+4uLhg+PDhuHLlCg4dOoRZs2YhODhYrCSNHTsWt2/fxvTp03Hjxg2sW7cOO3fuRGhoqFLxMtEhIiKiaouKikJWVhZ69uyJFi1aiNuOHTsAADo6Ojhy5Ah69+6NNm3aYMqUKfDz88O+ffvEMTQ1NRETEwNNTU14eHhg2LBhGDFiBObPny/2sbW1xf79+xEbG4t27dph+fLl+Oabb5S6tRzgYmQiIiLV9oqfoyMIgsJ2a2trnDhx4qXj2NjY4MCBAwr79OzZE5cvX1Yqvn+qVqLz008/VXvAAQMG1DgYIiIiUhLfXq5QtRKdQYMGVWswiUSCkpKS2sRDREREVGeqleiUlpbWdxxERERUE6zoKFSrxcj5+fl1FQcRERFRnVM60SkpKcGCBQvw2muvwdDQELdv3wYAzJ49G99++22dB0hEREQKvOLby1WN0onOokWLEB0djSVLlkBHR0fc//rrr+Obb76p0+CIiIiIakPpRGfz5s346quv4O/vD01NTXF/u3btcOPGjToNjoiIiF5CQ1L7TY0p/Ryd33//HQ4ODhX2l5aWoqioqE6CIiIiIiWo+fRTbShd0XFxccGpU6cq7P/hhx/QoUOHOgmKiIiIqC4oXdGZM2cOAgIC8Pvvv6O0tBS7d+9GcnIyNm/ejJiYmPqIkYiIiKogkUggqUVFpzbHqgKlKzoDBw7Evn37cOTIERgYGGDOnDm4fv069u3bh169etVHjERERFQV3nWlUI3eddWtWzfExsbWdSxEREREdarGL/W8cOECrl+/DqBs3Y67u3udBUVERETVxCcjK6R0ovPgwQMMHToUZ86cgYmJCQAgMzMTXbt2xfbt22FlZVXXMRIRERHViNJrdIKCglBUVITr168jIyMDGRkZuH79OkpLSxEUFFQfMRIRERHViNIVnRMnTuDs2bNwcnIS9zk5OWHNmjXo1q1bnQZHREREL8GpK4WUTnSsra0rfTBgSUkJLC0t6yQoIiIiqiYmOgopPXW1dOlSTJgwARcuXBD3XbhwAZMmTcKyZcvqNDgiIiJ6Cd5erlC1KjqmpqZyDxTKzc1F586doaVVdnhxcTG0tLTw8ccfY9CgQfUSKBEREZGyqpXorFy5sp7DICIiohrh1JVC1Up0AgIC6jsOIiIiojpX4wcGAkB+fj4KCwvl9slksloFRERERFRXlF6MnJubi5CQEJiZmcHAwACmpqZyGxEREb1CXIyskNKJzvTp0xEXF4eoqChIpVJ88803mDdvHiwtLbF58+b6iJGIiIiqwkRHIaWnrvbt24fNmzejZ8+eGDVqFLp16wYHBwfY2Nhg69at8Pf3r484iYiIiJSmdEUnIyMDdnZ2AMrW42RkZAAA3nrrLZw8ebJuoyMiIiLFWNFRSOlEx87ODnfu3AEAtGnTBjt37gRQVukpf8knERERvSJMdBRSOtEZNWoUrly5AgD45JNPsHbtWujq6iI0NBTTpk2r8wCJiIiIakrpNTqhoaHin729vXHjxg1cvHgRDg4OcHNzq9PgiIiI6CUkf261OV6N1eo5OgBgY2MDGxubuoiFiIiIlMZMR5FqJTqrV6+u9oATJ06scTBERESkJL4CQqFqJTorVqyo1mASiYSJDhERETUa1Up0yu+yolfLesN6yIwMGzoMonohpMY3dAhE9aew4NWdixUdhWq9RoeIiIgaEBMdhZS+vZyIiIhIVbCiQ0REpMp405VCTHSIiIhUGjMdRTh1RURERGqrRonOqVOnMGzYMHh4eOD3338HAGzZsgWnT5+u0+CIiIjoJfiuK4WUTnR27doFHx8f6Onp4fLlyygoKLuFLisrC4sXL67zAImIiEgBCQANSc039c5zlE90Fi5ciPXr1+Prr7+Gtra2uN/T0xOXLl2q0+CIiIiIakPpxcjJycno3r17hf3GxsbIzMysi5iIiIiouvgcHYWUruhYWFjg1q1bFfafPn0adnZ2dRIUERERVdMrXqMTGRmJN954A0ZGRjAzM8OgQYOQnJws1yc/Px/BwcFo2rQpDA0N4efnh0ePHsn1SU1Nha+vL/T19WFmZoZp06ahuLhYrs/x48fRsWNHSKVSODg4IDo6WumvR+lEZ/To0Zg0aRJ++eUXSCQSPHz4EFu3bsXUqVMxbtw4pQMgIiKiWnjFic6JEycQHByMc+fOITY2FkVFRejduzdyc3PFPqGhodi3bx++//57nDhxAg8fPsTgwYPF9pKSEvj6+qKwsBBnz57Fpk2bEB0djTlz5oh97ty5A19fX3h5eSEhIQGTJ09GUFAQDh06pNzXIwiCoMwBgiBg8eLFiIyMxIsXLwAAUqkUU6dOxYIFC5Q6OVUuOzu7bCrw9im+64rUFt91ReosOycPpj2mICsrCzKZrH7O8efvimd7ZkJmoFvzcXLzYfruohrH+uTJE5iZmeHEiRPo3r07srKy0Lx5c2zbtg3vvfceAODGjRtwdnZGfHw8unTpgp9//hnvvPMOHj58CHNzcwDA+vXrER4ejidPnkBHRwfh4eHYv38/fvvtN/FcQ4YMQWZmJg4ePFjt+JSu6EgkEsycORMZGRn47bffcO7cOTx58oRJDhERUUOoo4pOdna23FZ+V/XLZGVlAQCaNGkCALh48SKKiorg7e0t9mnTpg1atmyJ+Piyf+DEx8fD1dVVTHIAwMfHB9nZ2UhKShL7/H2M8j7lY1RXjR8YqKOjAxcXF7z55pswNGTVgYiISJVZW1vD2NhY3CIjI196TGlpKSZPngxPT0+8/vrrAID09HTo6OjAxMRErq+5uTnS09PFPn9Pcsrby9sU9cnOzkZeXl61r0vpu668vLwgUTCfFxcXp+yQRERE1MDu378vN3UllUpfekxwcDB+++23Rv3AYKUTnfbt28t9LioqQkJCAn777TcEBATUVVxERET0CslkMqXW6ISEhCAmJgYnT56ElZWVuN/CwgKFhYXIzMyUq+o8evQIFhYWYp/z58/LjVd+V9bf+/zzTq1Hjx5BJpNBT0+v2nEqneisWLGi0v0RERHIyclRdjgiIiKqjVf8HB1BEDBhwgTs2bMHx48fh62trVy7u7s7tLW1cfToUfj5+QEoewZfamoqPDw8AAAeHh5YtGgRHj9+DDMzMwBAbGwsZDIZXFxcxD4HDhyQGzs2NlYco7rq7KWew4YNw4YNG+pqOCIiImqEgoOD8d///hfbtm2DkZER0tPTkZ6eLq6bMTY2RmBgIMLCwnDs2DFcvHgRo0aNgoeHB7p06QIA6N27N1xcXDB8+HBcuXIFhw4dwqxZsxAcHCxOmY0dOxa3b9/G9OnTcePGDaxbtw47d+5EaGioUvEqXdGpSnx8PHR1a357GxEREdXAK67oREVFAQB69uwpt3/jxo0YOXIkgLLZHw0NDfj5+aGgoAA+Pj5Yt26d2FdTUxMxMTEYN24cPDw8YGBggICAAMyfP1/sY2tri/379yM0NBSrVq2ClZUVvvnmG/j4+CgVr9KJzt8f+AOUlbDS0tJw4cIFzJ49W9nhiIiISIVU5/F7urq6WLt2LdauXVtlHxsbmwpTU//Us2dPXL58WekY/07pRMfY2Fjus4aGBpycnDB//nz07t27VsEQERER1SWlEp2SkhKMGjUKrq6uMDU1ra+YiIiIqNokf261OV59KbUYWVNTE7179+ZbyomIiBoLSR1sakzpu65ef/113L59uz5iISIiIqpTSic6CxcuxNSpUxETE4O0tLQK78YgIiIiaiyqvUZn/vz5mDJlCvr16wcAGDBggNyrIARBgEQiQUlJSd1HSURERJV7xbeXq5pqJzrz5s3D2LFjcezYsfqMh4iIiJTCxciKVDvRKb9vvkePHvUWDBEREVFdUur2ckVvLSciIqIGwIKOQkolOo6Oji9NdjIyMmoVEBEREVFdUSrRmTdvXoUnIxMRERE1VkolOkOGDBFfp05ERESNAO+6Uqjaz9Hh+hwiIiJSNdVOdKrztlIiIiKixqTaU1elpaX1GQcRERHVBKeuFFL6FRBEREREqkKpxchERETU2PBBOoqwokNERERqixUdIiIiVcaCjkJMdIiIiFQaMx1FOHVFREREaosVHSIiIlXGgo5CTHSIiIhUGjMdRTh1RURERGqLFR0iIiJVxoKOQqzoEBERkdpiokNERERqi1NXREREqowv9VSIiQ4REZFK4yIdRZjoEBERqTLmOQpxjQ4RERGpLVZ0iIiIVBnX6CjERIeIiEjlqXeyUhucuiIiIiK1xUSHiIiI1BanroiIiFQdZ66qxIoOERERqS1WdIiIiFQaH6SjCBMdIiIiVcY8RyFOXREREZHaYkWHiIhIpbGkowgTHSIiIlXGPEchTl0RERGpNEkdbNV38uRJ9O/fH5aWlpBIJNi7d69c+8iRIyGRSOS2Pn36yPXJyMiAv78/ZDIZTExMEBgYiJycHLk+V69eRbdu3aCrqwtra2ssWbJEqTjLMdEhIiKiasvNzUW7du2wdu3aKvv06dMHaWlp4vbdd9/Jtfv7+yMpKQmxsbGIiYnByZMnMWbMGLE9OzsbvXv3ho2NDS5evIilS5ciIiICX331ldLxcuqKiIiIqq1v377o27evwj5SqRQWFhaVtl2/fh0HDx7Er7/+ik6dOgEA1qxZg379+mHZsmWwtLTE1q1bUVhYiA0bNkBHRwdt27ZFQkICvvjiC7mEqDpY0SEiIlJl5W8vr82GsirK37eCgoIah3T8+HGYmZnByckJ48aNw9OnT8W2+Ph4mJiYiEkOAHh7e0NDQwO//PKL2Kd79+7Q0dER+/j4+CA5ORnPnj1TKhYmOkRERARra2sYGxuLW2RkZI3G6dOnDzZv3oyjR4/i888/x4kTJ9C3b1+UlJQAANLT02FmZiZ3jJaWFpo0aYL09HSxj7m5uVyf8s/lfaqLU1dERESqrI7uurp//z5kMpm4WyqV1mi4IUOGiH92dXWFm5sb7O3tcfz4cbz99tu1CLRmWNEhIiJSaXVz15VMJpPbapro/JOdnR2aNWuGW7duAQAsLCzw+PFjuT7FxcXIyMgQ1/VYWFjg0aNHcn3KP1e19qcqTHSIiIio3jx48ABPnz5FixYtAAAeHh7IzMzExYsXxT5xcXEoLS1F586dxT4nT55EUVGR2Cc2NhZOTk4wNTVV6vxMdIiIiKjacnJykJCQgISEBADAnTt3kJCQgNTUVOTk5GDatGk4d+4c7t69i6NHj2LgwIFwcHCAj48PAMDZ2Rl9+vTB6NGjcf78eZw5cwYhISEYMmQILC0tAQAfffQRdHR0EBgYiKSkJOzYsQOrVq1CWFiY0vFyjQ4REZEqe8VPRr5w4QK8vLzEz+XJR0BAAKKionD16lVs2rQJmZmZsLS0RO/evbFgwQK5qbCtW7ciJCQEb7/9NjQ0NODn54fVq1eL7cbGxjh8+DCCg4Ph7u6OZs2aYc6cOUrfWg4w0SEiIiIl9OzZE4IgVNl+6NChl47RpEkTbNu2TWEfNzc3nDp1Sun4/omJDhERkUrjy64UYaJDRESkyv720L8aH6/GuBiZiIiI1BYTHSIiIlJbnLoiIiJSZVyioxATHSIiIpXGTEcRTl0RERGR2mJFh4iISJWxoKMQEx0iIiKVxkxHEU5dERERkdpiRYeIiEiV8YGBCrGiQ0RERGqLiQ4RERGpLZVIdCQSCfbu3dvQYZCKidq4E+16fABj27dgbPsWuvYdgZ+PnBbbU+7cx+CAMJi18YKx7Vv4MHA6Hj1+WulYBQWF6NDzQ2g074CExORXdQlEopOXbmLA5HWw8pkBTffx2Hssocq+4xZvg6b7eKzaFifuO37h/6DpPr7S7dekuwCAuw+fVtp+LvFOPV8d1Ur51FVtNjXW4IlOeno6JkyYADs7O0ilUlhbW6N///44evRog8ZVUFCAtm3bYsyYMRXapk+fDltbWzx//rwBIqPqsrI0R+SsCbhwZCt+PbIVXm+9iUEjQpF0IwW5uXnw+WA8JBIJju7+Cqf3b0RhUREGDJuE0tLSCmNNn7cSlhbNG+AqiMrk5hWinaMV1oR/qLDfnrgE/JJ4F5bNjeX2d21nh98PRcptgYM8YftaU3RysZHrezhqolw/9zYt6/x6iF6VBl2MfPfuXXh6esLExARLly6Fq6srioqKcOjQIQQHB+PGjRsNFptUKsXmzZvh4eEBPz8/+Pj4AADOnTuHFStW4MiRIzAyMmqw+Ojl+vv0kPu8aGYI1kd/j3MXruL3tMe4m/oQl+K+g8zIEAAQ/Z/5aOLQA3GnzsO7RxfxuJ+PnEbs8XP4YeNS/Hz0zCu9BqJyfT3boq9nW4V9fn+ciUlLd+Ln/4Sg/6R1cm062lqwaPZX8lNUVIKfTlxByIc9IfnHv+ibGhvI9aVGjouRFWrQis748WX/oj5//jz8/Pzg6OiItm3bIiwsDOfOnavyuPDwcDg6OkJfXx92dnaYPXs2ioqKxPYrV67Ay8sLRkZGkMlkcHd3x4ULFwAA9+7dQ//+/WFqagoDAwO0bdsWBw4cqPQ87u7umDlzJgIDA5GZmYn8/HyMGjUKEyZMQI8ePXD69Gl069YNenp6sLa2xsSJE5Gbmysev27dOrRu3Rq6urowNzfHe++9V0ffHCmrpKQE2/ccRO6LPHi84YaCwkJIJBJIdXTEPrpSKTQ0NHD6lwRx36PHTzEmbAE2r1sAfT29BoicqHpKS0sRMDsaU4d7o6295Uv7/3TyKp5m5WLkAI8KbYNC18PCezq6f7wcP524Wh/hEr0yDVbRycjIwMGDB7Fo0SIYGBhUaDcxManyWCMjI0RHR8PS0hKJiYkYPXo0jIyMMH36dACAv78/OnTogKioKGhqaiIhIQHa2toAgODgYBQWFuLkyZMwMDDAtWvXYGhoWOW5Zs6ciX379mHixIkwMzODRCLB4sWLkZKSgj59+mDhwoXYsGEDnjx5gpCQEISEhGDjxo24cOECJk6ciC1btqBr167IyMjAqVOnKj1HQUEBCgoKxM/Z2dnV+QqpGhKv3UTXvgHILyiEoYEedkcvh4uTPZo3NYWBvh7C56/C4pkhEATgkwWrUFJSgrRHfwAABEHAqAlz8O+A99CpfVvcTX3YwFdDVLUl0YehqamBCUO9qtV/w49n0dvDBVbmpuI+Qz0ploX6oWs7O2hoSLD7aAIGT/kSu5f/GwN6uNVX6ET1qsESnVu3bkEQBLRp00bpY2fNmiX+uVWrVpg6dSq2b98uJjqpqamYNm2aOHbr1q3F/qmpqfDz84OrqysAwM7OTuG5tLS0sHnzZri7u6O0tBRnzpyBrq4uIiMj4e/vj8mTJ4vnWL16NXr06IGoqCikpqbCwMAA77zzDoyMjGBjY4MOHTpUeo7IyEjMmzdP6e+BXs7JoRUuH9uOrOc5+OGnIxg5YQ6O//gNXJzssfPbJRg/fTHWfP0dNDQ0MHRwH3R0c4aGRlkZd83X3+F5zgvMmPxxA18FkWIXr6di9fbjuLD1kwrTUJV58OgZDsdfw/bPguT2NzM1ROiwt8XPb7RthYd/ZGL55lgmOo0Zp64UarBERxCEGh+7Y8cOrF69GikpKcjJyUFxcTFkMpnYHhYWhqCgIGzZsgXe3t54//33YW9vDwCYOHEixo0bh8OHD8Pb2xt+fn5wc1P8F9jFxQV+fn7IzMxEp06dAJRNj129ehVbt26Vu6bS0lLcuXMHvXr1go2NDezs7NCnTx/06dMH7777LvT19SuMP2PGDISFhYmfs7OzYW1tXePvh/6io6MNB7uyhZTu7VxwISEJq776Dl8un4XeXh649es+/PH0GbS0tGBibIQWLt740KZsPdax078i/sJV6L7WWW7MN3r5w9+vL6LXLnjl10NUmdOXb+FxxnO08v3rH4ElJaWYumIXVm2Lw+2YhXL9o3+KR1NjAwzo/vLkpfPrtjhyruHWSxLVVoOt0WndujUkEonSC47j4+Ph7++Pfv36ISYmBpcvX8bMmTNRWFgo9omIiEBSUhJ8fX0RFxcHFxcX7NmzBwAQFBSE27dvY/jw4UhMTESnTp2wZs2al55XS0sLWlp/5YU5OTn497//jYSEBHG7cuUKbt68CXt7exgZGeHSpUv47rvv0KJFC8yZMwft2rVDZmZmhbGlUilkMpncRvWjtFRAYUGh3L5mTU1hYmyEuFPn8fiPDAzoU7aIedXi6Ug4vgOXj23H5WPbsf+7sp+T7V9/hoUzQ1557ERVGdbvTSRsn4lL2z4VN8vmxpg6vBd+/s8Eub6CICB6XzyG+3aGtrbmS8dOSH6AFlyY3MhJ6mBTXw1W0WnSpAl8fHywdu1aTJw4scI6nczMzErX6Zw9exY2NjaYOXOmuO/evXsV+jk6OsLR0RGhoaEYOnQoNm7ciHfffRcAYG1tjbFjx2Ls2LGYMWMGvv76a0yYMKHCGIp07NgR165dg4ODQ5V9tLS04O3tDW9vb8ydOxcmJiaIi4vD4MGDlToX1cyMBavR921PtLRqgec5udi262ccP3MBB3eW3Y2ycduPcHa0RfOmpoi/cBWTZy7F5LH+cHJoBQBoadVCbjxDg7JqnH0ra1hZmr/SayHKeZGPW/efiJ/vPnyKhOT7aCIzQMsWTdDURH6tobaWJiyayeDUSv5nNe7XZNz5/SkCB3lWOMemfeego62JDk5lFeU9xxKw8aez+Gr2sHq4Iqo7fKmnIg16e/natWvh6emJN998E/Pnz4ebmxuKi4sRGxuLqKgoXL9+vcIxrVu3RmpqKrZv34433ngD+/fvF6s1AJCXl4dp06bhvffeg62tLR48eIBff/0Vfn5+AIDJkyejb9++cHR0xLNnz3Ds2DE4OzsrHXt4eDi6dOmCkJAQBAUFiQubY2Nj8Z///AcxMTG4ffs2unfvDlNTUxw4cAClpaVwcnKq+RdGSnn8RwYCQmYj7dEfMJYZws2lNQ7uXIdePctuHU++dRefLlyDjMwstLK2xKehgQgdy/+gU+N04Voq3v73SvHzlC92AQBGvNMFG+eNqPY4G/aeRdd2dmhja1Fp+6Jvfsa9tAxoaWqgTSsLfBcZiPe8O9YqdqKG1KCJjp2dHS5duoRFixZhypQpSEtLQ/PmzeHu7o6oqKhKjxkwYABCQ0MREhKCgoIC+Pr6Yvbs2YiIiAAAaGpq4unTpxgxYgQePXqEZs2aYfDgweJi35KSEgQHB+PBgweQyWTo06cPVqxYoXTsbm5uOHHiBGbOnIlu3bpBEATY29vjww/LHuZlYmKC3bt3IyIiAvn5+WjdujW+++47tG2r+DkYVHe+XRWhsP2zOZPw2ZxJ1R6vVUtLlD65XMuoiGqmZydHlFxc9/KOf/rnupxyWxdXvbg+oH8XBPTvUmU7NVIs6CgkEWqzKpjqRXZ2NoyNjZF5+5T4MDsidSOkxjd0CET1JjsnD6Y9piArK6ve1l2W/654dv5LyAxr/pyv7Jw8mL7573qNtSE1+CsgiIiIiOpLg05dERERUW1x7koRJjpERESqTIJaPjCwziJplJjoEBERqTRWdBThGh0iIiJSW0x0iIiISG1x6oqIiEiV8aWeCrGiQ0RERGqLFR0iIiKVxsXIijDRISIiUmWculKIU1dERESktpjoEBERkdri1BUREZFK4xodRVjRISIiIrXFRIeIiIjUFqeuiIiIVBnvulKIiQ4REZFK00DtJmjUe3JHva+OiIiI6tTJkyfRv39/WFpaQiKRYO/evXLtgiBgzpw5aNGiBfT09ODt7Y2bN2/K9cnIyIC/vz9kMhlMTEwQGBiInJwcuT5Xr15Ft27doKurC2trayxZsqRG8TLRISIiUmmSv6avarIpeddVbm4u2rVrh7Vr11bavmTJEqxevRrr16/HL7/8AgMDA/j4+CA/P1/s4+/vj6SkJMTGxiImJgYnT57EmDFjxPbs7Gz07t0bNjY2uHjxIpYuXYqIiAh89dVXSn87nLoiIiJSaa/29vK+ffuib9++lbYJgoCVK1di1qxZGDhwIABg8+bNMDc3x969ezFkyBBcv34dBw8exK+//opOnToBANasWYN+/fph2bJlsLS0xNatW1FYWIgNGzZAR0cHbdu2RUJCAr744gu5hKg6WNEhIiIiZGdny20FBQVKj3Hnzh2kp6fD29tb3GdsbIzOnTsjPj4eABAfHw8TExMxyQEAb29vaGho4JdffhH7dO/eHTo6OmIfHx8fJCcn49mzZ0rFxESHiIhIldVm2upvd2xZW1vD2NhY3CIjI5UOJT09HQBgbm4ut9/c3FxsS09Ph5mZmVy7lpYWmjRpItensjH+fo7q4tQVERER4f79+5DJZOJnqVTagNHUHVZ0iIiICDKZTG6rSaJjYWEBAHj06JHc/kePHoltFhYWePz4sVx7cXExMjIy5PpUNsbfz1FdTHSIiIhUmqQOtrpha2sLCwsLHD16VNyXnZ2NX375BR4eHgAADw8PZGZm4uLFi2KfuLg4lJaWonPnzmKfkydPoqioSOwTGxsLJycnmJqaKhUTEx0iIiJV9orznJycHCQkJCAhIQFA2QLkhIQEpKamQiKRYPLkyVi4cCF++uknJCYmYsSIEbC0tMSgQYMAAM7OzujTpw9Gjx6N8+fP48yZMwgJCcGQIUNgaWkJAPjoo4+go6ODwMBAJCUlYceOHVi1ahXCwsKU/nq4RoeIiIiq7cKFC/Dy8hI/lycfAQEBiI6OxvTp05Gbm4sxY8YgMzMTb731Fg4ePAhdXV3xmK1btyIkJARvv/02NDQ04Ofnh9WrV4vtxsbGOHz4MIKDg+Hu7o5mzZphzpw5St9aDgASQRCEWlwv1YPs7GwYGxsj8/YpyIwMGzoconohpMY3dAhE9SY7Jw+mPaYgKytLboFvnZ7jz98VzxK+g8xIv+bjPH8B0/ZD6zXWhsSKDhERkSrjSz0VYqJDRESkwiR//q82x6szLkYmIiIitcWKDhERkUp7te+6UjVMdIiIiFQZ8xyFOHVFREREaosVHSIiIpXGko4iTHSIiIhUGW8vV4hTV0RERKS2WNEhIiJSeepdlakNVnSIiIhIbTHRISIiIrXFqSsiIiKVxruuFGGiQ0REpMp415VCTHSIiIhUGis6inCNDhEREaktVnSIiIhUGaeuFGJFh4iIiNQWEx0iIiJSW5y6IiIiUmlcjKwIEx0iIiJVxjU6CnHqioiIiNQWKzpEREQqjVNXijDRISIiUmWculKIU1dERESktpjoEBERkdri1BUREZFK4xodRZjoEBERqTQmOopw6oqIiIjUFis6REREqox3XSnERIeIiEilcepKEU5dERERkdpiRYeIiEiVcepKISY6REREKo1TV4pw6oqIiIjUFis6REREqowFHYWY6BAREak0ZjqKcOqKiIiI1BYTHSIiIlJbnLoiIiJSZby9XCEmOkRERCqNa3QU4dQVERERqS0mOkRERCpPUotNOREREZBIJHJbmzZtxPb8/HwEBwejadOmMDQ0hJ+fHx49eiQ3RmpqKnx9faGvrw8zMzNMmzYNxcXFNbjul+PUFRERkSprgDU6bdu2xZEjR8TPWlp/pROhoaHYv38/vv/+exgbGyMkJASDBw/GmTNnAAAlJSXw9fWFhYUFzp49i7S0NIwYMQLa2tpYvHhxza+jCkx0iIiISClaWlqwsLCosD8rKwvffvsttm3bhn/9618AgI0bN8LZ2Rnnzp1Dly5dcPjwYVy7dg1HjhyBubk52rdvjwULFiA8PBwRERHQ0dGp01g5dUVERETIzs6W2woKCqrse/PmTVhaWsLOzg7+/v5ITU0FAFy8eBFFRUXw9vYW+7Zp0wYtW7ZEfHw8ACA+Ph6urq4wNzcX+/j4+CA7OxtJSUl1fl1MdIiIiFRabdbn/LVOx9raGsbGxuIWGRlZ6dk6d+6M6OhoHDx4EFFRUbhz5w66deuG58+fIz09HTo6OjAxMZE7xtzcHOnp6QCA9PR0uSSnvL28ra5x6oqIiIhw//59yGQy8bNUKq20X9++fcU/u7m5oXPnzrCxscHOnTuhp6dX73EqixUdIiIiVVa+GLk2GwCZTCa3VZXo/JOJiQkcHR1x69YtWFhYoLCwEJmZmXJ9Hj16JK7psbCwqHAXVvnnytb91BYTHSIiIqqxnJwcpKSkoEWLFnB3d4e2tjaOHj0qticnJyM1NRUeHh4AAA8PDyQmJuLx48din9jYWMhkMri4uNR5fJy6IiIiomqbOnUq+vfvDxsbGzx8+BBz586FpqYmhg4dCmNjYwQGBiIsLAxNmjSBTCbDhAkT4OHhgS5dugAAevfuDRcXFwwfPhxLlixBeno6Zs2aheDg4GpXkZTBRIeIiEilvdpXQDx48ABDhw7F06dP0bx5c7z11ls4d+4cmjdvDgBYsWIFNDQ04Ofnh4KCAvj4+GDdunXi8ZqamoiJicG4cePg4eEBAwMDBAQEYP78+bW4hqpJBEEQ6mVkqrHs7GwYGxsj8/YpyIwMGzoconohpMY3dAhE9SY7Jw+mPaYgKytLboFvnZ6j/HdFyola/a7Ifp4DE/se9RprQ2JFh4iISJXx7eUKcTEyERERqS1WdIiIiFTaq12jo2qY6BAREak0JjqKMNFphMrXh2c/z23gSIjqj5CT19AhENWb7Nx8AH/997xez1XL3xXq/ruGiU4j9Pz5cwBAy3Z9GjgSIiKqjefPn8PY2LhextbR0YGFhQVatvOp9VgWFhZ1/tbwxoK3lzdCpaWlePjwIYyMjCBR89XwjUV2djasra0rvOuFSB3w5/vVEwQBz58/h6WlJTQ06u++n/z8fBQWFtZ6HB0dHejq6tZBRI0PKzqNkIaGBqysrBo6jP9J5e94IVJH/Pl+teqrkvN3urq6apug1BXeXk5ERERqi4kOERERqS0mOkQApFIp5s6dWy8vlCNqaPz5pv9lXIxMREREaosVHSIiIlJbTHSIiIhIbTHRISIiIrXFRIdUmkQiwd69exs6DKI6x59torrBRIcarfT0dEyYMAF2dnaQSqWwtrZG//79cfTo0YYODQDQs2dPSCQSbN++XW7/ypUr0apVq4YJilRCY/3ZLigoQNu2bTFmzJgKbdOnT4etra34ihoiVcEnI1OjdPfuXXh6esLExARLly6Fq6srioqKcOjQIQQHB+PGjRsNHSKAsqeSzpo1C35+ftDW1m7ocEgFNOafbalUis2bN8PDwwN+fn7w8Sl7h9K5c+ewYsUKHDlyBEZGRg0WH1FNsKJDjdL48eMhkUhw/vx5+Pn5wdHREW3btkVYWBjOnTtX5XHh4eFwdHSEvr4+7OzsMHv2bBQVFYntV65cgZeXF4yMjCCTyeDu7o4LFy4AAO7du4f+/fvD1NQUBgYGaNu2LQ4cOKAwzqFDhyIzMxNff/21wn5RUVGwt7eHjo4OnJycsGXLFiW+DVInjf1n293dHTNnzkRgYCAyMzORn5+PUaNGYcKECejRowdOnz6Nbt26QU9PD9bW1pg4cSJyc/96+/W6devQunVr6OrqwtzcHO+9914dfXNENcOKDjU6GRkZOHjwIBYtWgQDA4MK7SYmJlUea2RkhOjoaFhaWiIxMRGjR4+GkZERpk+fDgDw9/dHhw4dEBUVBU1NTSQkJIiVmODgYBQWFuLkyZMwMDDAtWvXYGhoqDBWmUyGmTNnYv78+QgICKg03j179mDSpElYuXIlvL29ERMTg1GjRsHKygpeXl5KfDOk6lTlZ3vmzJnYt28fJk6cCDMzM0gkEixevBgpKSno06cPFi5ciA0bNuDJkycICQlBSEgINm7ciAsXLmDixInYsmULunbtioyMDJw6dap2XxpRbQlEjcwvv/wiABB279790r4AhD179lTZvnTpUsHd3V38bGRkJERHR1fa19XVVYiIiKh2nD169BAmTZok5OfnCzY2NsL8+fMFQRCEFStWCDY2NmK/rl27CqNHj5Y79v333xf69etX7XORelCVn21BEISkpCRBV1dX0NHREX799VdBEAQhMDBQGDNmjFy/U6dOCRoaGkJeXp6wa9cuQSaTCdnZ2Uqdi6g+ceqKGh2hFg/r3rFjBzw9PWFhYQFDQ0PMmjULqampYntYWBiCgoLg7e2Nzz77DCkpKWLbxIkTsXDhQnh6emLu3Lm4evVqtc4plUoxf/58LFu2DH/88UeF9uvXr8PT01Nun6enJ65fv17DqyRVpUo/2y4uLvDz80OvXr3QqVMnAGXTY9HR0TA0NBQ3Hx8flJaW4s6dO+jVqxdsbGxgZ2eH4cOHY+vWrXjx4kWNr5moLjDRoUandevWkEgkSi/KjI+Ph7+/P/r164eYmBhcvnwZM2fORGFhodgnIiICSUlJ8PX1RVxcHFxcXLBnzx4AQFBQEG7fvo3hw4cjMTERnTp1wpo1a6p17mHDhsHGxgYLFy5UKmb636JqP9taWlrQ0vprhUNOTg7+/e9/IyEhQdyuXLmCmzdvwt7eHkZGRrh06RK+++47tGjRAnPmzEG7du2QmZmp1PUS1amGLikRVaZPnz7Ca6+9JuTk5FRoe/bsmfhn/K28v2zZMsHOzk6ub2BgoGBsbFzleYYMGSL079+/0rZPPvlEcHV1rfLY8qmrcjExMYKOjo4wadKkak1d+fr6Vjk2qS9V+NkuFxAQIAwcOFD8/NFHHwlvv/32S48rl5OTI2hpaQm7du2q9jFEdY0VHWqU1q5di5KSErz55pvYtWsXbt68ievXr2P16tXw8PCo9JjWrVsjNTUV27dvR0pKClavXi3+ixYA8vLyEBISguPHj+PevXs4c+YMfv31Vzg7OwMAJk+ejEOHDuHOnTu4dOkSjh07JrZVh6+vLzp37owvv/xSbv+0adMQHR2NqKgo3Lx5E1988QV2796NqVOn1uCbIVWnij/b5cLDw3H27FmEhIQgISEBN2/exI8//oiQkBAAQExMDFavXo2EhATcu3cPmzdvRmlpKZycnGrwTRHVkYbOtIiq8vDhQyE4OFiwsbERdHR0hNdee00YMGCAcOzYMbEP/rFgc9q0aULTpk0FQ0ND4cMPPxRWrFgh/qu3oKBAGDJkiGBtbS3o6OgIlpaWQkhIiJCXlycIgiCEhIQI9vb2glQqFZo3by4MHz5c+OOPP6qM758VHUEQhLNnzwoA5Co6giAI69atE+zs7ARtbW3B0dFR2Lx5c22+GlJxjf1nu9w/KzqCIAjnz58XevXqJRgaGgoGBgaCm5ubsGjRIkEQyhYm9+jRQzA1NRX09PQENzc3YceOHbX6rohqSyIItVgdR0RERNSIceqKiIiI1BYTHSIiIlJbTHSIiIhIbTHRISIiIrXFRIeIiIjUFhMdIiIiUltMdIiIiEhtMdEhokqNHDkSgwYNEj/37NkTkydPfuVxHD9+HBKJROH7kiQSCfbu3VvtMSMiItC+fftaxXX37l1IJBIkJCTUahwiql9MdIhUyMiRIyGRSCCRSKCjowMHBwfMnz8fxcXF9X7u3bt3Y8GCBdXqW53khIjoVdB6eRciakz69OmDjRs3oqCgAAcOHEBwcDC0tbUxY8aMCn0LCwuho6NTJ+dt0qRJnYxDRPQqsaJDpGKkUiksLCxgY2ODcePGwdvbGz/99BOAv6abFi1aBEtLS/Flivfv38cHH3wAExMTNGnSBAMHDsTdu3fFMUtKShAWFgYTExM0bdoU06dPxz/fDvPPqauCggKEh4fD2toaUqkUDg4O+Pbbb3H37l14eXkBAExNTSGRSDBy5EgAQGlpKSIjI2Fraws9PT20a9cOP/zwg9x5Dhw4AEdHR+jp6cHLy0suzuoKDw+Ho6Mj9PX1YWdnh9mzZ6OoqKhCvy+//BLW1tbQ19fHBx98gKysLLn2b775Bs7OztDV1UWbNm2wbt06pWMhoobFRIdIxenp6aGwsFD8fPToUSQnJyM2NhYxMTEoKiqCj48PjIyMcOrUKZw5cwaGhobo06ePeNzy5csRHR2NDRs24PTp08jIyJB7O3ZlRowYge+++w6rV6/G9evX8eWXX8LQ0BDW1tbYtWsXACA5ORlpaWlYtWoVACAyMhKbN2/G+vXrkZSUhNDQUAwbNgwnTpwAUJaQDR48GP3790dCQgKCgoLwySefKP2dGBkZITo6GteuXcOqVavw9ddfY8WKFXJ9bt26hZ07d2Lfvn04ePAgLl++jPHjx4vtW7duxZw5c7Bo0SJcv34dixcvxuzZs7Fp0yal4yGiBtTALxUlIiX8/W3SpaWlQmxsrCCVSoWpU6eK7ebm5kJBQYF4zJYtWwQnJyehtLRU3FdQUCDo6ekJhw4dEgRBEFq0aCEsWbJEbC8qKhKsrKzk3lz997e1JycnCwCE2NjYSuM8duyYAEB49uyZuC8/P1/Q19cXzp49K9c3MDBQGDp0qCAIgjBjxgzBxcVFrj08PLzCWP+Ef7zp+5+WLl0quLu7i5/nzp0raGpqCg8ePBD3/fzzz4KGhoaQlpYmCIIg2NvbC9u2bZMbZ8GCBYKHh4cgCIJw584dAYBw+fLlKs9LRA2Pa3SIVExMTAwMDQ1RVFSE0tJSfPTRR4iIiBDbXV1d5dblXLlyBbdu3YKRkZHcOPn5+UhJSUFWVhbS0tLQuXNnsU1LSwudOnWqMH1VLiEhAZqamujRo0e147516xZevHiBXr16ye0vLCxEhw4dAADXr1+XiwMAPDw8qn2Ocjt27MDq1auRkpKCnJwcFBcXQyaTyfVp2bIlXnvtNbnzlJaWIjk5GUZGRkhJSUFgYCBGjx4t9ikuLoaxsbHS8RBRw2GiQ6RivLy8EBUVBR0dHVhaWkJLS/6vsYGBgdznnJwcuLu7Y+vWrRXGat68eY1i0NPTU/qYnJwcAMD+/fvlEgygbN1RXYmPj4e/vz/mzZsHHx8fGBsbY/v27Vi+fLnSsX799dcVEi9NTc06i5WI6h8THSIVY2BgAAcHh2r379ixI3bs2AEzM7MKVY1yLVq0wC+//ILu3bsDKKtcXLx4ER07dqy0v6urK0pLS3HixAl4e3tXaC+vKJWUlIj7XFxcIJVKkZqaWmUlyNnZWVxYXe7cuXMvv8i/OXv2LGxsbDBz5kxx37179yr0S01NxcOHD2FpaSmeR0NDA05OTjA3N4elpSVu374Nf39/pc5PRI0LFyMTqTl/f380a9YMAwcOxKlTp3Dnzh0cP34cEydOxIMHDwAAkyZNwmeffYa9e/fixo0bGD9+vMJn4LRq1QoBAQH4+OOPsXfvXnHMnTt3AgBsbGwgkUgQExODJ0+eICcnB0ZGRpg6dSpCQ0OxadMmpKSk4NKlS1izZo24wHfs2LG4efMmpk2bhuTkZGzbtg3R0dFKXW/r1q2RmpqK7du3IyUlBatXr650YbWuri4CAgJw5coVnDp1ChMnTsQHH3wACwsLAMC8efMQGRmJ1atX4//+7/+QmJiIjRs34osvvlAqHiJqWEx0iNScvr4+Tp48iZYtW2Lw4MFwdnZGYGAg8vPzxQrPlClTMHz4cAQEBMDDwwNGRkZ49913FY4bFRWF9957D+PHj0ebNm0wevRo5ObmAgBee+01zJs3D5988gnMzc0REhICAFiwYAFmz56NyMhIODs7o0+fPti/fz9sbW0BlK2b2bVrF/bu3Yt27dph/fr1WLx4sVLXO2DAAISGhiIkJATt27fH2bNnMXv27Ar9HBwcMHjwYPTr1w+9e/eGm5ub3O3jQUFB+Oabb7Bx40a4urqiR48eiI6OFmMlItUgEapabUhERESk4ljRISIiIrXFRIeIiIjUFhMdIiIiUltMdIiIiEhtMdEhIiIitcVEh4iIiNQWEx0iIiJSW0x0iIiISG0x0SEiIiK1xUSHiIiI1BYTHSIiIlJbTHSIiIhIbf0/JmpsuCQ41GsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot.ConfusionMatrix.from_raw_data(y_test, y_pred, normalize=False)" + ] + }, + { + "cell_type": "markdown", + "id": "733c8295-1908-41d6-96d2-ee3ac4278270", + "metadata": {}, + "source": [ + "Additionally we can generate a classification report for our model and compare it with other different models or previous iterations." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "f5cae912-eb8f-4b4e-88f7-1794cfcd9701", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "target_names = [\"No churn\", \"churn\"]\n", + "\n", + "report = plot.ClassificationReport.from_raw_data(\n", + " y_test, y_pred, target_names=target_names\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d2d978b3-5933-44e9-9651-d02c83a5a247", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In conclusion, the integration between Jupysql and MindsDB is a powerful tool for building and deploying predictive models. It allows easy data extraction and manipulation, and makes it simple to deploy models into production. This makes it a valuable tool for data scientists, machine learning engineers, and anyone looking to build predictive models. With this integration, the process of data extraction, cleaning, modeling, and deploying can all be done in one place: your Jupyter notebook. MindsDB on the other hand is making it a more efficient and streamlined process reducing the need for compute." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/pandas.md b/doc/integrations/pandas.md similarity index 100% rename from doc/pandas.md rename to doc/integrations/pandas.md