Skip to content

Instantly share code, notes, and snippets.

@rschroll

rschroll/NLTK_vs_spaCy.ipynb Secret

Last active Feb 17, 2020
Embed
What would you like to do?
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# NLTK vs. spaCy\n",
"\n",
"There are two major natural language processing packages available for Python. [NLTK](http://www.nltk.org/) is the incumbent. It provides a wide variety of NLP tools and interfaces to a number of corpuses. It is perhaps more academically focused, letting you mix and match algorithms as you prefer. [spaCy](https://spacy.io/) is the new kid on the block. It is focused more towards industrial use, providing the best-of-breed algorithms. These may be updated or replaced as development continues as the state of the art advances. This will give you the best available algorithms at any given time, at the cost of reproducability. spaCy also seems to be significantly faster on many tasks.\n",
"\n",
"Here we show how to accomplish a few basic tasks in both toolkits. But first:\n",
"\n",
"## Installing spaCy\n",
"\n",
"spaCy is available in conda:\n",
"```\n",
"$ conda config --add channel conda # Only needs to be done once\n",
"$ conda install spacy\n",
"$ python -m spacy.en.download # Downloads language model\n",
"```\n",
"It appears that this version of spaCy requires numpy >= 1.10. The download will fail if your version of numpy is too old.\n",
"\n",
"## Importing\n",
"\n",
"### NLTK\n",
"\n",
"Different components of NLTK can be imported separately. For example, to load the tokenizer:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import nltk.tokenize"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### spaCy\n",
"\n",
"In spaCy, we import a single class and then instatiate a singleton to do the processing:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from spacy.en import English\n",
"nlp = English()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"At the moment, only English is supported.\n",
"\n",
"## Tokenizing\n",
"\n",
"Tokenizing is the process of splitting input text into sentences or words."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"text = (\"This is a bunch of text. It contains a few sentences, all together. \" +\n",
" \"Your basic, run-of-the-mill paragraph.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### NLTK\n",
"\n",
"NLTK provides functions that take strings and returns lists of strings, either sentences or words."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['This is a bunch of text.',\n",
" 'It contains a few sentences, all together.',\n",
" 'Your basic, run-of-the-mill paragraph.']"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nltk.tokenize.sent_tokenize(text)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['a', 'bunch', 'of', 'text']"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nltk.tokenize.word_tokenize(text)[2:6]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### spaCy\n",
"\n",
"spaCy parses the text and tokenizes at both the sentence and word level. The document acts as a list of words, and it has a `.sents` atrribute that generates the sentences. It only works on unicode strings."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"spacy.tokens.doc.Doc"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"doc = nlp(unicode(text))\n",
"doc.__class__"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"a bunch of text"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"doc[2:6]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"This is a bunch of text.\n",
"It contains a few sentences, all together.\n",
"Your basic, run-of-the-mill paragraph.\n"
]
}
],
"source": [
"for sentence in doc.sents:\n",
" print sentence"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Both words and sentences are spaCy objects. Each has a `.text` attribute that gives a unicode string."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(spacy.tokens.token.Token, spacy.tokens.span.Span)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"doc[0].__class__, doc.sents.next().__class__"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(u'This', u'This is a bunch of text.')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"doc[0].text, doc.sents.next().text"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stop Words\n",
"\n",
"Stop words are common words that are often omitted when text is analyzed. Both toolkits provide lists of stop words.\n",
"\n",
"### NLTK"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'a',\n",
" u'about',\n",
" u'above',\n",
" u'after',\n",
" u'again',\n",
" u'against',\n",
" u'all',\n",
" u'am',\n",
" u'an',\n",
" u'and']"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(nltk.corpus.stopwords.words('english'))[:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### spaCy\n",
"\n",
"spaCy provides stop words as a set."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'a',\n",
" u'about',\n",
" u'above',\n",
" u'across',\n",
" u'after',\n",
" u'afterwards',\n",
" u'again',\n",
" u'against',\n",
" u'all',\n",
" u'almost']"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from spacy.en import STOPWORDS\n",
"sorted(STOPWORDS)[:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The spaCy word tokens have an `.is_stop` attribute."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"This True\n",
"is True\n",
"a True\n",
"bunch False\n",
"of True\n",
"text False\n"
]
}
],
"source": [
"for i in xrange(6):\n",
" print doc[i], doc[i].is_stop"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stemming and Lemmatization\n",
"\n",
"These are related techniques for reducing words to a standardized root."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"words = u\"carry carries carrying carried eat eating eaten ate\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### NLTK\n",
"\n",
"NLTK provides a variety of stemmers and lemmatization. Here are two:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'carri', u'carri', u'carri', u'carri', u'eat', u'eat', u'eaten', u'ate']"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stemmer = nltk.stem.SnowballStemmer(\"english\", ignore_stopwords=True)\n",
"[stemmer.stem(w) for w in words.split()]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'carry',\n",
" u'carry',\n",
" u'carrying',\n",
" u'carried',\n",
" u'eat',\n",
" u'eating',\n",
" u'eaten',\n",
" u'ate']"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lemmatizer = nltk.stem.wordnet.WordNetLemmatizer()\n",
"[lemmatizer.lemmatize(w) for w in words.split()]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### spaCy\n",
"\n",
"Word tokens have a `.lemma_` attribute. (They also have a `.lemma` attribute that gives a numerical value.)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'carry', u'carry', u'carry', u'carry', u'eat', u'eat', u'eat', u'eat']"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[w.lemma_ for w in nlp(words)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part-of-speech Tagging\n",
"\n",
"A common classification scheme for parts of speech is the [UPenn Treebank Tags](https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html)."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"sentence = u\"The quick brown fox jumped over the lazy dog.\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### NLTK"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[(u'The', 'DT'),\n",
" (u'quick', 'JJ'),\n",
" (u'brown', 'NN'),\n",
" (u'fox', 'NN'),\n",
" (u'jumped', 'VBD'),\n",
" (u'over', 'IN'),\n",
" (u'the', 'DT'),\n",
" (u'lazy', 'JJ'),\n",
" (u'dog', 'NN'),\n",
" (u'.', '.')]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nltk.pos_tag(nltk.tokenize.word_tokenize(sentence))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Help about those tag names is available:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"NN: noun, common, singular or mass\n",
" common-carrier cabbage knuckle-duster Casino afghan shed thermostat\n",
" investment slide humour falloff slick wind hyena override subhumanity\n",
" machinist ...\n",
"NNP: noun, proper, singular\n",
" Motown Venneboerger Czestochwa Ranzer Conchita Trumplane Christos\n",
" Oceanside Escobar Kreisler Sawyer Cougar Yvette Ervin ODI Darryl CTCA\n",
" Shannon A.K.C. Meltex Liverpool ...\n",
"NNPS: noun, proper, plural\n",
" Americans Americas Amharas Amityvilles Amusements Anarcho-Syndicalists\n",
" Andalusians Andes Andruses Angels Animals Anthony Antilles Antiques\n",
" Apache Apaches Apocrypha ...\n",
"NNS: noun, common, plural\n",
" undergraduates scotches bric-a-brac products bodyguards facets coasts\n",
" divestitures storehouses designs clubs fragrances averages\n",
" subjectivists apprehensions muses factory-jobs ...\n"
]
}
],
"source": [
"nltk.help.upenn_tagset('NN.*')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### spaCy\n",
"\n",
"spaCy gives the UPenn tags in the `.tag_` attribute, as well as a broader label in the `.pos_` attribute."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[(The , u'DT', u'DET'),\n",
" (quick , u'JJ', u'ADJ'),\n",
" (brown , u'JJ', u'ADJ'),\n",
" (fox , u'NN', u'NOUN'),\n",
" (jumped , u'VBD', u'VERB'),\n",
" (over , u'IN', u'ADP'),\n",
" (the , u'DT', u'DET'),\n",
" (lazy , u'JJ', u'ADJ'),\n",
" (dog, u'NN', u'NOUN'),\n",
" (., u'.', u'PUNCT')]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[(w, w.tag_, w.pos_) for w in nlp(sentence)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Performance\n",
"\n",
"To compare performance, we'll have both toolkits analyze the text of the Wikipedia article on apples:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from bs4 import BeautifulSoup\n",
"import re\n",
" \n",
"with open(\"apple_fruit.txt\") as wiki_file:\n",
" soup = BeautifulSoup(wiki_file.read(), 'html.parser').find(attrs={'id':'mw-content-text'})\n",
" apple_text = '\\n'.join(''.join(re.split('\\[\\d+\\]', p.text)) for p in soup.find_all('p'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By default, spaCy will do part-of-speech tagging, sentence parsing, and named entity detection. For comparison purposes we will turn these on only as appropriate.\n",
"\n",
"### Tokenizing Words\n",
"\n",
"spaCy beats NLTK by an order of magnitude."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10 loops, best of 3: 61.4 ms per loop\n"
]
}
],
"source": [
"Nw = %timeit -o nltk.tokenize.word_tokenize(apple_text)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The slowest run took 4.33 times longer than the fastest. This could mean that an intermediate result is being cached.\n",
"100 loops, best of 3: 4.62 ms per loop\n"
]
}
],
"source": [
"Sw = %timeit -o nlp(apple_text, tag=False, parse=False, entity=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tokenizing Sentences\n",
"\n",
"This time spaCy is an order of magnitude slower. However, it is actually constructing a syntactic tree for each sentence, while NLTK is just splitting the text. This isn't quite a fair test."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 16.2 ms per loop\n"
]
}
],
"source": [
"Ns = %timeit -o nltk.tokenize.sent_tokenize(apple_text)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10 loops, best of 3: 96.3 ms per loop\n"
]
}
],
"source": [
"Ss = %timeit -o nlp(apple_text, tag=False, parse=True, entity=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tagging Parts of Speech\n",
"\n",
"Here too, spaCy is an order of magnitude faster."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 loop, best of 3: 440 ms per loop\n"
]
}
],
"source": [
"Np = %timeit -o nltk.pos_tag(nltk.tokenize.word_tokenize(apple_text))"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10 loops, best of 3: 21.9 ms per loop\n"
]
}
],
"source": [
"Sp = %timeit -o nlp(apple_text, tag=True, parse=False, entity=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Visualization"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"import pandas as pd\n",
"from matplotlib import pyplot as plt\n",
"import seaborn"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\nr+rZs6d27NjhMn7YsGHq16+fIiIilC9fPgUFBcnPz087duzQ8OHD9eqrr+rWrVsuxxmGoStXrqhP\nnz6Ki4tT/fr1lTdvXkdgYw8SQkJCFBIS4nSb/YIFC/TPf/5TK1euVJYsWVSnTh0VLlxYe/fu1ciR\nI/XSSy8pPj7eZT7DMHTr1i29/vrrio6OVt26deXj43PXNbub8PBw9e7dWxs3bpS3t7fq168vf39/\nRUVFadq0aerYsaPOnz+f5vNOnTpV77//vkzTVO3atZU/f37t3r1bb775pubOnesy/qefflK7du20\naNEi/fXXX6pdu7b8/Px07NgxTZ48WR06dHAKNYKCglSpUiWZpunYDDUkJET58+dXSEiIY7PSfPny\nOfru3Cj1nXfe0RtvvKEtW7aoUKFCqlu3rnLmzKkNGzaoV69eGj9+fIrXZRiGjh07poEDBypbtmyq\nX7++ywaszZs3l2maWrVqVZrXDQAyNBMAAJhjxowx/f39zRdeeOGu406fPm36+/ubNpvNPHPmjKM9\nLCzM9Pf3Nxs2bGi2a9fOvHz5sqNv3bp1pr+/v1mxYkUzNDTUnDZtmtM5+/bta9psNrNnz55O7V27\ndjVtNpsZFhaW4vzBwcHmjBkznI5Zvny5o//QoUOO9osXL5pVq1Y1bTab+cEHH5jJycmOvvnz55vV\nqlUzGzRoYNpsNnPZsmWOvgkTJpj+/v5m165dzbi4OKe5NmzYYFauXNmsXLmy0/XezSeffOI4X2q6\ndu1q+vv7mwEBAWZ4eLj5559/Wjq33ZAhQ0x/f38zJCTEbN++vXnhwgVH36VLl8ynnnrKtNls5uuv\nv+503KJFi0x/f3+zatWq5oYNG5z6fv/9d7NOnTqmzWYzp06dmmK9zZo1M//1r3+51LN9+3bHv8nf\n7d2716xUqZIZGBho/vjjj059hw8fNlu2bGnabDZz7NixKV5js2bNzNdee81MTEy0tDamaZpLly41\n/f39zaZNmzrarl+/bgYEBJg2m81cv3690/jY2FizR48eps1mM0eNGpWmOapVq2bWrVvX3L17t1P/\nyJEjTX9/f7N69epmTEyMo/3s2bNm9erVzYoVK5pz5851OubMmTNmp06dTH9/f7NPnz73vCY7++9m\nSr/bM2fOdKzjkSNHnPrWrl1rVqtWzbTZbOa6deuc+oKDg02bzWY2a9bM/Pzzz1Ndh6ioKMe/fXR0\ndKrjACCz4Y4EAAAeoIsXL2rEiBHKnz+/o61Zs2YqWLCgTNOUp6en49lpu44dO8o0Te3fvz9Nc1Wo\nUEHdu3d3amvbtq1j7t9++83R/sMPPyg+Pl5PPPGEhg4d6nTnQefOndWyZUtdunTJZY6DBw/KMAyF\nhoa6fNvauHFjjRo1yvE4hxV79+6VYRgKCAhIdcywYcPk7e2txMRETZo0SUFBQXrllVf02WefKTIy\n0vJcZ86c0bhx45y+pS9QoIA6deok0zR1+PBhp/EzZsyQYRh66aWX1LhxY6e+SpUqqW/fvo5HM5KT\nk13mu3z5st555x1Ltdl9/vnnSk5OVs+ePdWiRQunvvLly2vs2LEyTVMLFy50uSvBfo3Dhg1z3MVx\nv44dO6Zbt24pX758LneK5MqVS6NGjVL//v1Vv379NJ03Pj5e3bt3V9WqVZ3aBw0apDx58iguLk7r\n1q1ztM+aNUs3b95U27Zt1aVLF6djihYtqkmTJsnDw0M//fSTTp8+nbaL/JvExET95z//kWEYGjdu\nnMqVK+fUHxISol69esk0Tc2aNcvleNM0lZycrF69eqU6h5+fn2MDyH379v1P9QJARkKQAADAA1Sw\nYEEFBga6tBcvXlySUnynfLFixSRJV69eTdNcbdq0SbHdz89P0u29Dex27twp6far/7y8vFyO6dSp\nU4rnyps3r0zT1H//+1+XZ9MlqX379urSpYt8fX0t1RwVFSXp9vPjqbHZbFq4cKGCg4Mdt+///PPP\n+ve//62uXbuqTp066tu3r9avX3/XuWw2m/z9/V3aS5QoIel26GMXHR2tP/74Q5IUGhqa4vnsH/Rj\nYmJcQghJqlq1qnLmzHnXmu6UmJioiIgISUrxlaSSVKNGDeXPn1/x8fGOf8M7FS9e3PGz9b+wPx5y\n9erVFPePKFy4sHr37q2mTZum+dxPPfWUS1v27NkdG23eGXitX79ehmGkuh5FixZVxYoVJemu+1xY\nsXfvXl2+fFl58+ZV7dq1UxzTvHlzSbd/fxISEpz6DMPQk08+ec957D9v9p99AHgU8PpHAAAeoNQ+\n1GXNmjXVfvsH+5Q21bsbe2CQ2vnu/OBz+vRpGYahUqVKpXhM5cqV5enp6VLD888/r7Vr1yoiIkKh\noaFq27atGjRooGrVqsnTM+3/N+Ly5cuSpEKFCt11XMmSJTV9+nRFR0drzZo12rZtm3bt2qVr164p\nPj5e69at07p161SrVi2FhYUpX758LudIbX1y5colSU7ByNGjRyXd/nD492+m7Xx9fZUzZ07FxcXp\n+PHjstlsjj7DMCyHKXanTp1SXFycDMPQhAkTXO74sLPfgfHHH3+43BGQ1jlTU6ZMGTVs2FARERHq\n0aOHGjdurBYtWujJJ5/8n+bIli2b44P03/n5+ck0TZ05c0bS7Z/XkydPyjAMffnll1q6dGmKx50/\nf16maTqCn/tlD4MSEhLUp0+fFMfYfx+Sk5MVFRXl8rNhZW18fX21b98+3twA4JFCkAAAwANkDwzu\ntz8tUrqzIDX2NyHkzZs3xf6sWbPqiSeecHzQt6tVq5amTp2q0aNH6/Tp0/r000/16aefKmfOnGrc\nuLHjDRBW2W/Pz5Ejh6XxRYsWVbdu3dStWzdJtz/8bdmyRUuXLtWRI0e0Y8cODRw4UDNnznQ5Ni13\nB9jXJ1u2bHcNSHLnzq24uDhdu3bNpS+1tU3Nn3/+6fjzli1b7jk+pdcbpnXOuwkLC9OIESO0YsUK\nrV+/Xv/9738l3X7Eok2bNurSpYsjhLHqbvXZz3Xjxg1JzuuR0t0XdzIMI9XXPVplny8+Pt5xranN\nZRiG42fkTlbW3x4QpfYmFQDIjAgSAAB4jNztLRCpady4sRo2bKjNmzdr/fr12rx5s6Kjo7Vq1Sqt\nWrVKL7/8sgYPHvwQqnVVoUIFVahQQd26ddP48eM1c+ZMbdu2TTt37lSNGjXu+7xW18X8v7cvZMni\n+nRoSm1W59y4ceM979JISVrnvJvs2bNr3Lhx6tu3r9auXatNmzYpMjJSR48e1eTJkzVv3jx9+eWX\nKlu27AOpz76W9nW4cz3mz5+v6tWr3+eVpE2JEiX0448/3texD3L9ASAz4X/9AAB4DNi/nU/tW9yk\npCSnb4T/LkuWLGrcuLE++OAD/fTTT1q+fLnat28v6fYGeVa+UZce7LezAwYMcNzZcOTIkf/pXPZv\nluPj4++6meO97uxIiyeeeMLx5zv3a3C3YsWKqVu3bvryyy+1fft2ffjhh/L19dWFCxf03nvvpelc\nKX2Lb2e/EyF37tySbq+pPUxIj/WwPw7zsOey/6xbvQsHADIDggQAAB4DRYoUkSTH8+h/9/vvv1t+\nG4Ik+fv7a9y4cWrZsqUka7fmS7ffmiAp1efFly5dqqFDh6b6fPydvLy8HB/OsmXLZmn+1JQvX97x\n59RCiVOnTjkezbhz/P3y8/N7YEHIw5IjRw61bdtWM2bMkGma+u2331J8e0Rqbt68qfPnz6fYFxUV\nJcMwHHsoeHl5OfbwSGkzywetQoUKkm5/0I+Ojn5o89h/1u/njhMAyKgIEgAAeAwEBATINE1t27bN\ncUv5nb7++muXtkuXLmnMmDEaOnRoquctWrSoTNO0/OHS/qHx5MmTKfb//PPPWrZsmT799NN7PgO/\nd+9excTESJKqVatmaf7U+Pr6Ot7w8P3336c45ocffpB0+5rTcnv/nbfs37n2WbJkUcOGDWWaphYt\nWpTisdeuXVOHDh00YcKENG/GmRbff/+9BgwYkOqbEIoWLSrpdv0pvb3jblJ6bODGjRvasWOHJDk9\nktKkSROZpqnly5crMTHR5bikpCR17txZI0eOdNqnwr7GKb2W0+7vfQEBASpYsKAkaeHChSkes3Xr\nVnXs2DHVfivsb2tIbdNJAMiMCBIAAHgMPPXUU8qSJYvOnTunsLAwp76vv/5aGzZscLrVXrp9q/n3\n33+v5cuX69NPP3X5YHfs2DGtWLFChmGoXr16luoIDAyUaZrat29fiv39+vVTzpw5dfr0aXXr1k37\n9+93GZOUlKR169apX79+MgxDoaGhLm+juJ+9IF599VWZpqm5c+c6XstoFxkZqfDwcBmGoZ49e6bp\nvN7e3o4///777059PXv2lIeHh3bu3Knx48c7hQUXL15Unz59tH//fh06dEgeHh5pviarLl68qFWr\nVmnEiBE6ceKEU19ycrLjZ8bf39/peu4lV65cCg8Pd7ru5ORkffjhh7px44by5s3r9ErJF198UTlz\n5tSZM2c0ePBgp4Dq+vXrGjRokHbt2qXt27c7PV5ir+nixYu6dOmSUw32n+s//vjD6XweHh7q0aOH\nTNPUF198oVWrVjkdt2/fPg0ePFh79uxJ86tZ7U6dOuV4ZCggIOC+zgEAGRGbLQIA8BgoU6aMXnzx\nRc2ePVvTp0/XypUrVbp0aUVFRenUqVP6+OOPNW7cOKd9Ery8vDRy5Ei9+eabmjJlimbPnq3y5csr\nZ86cunTpkg4cOCDTNBUaGqqQkBBLddSvX1/Tpk3Tb7/9pps3b7q8WaFUqVIKDw/XgAED9Pvvv6tD\nhw4qWrSoSpYsqWzZsunKlSs6efKkrl69KsMw1Lx5c40bN85lnpTuuriXVq1aaefOnZo3b5569Oih\n0qVLq2jRojpz5oxOnDghwzDUoUMHderUKU3zlSpVSgUKFFBMTIy6du2qYsWK6cknn9R7772nKlWq\n6L333tPo0aM1a9YsrVixQjabTbGxsdq/f79u3bolPz8/jRo1Ks3XkxbPP/+81qxZo127dik0NFQV\nKlSQr6+vEhISdOTIEV2+fFl58uTRyJEj03TeQoUKqXXr1nruuedUuXJl5c+fX0eOHFF0dLQMw9Dw\n4cOd3gRRpEgRTZw4UQMGDNAPP/ygiIgIBQQEKD4+XgcPHtSNGzeUL18+TZo0yWmegIAAeXl56dat\nW2rZsqUKFy6s9u3bq0ePHo47HmJiYtSkSRPly5dPffv2VevWrfXSSy9p//79WrFihQYMGKCwsDAV\nK1ZMFy5c0KFDh2QYhoKCgtS9e/f7Wteff/5ZklS6dGnH40UA8CggSAAA4P/YX/Nmdez/crzVcz6I\nsXZDhgyRn5+fFi5cqJMnT+rmzZuqUqWKxo8fr8DAQI0dO1aSnF5/GBISosWLF2vhwoXatm2bDh06\npJs3b8rb21tBQUFq166dWrVqZbmGGjVqqHDhwjp//rzWr1+v1q1bu4ypVauW1qxZo2XLlmnTpk06\nfPiwdu3apcTEROXMmVNFixZVy5Yt1aZNm1RfPXmvf4vU+t977z3Vr19fCxYs0L59+3Tq1CnlzZtX\njRs31nPPPZdqYHK3+by8vDRx4kSNGTNGUVFRunr1qtPz8p07d1ZgYKBmzZqlyMhIbd++XVmzZlXZ\nsmXVvHlzvfTSSym+dvF/+Xn7+7FeXl6aPXu2lixZolWrVunEiRP6448/5OHhoWLFiqlNmzbq1q2b\nChcunKY5smbNqj59+qhIkSL6+uuvFRkZKUmqXbu2Xn31VQUFBbkc17RpU3333XeaMWOGtm7dqsjI\nSBmGoeLFi6tx48bq3r27Y68NOx8fH40bN07//ve/de7cOV2/ft0xplKlShoyZIhmzZqlmJgY5cqV\ny3GXgmEY+uijj9SsWTMtXrxYv//+u6KiopQrVy7VrVtX7du3V7t27dK8vnZr1qyRYRhp+h0BgMzA\nMO8nsgcAAI+c6tWrKz4+Xl988YUaNGjw0OYJDw/X5MmTVbt2bX311VcPbR7AnaKiotSyZUt5enrq\np59+YrNFAI8U9kgAAOAxcP36da1evVpffPGFEhISXPp3796tuLg4GYahihUrPtRaunTpooIFCyoy\nMtLxDTXwqJk6daokqWPHjoQIAB45BAkAADwGDMPQu+++q4kTJ+rjjz922sE+JibG8ex7kyZNlD9/\n/odaS65cufT222/LNE19+OGH97WfAZCR7dmzRytXrlSBAgXUt29fd5cDAA8cjzYAAPCYWLFihYYM\nGaKkpCT5+PioQoUKio2N1aFDh/TXX3+paNGimj9/vnx9fdOlnv79+2vt2rXq16+fXn/99XSZE3jY\n4uPj1aFDB504cUKffvqpGjdu7O6SAOCBI0gAAOAxEhkZqTlz5mj37t2KiYmRl5eX/Pz8FBwcrG7d\nurm8AvJhunnzpjp16qRjx44pPDz8oe7LAKSXQYMGaeXKlerfv7969+7t7nIA4KEgSAAAAAAAAJax\nRwIAAAAAALCMIAEAAAAAAFhGkAAAAAAAACwjSAAAAAAAAJZ5ursAwKqLF6+7u4THho9PHkmseXpj\n3dMfa57+WHP3YN3TH2ue/lhz92Dd0599zd2JOxIAAAAAAIBlBAkAAAAAAMAyggQAAAAAAGAZQQIA\nAAAAALCMIAEAAAAAAFhGkAAAAAAAACwjSAAAAAAAAJYRJAAAAAAAAMsIEgAAAAAAgGUECQAAAAAA\nwDKCBAAAAAAAYBlBAgAAAAAAsIwgAQAAAAAAWEaQAAAAAAAALCNIAAAAAAAAlhEkAAAAAAAAywgS\nAAAAAACAZQQJAAAAAADAMk93FwAAAAAAcPZqn746d/GKu8u4p5LFffT1VzPcXQbSGUECAAAAAGQw\n5y5eUYEar7i7jHs6s2fWAznPrl071L//a5KkCRM+Ub169e86rnv3Xnr55Z6SpIYNa8vb+wmtXLn2\nrnOMGjVca9astlSPYRhauvR7FSzoo5Ejh2vt2tWaNClMderUcxm7efMGDR8+RIUK+WrKlM9VuHBh\nS3NkZgQJAAAAAIAMwTAMTZw4Tl99tVA5cuR4oOd+7rnn1ahRsFPb3LmzdejQAfXs2VslSpR06sub\n1/v/arpdV0oiIjbpX/96V4ULF9GUKZ+pUCHfB1pzRkWQAAAAAADIEGrXrqdff92m6dOn6K23Bj/Q\nc9tsFWWzVXRqW736Bx06dEDVqtVQlSpV03S+rVsj9P77t+9ECAv7XD4+hR5kuRkamy0CAAAAANzO\nMAyFhLRQvXr19d13S/Xbb7vdXVKqtm/fqmHDBqtQocKPXYggESQAAAAAADIA0zQlSW+/PVTZs2fX\n+PGjdOvWLTdX5erXX7fp3Xfflq+vr6ZOffxCBIkgAQAAAACQgRQq5Kvevfvp1KkozZjxubvLcbJj\nx68aOvRt+fj4KiwsXAUL+ri7JLcgSAAAAAAAZCjt2j2rqlWra8GCuTpy5JC7y5Ek7dwZqSFDBioh\nIUG+voWVL18+d5fkNgQJAAAAAIAMZ/Dg9+Th4aFx40YqOTnZrbWYpqn58+eoSpVqatashXbu/FXj\nx492a03uRJAAAAAAAMhw/PxK6OWXe+rIkcOaN2+2W2sxDEOdOnXR5MlhGjbsA1WtWl2rVq3Ul1+G\nu7UudyFIAAAAAABkSJ07v6Dy5f01a9YXioo66dZaatWqK0ny9PTU2LETVKyYn2bN+kKrVq10a13u\nQJAAAAAAAMiQPDw8NHTocCUlJWn8+NGONzu4W9683pow4d/KkyePPvpojCIjf3F3SemKIAEAAAAA\nkGGVL++vzp1f0J49u7V06UIZhuHukiTdfvRi9OiPJEnvvTdYx48fdXNF6cfT3QUAAAAAAHA3L7/c\nUxs3/lcbN65PMUhITLylDRt+SvX4OnXqKWfOXA+8rurVa+qdd4Zp7NgRevvtN/T55zPl41Pogc+T\n0RAkAAAAAEAGU9gnn87tnOHuMu6pZHGfB3auu91p4OXlpSFDhqtfv1ddHm8wDEM3b97U++8PTfX4\nL7+cp3Llyj+wWu8UGvq0Tp8+pa++mql33nlT06Z9oZw5cz6UuTIKw8woD5kA93Dx4nV3l/DY8PHJ\nI4k1T2+se/pjzdMfa+4erHv6Y83TH2vuHqx7+rOvuTuxRwIAAAAAALCMIAEAAAAAAFhGkAAAAAAA\nACwjSAAAAAAAAJYRJAAAAAAAAMsIEgAAAAAAgGUECQAAAAAAwDKCBAAAAAAAYBlBAgAAAAAAsIwg\nAQAAAAAAWEaQAAAAAAAALCNIAAAAAAAAlhEkAAAAAAAAyzzdXQAAAAAAwNlrA3rq/JXz7i7jnkoU\nLqb5M+a6uwykM4IEAAAAAMhgzl85r6Iv2txdxj1Fzz/s7hLgBgQJAAAAAAD8n7/++ksrVy5XRMQm\nHTt2VLGx15UnTx75+PiqQYOGatWqjXx9C7u7TLciSAAAAAAAQNLhwwf17ruDdOHCedWqVUddu3ZT\nvnz5dPnyJe3evVMzZ/5HCxbM1dCh76tJk2buLtdtCBIAAAAAAI+9c+fOacCAPkpISNCHH05W/fpB\nTv2dOnXVnj279c47AzRy5HD5+ZVU2bLl3FStexEkIFPo/MIrOnn6orvLeGx4enpIkhITkx74uQv7\n5NPn06aH52grAAAgAElEQVQ+8PMCAAAg80pKStLy5Yu1evX3Ons2WnFxcSpQoKDq1HlS3bq9ooIF\nfbRr1w717/+aWrf+h9q1e0affjpVhw7tV1JSksqX91ePHq+pRo1aTuc9cuSQ5syZqX379ujKlRhl\nzeql0qXLqEOH5/TUU62dxn766RRdv35dAwa84xIi2AUGVtOAAYMUGfmLEhL+0pEjh9W9exdVqVJV\n06d/4TL+9OlT6ty5Q6r9mRVBAjKFM+diVKDGK+4uAw/AuZ0z3F0CAAAAMphPPpmoZcsWq2nTELVv\n/5w8PbPq6NFDWrJkobZv36K5cxc6xkZFndSQIW8pNPRptW7dRmfPRmv+/Dl6++3+CgsLV+XKAZKk\nkydP6LXXuitbtuzq3PkFFS1aVFevXtG33y7VmDEfKD4+Tu3aPStJiouL08aN/1XevN5q06bdXWtt\n2bKVWrZs5fh7xYqVtW/fHkVFnVCJEqWcxv744w8yDENt23Z4QCuVMRAkAAAAAADcas2aVSpduoxG\njBjnaGvR4ilVqhSgH35Yoaiok472ffv2aMyYj9SwYRNHW8mSpTR8+BDNmTND48d/LEk6evSIAgKq\nql27DgoODnGMbdQoWB06tNaCBfMdQcLBg7fvbAgMrCZPz7R9TG7X7hmNG/e7Vqz4Vn36vOHU99NP\na5QrV+5Hbj+FLO4uAAAAAADwePP09NSFCxd0+vQpp/YmTZrpo4/+rfLl/R1t+fMXcAoRJKlhwybK\nli2bfvttt6OtWbPm+uST6Y4QIT4+XrGxscqePYdy5cqtc+eiHWNjYmIkSYUK+aa59mbNWih37jz6\n8ccflJiY6Gg/ePCATp2KUsuWocqWLVuaz5uRcUcCAAAAAMCtevTorcmTx+uFF/6p2rXrqWbNWqpZ\ns47KlSvvMrZ06TIubR4eHsqfv4DOnTurhIQEeXl5SZJWrlyupUsX69Spk4qPj3c6xjAMlz+bZnKa\na8+WLZueeqq1liz5RhERGx13H6xdu0qGYejpp+/+qERmRJAAAAAAAHCrdu2eUZkyZbVo0QL9+us2\nbdv2s0zTVIkSJdW7dz8FBTV2jM2VK1eK57C3x8ZeV/78BTRr1heaMeNz+foW1iuvvKqSJUsrR44c\nkqQhQwbq5s2bjmN9fHwkSWfPRrue2GL9ixcv0IoV36pJk2YyTVP//e86+ftXTDEMyewIEgAAAAAA\nbhcYWE2BgdWUlJSk/fv3KSJik5YvX6xhw95RWNjnjnF/v7PALjb2hiQpb15vJSUlacGCucqa1UtT\np/5HhQsXdoxLTk5WQsItp2P9/SvKy8tLe/bsVnx8vLJnz37XWq9evaonnnjC8feSJUupatXqiozc\nrpiYy/rjj+O6dOmiXnmlV5rXITNgjwQAAAAAQIbh4eGhKlWqqnfvfho+fJSSk5O1ceN6R//Jkydc\njomPj9fly5eUN29eeXp66s8/r+rGjRvy8yvhFCJI0m+/7dKtWwlObV5eXmrZspVu3rypr7/+6q71\nbdkSofbtQ/XNN/Oc2tu1e0amaWrdujVavfp75ciRU82atUzj1WcOBAkAAAAAALc5eHC/OnfuoOXL\nl7j02e8MsO95IEnnz5/Ttm1bnMZt2PCTbt1KUI0atSVJ3t5PyMPDQ5cvX3TaAPHatT81ffoU5cyZ\nU5KUkPD/A4WePXsrX758mjPnS61c+W2Kte7cGakRI4Ypa1Yv1a/f0KmvSZNm8vZ+QqtWrdCGDf9V\nSEgLx6MUjxoebQAAAAAAuE358v7Knj27Pvlkog4dOqiAgCry8vLSmTOntWzZYuXKlVutW/9DFy9e\nkCRVrhygjz4ao5CQlipbtpzOno3W119/JS8vL73wwsuSbt/VEBwcop9+WqN33x2kZs2a6/Lly1q2\nbLHatm2v337bpe3btyo8/PZbHSpXDlC+fPk1ZcrnGjx4oD76aIy+//5bNWzYRD4+hXTlyhXt2rVD\nP/+8SQUL+mjcuEny8yvhdB2enp4KDX1aX3/9lQzDUJs2j94mi3YECQAAAACQwfjm81X0nIPuLuOe\nShQu9j+fw8PDQ9Onz9BXX83U5s0btH79WiUlJatQoUKqV6++unbtpuLF/RxBQsGChTRw4BB99tlU\nfffdMiUlJclmq6hXX+2j8uUrOM779ttDlDNnTm3d+rN2794pP78S6tHjVbVs2UrVqtXQyZMntGzZ\nImXPnl2VKwdIur3Xwdy5C7VixXJt2rRe33wzT9euXVO2bNlVqlRpvfnmIIWGPp3qnQZt2rTT119/\npbJly6lixcr/89pkVAQJAAAAAJDBfPbxf9xdgiU+PnkeyHly5MihXr1eV69er1saX758BU2aNOWu\nY3Llyq1Bg95NsS8gIFALF6b8+IKnp6fat39W7ds/a6mWOx0+fEiS9OyzndJ8bGbCHgkAAAAAAPyP\nrl+/rv/8Z7oKFfJVixah7i7noeKOBAAAAAAA7tPOnZGKijqpxYu/0dmz0Zo4cYqyZs3q7rIeKoIE\nAAAAAECmYBiGDMNwdxlO5s2bo8jI7SpZspTGjJmg2rXrurukh44gAQAAAACQ4VWvXlObNv3i7jJc\n3GuvhkcReyQAAAAAAADLCBIAAAAAAIBlBAkAAAAAAMAyggQAAAAAAGAZQQIAAAAAALCMIAEAAAAA\nAFhGkAAAAAAAACwjSAAAAAAAAJYRJAAAAAAAAMsIEgAAAAAAgGUECQAAAAAAwDKCBAAAAAAAYBlB\nAgAAAAAAsIwgAQAAAAAAWEaQAAAAAAAALCNIAAAAAAAAlhEkAAAAAAAAywgS8NAsW7ZMNptNU6dO\ndXcpAAAAAIAHhCAhk+jatatsNpu2bt2aYv/evXtls9lUp04dJScnpzhmwoQJstlsCg8Pf5ilOjEM\nI93mAgAAAAA8fAQJmUTTpk1lGIY2btyYYr+9/fr169q1a1eKYzZv3izDMNSsWbOHVuffmaaZbnMB\nAAAAAB4+goRMIjg4WKZpphokbN68WeXLl5eHh4c2bdrk0n/+/HkdPnxYxYsXV9myZR92uQAAAACA\nRxRBQiZRunRplSpVSidOnNCpU6ec+q5cuaK9e/eqQYMGKleunDZv3uxyvD1caNq0qaPt8OHDGjBg\ngIKCghQQEKC6devqlVdeUUREhNOxv/zyi2w2m8aNG6elS5eqUaNGeuqppxz958+f18CBA1W3bl1V\nrVpVHTp00MqVKx/k5QMAAAAAMghPdxcA64KDgzVr1ixt2rRJXbp0cbRv3rxZpmmqdu3aSkxM1Pz5\n83Xp0iUVLFjQMWbjxo0yDENNmjSRJO3YsUOvvPKKsmfPrs6dO6tUqVK6cOGCFi9erJ49e2rs2LFq\n37690/wnT57U2rVr1adPHxUoUECSFB8fr65du+r06dN65plnVKNGDV26dElTp05VsWLF2CMBAAAA\nAB4xBAmZSLNmzTRz5kxt2LDBKUjYuHGjPDw8VLduXXl6emru3LnavHmzIwhITEzU1q1blTt3btWp\nU0eS9MEHHyghIUFff/21Klas6DhXu3btFBoaqg8//FCtW7eWl5eXo2/Tpk1asGCBAgMDHW1LlizR\nqVOn1LlzZ/3rX/9ytHfs2FEtW7Z8aGsBAAAAAHAPHm3IRGrUqCFvb2/9+uuv+uuvvyTd3sxwy5Yt\nql69uiMo8PLyctonYceOHbpx44YaNmwoDw8PnThxQkeOHFH16tWdQgRJ8vHxUdOmTXXt2jX98ssv\nTn1+fn5OIYIkbd26VYZhqE2bNk7t3t7eatGixYO8fAAAAABABkCQkIlkyZJFjRs31l9//aVt27ZJ\nkn777TdduXJFDRs2lCTlyJFDNWvW1JYtWxxvTLA/1hAcHCxJOnr0qCSpXLlyKc5jbz9+/LhTu5+f\nn8vYqKgoSVKpUqVc+ipUqMBbGwAAAADgEUOQkMn8/e0NmzZtkmEYatSokWNMUFCQrl275ngN5ObN\nm+Xh4aHGjRtLkm7evClJypkzZ4pzZM+eXaZpKi4uzqk9V65cLmPtY7Jly5bieQAAAAAAjxaChEym\nYcOG8vT01M8//yxJ2rJliwoWLCibzeYYExQUJNM0FRERoYsXLzoeY8ibN6+k/x8I3LhxI8U5bt68\nKcMwUgwO/s4eFtgftbhTbGxs2i4OAAAAAJDhESRkMvZ9EKKionTs2DHt27fP8ViDnb+/vwoVKqTt\n27dr+/btkpxf+1ihQgVJt1//mJJDhw5JksqWLXvPeooVKyZJLq+ktJ+HtzYAAAAAwKOFICETsu91\n8MUXXygpKUlBQUEuYxo0aKA9e/YoIiLC6bWP0u29DgICArRnzx7t2bPH6bgzZ85ow4YN8vHxUe3a\nte9ZS7169WSaplasWOHUfvHiRa1bt+4+rg4AAAAAkJERJGRCTZs2lWmaWrlypbJkyZJikNCwYUPd\nunVL33//vUqUKKHSpUs79Y8YMUI5cuRQz549FRYWpm+//Vaffvqpunbtqlu3bmnkyJHy9Lz320Gf\nffZZFS5cWPPnz9f777+vpUuX6vPPP9fzzz+vmjVrstkiAAAAADxi7v1JERlOsWLFVKFCBR05ckRV\nq1Z17H1wpwYNGsjDw0OJiYlOjzXYVa5cWQsXLtT06dP1zTff6OrVq8qbN69q1qypnj17urzm0TCM\nFB9TyJ07t7766itNmDBBq1ev1nfffadSpUqpX79+8vb2drwxAgAAAADwaDBMvjJGJtCoeXt5B3Zz\ndxl4AC7vnKFvF85zdxkZko9PHknSxYvX3VzJ44M1T3+suXuw7umPNU9/rLl7sO7pz77m7sSjDQAA\nAAAAwDKCBAAAAAAAYBlBAgAAAAAAsIzNFgGkK09PjwzxXFdGxvqkP9Y8/bHm7sG6pz/WPP2x5u7B\nuj9eCBKQKZy9cEjH1wy86xjjVhaV9gtIp4pwv4oVzu/uEgAAAAD8DwgSkCkUK1VEhZ6vcNcx0XMO\nasmsOelU0aPtYe++y66+KWPX4/THmqc/1tw9WPf0x5qnP9bcPVj39JcR7v54bPdI2Lx5s2w2mz74\n4AO31jFp0iTZbDb98MMPbpk/ISFBNptNrVq1csv8AAAAAIDMJcPekTB16lRNnTrV0ljDMDRnzhzV\nrl37IVf14LVt21ZVqlRR1apVH/pccXFxmjFjhp577jn5+vpKkrJmzaopU6Yod+7cD31+AAAAAEDm\nl2GDhNDQUFWo4Hwr+7Jly7RhwwZ16dJFderUceorV65cepb3wJQrVy7dat+7d6+mTp2qRo0aOYIE\nwzDUokWLdJkfAAAAAJD5ZdggoWzZsipbtqxT265duyRJAQEBfPi9D7t375ZhGO4uAwAAAACQiT1y\neyQcOHBA/fv3V1BQkAICAlSvXj317NlTW7dutXT8mTNn1KhRI9WtW1eHDh1ytF+4cEEffPCBmjZt\nqoCAANWpU0cvvfSS1qxZ43T88ePHZbPZ9NZbb+n06dPq37+/nnzySQUEBKhVq1ZavHix0/iJEyc6\n7ZGwYMEC2Wy2VP/7+yMQJ06c0DvvvKPg4GAFBASoWrVqat++vebNm+c0LigoSJMnT5Yk/fOf/1TF\nihW1Z8+eVPdIuHXrlv7zn/+oXbt2ql69uqpWrapWrVpp8uTJio2NdRprP198fLymTZumFi1aqEqV\nKqpfv76GDRvmMh4AAAAAkHll2DsS7se2bdvUq1cv5cmTR506dVKJEiV0/vx5LVy4UN27d9fEiRPV\nunXrVI+/cuWKXnnlFd24cUMzZ86Uv7+/pNvhwj//+U8lJSWpU6dOKlu2rC5fvqylS5eqf//+euut\nt9SzZ0+nc12+fFldu3ZVs2bNNHjwYF24cEEzZszQ8OHDVbx4cdWrV0/S7UcL7rxLICgoSFOmTHGp\n7ZdfftHcuXNVqVIlR9vFixf13HPPKTExUd27d1eZMmV07do1LVu2TKNGjVJMTIz69esnSRozZow+\n//xz7dq1SwMHDlSpUqVUqlSpFNfBNE317t1bERERCg4O1nPPPads2bIpMjJS4eHh2rx5s7755ht5\neXk5rkGS3n//fUVHR+vll1+Wp6enli1bpiVLligxMVHjx4+/1z8fAAAAACATeKSChH/9619KTk7W\n7NmznfYd+Mc//qHQ0FCNHTtWTz31lDw8PFyOjYuLU69evXTu3DmFh4crMDDQ0TdmzBjFxsZq0aJF\nTvs2PP/882rXrp2mTJmiZ555Rvnz53f0bd++XaNHj9YzzzzjaMuTJ49GjBih1atXO4KEvytevLiK\nFy/u1Hbu3Dl98MEHKlSokD755BNH+6FDh1SlShW1bNlSHTt2dLS3adNGQUFBmjNnjiNIaNy4sb79\n9ltJUr169RzXl5CQ4FLDypUrFRERodatW2vSpEmO9meffVa5c+fWvHnztGDBAr344ouOPtM0dfbs\nWX311VeOYKFFixZq1KiR1qxZQ5AAAAAAAI+IR+bRhkOHDunkyZOqU6eOy+aFhQsXVqNGjRQTE6Od\nO3e6HJuYmKh+/frp4MGD+uSTT5w2coyNjdXGjRsVGBioIkWK6Pr1647/4uPj1bx5cyUmJmrz5s1O\n58ybN69TiCBJ1apVkySdP3/e8nUlJCTo9ddfV2xsrMLCwlSoUCFHX1BQkL788ktHiBAfH6/r168r\nOTlZvr6+io2N1dWrVy3PZbdmzRoZhqEuXbq49HXq1EmmaWrdunVO7YZh6KWXXnK6u8Lb21ulSpVS\nfHy8/vzzzzTXAQAAAADIeB6ZOxKOHTsmKfW3N5QrV05r1qzR8ePHnV4TaZqmhg4dqoiICI0ePVqN\nGzd2Ou748eNKSkpSZGRkiq+XtH9wPn36tFO7n5+fy9hs2bJJuh1cWDV8+HAdOHBAI0eOTPEVkatW\nrdLs2bN1+PBh3bx506W2pKQky3PZHT16VJJUvnx5l74yZcrIMAwdP37cpS+lRyWyZ88uKW3XDAAA\nAADIuB6ZIOHGjRuSpBw5cqTYb/9AGxcX59S+cuVK3bx5U4ZhaNOmTXr22WdTPG+tWrX0xhtvyDTN\nFM9ftGhRp7/bQ4P/xZw5c/Ttt9+qc+fOeu6551z6Fy1apOHDhyt//vzq1auXbDabcuXKJUkaMmSI\noqOj72teeyCR0lpmyZJFXl5eLusoPZhrBgAAAABkbI9MkGD/AP33b+Xt7O32cXbJycmaNGmSVq9e\nrTVr1mjOnDlOz/7fOb5WrVoPuuxU/fLLL/roo49Uq1YtvffeeymO+eyzz2QYhmbMmKGKFSs69d3P\nnQh2d65l3rx5Xc6bkJAgb2/v+z4/AAAAACDzemT2SLBvgnj48OEU++3tZcuWdWpv27atWrVqpTFj\nxqhYsWKaMGGC9u7d6+gvV66cPDw8tH///hRDij///FPJyckP6jIkSWfPntUbb7yhQoUKacqUKSlu\nDmmapqKjo5UvXz6XEOH48eM6d+7cfc9vf6QhpbU8cuSITNNM9RESAAAAAMCj7ZEJEsqVK6cKFSoo\nMjJSBw8edOo7efKkNm/erCJFiqh69eopHp8nTx59/PHHMk1TAwYM0PXr1yVJOXPmVHBwsG7evKm5\nc+c6HXPr1i317t1bjRo1Umxs7AO5joSEBPXp00dxcXEKCwtzehPEnQzDUIECBXTt2jWnuW/evKmR\nI0c67hiIj4939NkDiTvbUvL000/LNE3NmTPHpW/OnDkyDEOhoaFpvjYAAAAAQOaX6R5tSG2PAkka\nOXKkXn75Zb388svq0qWL/Pz8dOrUKS1cuFCSNGrUKKe3CvxdYGCg3n77bX344YcaPHiwpk+fLkka\nOnSodu/erX//+9+KiopSnTp19Oeff2rZsmU6cOCA+vbtq9y5cz+QaxozZoz279+v0NBQnT592mUT\nR+n22x98fX319NNPa/bs2Xrttdf07LPP6tq1a1q4cKHq16+vYsWKacmSJZo+fbratm2rOnXqyM/P\nT6ZpasqUKQoJCVHNmjXl7+/vcv7mzZurefPmWrt2rXr37q3g4GAlJydry5YtWrNmjZ588kmXvSQA\nAAAAAI+HTBck3C0IqFatmhYuXKhp06ZpwYIFunr1qry9vVWrVi316tVLlStXdjnX38/XrVs3bd++\nXevXr9esWbPUrVs3FStWTEuXLtVnn32mjRs36ttvv1W2bNlks9k0adIktWrV6p7nvVvfnW0HDx6U\nYRhavXq1Vq9eneI57HO++eabMgxDP/74o0aMGKHixYurc+fO6tKli44ePardu3drxYoV8vDwUJ06\nddS1a1ft2LFDu3fv1tGjRzVq1ChHkPD3mj755BPNnj1b3377rcaOHStJKlmypN566y1169YtxWtI\nzd36AAAAAACZi2He7St+IINo0raZCj1f4a5joucc1LJZ36VTRY82H588kqSLF6+7uZLHC+ue/ljz\n9Meauwfrnv5Y8/THmrsH657+7GvuTo/MHgkAAAAAAODhI0gAAAAAAACWESQAAAAAAADLCBIAAAAA\nAIBlBAkAAAAAAMAyggQAAAAAAGAZQQIAAAAAALCMIAEAAAAAAFhGkAAAAAAAACwjSAAAAAAAAJYR\nJAAAAAAAAMsIEgAAAAAAgGUECQAAAAAAwDKCBAAAAAAAYBlBAgAAAAAAsIwgAQAAAAAAWEaQAAAA\nAAAALCNIAAAAAAAAlhEkAAAAAAAAywgSAAAAAACAZQQJAAAAAADAMoIEAAAAAABgGUECAAAAAACw\njCABAAAAAABYRpAAAAAAAAAsI0gAAAAAAACWESQAAAAAAADLCBIAAAAAAIBlBAkAAAAAAMAyggQA\nAAAAAGAZQQIAAAAAALCMIAEAAAAAAFhGkAAAAAAAACwjSAAAAAAAAJYRJAAAAAAAAMs83V0AYEXR\ngkUUNefgXcf45vNNp2oAAAAA4PFFkIBMYf6Mubp48bq7ywAAAACAxx6PNgAAAAAAAMsIEgAAAAAA\ngGUECQAAAAAAwDKCBAAAAAAAYBlBAgAAAAAAsIwgAQAAAAAAWEaQAAAAAAAALCNIAAAAAAAAlhEk\nAAAAAAAAywgSAAAAAACAZQQJAAAAAADAMoIEAAAAAABgGUECAAAAAACwjCABAAAAAABYRpAAAAAA\nAAAsI0gAAAAAAACWESQAAAAAAADLCBIAAAAAAIBlBAkAAAAAAMAyggQAAAAAAGAZQQIAAAAAALCM\nIAEAAAAAAFhGkAAAAAAAACwjSAAAAAAAAJYRJAAAAAAAAMsIEgAAAAAAgGUECQAAAAAAwDKCBAAA\nAAAAYBlBAgAAAAAAsIwgAQAAAAAAWEaQAAAAAAAALCNIAAAAAAAAlhEkAAAAAAAAywgSAAAAAACA\nZQQJAAAAAADAMoIEAAAAAABgGUECAAAAAACwjCABAAAAAABYRpAAAAAAAAAsI0gAAAAAAACWESQA\nAAAAAADLCBIAAAAAAIBlBAkAAAAAAMAyggQAAAAAAGAZQQIAAAAAALCMIAEAAAAAAFhGkAAAAAAA\nACwjSAAAAAAAAJYRJAAAAAAAAMsIEgAAAAAAgGUECQAAAAAAwDKCBAAAAAAAYBlBAgAAAAAAsIwg\nAQAAAAAAWEaQAAAAAAAALCNIAAAAAAAAlhEkAAAAAAAAywgSAAAAAACAZQQJAAAAAADAMoIEAAAA\nAABgGUECAAAAAACwjCABAAAAAABYRpAAAAAAAAAsI0gAAAAAAACWESQAAAAAAADLCBIAAAAAAIBl\nBAkAAAAAAMAyggQAAAAAAGAZQQIAAAAAALCMIAEAAAAAAFhGkAAAAAAAACwjSAAAAAAAAJYRJAAA\nAAAA/h97dx+u1Zzof/xz91zCYRASUdhGpUaSp5qMUok8S5lUZDjHwxi/OZjBhDwNcSQxRlSMh0IM\njYTBaEIih3OISc14JoRKSbV/f7jaZ/bsHWtM2sXrdV1dc91rfe+1vvfXH3Pd773WuqEwIQEAAAAo\nTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgA\nAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAA\nChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMS\nAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKCwOjU9ASjiyB8fk7+9MXe1n3fT\njTfIb64esdrPCwAAsKYSElgrvPnOh/neD45Z7ed959lRq/2cAAAAazK3NgAAAACFCQkAAABAYUIC\nAAAAUJiQAAAAABQmJAAAAACFCQkAAABAYUICAAAAUJiQAAAAABQmJAAAAACFCQkAAABAYUICAAAA\nUJiQAAAAABQmJAAAAACFCQkAAABAYUICAAAAUJiQAAAAABQmJAAAAACFCQkAAABAYUICAAAAUJiQ\nAAAAABQmJAAAAACFCQkAAABAYUICAAAAUJiQAAAAABQmJAAAAACFCQkAAABAYUICAAAAUJiQAAAA\nABQmJAAAAACFCQkAAABAYUICAAAAUJiQAAAAABQmJAAAAACF1anpCazJHnvssdx555155ZVX8v77\n72fx4sVZd91107Jly+y777454ogjUrdu3dUylylTpmTu3Lk56KCDVsv5AAAAoDpCwkpcdtlluf76\n69O8efPsv//+2WqrrbJs2bK89dZbmThxYoYOHZoHHnggo0ePTu3atb/x+YwePTpLliwREgAAAKhR\nQkI1Zs+eneuvvz4tWrTInXfemQYNGlTaf+yxx+bYY4/NtGnTcs899+Tggw/+RudTXl6eF154Idtv\nv/03eh4AAAD4KkJCNWbOnJkk6dChQ5WIkCR169bN0KFDM3v27Oy4444V2xcuXJjf/OY3efDBB/PG\nG2+kXr16adGiRQ466KD06dMnpVKpYmxZWVl22GGHjBkzJpdeemkeffTRzJs3L5tsskkOOeSQ/Md/\n/C40zKwAACAASURBVEeSZMKECTnzzDNTKpUybdq0lJWVpUOHDhk7dmySZOnSpbnhhhsyceLE/PWv\nf02tWrWy5ZZbZr/99suAAQNSr169inPuvffeWbBgQaZMmZL/+q//yqRJk/Lee+9lgw02SPfu3fPz\nn/+80vgkufvuuzNu3Li8/PLLWb58eXbccccMHjw4nTt3rjTutddey8iRI/PEE0/kgw8+SOPGjdO6\ndesMHDgwu++++7/4XwQAAIA1hZBQjU033TRJMnXq1Lz33nvZZJNNqoxp1qxZmjVrVvF64cKF6dOn\nT15//fUceuihadOmTebPn58HHngg5557bp5//vlcdNFFlY7x+eefZ8CAAdl6661z6qmnZsGCBRkz\nZkxGjBiRDTbYIH379k3Hjh0zZMiQDBkyJNtuu21OPvnkbLDBBkmSZcuWZfDgwZk2bVoOOOCADBw4\nMJ999lmmTJmSyy+/PE888URuvPHGKnM/+eSTs3z58pxwwglZtmxZbr311tx0002pV69efv7zn1eM\n+/Wvf50bbrghXbp0ydlnn53Fixdn3Lhx+clPfpKhQ4fm0EMPTfJFeDnqqKPSqFGj9OnTJ1tuuWXe\neeedjB8/Psccc0wuvPBCt2QAAAB8SwgJ1WjXrl3atWuX5557Lvvvv3969eqVvfbaKzvttFPFl/h/\ndM0112TWrFkZOXJkunTpUrG9X79+GTx4cO6+++4cccQRadu2bcW+V199NYMGDar05X377bfP0Ucf\nnUmTJqVv377ZbLPNstdeeyVJNthgg3Tt2rVi7Lhx4/LEE0/krLPOylFHHVWx/YgjjsivfvWrjBs3\nLhMnTsx+++1XsW/+/Plp2LBhrrjiiopte+yxR7p27ZpJkyZVzOXVV1/NjTfemD322CPXXHNNxdhe\nvXqla9euufTSS9O7d+/UrVs355xzTmrXrp3bb789m222WcXYww8/PL169cpFF12U/fbbr8rVDgAA\nAKx9/PxjNUqlUm644YYceeSRWbx4cW655ZYcf/zx2W233dK9e/ecd955eeaZZyq957777sv3vve9\ntG/fPvPnz6/0r2fPnikvL88jjzxS5VwDBgyo9HpFaHj33Xe/cp733ntvatWqlZ49e1Y5Z/fu3Vd6\nzqOPPrrS62bNmuV73/tepXPed999SVLlSoLGjRtn7NixGTNmTEqlUl5//fU8//zz6dixYxo3blxp\nDknSqVOnzJ8/P9OnT//KzwMAAMCazxUJK9GwYcOcc845+dnPfpapU6dmxowZefbZZ/Piiy/m1ltv\nzS233JLOnTtn2LBhSZJ33nknpVIpu+yyS7XHK5VKeeONN6qcY+ONN660rX79+km+ePbBV5k1a1bK\ny8tX+gyC6s6ZJM2bN6+yrX79+lm2bFnF61deeSVJsuWWW1YZu+2221YZN3ny5DzwwAPVziFJtfMA\nAABg7SMkfIXGjRunW7du6datW5Jk0aJFeeSRR3LVVVflT3/6Uy6++OKcdNJJSZKmTZvm4osvTnl5\nebXH2nDDDSu9XhENvq6FCxemfv36uf7661d6znXWWafKtiLnXbhwYaGxK8bts88+6d+//0rHbbXV\nVl95TgAAANZ8QsI/qWHDhunZs2d23nnn/PCHP8yjjz6aM844I8kXkaF9+/arbS6NGzfOJ598ktat\nW//LUaK6YyfJxx9/XGhcnTp1Vno1BgAAAN8enpFQjeuuuy6nnXZalixZstIxTZo0Sf369bN48eI0\nbtw4m2++eT788MPMmTOnytiFCxd+6bG+ru222y5J8vTTT1fZt2TJkixYsOBrH7tFixZJkpdffrnK\nvqeeeirjx4/PRx99VDGHGTNmVHtVxLx58772HAAAAFjzCAnVmDFjRiZOnFjx/IPq3HTTTVm8eHE6\nd+6c5ItfMygvL891111XZex5552Xjh07ZtasWV9rPnXqfHHhyGeffVZp+4pzVndrw7XXXpvdd989\nU6ZM+Vrn7NGjR5LkjjvuqPTshEWLFuX000/PJZdckkaNGmWLLbZI27Zt8+6772bChAmVjrFw4cIc\nddRR6d69e6VjAAAAsPZya0M1zjvvvAwYMCBjx47N1KlT07Nnz2yxxRYpLy/P3Llz8/jjj+fJJ59M\nixYtcvrppydJfvKTn+SRRx7J3XffnY8//jjdunXLZ599lsmTJ1cco2XLll9rPhtttFEaNmyY//3f\n/82VV16Z9dZbLwMHDsxhhx2WSZMm5cknn0z//v1zwAEHpFQqZcqUKZk0aVJ22WWXdOzY8Wuds6ys\nLP3798/YsWPTv3//HHzwwVmyZEnuuOOOvPvuu7ngggsqfs5xyJAh6d+/f84555y89NJLadOmTd5/\n//2MHz8+c+bMyZAhQ1K7du2vNQ8AAADWLKXylT2l7ztuyZIlGT9+fB5++OG88sor+eijj1IqlbL+\n+utn++23zz777JNDDjmk4st0kixYsCC//e1v8+CDD+bNN99MrVq1ss022+Sggw5K3759U6vW/10A\nUlZWlg033DBTp06tcu6ysrJsscUWeeihhyq23X333Rk2bFg+/vjjtGzZMnfddVeS5PPPP8+YMWNy\n33335W9/+1uWL1+eLbfcMj179sygQYMqPTth7733zjvvvJNnnnkmDRs2rHTOFftefPHFStvvuOOO\n3H777RVXU5SVleWkk06q8ksRr7/+ekaOHJknnngi77//fho1apTWrVunf//+FVdt/Cs6dT0o67cZ\n8C8f55/1wbOjcs+4363289a0jTdeN0kyd+78Gp7Jd4t1X/2s+epnzWuGdV/9rPnqZ81rhnVf/Vas\neU0SElgrCAmrl/9DqBnWffWz5qufNa8Z1n31s+arnzWvGdZ99VsTQoJnJAAAAACFCQkAAABAYR62\nCF+iTp3aa8SlQzXlu/zZa5J1X/2s+epnzWuGdV/9rPnqZ81rhnX/bvGMBNYK2+70/Sxa/tlXD1zF\n6tapna22bLbaz8u32+YbbZZbRt1c09MAAICvxRUJrBWaNt8sm/TdrqanAavEa2NnVvtAIg8rWv2s\n+epnzWuGdV/9rPnqZ81rhnVf/daEqz88IwEAAAAo7DsbEh5//PGUlZVlyJAhNTqPYcOGpaysLH/4\nwx9q5PxLlixJWVlZevbsWSPnBwAAYO2yxt7aMGLEiIwYMaLQ2FKplLFjx2aXXXb5hme16vXu3Tut\nW7fOTjvt9I2fa9GiRRk1alQOO+ywNGnSJElSt27dDB8+PI0bN/7Gzw8AAMDab40NCT169Mh221W+\nJ37ChAl59NFH069fv3To0KHSvpYtW67O6a0yLVu2XG1zf+GFFzJixIh06tSpIiSUSqV069ZttZwf\nAACAtd8aGxJatGiRFi1aVNo2Y8aMJEmrVq18+f0annvuuZRKpZqeBgAAAGuxb90zEl566aWcfPLJ\n2XPPPdOqVat07NgxgwcPzhNPPFHo/W+++WY6deqUXXfdNS+//HLF9vfeey9DhgzJ3nvvnVatWqVD\nhw45+uijM3ny5Ervnz17dsrKynLaaafljTfeyMknn5zddtstrVq1Ss+ePXPHHXdUGn/ZZZdVekbC\nbbfdlrKyspX++8dbIP7617/mP//zP9OlS5e0atUqbdu2zUEHHZTf/e53lcbtueeeufzyy5Mkhx9+\neHbYYYc8//zzK31Gwueff57f/va3OfDAA9OuXbvstNNO6dmzZy6//PIsWLCg0tgVx1u8eHGuvvrq\ndOvWLa1bt87uu++eX/7yl1XGAwAAsPZaY69I+DqefPLJHHfccVl33XXTp0+fbLnllnn33Xczbty4\nDBo0KJdddln222+/lb5/3rx5OeaYY7Jw4cLceOON2X777ZN8ERcOP/zwLFu2LH369EmLFi3ywQcf\n5K677srJJ5+c0047LYMHD650rA8++CBHHXVUfvSjH+X000/Pe++9l1GjRuXss8/OFltskY4dOyb5\n4taCv79KYM8998zw4cOrzG3atGm5+eab8/3vf79i29y5c3PYYYdl6dKlGTRoULbZZpt88sknmTBh\nQs4///x8+OGHOemkk5IkF1xwQX7zm99kxowZ+dnPfpbmzZunefPm1a5DeXl5TjjhhEyZMiVdunTJ\nYYcdlvr162f69Om57rrr8vjjj+f2229PvXr1Kj5Dkpxzzjl56623MnDgwNSpUycTJkzInXfemaVL\nl+aSSy75qv98AAAArAW+VSHhV7/6VZYvX54xY8ZUeu7AAQcckB49euTCCy9M9+7dU7t27SrvXbRo\nUY477ri88847ue6669KmTZuKfRdccEEWLFiQ8ePHV3puQ9++fXPggQdm+PDhOeSQQ7LhhhtW7Hvq\nqacydOjQHHLIIRXb1l133Zx77rmZNGlSRUj4R1tssUW22GKLStveeeedDBkyJJtsskmuvPLKiu0v\nv/xyWrdunX333TdHHHFExfb9998/e+65Z8aOHVsREjp37px77rknSdKxY8eKz7dkyZIqc7jvvvsy\nZcqU7Lfffhk2bFjF9kMPPTSNGzfO7373u9x2223p379/xb7y8vK8/fbbuemmmyrCQrdu3dKpU6dM\nnjxZSAAAAPiW+Nbc2vDyyy/nb3/7Wzp06FDl4YWbbrppOnXqlA8//DDPPvtslfcuXbo0J510UmbO\nnJkrr7yy0oMcFyxYkMceeyxt2rTJZpttlvnz51f8W7x4cbp27ZqlS5fm8ccfr3TM9dZbr1JESJK2\nbdsmSd59993Cn2vJkiX593//9yxYsCBXXXVVNtlkk4p9e+65Z2644YaKiLB48eLMnz8/y5cvT5Mm\nTbJgwYJ89NFHhc+1wuTJk1MqldKvX78q+/r06ZPy8vI89NBDlbaXSqUcffTRla6uWH/99dO8efMs\nXrw4H3/88T89DwAAANY835orEl599dUkK//1hpYtW2by5MmZPXt2pZ+JLC8vz5lnnpkpU6Zk6NCh\n6dy5c6X3zZ49O8uWLcv06dOr/XnJFV+c33jjjUrbmzVrVmVs/fr1k3wRLoo6++yz89JLL+W8886r\n9ici77///owZMyavvPJKPv300ypzW7ZsWeFzrTBr1qwkybbbbltl3zbbbJNSqZTZs2dX2VfdrRIN\nGjRI8s99ZgAAANZc35qQsHDhwiRJw4YNq92/4gvtokWLKm2/77778umnn6ZUKuVPf/pTDj300GqP\n2759+5xyyikpLy+v9vibb755pdcrosG/YuzYsbnnnnty5JFH5rDDDquyf/z48Tn77LOz4YYb5rjj\njktZWVnWWWedJMkZZ5yRt95662udd0WQqG4ta9WqlXr16lVZx2TVfGYAAADWbN+akLDiC/Q//lV+\nhRXbV4xbYfny5Rk2bFgmTZqUyZMnZ+zYsZXu/f/78e3bt1/V016padOm5de//nXat2+fs846q9ox\n1157bUqlUkaNGpUddtih0r6vcyXCCn+/luutt16V4y5ZsiTrr7/+1z4+AAAAa69vzTMSVjwE8ZVX\nXql2/4rtLVq0qLS9d+/e6dmzZy644II0bdo0l156aV544YWK/S1btkzt2rXz4osvVhspPv744yxf\nvnxVfYwkydtvv51TTjklm2yySYYPH17twyHLy8vz1ltvZYMNNqgSEWbPnp133nnna59/xS0N1a3l\nX/7yl5SXl6/0FhIAAAC+3b41IaFly5bZbrvtMn369MycObPSvr/97W95/PHHs9lmm6Vdu3bVvn/d\nddfNFVdckfLy8px66qmZP39+kqRRo0bp0qVLPv3009x8882V3vP555/nhBNOSKdOnbJgwYJV8jmW\nLFmS//iP/8iiRYty1VVXVfoliL9XKpXyve99L5988kmlc3/66ac577zzKq4YWLx4ccW+FUHi77dV\np1evXikvL8/YsWOr7Bs7dmxKpVJ69OjxT382AAAA1n5r3a0NK3tGQZKcd955GThwYAYOHJh+/fql\nWbNmef311zNu3Lgkyfnnn1/pVwX+UZs2bfL//t//y8UXX5zTTz89I0eOTJKceeaZee655/Jf//Vf\nee2119KhQ4d8/PHHmTBhQl566aWceOKJady48Sr5TBdccEFefPHF9OjRI2+88UaVhzgmX/z6Q5Mm\nTdKrV6+MGTMmxx9/fA499NB88sknGTduXHbfffc0bdo0d955Z0aOHJnevXunQ4cOadasWcrLyzN8\n+PDss88+2XnnnbP99ttXOX7Xrl3TtWvXPPjggznhhBPSpUuXLF++PFOnTs3kyZOz2267VXmWBAAA\nAN8Na11I+LIQ0LZt24wbNy5XX311brvttnz00UdZf/310759+xx33HHZcccdqxzrH483YMCAPPXU\nU3nkkUcyevToDBgwIE2bNs1dd92Va6+9No899ljuueee1K9fP2VlZRk2bFh69uz5lcf9sn1/v23m\nzJkplUqZNGlSJk2aVO0xVpzzpz/9aUqlUh544IGce+652WKLLXLkkUemX79+mTVrVp577rnce++9\nqV27djp06JCjjjoqzzzzTJ577rnMmjUr559/fkVI+Mc5XXnllRkzZkzuueeeXHjhhUmSrbbaKqed\ndloGDBhQ7WdYmS/bBwAAwNqlVP5lf+KHNcQPe/8om/TdrqanAavEW2NnZsLo31fZvvHG6yZJ5s6d\nv7qn9J1lzVc/a14zrPvqZ81XP2teM6z76rdizWvSt+YZCQAAAMA3T0gAAAAAChMSAAAAgMKEBAAA\nAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAw\nIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEA\nAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAo\nTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMLq1PQEoIjNN9osr42dWdPT\n+M6oU+eLxrh06fIansm3U5MNmtT0FAAA4GsTElgr3DLq5sydO7+mp/GdsfHG6yaJNQcAAKpwawMA\nAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQ\nmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAA\nAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAA\nFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYk\nAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAA\nAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJ\nCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAA\nAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBh\nQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIA\nAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQ\nmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAA\nAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAA\nFCYkAAAAAIUJCQAAAEBhdWp6AlDEkT8+Jn97Y25NT+M7o06d2kmSpUuX1fBMvlus++pnzVc/a14z\nrPvqZ81XP2teM6x7MZtuvEF+c/WImp7GKiMksFZ4850P870fHFPT0wAAAPinvfPsqJqewirl1gYA\nAACgMCEBAAAAKExIAAAAAAoTEgAAAIDChAQAAACgMCEBAAAAKExIAAAAAAoTEgAAAIDChAQAAACg\nMCEBAAAAKExIAAAAAAoTEgAAAIDChAQAAACgMCEBAAAAKExIAAAAAAoTEgAAAIDChAQAAACgMCEB\nAAAAKExIAAAAAAoTEgAAAIDChAQAAACgMCEBAAAAKExIAAAAAAoTEgAAAIDChAQAAACgMCEBAAAA\nKExIAAAAAAoTEgAAAIDChAQAAACgMCEBAAAAKExIAAAAAAoTEgAAAIDChISCRo8enT333DM77rhj\nhg4dWtPTWaP8+Mc/TllZWT744IOangoAAADfsDqr4iDTpk1L//79q93XsGHDbLXVVtl7770zaNCg\nNG7ceFWcspI5c+Zk4sSJOfHEE1f5sZPk1VdfzcUXX5yNN9445513XrbZZptC75s3b17Gjh2bP//5\nz3nnnXfy4Ycfpm7dumnSpEl+8IMf5Oijj87222//jcx5dSuVSjU9BQAAAFaDVRISVmjbtm0GDRpU\n8Xr58uV577338thjj2XkyJGZOHFibr311my44Yar8rR58MEHc/XVV39jIeHll19OkvTu3TuHHHJI\nofe8/vrr6du3b+bNm5cePXrkkEMOybrrrpuPP/44zz33XO699978/ve/z4gRI/LDH/7wG5k3AAAA\nrGqrNCQ0adIk3bp1q7K9f//+ueSSS3LjjTfmN7/5Tc4888xVedo899xzq/R4/2jx4sVJkgYNGhR+\nzxVXXJH3338/Q4cOrRIfjjzyyPTu3TvHHHNMLrzwwnTq1Cm1arnLBAAAgDXfavv2evjhhydJnnrq\nqYptL730Uk455ZR06tQprVq1Srt27XL44Yfn7rvvrvL+srKyHHTQQXn++eez//77p02bNpk+fXrK\nysryxz/+sWLMDjvsUGg+y5Yty4033piDDz447dq1S5s2bdK9e/dceuml+eSTTyrG7b333vnFL36R\nUqmUESNGpKysrFAImTlzZpKkS5cu1e7ffffdc/XVV2fYsGEV2958882UlZVlwIABee211/Lv//7v\n2XXXXbPTTjvl4IMPzv3331/lOEuXLs11112X3r17Z6eddkq7du3Su3fvXHfddVmyZEmV8a+99lrO\nOOOMdO7cOa1atUrHjh0zePDgTJ06tdp53n333enbt2923nnntGvXLkcddVQee+yxlX7uMWPGpGfP\nnmndunV22223nHnmmZk/f/6XrhUAAABrj1V6RcKXWfHX/GXLliX54rkDffr0SYMGDXLMMcdkiy22\nyIcffpjbb789Z5xxRhYtWpQjjzyy0jGWLVuW008/PQcccECaNWuWsrKyDB8+PEOGDMm8efNy1VVX\npby8vNB8TjrppPzxj39Mp06dcsghh6RBgwZ59tlnM2rUqPzpT3/K+PHj06BBg5x77rl57LHHcvPN\nN6dHjx7p0aNHmjZt+pXH33TTTTNnzpzcfffdlW73+Ht77713tds/+OCDDBw4MF26dEm3bt3y0Ucf\nZdSoUTn11FNTu3btiqs+li1blsGDB2fatGk54IADMnDgwHz22WeZMmVKLr/88jzxxBO58cYbK447\nc+bMHHXUUWnUqFH69OmTLbfcMu+8807Gjx9fcXXEQQcdVDH+17/+dW644YZ06dIlZ599dhYvXpxx\n48blJz/5SYYOHZpDDz200ryHDx+eV155Jf369cs666yTO++8MxMmTMinn36aK6+88ivXDAAAgDXf\nagsJK/6K3bZt2yRfPHegXbt26dOnT7p3714xrmvXruncuXNGjx5dJSTMmjUrp556agYPHlyxrVu3\nbrn44osr3lvE5MmT88c//jFdu3bNVVddVbH9kEMOyb/927/lhhtuyE033ZTBgwdnr732yvvvv58k\nadGiRbW3blRnwIABefLJJ/PrX/86Dz/8cHr27Jmdd94522233VfexjBr1qycccYZOfrooyu2tW/f\nPoceemiuuuqqijmMGzcuTzzxRM4666wcddRRFWOPOOKI/OpXv8q4ceMyceLE7LfffkmSc845J7Vr\n187tt9+ezTbbrGL84Ycfnl69euWiiy7Kfvvtl3r16uXVV1/NjTfemD322CPXXHNNxdhevXqla9eu\nufTSS9O7d+/UrVs3SVJeXp6//vWvueWWWyoevNi9e/fsvvvueeSRRwqtGQAAAGu+VXprw9KlSzN/\n/vyKf5988knFF9JLL70066+/fo477rgkSc+ePTN69OiKiLBo0aLMnz8/DRs2zLrrrps333yzyvHL\ny8vTu3fvf3meDzzwQEqlUvr27VtlX58+fVJeXp6HH374XzpHp06d8tvf/jbbbrttnn322Zx//vk5\n8MAD0759+xxzzDG56aabVnrJf+3atXPYYYdV2taqVatstdVWmTVrVsX77r333tSqVSs9e/astO7z\n589P9+7dU15eXvEl/vXXX8/zzz+fjh07pnHjxpXGrpjv/PnzM3369CTJfffdlySVrlBIksaNG2fs\n2LEZM2ZMpV9qKJVKGTRoUKVtDRo0yNZbb53PP/88H3744b+ynAAAAKwhVukVCX/84x+zyy67VNle\nq1at7LrrrvnlL3+ZZs2aVWwfP358br311syZMyeLFi2q9J7qfk6wbt262WSTTQrNZcGCBfn8888r\nbVtnnXUq/tqeJNtuu22V9zVr1iz16tXL7Nmzv/T4ixcvrjLn+vXrp1GjRhWv99hjj9x7772ZOXNm\nnnzyyTz33HOZMWNGpk6dmj//+c+58sorc8EFF2TfffetdJymTZtWOs4Km266aV577bXMnTs3PeHF\nNAAAIABJREFU6667bmbNmpXy8vLsvvvu1c6xVCrljTfeSJK88sorSb64GuOBBx6odmySKuO33HLL\nKmOrW7ckad68eZVtKz7HigdWAgAAsHZbpSGhffv2OeWUUyqeU1AqlVK/fv1sueWWWX/99SuNHTly\nZIYPH57NN988J598crbZZpuKL50nnHBCFi5cWOX466yzTuG5nHDCCXn66acrXpdKpVx00UU58MAD\n8+mnnyZJGjZsWO17GzRoUDFmZa6//vqMGDGi0vEPPPDAXHTRRVXGlpWVpaysrOL1K6+8kjvuuCM3\n3XRT/vM//zPf//73KwWWlX3Oxo0bJ0nFVQQLFy5M/fr1c/3116/02RArjrViPffZZ5/0799/pZ9r\nq622qjS+fv36Kx37j1bc5gAAAMC31yoNCRtuuGHat2//leOWLVuWG264IfXq1cvNN9+czTffvGLf\n8uXLq/21gX/WL3/5yyq3DmyzzTZJ/u/L9aefflrtl/ZFixZ9ZbQ4+OCDs+uuu1battFGGxWa23bb\nbZdf/OIXWbx4ccaPH5+pU6fmiCOOqNi/sr/er/g8K6JM48aN88knn6R169Zf+YV/RYSoU6dOtVeN\nrGz8xx9//NUfCAAAgO+M1fawxb83b968LFiwINttt12liJAk06dPz5IlS6q9teGf8fdXAPyjbbfd\nNjNnzswrr7ySjTfeuNK+2bNn5/PPP0/Lli2/9Pibb755lbmv8MILL+Tuu+9O69atc+CBB670GM2a\nNUt5eXmVWyTefPPNLFmyJPXq1au0/fXXX0+Sijlvt912mT59ep5++unsueeelcYuWbIkS5YsqQgC\n2223XZJkxowZKS8vr7K+8+bNywYbbFDxukWLFnn44Yfz8ssvp0OHDpXGPvXUU3nttdfStWvX/Nu/\n/dtKPx8AAADfPqv0YYtFbbDBBqlTp07ee++9LF26tGL7Rx99lEsvvbTiaoCiVybUqVPnnxq/3377\npby8PDfddFOVfTfddFNKpVJ69uxZ6FjVqVWrVm655ZZcdtllK33Wwocffpi77rortWvXzl577VVp\n35IlS3LnnXdW2jZ9+vS8/fbbadWqVcX69OrVK+Xl5dXe2nDttddm9913z5QpU5IkW2yxRdq2bZt3\n3303EyZMqDR24cKFOeqoo9K9e/eKn+fs0aNHkuSOO+6o2JZ8cbXG6aefnksuuaTa5zgAAADw7VYj\nVyTUrl07++67b/7whz/kxBNPTI8ePfL+++/nlltuyRFHHJHp06fn8ccfzxVXXJEePXqkTZs2X3q8\nZs2a5fXXX89ZZ52VsrKy7L///lWuNPh7nTt3zn777Zc//OEPOe6447L33nunVq1aeeqppzJx4sS0\nb98+ffr0+dqfb8cdd8zpp5+eSy+9NAcffHD23Xff7LzzzhW/lvCXv/wl999/f+bNm5ef//znadGi\nRaX3b7311hk9enT+8pe/pHXr1pk3b15uuOGG1KpVKyeddFLFuMMOOyyTJk3Kk08+mf79++eAAw5I\nqVTKlClTMmnSpOyyyy7p2LFjxfghQ4akf//+Oeecc/LSSy+lTZs2ef/99zN+/PjMmTMnQ4YMSe3a\ntZN8cUVH//79M3bs2PTv3z8HH3xwlixZkjvuuCPvvvtuLrjggipXTAAAAPDtt8pCQqlU+qduRzj3\n3HOzzjrr5LHHHsu0adPSvHnznHzyyendu3d22WWXzJ49O7fccksaNGhQERJWdvxTTz017777bu6/\n//489dRT2Weffb7y/Jdddlnatm2bCRMm5JJLLkl5eXmaNWuWn/70pxk0aFDFF+qv+/kGDBiQXXfd\nNbfeemtmzJiRBx98MJ999lkaNGiQzTffPF27ds0RRxyRHXbYocp7GzVqlCuvvDKXXHJJLrnkkixe\nvDjbbrttzj///HTq1KliXK1atXLddddlzJgxue+++3LhhRdm+fLl2XLLLXPKKadk0KBBFVdrJF/E\ngTvvvDMjR47Mgw8+mFtvvTWNGjVK69atc/rpp6dz586V5nHmmWdm2223ze23356hQ4dWHGPUqFFV\nfiniy9bmX71NBQAAgDVHqXxlj/tntXvzzTfzox/9KK1atcodd9xR09NZo3TqelDWbzOgpqcBAADw\nT/vg2VG5Z9zvVsmxNt543VVynH9FjTwjAQAAAFg7CQkAAABAYTXysEVW7p99FgMAAABrtjp1aq8R\ntySsKp6RwFph252+n0XLP6vpaXyp0ue1snWzVjU9DQAAYA3TdNMNc+tNo2p6GquMKxJYKzRtvlk2\n6btdTU/jS701dmbuHD22pqexSqyopXPnzq/hmXy3WPfVz5qvfta8Zlj31c+ar37WvGZY9+JW1Rqt\nCVc2eEYCAAAAUJiQ8B23ZMmSlJWVpWfPnjU9FQAAANYCbm1YBUaMGJERI0YUGlsqlTJ27Njssssu\n3/Csiqlbt26GDx+exo0b1/RUAAAAWAsICatAjx49st12le/fnzBhQh599NH069cvHTp0qLSvZcuW\nq3N6X6pUKqVbt241PQ0AAADWEkLCKtCiRYu0aNGi0rYZM2YkSVq1auWLOgAAAN8anpFQgyZOnJj+\n/funQ4cO2XHHHdOxY8ccf/zxeeGFF6qMnTdvXs4666zsscce2WmnnXLwwQdn0qRJefrpp1NWVpYh\nQ4ZUGv/UU0+lX79+adeuXTp06JCTTz45b775Zs4888yUlZXl+eefT1L9MxJuu+22lJWV5fbbb88T\nTzyRfv36Zeedd07btm3Tt2/fPPvss1Xm98ADD+Tggw/OTjvtlN122y2/+MUv8tFHH+XHP/5xysrK\n8sEHH6zaxQMAAKBGuCKhhtxyyy0577zzUlZWlp/+9KdZf/31M2fOnIwdOzb9+/fP+PHjK26BWLZs\nWQYNGpSZM2ema9eu2WefffLee+9l6NCh2WOPPVIqlSod+7nnnssxxxyT+vXr59hjj81WW21VEQSa\nN29eZXx1SqVSpk2blquuuip9+/bN4YcfnhdeeCG33HJLjj/++Dz00ENZb731knwREU455ZRstNFG\nFf/74IMPZuDAgVm2bFmh8wEAALB2EBJqyJtvvpn27dtn2LBhadKkScX2Jk2a5Oyzz85tt92Ws846\nK0ny4IMP5qWXXsoPf/jDDB8+vGJsly5dctBBB1U59siRI7Ns2bJccMEF6d69e5KkV69eueqqq3L1\n1VcX+mJfXl6eBx54IPfdd1+aN2+eJOndu3c++OCDTJo0KVOmTKm4imH48OEplUq55ppr0rp16yTJ\nAQcckNNPPz333HOPkAAAAPAt4taGGvLzn/88N998c0VEWLBgQebPn5+mTZsmSd54442KsU888URK\npVJ69+5d6RgtWrSoCAUrlJeXZ9q0aWnUqFGVZzOsuEqhqM6dO1dEhBV22mmnlJeX57333kuSvP/+\n+3n11VezzTbbVESEFU488cTC5wIAAGDt4IqEGvLpp59mxIgRefDBB/P2229n6dKlFftKpVKWLVtW\n8XpFVNh6662rHKddu3b5/e9/X/F67ty5Wbx4ccrKylKrVuVO1KhRo2y//fbVPoOhOltttVWVbQ0a\nNEiSfP7550mS119/PUmqBIckadasWb73ve/lww8/LHQ+AAAA1nxCQg0oLy/P4MGD88wzz6R9+/Y5\n/vjjs9lmm6Vu3bqZM2dOzjnnnErjP/300yRJw4YNqxxr/fXXr/R60aJFKx2bpOK5BkUUuXqhyPmE\nBAAAgG8PIaEGPPPMM3nmmWfSqlWrjB49OnXq/N9/hr+/MmGFFV/oP/vssyr7FixYUHhsdeP/VfXq\n1Uvyxa8/rI7zAQAAULM8I6EGrLgdYNddd60UEZJk6tSpVcZvttlmld7392bMmFHpYYYbbbRR6tSp\nkzfffLPK2M8++ywvv/zyvzT3f2Zub7/9dubOnbtKzwcAAEDNEhJqwMYbb5yk8gMVk+R//ud/cu+9\n9yZJFi9eXLH9Bz/4QcrLy3P//fdXGj9nzpxMmjSp0rY6deqkTZs2+eSTT6pEiVGjRlU67qrQtGnT\nbLrppnn55ZczZ86cSvtGjBjhFxsAAAC+Zdza8A0qLy+vdnv79u2z6aab5qGHHsoll1yS73//+5k5\nc2buuOOOXHXVVRk8eHD+53/+J7fffnv22muv9OrVK9dcc00mTpyYunXrpn379nn33Xdz++23p3fv\n3rntttsqHX/w4ME54YQTctppp+XHP/5xNt100zzzzDN5/vnns+uuu+app55apZ9z8ODBOf/883Ps\nscemb9++WX/99fOnP/0pn3zySVq0aJFXX311lZ4PAACAmuOKhG/Qyv4a36BBg1x//fXp2LFj7rzz\nzlxwwQX5y1/+klGjRqVDhw752c9+lnr16uXyyy/P3/72tzRs2DBjxozJ3nvvnYceeigXXnhhpk6d\nmosvvjgdO3ZMktSuXbvi+F26dMmwYcOyySab5Nprr80VV1yRUqmUMWPGVDxD4e9/0aFUKlWZa3Xb\nVva5+vXrl1/+8pepW7durrzyyowcOTJNmzbNtddeWzHmH39BAgAAgLVTqXxlfzZnrfC73/0u559/\nfk488cSceOKJXzn+0EMPzf/+7//m4Ycfzuabb/6Nz2+33XbL/Pnz89///d+VYsc/64e9f5RN+m63\nCme26r01dmYmjP79Vw9cC2y88bpJkrlz59fwTL5brPvqZ81XP2teM6z76mfNVz9rXjOs++q3Ys1r\nkj8TrwXefffdnHLKKTnvvPOq7LvrrrtSKpXSoUOHim1/+MMfcuyxx+bRRx+tNHbmzJl58cUX07Rp\n01UaEW6++eYMHDgwL774YqXtjzzySObNm5cf/OAH/1JEAAAAYM3hGQlrgSZNmuTDDz/M5MmT8/77\n76dLly5ZsmRJ7rvvvrz44ovp3LlzpZDQokWLPPvss/nv//7v9O/fP82bN89bb72VMWPGJElOO+20\nVTq/rbfeOk8//XR+8pOf5Mc//nE222yzzJo1KzfddFPq1q2bn/70p6v0fAAAANQcIWEt8dvf/jbX\nX399Hnjggfz5z3/OsmXL0qxZs5xyyik55phjKo3dfvvtc+utt+a6667LhAkTMnfu3DRq1CitWrXK\nMccck913332Vzm2PPfbI6NGjc8MNN+R3v/tdPvjgg6y33nrZY489ctxxx6V169ar9HwAAADUHCFh\nLdGgQYPCz0FIvogJw4YN+4Zn9X/at2+f9u3br7bzAQAAUDM8IwEAAAAoTEgAAAAAChMSAAAAgMKE\nBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAA\nAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAw\nIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEAAAAoTEgAAAAAChMSAAAAgMKEBAAAAKAwIQEA\nAAAoTEgAAAAAChMSAAAAgMLq1PQEoIjNN9osr42dWdPT+FJNNmhS01MAAAD4xgkJrBVuGXVz5s6d\nX9PTAAAA+M5zawMAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJ\nCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAA\nAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBh\nQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIA\nAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQ\nmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAAAAAAFCYkAAAAAIUJCQAAAEBhQgIAAABQmJAA\n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\nlZUV+vbtqzAna4i88cYbOo2PiIi6P+6RQERERC8sV1dXLF68GNHR0Zg1axbeffddWFpaoqioCOfP\nn4coiggLC4OlpWWnxxo5ciSMjY2Rn5+Puro6ne1DEBQUhMzMTMTGxiI1NRVOTk7o1asXbt++jfPn\nz8PIyAjBwcFKt8vJyQGg+tKYREREmmAjgYiIiPRGnasr6Npf/vIXjB49GnFxcbhw4QLq6+vxyiuv\nQCqVYt68eRgzZoxaxzE1NYWbmxtOnTqFCxcuQCqVKq152itNPD43ZMgQ7NmzB99//z1OnDiB1NRU\nNDY2wtLSEp6enggICFDZLEhLS4MgCJg4caJaj4eIiKg9gvj4hYmJiIiI6KkdOXIEQUFBmDx5Mr75\n5ht9hyOXn5+PGTNm4M0338TPP/+s73CIiKiL4x4JRERERFri6ekJGxsbpKWlobCwUN/hyO3YsQOC\nIOCTTz7RdyhERNQNsJFAREREpCVGRkZYtWoVHjx4gIiICH2HA+DRpxGSk5Nhb2+PqVOn6jscIiLq\nBthIICIiItIiT09PeHt749dff0VaWppeY2lra8Pf/vY39OjRA59//rleYyEiou6DjQQiIiIiLfv7\n3/8Oa2trhISEoKysTG9xRERE4D//+Q/Wrl0LiUSitziIiKh74WaLRERERERERKQ2fiKBiIiIiIiI\niNTGRgIRERERERERqY2NBCIiIiIiIiJSGxsJRERERERERKQ2NhKIiIiIiIiISG1sJBARERERERGR\n2thIICIiIiIiIiK1sZFARERERERERGpjI4GIiIiIiIiI1MZGAhERERERERGpjY0EIiIiIiIiIlIb\nGwlEREREREREpDY2EoiIiIiIiIhIbf8DXR6deyci7IIAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f9da490cc90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pd.DataFrame(np.array([t.best * 1000 for t in (Nw, Sw, Ns, Ss, Np, Sp)]).reshape((3, 2)),\n",
" index=[\"Word\\nTokenization\", \"Sentence\\nTokenization\", \"Part-of-Speech\\nTagging\"],\n",
" columns=[\"NLTK\", \"spaCy\"]\n",
" ).plot.barh()\n",
"plt.subplots_adjust(left=0.2)\n",
"plt.title('Timings (Shorter is better)')\n",
"plt.xlabel('Time (ms)')\n",
"plt.gca().invert_yaxis()\n",
"plt.rcParams['savefig.dpi'] = 150\n",
"plt.savefig('timing.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Copyright &copy; 2016 The Data Incubator. All rights reserved.*"
]
}
],
"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.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.