Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bobvo23/3d8f1a8c19644ad5f4f6bf22bb0fce92 to your computer and use it in GitHub Desktop.
Save bobvo23/3d8f1a8c19644ad5f4f6bf22bb0fce92 to your computer and use it in GitHub Desktop.
Text classification with SVM
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/duyetdev/.local/lib/python2.7/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
" \"This module will be removed in 0.20.\", DeprecationWarning)\n"
]
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import re\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from nltk.corpus import stopwords\n",
"from nltk.tokenize import regexp_tokenize\n",
"from sklearn import cross_validation\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"from sklearn.svm import LinearSVC\n",
"from sklearn.metrics import accuracy_score"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def jitter(values, sd=0.25):\n",
" return [np.random.normal(v, sd) for v in values]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def clean_text(df, col):\n",
" \"\"\"A function for keeping only alpha-numeric\n",
" characters and replacing all white space with\n",
" a single space.\n",
" \"\"\"\n",
" return df[col].apply(lambda x: re.sub('[^A-Za-z0-9]+', ' ', x.lower()))\\\n",
" .apply(lambda x: re.sub('\\s+', ' ', x).strip())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def count_pattern(df, col, pattern):\n",
" \"\"\"Count the occurrences of `pattern`\n",
" in df[col].\n",
" \"\"\"\n",
" df = df.copy()\n",
" return df[col].str.count(pattern)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def split_on_word(text):\n",
" \"\"\"Use regular expression tokenizer.\n",
" Keep apostrophes.\n",
" Returns a list of lists, one list for each sentence:\n",
" [[word, word], [word, word, ..., word], ...].\n",
" \"\"\"\n",
" if type(text) is list:\n",
" return [regexp_tokenize(sentence, pattern=\"\\w+(?:[-']\\w+)*\") for sentence in text]\n",
" else:\n",
" return regexp_tokenize(text, pattern=\"\\w+(?:[-']\\w+)*\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def normalize(tokenized_words):\n",
" \"\"\"Removes stop words, numbers, short words, and lowercases text.\n",
" Returns a list of lists, one list for each sentence:\n",
" [[word, word], [word, word, ..., word], ...].\n",
" \"\"\"\n",
" stop_words = stopwords.words('english')\n",
" return [[w.lower() for w in sent\n",
" if (w.lower() not in stop_words)]\n",
" for sent in tokenized_words]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def features(df):\n",
" df = df.copy()\n",
" df['n_questionmarks'] = count_pattern(df, 'Text', '\\?')\n",
" df['n_periods'] = count_pattern(df, 'Text', '\\.')\n",
" df['n_apostrophes'] = count_pattern(df, 'Text', '\\'')\n",
" df['first_word'] = df.text_clean.apply(lambda x: split_on_word(x)[0])\n",
" question_words = ['what', 'how', 'why', 'is']\n",
" for w in question_words:\n",
" col_wc = 'n_' + w\n",
" col_fw = 'fw_' + w\n",
" df[col_wc] = count_pattern(df, 'text_clean', w)\n",
" df[col_fw] = (df.first_word == w) * 1\n",
" \n",
" del df['first_word']\n",
" \n",
" df['n_words'] = df.Text.apply(lambda x: len(split_on_word(x)))\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def flatten_words(list1d, get_unique=False):\n",
" qa = [s.split() for s in list1d]\n",
" if get_unique:\n",
" return sorted(list(set([w for sent in qa for w in sent])))\n",
" else:\n",
" return [w for sent in qa for w in sent]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Category</th>\n",
" <th>Text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5</td>\n",
" <td>why are yawns contagious? when people yawn</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>6</td>\n",
" <td>what is trans fat? how to reduce that? i heard...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>roth ira vs 401k? what is the difference betwe...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>how many planes fedex has? i heard that it is ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>what is the best photo slideshow creation appl...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Category Text\n",
"0 5 why are yawns contagious? when people yawn\n",
"1 6 what is trans fat? how to reduce that? i heard...\n",
"2 1 roth ira vs 401k? what is the difference betwe...\n",
"3 1 how many planes fedex has? i heard that it is ...\n",
"4 2 what is the best photo slideshow creation appl..."
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"training = pd.read_csv('data/newtrain.csv')\n",
"training.head()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Id</th>\n",
" <th>Text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>ave u ever been dump before? ???</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>my wife is not interested in sex</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>best looking doctor on er?</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>does sbc yahoo 2wire installation software sup...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>why and when was the mason-dixon line completed?</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Id Text\n",
"0 1 ave u ever been dump before? ???\n",
"1 2 my wife is not interested in sex\n",
"2 3 best looking doctor on er?\n",
"3 4 does sbc yahoo 2wire installation software sup...\n",
"4 5 why and when was the mason-dixon line completed?"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test = pd.read_csv('./data/newtest.csv')\n",
"test.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cleaning data\n",
"\n",
"Remove non-alpha numeric characters and extra whitespace."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"training['text_clean'] = clean_text(training, 'Text')\n",
"test['text_clean'] = clean_text(test, 'Text')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Feature Engineering"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### TF-IDF"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"all_text = training['text_clean'].values.tolist() + test['text_clean'].values.tolist()\n",
"vocab = flatten_words(all_text, get_unique=True)\n",
"tfidf = TfidfVectorizer(stop_words='english', vocabulary=vocab)\n",
"training_matrix = tfidf.fit_transform(training.text_clean)\n",
"test_matrix = tfidf.fit_transform(test.text_clean)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<2698x8820 sparse matrix of type '<type 'numpy.float64'>'\n",
"\twith 17423 stored elements in Compressed Sparse Row format>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"training_matrix"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Other Features"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Category</th>\n",
" <th>Text</th>\n",
" <th>text_clean</th>\n",
" <th>n_questionmarks</th>\n",
" <th>n_periods</th>\n",
" <th>n_apostrophes</th>\n",
" <th>n_what</th>\n",
" <th>fw_what</th>\n",
" <th>n_how</th>\n",
" <th>fw_how</th>\n",
" <th>...</th>\n",
" <th>8810</th>\n",
" <th>8811</th>\n",
" <th>8812</th>\n",
" <th>8813</th>\n",
" <th>8814</th>\n",
" <th>8815</th>\n",
" <th>8816</th>\n",
" <th>8817</th>\n",
" <th>8818</th>\n",
" <th>8819</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5</td>\n",
" <td>why are yawns contagious? when people yawn</td>\n",
" <td>why are yawns contagious when people yawn</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>6</td>\n",
" <td>what is trans fat? how to reduce that? i heard...</td>\n",
" <td>what is trans fat how to reduce that i heard t...</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>roth ira vs 401k? what is the difference betwe...</td>\n",
" <td>roth ira vs 401k what is the difference betwee...</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>3 rows × 17655 columns</p>\n",
"</div>"
],
"text/plain": [
" Category Text \\\n",
"0 5 why are yawns contagious? when people yawn \n",
"1 6 what is trans fat? how to reduce that? i heard... \n",
"2 1 roth ira vs 401k? what is the difference betwe... \n",
"\n",
" text_clean n_questionmarks \\\n",
"0 why are yawns contagious when people yawn 1 \n",
"1 what is trans fat how to reduce that i heard t... 4 \n",
"2 roth ira vs 401k what is the difference betwee... 3 \n",
"\n",
" n_periods n_apostrophes n_what fw_what n_how fw_how ... 8810 8811 \\\n",
"0 0 0 0 0 0 0 ... 0.0 0.0 \n",
"1 1 0 1 1 1 0 ... 0.0 0.0 \n",
"2 0 0 1 0 0 0 ... 0.0 0.0 \n",
"\n",
" 8812 8813 8814 8815 8816 8817 8818 8819 \n",
"0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"[3 rows x 17655 columns]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"training = features(training)\n",
"training = pd.concat([training, pd.DataFrame(training_matrix.todense())], axis=1)\n",
"training.head(3)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"test = features(test)\n",
"test = pd.concat([test, pd.DataFrame(test_matrix.todense())], axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Split the Training Data"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train, dev = cross_validation.train_test_split(training, test_size=0.2, random_state=1868)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training with SVM"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"svm = LinearSVC(dual=False, max_iter=5000)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"features = train.columns[3:]\n",
"X = train[features].values\n",
"y = train['Category'].values\n",
"features_dev = dev[features].values\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross-validation"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"kf = cross_validation.KFold(n=len(train), n_folds=5)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.519910629887\n"
]
}
],
"source": [
"print(np.array([svm.fit(X[tr], y[tr]).score(X[te], y[te]) for tr, te in kf]).mean())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"LinearSVC(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, loss='squared_hinge', max_iter=5000,\n",
" multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
" verbose=0)"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"svm.fit(X, y)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dev_predicted = svm.predict(features_dev)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.53888888888888886"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"accuracy_score(dev.Category, dev_predicted)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f39ef9795d0>"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAUQAAAEKCAYAAABquCzaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWuMZFd+2Pc79123Hl1d1a/pnic55JBccpekRstd62F5\nV0wo2xISQ0gsIAGcBGYSA7EcB7CtL1ESIAlsOEaMfDC8iKA4sKJE2UiBNooIE7srKRtlZ3c55HK4\nnCE55Mxwpt9dVV2vW/d98qGqmjXNnunqma5X1/0Bg57qqql75t5z/ud//k8hpSQhISEhAZRRDyAh\nISFhXEgEYkJCQkKHRCAmJCQkdEgEYkJCQkKHRCAmJCQkdEgEYkJCQkKHRCAmJCQkdEgEYkJCQkKH\nRCAmJCQkdNBGPYBe5ubm5Pnz50c9jISEhBPGW2+9tSOlnD/sc2MlEM+fP8+PfvSjUQ8jISHhhCGE\nuNPP55Ijc0JCQkKHRCAmJCQkdEgEYkJCQkKHRCAmJCQkdEgEYkJCQkKHRCAmJCQkdBirsJuEhIST\nRanhcXOnSa3lk0sZXJxLU8yYox7WA0k0xISEhIFQanj84E4FP4yYtQ38MOIHdyqUGt6oh/ZAEg0x\nISHh2Ck1PL713jq1VsBs2mBlJsVMSgfg5k5zbLXERCD2MGnqfUJ/JM91uHQ1w5obUEzr+FHMjc06\nzyxmyVkaFccf9RAfSHJk7jCJ6n3C4STPdfhcvVthdddhu+Fxs+QQxpKUrrBabdEKInIpY9RDfCBT\npyE+SFu4udMkY6rYRvuWdH+Os3qfcDjJcx0epYbH1bsV/vDaOnMZg6Kts1H3+XinyROFFHU3ZC5t\n8uWl3N7nx01zH5iGKIS4JIR4p+dPTQjxdwZ1vX54mLZQa/mkdPW+z6d0lVprfNX7hMNJnutw6K6t\nO2WHYsYgjiUlJ+RUziSlK3xSapFL6Xz53CzFjDm2mvvANEQp5QfAiwBCCBVYBf5gUNfrh4dpC7mU\nQSuI9n4H0AoiAK7cLo/VLjZOjOMu38uDnus4H9smke7aiiQs5yzu7rooSBw/4kw+xU4z4JefP7U3\nN7qfD6KY22UHx49QBVxV4NVnl0b2/xiWDfHrwMdSyr5K8AyKh2kLF+fSrFdd3r5b4Yd3yrx9t8JH\nW3V2W8HY7WLjwrju8r1cnEvT8CIcP0RKieOHNLyIi3PpUQ/tRNFdW7ahoqkKZ2dTmLpKxQmIgZdO\nz9y3UdZaPuWGy7c/2Ob6Ro1S08P1Q96+tzvS+TMsgfjXgd8d0rUeSFdb6KVXWxACEICUIGCn6WMb\nbY1SCIFtaGRMlZs7zeEPfgzp1bjH9f4UMyZfPjeLoalUHB9DU/eObQnHR3dtrcxYuEGMqgiWsian\n8yncIKbuBly5XabU8Nqniu0Gv//uOhXHQ1chiiX3ah6Wpox0/gzcqSKEMIBfAX7jAe+/DrwOcPbs\n2YGO5eJcmh/cqQBtzbAVRDS8iC8v5bi502QpZ/HEXGbv8//vxzuUmz5LudTe71K6OtZhA8Ok1vKZ\nte8/eo7j/SlmzEQADpju2sqYKs8spPmk5LC662KbCs/N51jMWrSCiG9/sIUQEEQS0dY72K4HFGzw\nwojtusf3bm7vfeewn9swvMy/BFyVUm4e9KaU8hvANwAuX74sBzmQrrZwc6dJxWnbvL68lKOYMfnT\nm9s0vJCWH2GbGiszKfK2TqUV3Pcdif3pMxL73ORzXDbg3rXlBhEvrOQ5V/Cx9Ptt9jU3AAGRlNim\nSqUVEkQxJcfDUBXqmsLKbGrP/NKrzQ/DXj0MgfhrjMFxuctB2sLNrRo/vFMhjGMKtkEQx50QAQ0F\ngeOHn9MoEx6ucT8u4+6sOQl0bcAZU2XWbm9u+4XQUdi/tt68vvE5m30Yt+245WZA1tIJIknVjWl4\nIYsZE0UoNLyIIIr3zC+9XunjGuuDGKgNUQiRBl4Ffn+Q13kcSg2PN65vMZ/RMTWFVhCxUfNwg5Ct\nRsBrzy0k9qcHMCj73CQ4a04Cg7YBH2Sz1xRB1Q1ZmjGREhp+SCuI8IKYhhfxhVMZCmmD1ap7X3jU\nsOzVA9UQpZRNoDjIazwuN3eaxLFkKZcia+nsNAPqbkAriDhfsLm4kOPiqAc5xgzCPpcEUw+HQdmA\nu9r9aqXJWs3jQjHNYtZsm1MsHU20QIIXhDS8kCiS2LqCEBLb0DC1tpbYa34Zlr166jJV9lNr+eRt\nHS+MSZs6aVNHSkmp6bMym4RmjIJJcdZMAg8zPQzCBtx7tD1bSGPqKrd2mnhhxEre5uuXFpi1df74\nJ+vcq3moAnIpDV1TqHsRn+w0eWo+gyq4z/wyLHv11Ocy51IGxbRJK4jxggikpO4GKIgkVm1EHBYe\nldAfh5keBhGjuf9ou5RL8aXTM6zkbV45X6CYMblQtNlq+MzZOqfzNqEUNP2YpZzBTjNgp+lzrmDf\nZ34ZVjzp1AvEoq1xa6dJ3QtZrba4W3YIY3jtuYXkeDYikmDq4+Ewu9sgbMD9pEqWnJD5jIGhqyAE\n81mDYtogiASLGYP/4KsXePXZpfvGMax40qk+MpcaHh9tO1yYS1Nqeuw6AYoieO3ZBS4uJJ7kUfGw\n8KiE/unH9HDcNuB+jra1ls+lhSx3Kg62oaGrCn4YUXYC/uJT8w8czzDiSadaIPbuoEs5CwDHDyk5\nYeJIGTFJMPXjM4o40X5CsXIpgzOFNA2/fQpo+RGxjFmesXj5zOzAxtYPU31kTiqhJJxkRmF66Odo\ne3EujSIEzy7lOF9MU0wbLOZS/LUvLY98E5xqDTHJtEg4yYzK9HCYdt87LkMVXFrMjU3g/VQLxEFm\nWiQkjAPjanoY13FNtUBMjPcJJ50kBfJoTLVAhPHdqRISHpdh5f+eJKbaqZKQcJKZhHqV48bUa4gJ\nCSeV1V3ncyXtxr0N6KhJBGJCwgmk1PBY23XRVMhZ7Vz9G5t1zhVs5kZ4XB53m2ZyZE5IOIHc3Gly\nYc4mlgI3jDE0BUVIbpWaI0uBnISybomGmJBwAuj2RP5ou4lA0vQjnpq3UQTc2mmCgJUZi+Xc6JyI\nk1DWLRGICQkTTqnh8Z0Pt7i36zJjqYDgg606H2/X+cJynrOzKdZrLjc2GzS9kDevbwAM/cg6CWXd\nkiNzQsKEc3OnSdUNyKc0LKP9x9Y1vChmtdriTsUhjCVCxtzdbfHeeh1FiKEfWSehrFuiISYkTDir\nlSZ3dpooqsDSNebSOpoqmE+b7DptrSxtagja3e7yKY21mstznYysq3cr5FLGwB0dk5AZlmiICQkT\nTKnhsVbzQAFNCMIo5tNKiyCWGJrCXMbkC6dynCvYhLEkY7VL9DteCIAfxrx9rzoUR8ck9MhONMSE\nhAnm5k6TC8V0u6dxwycMQ9ZrHjU3JGdpPL2QxgsihBCAIGdpeGGMbbaX/q1yk4KtD83RMe6ZYYlA\nTEiYYGotn8WsSUqf5conO/xwq46mwELWZDln8eGWw52Ky9nZFM8uptlxAnZbIV9cznXagfpcPpOn\n2gpYrbZwvJCUoZIxNaDwWGMb95jDgxh0G9K8EOKbQogbQojrQoivDvJ6CQnTRtdRMZPSiYXghVM5\nXljOc3o2hRfFpE0VAUgEt0oOZ/Mpnj+VJZYSQ1N56XSeVii5sVknjGKylobjh6ztuo91bJ6EmMOD\nGLSG+E+BN6SUvyqEMAB7wNdLSJgqeh0Vuy2frKniR5KGG7Be81AERLFkPmMSRJKspfPqs0t7/77U\n8Pjdt+6iKWBoCm4YE0vBhbnUYx2bD4o5rLkB33pvnZUZa2w1xoEJRCHEDPDzwN8AkFL6wMgCjiZR\nfU94OL39f2teRM7SWMnbU/Vs7y+2qhJEkrmMwQebdQwFhCLQVMGnZYcwjrm2tsvN7QYX5zO8fKbt\n0FjOmTT9tsfXNlTOF2xylv5Y8YG1lo8q4P2yg+NHSGLqboipqjx/Kje2lXcGqSFeALaB3xZCfAl4\nC/j1TvP6PYQQrwOvA5w9e3YgA0nKIJ08us80ljHr9XZ/36YXYmoq5aY/Vc+266go2hrffGeNnYaH\nKiSxFESR5PSMxXbDpeFHzFo6pqbwk40aFSfg65cWWJlN44f3V453/PCx4wPfXa+Rs/ROhR2Xesvn\n4nx2r/IOjFeWCgzWhqgBLwP/TEr5EtAE/sH+D0kpvyGlvCylvDw/Pz+QgSRlkAZLqeFx5XaZN69v\ncOV2eSh2ou4zLTsBKV0llzKwDZWy40/Vs+299yUn5BefniOWAl0VxBLO5FO4QcSuE1BzA2IZc6fS\nYqvu8f56lat3KwPrvSKloO3bBi+IUBWl/aLDOPYvGqSGeA+4J6W80nn9TQ4QiMNgElKGJpVRad/d\nI9mHW3UEkDI05mwdP4yn5tne3KrxxvtbxEhmUzp+FKMIhV94ag4/KnB9o06p6XGr7uNHEWlNIQI2\nai5LWRM/krx9b5eXz8wOpHL8F5dzrNVc6m5I2tDIWRqiRyKOW5YKDFAgSik3hBB3hRCXpJQfAF8H\n3h/U9R5G0kxqcIwyYf/d9RqaIhCdgORPSk3OF9JT8WxLDY83rm+hqZC1DLww5k65xblCClBQhMKz\nS1neuReRtzUariBjtk9GAqi0AubSBoW0wc2dJq+cLxx7f2Y/jPayYaqtgB+vVkkJkFKOZZYKDD5T\n5T8BfkcI8S7wIvDfDPh6BzKKdozTwihbuUopKNoGQRgRRjGxBC+Mp+LZ3txpEseSnKUjhMDSVSxd\nodxs3/cvn5tlLmNhaSqXz8zywnKOWEpiKZFI6m6IbWhcKKQH8qz2rzldFZzOW5wr2GObpQIDDruR\nUr4DXB7kNfrhYc2kEu/zwfR7X0apfXePZEEU4wQxMykdXRVjudCOm1rLJ2+3C7+anQ3J1BRKTZ+n\nF3P3ZYT4YUQQxXhRxGa9LfxO59tN4XVVYGjqA6/zqBy05r729MLYP5epyVQ5KGUo8T4fzFHuy6gS\n9u87knWu5fghhqZOxbPLpQz8SHKn7ABtYVh3AxTEfdpx9/lkTJW/dHGed9drSCn44nIOXRUDfVbj\nnqZ3EFNd3CHxPh/MUe5LVxNwO0LzvbUq2hBm1bSbQS7OpVGE4FzBRlUEOw2fMIbXnrtfC+stqBBJ\n+MJS7r5MlWnf/PczNRriQSTe54N5lPsSxvDCcm5PSxy0pj3tPbXvD8gWXFrMPdCsMYma2qiYaoGY\neJ8P5qj3ZVSe5mlf6NP+/x8EU31knvZj14M46n0Zpac5IeE4mWqBOAkFK0fBUe/LJJSGT0joh6k+\nMkNy7HgQR7kvk1AaPiGhH6ZaQ0w4HhJNO+GkMPUaYsLxkGjaCSeBRENMSEhI6JAIxISEhIQOiUBM\nSEhI6JAIxISEhIQOiVMlIeExuLlV43uftKuEFzMmP/tEgYsLSbjRpDJVAjEp9ZVwnNzcqvHNd9bI\npzSWciZ1L+Sb76zxqy+SCMUJZWqOzJPaJzZhfPneJ2XyKY1cykAoCrmUQT6l8b1PyqMeWsIjMjUC\nMSn1lXDclBoeWfP+Q1bW1JJNdoKZmiNzUuor4bgpZtrH5N6c7boXJpXYJ5ipEYj9lLRKJnHCUfjZ\nJwp88501oK0Z1r2Q3VbIL57JT20l9klfQ0JKOeox7HH58mX5ox/9aCDf3VsWP6WrbNZdbu04LOct\nVvI2RVvjo21n7/1WELFedZm1dYCJfLgJg6frZb5XbiKF4FwhRSwFti7wInC8ENvUKNgGcxmTV84X\nRj3kgbF/je0V+ThgIxi24BRCvCWlPLS/00A1RCHEbaAOREDYz4AGRW+F4U/LTdZqHhfm0ixmTVpB\nxBvXy1wo2thG+6EEUcxarUXNC3hxJT9Vu3xC/1xcyDFrm/cJgm9/uM1mrcUTc2kKdrtF6O1SEy+M\ngJMrEPstFNwrOBUhuLa2y59+tMVLp/O8fGa062sYR+a/JKXcGcJ1DqVbgOAKMJ+17ntwcSwpN32W\ncikAVqsuOVMjiOSeEwaG0284YbzZr93UWv59giCMYkDy/kYNOo3Z07qCIh78nSeBfu30XcEZRJIP\nthqkdIW5tMGdskMYM1KlY2q8zL0cVOE5b+tUWgHVls/7GzWurdW4W3HoNSgkVaATDgrfevtelVLD\n4/2NGj/6tMJWrcV61WWj6qEKQEq2Gj6flpsn2gPdb6Hg7vpbrbZI6QqmrmLq7SZYo478GLRAlMC/\nEkK8JYR4fcDX6pveB1dtBby/UWO96nK75HDldokgjEjrgpoX0fQiqh0hmFSBTjgofMvSBP/f7TJB\nFCOQlJ2QnaZHJCUNL6QVtjXGmhdy9W5l1P+FgdFv64nu+nO8ELPTotELY2xDHbnSMegj889KKVeF\nEAvAm0KIG1LKP+v9QEdQvg5w9uzZAQ+nTbfCc80NuV1qoiqQsTSQknIrwNIClnIpMn5I2lBY3W2h\nq8qek+XN6xtDc7JMutdu2Az6fh10LDQ0hYYbcHOrwWbdo+EHBKHEEyE7Dclc2kBTFFp+xB9eWwcY\nua1sEBzWCbH7bFYrbRt+HEv8pke5FdJwQ56cS7NZd5nLWCP7PwxUQ5RSrnZ+bgF/AHz5gM98Q0p5\nWUp5eX5+fpDD2aP74LYb7V08beo8u5glbxtcWsgwl7W4fK7AS6dnsQ2NrbqHG0QIAZauDi3TJcmu\nORrDuF8HnS6urVVxgoiS4yGRxBJMXSGM25rP3WqLsuOjKgpzmbat7KQ+x2LHk/7qs0u8cr5wnzDs\nPpuzhTQXijbVls+7azXCMOKpORuQXFurUbRHFw04sCsLIdKAIqWsd/7+rwH/1aCud1SKGZOVGYvn\nT+UQom3ttk2NIIxw/PaEn0np6GqaS4vtvFRLH26rzVG195xUhnG/DjpdBDHM2gY1NySlq6zMWKx1\nhGAhZeCEEX4k8cKIGUu7z1Y2Lc/x5k6TWMbcLns4foRtqMykdF6wDWZtA8cLSZsaZ2bTlJyQiyMa\n5yA1xEXge0KIHwM/AP5ISvnGAK93ZPYbgVdmUlTdCFXwORvIKFptJu09j8Yw7tdBp4vzsxa2oWKo\ngnLTQ1cVDK0tmGPafuaMoXJ21qbqRWNhKxs2q5Umt8sOQRR3PMwxn1YcwijmuaUcl88VeG4px2LW\nPJk2RCnlJ8CXBvX9x8H+bnG6Kjidt2j5Af/nj1fxIskTRZun5u2RNLUfxTUnmWHdr4NOF1XHRxGC\nzbpPEMWkDYXZlE0Yg1AkKU3F0FXqbsjKjDV1z7HmtRUNq7NhWbpKylCpdSI7Vqsujt/+zLmCPbJx\nTmXYTZeDusVdKKRYq/mcnk3x4koOIeCb76yhEg+9qf1RG8YPilLD48rtMm9e3+DK7fLY2r6Geb96\nTxcrMxaKorA8Y/GzFwpkTZ1YKhRsnUsLaWZTBkIIgjDiyaKNriojeY6jJGdpRDF4QQRS4gURM5aO\nF0reXasShBG6AnUvYrcVjGyOTU3qXr/8T9+/jRvcn7Bfa/lYusYvP39q6B7fUXuZj5KONQ4M6349\nLBU0a2rU3YCbO00KaYMLhTRuGHOr1GQ5Z7Iym566aIErt8vsNDzKjn9fOuOn5Sa6phBFEtvUWJlJ\noasCQ1OPNc1xLFL3JpFSw2Mpd/9EzZoaGzVvJK02R93ec9IcO4O8X/uF7VPzNiUnpOL4zGUsvnK+\n+LkUte7n5zImX+nxuk4bF+fSlJs+5wv2fRvrYs7i7Ky9Z3qAtv1+VFWoEoG4j4eVdJpGkrJpbXo1\nwm4Fm4+2/Y6mfLAmM+rNbJx4UIzizZ3mWNnJE4G4jweVdPrVSwsjHtloSBw7bSZNUx5HHrRB9Do2\n90wyS6NpwTDVTpWDuLiQ41dfXMbS28dkS9f41ReXp7ZHxrg4dkZNEgI1GA5ybI7SPv1QDVEI8Xcf\n9r6U8p8c73DGg4sLuakVgPs5LB1rWkg05cExTqaFw47M2c7PS8BPA3/Yef3LtIOtE6aAcZqwo2J/\nzOqoj3YJg+GhAlFK+V8CCCH+DHhZSlnvvP4vgD8a+OgSEsaERFOeDvp1qiwCvcYSv/O7hISpIdGU\nTz79CsT/GfiBEOIPOq//DeBfDGZICQkJCaOhL4EopfyvhRB/DPxc51f/npTy7cENKyEhIWH4HCUO\n0QZqUsrfFkLMCyEuSClvDWpgCaNn1GmDJ43kfo4/fcUhCiF+E/j7wG90fqUD/3JQg0oYPUlx2uNl\nHO7npBTpGCX9aoj/JvAScBVASrkmhMg+/J8kTDIPysy4erey12luGFrOSdGqRp3pclDqYdJW9/P0\nKxB9KaUUQkjYq4adcII5KIc5CCPevrfLVy8Uh7KojrKIewVnL7mUQdHWKDnhSIXqqHPCRy2QJ4V+\nBeLvCSH+OZAXQvxN4N8H/sfBDWs4nBTtYxAclJnxScmhkDaGtqj6XcQ3t2r8/o/XqDg+YSQJ4piF\nrMVXzs2y03D57oc1XlieYTFrjkwzGnWmy6gF8qTQr5f5HwshXgVqtLNW/nMp5ZsDHdmAOUz7mHZh\neVBmRtkJ+KkzeaDdYGm12qLpBsSIgdyf3kV8r+Lw3nqN3ZYPsl2SPmvp1N2A73y4Rc0Nyad0vDAi\nlAKBx4c7DdKGTj6lUXY+6wVcafps1l1++flTQ3umg8502T9f92vFQJJ62Ad9FYgVQvxDKeXfP+x3\nj8swC8ReuV3GD++fII4fYmjq3uTdXxS1W/9uWoTkza0a3/ukbXwvZkxmTI25rEkQSW5s1knpClJK\nGn6EgmA5b7GSt4/tvnSf0Y31Kv/qg23iWKJrAoFgPmvy5bN5rq3X+WirzkLGwNQ1NusesykNVVWY\ntQ1O520yhsJWw8fUVFK6gqEKSk7AU/PZoWqKg9pkP1+s1uPaWpUXlnMsZtvtCtarLkLAUs4aWqHf\ncVIq+i0Q269AvCqlfHnf796VUn7xMcb4OYYpEN+8vsGsbRxYmDKXMj4nLDdqLW6VHL60MjMRlaMf\nl4MqZXcXVdUN2uEJQlBp+kjYO9peKKaP7b6UGh7furbGH15bR1dBUwTbjQAEnMqlsA2F2ZTBrbKD\nQKIpgrWaSxyDoQlO51NcPlsAJKVmwPKMhamruEGEriqcL9jHXpl5FOzf3N/fqLFdd2kFMXMZE9tQ\nKdg6hqoMzSHWT6X1YQrMY6mYLYT4j4G/BTwphHi3560s8Od9DkQFfgSsSin/aj//Zhg8zKZzkL2l\n3PSJYzk1RumD7HenZizcIGKn4SGEIG2qpE0NQ1OwNIXNmovoCMnjOJJWHI8/v1Wm0grQFNAVBVNX\n0IWg5vpUW5AzNVzPZ9sJEUjCCGKgFYCKw23bwDRUbK3dFc8NItwg3qvcfBJsaN352jVjvHWnjBdG\n2KbG+aKNF8bcLjucypq8+uzSUMZ0mP13XL3eh9kQ/xfgj4H/FvgHPb+vSynLfV7j14HrwFiVBbk4\nl+Y7H25RdQPCMEbTFGYsna89vcDNnc/bWyqtgLyt3/cdJ2VBHcRni+yzjmi2rpA2VF4+W9jTSH70\naQVTUyg7PiUnIG8bFNM6JSd4rAl+c6vGN99Zww0iCql2od4gjtE0FQnU3RBTU7mxWaPqRkSRJKYt\nDFVAE+1Ob1fv7XJpIUOumKHkBMzaBucLNjMpA8cPT4QNLZcy2Kx73Ck7pHQFBASxxPFjHD8ibWr4\nYUTNiw7/smPiMCfOuHq9HxqYLaWsSilvA/8UKEsp70gp7wChEOKVw75cCHEa+CuMqUdaSkACQoDs\nvKYtLDdqLm/fq/DD2yXevlfBCyOK6fsf1Ek2SrcXmcuNzcZeL92mH7JW8yja2l7RWFtX2Ky1eG+t\nRiuI2Kh7VDqCp9uM/VH43idl8imNQtogZ+nECBTA8UK2Gx5NP6Lu+mzWA1pBvCcMu0jAVFUsXaEV\nxtS8gJypcb5gk7P0E1Xo9uJcmlulJoqQGJqCqghiKciZKjsNDy+IiOJ257thsb/nOdy/Xsa14G6/\nFbP/GdDoed3o/O4w/nvg73H/XB0Lbu40OTVj8dKZWZ5eyGDqKht1l//1rbv82UfbvL9e517ZwQki\nkFC02xrFtFSOvjiX5taOgyIklqbghzGxFFwopik54V6VYylj7u66mJrCXFqn5YfcKjvkzMdrxl5q\neGRNjSfmbBRVIW9pIKHht6dSSocghoh2I3jZ+anSnmyRBC+OCCOJoamcylk0/WgsKjMfd8ZIMWOy\nnDNJG+2NqmCbnJs1cTvOr7Wqy1zaYCU/vH7Hh1VaP0xgjop+twwhe7wvUspYCHGY/fGvAltSyreE\nEL/wkM+9DrwOcPbs2T6H8/j0HglvbDawdIU4iri6VgMEp7IGK7M2ilB4Yi6Nriq4wWcLahT18IZp\nhC5mTJbzFg0vpO6220Y+U0iTszQqjk8x81kHuWImxTv3dql7IVlLZyFrUvMiCo8xwbvNvuYyFl9a\ngRsbdepeiKUpFGyNIBYEkY+KhBh8+ZlglHR2+hi8SJI11L3OiaN2oAzKdrYym94zY9yrNPmzj0uk\ndYWFhQzFtM77mzUMVeHNIXl8D6sfOa4Fd/sViJ8IIf42n2mFfwv45JB/8zPArwgh/jJgATkhxL+U\nUv47vR+SUn4D+Aa0vcx9j/wx6e5Qq1UXS1eouyHfv1NBSlAUwVbDp+qGpIy2APzq+VmAkS2oURih\nV/L2gaFJ+3tWL2ZNvnqhuBeK0w5r8ZlLm488wbvNvhw/Ztfx8KIYVVGYMQVuIEkZAktXCKKYAIkW\nt7XC7gRSAFNXSOkqlqGOTefEQdnOegVMzQ1ZmbEoN4PO9wtMTaXU8jlTsIfmwHhY/chxLbjb75H5\nPwL+ArAK3ANeoaPVPQgp5W9IKU9LKc8Dfx34zn5hOEq6Kn3F8QnCmPfWqwSRZD5jIpCs1VzCWBLF\nkqYf8u56baTj7V1IQghsQ3ssG10/9NNgqvfoowq4VWpybb2OrojHWnAXF3L84tNz3Ntt8XHJIaUp\nPDNvk7UNQtk+BmdNHVVR0IRA18DQoJDSWErrZG2dWdvgzGwKx4/YbYX87BOjD68ZlO2st1nTVt1j\nLmPytUsL/PzFedKmxlLWJIrk0OZOv2N+5XyBV59d4pUx6Vndb6bKFm2hdmLoTqC246COgmApZ6Eq\nAiEUNFXqgQfpAAAgAElEQVTghhGKAgXbQEpx+JcOkFGkXvWzi3e99fd2XWYslfMFm5oXfs4B9ShE\nKDy3lOX55RyWrtL0QlivUmsFNNwAU2s/p6xpYGqCIIKVvMULyzPU3ICb2+0Fn7P0semcOMgUvl6N\nrFezd/wIXQHb/OyaJzlC4nE4zA7496SU/0gI8T/w2WlkDynl3+7nIlLKPwH+5FEGOEiKGZNffv4U\nW3WXlK7gBRE7jo8fxiylTapeeyItZC2ems8Q9xHEPihGlQt7WNn8YsYkn9KptgKCGGxD5YvFts31\ncY+BtZZPGLdtgABpU+PZpRxhHLPV8MlaOiv5dvZJSle5ULTZqPu4Ycxi1uLZpRxNL2LW1rlVcig5\n4cizi4ZhO9t/DVVA1Y340kpm7zPj4MAYRw7TEK93fg4nfWQEFDMmL53Oc32zzt1Ki6JtoIl2AG8h\nrfNLzy5yeja9l9Y3KsbVCN3lxdP5A7N+HodcykBTHLwwxuocMzVV4YunZzk3ax+YdbG/6o0jIiz9\ns2yJUQf/DsN2tv8a5wo2u60AXRVIKYc2d8Ypda9fDuu6963OzxPdP+XlM7OEMTw5l6bc9FmruWzU\nPL5ybpaVvL1nOxul8BlXIzQcr/a6X6ApAmpusBckWnUjTuctXj5zsFDr1Wiv3C5j6eMX/DuIZlUH\nCZ9eB2D3/WHNnXHNRDmMw47M3+KAo3IXKeWvHPuIRkCvsDFUhacXc3vVQsZJ+Ixr17fj0l4PWkRZ\nSyef0tmst4Ox04aKqog9h8DD7se0lLzqR/gMe+6MaybKYRx2ZP7HnZ9/DVjis7YBvwZsDmpQo+Cg\nCXNxRGOZNI5Lez1oES3lLAxN5S8+tfC5YgGHaRyjrkE4LMZR+EzqZnTYkflPAYQQ/92+ShHfEkKc\nWLtiwtE5Dg3kYYvo5g5HXvTjbnc9LsZR+EzqZtRvHGJaCPFE94UQ4gJwMnPWEkbGw9K5HiV+rzc2\nb9TpeoNkHNPg+olhHUf6zVT5T4E/EUJ8QjtD6hzwHw5sVAlTycM0uoMqEPWz6MfV7nqcjKMmPM5O\nwIfRb2D2G0KIp4BnOr+6IaVMehgmHCuHLaJxW/TjwrgKn0ncjPoSiEIIG/i7wDkp5d8UQjwlhLgk\npfy/Bju8hGnjQYtoXBf9uDCJwmcc6ffI/NvAW8BXO69Xgf8dSARiwtBIFn3CoOnXqfKklPIfAQGA\nlNKhbUtMSEhIODH0KxB9IUSKTpC2EOJJILEhJiQknCj6PTL/JvAGcEYI8Tu0ax3+jUENKmFy6KaE\nrVaa1LyInKUdayvShIRhcqhAFO2M/Ru0s1W+Qvuo/OtSyp0Bj22kTGJi+rDppozFMma97qEKaHrt\n5k/lpn8iY/76IZk7k8uhAlFKKYUQ/7eU8gXgj4YwpqFy0OQFJjIx/Th52KLuvnf10zJBFLPd9Ili\nSdbSyZoqZcfnfMEe+7zVQTCpRQ0S2vR7ZL4qhPhpKeUPBzqaIfOgyaspR08TO0k8bFHDZ5tFK4jY\nqnts1D3OzaYIo5iNekgQxjy7mB37vNVBMI55xcNmkjXkfp0qrwDfF0J8LIR4VwhxbV/j+omi2/Xs\n967eZbXqEOwvrb7dGMsWicPiYe0Ket9rBTGGppAzNSqtoN0CE3CCeOSpY6NiXNtrDovuZuqHEbO2\ngR+2N9PH7Sw4LPrVEP/1gY5iiPRqP0K0e/3e2KzzzGKWmZROSleRiIlMTD8uDisW0H3PNpROiS6V\nzZqP44WEscRWxNRmkUxqUYPjYtI15MPqIVq0G0xdBK4BvyWlDIcxsEHR+8DSpkYQxaR0wUdbdWxT\no9L00VXBetXl1Ix1YtLEjnKMabgh3/ukRMuPmEnpvLCcZdZuf3a16nJ9s94WihJiGVNqBEgksWwL\nhMWsObU2s3HMKx4mq5UmTT/CCWJsQ2VlxiJn6RNjPjlMQ/wXtIOx/x/gl4DngF8f9KAGSa/2szJj\ncWOzQRzH3Co1eWohg6oKzhZsHD/CDdp/Jj1N7CiG/ptbNd5Z26XpheRSOl4Q8u0Ptjmdt9qasx9y\np+zQCiKaXkja1FnKmTwxlyOM4XTe4mtPLwDtitWTaEd6HKY5xbDU8FireWgKZC0dL4y5sdngXCHF\nXMYa9fD64jCB+FzHu4wQ4reAHwx+SIOle6QJIslq1cULQm7uNDBVlbSpszJjAYL1mstOw+Pls4WJ\nX8z9HmNKDY/ffesejh+RNjSabkjDj6i7PmvVFi+dztPwI8IYmkG7T3IQR0SxbDeDMjXyKR2Ybi/9\ntKYY3txpcqGY5k7ZwQ9jLE3BDyNu7Th85Xxx1MPri8MEYtD9i5Qy7G0idBid4/afAWbnOt+UUv7m\nowzyONnfNnMmpRNLEEJwr9Lkw806u62AubROztLZabj88HaZ5bw1sQHH/RQQ7WqRm7UWqiIoNXwa\nXsTZgoWumtwuOdzdbSGlpGDrhDLGVAVCCKSEsuOT0hWu3CrxJx/tEMWS83Mpnp7PMtOxn02KHSnh\n0ai1fBazJildZbXaou6GHYecNjHP/TCB+CUhRLdDuwBSndeCdojiwwwjHvA1KWVDCKED3xNC/LGU\n8vuPP+xHZ3/bTCklmiooOz53dx10VWCoCildoe5FxBLSpkrDC/c8ZqPSdB41nOEgQ/9m3WW74fPm\n9Y29AqyxlAQxhHEMQoCQfLDZIIhjpIStuoemCE7P6piqyq7jE0rJeuQSrMcESOJYkjZU5jMmZcfn\nXsnhdNEG2e74NokbynEwyaEo/dKdZzMpnZnOSWHU3SqPykPDbqSUqpQy1/mTlVJqPX9/qJVYtml0\nXuqdP6NrbLyPF0/nuXx2FoREEwpuGHWkPDT9iJLTdq40goicpdPy2wIlljHfem+dN69vcOV2eWjh\nBI8TzrC/evFGrcW1tRrzGXPvu96+V+WDjSoZQ2Gr4bNZc6m3fBp+QMuPMFSotnwqjs92rcVmrcV6\n3aPS9Gm6IW4c4wUSKcEJIrabPk0v4Pp2gzvlFoYq0DVlokIwjotJD0Xpl8/PM5cfr1ZZrTSHulYe\nh37jEB8JIYQqhHgH2ALelFJeGeT1+qW35PrqrsusrWMbKrahoigCXRFEsaTqBtwtO9zcbuD4IT/8\ntMR3P9rmg80aqmCoE/thsYGHsb+U/nbD54XlGZZy1t53WbrCj9fq5G2DSwsZYiRVNyIIJYYqEEJB\nEVB3I27uODT8CFVAGIMXt48MugqqAopQ8IKYjZqLH8Zs1lq4oeSJYqbvMZ8kHufZTRK98+zTisOt\nnSYXijZnC+mJ2QT6jUN8JKSUEfCiECIP/IEQ4nkp5Xu9nxFCvA68DnD27NlBDmeP3tAIZPuIaKoq\nhZyBrrZDcLbrHhlTQ1PgbiXGDSSaqmDpgtmUyY2tJs8sfrbAB338edxGQr2G/jevb3zuu8IwYrfl\n895ahK6CoQgUBQxVkLF0Wn6IH0mEaKv5QkpUAVJAKMGPQFMhikBTJZYm8COQMqbuRZzOm8yk9GNp\nYD9pjGMTqEHRnWdXbsN8xpy4eMSBaohdpJS7wHeB1w547xtSystSysvz8/PDGM59O1k+peGFkifm\nbAAcL6TpRaR0FVNra0bbzQBNFbhhTBxDGEtiGbNadYeWhXCcjYT2f1e1FfDRdqMTrC4JI4kXRiDb\nmp8fxkghsA0VSVtIGroKEhSl/ZmYtlAMJESxBASmplJIW1ycy1B1o8ca8yQzjk2gBs2kZuwMTEMU\nQswDgZRyt1NL8VXgHx7X9z+ukbq7k12cS/PtD7aouQGKEHy846FrCs8uZjk9a3Ov0uLGZg0/ilGE\nYD5rYmkqNTdEV9WhTezjDPjd/12flBrtGMKZFLapUXVD/CjGCyWmrqKpCqqMaYUxQoCpCwRtzVAX\nny+MGcfghTFPFlOkLZ2VnEnTDfY6r01LkHKXaQzW3u/Iq7YCPik1CMKYXKo8tk6lQWqIp4DvdnKe\nf0jbhngsLQeO00hdzJh8/dICL6zkeWF5hi+cyvO1p+Y5X0yTNtsPc3kmRcrQuDiXQQgFiaThBqiC\nobVWPM6Wmvu/KwhjLhRtYgmlpo8fRmRMjdmUxkxKI4wlXhBjaio5U0UVKrFs2wsRoCttj1laF+gC\nZmyNF5ZzPLmQ5RcvzWMZGjHixLYBPYxpaYfaS6+DZdfx+fFqlYYXcmkhM9b2xIFpiFLKd4GXBvHd\nx50v2Wtfy6XK7DQ87pQdAExdQXElUQTzWQNDVbhbcfAiybmCzctnhjexjzPgd///+crtEtsNHwnI\nGAxNxTIkX1qZoeGGXFuvYukay3NptpoemzUPgcDQFWZ1lTOzaRQBDT9EVxVePjOLH8YU0iaGpp14\nAXAY0xas3Zuxc22tRtZUeWIuvReTCuNpTxyoU2VQDNJIfXEuTbnpc65gU2p6qEIQI/i5J2bRNZVK\nK2Axm+K15xa4uHAyjjwX59L86YdbqAoUUiZISdkJMDTBdsNnKWeykk+hK4JWGKMrKktZi7obtgVi\nSieWMX4EhZTBrN0Odt/TCqckdS3hfrqbQHe99iZ2jKtTaSIF4iArivTubIYquLSYo2hrlJyQWsvn\n6cXc2No/HpVixuTiQoaspbFWdXHDCFUVPDeXQ1MEX1ieIaWr/GSjTsbUOJPXsXSFmztNFjMmTT9m\np+mzlDVYnklh6SoreXvqtcKENpNUAWgiBeKgjdQHHW8uHss3jy8reZv5jMmXzxd5f6NGEMUIQFMV\nbEPD1FWeWcwyaxs4ftSpZJJiuxnwtZUZ/DDmVrlJuelzaTE7VFNCwngzSU6liRSI01xRZFD0Ttqm\nF2KoglYoeabQdhiFYYyhKjzXM4mllOhqE0NTcYOIF5bzJ057Tnh8Jmm9TqRAhOkzUg+a3kkrpSRG\n7BXNBdA05XOJl60gYmU2zSvnCyMYccIkMSnrdWIFYsLx0xub+YM7FXS1XZChFUTMWHo7T9kPx/7Y\nk5DwqAwlUyVhsjgobu5rTy/w9UsLUxVLlzB9JBpiwoE86IiTCMCEk0yiISYkJCR0SDTECWEaCowm\nJIyaREOcAKalwGhCwqhJNMQJYNJ73Y4bibad8CASgbiPUS6WB117mgqMDpqjtGRNmD6SI3MPozya\nPuza01hgdFBMSzn/hEcj0RB76C6WIJLcLtdxvBBVFVy9C68+uzSUax90LO4tYhvGEk0R5Cydr19q\nN4RPjoD9k2jbCQ8j0RB7qLV8/DDmxmadMIrJWhoK8Pa96sC1xO6139+o8aM7Zd7fqOGH8V7JdSFg\nry2g6LwmcbgclUTbTngYU6shHqRV5VIGV26V2G35NP0IL5KoQpI1NK7erQxcS3x3rYauQr1TkHWr\n4VGwDb5/u8zT8xleOj2791nHD/eOeYnDpX8mqfLKpDOJJ5epFIgPMqybiuTKnTKaAmEkMTpNppYy\nJm/f2z2WklbdSbJaaVLzInKWxkrepu4GtIKQzXpIGIbcq7RohRH1VsB61eUn61W+eCpHMWNhmxrL\nOQu3o+kc5xFwEifxUZikyiuTzKQ6r6ZSIPba66qtgNVqi7WKw8flJnO2RtkJiCQEESxldVphzHI+\n9dhaV3eSxDJmve6hinapLVNrG/VlFNFwA26VmrSCECHE3im56YW8dXeX155bIoxi3l2r8fyp7LEW\n3/xsfJJS0+P6Rp0f3inz2rMnpzo4TE7llUlmUkPFplIgdg3r1VbAjc06KV0hkhLPj8nnLBQlYjHd\nLnvV8ELKrZCMqfHWp5XH0pi6k+R22SOlq1i6ihdElB0fS1P5yXqV+bRJww/xAokiJGlTIZYSSUwz\niPlop86uE7Jd93h3tcIrZ2fZbHi0gnZrVAVIGRp/4YkipYZ3pLHe3GkSS8mdskNKV5jLGNTcgDfe\n3+LX7ESI9MtJ17L74VGcV+Nw3wbmVBFCnBFCfFcI8b4Q4idCiF8f1LWOSler+mirzk7T5XbJ4Xal\nhW2opHSFtKkRAy0/pOQELGVN8ikdQxX3OSxKDY8rt8u8eX2DK7fLhzoyur1qHT/C1Nq3PogkH241\n+Hinzuquy9urVbxAEgGxBCdoFyE0VAXHC7l6t8pa1SNvq8SR5Dsf7fDxThM/DNmqe2w3fRQBfhQf\n2blSa/mUmh4pXcHUVRCCrKUTI5OwlD5JnFxtjuq8Gpf7NkgNMQT+MynlVSFEFnhLCPGmlPL9AV6z\nLy7OpfnOh1tc36hTSGtoqoIfRgRRTNMP0ZS2duQFgnxKZzlv4YaSZxYz6KqyJxyOaiP57Hir4oUx\nUSy5vlGjGURs1z1i2W732UsUSVwRoakKAomqCFQhKTshlq6iKoKoU9D14nwGCcSdJlHnC/aRjii5\nlMH1jTpzmc8mrRfGGKrg6qflh+7c47C7jwOfhW7F3C47OH6EKuCqMvjQrXHiqM6rcTliD0xDlFKu\nSymvdv5eB64DK4O63lEoZtoaXz6l4YaSMIrJmTqaouCGMU4QsVptUXdDzhdSzKQMnlnMMJMyCMKI\nq5+W+b2rd1mtOgSR7DvAt9urtmDrtIKID7dqlB0PL4jwg5BWEIPSjq5RgO7+GkagIokkhGFEEEv8\nUFJqBpSbLtsNnzslh7LjE8UxkZQ4fkRKV/fCdvrh4lwaRRHU3AApJW4QUWn6VBwfXVMeuHOXGh7f\n/mCLa6u7fLzT5NrqLt/+YGsqtKL9p4TVSpMgjLix2SCIYjKmiiLg7Xu7U3E/uhy1F3X39NTLUefv\ncTAUG6IQ4jztHs1XhnG9fvn5i3Pc2Gqy3fTIWho11yeW8ETRRlcFTS/ixTMFlnIWAPcqTf78kzJC\nEWgKLGYtbmzW90rtH2Yj6fVwekHEtdUqOVPj7m6LuFOfP+pIQV1pO1NUTeAHbQEI7SN0Kwzan1EF\ngZSYukDStnc2/IiirWMb6pGdK8WMyWvPLvDG+1uUmj6zKR1dFSiKzhPFzJ7gh/t37qt3K6zVWuQs\nnWxH+12rtYYSqjRKep1k5abP9c0661WXfEpjPmthdRa4EIJC2hh7h8JxcxTn1bh05hu4QBRCZID/\nA/g7UsraAe+/DrwOcPbs2UEPZ49cqq3trMyYXFvbpez4aELw5JzNF0/nkVJyr+Jwq9QkZ2kEYcSf\n3y4RSrhUzLBRa7FadTmdT7FabTGT0vt6gHuT5HyBjbrP3UoTSQtNUTHUCCdsf04DVAWQ7VYmrQhU\nIKYtKAGiWKIqkFYEeUuh1gpJGQpBqFKw9UeKr7u4kOPXbHPv+Fv3Ir6wkNnrrQKfN47f3G6QM7U9\nAWDpKkjJze0Grz57pMtPFG0nVMydcgtLVyimDcJIcvVuha+cU4mimPWaS92LeHLOZrXShCnvP/Mg\n08q4xIcONFNFCKHTFoa/I6X8/YM+I6X8hpTyspTy8vz8/CCHcx8X59KsV11ulR0WcxYZQyNtap0Q\nlwAvjFmeSbGcMzE0lQ+2GggULi1kyFgap2baWuNO06PpBjh+SMOLuDiX7nsMT82n+bTitDNSvAA6\nYTYC8OK28NNVgaF8doSWnfcl7fdTKqQ0lVYkCeKYYtogn9KZy1iPHPNVzJi8cr7Aq88u8VNnZzG0\n+6fJfsEvEfu/4qG/PynUWj7lpo+lK1i6ihCCpZzJfMZktdbiw60GUgiemm/PibWaN1XH5v08zHFy\n1CP2oBiYhiiEEMBvAdellP9kUNfpl4N2pllbp+YFSAnrqkI+pZE2ddaqLvMZi8VCirmMxSvnC9Ra\nPhlTI4jb6lna1HmyaPNJqUmMaD/AIwb4XijaRJEklqAKCGKJJrp/bx+fTUvFC+I90dJtfKcLiCTo\nmoqiKFwspjEMjRlL4wtLuWPrhNfPzv3UfJr31usIITA1BS+MqboRz5/KHssYxpVcyuD6Zp1i+n4n\n1KWFDB9tN3lqIU3O0vHCmFYQc6F4NCfXSeMwx8k4xIcOUkP8GeDfBb4mhHin8+cvD/B6D+RBO1Pd\nC3lxJc/PX5znr3xhEV1RafkhYRRzrpCi6UXUWj5vXt9gtepiqApuEOMGEVJKIilZydv82y+f5pXz\nhSM/zJIT8tLpGWxDRVFVMoZG1mgnKhsd+3LdDdohOD3/TgKdaBwaXkQUx5RaAUVbR8rj1cr62blf\nPjPL6bxFJCW1VkAkJafzFi+fmX3IN08+F+fSKAjqbgBS4gURrSDmTCHNqRkL29CouyGaqvDMYpbF\nrDl0J8E48TDHyVFD2AbFwDREKeX3YDzOTA/amTbr7p4hdyWf5muXDN5bq7JVd7mxUSdGkjZzLGYt\n/Cjm2lqNCwUbP4opNX0UBK89t/DIu1qt5XP5XJHtRsCtUqMd+4jEEpKUprHVCAgjQNwvEGn/ihgI\nY2j4IUvATMpgOWcRS7n/Uo/FYTt3MWPytacXpi7sppgxee25Bd64vsVOwydv65wr2ChC8KWVGSxd\nvc9J4PjhVBeReJDjBI4ewjYopiJTpTdqvtryWa26NL2QpheQNlSWctbecdAJIr76RJFS08fxQ+6U\nW6R0laVcCoDths/KjMXTi7nHXvRdx87PXZyjEYSEkaQZqOQMrR3y0goIovYRen+TeL0jJFOa6MRN\nmjy3lMPxQwxNPehyA2UcjjujYL8TqrsZAGPhJBgnHmR+0ZTxKVAyFQKxuzMFUcyNzQaWrmCoAs02\nkBLcIMINIrYbHi8s51jKpbhXaYeRuGHMatVlJmWwmLUwVOXYQkm6E6SQNvilZxb481sVglrbMbJR\n88iaGlEsccIIJf5MS1QAy1RQAD9qS8qWH+45dqZ50Y2CB20GSRGJ+3lQYY2rdysHHqVHUaNyKgRi\nV/Cs7jpYWtuT2wolzyxm215cTeWV8wXevL6xp0napoYXxpiaQsNrq/XHHRfVO0FsU+cXn1mg7gbc\n3Gmy3fQppg1qXoSpa3hhhBuEuCEYKigoKLTDbhbTBgjlkRw7CYNjWrXmh3HQPRmXGESYEoHYFTz/\nW6mJgiRt6TxTSDOT0pFS7u1EvQ9mZSbFjc06XhiRNrSBaV8HTZBSw+P3rt7l+7fLaIokpQuqjiRQ\nBCldgACJxNAV5iyNpxZz/PS52WPzLCckDJNxiUGEKRGI0BY8P3V2Fj988E7U+2Bylsa5gs2tUpO0\noQ5V+ypmTP6tl8+Q0lW+8+EWbhhjGQpCGOiqxI8lEkHe0nn+VJYn5jMn3qObcHIZpxqVUyMQ4fCd\naP+DmcuYfOURwmmOg2LG5GefLHK30uLjUhNDhbShIQFb1zgzm2Ixa7Iym54Kj27CyWZczAtTJRD7\n2YnG5cFAO07xF56e52eiOVarrb2mV+dm7ROdI5yQMCqmSiDCeAm8w6i1fFQBqzUPx4+wTY2VnEl0\nvGGGCQkJHZKue2POu+u1vTJSQRTz7vrn6mMkJCQcE4lAHHOk/Kzgg+i8TkhIGAyJQBxzvricQ1OV\nvZzYLy4nQdcJCYNi6myIk0Q3te+5nnisUaXmJTyYUbdPGPX1TxKJQBxjxilgNeFgHtR/+Kl5m5IT\nDlxIPWr/40SIHkwiEPtgVJOnnzChZGKPloMqKdXcgDeub/GllZmBV285SnOm7lxZ3XVY23W5MGez\nmLUmpon8MEgE4gPYmzyVJms1j4WMjhvKgTVvf5Bg607QmzvtMJybO+3PFzPmI2sHg2IahfNB/YfL\nTZ84lkOp3tJv/+PeudLwQjSVvUpOM51MrWkuXttlqgVi7wLeT8UJODVj0fQj/DDiyp0mF4rpgTRv\nf5hgqzgeb7y/RYxkNqVTbnr88HaZ5bxFzQ2Zz5hjUTZp3ITzsDioMEGlFZC39fs+N6jqLYcVRujO\n8aufltE1hSeKGVp+9LlKTkcd30nd/E68QHzQg+tdwKpox/tJKfjico5b5SYNL2QuY+AEMW4YkzFU\n6l5IIW2QtXRKTf/YBM+Djj1X71b4YKuBpkLWMqg0fW6VHVZmLBpeSM0NaHphZ5dvL8BBLbzDFsAo\n++qOanGWGh61ls/b93YppA0uFNIYmoKCoJi+//qDqt7yMDtz7xwXQqAANzbrqILHquR0nJvfuAnW\nEy0QH/bguh3Tbpc93l3bpeXHmKrA8UNsXUFXFb774RY7TZ+dps9C2iBrxVCw8cKY2ZR+bOXgH3Ts\nubZWI44lOdsAIaj7EelOm8+W326H0PSCva5/8HgLr9/N49rqLn/60TYvnZ7h5TPtRdDv0e24GLU9\nrPeeXD6T55OSw1t3d3np9AyvPbfAR9sOjh8O3Bn2MDvzldvlvU0qbWoEUUxKF/idHi+PWsnpUeyW\nB82pq3crvH2vSsHWeaJo77X26D67UQjLEy0QH6Z5vbu6y51KCzeM2Ky6ZEwNTYFK08eNYxwvIIph\necZCynY7STeMKTc9FKGwWEgd247/oGOPQJK3dcpOQN0L+WSnSdpQaPoxp2dtVmYsrm8GVJo+UsrH\nWniHbR7dTJkbW00sXWEurXOn4hDG7UKow6xpNw72sN65VY0kpq5iaRGrVZeXz8zy5XPtKtqfVhxq\nbkjOVLm50wQ49nE9KB21d5NambG4sdkgimM26x5ZQ2XXC3l2MXPkSk6HbX777e8XimkWs+Z9HviP\nth1Wqw4pXbBac/lgq8GT/397Zx4jyXkd9t+rs7v6mJ5zj9nl7pK7XIqHQ9Krgxahg7QCKZENxRHi\n2HCABA5kBEpgI0iU4x9Hf+UPAbGBJHCgSLYVSGZiS5FzGYIYUZDEiKbMQ1qeEqm9d3bn6pm+6/7y\nR1U3e0czy5nZme1Z7vcDFtNbU1P1qrrqfe97733vTZU4PF4c3KdRuGDe0QpxXYd32+d7Z5ZZagd0\nwgTTNECEjh/RjFJIU8JEEabgmlCwLUwxCJKE1V7EK3NNjk4UefVqxF1TKc+e44ZHro2mPceny6x0\nA34wn1mKvTCm6afYhoFJhcsNn3YQE8YpF+odZsdL2y6bdL1Rv38fz9W7g5abKEXLjynnL/rNTBF6\nS0FnvZ8FIUxTrjS7HKqV8GyDkmNu2AN5JyyPyysdOmGSzSDaIQeqLpMlm+VuNHhxj0+VqHdCpsvu\n4KGHiEIAABnKSURBVJ7cTL/q8CA1VnSYHSvw/84uYyAcrBW5v+RgiLHl6x8+br8lx0o3pFqweXOh\nyRuLXcquSSfM2gOcr3evces8fabOXVMlWr2I5V6EaxpUChbzLZ8kb9YFo2kr8I5WiGutlkYv5Pvn\n6xSd7GWqdwK6oRr0O4Zs6U6/hUmcwNWmT9k185HKRoA3F7tYllBxLFzLpN4Jt/2Q91/OXhgx3/Kp\nFixma95AkXzxmbOICKYBjin0IkXJhmfO1akVHXpRyh0THnF6Y4p5vcEjjLPGWgCO2WWh5YMIQZxi\nCuyrFAaWwWR54qbVtGv2QgyR3L8qBFHCcjskShSHax6dMKbhx4N+v7CzU+zldsBcM8AyMivYMmC+\nHdCNYqIETl9a4bkLdbxcCdw5VcJzrB1/qdcq9knP4pkzyzx9tk6rF1F0TGoFm3cdqDJVcnjxcoMw\nTrhnX5XZWpGxokM3jLcsT3/wa/oR5+pdTAFThOmyyzdeW+DYpIfnuHSjlErBJozTgVsnihNeudLA\nD+N8gDWpuFY+w1GYAs0goXKTXTB9drMv8x8CHwcWlFL379Z5rsdaq+XMUodWLwaVZtO9JGv+Psxw\nd7sEUElmCfXihJlKgTiFA7UCtiksdAJShCMT2+u3Ozz1u2Oi9JZlOKTYDIGpkkOq4GDNw7MNXplr\ncGnFZ6pS5O5xD8s0mGv2eOHiyrbLgv3s4BFxeq5JxTUpWMI3X19krtGj6BjUCjamCMvtkFU/Zl/F\nHSifm2X5vDS3StE2OFAt8sLFVQzJLIqrTZ+pcuGaHsg7McUeVj6XGz4zZZulTkzbj6kWLVa6IaeX\nO8yUHBp+DAJFy+CefVVen29zz77ytqK515NneEo53/L5b88tcHG1S9kxSYGVbshqL8Sx4MVLCteE\ne/dVsCxjIFO1YG9Znr7f8n+9fIUkUVRLDrNjRcaKNj9dbFPvhOyvFvFyf3fBypaeNnohp68084LL\nBpZpstgOSNKUMFYEcUoUp9yzvzyytgK7uZb5j4GP7uLxN6Tf4/WFiyv0woiX5xp8543FQWvR86sB\nlsjPKMO1KDKlGKTgh4pzy11sAzzHxDFNkgSKtsFyJ9hWgGV4mioieI41mIL28Rybw7UiJ/dVODLh\nMV0pECcK1zJJE8VyNyJJFVXX4s3F9pZl6HN8qkQ7SOiGMUopXp5rcLXZ48Jym6feWCJNUyxD0Q1T\nFtsBfpzSCGIWmj2myy4/OL9y03rp9qeiSik8x8Q0FE0/puVHXGkGHKq51/RAHr7P/ZSTgm1wueED\nb/UG3oi1fb2bfsRiO+JQzaXkWjT9mGYv680cp+BaBp5jESaKuUbvmnPt1Eu99tmpdyOutnwsw0CM\nzK1RLdgYIvxksYvnGCRKCBNFwTYHMm1Xnsmyy+xYgV+4c5J791cH0+GaZ7PSi4DMb+lHKU0/s1bP\nLHVQSnjo0Dh+rKgWLSqOyaUVn1aQDaxTZZemnzDpWdc8j/3AT7+j4W6xm32ZvysiR3fr+BuxNiJ6\nYbWHUsKDh2q0gkXmWz3iJMU0gXjzx03IchNt06cbJZRdm/Gig2sZLLVDTu7buq/ses7pvkXSDWN+\nMt/Fcy1swyBKEhY7ITMVF8/JAh0XVnrMlB1MY/vj23C08sJKl3P1LndOFHl1vkUvTFjoBNgiWEbW\n6W+xEzBrGfSihEsrXc7VOzz90yU+dGJqEHneKYanu/0ARcmxaIcJV5s96u0IxzaouBYV1+bSaoBp\nmEzlMgzf5+00D1vrX+1H9xt+wiPHJnl9vsV8y2fccwiTFBFhquQQxilXmgHHpxWdYGe7Iq59drph\nQhClFB2DKFHYphArhR8lhIliwrNZytO2smuwWe6GTJXcbcuznhU3WXJp9rJrrRZsjkwUObvUpexa\nXA0Cfu5gNUsBavp0/IiLqz0AjpSLWJagUBybLLHcjUfSVmDkPkQR+RTwKYA77rjjho83/PC+Wu9S\nLWR+v7lmloCqFKAUYbz1KquRgpVOQJgoxooprmlwtenjWOa2Rq63a9ydqhQTxVzTRwEHKw5hCkXH\noGgbhEmKbRpEScyl1R6/eHJmyzIM05/yPnsO7t0f4scJc00fUkUQpQQoTEOwDYNEpXTD7PfdKGW2\n4qBQvHylxWov4rG7Z3Y0aT1ViisNH9OAThgzVXJ4db5FoxdyaLzAqh/TjVIKdoofJZxd7vC+PKiy\nmeZhJ6pZmsp6gZa1fb07YdYZ0TaE2arLkQmPvzpfxzYE0zQpO5mFNnB3AEqpHe3LM9xa93LD59Jq\nN1eAKdWiSaoyJYkIZdfEj1KmygUqrkmjF5MqsM1sgPvOm4uDgWYrLSnWC6QZInz03hmWu3HehqPA\n+45ODtKAltpBHmQxODFd5uJqlzQFRECBUlCwDJq9zC992/VlVkp9Hvg8wKlTp264FvTww9sNkywp\nFWj5MYKiG6XEaTa12Q4JULKFJFWZpdQO+c1Hjmzri5v0LL7xWp00zdJrJksuRm6FNXsBp+daLHYC\nxos2SZrSDhUTJZujE0UW2xG9KGGu0SNJs5ft2KS3vYtaQ7MXcuekx1+8epU4VkQqxTIgiME0hDDO\nHvymH1O0DKIkZbEXcaBSoFa0aOStVG8kyNRXTM1eSNk1OVfv4jkmcZoy3/C5mlsYP11sA9n3USla\nFG2hG8UcnagMzj/84qJS4jTlfL3LgarL/mphkAayUYrHz/b1NjkyXmSpE/HcxVUeOlTjl+7fz/kV\nH9uA+ZZPN4hp9CJEhNeutjhY7U/hd2bKd3yqxLd+vMBcs4clQpykCNkqGVMUYpi0/BjHFN41U6Yd\nJkyXXcaLNqmCA9UCSmXW/vBA49qbDxJeLwfy+AYyf+eNBVpBRBCmzLV8/EgxWXYoWCbHZyoEUcLZ\neocHDtZ25D5tlZErxJ1m2BroO3X7JVUvrfoYSiGG4JgQb2HK3Mc0hFrRYTWICeKEw+NFxr2tv/jP\nnVviaz+6QtMPsQyDCc+m2Yv56L0znL7c4KW5Zm6NCZZhECUGRcugVnSYLrskiaITKSY8B8cUxj2H\nNxa7jO/AcsJ+2TFDhJmKzfkVH8c0ieOYNE3xEyiYCj9OKNgmYZxSck2QzH/W7EXb8qmulwv54qVV\nTh2u0Q1ijNwFYpsGQRQzt9qjFcZMeQ4l18EPExrdmCkvYXb8LcXTf3GzROBsVcnfuHc/Tj5tPrvc\nvW6Kx3p9vU3D5IPHa9im4EcJlYJNO2gRp4qCKbSjlIafTRvvGi/iuRavXG2y0o14/OSNW8+TZZdx\nz+Zq0+dcvUu1aPHhu6d4fb7FhbqPZ6eMew53TnqcPDBG1bVoBjHLnZBq0aZWtCnYbw00rm3iRwn1\nbsTRLQQJtxpI64UJcZxS70VEcUrFMUgSxYWVLrO1ApYh1DvhrvsKN+IdpxCHrYHZqjtYktf1A84s\ntVnuhViGIAIFE4LkrZSbzRDFiqVuyOFakZJjUfPsLWfXv7nQ5CvPX6JoGRyqefSizC9YsE2++foi\nl1a6XG70KLsW3TChaBsYZC5PzzFoBjFBCndNeSCCH6Xcs6+MbRo7ktLRv4eGYXB0soQSYaEZYFsG\nqUpxDKi4VmZpJwKSMlG0gexhXsqj79VifUupQGt9dVGi6IQJT/54gbJrs9z2iVMIk5RenNKOEzzb\nIlGZhRSrlFY3JlpQ/IZ37aPdt/QeOTZ5jYsC4OW5Bu8+cm3O4nA0+Hp9vVe7IS9eavDIsQnef2yC\nM8td6t2IO8omB6oFKgUb187rV4rQvAHruU//GTt9uUEvSjg6WWKilM2KpsoFlveHvPfo5OB7LLsm\nRdtkIkoyn2E+OBRtk24QUylk96PvV92t9JY3lzrM1opcbvQ44tqsdCPCKCZWCts0uLja48i4x0OH\naiNbvrdrUWYReQJ4BjgpIpdE5Dd361zD9B9exzJJFNy3v8qkZ/LS1TapgpJtMlZwsAyLyTyvcDP0\nS/hHCpY7Id0oIUoVd06WB5HhtdHI/lKktdHXp8/UsUQYKzoYhmAI9MKUiytd/DBi1Q9p+RFhnCnD\nxXZAO0wwBSquzcFqkYqbRTFt07gmpWMnlhP27+GR8SL1TsyBapH9lQLHpkqUCjY1z2HMy1ItCo45\nmCaHUcxPFtu4lsnJmfKG178RzV5IMVcejV7E6/MtpkoOUZI5l95Y6tIKIkQAFEGoKFoGBiqf0ioM\nyXpqv7HY/ZnzDh+/T9E2UcjAd9tnbaCl39f7voNj10RVz9Y7THh2lvzsuTx0eJxHjmXK1TENXOut\nV8y1DOJU3dB3NPyMzVRcGn6UuQ+CbLozvKx0+F1Y6YaZD3ONG6AfZOr/reeYu5be0nfFtIMEpRSV\ngkmoFEGsuP/AGNMll9maN9Ie47sZZf613Tr227HWjP/jvzzHiZkSc42AejsgTBLCNGah/ZaiI/8p\nkjl206FtrglRkm0zABMQEWrF7Pb1R9Q3lzaXXb/cDqh5NlGSYlsGTT+h5Bi0w4RerNhXKeAYBovt\nkErBYMJziJWCPOfx4cOZ3yaMdy9Pa7Ls8ncePsxTP1mg4Ud0gogkUZQdi4pjECuhXLAY8yw82+Li\nao+SY3N8qsz9B8cGCmO969+IYXfH5UaPom2gMDg+U2a5HWb3IUkZq9i4toUfJqRKoRAKpoFlGTiG\ncGSiNBikhs+7URDrxHRpEHG+3iqb9YII9U7IqcPX+rv6Sta2siT2voUYxClhnC3ve/K1q9taJTNs\nRc/Wivx4oUWaZqlQQZxwtelTcS0SxXVzQ/vXMuE5nFvuEMQJiYJ9FXfXVhj1XTF3TXvMt0JQMOVl\n2RFBklIt2iOvjvSOmzKvx3I74NCYx5VGQKoU9W6WJ5UqsAQClSk5Q8A0MuXXtyNEwDIyp72o7PcT\nZZf3HJnAMoTLjR626Q0CAJvJrp8su9Q7YZ6vlS2yj5ME2zTwHJOSk734SZpiGAZNPwaEX//5WU4d\nnRocZ7eXyk2WXR67eyZXvoo4TRlv+SQp2JYQxgor7xP94buzCPe45yDylt29lenXsMLp+BGOZeDH\ninv2lXmDDtMlm58sdji5r5JNkeOYc/Uek57FWNGiGypc2+CBg5V1z7vh8sIjmUXydike6wURjk+V\nOLPcJVnKfHGzYwVs0+DEdInVXsSlVZ8xlTll5ls+fqy4a7qy7fW5w8/YWNHh3XeM82zu32wXHaZK\nNq5lDXJDNzr28LUEcTKIMk+VC7tWRKF//w/XPJIUTIEkhaOTJQyRkStDuE0UYl8B2QY0wwTLEJRS\nGEb2YrgqoR2CYQi2kaVIpCpTkJD5GBVgm1n+1lTZIYgTvGJWBqyfy/XmEpvKrn/0zgm++sM5xos2\nvSjGz6ffH71nkgQhSrIlT4vtkMmixYRnM+45LHbia0b9m5Gn1T/XpGdlMufFJqI4JYhTHjo0TqXg\nDqzWG1ldMHxNKUKqGLgDPMenE6ScmC5jmQZhnHL3TIUD1QIXV32afhbgeveRcWZrpSwPbs153+6e\nbTWIsNwOuFDv0AoSxgomUZxweq7BwWqRx/MUqBcurvDGYicr1FF0uGOixP5qAdje+ty1Vu6h8RKW\nafDCxVXGCjbjQ6tG3m5Z3lvXsv6a751msuxyYtrj6TN1VtoBSoQjE0Wm8sDVqJUh3CYK8dE7J/i9\nb79JL1a4RpaSEKWKom1QcSzKnk29FRAlKathgm0Z7KvYKAXL3QiVKjxHGCvYfPDENKbIIJdrrZm/\nGavt+EyVTz6Y+RKX24qHD49TckwOT5Syl+pKk+VOyH0HKpRce8eDJtthuRvzwMEq9W6EiEE3TBjz\nhG6kePzk1q7/evRf0r41YZsGSmWJxZdXezxwcGxQOWXYuhsOHlwvAXonlxe+udRhf7XAZMnlcqNH\nN4gpuxbjnj04x0fetZ+PvCvb/8nXrt7w+tz1c/8M7jtQ5Y5xb9vW+c1guR3wxmKXu6ZK3H+guu5S\n1VFzWyjE4zNV9ldc5ls+tmVjChyuOBRti06YMOZaCELVtbDMbHpcKtgcrBY4u9ShUrCoFCyuNIIs\namhm1suJ6co1ynArVtvxmeo1LQj6kUM/Srhvf5U4SbFNE9s0ODrh5Unl6poSSzezPFKzF7KvUmB/\ntTjY1pdnO9f/dqw91lS5wCcfLA8SftceexSrGvrTV8+Rgc90+Dtay06sz93oHt+odX4zGGUR4c1y\nWyhEgKmyy2ytyImZiNOXW9iGkKoUhWKyXOC3Hj3I2eXuYK3q6/NtTEMouSb1bshY0eE9R2o0g4Tl\nbrihA3i7Fsjav+s7oDd6wG/2w7XZl3knLbD1jrVewu9On3ezbFXB7VSJtI2uda93aLzZRYS3w23T\nqP74dJlmEFMpODxwsJIviI85UCnwyQcPcnymOnjAx4rOYIpqmSaWYXBkoshszePohMeJ6Qq/dP+B\nXX0B1xZbWLu4faMUkp2q4r1VeXaDfpGOJ1+7yrPn6jeteMRm2eo9uV4azI2ym8feKfrv1zB7zYoV\npW54tdyOcerUKfXcc8/tyrGX2wHf+vECTT8iThWWIVQL9jWrBoanocOj7M3qsbuezBsleT97rv4z\nFmS/if17NyiMupvy7Ma51vsu9tpLvtd6guxlRvmdisjzSqlTb7vf7aIQYXMP763ygN8qCmO7jELh\na3afUb1fm1WIt40PETbnZxqFL2o73Ky0m1FxK/ibNFtnr79ft5VCfKex1x+uG2FUFZM1tze3TVBF\nc2sxiiCORqMVomZPcitETTXvPPSUWbNneSe7BDR7E20hajQaTY5WiBqNRpOjFaJGo9HkaIWo0Wg0\nOVohajQaTc6eWronIovA+VHLAUwBS6MWYggtz/XR8lyfvSYP3HyZjiilpt9upz2lEPcKIvLcZtY9\n3iy0PNdHy3N99po8sDdlAj1l1mg0mgFaIWo0Gk2OVojr8/lRC7AGLc/10fJcn70mD+xNmbQPUaPR\naPpoC1Gj0WhytEIcQkT+UEQWROTlUcsCICKHReTbIvKqiLwiIr89YnkKIvIDEflRLs9nRylPHxEx\nReRFEfnfe0CWcyLykoj8UER2r/z75uWpichXReR1EXlNRB4ZoSwn8/vS/9cUkd8ZlTzroafMQ4jI\nB4A28F+UUvfvAXkOAAeUUi+ISAV4HviEUurVEckjQEkp1RYRG3ga+G2l1F+OQp4huf4pcAqoKqU+\nPmJZzgGnlFJ7Iu9PRL4EfE8p9QURcQBPKbW6B+QygcvAe5VSeyH3GNAW4jUopb4L1EctRx+l1BWl\n1Av55xbwGjA7QnmUUqqd/9fO/410RBWRQ8DfBL4wSjn2IiIyBnwA+CKAUircC8ow53Hgp3tJGYJW\niLcMInIUeAh4dsRymCLyQ2ABeFIpNVJ5gN8HPgOkI5ajjwK+KSLPi8inRizLMWAR+KPcpfAFEdkr\nJcf/LvDEqIVYi1aItwAiUga+BvyOUqo5SlmUUolS6kHgEPAeERmZa0FEPg4sKKWeH5UM6/CoUuph\n4GPAp3M3zKiwgIeBP1BKPQR0gH85QnkAyKfuvwz82ahlWYtWiHuc3Ff3NeArSqn/Pmp5+uRTr28D\nHx2hGO8Hfjn32/1X4DER+fII5UEpdTn/uQB8HXjPCMW5BFwasuK/SqYgR83HgBeUUvOjFmQtWiHu\nYfIgxheB15RS/24PyDMtIrX8cxH4CPD6qORRSv0rpdQhpdRRsinYU0qp3xiVPCJSyoNf5FPTvw6M\nLGNBKXUVuCgiJ/NNjwMjCcit4dfYg9Nl0D1VrkFEngA+BEyJyCXgd5VSXxyhSO8H/h7wUu63A/jX\nSqm/GJE8B4Av5RFCA/hTpdTIU132EPuAr2fjGBbwJ0qpb4xWJP4J8JV8mnoG+AejFCYfKD4C/NYo\n5dgInXaj0Wg0OXrKrNFoNDlaIWo0Gk2OVogajUaToxWiRqPR5GiFqNFoNDlaIWq2hYjsE5E/EZEz\n+TK1Z0Tkb41AjnMiMrVm27N5NZULIrI4VF3l6BaO+5iIvG/o/18WkU/snOSavYjOQ9RsmTxh/M+B\nLymlfj3fdoRsOdbafS2lVHwz5VNKvTc/998nqzzzj9fbT0RMpVSywWEeI+sKN9JKPpqbi7YQNdvh\nMSBUSv2n/gal1Hml1L+HTBGJyP8UkaeAb0nG50Tk5bxW4K/m+31ouIahiPyHXIn1Lb/PisgL+d/c\nk2+fFJFv5vUYvwDIZoUWEUtEVkXk90XkNNla7EtDq2/eJyL/V0TuAv4h8M9zy/IX8kN8WES+n1vF\nN90a1uw+WiFqtsN9wAtvs8/DwCeVUh8EfgV4EPhrwC8Cn8trPb4dS3mhhD8A/lm+7XeBp5VS95Gt\nFb5ji7KPAd9VSv2cUuqZ9XZQSv2UrJzY55RSDyqlvp//aoZs9dAngH+7xfNqbgG0QtTcMCLyHyWr\nov1XQ5ufVEr1a0s+CjyRV8qZB74DvHsTh+4Xs3geOJp//gDwZQCl1P8BVrYobkimSLfDn+c1IU8z\nwrqUmt1DK0TNdniFoaopSqlPkxUOmB7ap7OJ48Rc+wwW1vw+yH8m7Jy/u6euXa86LMPa868lGPq8\n6am65tZBK0TNdngKKIjIPxra5l1n/+8Bv5oXl50ms/J+AJwH7hURN/fjPb6Jc38X6AdyPgaMb+cC\nhjgH/Hz++W8PbW8BlRs8tuYWQ0eZNVtGKaXyFJTfE5HPkFVl7gD/YoM/+TrwCPAjsorSn8lLUyEi\nf0pWIuss8OImTv9Z4AkReQX4PnDhRq4F+DfAfxaRVTJl2+d/AH8mIr8CfPoGz6G5RdDVbjQajSZH\nT5k1Go0mRytEjUajydEKUaPRaHK0QtRoNJocrRA1Go0mRytEjUajydEKUaPRaHK0QtRoNJqc/w8s\nF+R9j2FQAQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f3a0315af10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"plt.figure(figsize=(5, 4))\n",
"\n",
"plt.scatter(jitter(dev.Category, 0.15),\n",
" jitter(dev_predicted, 0.15),\n",
" color='#348ABD', alpha=0.25)\n",
"\n",
"plt.xlabel('Ground Truth')\n",
"plt.ylabel('Predicted')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment