Files
microwave/notebooks/demo_ppscore.ipynb
2025-02-27 13:46:56 +01:00

819 lines
47 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"c:\\Users\\Edouard\\Documents\\Git\\microwave\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\Edouard\\Documents\\Git\\microwave\\.venv_microwave\\Lib\\site-packages\\IPython\\core\\magics\\osm.py:417: UserWarning: This is now an optional IPython functionality, setting dhist requires you to install the `pickleshare` library.\n",
" self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n"
]
}
],
"source": [
"%cd ..\n",
"import microwave.data_analysis.ppscore as pps\n",
"from sklearn.metrics import mean_squared_error\n",
"from sklearn.tree import DecisionTreeRegressor\n",
"import seaborn as sns\n",
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>E</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D E\n",
"0 0 2 1 0 2\n",
"1 1 0 1 0 0\n",
"2 2 0 1 0 0\n",
"3 0 1 0 0 1\n",
"4 1 0 1 1 0\n",
"5 0 0 2 0 0\n",
"6 0 0 2 1 0\n",
"7 0 1 1 1 1\n",
"8 2 0 1 1 0\n",
"9 2 2 2 0 2\n",
"10 2 0 1 2 0\n",
"11 1 0 1 2 0\n",
"12 2 1 0 2 1\n",
"13 1 2 1 2 2\n",
"14 2 1 0 0 1"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame(np.random.randint(0,3,size=(15, 4)), columns=list('ABCD'))\n",
"df['E'] = df['B']\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ppscore</th>\n",
" <th>case</th>\n",
" <th>metric</th>\n",
" <th>perfect_score</th>\n",
" <th>naive_score</th>\n",
" <th>model_score</th>\n",
" <th>model</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.128681</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.929407</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ppscore case metric perfect_score naive_score \\\n",
"0 0.128681 regression mean_squared_error 0.0 1.066667 \n",
"\n",
" model_score model \n",
"0 0.929407 DecisionTreeRegressor "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pps.score(df['A'], df['B'], metric=mean_squared_error, model=DecisionTreeRegressor())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>x</th>\n",
" <th>ppscore</th>\n",
" <th>case</th>\n",
" <th>metric</th>\n",
" <th>perfect_score</th>\n",
" <th>naive_score</th>\n",
" <th>model_score</th>\n",
" <th>model</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>A</td>\n",
" <td>1.0</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>0.000000</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>B</td>\n",
" <td>0.0</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.211852</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>C</td>\n",
" <td>0.0</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.109609</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>D</td>\n",
" <td>0.0</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>0.866667</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>E</td>\n",
" <td>0.0</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.211852</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" x ppscore case metric perfect_score naive_score \\\n",
"0 A 1.0 regression mean_squared_error 0.0 0.733333 \n",
"1 B 0.0 regression mean_squared_error 0.0 0.733333 \n",
"2 C 0.0 regression mean_squared_error 0.0 0.733333 \n",
"3 D 0.0 regression mean_squared_error 0.0 0.733333 \n",
"4 E 0.0 regression mean_squared_error 0.0 0.733333 \n",
"\n",
" model_score model \n",
"0 0.000000 DecisionTreeRegressor \n",
"1 1.211852 DecisionTreeRegressor \n",
"2 1.109609 DecisionTreeRegressor \n",
"3 0.866667 DecisionTreeRegressor \n",
"4 1.211852 DecisionTreeRegressor "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pps.predictors(df, df['A'], metric=mean_squared_error, model=DecisionTreeRegressor())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>ppscore</th>\n",
" <th>case</th>\n",
" <th>metric</th>\n",
" <th>perfect_score</th>\n",
" <th>naive_score</th>\n",
" <th>model_score</th>\n",
" <th>model</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>B</td>\n",
" <td>E</td>\n",
" <td>1.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.000000</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>E</td>\n",
" <td>B</td>\n",
" <td>1.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.000000</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>A</td>\n",
" <td>B</td>\n",
" <td>0.197917</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.855556</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>A</td>\n",
" <td>E</td>\n",
" <td>0.197917</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.855556</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>E</td>\n",
" <td>C</td>\n",
" <td>0.197279</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.400000</td>\n",
" <td>0.321088</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>B</td>\n",
" <td>C</td>\n",
" <td>0.197279</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.400000</td>\n",
" <td>0.321088</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>D</td>\n",
" <td>B</td>\n",
" <td>0.154167</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.902222</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>D</td>\n",
" <td>E</td>\n",
" <td>0.154167</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.902222</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>C</td>\n",
" <td>B</td>\n",
" <td>0.134706</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.922980</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>C</td>\n",
" <td>E</td>\n",
" <td>0.134706</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>1.066667</td>\n",
" <td>0.922980</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>C</td>\n",
" <td>A</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.219813</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>B</td>\n",
" <td>A</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.210204</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>E</td>\n",
" <td>A</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.210204</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>D</td>\n",
" <td>A</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.200963</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>D</td>\n",
" <td>C</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.400000</td>\n",
" <td>0.549704</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>A</td>\n",
" <td>C</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.400000</td>\n",
" <td>0.550000</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>E</td>\n",
" <td>D</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.107861</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>C</td>\n",
" <td>D</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.070089</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>B</td>\n",
" <td>D</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.107861</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>A</td>\n",
" <td>D</td>\n",
" <td>0.000000</td>\n",
" <td>regression</td>\n",
" <td>mean_squared_error</td>\n",
" <td>0.0</td>\n",
" <td>0.733333</td>\n",
" <td>1.096296</td>\n",
" <td>DecisionTreeRegressor</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" x y ppscore case metric perfect_score \\\n",
"0 B E 1.000000 regression mean_squared_error 0.0 \n",
"1 E B 1.000000 regression mean_squared_error 0.0 \n",
"2 A B 0.197917 regression mean_squared_error 0.0 \n",
"3 A E 0.197917 regression mean_squared_error 0.0 \n",
"4 E C 0.197279 regression mean_squared_error 0.0 \n",
"5 B C 0.197279 regression mean_squared_error 0.0 \n",
"6 D B 0.154167 regression mean_squared_error 0.0 \n",
"7 D E 0.154167 regression mean_squared_error 0.0 \n",
"8 C B 0.134706 regression mean_squared_error 0.0 \n",
"9 C E 0.134706 regression mean_squared_error 0.0 \n",
"10 C A 0.000000 regression mean_squared_error 0.0 \n",
"11 B A 0.000000 regression mean_squared_error 0.0 \n",
"12 E A 0.000000 regression mean_squared_error 0.0 \n",
"13 D A 0.000000 regression mean_squared_error 0.0 \n",
"14 D C 0.000000 regression mean_squared_error 0.0 \n",
"15 A C 0.000000 regression mean_squared_error 0.0 \n",
"16 E D 0.000000 regression mean_squared_error 0.0 \n",
"17 C D 0.000000 regression mean_squared_error 0.0 \n",
"18 B D 0.000000 regression mean_squared_error 0.0 \n",
"19 A D 0.000000 regression mean_squared_error 0.0 \n",
"\n",
" naive_score model_score model \n",
"0 1.066667 0.000000 DecisionTreeRegressor \n",
"1 1.066667 0.000000 DecisionTreeRegressor \n",
"2 1.066667 0.855556 DecisionTreeRegressor \n",
"3 1.066667 0.855556 DecisionTreeRegressor \n",
"4 0.400000 0.321088 DecisionTreeRegressor \n",
"5 0.400000 0.321088 DecisionTreeRegressor \n",
"6 1.066667 0.902222 DecisionTreeRegressor \n",
"7 1.066667 0.902222 DecisionTreeRegressor \n",
"8 1.066667 0.922980 DecisionTreeRegressor \n",
"9 1.066667 0.922980 DecisionTreeRegressor \n",
"10 0.733333 1.219813 DecisionTreeRegressor \n",
"11 0.733333 1.210204 DecisionTreeRegressor \n",
"12 0.733333 1.210204 DecisionTreeRegressor \n",
"13 0.733333 1.200963 DecisionTreeRegressor \n",
"14 0.400000 0.549704 DecisionTreeRegressor \n",
"15 0.400000 0.550000 DecisionTreeRegressor \n",
"16 0.733333 1.107861 DecisionTreeRegressor \n",
"17 0.733333 1.070089 DecisionTreeRegressor \n",
"18 0.733333 1.107861 DecisionTreeRegressor \n",
"19 0.733333 1.096296 DecisionTreeRegressor "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pps_mat = pps.matrix(df, metric=mean_squared_error, model=DecisionTreeRegressor())\n",
"pps_mat"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhcAAAG2CAYAAADMcaSeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQcVJREFUeJzt3Qd4FNX6x/FfaKFJCQkJcFFQFP5K0yBFrIgCUr2giAIRhIsgqERUQkdFFKQoBlCkWOgoHUHKVVB66EKAUKQmIQQIUgJk9//McFlYCJiE2Wx29/u5zzxmzp6ZnZy7G959z3tm/ex2u10AAAAWyWbViQAAAAwEFwAAwFIEFwAAwFIEFwAAwFIEFwAAwFIEFwAAwFIEFwAAwFIEFwAAwFIEFwAAwFIEFwAAwFIEFwAAeKnly5erYcOGKl68uPz8/DRr1qx/PObXX3/VQw89JH9/f5UpU0YTJkxI9/MSXAAA4KXOnDmjSpUqKTIyMk399+3bp/r16+upp57Spk2b9Pbbb6tdu3ZatGhRup7Xjy8uAwDA+/n5+WnmzJlq0qTJTfu8//77mj9/vrZt2+Zoe+mll3Ty5EktXLgwzc9F5gIAAA+RnJyspKQkp81os8qqVatUu3Ztp7Y6deqY7emRw7IrgtfIkauEuy8BADLNpQuHXf4cFxP2WnKegV9+p/79+zu19e3bV/369bPk/LGxsQoODnZqM/aNIObcuXPKkydPms5DcAEAgIeIiIhQeHi4U5tReJnVEFwAAOBqthRLTmMEEq4MJkJCQhQXF+fUZuwXKFAgzVkLA8EFAACuZrfJE9SoUUMLFixwalu8eLHZnh4UdAIA4Go2mzVbOv3999/mklJju7LU1Pj5wIEDjmmW1q1bO/q//vrr2rt3r9577z1FR0dr5MiRmjZtmrp27Zqu5yW4AADAS61fv14PPviguRmMeg3j5z59+pj7R48edQQahtKlS5tLUY1shXF/jCFDhuibb74xV4ykB/e5wA1YLQLAl2TGapELR/605Dy5ij8gT0DNBQAArmbzjJoLqzAtAgAALEXmAgAAV7P7VuaC4AIAAA+5z4WnYFoEAABYiswFAACuZmdaBAAAWMnmW8EF0yIAAMBSZC4AAHAxO9MiAADAUjaCCwAAYCW7bwUX1FwAAABLkbkAAMDVbL51Ey2CCwAAXM3OtAgAAECGkbkAAMDVbL6VuSC4AADA1ey+FVwwLQIAACxF5gIAAFez+VbmguACAAAXs9t9aykq0yIAAMBSZC4AAHA1O9MiAADASjaCCwAAYCW7bwUX1FzArTq+HqaYXav1d9Ierfx9rh6uUvmW/Zs2baBtW38z+2/csET16ta6oU+/vt108K8NOn0qRot+nqIyZUrLGzF2t4fxyzjGDv+E4AJu88ILjfTZ4L768KOherhaXW3esl0L5k9UUFCRVPvXqF5FE7+P1Pjxk1Wlah3NmbNIP84YqwceKOvo8263Tur8Rlt16txdjzzaUGfOntWCeRPl7+8vb8LY3R7GL+MYu9v44jKbBZuH8LPb7XZlUdu2bVP58uXdfRk+J0euEpnyPMYnnnXrN+utt3uZ+35+ftq/d50iR47XoMGRN/SfNHGU8uXNq8bPhzna/lgxV5s2/6k3Onc3941PPsOGf6Whw74y9wsUuENHDm1S23ZdNW3aHHkLxu72MH4Z541jd+nCYZc/x/m10y05T+6qL8gTZLnMxenTp/X111+ratWqqlSpkrsvBy6SM2dOPfRQRS1dtsLRZsS5S5f9rurVQ1M9pnq1UKf+hl8W/+roX7r0nSpWLNg8xxVJSae1du1G81hvwdjdHsYv4xg7eFxwsXz5coWFhalYsWL67LPPVKtWLa1evdrdlwUXCQwMUI4cORQfl+DUHh9/TCHBQakeExISpLj4Y05tcXEJjv4hwUX/13Zdn/gEhYRcfswbMHa3h/HLOMbuNleL2CzYPIRbV4vExsZqwoQJGjt2rJKSkvTiiy8qOTlZs2bN0v3335+mcxj9je1axjydV83VAQA8m91zAgOPzlw0bNhQZcuW1ZYtWzR8+HAdOXJEI0aMSPd5Bg4cqIIFCzptRhuytoSERF26dElFgwOd2osWDVLsdZ9groiNPabgos6fjoKDAx39Y+Pi/9d2XZ+igYqNvfyYN2Dsbg/jl3GMHbJ8cPHzzz/rtddeU//+/VW/fn1lz549Q+eJiIjQqVOnnDajDVnbxYsXtWHDFtV66lFHm1EYZuyvXh2V6jGr10SpVq2r/Q21n37c0X/fvgM6ejTO6Zx33JFfVas+aB7rLRi728P4ZRxjdxtsTItkit9//92cDgkNDdX//d//qVWrVnrppZfSfR6mQDzXsM/HaPzYYYrasEXr1m3Um13aK1++PJrw7VTz8fHjPteRI0fVs9cn5v6IEWO1bOkMdX27gxb8vETNX2ys0NCKer3Te45zfjHiG/WIeFO7Y/Zq//6D6t/vXR05EqfZsxfJmzB2t4fxyzjGLoNsnhMYeHRwUb16dXMzpkSmTp2qcePGKTw8XDabTYsXL1bJkiV1xx13uOvykAmmT5+joMAA9evTzSz62rz5T9Vv0FLx8ZeLxe4sWdx8PVyxavV6tWzdWR/0f08fffi+dsfsU9Nmr+nPP3c6+gz+bKTy5cur0SMHqVChAvrjj3Wq37DlDXU5no6xuz2MX8YxdvC4+1zs3LnTzGZ8//33OnnypJ555hnNmeM968M9RWbd5wIAsoLMuM/FueUTLDlPnsdflSfIMktRDUaB56BBg3To0CFNnjzZ3ZcDAIA1bL5Vc5GlMhfIGshcAPAlmZK5+O83lpwnz1Pt5AmyVOYCAAB4Pr5yHQAAV7N5zpSGFQguAABwNbtvBRdMiwAAAEuRuQAAwNVsvpW5ILgAAMDV7L4VXDAtAgAALEXmAgAAV7P5VuaC4AIAAFez+VZwwbQIAACwFJkLAABcze5bmQuCCwAAXM1GcAEAAKxk963ggpoLAABgKTIXAAC4ms23MhcEFwAAuJrdt4ILpkUAAIClyFwAAOBqNt/KXBBcAADgajbfCi6YFgEAAJYicwEAgKvZ7fIlBBcAALiajWkRAACADCNzAQCAq9l8K3NBcAEAgKvZCS4AAICVbL4VXFBzAQCAF4uMjFSpUqWUO3duVatWTWvXrr1l/+HDh6ts2bLKkyePSpYsqa5du+r8+fPpek6CCwAAMmMpqt2CLZ2mTp2q8PBw9e3bVxs2bFClSpVUp04dxcfHp9p/0qRJ6t69u9l/x44dGjt2rHmOHj16pOt5CS4AAMiMaRGbBVs6DR06VO3bt1ebNm10//33a/To0cqbN6/GjRuXav+VK1eqZs2aevnll81sx7PPPqsWLVr8Y7bjegQXAAB4iOTkZCUlJTltRltqLly4oKioKNWuXdvRli1bNnN/1apVqR7zyCOPmMdcCSb27t2rBQsW6LnnnkvXdXplQWeDO+u7+xI82qULh919CR6rSrHH3H0JHss/W053X4JH+3XzN+6+BGRCQefAgQPVv39/pzZjCqNfv3439E1ISFBKSoqCg4Od2o396OjoVM9vZCyM4x599FHZ7XZdunRJr7/+OtMiAABkyaWo9tvfIiIidOrUKafNaLPKr7/+qo8//lgjR440azR++uknzZ8/Xx9++GG6zuOVmQsAALyRv7+/uaVFYGCgsmfPrri4OKd2Yz8kJCTVY3r37q1WrVqpXbt25n6FChV05swZ/ec//1HPnj3NaZW0IHMBAICL2W12S7b0yJUrl0JDQ7V06VJHm81mM/dr1KiR6jFnz569IYAwAhTzd0jHahUyFwAAeOlNtMLDwxUWFqYqVaqoatWq5j0sjEyEsXrE0Lp1a5UoUcKs5TA0bNjQXGHy4IMPmvfEiImJMbMZRvuVICMtCC4AAPBSzZs317Fjx9SnTx/FxsaqcuXKWrhwoaPI88CBA06Zil69esnPz8/87+HDhxUUFGQGFgMGDEjX8/rZ05Pn8BCsFrk98w7Md/cleCxWi2Qcq0VuD6tFMi5n4N0uf46zo7pYcp68HUfIE5C5AADA1Wxe9zn+lgguAABwNRtfXAYAAJBhZC4AAHA1m29lLgguAABwNbtv1VwwLQIAACxF5gIAAFezMS0CAACsZGNaBAAAIMPIXAAA4Gp2pkUAAICVbEyLAAAAZBiZCwAAXMzOahEAAGApm29NixBcAADganbfylxQcwEAACxF5gIAAFezMS0CAACsZGNaBAAAIMPIXAAA4Go2pkUAAICV7EyLAAAAZBiZCwAAXM3GtAgAALCQ3cdWixBcWKB+6/r6d4emKhxUWPt27NNXfUZr1+Zdqfat06KOajWtpbvKljL3Y7bG6LtPv72h/yvhLVXn5TrKVyCfdqzfoZE9InVk/5FM+X3gGV549Xm16tRCRYICtHv7Hg3uOVx/btqRat+77yul1997TeUqllXxksU0pM8XmjxmulOfpq2bqFlYExUrGWLu7925T98Mm6CVy9bIG/07rLFe7thcAUEBitm+R8N6j9COTdGp9i19Xym16/aqyla8zxyfz/tGato3Pzr1aRseptfeCXNq+yvmgF5+4lV5k/Wbtmr8pBnaHh2jY8cT9fnA3nr68UdueczaDVs0eMTXitn3l0KKBqlDWAs1qf+MU5/JP841z5uQeEJly9ytHl07qsL9ZV3828BVqLm4TY81fEzterfX5OGT9Fb9N83g4oMfPlTBIgVT7V+hegX9Nnu5IppHqFuTd3TsyDGzf5HgIo4+TTs2U8M2DRUZEal3GoXr/NnzZp+c/jkz8TdDVvZMo1rq2q+zxgyZoJZ12mnX9hiNmDxEhYsUSrV/7jy5deivo/pywFdKiDueap/4o/H6csBotarTTq3rttf6PzZoyPiBZmDibZ5u9KS69O2ocUO/U9u6HczgYujET1XoJuPnn8dfRw4c1aiPx9x0/Ax7o/epYeWmjq1jkzflbc6dO2/+49/znU5p6n/oSKzeeLePqj5USTMmRKrVi03U99Ph+mNNlKPPz0t+06ARX6tj21c0fdwIlS1TWh3Ce+n4iZPyqmkRmwWbhyC4uE1N2j2vRZMXasn0JTq4+6AiI75U8rnzeqb5s6n2/+ytz7Tg+/nat32vDu05pBHvfaFs2bKp0qOVHH0av9ZYU0dM1ZrFq7U/er+Gdh2igKIBqvFsjUz8zZCVvdKhuWZNnKu5Uxdo3679GvjeZzp/7rwataifav/tm6P1xYcj9cvspbpw4UKqfVYsXqk/lq3WwX2HdGDvQY38ZIzOnjmnCqEPyNs0b/+C5k5aoAXTFmr/7r80uPswJZ9LVoOX6qXaP3rzTkV+9JWWzvmvLl64eNPzpqSkKPHYCcd26kSSvM1jNR7Wm/8JU+0naqap/7RZ81WiWIje7dJe95S6Uy83a6RnnnxU302d6ehj/NysYT09X/9Z3VP6LvV5t4ty+/tr5rxf5DVsBBdIoxw5c6hMhTLa9PsmR5vdbjf3yz1ULk3nMD4RZc+ZXadPnjb3g+8MMQOJa8959vRZ7dy0U+VC03ZOeP/rrlzF+7RmRZTT627tivWqaFEgYAS8zzZ+Wnny5taWqD/lbeNnTG+su2781v8epfKh99/Wuf9VuoRmR03TtJU/qO+IHgouXlS+bvO2aFWvUtmprWa1UG3ednkK7+LFi9q+c7eqP1zZ6fVnHHOlj9csRbVbsHmILFFzcfz4cRUpcnla4ODBgxozZozOnTunRo0a6bHHHlNWVSCggLLnyK6TCc6pO2P/X/eUTNM5Xo1oo8S4REcwYdRtXD7HiRvOWeh/j8G3FQooqBw5cijxWKJTu/FJuVSZu27r3PeUu1vj541SLv9cOnfmnN5t29PMjHjf+GVX4nXvMWP87rznzgyfd/vGHRrQdZAO7DmoIkUDzBqMkTM/V6tabc0MkK8yaiiKBDj/7SpSuJD+PnNW55OTlZT0t1JSbDf2CSisfQcOZfLVwiuCi61bt6phw4ZmQHHvvfdqypQpqlu3rs6cOWNGrsOGDdOMGTPUpEmTm54jOTnZ3K6VYk9Rdr/syuqadXpBjzd6XBEvdtfF5JunWoHM8teeA3q5dlvlL5BPTzd4Sv2+6Kn//LuL1wUYrrD6v2sdP+/ZsdcMNn5cM1m1Gj6peVN+duu1IQuwec6UhsdPi7z33nuqUKGCli9frieffFINGjRQ/fr1derUKZ04cUIdOnTQJ598cstzDBw4UAULFnTa9iTtyZTrT0pMUsqlFBUKdC4CM/ZPHHP+VHS95//zbzXr2Ey9W/Yy6yquuHJcocDCN5zz5D+cE77hZOIpXbp0yVzlcK2AoMI6Hn/zYsO0uHTxkg7tP6zoLbsU+fFX2vVnjFq0aybvG78UBVz3HjPG7/ps0O34O+mMDu49pH+VKiFfFhhQWMcTnf92GYWa+fPlNesqChcqoOzZs93YJ/GEeay3sNvslmyewq3Bxbp16zRgwADVrFlTn332mY4cOaJOnTqZWQtj69Kli6KjU18adkVERIQZjFy73VPgnky5fuMPsbGUtFLNq3OFfn5+5n70hptfd9PXm+qlN19S39Z9FLMlxumxuAOxSoxPVOWaVws88+TPo7KVyyo66tZjAd9gvO6Mf/yrPhrq9Lp7+NFQy+sjsmXzU85cueRt47dzyy5VefQhp/ELffQhbYvabtnzGPUqJe4qroTbDPg8XaXy5bQmarNT26p1G1Wp/P+ZP+fMmVP3l71Xa9ZfrTOz2WxaE7XJ0Qeex63TIomJiQoJubymPn/+/MqXL58KF74aqRo/nz59udDxZvz9/c3tWpk5JTLrm5nqOiRcu7fu1q5Nu8yVHrnz5taSaYvNx8OHhet47HF9++m3jmWmLcNbavCbgxR3KN5RR3H+zDlzyalh9tjZav7mSzq8/4gZbLTs1soMOFb9sirTfi9kbRO/mqp+n/cwV4EY97Z4uf0LypM3j+ZOWWA+3v+LnoqPTTCzD1eKGK8sKTX+mAeFBOm+B8qYtQBGpsLwRo8OWrlstWIPxSlv/ryq++9nFPrIg+rS4h15m6ljpqvnsO6K3rJT2zdG68X2Tc3luvOnLjQf7/V5dyUcTdDoT75xjF/p+y7Xs+TMmUNBIYG694F7zPEz3qeGN3q/rj8WrzTHLzAkUO3eCVOKzaYls5bJm5w9e04HDl29587hI3GK3rVHBQvcoWIhRTVs1HjFJxzXwN7dzMdfbFLfvIfFkMixer7Bs1obtVmLli3XyMEfOM7Ruvnz6jlgiB4od6/K319WP0ybpXPnk2+4F4ZHs3lO1sErCjqNTwy32s/qVsxdoYIBBc2AwSjG3Lt9r/q06uMo8gwqHiTbNS+q51o+Z96vosdXPZ3OM2nYRE0aNsn8+cdRM8w/dF0GdjFvorV9/Xb1adWbugw4LJ6zzLynhXFjLOMmWsb0RZeXuzmKFENKBDu97oKCAzVpyXjHfutOLcwtauVGdWh6+V4MAUUKmUFJYNEi+vv0GfPGXEZgsWb5enmbpXN+VaGAQmrXrY05HbL7zz16p+X7OvG/8TNWeVx7R8XA4CKa8MsYx75x8y1j27Byk7q8EG62FS0WqP6RvVSgcAFz6mXL2q3q0LCz+bM32Ra9W227vO/YN+5PYWhcr7YG9HpHCccTdTQu3vH4v4qHKHLwBxr0xVf6YfosBQcFqv/7b5srRq6oV/sJnTh5Sl9+84MSEhNV7t57NHrIh141LSIfu0Onn91Yg+UmxtRHvXr1HJmHuXPnqlatWmYGw2AUai5cuNBcO54eDe5Mfa0/0mbegfnuvgSPVaVY1l3dlNX5Z+Mmcbfj182XsyxIv5yBd7v8OU53fs6S89zx5eXsZFbn1sxFWJjzrXJbtmx5Q5/WrVtn4hUBAOACNqZFMs348VfTtAAAeC2bbwUX3KETAAB4V0EnAADezu6+8ka3ILgAAMDVbAQXAADASjbfCi6ouQAAAJYicwEAgIvZfSxzQXABAICr2XwruGBaBAAAWIrMBQAArmaTTyG4AADAxexMiwAAAGQcmQsAAFzN5luZC4ILAABczSafwrQIAACwFJkLAABczM60CAAAsJRNPoXgAgAAF7P7WOaCmgsAAGApMhcAALiaTT6F4AIAABez+1hwwbQIAACwFJkLAABczSafQnABAICL2X0suGBaBAAAWIrMBQAArmaTTyG4AADAxew+FlwwLQIAQCYEF3YLtoyIjIxUqVKllDt3blWrVk1r1669Zf+TJ0/qjTfeULFixeTv76/77rtPCxYsSNdzkrkAAMBLTZ06VeHh4Ro9erQZWAwfPlx16tTRzp07VbRo0Rv6X7hwQc8884z52IwZM1SiRAn99ddfKlSoULqel+ACAAAvnRYZOnSo2rdvrzZt2pj7RpAxf/58jRs3Tt27d7+hv9GemJiolStXKmfOnGabkfVIL6ZFAABwNbufJVtycrKSkpKcNqMtNUYWIioqSrVr13a0ZcuWzdxftWpVqsfMmTNHNWrUMKdFgoODVb58eX388cdKSUlJ16/rlZmLhbGb3H0JHq3BnfXdfQkea/3RFe6+BI+VI1cJd1+CR3v+oS7uvgSPNe/AfHmKgQMHqn///k5tffv2Vb9+/W7om5CQYAYFRpBwLWM/Ojo61fPv3btXy5Yt0yuvvGLWWcTExKhTp066ePGi+Tw+HVwAAOCN0yIRERFmDcW1jKJLq9hsNrPe4uuvv1b27NkVGhqqw4cPa/DgwQQXAABkJXabnyXnMQKJtAYTgYGBZoAQFxfn1G7sh4SEpHqMsULEqLUwjrvi//7v/xQbG2tOs+TKlStNz03NBQAAXihXrlxm5mHp0qVOmQlj36irSE3NmjXNqRCj3xW7du0yg460BhYGggsAALz0Phfh4eEaM2aMvv32W+3YsUMdO3bUmTNnHKtHWrdubU61XGE8bqwWeeutt8ygwlhZYhR0GgWe6cG0CAAALmY3Vnu4QfPmzXXs2DH16dPHnNqoXLmyFi5c6CjyPHDggLmC5IqSJUtq0aJF6tq1qypWrGje58IINN5///10Pa+f3W63y8tQdX576oZUdvcleCxPqjrPanjf3h7et1n7fXu4Ri1LzlNi1TJ5AjIXAAC4mN3HvluE4AIAAA9ZLeIpCC4AAHAxu9cVINwaq0UAAIClyFwAAOBidqZFAACAlew+FlwwLQIAACxF5gIAABez+1hBJ8EFAAAuZmdaBAAAIOPIXAAA4KXfLeIuBBcAALiY3cdu/820CAAAsBSZCwAAXMzGtAgAALCSneACAABYyc5SVAAAgIwjcwEAgIvZuUMnAACwkp1pEQAAgIwjcwEAgIvZWC0CAACsZPex4IJpEQAAYCkyFwAAuJjdx1aLkLmwQMfXwxSza7X+Ttqjlb/P1cNVKt+yf9OmDbRt629m/40blqhe3Vo39OnXt5sO/rVBp0/FaNHPU1SmTGl5o/qt62vsH+P0066ZGjJ7qO6rdN9N+9ZpUUefzvhUU7ZONbePJg1Itf8r4S313frv9eOun8w+xUsVd/FvAU/E+zbjeN9mrObCZsHmKQgubtMLLzTSZ4P76sOPhurhanW1ect2LZg/UUFBRVLtX6N6FU38PlLjx09Wlap1NGfOIv04Y6weeKCso8+73Tqp8xtt1alzdz3yaEOdOXtWC+ZNlL+/v7zJYw0fU7ve7TV5+CS9Vf9N7duxTx/88KEKFimYav8K1Svot9nLFdE8Qt2avKNjR46Z/YsEXx3rph2bqWGbhoqMiNQ7jcJ1/ux5s09O/5yZ+Jshq+N9m3G8b5EWfna79yVrcuQqkWnPZXziWbd+s956u5e57+fnp/171yly5HgNGhx5Q/9JE0cpX968avx8mKPtjxVztWnzn3qjc3dz3/jkM2z4Vxo67Ctzv0CBO3Tk0Ca1bddV06bNcfnvVDfk1p/grGJ84tm9eZdG9xntGLsJayZo7oR5mjFy+j8eny1bNvOT0Og+o7Tsx2Vmm/HJZ+bXMzXz65/M/bx35NUPURM1/J1hWj53uYt/I2negfkufw5vxfv29vC+zdrv2413NrbkPA8emC2vzFyEhYVp+fLb/z972bJluv/++5WUlHTDY6dOndIDDzygFStWKCvLmTOnHnqoopYuu3qdRqy2dNnvql49NNVjqlcLdepv+GXxr47+pUvfqWLFgs1zXJGUdFpr1240j/UWOXLmUJkKZbTp901OY2fsl3uoXJrO4Z/HX9lzZtfpk6fN/eA7QxRQNMDpnGdPn9XOTTtVLjRt54T3432bcbxvM85ut2bzFOkOLox/+GvXrq17771XH3/8sQ4fPpyhJx4+fLjat2+vAgUK3PBYwYIF1aFDBw0dOlRZWWBggHLkyKH4uASn9vj4YwoJDkr1mJCQIMXFH3Nqi4tLcPQPCS76v7br+sQnKCTk8mPeoEBAAWXPkV0nE046tRv7hYMKp+kcr0a0UWJcouOP0pXjTiacuOGchdJ4Tng/3rcZx/s242zUXNzarFmzzICiY8eOmjp1qkqVKqV69eppxowZunjxYprPs3nzZtWtW/emjz/77LOKior6x/MkJyeb2Y9rNy+c6cF1mnV6QY83elwD2n+ki8lpf90BcB/et74jQwWdQUFBCg8PNwOENWvWqEyZMmrVqpWKFy+url27avfu3f94jri4ODM9eTPGJ4tjx5w/BaRm4MCBZqbj2s1uu5xuc7WEhERdunRJRYMDndqLFg1S7HWfYK6IjT2m4KLOn46CgwMd/WPj4v/Xdl2fooGKjb38mDdISkxSyqUUFQos5NRu7J845vwJ5nrP/+ffataxmXq37KX90fsd7VeOKxRY+IZznvyHc8J38L7NON63t3cTLbsFm0+sFjl69KgWL15sbtmzZ9dzzz2nrVu3mrUUw4YNu+WxJUqU0LZt2276+JYtW1SsWLF/vIaIiAhzqubazS/bHcoMRqZmw4YtqvXUo442o7jJ2F+9OvWsy+o1UapV62p/Q+2nH3f037fvgI4ejXM65x135FfVqg+ax3qLSxcvKWZrjCrVrOw0dsZ+9Ibomx7X9PWmeunNl9S3dR/FbIlxeizuQKwS4xNVuWYlR1ue/HlUtnJZRUfd/JzwLbxvM473bcbZfGxaJEdG3phz5szR+PHj9csvv6hixYp6++239fLLLzvqJ2bOnKm2bduaWYybMQKR3r17m1MjuXPndnrs3Llz6tu3rxo0aPCP12Ms87p+qZfxYs8swz4fo/FjhylqwxatW7dRb3Zpr3z58mjCt1PNx8eP+1xHjhxVz16fmPsjRozVsqUz1PXtDlrw8xI1f7GxQkMr6vVO7znO+cWIb9Qj4k3tjtmr/fsPqn+/d3XkSJxmz14kbzLrm5nqOiRcu7fu1q5Nu9T4tcbKnTe3lkxbbD4ePixcx2OP69tPv3UsV2sZ3lKD3xykuEPxjvnY82fOmUvXDLPHzlbzN1/S4f1HzD9aLbu1Mv9wrfpllRt/U2Q1vG8zjvctXBJcGNkEm82mFi1aaO3atapc+cblT0899ZQKFXJOm12vV69e+umnn3Tfffepc+fOKlv28nrx6OhoRUZGKiUlRT179lRWN336HAUFBqhfn25m0dfmzX+qfoOWio+/XCx2Z8ni5nhdsWr1erVs3Vkf9H9PH334vnbH7FPTZq/pzz93OvoM/myk8uXLq9EjB6lQoQL64491qt+wpVlf4k1WzF2hggEFzT88RlHX3u171adVH0exWFDxINlsV+tnnmv5nLnuvcdXzq+LScMmatKwSebPP46aodx5cqvLwC7KVyCftq/frj6tejO/Cye8bzOO923G2OVb0n2fi++//14vvPDCDdmGjPjrr7/MwtBFixY5ijCNrEOdOnXMAKN06dJZfr28N8qs9fLeiPtcZBzv29vD+zZrv29XFmtqyXkeOfqjvDJzYRRuWuWuu+7SggULdOLECcXExJgBhrHEtXBh71l+BACAr8kSX1xmBBMPP/ywuy8DAACXsHtQMabXBBcAAHgzm3wLX1wGAAAsReYCAAAXs4tpEQAAYCGbj61FJbgAAMDFbD6WuaDmAgAAWIrMBQAALmb3scwFwQUAAC5mk29hWgQAAFiKzAUAAC5mZ1oEAABYySbfwrQIAACwFJkLAABczCbfQnABAICL2X2s5oJpEQAAYCkyFwAAuJjNtxIXBBcAALiazcemRQguAABwMbt8CzUXAADAUmQuAABwMZt8C8EFAAAuZvPzrZoLpkUAAIClyFwAAOBidvkWggsAAFzMJt/CtAgAALAUmQsAAFzM5lv1nGQuAADIjDt02izYMiIyMlKlSpVS7ty5Va1aNa1duzZNx02ZMkV+fn5q0qRJup+T4AIAAC81depUhYeHq2/fvtqwYYMqVaqkOnXqKD4+/pbH7d+/X926ddNjjz2WoecluAAAIBNWi9gt2NJr6NChat++vdq0aaP7779fo0ePVt68eTVu3LibHpOSkqJXXnlF/fv31913352h35fgAgCATKi5sFmwJScnKykpyWkz2lJz4cIFRUVFqXbt2o62bNmymfurVq266bV+8MEHKlq0qF577bUM/74UdOIGC2M3ufsSPFaOXCXcfQke69KFw+6+BI/Ga883lqIOHDjQzChcy5jy6Nev3w19ExISzCxEcHCwU7uxHx0dner5f//9d40dO1abNt3evwMEFwAAeIiIiAizhuJa/v7+lpz79OnTatWqlcaMGaPAwMDbOhfBBQAAHnKHTn9//zQHE0aAkD17dsXFxTm1G/shISE39N+zZ49ZyNmwYUNHm812OeeSI0cO7dy5U/fcc0+anpuaCwAAPKTmIj1y5cql0NBQLV261ClYMPZr1KhxQ/9y5cpp69at5pTIla1Ro0Z66qmnzJ9LliyZ5ucmcwEAgJcKDw9XWFiYqlSpoqpVq2r48OE6c+aMuXrE0Lp1a5UoUcKs5TDug1G+fHmn4wsVKmT+9/r2f0JwAQCAl363SPPmzXXs2DH16dNHsbGxqly5shYuXOgo8jxw4IC5gsRqfna73eu+rI2qacDzsFrk9vB3L2u/9r76V0tLztPh0A/yBNRcAAAASzEtAgCAi9l97IvLCC4AAPDSmgt3YVoEAABYiswFAAAuZpNvIbgAAMDF7PItBBcAALiYzccKOqm5AAAAliJzAQCAi9nkWwguAABwMZt8C9MiAADAUmQuAABwMbt8C8EFAAAuZmO1CAAAQMaRuQAAwMVs8i0EFwAAuJhdvoVpEQAAYCkyFwAAuJjNx3IXBBcAALiYTb6F4AIAABezy7dQcwEAACxF5gIAABezybcQXAAA4GI27tAJAACQcQQXFuj4ephidq3W30l7tPL3uXq4SuVb9m/atIG2bf3N7L9xwxLVq1vrhj79+nbTwb826PSpGC36eYrKlCktb8TYZRxjB3fhtZexpag2CzZPQXBxm154oZE+G9xXH340VA9Xq6vNW7ZrwfyJCgoqkmr/GtWraOL3kRo/frKqVK2jOXMW6ccZY/XAA2Udfd7t1kmd32irTp2765FHG+rM2bNaMG+i/P395U0Yu4xj7OAuvPYyxm7R5in87Ha7J11vmuTIVSLTnsuI2tet36y33u5l7vv5+Wn/3nWKHDlegwZH3tB/0sRRypc3rxo/H+Zo+2PFXG3a/Kfe6Nzd3Dei92HDv9LQYV+Z+wUK3KEjhzapbbuumjZtjrwFY5dx3jh2ly4cdvlzeLPM+rvHay9jepZ62ZLzDNg/SZ6AzMVtyJkzpx56qKKWLlvhaDNitaXLflf16qGpHlO9WqhTf8Mvi3919C9d+k4VKxZsnuOKpKTTWrt2o3mst2DsMo6xg7vw2ru91SI2CzZP4fbgwmazady4cWrQoIHKly+vChUqqFGjRvruu+/MF21WFhgYoBw5cig+LsGpPT7+mEKCg1I9JiQkSHHxx5za4uISHP1Dgov+r+26PvEJCgm5/Jg3YOwyjrGDu/Dayzibj9VcuHUpqhE8GIHEggULVKlSJTOwMNp27NihV199VT/99JNmzZp1y3MkJyeb2/XnNVJ1AADAxzIXEyZM0PLly7V06VJt3LhRkydP1pQpU7R582YtWbJEy5YtMzMYtzJw4EAVLFjQabPbTmfK9SckJOrSpUsqGhzo1F60aJBir4vCr4iNPabgos4RfnBwoKN/bFz8/9qu61M0ULGxlx/zBoxdxjF2cBdeexln97GCTrcGF0Yw0aNHDz311FM3PFarVi11795dEydOvOU5IiIidOrUKafNL9sdygwXL17Uhg1bVOupRx1tRsbE2F+9OirVY1aviVKtWlf7G2o//bij/759B3T0aJzTOe+4I7+qVn3QPNZbMHYZx9jBXXjtZZzNx2ou3DotsmXLFg0aNOimj9erV09ffPHFLc9hLFW6frlSZk6JDPt8jMaPHaaoDVu0bt1GvdmlvfLly6MJ3041Hx8/7nMdOXJUPXt9Yu6PGDFWy5bOUNe3O2jBz0vU/MXGCg2tqNc7vec45xcjvlGPiDe1O2av9u8/qP793tWRI3GaPXuRvAljl3GMHdyF117G2Dwq7+DhwUViYqKCg4Nv+rjx2IkTJ5SVTZ8+R0GBAerXp5tZuLR585+q36Cl4uMvFzzdWbK4WbR6xarV69WydWd90P89ffTh+9ods09Nm72mP//c6egz+LORypcvr0aPHKRChQrojz/WqX7DljfUlng6xi7jGDu4C689ZPn7XGTPnl2xsbEKCkq9yjguLk7FixdXSkpKlr3PBQBrcJ+L28Pfvaz92uta6iVLzjNs/xR5ArevFjFWhdzsLmxErQAAb2CTb3FrcBEWdvWObTfTunXrTLkWAADgBcHF+PHj3fn0AABkCjsFnQAAwEo2+Ra33/4bAAB4FzIXAAC4mI1pEQAAYCW7fAvTIgAAwFJkLgAAcDGbj+UuCC4AAHAxm3wLwQUAAC5m97HMBTUXAADAUmQuAABwMZt8C8EFAAAuZmdaBAAAIOPIXAAA4GI2+RaCCwAAXMxmZ1oEAAAgw8hcAADgYnb5FoILAABczOZj4QXTIgAAwFJkLgAAcDG7j2UuCC4AAHAxm3wLwQUAAC5m87HMBTUXAADAUmQuAABwMbuPZS4ILgAAcDGbfAvTIgAAwFIEFwAAuJjdbrdky4jIyEiVKlVKuXPnVrVq1bR27dqb9h0zZowee+wxFS5c2Nxq1659y/43Q3ABAEAmrBaxWbCl19SpUxUeHq6+fftqw4YNqlSpkurUqaP4+PhU+//6669q0aKF/vvf/2rVqlUqWbKknn32WR0+fDhdz+tnz2golIXlyFXC3ZcAIJ0uXUjfHy844+9e1n7tNb6zgSXnmX1gXrr6G5mKhx9+WF9++aW5b7PZzIChS5cu6t69+z8en5KSYmYwjONbt26d5ueloBMAAA8p6ExOTja3a/n7+5vb9S5cuKCoqChFREQ42rJly2ZOdRhZibQ4e/asLl68qICAgHRdp1cGF3VDKrv7EjzazA0j3H0JHqtGhTB3X4LHqlmilrsvwaOR+fGNpagDBw5U//79ndqMKY9+/frd0DchIcHMPAQHBzu1G/vR0dFper73339fxYsXNwMS+XpwAQCAN4qIiDBrKK6VWtbCCp988ommTJli1mEYxaDpQXABAICH3P7b/yZTIKkJDAxU9uzZFRcX59Ru7IeEhNzy2M8++8wMLpYsWaKKFSum+zpZLQIAgBcuRc2VK5dCQ0O1dOlSR5tR0Gns16hR46bHDRo0SB9++KEWLlyoKlWqZOj3JXMBAICX3qEzPDxcYWFhZpBQtWpVDR8+XGfOnFGbNm3Mx40VICVKlDBrOQyffvqp+vTpo0mTJpn3xoiNjTXb8+fPb25pRXABAICXat68uY4dO2YGDEagULlyZTMjcaXI88CBA+YKkitGjRplrjJp1qxZmopGb4bgAgAAL/7iss6dO5tbaoxizWvt37/fkuckuAAAwEMKOj0FBZ0AAMBSZC4AAHAxu/d908YtEVwAAOBiNqZFAAAAMo7MBQAAXrxaxB0ILgAAcDGbj9VcMC0CAAAsReYCAAAXs8u3EFwAAOBiNh8LLwguAABwMZuPBRfUXAAAAEuRuQAAwMXsPrZahOACAAAXszEtAgAAkHFkLgAAcDG7j2UuCC4AAHAxu4/VXDAtAgAALEXmAgAAF7MxLQIAAKxkZ1oEAAAg48hcAADgYjamRQAAgJXsBBcAAMBKNh+ruSC4sED91vX17w5NVTiosPbt2Kev+ozWrs27Uu1bp0Ud1WpaS3eVLWXux2yN0XeffntD/1fCW6rOy3WUr0A+7Vi/QyN7ROrI/iPyJus3bdX4STO0PTpGx44n6vOBvfX044/c8pi1G7Zo8IivFbPvL4UUDVKHsBZqUv8Zpz6Tf5xrnjch8YTKlrlbPbp2VIX7y8rbvPDq82rVqYWKBAVo9/Y9GtxzuP7ctCPVvnffV0qvv/eaylUsq+Ili2lIny80ecx0pz5NWzdRs7AmKlYyxNzfu3Ofvhk2QSuXrZE3+ndYY73csbkCggIUs32PhvUeoR2bolPtW/q+UmrX7VWVrXifOT6f943UtG9+dOrTNjxMr70T5tT2V8wBvfzEqy79PYCsiILO2/RYw8fUrnd7TR4+SW/Vf9MMLj744UMVLFIw1f4VqlfQb7OXK6J5hLo1eUfHjhwz+xcJLuLo07RjMzVs01CREZF6p1G4zp89b/bJ6Z9T3uTcufPmP/493+mUpv6HjsTqjXf7qOpDlTRjQqRavdhEfT8drj/WRDn6/LzkNw0a8bU6tn1F08eNUNkypdUhvJeOnzgpb/JMo1rq2q+zxgyZoJZ12mnX9hiNmDxEhYsUSrV/7jy5deivo/pywFdKiDueap/4o/H6csBotarTTq3rttf6PzZoyPiBZmDibZ5u9KS69O2ocUO/U9u6HczgYujET1XoJuPnn8dfRw4c1aiPx9x0/Ax7o/epYeWmjq1jkzdd+FvA06ZF7Bb8z1MQXNymJu2e16LJC7Vk+hId3H1QkRFfKvnceT3T/NlU+3/21mda8P187du+V4f2HNKI975QtmzZVOnRSo4+jV9rrKkjpmrN4tXaH71fQ7sOUUDRANV4toa8yWM1Htab/wlT7Sdqpqn/tFnzVaJYiN7t0l73lLpTLzdrpGeefFTfTZ3p6GP83KxhPT1f/1ndU/ou9Xm3i3L7+2vmvF/kTV7p0FyzJs7V3KkLtG/Xfg187zOdP3dejVrUT7X/9s3R+uLDkfpl9lJduHAh1T4rFq/UH8tW6+C+Qzqw96BGfjJGZ8+cU4XQB+Rtmrd/QXMnLdCCaQu1f/dfGtx9mJLPJavBS/VS7R+9eaciP/pKS+f8VxcvXLzpeVNSUpR47IRjO3UiyYW/BTxtWsRmweYpCC5uQ46cOVSmQhlt+n2T01pmY7/cQ+XSdA7jE1H2nNl1+uRpcz/4zhAzkLj2nGdPn9XOTTtVLjRt5/RWm7dFq3qVyk5tNauFavO2y1MBFy9e1Padu1X94at9jMDNOOZKH2953ZWreJ/WrIhyet2tXbFeFS0KBIxxe7bx08qTN7e2RP0pb2KMnzG9se668Vv/e5TKh95/W+f+V+kSmh01TdNW/qC+I3oouHhRC64Y8DzUXNyGAgEFlD1Hdp1McE65G/v/uqdkms7xakQbJcYlOoIJo27j8jlO3HDOQv97zFcZNRRFApzHoEjhQvr7zFmdT05WUtLfSkmx3dgnoLD2HTgkb1EooKBy5MihxGOJTu3GJ+VSZe66rXPfU+5ujZ83Srn8c+ncmXN6t21PMzPiTS6PX3YlXvceM8bvznvuzPB5t2/coQFdB+nAnoMqUjTArMEYOfNztarV1swAwbfZPWhKw+MzF88995xOnTrl2P/kk0908uTVf6iPHz+u+++/9SeJZPMflSSnLcWeIk/QrNMLerzR4xrQ/iNdTL55qhXILH/tOaCXa7fVq/U7aMZ3s9Xvi55mMSP+2er/rtV/5/2mPTv2au1v69WtVXflL5BPtRo+6e5LQxZgY1ok8yxatMgMDq74+OOPlZh49dPYpUuXtHPnzlueY+DAgSpYsKDTtidpjzJDUmKSUi6lqFCgcxGYsX/imPOnous9/59/q1nHZurdspdZV3HFleMKBRa+4Zwn/+Gc3i4woLCOJzqPgVGomT9fXrOuonChAsqePduNfRJPmMd6i5OJp8z3hrHK4VoBQYV1PP7mxYZpceniJR3af1jRW3Yp8uOvtOvPGLVo10ze5PL4pSjguveYMX7XZ4Nux99JZ3Rw7yH9q1QJy84JeIpsWele6xm593pERISZ/bh2u6fAPcoMxh9iYylppZpX5/j9/PzM/egNqS9pMzR9valeevMl9W3dRzFbYpweizsQq8T4RFWuebXAM0/+PCpbuayio25+Tl9QqXw5rYna7NS2at1GVSr/f+bPOXPm1P1l79Wa9VfrVWw2m9ZEbXL08QbG6874x7/qo6FOr7uHHw21vD4iWzY/5cyVS97EGL+dW3apyqMPOY1f6KMPaVvUdsuex6hXKXFXcSXcZsAH72D3sdUiHl9z4e/vb27Xyu6XPdOef9Y3M9V1SLh2b92tXZt2mSs9cufNrSXTFpuPhw8L1/HY4/r2028dy0xbhrfU4DcHKe5QvKOO4vyZc+aSU8PssbPV/M2XdHj/ETPYaNmtlRlwrPpllbzJ2bPndODQ1Xt3HD4Sp+hde1SwwB0qFlJUw0aNV3zCcQ3s3c18/MUm9c17WAyJHKvnGzyrtVGbtWjZco0c/IHjHK2bP6+eA4bogXL3qvz9ZfXDtFk6dz75hntheLqJX01Vv897mKtAjHtbvNz+BeXJm0dzpywwH+//RU/FxyaY2YcrRYxXlpQaQVhQSJDue6CMWQtgZCoMb/TooJXLViv2UJzy5s+ruv9+RqGPPKguLd6Rt5k6Zrp6Duuu6C07tX1jtF5s39Rcrjt/6kLz8V6fd1fC0QSN/uQbx/iVvu9yPUvOnDkUFBKoex+4xxw/431qeKP36/pj8Upz/AJDAtXunTCl2GxaMmuZG39TZBU2D5rS8Pjgwvi0YGzXt3mSFXNXqGBAQTNgMIox927fqz6t+jiKPIOKB8lmu/qieq7lc+b9Knp81dPpPJOGTdSkYZPMn38cNcP8Q9dlYBfzJlrb129Xn1a9va4uY1v0brXt8r5j37g/haFxvdoa0OsdJRxP1NG4eMfj/yoeosjBH2jQF1/ph+mzFBwUqP7vv22uGLmiXu0ndOLkKX35zQ9KSExUuXvv0eghH3rVtIhh8Zxl5j0tjBtjGTfRMqYvurzczVGkGFIi2Ol1FxQcqElLxjv2W3dqYW5RKzeqQ9PL92IIKFLIDEoCixbR36fPmDfmMgKLNcvXy9ssnfOrCgUUUrtubczpkN1/7tE7Ld/Xif+Nn7HKw26zOfoHBhfRhF/GOPaNm28Z24aVm9TlhXCzrWixQPWP7KUChQuYUy9b1m5Vh4adzZ8BX+Nnd+P3wBrL3erVq+fIPMydO1e1atVSvnz5zH2jHmPhwoXm2vH0aHBn6mv9kTYzN4xw9yV4rBoVnO/QiLTzz+ZdN4nLbH8cJkOSld0d+KAl59mbsFGewK2Zi7Aw5z/ELVu2vKFP69atM/GKAACwnt1+NRPmC9waXIwffzVNCwCAt7J5UDGmFbhDJwAAsJTHrxYBACCrs7NaBAAAWMnGtAgAAEDGkbkAAMDF7EyLAAAAK9l8LLhgWgQAAFiKzAUAAC5m97GCToILAABczM60CAAAQMaRuQAAwMVsTIsAAAAr2X1sWoTgAgAAF7P5WHBBzQUAALAUmQsAAFzM7mOZC4ILAABczOZjBZ1MiwAAAEuRuQAAwMXsTIsAAAAr2XwsuGBaBAAAWIrMBQAALmb3sYJOggsAAFzMxrQIAABAxpG5AADAxew+lrkguAAAwMXs1FwAAAAr2X0sc0HNBQAAXiwyMlKlSpVS7ty5Va1aNa1du/aW/adPn65y5cqZ/StUqKAFCxak+zkJLgAAyITMhd2CLb2mTp2q8PBw9e3bVxs2bFClSpVUp04dxcfHp9p/5cqVatGihV577TVt3LhRTZo0Mbdt27al63n97F6Yq2lwZ313X4JHm7lhhLsvwWPVqBDm7kvwWP7Zcrr7EjzaH4eXufsScAs5cpWw5DyXLhxOV38jU/Hwww/ryy+/NPdtNptKliypLl26qHv37jf0b968uc6cOaN58+Y52qpXr67KlStr9OjRaX5eMhcAAHiI5ORkJSUlOW1GW2ouXLigqKgo1a5d29GWLVs2c3/VqlWpHmO0X9vfYGQ6btbfpwo65x2Yr6zKeBEMHDhQERER8vf3d/fleBRPGLv1R1coq/KE8cuqGLuMY+wylnG4mX79+ql///5ObcaUh9F+vYSEBKWkpCg4ONip3diPjo5O9fyxsbGp9jfa04PMhRveaMYL42aRJm6Osbs9jF/GMXYZx9hZywjSTp065bQZbVmNV2YuAADwRv7+/mnOAAUGBip79uyKi4tzajf2Q0JCUj3GaE9P/5shcwEAgBfKlSuXQkNDtXTpUkebUdBp7NeoUSPVY4z2a/sbFi9efNP+N0PmAgAALxUeHq6wsDBVqVJFVatW1fDhw83VIG3atDEfb926tUqUKGHWxRjeeustPfHEExoyZIjq16+vKVOmaP369fr666/T9bwEF5nMSGcZxTe+XNiUUYzd7WH8Mo6xyzjGzr2MpaXHjh1Tnz59zKJMY0npwoULHUWbBw4cMFeQXPHII49o0qRJ6tWrl3r06KF7771Xs2bNUvny5dP1vF55nwsAAOA+1FwAAABLEVwAAABLEVwAAABLEVwAAABLEVxkIuPe7MYNTYzlPUi7V199VX5+fo6tSJEiqlu3rrZs2eLuS/MYRpW48UVFd999t1m1b3xxUcOGDW9Yz47UX3c5c+Y0q+ufeeYZjRs3zrxXANL3vr2yGe9deD+Ci0w0duxY8w/88uXLdeTIEXdfjkcx/iAdPXrU3Ix/EHPkyKEGDRq4+7I8wv79+80b6SxbtkyDBw/W1q1bzaVoTz31lN544w13X55HvO6MMfz555/NMTPuA2C89i5duuTuy/Oo9+2VbfLkye6+LGQC7nORSf7++29NnTrVvBmJ8SlywoQJ5hpipI3xafvK7WeN/xpfFfzYY4+Z67eDgoLcfXlZWqdOncxPjGvXrlW+fPkc7Q888IDatm3r1mvzpNedcaOhhx56yPz66aefftp8D7dr187dl+gx4wffQuYik0ybNk3lypVT2bJl1bJlSzO1yi1GMh6o/fDDDypTpow5RYKbS0xMNLMURobi2sDiikKFCrnlujxZrVq1VKlSJf3000/uvhQgyyK4yMQpESOouJIqNL7J7rfffnP3ZXmMefPmKX/+/OZ2xx13aM6cOWYm6No7y+FGMTExZhBrBLawjjGexlQJ0v6+vbJ9/PHH7r4sZAKmRTLBzp07zZT0zJkzzX2jXsC4JasRcDz55JPuvjyPYMx1jxo1yvz5xIkTGjlypOrVq2eO61133eXuy8uyyI65blyNqSak/X17RUBAgNuuB5mH4CITGEGEUfxVvHhxpz9Oxnzkl19+qYIFC7r1+jyBkdI3pkGu+Oabb8xxGzNmjD766CO3XltWZnwvgPGPYHR0tLsvxavs2LFDpUuXdvdleNz7Fr6DnLKLGUHFd999Z37D3KZNmxzb5s2bzWCDyumMMf7BNKZEzp075+5LydKMT4l16tRRZGSk+U2I1zt58qRbrsuTGatujBU3TZs2dfelAFkWmYtMmHM00vivvfbaDRkK44+TkdV4/fXX3XZ9niI5OdlcZWMwxtPI+BiFnca9GnBrRmBRs2ZN8+uWP/jgA1WsWNEMehcvXmymrI1P4bj16y4lJUVxcXFmcazx1dTGUlTjq6qR9vftFca0cGBgoNuuCZmD4MLFjOChdu3aqU59GMHFoEGDzJtBGX/wcXPGH/VixYqZPxsFnUZB3fTp06lZSQPjxlkbNmzQgAED9M4775j3GjCW7xr3vrh+Phypv+6MfxALFy5srhL54osvFBYWRjFxOt+3Vxgr5pim83585ToAALAUoTcAALAUwQUAALAUwQUAALAUwQUAALAUwQUAALAUwQUAALAUwQUAALAUwQUAALAUwQUAALAUwQUAALAUwQXgxY4dO6aQkBB9/PHHjraVK1cqV65cWrp0qVuvDYD34rtFAC+3YMECNWnSxAwqjC+Nqly5sho3bqyhQ4e6+9IAeCmCC8AHvPHGG1qyZImqVKmirVu3at26dfL393f3ZQHwUgQXgA84d+6cypcvr4MHDyoqKkoVKlRw9yUB8GLUXAA+YM+ePTpy5IhsNpv279/v7ssB4OXIXABe7sKFC6patapZa2HUXAwfPtycGilatKi7Lw2AlyK4ALzcu+++qxkzZmjz5s3Knz+/nnjiCRUsWFDz5s1z96UB8FJMiwBe7NdffzUzFd9//70KFCigbNmymT+vWLFCo0aNcvflAfBSZC4AAIClyFwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABLEVwAAABZ6f8BfR6ppB32V30AAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"mat = pps_mat[[\"x\", \"y\", \"ppscore\"]].pivot(columns='x', index='y', values='ppscore')\n",
"_ = sns.heatmap(mat,annot=True,fmt=\".2f\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['B', 'E']"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pps.mutual_predictors(pps_mat, threshold=0.9)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv_microwave (3.13.2)",
"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.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}