{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "f3452caf-df58-4394-b0d6-46459cb47045",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"S:\\WENV_TORCHTEXT\\Lib\\site-packages\\torchtext\\vocab\\__init__.py:4: UserWarning: \n",
"/!\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\ \n",
"Torchtext is deprecated and the last released version will be 0.18 (this one). You can silence this warning by calling the following at the beginnign of your scripts: `import torchtext; torchtext.disable_torchtext_deprecation_warning()`\n",
" warnings.warn(torchtext._TORCHTEXT_DEPRECATION_MSG)\n",
"S:\\WENV_TORCHTEXT\\Lib\\site-packages\\torchtext\\utils.py:4: UserWarning: \n",
"/!\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\ \n",
"Torchtext is deprecated and the last released version will be 0.18 (this one). You can silence this warning by calling the following at the beginnign of your scripts: `import torchtext; torchtext.disable_torchtext_deprecation_warning()`\n",
" warnings.warn(torchtext._TORCHTEXT_DEPRECATION_MSG)\n"
]
}
],
"source": [
"from torch.utils.data import IterableDataset, DataLoader\n",
"from torchtext.vocab import build_vocab_from_iterator\n",
"\n",
"import regex as re\n",
"import itertools\n",
"from itertools import islice\n",
"\n",
"from torch import nn\n",
"import torch\n",
"\n",
"from tqdm.notebook import tqdm\n",
"device = 'cuda'"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "5ee9ad24-a5d2-47e1-a5c6-88981dc22b99",
"metadata": {},
"outputs": [],
"source": [
"def get_words_from_line(line):\n",
" line = line.rstrip()\n",
" yield ''\n",
" for m in re.finditer(r'[\\p{L}0-9\\*]+|\\p{P}+', line):\n",
" yield m.group(0).lower()\n",
" yield ''\n",
"\n",
"def get_word_lines_from_file(file_name):\n",
" with open(file_name, 'r', encoding='utf8') as fh:\n",
" for line in fh:\n",
" yield get_words_from_line(line)\n",
"\n",
"def look_ahead_iterator(gen):\n",
" prev2, prev1, next1, next2 = None, None, None, None\n",
" for item in gen:\n",
" if prev2 is not None and prev1 is not None and next1 is not None and next2 is not None:\n",
" yield (prev2, prev1, next2, item, next1)\n",
" prev2, prev1, next1, next2 = prev1, next1, next2, item"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "93279277-0765-4f85-9666-095fc7808c81",
"metadata": {},
"outputs": [],
"source": [
"class FiveGrams(IterableDataset):\n",
" def __init__(self, text_file, vocabulary_size):\n",
" self.vocab = build_vocab_from_iterator(\n",
" get_word_lines_from_file(text_file),\n",
" max_tokens=vocabulary_size,\n",
" specials=['']\n",
" )\n",
" self.vocab.set_default_index(self.vocab[''])\n",
" self.vocabulary_size = vocabulary_size\n",
" self.text_file = text_file\n",
"\n",
" def __iter__(self):\n",
" return look_ahead_iterator(\n",
" (self.vocab[t] for t in itertools.chain.from_iterable(get_word_lines_from_file(self.text_file)))\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "6eb5fbd9-bc0f-499d-85f4-3998a4a3f56e",
"metadata": {},
"outputs": [],
"source": [
"class SimpleFiveGramNeuralLanguageModel(nn.Module):\n",
" def __init__(self, vocabulary_size, embedding_size):\n",
" super(SimpleFiveGramNeuralLanguageModel, self).__init__()\n",
" self.embedding = nn.Embedding(vocabulary_size, embedding_size)\n",
" self.linear1 = nn.Linear(embedding_size * 4, embedding_size)\n",
" self.linear2 = nn.Linear(embedding_size, vocabulary_size)\n",
" self.softmax = nn.Softmax(dim=1)\n",
" self.embedding_size = embedding_size\n",
"\n",
" def forward(self, x):\n",
" embeds = self.embedding(x).view(x.size(0), -1)\n",
" out = self.linear1(embeds)\n",
" out = self.linear2(out)\n",
" return self.softmax(out)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "d0dc7c69-3f27-4f00-9b91-5f3a403df074",
"metadata": {},
"outputs": [],
"source": [
"def train(embed_size,vocab_size,num_epochs,batch_size,train_file_path):\n",
" train_dataset = FiveGrams(train_file_path, vocab_size)\n",
" model = SimpleFiveGramNeuralLanguageModel(vocab_size, embed_size).to(device)\n",
" \n",
" data = DataLoader(train_dataset, batch_size=batch_size)\n",
" optimizer = torch.optim.Adam(model.parameters())\n",
" criterion = torch.nn.CrossEntropyLoss()\n",
" \n",
" model.train()\n",
" step = 0\n",
" for _ in range(num_epochs):\n",
" for x1, x2, x3, x4, y in tqdm(data, desc=\"Train loop\"):\n",
" y = y.to(device)\n",
" x = torch.cat((x1.unsqueeze(1), x2.unsqueeze(1), x3.unsqueeze(1), x4.unsqueeze(1)), dim=1).to(device)\n",
" optimizer.zero_grad()\n",
" ypredicted = model(x)\n",
" \n",
" loss = criterion(torch.log(ypredicted), y)\n",
" if step % 5000 == 0:\n",
" print(step, loss)\n",
" step += 1\n",
" loss.backward()\n",
" optimizer.step()\n",
" step = 0\n",
" break\n",
" model.eval()\n",
"\n",
" return model, train_dataset.vocab"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9a1b2240-d2ed-4c56-8443-12113e66b514",
"metadata": {},
"outputs": [],
"source": [
"def get_gap_candidates(words, model, vocab, n=20):\n",
" ixs = vocab(words)\n",
" ixs = torch.tensor(ixs).unsqueeze(0).to(device)\n",
"\n",
" out = model(ixs)\n",
" top = torch.topk(out[0], n)\n",
" top_indices = top.indices.tolist()\n",
" top_probs = top.values.tolist()\n",
" top_words = vocab.lookup_tokens(top_indices)\n",
" return list(zip(top_words, top_probs))\n",
"\n",
"def clean(text):\n",
" text = text.replace('-\\\\n', '').replace('\\\\n', ' ').replace('\\\\t', ' ')\n",
" text = re.sub(r'\\n', ' ', text)\n",
" text = re.sub(r'(?<=\\w)[,-](?=\\w)', '', text)\n",
" text = re.sub(r'\\s+', ' ', text)\n",
" text = re.sub(r'\\p{P}', '', text)\n",
" text = text.strip()\n",
" return text\n",
" \n",
"def predictor(prefix, suffix, model, vocab):\n",
" prefix = clean(prefix)\n",
" suffix = clean(suffix)\n",
" words = prefix.split(' ')[-2:] + suffix.split(' ')[:2]\n",
" candidates = get_gap_candidates(words, model, vocab)\n",
"\n",
" probs_sum = 0\n",
" output = ''\n",
" for word, prob in candidates:\n",
" if word == \"\":\n",
" continue\n",
" probs_sum += prob\n",
" output += f\"{word}:{prob} \"\n",
" output += f\":{1-probs_sum}\"\n",
"\n",
" return output"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "40af2781-3807-43e8-b6dd-3b70066e50c1",
"metadata": {},
"outputs": [],
"source": [
"def generate_result(input_path,model, vocab, output_path='out.tsv'):\n",
" lines = []\n",
" with open(input_path, encoding='utf-8') as f:\n",
" for line in f:\n",
" columns = line.split('\\t')\n",
" prefix = columns[6]\n",
" suffix = columns[7]\n",
" lines.append((prefix, suffix))\n",
"\n",
" with open(output_path, 'w', encoding='utf-8') as output_file:\n",
" for prefix, suffix in tqdm(lines):\n",
" result = predictor(prefix, suffix, model, vocab)\n",
" output_file.write(result + '\\n')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "d6b7234f-1f40-468f-8c69-2875bb1ec947",
"metadata": {},
"outputs": [],
"source": [
"import subprocess\n",
"\n",
"def evaluate():\n",
" cmd = 'wsl bash -c \"cd /mnt/d/UAM/MODELOWANIE/5GRAM && ./geval -t dev-0\"'\n",
" result = subprocess.run(cmd, shell=True, capture_output=True, text=True)\n",
" return float(result.stdout)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "4c716463-27fe-4c2b-b859-ac9c8aff1942",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1eac733e07974322bfd47dcff96aa8d4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.2551, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3df53998bc334a29bd355578738897d3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 100, 'vocab_size': 10000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 335.54}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "df35ef1138644a00a86f999a6cb8a0cb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.2881, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.6065, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.4173, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.3352, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1e3d1e4344f44285832accfc83ab2233",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 100, 'vocab_size': 10000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 199.0}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c6d6813fbb2c4fcba084fffc5c0105b6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.9662, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3546c4fd825a4057b05c6105b25f6712",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 100, 'vocab_size': 20000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 342.38}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bd6d71e568a848c19bb8ce762d5b53ef",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.9619, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.8952, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.7382, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.6068, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cd0c53ddfb3148609218b56c72ce7777",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 100, 'vocab_size': 20000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 190.06}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5261144cdc7e4c69aa28d88fd9fad7fe",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(10.3571, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "42b54814d7f741ddb38d8e00d6db2126",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 100, 'vocab_size': 30000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 344.0}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bc582df4aaa741e2a46ac64a282f36fc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(10.3726, device='cuda:0', grad_fn=)\n",
"5000 tensor(5.0450, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.8688, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.7152, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "38a391c3471442dc8620524f0d5c5fc8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 100, 'vocab_size': 30000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 188.45}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5d3d20e040bb4c609143cc335143b6ed",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.2857, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "65a44fd20fce4ec49528763ebb351f4b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 200, 'vocab_size': 10000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 288.34}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ba3783d3ce5c47ce8c02443ce7601288",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.2722, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.4829, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.2794, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.2239, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9b2f000b5c7a4ab08fb48c78b45c3a54",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 200, 'vocab_size': 10000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 187.39}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1eff87ac9b594efb8406f3fc5e77a8ce",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.9422, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6883012f36d44ab0842b14281ef5eb65",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 200, 'vocab_size': 20000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 294.44}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1006d625eea94078a56bb393800b2e7f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.9541, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.7515, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.5669, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.4938, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "53d6628208ac4997a290cdde469ccfb1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 200, 'vocab_size': 20000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 178.27}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b9ed3ef499f44fd2942c0d9e2d827442",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(10.3758, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ccb8ed60361c4a509afb628f52ce609c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 200, 'vocab_size': 30000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 297.89}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "62c15cbb03c14cc7aee9f3245b3f536e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(10.3769, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.8590, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.7090, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.5810, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "85f4db52171945fa9fb2890431a276b2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 200, 'vocab_size': 30000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 177.66}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a87614dd8b3447dea6447d7d73a2677b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.2580, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "32802641dc974b6cb3404a12c51b611b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 300, 'vocab_size': 10000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 271.01}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f4ebf3dde5274a90ac74dcc17f066b10",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.2549, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.4134, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.2280, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.1653, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a97a141657af410b989bbd8ab8710955",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 300, 'vocab_size': 10000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 181.91}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "391718c3103d4b9ebfb571b7234e946f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.9555, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3aa3a60daf6145389312b031ca55e11d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 300, 'vocab_size': 20000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 275.53}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "939dfbbf01d5425da9f885060ae44451",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(9.9647, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.6888, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.5068, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.4465, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "56e1065d5c01461e8cdfc38b7db2f3ed",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 300, 'vocab_size': 20000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 174.42}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d026a38b16b74410b238e9c6b7c997a6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(10.3563, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "58d964531ad14b69ba72b7d8d538cf2d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 300, 'vocab_size': 30000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/nano.txt', 'perplexity': 277.32}\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0bddf3d40c054e92805c100cad8aaccd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Train loop: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 tensor(10.3580, device='cuda:0', grad_fn=)\n",
"5000 tensor(4.8159, device='cuda:0', grad_fn=)\n",
"10000 tensor(4.6442, device='cuda:0', grad_fn=)\n",
"15000 tensor(4.5524, device='cuda:0', grad_fn=)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "aedcfa56f6c345dd976b37535d0de2b4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10519 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'embed_size': 300, 'vocab_size': 30000, 'num_epochs': 1, 'batch_size': 8192, 'train_file_path': 'train/train.txt', 'perplexity': 173.38}\n"
]
}
],
"source": [
"embed_sizes = [100,200,300]\n",
"vocab_sizes = [10_000, 20_000, 30_000]\n",
"num_epochss = [1]\n",
"batch_sizes = [8192]\n",
"train_file_paths = ['train/nano.txt', 'train/train.txt']\n",
"\n",
"results = []\n",
"\n",
"for embed_size in embed_sizes:\n",
" for vocab_size in vocab_sizes:\n",
" for num_epochs in num_epochss:\n",
" for batch_size in batch_sizes:\n",
" for train_file_path in train_file_paths:\n",
" model, vocab = train(embed_size,vocab_size,num_epochs,batch_size,train_file_path)\n",
" generate_result('dev-0/in.tsv', model, vocab, output_path='dev-0/out.tsv')\n",
" result = evaluate()\n",
"\n",
" config = {\"embed_size\": embed_size, \"vocab_size\": vocab_size, \"num_epochs\": num_epochs, \"batch_size\": batch_size, \"train_file_path\": train_file_path, \"perplexity\": result }\n",
" print(config)\n",
" results.append( config )"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "5d835463-01ed-4b44-a652-1ea469542d89",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'embed_size': 100,\n",
" 'vocab_size': 10000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 335.54},\n",
" {'embed_size': 100,\n",
" 'vocab_size': 10000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 199.0},\n",
" {'embed_size': 100,\n",
" 'vocab_size': 20000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 342.38},\n",
" {'embed_size': 100,\n",
" 'vocab_size': 20000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 190.06},\n",
" {'embed_size': 100,\n",
" 'vocab_size': 30000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 344.0},\n",
" {'embed_size': 100,\n",
" 'vocab_size': 30000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 188.45},\n",
" {'embed_size': 200,\n",
" 'vocab_size': 10000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 288.34},\n",
" {'embed_size': 200,\n",
" 'vocab_size': 10000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 187.39},\n",
" {'embed_size': 200,\n",
" 'vocab_size': 20000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 294.44},\n",
" {'embed_size': 200,\n",
" 'vocab_size': 20000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 178.27},\n",
" {'embed_size': 200,\n",
" 'vocab_size': 30000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 297.89},\n",
" {'embed_size': 200,\n",
" 'vocab_size': 30000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 177.66},\n",
" {'embed_size': 300,\n",
" 'vocab_size': 10000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 271.01},\n",
" {'embed_size': 300,\n",
" 'vocab_size': 10000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 181.91},\n",
" {'embed_size': 300,\n",
" 'vocab_size': 20000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 275.53},\n",
" {'embed_size': 300,\n",
" 'vocab_size': 20000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 174.42},\n",
" {'embed_size': 300,\n",
" 'vocab_size': 30000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/nano.txt',\n",
" 'perplexity': 277.32},\n",
" {'embed_size': 300,\n",
" 'vocab_size': 30000,\n",
" 'num_epochs': 1,\n",
" 'batch_size': 8192,\n",
" 'train_file_path': 'train/train.txt',\n",
" 'perplexity': 173.38}]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "b5058255-4478-427a-84f1-fe1f57fc3828",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAy0AAAIjCAYAAAAObfTCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAACP/UlEQVR4nOzdeVhUZf8G8HvYhn1TFonVJRUXNFLCUlEJIV/3N9NcsNwDzSgzet3NMLW0zK1SsMwlck3Tct+XNHFJwyXcAVdAUNnm+f3hjxMjwzIwMNv9uS6umnPOPPOc42Hm3Hyf54xMCCFARERERESko0y03QEiIiIiIqKyMLQQEREREZFOY2ghIiIiIiKdxtBCREREREQ6jaGFiIiIiIh0GkMLERERERHpNIYWIiIiIiLSaQwtRERERESk0xhaiIiIiIhIpzG0kFp8fX3xn//8p9pf58qVK5DJZEhISNBYmyEhIQgJCdFYe1S2wYMHw9bWttpfZ8+ePZDJZNizZ0+1v1ZVqXMOhoSEoGnTptXboRpW3b+DNXkuZGdnY+jQoXB3d4dMJsPYsWOr/TXVlZCQAJlMhuPHj2uszcGDB8PX11dj7VU3mUyGKVOmVOq5vr6+GDx4sEb7Q0SVx9BiAIo+mEr7OXLkiLa7WK2uXLmCt956C/Xq1YOlpSXc3d3Rrl07TJ48Wdtdqzbr1q2DTCbDd999V+o227dvh0wmw1dffVWDPdMchUKB77//HkFBQXB2doadnR2ef/55DBo0yGDO6Vu3bmHKlClISkrSeNu+vr5K7wOurq5o27Yt1q9fr/HX0mUrV67EvHnzNN7up59+ioSEBIwaNQo//PADBg4cqPHXMAa//vprpUMFle/Ro0eYMmWKXvxRh6g8ZtruAGnOtGnT4OfnV2J5/fr1tdCbmnHp0iW0atUKVlZWePvtt+Hr64vU1FT8+eef+OyzzzB16lRp299//12LPdWsLl26wMHBAStXrsTQoUNVbrNy5UqYmpqib9++Ndw7zRgzZgwWLFiA7t27o3///jAzM0NycjK2bt2KunXr4qWXXgIAtGvXDo8fP4aFhYWWe1y+Z8/BW7duYerUqfD19UWLFi00/notWrTA+++/L73WkiVL0KtXLyxatAgjR47U+Otpm6pzYeXKlTh79qzGKyG7du3CSy+9ZNB/HKkJv/76KxYsWFBtweXx48cwM6vcpU5ycjJMTPT7b7uPHj2SPgc50oD0HUOLAYmIiMCLL76o7W7UqLlz5yI7OxtJSUnw8fFRWnf79m2lx/pwUVtRcrkc//3vfxEfH49bt27Bw8NDaf2TJ0+wfv16vPrqq3B1ddVSLysvPT0dCxcuxLBhw/DNN98orZs3bx7u3LkjPTYxMYGlpWVNd7FSavocfO655zBgwADp8aBBg1C/fn3MnTu3yqHlyZMnsLCw0KmLupo8F27fvg1/f3+NtVdQUACFQmFQ71OaVpljVJXzQS6XV/q5RKR5uvNpQ9WuaJ7InDlzsGDBAtStWxfW1tYICwvD9evXIYTA9OnT4enpCSsrK3Tv3h33799X2dbvv/+OFi1awNLSEv7+/li3bl2JbTIyMjB27Fh4eXlBLpejfv36+Oyzz6BQKEpsN3jwYDg4OMDR0RGRkZHIyMio0D5dvnwZnp6eJQILgBIX68+Op392+Ezxn+Kl9Js3b+Ltt9+Gm5sb5HI5mjRpgmXLlpXbt6ZNm6JDhw4llisUCjz33HP473//Ky1bvXo1AgMDYWdnB3t7ezRr1gxffvllme0PGDAACoUCq1evLrFuy5YtyMzMRP/+/QE8/bCfPn066tWrB7lcDl9fX3z88cfIzc0t8dytW7eiffv2Ul9atWqFlStXSuv379+P119/Hd7e3pDL5fDy8sJ7772Hx48fq+znP//8g86dO8PGxgYeHh6YNm0ahBBl7ltKSgqEEHj55ZdLrCsa6lTk2XkMZQ2XfPYvjStWrEBgYCCsrKzg7OyMvn374vr162X27fTp05DJZNi0aZO07MSJE5DJZHjhhReUto2IiEBQUJD0uPg5uGfPHrRq1QoA8NZbb0l9fHYe17lz59ChQwdYW1vjueeew6xZs8rsX1nc3d3RuHFjpKSkSMsqcn4XHePVq1djwoQJeO6552BtbY2srCzpeO/btw8jRoxArVq1YG9vj0GDBuHBgwfl9ik3NxeTJ09G/fr1pfPpww8/VDo3IyMjYWlpifPnzys9t3PnznBycsKtW7eU+ll0LoSEhGDLli24evWqdHx9fX2RnZ0NGxsbvPvuuyX6c+PGDZiamiIuLk5lf4teIyUlBVu2bJHavXLlCoCnYWbIkCFwc3ODpaUlAgICsHz5cqU2ir8Xz5s3T/q9PHfunMrX7NWrV4lzq2vXriXOw6NHj0Imk2Hr1q0ljnFMTAxcXFxgY2ODnj17KgX/IgsXLkSTJk0gl8vh4eGBqKioCr0XKxQKzJs3D02aNIGlpSXc3NwwYsSIcv/9Bw8ejAULFgCA0u9peccoLy8PkyZNQmBgIBwcHGBjY4O2bdti9+7dJV7j2TktU6ZMgUwmw6VLlzB48GA4OjrCwcEBb731Fh49eqT03GfntBSd6wcPHiz3eCoUCkyZMgUeHh6wtrZGhw4dcO7cuQrPk6nIZ0J5n7FXrlyBi4sLAGDq1KnS8eVwPNJXrLQYkMzMTNy9e1dpmUwmQ61atZSW/fjjj8jLy8Po0aNx//59zJo1C3369EHHjh2xZ88ejB8/HpcuXcL8+fPxwQcflLiAuXjxIt544w2MHDkSkZGRiI+Px+uvv45t27bh1VdfBfC0JN2+fXvcvHkTI0aMgLe3Nw4dOoTY2FikpqZKY8yFEOjevTsOHDiAkSNHonHjxli/fj0iIyMrtM8+Pj7YsWMHdu3ahY4dO6p1vObNm4fs7GylZXPnzkVSUpJ0zNLT0/HSSy9BJpMhOjoaLi4u2Lp1K4YMGYKsrKwyh5y88cYbmDJlCtLS0uDu7i4tP3DgAG7duiUN29q+fTv69euHTp064bPPPgMAnD9/HgcPHlR5UVWkXbt28PT0xMqVKxETE6O0buXKlbC2tkaPHj0AAEOHDsXy5cvx3//+F++//z6OHj2KuLg4nD9/XmmOQ0JCAt5++200adIEsbGxcHR0xMmTJ7Ft2za8+eabAIDExEQ8evQIo0aNQq1atXDs2DHMnz8fN27cQGJiolI/CgsLER4ejpdeegmzZs3Ctm3bMHnyZBQUFGDatGml7ltRCE1MTMTrr78Oa2vrUrdVdVx++OEHpWVXr17FhAkTlMLOjBkzMHHiRPTp0wdDhw7FnTt3MH/+fLRr1w4nT56Eo6OjyvabNm0KR0dH7Nu3D926dQPwNMiZmJjg1KlTyMrKgr29PRQKBQ4dOoThw4erbKdx48aYNm0aJk2ahOHDh6Nt27YAgDZt2kjbPHjwAOHh4ejVqxf69OmDn3/+GePHj0ezZs0QERFR4WNSJD8/H9evX6/0+T19+nRYWFjggw8+QG5urtJfvKOjo+Ho6IgpU6YgOTkZixYtwtWrV6WLfFUUCgW6deuGAwcOYPjw4WjcuDHOnDmDuXPn4sKFC9iwYQMA4Msvv8SuXbsQGRmJw4cPw9TUFEuWLMHvv/+OH374oUSlscj//vc/ZGZm4saNG5g7dy4AwNbWFra2tujZsyfWrFmDL774AqamptJzVq1aBSGEFPif1bhxY/zwww9477334OnpKQ2/c3FxwePHjxESEoJLly4hOjoafn5+SExMxODBg5GRkVHi9zk+Ph5PnjzB8OHDIZfL4ezsrPI127Zti40bN0rnlhACBw8ehImJCfbv31/iPHw27I8ePRpOTk6YPHkyrly5gnnz5iE6Ohpr1qyRtpkyZQqmTp2K0NBQjBo1Svo3/OOPP3Dw4EGYm5ur7BsAjBgxAgkJCXjrrbcwZswYpKSk4Ouvv8bJkyfLfO6IESNw69YtbN++vcTvbFnHKCsrC9999x369euHYcOG4eHDh1i6dCk6d+6MY8eOVWioZZ8+feDn54e4uDj8+eef+O677+Dq6iq9B5elIsczNjYWs2bNQteuXdG5c2ecOnUKnTt3xpMnT8ptvyKfCRX5jHVxccGiRYswatQo9OzZE7169QIANG/evNw+EOkkQXovPj5eAFD5I5fLpe1SUlIEAOHi4iIyMjKk5bGxsQKACAgIEPn5+dLyfv36CQsLC/HkyRNpmY+PjwAg1q5dKy3LzMwUderUES1btpSWTZ8+XdjY2IgLFy4o9fWjjz4Spqam4tq1a0IIITZs2CAAiFmzZknbFBQUiLZt2woAIj4+vsx9P3v2rLCyshIARIsWLcS7774rNmzYIHJyckps2759e9G+fftS2/rpp58EADFt2jRp2ZAhQ0SdOnXE3bt3lbbt27evcHBwEI8ePSq1veTkZAFAzJ8/X2n5O++8I2xtbaXnvvvuu8Le3l4UFBSUua+qjBs3TgAQycnJ0rLMzExhaWkp+vXrJ4QQIikpSQAQQ4cOVXruBx98IACIXbt2CSGEyMjIEHZ2diIoKEg8fvxYaVuFQiH9v6p9jouLEzKZTFy9elVaFhkZKQCI0aNHK7XTpUsXYWFhIe7cuVPmvg0aNEgAEE5OTqJnz55izpw54vz58yW22717twAgdu/erbKdx48fi8DAQOHh4SFSU1OFEEJcuXJFmJqaihkzZihte+bMGWFmZlZi+bO6dOkiWrduLT3u1auX6NWrlzA1NRVbt24VQgjx559/CgBi48aN0nbPnoN//PFHqed5+/btBQDx/fffS8tyc3OFu7u76N27d5n9E+Lp72pYWJi4c+eOuHPnjjh16pTo27ev0r9JRc/vomNct27dEv/+Re8/gYGBIi8vT1o+a9ascvf/hx9+ECYmJmL//v1KbS5evFgAEAcPHpSW/fbbbwKA+OSTT8Q///wjbG1tRY8ePZSep+pc6NKli/Dx8SlxfIraK/r3KtK8efMy3yeK+Pj4iC5duigtmzdvngAgVqxYIS3Ly8sTwcHBwtbWVmRlZQkh/n0vtre3F7dv3y73tYrOk19//VUIIcTp06cFAPH666+LoKAgabtu3bopvQ8X/duEhoYq/Q6/9957wtTUVPocuH37trCwsBBhYWGisLBQ2u7rr78WAMSyZcukZZGRkUrHc//+/QKA+PHHH5X6vG3bNpXLnxUVFSVUXYqUdYwKCgpEbm6u0rIHDx4INzc38fbbbystByAmT54sPZ48ebIAUGK7nj17ilq1aikt8/HxEZGRkdLjih7PtLQ0YWZmVuL8nDJligCg1KYqFflMqOhn7J07d0ocAyJ9xeFhBmTBggXYvn270s+zwwQA4PXXX4eDg4P0uGj4yoABA5QmLAYFBSEvLw83b95Uer6Hhwd69uwpPS4aCnLy5EmkpaUBePoX8rZt28LJyQl3796VfkJDQ1FYWIh9+/YBeDoJ08zMDKNGjZLaMzU1xejRoyu0z02aNEFSUhIGDBiAK1eu4Msvv0SPHj3g5uaGb7/9tkJtAE+H4Lz99tvo3r07JkyYAOBpFWjt2rXo2rUrhBBK+9G5c2dkZmbizz//LLXN559/Hi1atFD661thYSF+/vlndO3aFVZWVgAAR0dH5OTkYPv27RXub5Gi+QrFh2+tXbsWT548kf5S/OuvvwJAiWpM0V+It2zZAuDpX/cePnyIjz76qMQ48OJ/KS/qNwDk5OTg7t27aNOmDYQQOHnyZIk+RkdHK7UTHR2NvLw87Nixo8x9i4+Px9dffw0/Pz+sX78eH3zwARo3boxOnTqVOCfL8s477+DMmTNYu3atVPFat24dFAoF+vTpo/Tv6u7ujgYNGqgcZlJc27Zt8eeffyInJwfA0+rZa6+9hhYtWmD//v0Anv7VWyaT4ZVXXqlwX59la2urNCfFwsICrVu3xj///FOh5//+++9wcXGBi4sLAgICkJiYiIEDB+Kzzz6r1PkdGRmp9O9f3PDhw5X+oj5q1CiYmZlJ558qiYmJaNy4MRo1aqT0+kVV0+L/DmFhYRgxYgSmTZuGXr16wdLSEkuWLKnQcVAlNDQUHh4e+PHHH6VlZ8+exenTp5WOuTp+/fVXuLu7o1+/ftIyc3NzjBkzBtnZ2di7d6/S9r1795aG75SlZcuWsLW1ld439+/fD09PTwwaNAh//vknHj16BCEEDhw4IFXsihs+fLjS73Dbtm1RWFiIq1evAgB27NiBvLw8jB07VmmO0rBhw2Bvby+9R6iSmJgIBwcHvPrqq0r/hoGBgbC1tS33d6k8qo6RqampVOVTKBS4f/8+CgoK8OKLL5b5nlzcs3O62rZti3v37iErK6vc55Z3PHfu3ImCggK88847Ss+r6OdaRT4TKvoZS2RIODzMgLRu3bpCE/G9vb2VHhcFGC8vL5XLnx2XXL9+/RLDPZ5//nkAT8fQuru74+LFizh9+nSpH8hFk+SvXr2KOnXqlPg+j4YNG5a7H8Vf+4cffkBhYSHOnTuHzZs3Y9asWRg+fDj8/PwQGhpa5vOzsrLQq1cvPPfcc/j++++lfbtz5w4yMjLwzTfflJgM/ux+lOaNN97Axx9/jJs3b+K5557Dnj17cPv2bbzxxhvSNu+88w5++uknRERE4LnnnkNYWBj69OmD8PDwcve9efPmaNq0KVatWiWNU165ciVq166Nzp07A3h6jE1MTErcRc7d3R2Ojo7SB+3ly5cBoNzvBrl27RomTZqETZs2lTg3MjMzlR6bmJigbt26SsuKnytlMTExQVRUFKKionDv3j0cPHgQixcvxtatW9G3b18pHJRlyZIliI+Px5IlS6S7jQFPhzgKIdCgQQOVzytrKAzw9CKloKAAhw8fhpeXF27fvo22bdvir7/+Ugot/v7+pQ75qQhPT88Sv2tOTk44ffp0hZ4fFBSETz75BDKZDNbW1mjcuLE07O327dtqn9+q7k5Y5NljaWtrizp16pT573zx4kWcP3++3PeJInPmzMHGjRuRlJSElStXVukmEyYmJujfvz8WLVqER48ewdraGj/++CMsLS3x+uuvV6rNq1evokGDBiVuTtC4cWNpfXFlHc/iTE1NERwcrHRutW3bFq+88goKCwtx5MgRuLm54f79+ypDy7Pv+U5OTgD+fW8v6tez77sWFhaoW7duiX4Xd/HiRWRmZpb6b1Hee2R5SjtGy5cvx+eff46///4b+fn55W7/rLKOib29faWfC/x7PJ99z3V2dpa2LUtFPhMq+hlLZEgYWoxQ8fHbFVkuypk0rYpCocCrr76KDz/8UOX6ogtXTTI1NUWzZs3QrFkzBAcHo0OHDvjxxx/LDS2DBw/GrVu3cOzYMaUPq6LJjAMGDCh1jk15Y4PfeOMNxMbGIjExEWPHjsVPP/0EBwcHpQ8fV1dXJCUl4bfffsPWrVuxdetWxMfHY9CgQSUm8KoyYMAAfPTRRzh+/Dg8PT2xe/dujBgxosRtPkubV6COwsJCvPrqq7h//z7Gjx+PRo0awcbGBjdv3sTgwYNL3GRBU2rVqoVu3bqhW7duCAkJwd69e3H16lWVN2AocuzYMbz77rsYOnRoiXklCoVCmrCs6rwv70sxX3zxRVhaWmLfvn3w9vaGq6srnn/+ebRt2xYLFy5Ebm4u9u/fr1SRrIyq/k7Wrl271PO/Mud3aVWWylIoFGjWrBm++OILleuf/UPKyZMnpYuxM2fOKFU0KmPQoEGYPXs2NmzYgH79+mHlypX4z3/+o1SJrk7qHM9XXnkFM2bMwJMnT7B//37873//g6OjI5o2bYr9+/fDzc0NAFSGFk2+tz9LoVDA1dVVqWJVXEUqSWVRdYxWrFiBwYMHo0ePHhg3bhxcXV2lmycU/fGlPFU5JtV5PIGKfSZo4zOWSNsYWkhtly5dghBC6SL4woULACB9U3K9evWQnZ1dbmDw8fHBzp07kZ2drXShmJycXKU+FlWcUlNTy9xu5syZ2LBhA9atW4dGjRoprXNxcYGdnR0KCwvL3Y/S+Pn5oXXr1lizZg2io6Oxbt069OjRo8StNC0sLNC1a1d07doVCoUC77zzDpYsWYKJEyeW+z07/fr1Q2xsLFauXAkfHx8UFhYqTSL28fGBQqHAxYsXpb/4Ak8nYWdkZEgX/vXq1QPwdIhMaa955swZXLhwAcuXL8egQYOk5aUNY1AoFPjnn3+UPkCfPVfU9eKLL2Lv3r1ITU0tNbTcuXMH//3vf9GiRQvp7kTF1atXD0II+Pn5VerDvWiY1v79++Ht7S1dKLZt2xa5ubn48ccfkZ6ejnbt2pXZjiaCZGVp4vwu7uLFi0p3y8vOzkZqaipee+21Up9Tr149nDp1Cp06dSr3WOTk5OCtt96Cv78/2rRpg1mzZqFnz57SHdhKU1a7TZs2RcuWLfHjjz/C09MT165dw/z588tsryw+Pj44ffo0FAqFUrXl77//ltZXVtu2bZGXl4dVq1bh5s2b0jnXrl07KbQ8//zzUnhRt9/A0/fd4pXRvLw8pKSklHl+1KtXDzt27MDLL79cqVBbmd+Bn3/+GXXr1pW+ZLeIrnxnTtHxvHTpklLl5969exW6ox5Q/mdCRT9jtfkeQ6RpnNNCart165bSHaeysrLw/fffo0WLFtKcgT59+uDw4cP47bffSjw/IyMDBQUFAIDXXnsNBQUFWLRokbS+sLCwwhcO+/fvVxoaUKRoHH1Zw8x27NiBCRMm4H//+590l63iTE1N0bt3b6xduxZnz54tsV7VLUNVeeONN3DkyBEsW7YMd+/eVRoaBjz9ICvOxMRE+gu3qlsSP6voonnNmjVYsWIF/Pz8lO5AVXTR+Oy3ghf9dbtLly4Ans4ZsLOzQ1xcXIk73BT9BbHoL4zF/6IohCjz9sxff/210rZff/01zM3N0alTp1Kfk5aWpvL2r3l5edi5c6fK4W5FCgsL0bdvX+Tl5WHt2rUqv9OhV69eMDU1xdSpU0v8dVQIUeLfRJW2bdvi6NGj2L17t3QBWbt2bTRu3Fi644+qv3oXZ2NjAwAVvsW3Jmnq/C7yzTffKP0uLlq0CAUFBWXe5axPnz64efOmyvlnjx8/luYMAcD48eNx7do1LF++HF988QV8fX0RGRlZ7u+IjY1NiWGLxQ0cOBC///475s2bh1q1alXqrmxFXnvtNaSlpSnNYysoKMD8+fNha2uL9u3bV7rtoKAgmJub47PPPoOzszOaNGkC4Ok5duTIEezdu7fc8600oaGhsLCwwFdffaX0+7B06VJkZmZK7xGq9OnTB4WFhZg+fXqJdQUFBeWe25X5HVD1PnT06FEcPny4wm1Up06dOsHMzEzpcw1Qfi8sS0U+Eyr6GVt050VtvMcQaRorLQZk69at0l/0imvTpk2JeQVV8fzzz2PIkCH4448/4ObmhmXLliE9PR3x8fHSNuPGjcOmTZvwn//8B4MHD0ZgYCBycnJw5swZ/Pzzz7hy5Qpq166Nrl274uWXX8ZHH32EK1euSN/5UtZFRnGfffYZTpw4gV69eklv6n/++Se+//57ODs7l3lL4n79+sHFxQUNGjTAihUrlNa9+uqrcHNzw8yZM7F7924EBQVh2LBh8Pf3x/379/Hnn39ix44dpX6PTXF9+vTBBx98gA8++ADOzs4l/jI2dOhQ3L9/Hx07doSnpyeuXr2K+fPno0WLFkqVkbIMGDAAw4cPx61bt/C///1PaV1AQAAiIyPxzTffICMjA+3bt8exY8ewfPly9OjRQ/rruL29PebOnYuhQ4eiVatWePPNN+Hk5IRTp07h0aNHWL58ORo1aoR69erhgw8+wM2bN2Fvb4+1a9eW+tdDS0tLbNu2DZGRkQgKCsLWrVuxZcsWfPzxx2UOG7lx4wZat26Njh07olOnTnB3d8ft27exatUqnDp1CmPHjkXt2rVVPnfx4sXYtWsXRo4cWWISsJubG1599VXUq1cPn3zyCWJjY3HlyhX06NEDdnZ2SElJwfr16zF8+HB88MEHZR7ztm3bYsaMGbh+/brSxWK7du2wZMkS+Pr6wtPTs8w26tWrB0dHRyxevBh2dnawsbFBUFBQhcflV5Umzu8ieXl56NSpE/r06YPk5GQsXLgQr7zyinQ7XlUGDhyIn376Sfq3evnll1FYWIi///4bP/30E3777Te8+OKL2LVrFxYuXIjJkydL31cSHx+PkJAQTJw4sczvrgkMDMSaNWsQExODVq1awdbWFl27dpXWv/nmm/jwww+xfv16jBo1qtz5TGUZPnw4lixZgsGDB+PEiRPw9fXFzz//jIMHD2LevHmws7OrdNvW1tYIDAzEkSNHpO9oAZ6ebzk5OcjJyal0aHFxcUFsbCymTp2K8PBwdOvWTfo3bNWqVZk3Jmjfvj1GjBiBuLg4JCUlISwsDObm5rh48SISExPx5ZdfKn0n1bMCAwMBAGPGjEHnzp1hamoq3Q6+NP/5z3+wbt069OzZE126dEFKSgoWL14Mf3//Erex1wY3Nze8++67+Pzzz9GtWzeEh4fj1KlT2Lp1K2rXrl1u9aMinwkV/Yy1srKCv78/1qxZg+effx7Ozs5o2rRpuXMXiXRSTd6qjKpHWbc8RrHbqRbdQnL27NlKzy+6TWhiYqLKdv/44w9pWdFtPn/77TfRvHlzIZfLRaNGjUo8VwghHj58KGJjY0X9+vWFhYWFqF27tmjTpo2YM2eO0q1R7927JwYOHCjs7e2Fg4ODGDhwoDh58mSFbnl88OBBERUVJZo2bSocHByEubm58Pb2FoMHDxaXL19W2vbZ262WdcyK3zI1PT1dREVFCS8vL2Fubi7c3d1Fp06dxDfffFNm34p7+eWXVd52WAghfv75ZxEWFiZcXV2FhYWF8Pb2FiNGjJBuz1sR9+/fF3K5XAAQ586dK7E+Pz9fTJ06Vfj5+Qlzc3Ph5eUlYmNjlW5nXWTTpk2iTZs2wsrKStjb24vWrVuLVatWSevPnTsnQkNDha2trahdu7YYNmyYOHXqVIl/r8jISGFjYyMuX74swsLChLW1tXBzcxOTJ09Wuq2qKllZWeLLL78UnTt3Fp6ensLc3FzY2dmJ4OBg8e233yrdbvTZ29wW3dJU1c+zt7Jdu3ateOWVV4SNjY2wsbERjRo1ElFRUUq3kC6rj6ampsLOzk7p1qQrVqwQAMTAgQNLPEfVbbc3btwo/P39hZmZmdIxbN++vWjSpEmJNp695WxpVN2SV5WKnN+lvUcI8e/7xN69e8Xw4cOFk5OTsLW1Ff379xf37t0rd//z8vLEZ599Jpo0aSLkcrlwcnISgYGBYurUqSIzM1NkZWUJHx8f8cILLyjdkl2Ip7eaNTExEYcPH1bqZ/Hf3+zsbPHmm28KR0dHAUDlsXvttdcEAHHo0KFyj1eR0o5venq6eOutt0Tt2rWFhYWFaNasWYn3sdLei8tTdIvzzz77TGl5/fr1BYAS73mq3sOFKP024V9//bVo1KiRMDc3F25ubmLUqFHiwYMHStuUdv598803IjAwUFhZWQk7OzvRrFkz8eGHH4pbt26VuU8FBQVi9OjRwsXFRchkMun2x2UdI4VCIT799FPh4+Mj5HK5aNmypdi8ebPKvqGUWx4/e8v1omOVkpIiLSvtlscVOZ4FBQVi4sSJwt3dXVhZWYmOHTuK8+fPi1q1aomRI0eWeUwq+plQ0c/YQ4cOicDAQGFhYcHbH5NekwmhoZljRERkdIq+VPCPP/6o0N0LdVHPnj1x5swZXLp0SdtdIQOWkZEBJycnfPLJJyUq4kRUPs5pISIio5WamootW7Zg4MCB2u4KGZDHjx+XWFY0rzAkJKRmO0NkIDinhYiIjE5KSgoOHjyI7777Dubm5hgxYoS2u0QGZM2aNUhISMBrr70GW1tbHDhwAKtWrUJYWBhefvllbXePSC8xtBARkdHZu3cv3nrrLXh7e2P58uXSnQ+JNKF58+YwMzPDrFmzkJWVJU3O/+STT7TdNSK9pdXhYYsWLULz5s1hb28Pe3t7BAcHY+vWrdL6J0+eICoqCrVq1YKtrS169+6N9PR0pTauXbuGLl26wNraGq6urhg3bpx0qz8iIqpegwcPhhBC7+azFPX76tWrZd7diqgyXnjhBezYsQN3795FXl4erl+/jnnz5pX7xbVEVRUXF4dWrVrBzs4Orq6u6NGjR4nvvtPX62uthhZPT0/MnDkTJ06cwPHjx9GxY0d0794df/31FwDgvffewy+//ILExETs3bsXt27dQq9evaTnFxYWokuXLsjLy8OhQ4ewfPlyJCQkYNKkSdraJSIiIiIirdi7dy+ioqJw5MgRbN++Hfn5+QgLC1P63it9vb7WubuHOTs7Y/bs2fjvf/8LFxcXrFy5Uvor2N9//43GjRvj8OHDeOmll7B161b85z//wa1bt6RvAV68eDHGjx+PO3fuqPxSOSIiIiIiY3Dnzh24urpi7969aNeuHTIzM/X2+lpn5rQUFhYiMTEROTk5CA4OxokTJ5Cfn6/0RXyNGjWCt7e3dFAPHz6MZs2aSQcUADp37oxRo0bhr7/+QsuWLVW+Vm5urtK3KCsUCty/fx+1atUq90ufiIiIiKjmCSHw8OFDeHh4wMREt26A++TJE+Tl5VVb+0KIEteocrkccrm8zOcVfVm3s7MzAFTr9XV103poOXPmDIKDg/HkyRPY2tpi/fr18Pf3R1JSEiwsLODo6Ki0vZubG9LS0gAAaWlpSge0aH3RutLExcVh6tSpmt0RIiIiIqp2169fh6enp7a7IXny5Am8vG1w946i2l7D1tYW2dnZSssmT56MKVOmlPochUKBsWPH4uWXX0bTpk0BPL0+rq7r6+qm9dDSsGFDJCUlITMzEz///DMiIyOxd+/ean3N2NhYxMTESI8zMzPh7e2N6wDsi20X1XUoTnrUrda+6CLHS9X3lwIiVazOpWq7C3rPP/cmpt/fXO52E53/g3Py52qgR0REVfPs+1oWAC8AdnZ2WuuTKnl5ebh7R4HfjrjDxlbzFaCcbAU6v5SG69evw97+3yvV8qosUVFROHv2LA4cOKDxPmmD1kOLhYUF6tevDwAIDAzEH3/8gS+//BJvvPEG8vLykJGRoZQG09PTpVtTuru749ixY0rtFd39oKzbV5ZWTrP//x8FgHRbR5z1aQRTHSs/1oSHTSzhlMzgQjXHzITzz6rqkqUPck1sUUuRrfIOKwoAd01tccnSB2Yy43tfIyL9U9r7mq4O5bexNYGtXfW9vxbdbbcioqOjsXnzZuzbt0+pKuXu7l5t19fVTec+uRQKBXJzcxEYGAhzc3Ps3LlTWpecnIxr164hODgYABAcHIwzZ87g9u3b0jbbt2+Hvb09/P39K/f6///f2e16QGGEgYVIGx435V/+q0ohM8Fix7aQ4d/3MWkdABmAJQ5toWBgISI9Udb7GqkmhEB0dDTWr1+PXbt2wc/PT2m9tq6vNUGrlZbY2FhERETA29sbDx8+xMqVK7Fnzx789ttvcHBwwJAhQxATEwNnZ2fY29tj9OjRCA4OxksvvQQACAsLg7+/PwYOHIhZs2YhLS0NEyZMQFRUVLkls9Kk2zpidrse2Fm/uSZ3Ve88aGjBaguRnjlkVR+fOEdgZMZ+uCj+Hft819QWSxza4pBVfS32johIfcXf1+SK7PKfYOSioqKwcuVKbNy4EXZ2dtIcFAcHB1hZWWnt+loTtBpabt++jUGDBiE1NRUODg5o3rw5fvvtN7z66qsAgLlz58LExAS9e/dGbm4uOnfujIULF0rPNzU1xebNmzFq1CgEBwfDxsYGkZGRmDZtWqX6E9V1KM76NGKFhUgLHjd9DlZnb2q7G3rvkFV9HLGsiyZ5t+Bc+Aj3Ta3xl4UHKyxEpLeK3tfqP7kKVGDunjFbtGgRACAkJERpeXx8PAYPHgyg5q+vNUXnvqdFG7KysuDg4IAmIz6FqdxS293RKay2UE1iaCEiotIUKPKwI3UJMjMzKzy3oyYUXUceOOtRLXNash8q8ErTWzq33zWNf3ojIiIiIiKdxtBCZXrQkHd1oprDCflERESkCkMLERERERHpNIYWKherLVSTWG0hIiKiZzG0EBERERGRTmNooQphtYVqEqstREREVBxDCxERERER6TSGFqowVluoJrHaQkREREUYWoiIiIiISKcxtJBaWG2hmsRqCxEREQEMLUREREREpOMYWkhtrLZQTWK1hYiIiBhaiIiIiIhIpzG0UKWw2kI1idUWIiIi48bQQkREREREOo2hhSqN1RaqSay2EBERGS+GFiIiIiIi0mkMLVQlrLZQTWK1hYiIyDgxtBARERERkU5jaKEqY7WFahKrLURERMaHoYWIiIiIiHQaQwtpBKstVJNYbSEiIjIuDC1ERERERKTTGFpIY1htoZrEagsREZHxYGghIr3F4EJERGQcGFpIo1htISIiIiJNY2ghIr3GagsREZHhY2ghjWO1hWoagwsREZFhY2ghIiIiIiKdxtBC1YLVFqpprLYQEREZLoYWIjIYDC5ERESGiaGFqg2rLURERESkCQwtRGRQWG0hIiIyPAwtVK1YbSFtYHAhIiIyLAwtRERERESk0xhaqNqx2kLawGoLERGR4WBoISKDxeBCRERkGBhaqEaw2kLawuBCRESk/xhaiMjgMbgQERHpN4YWqjGsthARERFRZTC0EJFRYLWFiIhIfzG0UI1itYW0icGFiIhIPzG0EJFRYXAhIiLSPwwtVONYbSEiIiIidTC0kFYwuJA2sdpCRESkXxhaiIiIiIhIpzG0kNaw2kLaxGoLERGR/tBqaImLi0OrVq1gZ2cHV1dX9OjRA8nJydL6K1euQCaTqfxJTEyUtlO1fvXq1drYJSLSIwwuRERE+kGroWXv3r2IiorCkSNHsH37duTn5yMsLAw5OTkAAC8vL6Smpir9TJ06Fba2toiIiFBqKz4+Xmm7Hj16aGGPSF2sthARERFRecy0+eLbtm1TepyQkABXV1ecOHEC7dq1g6mpKdzd3ZW2Wb9+Pfr06QNbW1ul5Y6OjiW2LU1ubi5yc3Olx1lZWZXcAyLSd4+bPgersze13Q0iIiIqg07NacnMzAQAODs7q1x/4sQJJCUlYciQISXWRUVFoXbt2mjdujWWLVsGIUSprxMXFwcHBwfpx8vLSzM7QJXCagsRERERlUVnQotCocDYsWPx8ssvo2nTpiq3Wbp0KRo3bow2bdooLZ82bRp++uknbN++Hb1798Y777yD+fPnl/pasbGxyMzMlH6uX7+u0X0hIv3CuS1ERES6TavDw4qLiorC2bNnceDAAZXrHz9+jJUrV2LixIkl1hVf1rJlS+Tk5GD27NkYM2aMyrbkcjnkcrlmOk4a8aChBZyS87TdDTJiHCZGRESku3Si0hIdHY3Nmzdj9+7d8PT0VLnNzz//jEePHmHQoEHlthcUFIQbN24ozVshIiIiIiL9pNXQIoRAdHQ01q9fj127dsHPz6/UbZcuXYpu3brBxcWl3HaTkpLg5OTEaoqe4dwWIiIiIlJFq6ElKioKK1aswMqVK2FnZ4e0tDSkpaXh8ePHSttdunQJ+/btw9ChQ0u08csvv+C7777D2bNncenSJSxatAiffvopRo8eXVO7QRrE4ELaxLktRESk7/bt24euXbvCw8MDMpkMGzZsUFqfnp6OwYMHw8PDA9bW1ggPD8fFixdLtHP48GF07NgRNjY2sLe3R7t27Upco9ckrYaWRYsWITMzEyEhIahTp470s2bNGqXtli1bBk9PT4SFhZVow9zcHAsWLEBwcDBatGiBJUuW4IsvvsDkyZNrajeIiIiIiHRCTk4OAgICsGDBghLrhBDo0aMH/vnnH2zcuBEnT56Ej48PQkNDpe9JBJ4GlvDwcISFheHYsWP4448/EB0dDRMT7UUHmSjr3sBGIisrCw4ODmgy4lOYyi213R0COCmftIoT8omIdE+BIg87UpcgMzMT9vb22u6OpOg68sBZD9jaaf6iPvuhAq80vVWp/ZbJZFi/fr30pesXLlxAw4YNcfbsWTRp0gTA0zv4uru749NPP5VGNb300kt49dVXMX36dI3uS1XoxER8IiIiIiIqXVZWltJPZW44VfQcS8t//0hvYmICuVwu3cH39u3bOHr0KFxdXdGmTRu4ubmhffv2pd7ht6bozC2PiYrjLZBJm3j7YyIiUtfqjCDIC8w13m5udj6A9SW+DH3y5MmYMmWKWm01atQI3t7eiI2NxZIlS2BjY4O5c+fixo0bSE1NBQD8888/AIApU6Zgzpw5aNGiBb7//nt06tQJZ8+eRYMGDTSxW2pjaCEiIiIi0nHXr19XGh5WmbvkmpubY926dRgyZAicnZ1hamqK0NBQREREoGjGiEKhAACMGDECb731FoCn34O4c+dOLFu2DHFxcRrYG/UxtJDOYrWFtInVFiIi0iX29vYamcsTGBiIpKQkZGZmIi8vDy4uLggKCsKLL74IAKhTpw4AwN/fX+l5jRs3xrVr16r8+pXFOS2k03gLZCIiIiLNc3BwgIuLCy5evIjjx4+je/fuAABfX194eHggOTlZafsLFy7Ax8dHG10FwEoLEVGpWG0hIiJ9k52djUuXLkmPU1JSkJSUBGdnZ3h7eyMxMREuLi7w9vbGmTNn8O6776JHjx7SV4vIZDKMGzcOkydPRkBAAFq0aIHly5fj77//xs8//6yt3WJoId3HYWJEREREFXP8+HF06NBBehwTEwMAiIyMREJCAlJTUxETE4P09HTUqVMHgwYNwsSJE5XaGDt2LJ48eYL33nsP9+/fR0BAALZv34569erV6L4Ux+9pAb+nRR8wtJC2sNJCRKQbdP17WqIP9ITctnruHvb1K+t1br9rGue0kF7g3BbSlsdNn9N2F4iIiIweQwvpDQYXIiIiIuPE0EJEVA5WW4iIiLSLoYX0CqstRERERMaHoYWIqAJYbSEiItIehhbSO6y2EBERERkXhhbSSwwupA2sthAREWkHQwsREREREek0hhbSW6y2kDaw2kJERFTzGFqIiIiIiEinMbSQXmO1hYiIiMjwMbSQ3mNwoZrGIWJEREQ1i6GFiIiIiIh0GkMLGQRWW6imsdpCRERUcxhayGAwuBAREREZJoYWIqJKYrWFiIioZjC0kEFhtYVqGoMLERFR9WNoIYPD4EJERERkWBhaiIiqiNUWIiKi6sXQQgaJ1RYiIiIiw8HQQgaLwYVqEqstRERE1YehhYiIiIiIdBpDCxk0VluoJrHaQkREVD0YWsjgMbgQERER6TeGFiIiDWK1hYiISPMYWsgosNpCREREpL8YWshoMLhQTWG1hYiISLMYWsioMLhQTWFwISIi0hyGFiIiIiIi0mkMLWR0WG2hmsJqCxERkWYwtJBRYnChmsLgQkREVHUMLWS0GFyIiIiI9ANDCxFRNWO1hYiIqGoYWsiosdpCREREpPsYWsjoMbhQTWC1hYiIqPIYWojA4EI1g8GFiIiochhaiP4fgwsRERGRbmJoISKqQay2EBERqU+roSUuLg6tWrWCnZ0dXF1d0aNHDyQnJyttExISAplMpvQzcuRIpW2uXbuGLl26wNraGq6urhg3bhwKCgpqclfIQLDaQjWBwYWIiEg9Wg0te/fuRVRUFI4cOYLt27cjPz8fYWFhyMnJUdpu2LBhSE1NlX5mzZolrSssLESXLl2Ql5eHQ4cOYfny5UhISMCkSZNqenfIQDC4UE1gcCEiIqo4M22++LZt25QeJyQkwNXVFSdOnEC7du2k5dbW1nB3d1fZxu+//45z585hx44dcHNzQ4sWLTB9+nSMHz8eU6ZMgYVFxS9As+sq4HCzcvtChuVBQws4JedpuxtEREREBB2b05KZmQkAcHZ2Vlr+448/onbt2mjatCliY2Px6NEjad3hw4fRrFkzuLm5Scs6d+6MrKws/PXXXypfJzc3F1lZWUo/RM9ixYWqG6stREREFaPVSktxCoUCY8eOxcsvv4ymTZtKy9988034+PjAw8MDp0+fxvjx45GcnIx169YBANLS0pQCCwDpcVpamsrXiouLw9SpU1Wue1hPAbvLOpXlSItYcaHq9rjpc7A6yxIvERFRWXQmtERFReHs2bM4cOCA0vLhw4dL/9+sWTPUqVMHnTp1wuXLl1GvXr1KvVZsbCxiYmKkx1lZWfDy8pIeM7hQcQwuRERERNqlE1fm0dHR2Lx5M3bv3g1PT88ytw0KCgIAXLp0CQDg7u6O9PR0pW2KHpc2D0Yul8Pe3l7ph6gsHCpG1YnDxIiIiMqm1dAihEB0dDTWr1+PXbt2wc/Pr9znJCUlAQDq1KkDAAgODsaZM2dw+/ZtaZvt27fD3t4e/v7+le7bw3qKSj+XDBODC1UnBhciIqLSaTW0REVFYcWKFVi5ciXs7OyQlpaGtLQ0PH78GABw+fJlTJ8+HSdOnMCVK1ewadMmDBo0CO3atUPz5s0BAGFhYfD398fAgQNx6tQp/Pbbb5gwYQKioqIgl8ur1D8GF3oWgwtVJwYXIiIi1bQaWhYtWoTMzEyEhISgTp060s+aNWsAABYWFtixYwfCwsLQqFEjvP/+++jduzd++eUXqQ1TU1Ns3rwZpqamCA4OxoABAzBo0CBMmzZNI31kcKFnMbhQdWJwISIiKkmrE/GFEGWu9/Lywt69e8ttx8fHB7/++qumukVULk7OJyIiIqo5OjERX9ex2kKqsOJC1YXVFiIiImUMLRXE4EKqMLhQdWFwISIi+hdDC1EVMbhQdWFwISIieoqhRQ2stlBpGFyoujC4EBERMbSojcGFSsPgQtWFwYWIiIwdQ0slMLhQaRhcqLowuBARkTFjaCHSMAYXqi4MLkREVJ59+/aha9eu8PDwgEwmw4YNG5TWp6enY/DgwfDw8IC1tTXCw8Nx8eJFaf39+/cxevRoNGzYEFZWVvD29saYMWOQmZlZw3uijKGlklhtobIwuBAREZE25OTkICAgAAsWLCixTgiBHj164J9//sHGjRtx8uRJ+Pj4IDQ0FDk5OQCAW7du4datW5gzZw7Onj2LhIQEbNu2DUOGDKnpXVGi1S+X1HcP6ylgd5m5j4hqzuOmz8Hq7E1td4OIiHRUREQEIiIiVK67ePEijhw5grNnz6JJkyYAgEWLFsHd3R2rVq3C0KFD0bRpU6xdu1Z6Tr169TBjxgwMGDAABQUFMDPTTnzgFXcVseJCpWG1haoLh4kRERmfrKwspZ/c3Fy12yh6jqWlpbTMxMQEcrkcBw4cKPV5mZmZsLe311pgAVhpIapWDxpawCk5T9vdIAPEigsRkW7ZdaMBTK3lGm+38NHToOHl5aW0fPLkyZgyZYpabTVq1Aje3t6IjY3FkiVLYGNjg7lz5+LGjRtITU1V+Zy7d+9i+vTpGD58eKX6rykMLRrAYWJUFgYXqi4MLkRExuP69euwt7eXHsvl6gckc3NzrFu3DkOGDIGzszNMTU0RGhqKiIgICCFKbJ+VlYUuXbrA399f7YCkabzS1hAOE6OycKgYVRcOFSMiMg729vZKP5UJLQAQGBiIpKQkZGRkIDU1Fdu2bcO9e/dQt25dpe0ePnyI8PBw2NnZYf369TA3N9fEblQaQ4sGMbgQkTYwuBARkbocHBzg4uKCixcv4vjx4+jevbu0LisrC2FhYbCwsMCmTZuU5sBoC4eHEdUQDhOj6lQUXDhcjIjIuGVnZ+PSpUvS45SUFCQlJcHZ2Rne3t5ITEyEi4sLvL29cebMGbz77rvo0aMHwsLCAPwbWB49eoQVK1ZIE/8BwMXFBaamplrZL4YWDeP8FioLgwtVN85zISIybsePH0eHDh2kxzExMQCAyMhIJCQkIDU1FTExMUhPT0edOnUwaNAgTJw4Udr+zz//xNGjRwEA9evXV2o7JSUFvr6+1b8TKjC0VAMGFyoLgwtVNwYXIiLjFRISonJSfZExY8ZgzJgxlX6+tvDKuppwfgsRaRPnuRARkSFhaCHSAt5NjGoCgwsRERkKhpZqxGoLlYXBhWoCgwsRERkChpZqxuBCRNrG4EJERPqOoaUGMLhQaVhtoZryuOlzDC9ERKS3GFpqCIMLlYbBhWoSgwsREekjhhYiIiPD4EJERPqGoaUGsdpCpWG1hWoah4sREZE+YWipYQwuVBoGF9IGBhciItIHDC1awOBCRLqEVRciItJ1DC1awuBCqrDaQtrE4EJERLqKoYVIxzC4kDax6kJERLqIoUWLWG0hIl3F4EJERLqEoUXLGFxIFVZbSBew6kJERLqCoUUHMLgQkS5jcCEiIm1jaNERDC70LFZbSJew6kJERNrE0KJDGFzoWQwupGsYXoiISBsYWoiISG0ML0REVJMYWnQMqy30LFZbSJcxvBARUU1gaNFBDC5EpG8YXIiIqDoxtOgoBhcqjtUW0gdFVRcGGCIi0jSGFh3G4ELFMbiQPmF4ISIiTWJo0XEMLkSkzxheiIhIExha9ACDCxVhtYX0FcMLERFVhZm2O0BERMajeHCxOntTiz0hIiJ9wkqLnmC1hYqw2kKGgtUXIiKqKFZa9MjDegrYXWbOJCLDwuoLERGVh1fAeoYVFwJYbSHDxdsmExGRKgwteojBhQAGFzJ8DDBERFSEw8P0FIeKEZEx4RAyIiLjptWr3ri4OLRq1Qp2dnZwdXVFjx49kJycLK2/f/8+Ro8ejYYNG8LKygre3t4YM2YMMjMzldqRyWQlflavXl3Tu1PjWHEhVlvIGBWvwLAKQ0RkHLRaadm7dy+ioqLQqlUrFBQU4OOPP0ZYWBjOnTsHGxsb3Lp1C7du3cKcOXPg7++Pq1evYuTIkbh16xZ+/vlnpbbi4+MRHh4uPXZ0dKzhvdEOVlzoQUMLOCXnabsbRFrDKozx0ofQynOyfBX9dywoeAKkVnNnSGdpNbRs27ZN6XFCQgJcXV1x4sQJtGvXDk2bNsXatWul9fXq1cOMGTMwYMAAFBQUwMzs3+47OjrC3d29xvquSxhciIieevbihxeM+ksfAklFqLsf+nLOGsq/D+kPnZrTUjTsy9nZucxt7O3tlQILAERFRWHo0KGoW7cuRo4cibfeegsymUxlG7m5ucjNzZUeZ2VlaaD32sXgYtxYbSFSTdWFlb5cFBo6XvSqxuNCpJrOhBaFQoGxY8fi5ZdfRtOmTVVuc/fuXUyfPh3Dhw9XWj5t2jR07NgR1tbW+P333/HOO+8gOzsbY8aMUdlOXFwcpk6dqvF90DYGFyKi8jHI1BxegBORpsiEEELbnQCAUaNGYevWrThw4AA8PT1LrM/KysKrr74KZ2dnbNq0Cebm5qW2NWnSJMTHx+P69esq16uqtHh5ecHns09gYmlZ9Z3RMgYX48VqC5FmMcyUj8GEakpBwRMc3DlFGnWjK7KysuDg4AD/1R/C1Fqu8fYLH+XiXN9ZOrffNU0nKi3R0dHYvHkz9u3bpzKwPHz4EOHh4bCzs8P69evLDCwAEBQUhOnTpyM3NxdyecmTRy6Xq1xuKFhxMV4cJkakWeVdkBt6qGEgISJdodXQIoTA6NGjsX79euzZswd+fn4ltsnKykLnzp0hl8uxadMmWFagEpKUlAQnJyeDDiblYXAhIqp+6lzU60LAYQghIn2l1dASFRWFlStXYuPGjbCzs0NaWhoAwMHBAVZWVsjKykJYWBgePXqEFStWICsrS5o07+LiAlNTU/zyyy9IT0/HSy+9BEtLS2zfvh2ffvopPvjgA23umk5gcDFOrLYQ6SYGBiKiytNqaFm0aBEAICQkRGl5fHw8Bg8ejD///BNHjx4FANSvX19pm5SUFPj6+sLc3BwLFizAe++9ByEE6tevjy+++ALDhg2rkX3QdQwuxonBhYiIiAyJ1oeHlSUkJKTcbcLDw5W+VJJKYnAxTgwuREREZCh4JWskHtZTaLsLRERERESVwtBiRBhcjM+Dhhba7gIRERFRlTG0GBkGF+PD4EJERET6jqHFCDG4EBEREZE+YWgxUgwuxoXVFiIiItJnDC1GjMHFuDC4EBERkb5iaDFyD+spGF6MCIMLERER6SOGFgLAqgsRERER6S6GFpIwuBgHVluIiIhI3zC0kBIGF+PA4EJERET6hKGFSmBwMQ4MLkRERKQvGFpIJQYX48DgQkRERPqgUqHl8uXLmDBhAvr164fbt28DALZu3Yq//vpLo50j7WJwISIiIiJdoHZo2bt3L5o1a4ajR49i3bp1yM7OBgCcOnUKkydP1ngHSbsYXAwfqy1ERESk69QOLR999BE++eQTbN++HRYW/17sdOzYEUeOHNFo54ioZjC4EBERGYZ9+/aha9eu8PDwgEwmw4YNG5TWZ2dnIzo6Gp6enrCysoK/vz8WL16stE1aWhoGDhwId3d32NjY4IUXXsDatWtrcC9KUju0nDlzBj179iyx3NXVFXfv3tVIp0i3sNpiHBhciIiI9F9OTg4CAgKwYMECletjYmKwbds2rFixAufPn8fYsWMRHR2NTZs2SdsMGjQIycnJ2LRpE86cOYNevXqhT58+OHnyZE3tRglqhxZHR0ekpqaWWH7y5Ek899xzGukU6R4GF+PA4EJERKTfIiIi8Mknn6gsMgDAoUOHEBkZiZCQEPj6+mL48OEICAjAsWPHlLYZPXo0Wrdujbp162LChAlwdHTEiRMnamo3SlA7tPTt2xfjx49HWloaZDIZFAoFDh48iA8++ACDBg2qjj6SjmBwMQ4MLkRERLonKytL6Sc3N7dS7bRp0wabNm3CzZs3IYTA7t27ceHCBYSFhSlts2bNGty/fx8KhQKrV6/GkydPEBISoqG9UZ+Zuk/49NNPERUVBS8vLxQWFsLf3x+FhYV48803MWHChOroI+mQh/UUsLvMO2UTERERFZdz1R4mlpYab1fx5AkAwMvLS2n55MmTMWXKFLXbmz9/PoYPHw5PT0+YmZnBxMQE3377Ldq1aydt89NPP+GNN95ArVq1YGZmBmtra6xfvx7169ev0r5UhdqhxcLCAt9++y0mTZqEM2fOIDs7Gy1btkSDBg2qo3+kgxhcDN+DhhZwSs7TdjeIiIjo/12/fh329vbSY7lcXql25s+fjyNHjmDTpk3w8fHBvn37EBUVBQ8PD4SGhgIAJk6ciIyMDOzYsQO1a9fGhg0b0KdPH+zfvx/NmjXTyP6oS+3Qsm/fPjRq1AheXl5KiS8/Px+HDx9WSmlkuBhcDB+DCxERke6wt7dXCi2V8fjxY3z88cdYv349unTpAgBo3rw5kpKSMGfOHISGhuLy5cv4+uuvcfbsWTRp0gQAEBAQgP3792PBggUl7jRWmvj4eLzxxhuwtrauUp+LqH3VGRISgoCAgBK3N75//z46dOigkU4RkW7g/BYiIiLDkZ+fj/z8fJiYKEcAU1NTKBRP5y4/evQIAMrcpiI++ugjuLu7Y8iQITh06FAVe16J0AI8nYzfqVMnJCQkKC0XQlS5Q6Q/ODHfODC4EBER6Y/s7GwkJSUhKSkJAJCSkoKkpCRcu3YN9vb2aN++PcaNG4c9e/YgJSUFCQkJ+P7776W7jTVq1Aj169fHiBEjcOzYMVy+fBmff/45tm/fjh49elS4Hzdv3sTy5ctx9+5dhISEoFGjRvjss8+QlpZWqf1SO7TIZDLExsbihx9+QHR0NGJiYqSwIpPJKtUJ0l8MLsaBwYWIiEg/HD9+HC1btkTLli0BPP1elpYtW2LSpEkAgNWrV6NVq1bo378//P39MXPmTMyYMQMjR44EAJibm+PXX3+Fi4sLunbtiubNm+P777/H8uXL8dprr1W4H2ZmZujZsyc2btyI69evY9iwYfjxxx/h7e2Nbt26YePGjWpVbtSe01IUUHr16gU/Pz90794d586dw5dffqluU2QgOL/FOHCOCxERke4LCQkpc/STu7s74uPjy2yjQYMGWLt2rcb65ObmhldeeQUXLlzAhQsXcObMGURGRsLJyQnx8fEVupVyla40W7ZsiWPHjiEjIwOdOnWqSlOk51hxMQ6suBAREVFFpaenY86cOWjSpAlCQkKQlZWFzZs3IyUlBTdv3kSfPn0QGRlZobbUDi2RkZGwsrKSHru7u2Pv3r3o1KkTvL291W2OiPQMgwsRERGVp2vXrvDy8kJCQgKGDRuGmzdvYtWqVdJtlW1sbPD+++/j+vXrFWpP7eFhqspJcrkcy5cvV7cpMjAcJmY8OFSMiIiIyuLq6oq9e/ciODi41G1cXFyQkpJSofYqFFpOnz6Npk2bwsTEBKdPny5z2+bNm1fohckwMbgYDwYXIiIiKk379u3xwgsvlFiel5eH1atXY9CgQZDJZPDx8alQexUKLS1atEBaWhpcXV3RokULyGQypQk+RY9lMhkKCwsruCtkqBhcjAeDCxEREany1ltvITw8HK6urkrLHz58iLfeeguDBg1Sq70KhZaUlBS4uLhI/09UHgYX48HgQkRERM8qKmg868aNG3BwcFC7vQqFluJlm4qWcIgYXIwHgwsREREBT+8uLJPJIJPJ0KlTJ5iZ/Rs3CgsLkZKSgvDwcLXbrfBE/AsXLiAjIwOtW7eWlu3cuROffPIJcnJy0KNHD3z88cdqd4AMG4OL8WBwISIioh49egAAkpKS0LlzZ9ja2krrLCws4Ovri969e6vdboVDy/jx49GsWTMptKSkpKBr165o27Ytmjdvjri4OFhbW2Ps2LFqd4KIDAODCxERkXGbPHkyAMDX1xdvvPEGLC0tNdJuhf8Efvz4cUREREiPf/zxRzz//PP47bff8OWXX2LevHlISEjQSKfIsPCLJ40Lv8eFiIiIIiMjNRZYADVCy927d+Hp6Sk93r17N7p27So9DgkJwZUrVzTWMTIsDC7GhcGFiIjI+Dg7O+Pu3bsAACcnJzg7O5f6o64KDw9zdnZGamoqvLy8oFAocPz4ccTExEjr8/LylG6DTPQszm8xLhwqRkREZFzmzp0LOzs76f9V3T2ssiocWkJCQjB9+nQsXLgQiYmJUCgUCAkJkdafO3cOvr6+GusYGSYGF+PC4EJERGQ8IiMjpf8fPHiwRtuu8NXjjBkz8Pfff8PHxwfjx4/HrFmzYGNjI63/4Ycf0LFjR412jgwTh4oZFw4VIyIiMj6lzXUvKChAbGys2u1VOLT4+vri/PnzOHnyJK5evYpRo0YprZ86dSomTJigdgfIODG4GJcHDS0YXoiIiIzImDFj8Prrr+PBgwfSsuTkZAQFBWHVqlVqt6fWOB0zMzMEBATAw8OjxLqAgADUqlVL7Q6Q8WJwMT4MLkRERMbh5MmTuHHjBpo1a4bt27djwYIFeOGFF9CoUSOcOnVK7fYqPKeFqDpwjovx4TwXIiIiw1evXj0cPHgQY8eORXh4OExNTbF8+XL069evUu3xapG0jhUX48OKCxERkeHbsmULVq9ejeDgYDg6OmLp0qW4detWpdpiaCGdwOBifBhciIiIDNeIESPw+uuvY/z48di/fz9Onz4NCwsLNGvWDD/99JPa7TG0kM5gcDE+DC5ERESG6eDBgzh69Cjef/99yGQyuLu749dff8W0adPw9ttvq91ehea0nD59usINNm/eXO1OEBXhHBfjUxRcOM+FiIjIcJw4cQJyubzE8qioKISGhqrdXoVCS4sWLSCTySCEKPebLQsLC9XuhK548fI/SGrcCAoTXjRrE4OLceIEfc0xEQo0f5AC59yHuC+3w2knPyhk/J0iIv1lIhRo9iAFB7XdEaowuVyOy5cvIz4+HpcvX8aXX34JV1dXbN26Fd7e3mq3V6FPsZSUFPzzzz9ISUnB2rVr4efnh4ULF+LkyZM4efIkFi5ciHr16mHt2rVqvXhcXBxatWoFOzs7uLq6okePHkhOTlba5smTJ4iKikKtWrVga2uL3r17Iz09XWmba9euoUuXLrC2toarqyvGjRuHgoICtfoCAMu+WYb9U2eg86kzaj+XNItDxYwTh4tVXdv0s1i99zPM++NbTDq9GvP++Bar936Gtulntd01IqJKKXpf++zP5druCqlh7969aNasGY4ePYp169YhOzsbAHDq1ClMnjxZ7fYqFFp8fHykn08//RRfffUVRowYgebNm6N58+YYMWIE5s2bh+nTp6u9M1FRUThy5Ai2b9+O/Px8hIWFIScnR9rmvffewy+//ILExETs3bsXt27dQq9evaT1hYWF6NKlC/Ly8nDo0CEsX74cCQkJmDRpklp9KeKWkYkFy5YzuOgABhfjxOBSeW3Tz2Ja0gq45GYqLa+dm4lpSSsYXIhI75T2vka676OPPsInn3yC7du3w8Li38/2jh074siRI2q3p/Z4gTNnzsDPz6/Ecj8/P5w7d06ttrZt24bBgwejSZMmCAgIQEJCAq5du4YTJ04AADIzM7F06VJ88cUX6NixIwIDAxEfH49Dhw5JO/v777/j3LlzWLFiBVq0aIGIiAhMnz4dCxYsQF6e+kNNig7IxHUbYaLgRbO2MbgYpwcNLRhe1GQiFBh9/hcAwLODeE0ACADRf/8CE8HfKSLSD2W9r5HuO3PmDHr27FliuaurK+7evat2e2qHlsaNGyMuLk4pEOTl5SEuLg6NGzdWuwPFZWY+TdHOzs4Ank7gyc/PV5qs06hRI3h7e+Pw4cMAgMOHD6NZs2Zwc3OTtuncuTOysrLw119/qXyd3NxcZGVlKf0UZwLAIyMDrS7/U6X9Ic1gcDFeDC4V1/xBClxzM0v9YDcB4PYkE80fpNRkt4iIKq289zXSbY6OjkhNTS2x/OTJk3juuefUbq9CE/GLW7x4Mbp27QpPT0/pTmGnT5+GTCbDL7/8onYHiigUCowdOxYvv/wymjZtCgBIS0uDhYUFHB0dlbZ1c3NDWlqatE3xwFK0vmidKnFxcZg6dWq5fXLNeqjublA14eR848UJ+hXjnFux96uKbkdEpG18v9Jvffv2xfjx45GYmAiZTAaFQoGDBw/igw8+wKBBg9RuT+2rwNatW+Off/7BJ598Is1pmTFjBv755x+0bt1a7Q4UiYqKwtmzZ7F69epKt1FRsbGxyMzMlH6uX7+ucrvb9nbV3heqOFZcjBcrLuW7L6/Y+1VFtyMi0ja+X+m3Tz/9FI0aNYKXlxeys7Ph7++Pdu3aoU2bNpgwYYLa7aldaQEAGxsbDB8+vDJPVSk6OhqbN2/Gvn374OnpKS13d3dHXl4eMjIylKot6enpcHd3l7Y5duyYUntFdxcr2uZZcrlc5X2jiygApDk64o96dSu5R1RdWHExXvw+l7KddvLDbbkDaudmqvxrlALAHUsHnHYqOSeRiEgXlfe+RrrNwsIC3377LSZOnIizZ88iOzsbLVu2RIMGDSrVXqXOgR9++AGvvPIKPDw8cPXqVQDA3LlzsXHjRrXaEUIgOjoa69evx65du0pM8A8MDIS5uTl27twpLUtOTsa1a9cQHBwMAAgODsaZM2dw+/ZtaZvt27fD3t4e/v7+au9b0d/yp/fqzu9r0VGsuBg3Vl1UU8hMML9xV8jw7/uYtA5PJ7F+3agrv6+FiPRGWe9rpD+8vb3x2muvoU+fPpUOLEAlKi2LFi3CpEmTMHbsWHzyySfSl0k6OTlh3rx56N69e4XbioqKwsqVK7Fx40bY2dlJc1AcHBxgZWUFBwcHDBkyBDExMXB2doa9vT1Gjx6N4OBgvPTSSwCAsLAw+Pv7Y+DAgZg1axbS0tIwYcIEREVFlVlNKU2aoyOm9+qO3wKaqf1cqjmsuBg3znNRbb9bU0xqMQCjz/8C12K3B71j6YCvG3XFfremWuwdEZH6ir+vWfK2xzovJiamwtt+8cUXarUtE0IIdZ7g7++PTz/9FD169ICdnR1OnTqFunXr4uzZswgJCVHrFmYymer7QcTHx2Pw4MEAnn655Pvvv49Vq1YhNzcXnTt3xsKFC5WGfl29ehWjRo3Cnj17YGNjg8jISMycORNmZhXLZFlZWXBwcEDv4W8jqXEjVlj0DMOLcWN4KclEKND8QQqccx/ivtwOp538WGEhIr1mIhRoeDcZi/9cjszMTNjb22u7S5Ki60ifzz6BiaWlxttXPHmCq+Mn6Nx+q9KhQ4cKbSeTybBr1y612la70pKSkoKWLVuWWC6Xy5W+FLIiKpKXLC0tsWDBAixYsKDUbXx8fPDrr7+q9dqqHK9XFyYMLHqHVRfjxqpLSQqZCZKc62m7G0REGqOQmeAM5+TpvN27d1db22pf6fn5+SEpKanE8m3btlX5e1qIKovzXIwbv4ySiIhId12/fr3Uu/VWlNqhJSYmBlFRUVizZg2EEDh27BhmzJiB2NhYfPjhh1XqDFFVMLgQgwsREZFuKCgowMSJE+Hg4ABfX1/4+vrCwcEBEyZMQH5+vtrtqT08bOjQobCyssKECRPw6NEjvPnmm/Dw8MCXX36Jvn37qt0BIk3iUDHirZGJiIi0b/To0Vi3bh1mzZol3fX38OHDmDJlCu7du4dFixap1V6lvqelf//+6N+/Px49eoTs7Gy4urpWphmiasHgQgDnuhAREWnTypUrsXr1akREREjLmjdvDi8vL/Tr169mQgsA3L59G8nJyQCe3gHAxcWlsk0RaRyDCwEMLkRERNoil8vh6+tbYrmfnx8sLNQfzq32Vd3Dhw8xcOBAeHh4oH379mjfvj08PDwwYMAAZGby/tmkOx7WU3CeC3GSPhERkRZER0dj+vTpyM3NlZbl5uZixowZiI6OVru9Ss1pOXnyJLZs2aI0Pu3dd9/FiBEjsHr1arU7QVSdWHUhgFUXIiKimnTy5Ens3LkTnp6eCAgIAACcOnUKeXl56NSpE3r16iVtu27dunLbUzu0bN68Gb/99hteeeUVaVnnzp3x7bffIjw8XN3miGoEgwsBnKRPRERUUxwdHdG7d2+lZV5eXpVuT+3QUqtWLTg4OJRY7uDgACcnp0p3hKi6MbhQEYYXIiKi6iOEwNSpU+Hi4gIrKyuNtKn2FdyECRMQExODtLQ0aVlaWhrGjRuHiRMnaqRT2mLjk6XtLlA14xwXKo5zXYiIiDRPCIH69evjxo0bGmuzQpWWli1bQiaTSY8vXrwIb29veHt7AwCuXbsGuVyOO3fuYMSIERrrnDbY+mUiO6VkJYkMBysuVByrLkRERJplYmKCBg0a4N69e2jQoIFG2qxQaOnRo4dGXkxfMLgYvqKKC8MLFeFEfSIiIs2ZOXMmxo0bh0WLFqFp06ZVbq9CoWXy5MlVfiF9Y+v39PbNDC+GjVUXKo5VFyIiIs0YNGgQHj16hICAAFhYWJSY23L//n212qv0l0sCQHZ2NhQK5TkC9vb2VWlS57DqYvgYXOhZDC9ERERVM2/ePI22p3ZoSUlJQXR0NPbs2YMnT55Iy4UQkMlkKCws1GgHdQGDi+FjcCFVOGSMiIiociIjIzXantqhZcCAARBCYNmyZXBzc1OaoG/IOFzM8HGeC6nCqgsREVHlXL58GfHx8bh8+TK+/PJLuLq6YuvWrfD29kaTJk3Uakvt0HLq1CmcOHECDRs2VPepBoFVF8PHqgupwvBCRERUcXv37kVERARefvll7Nu3DzNmzICrqytOnTqFpUuX4ueff1arPbWvzFq1aoXr16+r+zSDUlR1IcPF73Oh0vC7XYiIiMr30Ucf4ZNPPsH27dthYfHvZ2fHjh1x5MgRtdtTu9Ly3XffYeTIkbh58yaaNm0Kc3NzpfXNmzdXuxP6iBUXw8eKC5WGVRciIqKynTlzBitXriyx3NXVFXfv3lW7PbVDy507d3D58mW89dZb0jKZTGbQE/FLw3kuho/zXKgsDC9ERESqOTo6IjU1FX5+fkrLT548ieeee07t9tQOLW+//TZatmyJVatWGdVE/LKw6mL4WHWhsjC8EBERKevbty/Gjx+PxMREyGQyKBQKHDx4EB988AEGDRqkdntqh5arV69i06ZNqF+/vtovZsgYXAwfgwuVh+GFiIjoqU8//RTR0dHw9vZGQUEB/P39UVhYiDfffBMTJkxQuz21r8A6duyIU6dOqf1CxsDWL5OT9A3cw3oKTtKncj1oaMEJ+0REpBX79u1D165d4eHhAZlMhg0bNiitz87ORnR0NDw9PWFlZQV/f38sXrxYZVtCCERERKhspzQKhQKfffYZOnTogJMnT2LgwIHYvHkzVqxYgb///hs//PADTE1N1d4vtSstXbt2xXvvvYczZ86gWbNmJSbid+vWTe1OGBpWXQwfqy5UEay8EBFRTcvJyUFAQADefvtt9OrVq8T6mJgY7Nq1CytWrICvry9+//13vPPOO/Dw8ChxHT9v3jy1p4LMmDEDU6ZMQWhoKKysrLBy5UrpOx6rQu3QMnLkSADAtGnTSqwzton4ZWFwMXwMLlRRDxpaMLgQEVGNiIiIQERERKnrDx06hMjISISEhAAAhg8fjiVLluDYsWNKoSUpKQmff/45jh8/jjp16lT49b///nssXLgQI0aMAADs2LEDXbp0wXfffQcTk8pfN6n9TIVCUeoPA4syDhUzfBwqRhXFIWNERFQVWVlZSj+5ubmVaqdNmzbYtGkTbt68CSEEdu/ejQsXLiAsLEza5tGjR3jzzTexYMECuLu7q9X+tWvX8Nprr0mPQ0NDIZPJcOvWrUr1t4jalRZSD2+LbPh4W2RSB4eMEREZJtt/TGAq1/y1QGHu0za9vLyUlk+ePBlTpkxRu7358+dj+PDh8PT0hJmZGUxMTPDtt9+iXbt20jbvvfce2rRpg+7du6vdfkFBASwtLZWWmZubIz8/X+22iqtwaHnttdewatUqODg8vfieOXMmRo4cCUdHRwDAvXv30LZtW5w7d65KHTJUHC5m+DhcjNTB8EJEROq4fv067O3tpcdyubxS7cyfPx9HjhzBpk2b4OPjg3379iEqKgoeHh4IDQ3Fpk2bsGvXLpw8ebJS7QshMHjwYKX+PXnyBCNHjoSNjY20bN26dWq1W+HQ8ttvvymVoT799FP06dNHCi0FBQVITk5W68WNDYOL4WNwIXUVHzLGAENERKWxt7dXCi2V8fjxY3z88cdYv349unTpAgBo3rw5kpKSMGfOHISGhmLXrl24fPmydI1fpHfv3mjbti327NlT5mtERkaWWDZgwIAq9RtQI7QIIcp8TBXD4WKGj8PFqLJYfSEiouqUn5+P/Pz8EhPiTU1NoVA8vX756KOPMHToUKX1zZo1w9y5c9G1a9dyXyM+Pl5zHS6Gc1q0hFUXw8eqC1UWwwsREVVWdnY2Ll26JD1OSUlBUlISnJ2d4e3tjfbt22PcuHGwsrKCj48P9u7di++//x5ffPEFAMDd3V3l5Htvb2/4+fnV2H48q8KhRSaTlbhPs7r3bSZlDC6Gj1UXqgqGFyIiUtfx48fRoUMH6XFMTAyAp8O2EhISsHr1asTGxqJ///64f/8+fHx8MGPGDOlrTXSVWsPDik+qeXZCTWVvu2bsGFyMA6suVBWc90JERBUVEhJS5jQOd3d3tYdw6cK0kAqHlmcn1aiaUDNo0KCq98gIcZ6LcWBwIU1g9YWIiIxRhUNLdU2qoX+x6mL4OFyMNIXhhYiIjAmvnHRMUdWFDFtReCGqqgcNLaQfIiIiQ8XQooNs/TIZXowAgwtpGsMLEREZKt7yWIdxuJjh43Axqg6cuE9ERIaGV0o6jhUX48CqC1UXDh8jIiJDwEqLHuDdxYwDqy5U3ViBISIifcWrIz3CqotxYNWFagIrMEREpE8YWvQMg4txYHChmsQAQ0REuo7Dw/QQh4sZBw4XI23gEDIiItJFDC16jHcXMw4P6ykYXEgrnq28MMQQEZG2MLToOQYX48CqC+kChhgiItIWhhYDwOFixoNVF9IlHEpGREQ1haHFgLDqYhxYdSFdpGoSP4MMERFpilavevbt24euXbvCw8MDMpkMGzZsUFovk8lU/syePVvaxtfXt8T6mTNn1vCe6A7eXcx48A5jpOuK35WMdyYjIqKq0GqlJScnBwEBAXj77bfRq1evEutTU1OVHm/duhVDhgxB7969lZZPmzYNw4YNkx7b2dlVT4f1BIeLGQ9WXUifsBpDRESVpdXQEhERgYiIiFLXu7u7Kz3euHEjOnTogLp16yott7OzK7FtWXJzc5Gbmys9zsrKqvBz9QmHixkPznUhfcUgQ0REFaE3Vznp6enYsmULhgwZUmLdzJkzUatWLbRs2RKzZ89GQUFBmW3FxcXBwcFB+vHy8qqubmsdh4sZj4f1FBwyRgbh2WFlHF5GRER6MxF/+fLlsLOzKzGMbMyYMXjhhRfg7OyMQ4cOITY2Fqmpqfjiiy9KbSs2NhYxMTHS46ysLKMILqy6GAdWXchQlRVcWJ0hIjJsehNali1bhv79+8PS0lJpefHw0bx5c1hYWGDEiBGIi4uDXC5X2ZZcLi91nSHjcDHjwbkuZGwqUolhsCEi0l96EVr279+P5ORkrFmzptxtg4KCUFBQgCtXrqBhw4Y10Dv9wuBiXFh1IfpXRYeYMdxoh6EMAeT5Q1Q99CK0LF26FIGBgQgICCh326SkJJiYmMDV1bUGeqafOFzMuLDqQqSeql48G9pFq6GEiZpSmeNlaOfMszR1DhXmKoCdGmmK9JBWQ0t2djYuXbokPU5JSUFSUhKcnZ3h7e0N4Ol8k8TERHz++eclnn/48GEcPXoUHTp0gJ2dHQ4fPoz33nsPAwYMgJOTU43th75i1cW4sOpCVDN4kU/q4jlDVD6thpbjx4+jQ4cO0uOi+SmRkZFISEgAAKxevRpCCPTr16/E8+VyOVavXo0pU6YgNzcXfn5+eO+995TmuVDZGFyMC6suREREpI+0GlpCQkIghChzm+HDh2P48OEq173wwgs4cuRIdXTNqHC4mPFh1YWIiIj0Ca9aSMLvdDEu/F4XIiIi0hcMLaSEwcX4MLgQERGRrmNooRJs/TIZXowMqy5ERESkyxhaqFQMLsaHwYWIiIh0EUMLlYlVF+PDqgsRERHpGoYWqhAGF+PD8EJERES6gqGFKozBxTgxuBAREZG2MbSQWjhczDix6kJERETaxNBClcLgYpwYXIiIiEgbGFqo0lh1MU6suhAREVFNY2ihKmNwMU4ML0RERFRTGFpIIxhcjBeDCxEREVU3hhbSGA4XM16suhAREVF1YmghjWNwMV4MLkRERFQdGFqoWrDqYrxYdSEiIiJNY2ihasXgYrwYXoiIiEhTGFqo2jG4GDcGFyIiIqoqhhaqERwuZtxYdSEiIqKqYGihGsXgYtwYXoiIiKgyGFqoxrHqQgwuREREpA6GFtIaBhfjxqoLERERVRRDC2kVqy7E8EJERETlYWghncDgQgwvREREVBqGFtIZrLoQwPkuREREVBJDC+kcBhdi1YWIiIiKY2ghncSqCwEML0RERPQUQwvpNAYXAhheiIiIjB1DC+k8Vl2oCIMLERGRcWJoIb3B4EIAqy5ERETGiKGF9AqrLlSE4YWIiMh4MLSQXmJwoSIML0RERP/at28funbtCg8PD8hkMmzYsEFpfXZ2NqKjo+Hp6QkrKyv4+/tj8eLFSts8efIEUVFRqFWrFmxtbdG7d2+kp6fX4F6UxNBCeotVFyqO4YWIiAjIyclBQEAAFixYoHJ9TEwMtm3bhhUrVuD8+fMYO3YsoqOjsWnTJmmb9957D7/88gsSExOxd+9e3Lp1C7169aqpXVDJTKuvTqQBtn6ZyE5x0HY3SEc8rKeA3WX+PYaIiIxTREQEIiIiSl1/6NAhREZGIiQkBAAwfPhwLFmyBMeOHUO3bt2QmZmJpUuXYuXKlejYsSMAID4+Ho0bN8aRI0fw0ksv1cRulMBPdjIIrLpQcay6EBGRocnKylL6yc3NrVQ7bdq0waZNm3Dz5k0IIbB7925cuHABYWFhAIATJ04gPz8foaGh0nMaNWoEb29vHD58WCP7UhmstJBBYdWFiisKLqy8EBFRdXO8lAczM81/3hQU5AEAvLy8lJZPnjwZU6ZMUbu9+fPnY/jw4fD09ISZmRlMTEzw7bffol27dgCAtLQ0WFhYwNHRUel5bm5uSEtLq9Q+aAJDCxmcoooLwwsVYXghIiJ9d/36ddjb20uP5XJ5pdqZP38+jhw5gk2bNsHHxwf79u1DVFQUPDw8lKoruoahhQwWqy70LIYXIiLSV/b29kqhpTIeP36Mjz/+GOvXr0eXLl0AAM2bN0dSUhLmzJmD0NBQuLu7Iy8vDxkZGUrVlvT0dLi7u1fp9auCn9xk0DjXhVThnBciIjJG+fn5yM/Ph4mJcgQwNTWFQvH0czEwMBDm5ubYuXOntD45ORnXrl1DcHBwjfa3OFZayCiw6kKqsPJCRESGJjs7G5cuXZIep6SkICkpCc7OzvD29kb79u0xbtw4WFlZwcfHB3v37sX333+PL774AgDg4OCAIUOGICYmBs7OzrC3t8fo0aMRHBystTuHAQwtSjp6XoTc1hy/X2uo7a5QNeBcFyoNwwsRERmK48ePo0OHDtLjmJgYAEBkZCQSEhKwevVqxMbGon///rh//z58fHwwY8YMjBw5UnrO3LlzYWJigt69eyM3NxedO3fGwoULa3xfipMJIYRWe6ADsrKy4ODggOgDPSG3NQcABhcDx+BCZWF4ISLSPYW5T/DXko+RmZlZ5bkdmlR0HflypykwM7PUePsFBU9wcOcUndvvmsZP5lKEeScjzDtZ292gasK5LlQWznkhIiLSLQwt5WBwMWwMLlQWhhciIiLdwNBSAay6GDZWXag8DC9ERETaxdCiBgYXw8bwQuVheCEiItIOhhY1sepi+BhcqDxF4YUBhoiIqGZoNbTs27cPXbt2hYeHB2QyGTZs2KC0fvDgwZDJZEo/4eHhStvcv38f/fv3h729PRwdHTFkyBBkZ2dXe98ZXAwbqy5UUQwvRERE1U+roSUnJwcBAQFYsGBBqduEh4cjNTVV+lm1apXS+v79++Ovv/7C9u3bsXnzZuzbtw/Dhw+v7q4DYNXFGDC4UEUxvBAREVUfrX65ZEREBCIiIsrcRi6Xw93dXeW68+fPY9u2bfjjjz/w4osvAgDmz5+P1157DXPmzIGHh4fG+6xKmHcyv9fFgPFLKUkd/KJKIiIizdP5T9U9e/bA1dUVDRs2xKhRo3Dv3j1p3eHDh+Ho6CgFFgAIDQ2FiYkJjh49Wmqbubm5yMrKUvqpKlZdDB+HjJE6OO+FiIhIc3Q6tISHh+P777/Hzp078dlnn2Hv3r2IiIhAYWEhACAtLQ2urq5KzzEzM4OzszPS0tJKbTcuLg4ODg7Sj5eXl8b6zOBi+BhcSF0ML0RERFWj1eFh5enbt6/0/82aNUPz5s1Rr1497NmzB506dap0u7GxsYiJiZEeZ2VlVUtw4ZAxw8UhY1QZxYMLh48RERFVnF59atatWxe1a9fGpUuXAADu7u64ffu20jYFBQW4f/9+qfNggKfzZOzt7ZV+qgOrLoaPVReqLFZfiIiIKk6vQsuNGzdw79491KlTBwAQHByMjIwMnDhxQtpm165dUCgUCAoK0lY3lXCui+HjXBeqCs59ISIiKp9WQ0t2djaSkpKQlJQEAEhJSUFSUhKuXbuG7OxsjBs3DkeOHMGVK1ewc+dOdO/eHfXr10fnzp0BAI0bN0Z4eDiGDRuGY8eO4eDBg4iOjkbfvn1r7M5hFcXgYvgYXqiqGF6IiIhU02poOX78OFq2bImWLVsCAGJiYtCyZUtMmjQJpqamOH36NLp164bnn38eQ4YMQWBgIPbv3w+5XC618eOPP6JRo0bo1KkTXnvtNbzyyiv45ptvtLVLZWLVxTgwuFBVsfpCRESkTKsT8UNCQiCEKHX9b7/9Vm4bzs7OWLlypSa7Ve34vS6GjxP1SVM4eZ+IiEjH7x5myHiHMePA8EKaxABDRETGip96WsbhYsaBQ8ZI0ziEjIiIjAkrLTqAVRfjwKoLVRdWYIiIyNDx002HsOpiHHiXMapOrMAQEZEhYqVFx7DqYjxYeaHqxgoMEREZCn6K6ShWXYwHqy5UE4pXYFiFISIifcPQosMYXIwHh4xRTWOIISIifcLhYTqOw8WMC4eMkbY8G1w4nIyIiHQJP5X0BKsuxoWVF9I2VmKIiEiXsNKiR1h1MT62fpmsupBOUBVcWI0hIqKawtCih8K8kxlcjAiHjJGuYpAhIqKawtCip1h1MT4ML6QPShtKxjBDRERVwdCi51h1MT4ML6SPypoXw0BDRETlYWgxAKy6GCfOdyFDUd5Ef4YaIiJiaDEgrLoYH1ZdyBhU9O5lDDdERIaLocXAsOpinBheiCoebp7FsENEpPsYWgwUqy7GieGFSH3qhh2GHCKimsfQYsBYdTFeDC9E1YfD1YiIah5DixFg1cV4MbwQaU9Fwg2DDRFRxTC0GAlWXYwb7zRGpJt4K2gioophaDEyDC/Gi1UXIv3CL+okIvoXQ4uR4pAx48XwQqTfGGaIyBgxtBgxVl2MG8MLkWFhmCEiQ8bQQqy6GDmGFyLDVt4NARhqiEgfMLQQAFZdiOGFyFjxLmdUkyr7JbAAoHhS+eeS/mNoISWsuhDDCxE9i1/AaRyqEiiIqhtDC5XAqgsBDC9EVHmauPhl8GGIICqOoYVKxaoLAQwvRKQdvGAnouL4ZwwqU5h3slR5IeNm65cpBRgiIiKimsTQQhXC4EJFGF6IiIiopjG0UIWx6kLFMbwQERFRTWFoIbUxuFBxDC9ERERU3RhaqFJYdaFnMbwQERFRdWFooSpheKFnMbwQERGRpjG0kEYwuNCzGF6IiIhIUxhaSGNYdSFVGF6IiIioqhhaSOMYXEgVhhciIiKqLIYWqhasulBpGF6IiIhIXQwtVK0YXKg0DC9ERERUUQwtVO1YdaGyFIUXBhgiIqKq27dvH7p27QoPDw/IZDJs2LBBab1MJlP5M3v2bKXttmzZgqCgIFhZWcHJyQk9evSouZ1QgaGFagzDC5WH4YWIiKhqcnJyEBAQgAULFqhcn5qaqvSzbNkyyGQy9O7dW9pm7dq1GDhwIN566y2cOnUKBw8exJtvvllTu6CSmVZfnYxSmHcyfr/WUNvdIB1WFFyyUxy03BMiIiL9EhERgYiIiFLXu7u7Kz3euHEjOnTogLp16wIACgoK8O6772L27NkYMmSItJ2/v3/1dLiCWGkhrWDVhSqClRciIqKnsrKylH5yc3Or3GZ6ejq2bNmiFE7+/PNP3Lx5EyYmJmjZsiXq1KmDiIgInD17tsqvVxWstJBWsepCFcHKCxER6Tqrc6kwM7HQeLsFijwAgJeXl9LyyZMnY8qUKVVqe/ny5bCzs0OvXr2kZf/88w8AYMqUKfjiiy/g6+uLzz//HCEhIbhw4QKcnZ2r9JqVxdBCWldUcWF4ofIwvBARkbG6fv067O3tpcdyubzKbS5btgz9+/eHpaWltEyhUAAA/ve//0nzXOLj4+Hp6YnExESMGDGiyq9bGQwtpDMYXqiiig8ZY4AhIiJjYG9vrxRaqmr//v1ITk7GmjVrlJbXqVMHgPIcFrlcjrp16+LatWsae311cU4L6RzOdSF1cN4LERGR+pYuXYrAwEAEBAQoLQ8MDIRcLkdy8r/XY/n5+bhy5Qp8fHxqupsSrYaWsu4jnZ+fj/Hjx6NZs2awsbGBh4cHBg0ahFu3bim14evrW+I+0zNnzqzhPSFN40R9UhfDCxEREZCdnY2kpCQkJSUBAFJSUpCUlKRUJcnKykJiYiKGDh1a4vn29vYYOXIkJk+ejN9//x3JyckYNWoUAOD111+vkX1QRavDw4ruI/32228rTQACgEePHuHPP//ExIkTERAQgAcPHuDdd99Ft27dcPz4caVtp02bhmHDhkmP7ezsaqT/VP04ZIzUxXkvRERkzI4fP44OHTpIj2NiYgAAkZGRSEhIAACsXr0aQgj069dPZRuzZ8+GmZkZBg4ciMePHyMoKAi7du2Ck5NTtfe/NDIhhNDaqxcjk8mwfv36Mr9t848//kDr1q1x9epVeHt7A3haaRk7dizGjh1b6dfOysqCg4MDog/0hNzWvNLtUPVicKHKYoAhItJ/iidPcHX8BGRmZmp0bkdVFV1HhtYZUW13D9uRukTn9rum6dWclszMTMhkMjg6OiotnzlzJmrVqoWWLVti9uzZKCgoKLOd3NzcEve6Jt3HIWNUWRw6RkREpN/05u5hT548wfjx49GvXz+llDlmzBi88MILcHZ2xqFDhxAbG4vU1FR88cUXpbYVFxeHqVOn1kS3qRpwyBhVFoeOERER6Se9CC35+fno06cPhBBYtGiR0rqicXoA0Lx5c1hYWGDEiBGIi4sr9f7VsbGxSs/Lysoq8YU9pPv4xZRUWQwvRERE+kXnQ0tRYLl69Sp27dpV7li+oKAgFBQU4MqVK2jYUPUFrVwu18gX8pD2sepCVcHveyEiItIPOh1aigLLxYsXsXv3btSqVavc5yQlJcHExASurq410EPSFQwvVFWsvhAREekurYaW7OxsXLp0SXpcdB9pZ2dn1KlTB//973/x559/YvPmzSgsLERaWhoAwNnZGRYWFjh8+DCOHj2KDh06wM7ODocPH8Z7772HAQMGaPWWbKQ9HDJGVcXwQkREpHu0GlrKuo/0lClTsGnTJgBAixYtlJ63e/duhISEQC6XY/Xq1ZgyZQpyc3Ph5+eH9957T2m+ijr6Oh7F+oJXKrczpDNYdSFN4NAxIiIi3aHV0BISEoKyviamvK+QeeGFF3DkyBGN9mmg0yEAwA8P2mi0Xap5DC+kKay+EBERaZdefU9LTSoKL6T/+N0upCn8vhciIiLt0OmJ+NrGqovhYNWFNIlDx4iIiGoWKy0VMNDpECsvBiLMO5mVF9IoVl+IiIiqH0OLGhhcDAfDC2laUXhhgCEiItI8hhY1sepiWBhcqDowvBAREWkWQ0slMbgYDlZdqLqw+kJERKQZDC1VwKqLYWF4oerE8EJERFR5DC0awOBiWBheqDqx+kJERKQ+hhYNYdXF8DC4UHVjeCEiIqoYfk+LhvG7XQwLv9+FagK/94WIiKhsrLRUE1ZdDAuHjFFN4fAxIiKiklhpqUasuhgeVl6oJrECQ0RE9BQrLTWAVRfDw8oL1TRWYIiIyJix0lJDWHUxTKy8kDawAkNERMaGlZYaxruMGSZWXUhbWIEhIiJjwNCiJQwuhodDxkjbigcYhhgiIjIkHB6mRRwyZpg4ZIx0BYeRERGRoWClRQew6mKYWHkhXcIqDBER6TNWWnQEqy6Gi5UX0kWqggurMUREpKtYadExrLoYLlZeSNexGkNERLqKlRYdxKqLYWPlhfQFqzFERKQrGFp0GMOLYWN4IX3EIENERNrA4WF6gEPGDBuHjZG+47AyIiKqbgwteoJfSmn4GFzIUDDEEBGRpnF4mJ4Z6HSIw8UMGIeMkSHikDIiIqoqhhY9xLkuho/hhQzds0GGIYaIiMrC0KLHGF4MH8MLGQuGGCIiKgtDiwHgkDHDx/BCxoZDyoiIqDiGFgPBqotxYHghY8YgQ0RkvBhaDAzDi3FgeCF6ikGGiMg4MLQYKA4ZMw4ML0QllXabZYYZIiL9xdBiwFh1MR4ML0TlY5ghItJfDC1GgOHFeBT/gkoGGKKKYZghItJ9DC1GhEPGjAurL0RVU1qYARhoiIhqGkOLkWHVxfgwvBBpHgMNEVHNYmgxUgwvxofhhahmlBVoAIYaIqLKYGgxchwyZnwYXoi0i6GGiEh9DC3EqouRYngh0k3lhZoiDDdEZEwYWkjC8GKcGF6I9BPDDREZE4YWKoFDxowTwwuRYapouCmOQYeIdA1DC6nEqovx4ne9EFFlgk4RBh4iqg4MLVQmhhfjxuoLEamrKoFHFYYgIgIYWqiCGF6MG8MLEWmLpkOQpul7qNL141tc4aNcbXeBtIihhdTC+S7GjeGFiEiZPl30E+kzE213gPTPQKdDUuWFjFOYd7LS3BciIiKi6sRKC1Uah4wRJ+0TERFRTWClpRjrY0+AQqHtbugdVl4IYPVFl5gUKvDimSuI2HsWL565ApNChba7RERUJSaFCrT866q2u0FapNXQsm/fPnTt2hUeHh6QyWTYsGGD0nohBCZNmoQ6derAysoKoaGhuHjxotI29+/fR//+/WFvbw9HR0cMGTIE2dnZlepPvbfvo/HLaXDY+riyu2TUGFwIYHjRtk6HzmPb0K+w7H8/4LPP12PZ/37AtqFfodOh89ruGhFRpRS9ry2cvkbbXdEL5V1fy2QylT+zZ88GAFy5cgVDhgyBn58frKysUK9ePUyePBl5eXla2Jt/aTW05OTkICAgAAsWLFC5ftasWfjqq6+wePFiHD16FDY2NujcuTOePHkibdO/f3/89ddf2L59OzZv3ox9+/Zh+PDhle6TeVohfEbdY3CpJFZdqEhReGGAqTmdDp3H5zN/huu9h0rLXe89xOczf2ZwISK9U9r7GpWuvOvr1NRUpZ9ly5ZBJpOhd+/eAIC///4bCoUCS5YswV9//YW5c+di8eLF+Pjjj2tyN0qQCSF0YjyUTCbD+vXr0aNHDwBPqyweHh54//338cEHHwAAMjMz4ebmhoSEBPTt2xfnz5+Hv78//vjjD7z44osAgG3btuG1117DjRs34OHhUaHXzsrKgoODAzIB2AMQMiDf3RTnD7oDprJq2FvjwfkuVBznvVQfk0IFtg39Cq73Hqr8a5QCQHpte0R8OxoKU44MJiLd9+z7WhYABzy9HrS3t9dy7/5VdB0ZWmcEzEwsNN5+gSIPO1KXVGq/n72+VqVHjx54+PAhdu7cWeo2s2fPxqJFi/DPP/+o9fqapLMT8VNSUpCWlobQ0FBpmYODA4KCgnD48GH07dsXhw8fhqOjoxRYACA0NBQmJiY4evQoevbsqbLt3Nxc5Ob+e6/vzMyntyvMKlogAKQWQrHnMR61ttT0rhmVnmYHsDojSNvdIB3R3vksAGDXjQZa7onhaf7XVVjfe4iyBsfa3M1C0z8v4WQTnxrrFxFRZT37vlZ0naYjf28voUDkPf0LUXW0i6fhqDi5XA65XF6lttPT07FlyxYsX768zO0yMzPh7OxcpdeqKp0NLWlpaQAANzc3peVubm7SurS0NLi6uiqtNzMzg7Ozs7SNKnFxcZg6dWqJ5V7PLnj7vvodJxXWa7sDRAbvHIAfK7Ihx4QTkZ4o7X3t3r17cHDQnS/1tLCwgLu7O/akxVfba9ja2sLLS/lKdfLkyZgyZUqV2l2+fDns7OzQq1evUre5dOkS5s+fjzlz5lTptapKZ0NLdYqNjUVMTIz0OCMjAz4+Prh27ZpO/RLosqysLHh5eeH69es6VaLVdTxu6uMxqxweN/XxmFUOj5v6eMwqJzMzE97e3lr/i/+zLC0tkZKSUq0T1YUQkMmUpyxUtcoCAMuWLUP//v1haal6ZNHNmzcRHh6O119/HcOGDavy61WFzoYWd3d3AE/LVnXq1JGWp6eno0WLFtI2t2/fVnpeQUEB7t+/Lz1fldLKaQ4ODnzzUJO9vT2PWSXwuKmPx6xyeNzUx2NWOTxu6uMxqxwTE92bl2dpaVnqhb+u2r9/P5KTk7FmjeoK/K1bt9ChQwe0adMG33zzTQ33riTd+1f/f35+fnB3d1eaFJSVlYWjR48iODgYABAcHIyMjAycOHFC2mbXrl1QKBQICuI8CiIiIiIiVZYuXYrAwEAEBASUWHfz5k2EhIQgMDAQ8fHxOhEUtVppyc7OxqVLl6THKSkpSEpKgrOzM7y9vTF27Fh88sknaNCgAfz8/DBx4kR4eHhId0Bo3LgxwsPDMWzYMCxevBj5+fmIjo5G3759K3znMCIiIiIiQ1He9TXwtBCQmJiIzz//vMTziwKLj48P5syZgzt37kjryhrJVN20GlqOHz+ODh06SI+L5plERkYiISEBH374IXJycjB8+HBkZGTglVdewbZt25TKbz/++COio6PRqVMnmJiYoHfv3vjqq6/U6odcLsfkyZM1MjbQWPCYVQ6Pm/p4zCqHx019PGaVw+OmPh6zyuFxq5jyrq8BYPXq1RBCoF+/fiWev337dly6dAmXLl2Cp6en0jpt3rlNZ76nhYiIiIiISBXtD1AjIiIiIiIqA0MLERERERHpNIYWIiIiIiLSaQwtRERERESk0/QytOzbtw9du3aFh4cHZDIZNmzYoLReCIFJkyahTp06sLKyQmhoKC5evKi0zf3799G/f3/Y29vD0dERQ4YMQXZ2ttI2p0+fRtu2bWFpaQkvLy/MmjWrRF8SExPRqFEjWFpaolmzZvj11181vr+aUtZxy8/Px/jx49GsWTPY2NjAw8MDgwYNwq1bt5Ta8PX1hUwmU/qZOXOm0jaGdNzKO9cGDx5c4niEh4crbcNzreRxe/aYFf3Mnj1b2sbYzrW4uDi0atUKdnZ2cHV1RY8ePZCcnKy0zZMnTxAVFYVatWrB1tYWvXv3Rnp6utI2165dQ5cuXWBtbQ1XV1eMGzcOBQUFStvs2bMHL7zwAuRyOerXry/dTaa4BQsWwNfXF5aWlggKCsKxY8c0vs9VVd4xu3//PkaPHo2GDRvCysoK3t7eGDNmDDIzM5XaUXUurl69WmkbQzlmQMXOtZCQkBLHZOTIkUrb8Fz795hduXKl1Pe1xMREaTtjO9cWLVqE5s2bS1+iGRwcjK1bt0rr+Z5GahF66NdffxX/+9//xLp16wQAsX79eqX1M2fOFA4ODmLDhg3i1KlTolu3bsLPz088fvxY2iY8PFwEBASII0eOiP3794v69euLfv36SeszMzOFm5ub6N+/vzh79qxYtWqVsLKyEkuWLJG2OXjwoDA1NRWzZs0S586dExMmTBDm5ubizJkz1X4MKqOs45aRkSFCQ0PFmjVrxN9//y0OHz4sWrduLQIDA5Xa8PHxEdOmTROpqanST3Z2trTe0I5beedaZGSkCA8PVzoe9+/fV9qG51rJ41b8eKWmpoply5YJmUwmLl++LG1jbOda586dRXx8vDh79qxISkoSr732mvD29lba55EjRwovLy+xc+dOcfz4cfHSSy+JNm3aSOsLCgpE06ZNRWhoqDh58qT49ddfRe3atUVsbKy0zT///COsra1FTEyMOHfunJg/f74wNTUV27Ztk7ZZvXq1sLCwEMuWLRN//fWXGDZsmHB0dBTp6ek1czAqqLxjdubMGdGrVy+xadMmcenSJbFz507RoEED0bt3b6V2AIj4+Hilc63454UhHTMhKnautW/fXgwbNkzpmGRmZkrrea4pH7OCgoIS72tTp04Vtra24uHDh1I7xnaubdq0SWzZskVcuHBBJCcni48//liYm5uLs2fPCiH4nkbq0cvQUtyzF0QKhUK4u7uL2bNnS8syMjKEXC4Xq1atEkIIce7cOQFA/PHHH9I2W7duFTKZTNy8eVMIIcTChQuFk5OTyM3NlbYZP368aNiwofS4T58+okuXLkr9CQoKEiNGjNDoPlYHVReSzzp27JgAIK5evSot8/HxEXPnzi31OYZ83EoLLd27dy/1OTzXKnaude/eXXTs2FFpmTGfa0IIcfv2bQFA7N27Vwjx9H3M3NxcJCYmStucP39eABCHDx8WQjwNiyYmJiItLU3aZtGiRcLe3l46Th9++KFo0qSJ0mu98cYbonPnztLj1q1bi6ioKOlxYWGh8PDwEHFxcZrfUQ169pip8tNPPwkLCwuRn58vLSvvHDXkYyaE6uPWvn178e6775b6HJ5r5Z9rLVq0EG+//bbSMmM/14QQwsnJSXz33Xd8TyO16eXwsLKkpKQgLS0NoaGh0jIHBwcEBQXh8OHDAIDDhw/D0dERL774orRNaGgoTExMcPToUWmbdu3awcLCQtqmc+fOSE5OxoMHD6Rtir9O0TZFr6PvMjMzIZPJ4OjoqLR85syZqFWrFlq2bInZs2crlWmN8bjt2bMHrq6uaNiwIUaNGoV79+5J63iulS89PR1btmzBkCFDSqwz5nOtaAiTs7MzAODEiRPIz89X2p9GjRrB29tb6b2tWbNmcHNzk7bp3LkzsrKy8Ndff0nblHVM8vLycOLECaVtTExMEBoaqvPH7dljVto29vb2MDNT/m7lqKgo1K5dG61bt8ayZcuUvkDNkI8ZUPpx+/HHH1G7dm00bdoUsbGxePTokbSO51rZ59qJEyeQlJSk8n3NWM+1wsJCrF69Gjk5OQgODuZ7GqnNrPxN9EtaWhoAKJ3gRY+L1qWlpcHV1VVpvZmZGZydnZW28fPzK9FG0TonJyekpaWV+Tr67MmTJxg/fjz69esHe3t7afmYMWPwwgsvwNnZGYcOHUJsbCxSU1PxxRdfADC+4xYeHo5evXrBz88Ply9fxscff4yIiAgcPnwYpqamPNcqYPny5bCzs0OvXr2UlhvzuaZQKDB27Fi8/PLLaNq0KYCn+2RhYVHijwjPvrep2t+idWVtk5WVhcePH+PBgwcoLCxUuc3ff/+tsX3UNFXH7Fl3797F9OnTMXz4cKXl06ZNQ8eOHWFtbY3ff/8d77zzDrKzszFmzBgAhnvMgNKP25tvvgkfHx94eHjg9OnTGD9+PJKTk7Fu3ToAPNfKO9eWLl2Kxo0bo02bNkrLjfFcO3PmDIKDg/HkyRPY2tpi/fr18Pf3R1JSEt/TSC0GF1qo6vLz89GnTx8IIbBo0SKldTExMdL/N2/eHBYWFhgxYgTi4uIgl8truqta17dvX+n/mzVrhubNm6NevXrYs2cPOnXqpMWe6Y9ly5ahf//+sLS0VFpuzOdaVFQUzp49iwMHDmi7K3qjvGOWlZWFLl26wN/fH1OmTFFaN3HiROn/W7ZsiZycHMyePVu6kDRkpR234sGuWbNmqFOnDjp16oTLly+jXr16Nd1NnVLeufb48WOsXLlS6bwqYoznWsOGDZGUlITMzEz8/PPPiIyMxN69e7XdLdJDBjc8zN3dHQBK3H0iPT1dWufu7o7bt28rrS8oKMD9+/eVtlHVRvHXKG2bovX6qCiwXL16Fdu3b1eqsqgSFBSEgoICXLlyBYDxHrcidevWRe3atXHp0iUAPNfKs3//fiQnJ2Po0KHlbmss51p0dDQ2b96M3bt3w9PTU1ru7u6OvLw8ZGRkKG3/7HtbZY+Jvb09rKysULt2bZiamurVcSvtmBV5+PAhwsPDYWdnh/Xr18Pc3LzM9oKCgnDjxg3k5uYCMMxjBpR/3IoLCgoCAKX3Np5rqo/Zzz//jEePHmHQoEHltmcM55qFhQXq16+PwMBAxMXFISAgAF9++SXf00htBhda/Pz84O7ujp07d0rLsrKycPToUQQHBwMAgoODkZGRgRMnTkjb7Nq1CwqFQnpjDg4Oxr59+5Cfny9ts337djRs2BBOTk7SNsVfp2ibotfRN0WB5eLFi9ixYwdq1apV7nOSkpJgYmIiDYEyxuNW3I0bN3Dv3j3UqVMHAM+18ixduhSBgYEICAgod1tDP9eEEIiOjsb69euxa9euEkPfAgMDYW5urrQ/ycnJuHbtmtJ725kzZ5SCctEfH/z9/aVtyjomFhYWCAwMVNpGoVBg586dOnfcyjtmwNP3/7CwMFhYWGDTpk0lKnqqJCUlwcnJSaroGdIxAyp23J6VlJQEAErvbTzXVFu6dCm6desGFxeXcts19HNNFYVCgdzcXL6nkfq0eBOASnv48KE4efKkOHnypAAgvvjiC3Hy5EnpLlczZ84Ujo6OYuPGjeL06dOie/fuKm953LJlS3H06FFx4MAB0aBBA6Xb0GZkZAg3NzcxcOBAcfbsWbF69WphbW1d4naqZmZmYs6cOeL8+fNi8uTJOns7VSHKPm55eXmiW7duwtPTUyQlJSndjrHoDh2HDh0Sc+fOFUlJSeLy5ctixYoVwsXFRQwaNEh6DUM7bmUds4cPH4oPPvhAHD58WKSkpIgdO3aIF154QTRo0EA8efJEaoPnWsnfUSGe3rLY2tpaLFq0qMTzjfFcGzVqlHBwcBB79uxR+v179OiRtM3IkSOFt7e32LVrlzh+/LgIDg4WwcHB0vqi24OGhYWJpKQksW3bNuHi4qLy9qDjxo0T58+fFwsWLFB5e1C5XC4SEhLEuXPnxPDhw4Wjo6PSHXx0QXnHLDMzUwQFBYlmzZqJS5cuKW1TUFAghHh6S9Zvv/1WnDlzRly8eFEsXLhQWFtbi0mTJkmvY0jHTIjyj9ulS5fEtGnTxPHjx0VKSorYuHGjqFu3rmjXrp3UBs+1kr+fQghx8eJFIZPJxNatW0u0YYzn2kcffST27t0rUlJSxOnTp8VHH30kZDKZ+P3334UQfE8j9ehlaNm9e7cAUOInMjJSCPH0tscTJ04Ubm5uQi6Xi06dOonk5GSlNu7duyf69esnbG1thb29vXjrrbeU7qUuhBCnTp0Sr7zyipDL5eK5554TM2fOLNGXn376STz//PPCwsJCNGnSRGzZsqXa9ruqyjpuKSkpKtcBELt37xZCCHHixAkRFBQkHBwchKWlpWjcuLH49NNPlS7QhTCs41bWMXv06JEICwsTLi4uwtzcXPj4+Ihhw4aVeBPkuVbyd1QIIZYsWSKsrKxERkZGiecb47lW2u9ffHy8tM3jx4/FO++8I5ycnIS1tbXo2bOnSE1NVWrnypUrIiIiQlhZWYnatWuL999/X+n2vkI8/fdp0aKFsLCwEHXr1lV6jSLz588X3t7ewsLCQrRu3VocOXKkOna7Sso7ZqWdhwBESkqKEOLpLchbtGghbG1thY2NjQgICBCLFy8WhYWFSq9lKMdMiPKP27Vr10S7du2Es7OzkMvlon79+mLcuHFK39MiBM+1Z38/hRAiNjZWeHl5lTh/hDDOc+3tt98WPj4+wsLCQri4uIhOnTpJgUUIvqeRemRCFLvXHhERERERkY4xuDktRERERERkWBhaiIiIiIhIpzG0EBERERGRTmNoISIiIiIincbQQkREREREOo2hhYiIiIiIdBpDCxERERER6TSGFiIiIiIi0mkMLUREBmLw4MHo0aOH3rRLRERUUQwtRERV1LVrV4SHh6tct3//fshkMpw+fbqGe1Vx3377LQICAmBrawtHR0e0bNkScXFx0vovv/wSCQkJ2usgEREZPTNtd4CISN8NGTIEvXv3xo0bN+Dp6am0Lj4+Hi+++CKaN2+upd6VbdmyZRg7diy++uortG/fHrm5uTh9+jTOnj0rbePg4KDFHhIREbHSQkRUZf/5z3/g4uJSohqRnZ2NxMREDBkyBACwdu1aNGnSBHK5HL6+vvj888+Vts/NzcX48ePh5eUFuVyO+vXrY+nSpQCAwsJCDBkyBH5+frCyskLDhg3x5ZdfquzP1KlT4eLiAnt7e4wcORJ5eXml9n3Tpk3o06cPhgwZgvr166NJkybo168fZsyYIW1TfHjYlStXIJPJSvyEhIRI2x84cABt27aFlZUVvLy8MGbMGOTk5FT0cBIREZXA0EJEVEVmZmYYNGgQEhISIISQlicmJqKwsBD9+vXDiRMn0KdPH/Tt2xdnzpzBlClTMHHiRKWgM2jQIKxatQpfffUVzp8/jyVLlsDW1hYAoFAo4OnpicTERJw7dw6TJk3Cxx9/jJ9++kmpLzt37sT58+exZ88erFq1CuvWrcPUqVNL7bu7uzuOHDmCq1evVmhfvby8kJqaKv2cPHkStWrVQrt27QAAly9fRnh4OHr37o3Tp09jzZo1OHDgAKKjoyt6OImIiEqQieKfsEREVCl///03GjdujN27d0tVh3bt2sHHxwc//PAD+vfvjzt37uD333+XnvPhhx9iy5Yt+Ouvv3DhwgU0bNgQ27dvR2ho6P+1cz8vUa1xHMffORuNcRWzUBACc7DSRF3EKKmQYLRoMWmzcybHEIcBFypDi0zUP0FJXWhFiIgDalCYCA02OpCLGQyFmULUhbPJEscKqeEuLh3u4I9rXBcD9/OCZ/Oc7znPc87uc57znFON6fV6icfjTE5OAn+viLx8+ZKtrS3Onz8PwODgIJ2dnezu7pKRcfg91fb2Nna7nVAohNVqxWazcfv2berr6416l8vF169fmZqaSjn3x48f1NTUYLFYmJ6eJiMjg+bmZkwmE0NDQ0bdu3fvqK6uZn9/n8zMzFM/UxERkd+00iIicgYKCwupqKhgZGQEgI8fP7KwsGB8Gra2tkZlZWXKOZWVlcRiMX79+kU4HMZkMlFdXX3sGAMDA5SXl2OxWDCbzQwPD7O5uZlSU1JSYgQWAJvNRiKRYGtr68hr5uTksLS0xMrKCm1tbfz8+ROn08mtW7dIJpMn3nNTUxN7e3uMjY0ZAScSifD06VPMZrPR6urqSCaTrK+vn3g9ERGR4yi0iIicEbfbjd/vZ29vj9HRUfLz808MIf+UlZV14vHx8XE6Ojpwu928efOGcDjM/fv3T9yv8ieKiorweDy8ePGCubk55ubmCAQCx9b39fUxOzvLzMwM2dnZRn8ikaClpYVwOGy0SCRCLBYjPz//TOYqIiL/P/p7mIjIGbl37x5tbW2MjY3x/PlzWltbOXfuHACXL18mGAym1AeDQaxWKyaTieLiYpLJJIFA4MjPw4LBIBUVFXg8HqPv06dPh+oikQjfv383QlAoFMJsNpOXl3fq+7hy5QrAsZvn/X4/PT09vH79+lAQKSsrY3V1lUuXLp16PBERkX+jlRYRkTNiNptxOBw8fPiQ7e1tXC6Xcay9vZ35+Xl6e3uJRqM8e/aM/v5+Ojo6ALh48SJOp5OmpiampqZYX1/n7du3xkb7goIClpeXmZ2dJRqN8ujRI96/f39oDgcHB7jdblZXV3n16hWPHz/G6/UeuZ8FoLW1ld7eXoLBIBsbG4RCIRobG7FYLNhstkP1Hz58oLGxEZ/Px9WrV4nH48TjcXZ2dgDw+XwsLi7i9XoJh8PEYjGmp6e1EV9ERP4ThRYRkTPkdrv58uULdXV15ObmGv1lZWVMTEwwPj5OUVERXV1d9PT0pASbJ0+eUF9fj8fjobCwkAcPHhirHS0tLdjtdhwOB9evX+fz588pqy6/3bx5k4KCAqqqqnA4HNy5c4fu7u5j51tbW0soFKKhoQGr1crdu3fJzMxkfn6eCxcuHKpfXl7m27dv9PX1kZOTYzS73Q7AtWvXCAQCRKNRbty4QWlpKV1dXSnPQkRE5E/p72EiIiIiIpLWtNIiIiIiIiJpTaFFRERERETSmkKLiIiIiIikNYUWERERERFJawotIiIiIiKS1hRaREREREQkrSm0iIiIiIhIWlNoERERERGRtKbQIiIiIiIiaU2hRURERERE0ppCi4iIiIiIpLW/ANYs3Rc1OvYvAAAAAElFTkSuQmCC",
"text/plain": [
"