{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "s_qNSzzyaCbD" }, "source": [ "##### Copyright 2019 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-14T23:10:11.489585Z", "iopub.status.busy": "2022-12-14T23:10:11.489146Z", "iopub.status.idle": "2022-12-14T23:10:11.492857Z", "shell.execute_reply": "2022-12-14T23:10:11.492331Z" }, "id": "jmjh290raIky" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "J0Qjg6vuaHNt" }, "source": [ "# アテンションを用いたニューラル機械翻訳" ] }, { "cell_type": "markdown", "metadata": { "id": "tudzcncJXetB" }, "source": [ "Note: これらのドキュメントは私たちTensorFlowコミュニティが翻訳したものです。コミュニティによる 翻訳は**ベストエフォート**であるため、この翻訳が正確であることや[英語の公式ドキュメント](https://www.tensorflow.org/?hl=en)の 最新の状態を反映したものであることを保証することはできません。 この翻訳の品質を向上させるためのご意見をお持ちの方は、GitHubリポジトリ[tensorflow/docs](https://github.com/tensorflow/docs)にプルリクエストをお送りください。 コミュニティによる翻訳やレビューに参加していただける方は、 [docs-ja@tensorflow.org メーリングリスト](https://groups.google.com/a/tensorflow.org/forum/#!forum/docs-ja)にご連絡ください。" ] }, { "cell_type": "markdown", "metadata": { "id": "AOpGoE2T-YXS" }, "source": [ "\n", " \n", " \n", " \n", " \n", "
\n", " \n", " \n", " View on TensorFlow.org\n", " \n", " \n", " \n", " Run in Google Colab\n", " \n", " \n", " \n", " View source on GitHub\n", " \n", " Download notebook\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "CiwtNgENbx2g" }, "source": [ "このノートブックでは、スペイン語から英語への翻訳を行う Sequence to Sequence (seq2seq) モデルを訓練します。このチュートリアルは、 Sequence to Sequence モデルの知識があることを前提にした上級編のサンプルです。\n", "\n", "このノートブックのモデルを訓練すると、_\"¿todavia estan en casa?\"_ のようなスペイン語の文を入力して、英訳: _\"are you still at home?\"_ を得ることができます。\n", "\n", "この翻訳品質はおもちゃとしてはそれなりのものですが、生成されたアテンションの図表の方が面白いかもしれません。これは、翻訳時にモデルが入力文のどの部分に注目しているかを表しています。\n", "\n", "\"spanish-english\n", "\n", "Note: このサンプルは P100 GPU 1基で実行した場合に約 10 分かかります。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:11.496381Z", "iopub.status.busy": "2022-12-14T23:10:11.495946Z", "iopub.status.idle": "2022-12-14T23:10:13.961690Z", "shell.execute_reply": "2022-12-14T23:10:13.961006Z" }, "id": "tnxXKDjq3jEL" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-12-14 23:10:12.430372: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 23:10:12.430471: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 23:10:12.430481: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n" ] } ], "source": [ "import tensorflow as tf\n", "\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker as ticker\n", "from sklearn.model_selection import train_test_split\n", "\n", "import unicodedata\n", "import re\n", "import numpy as np\n", "import os\n", "import io\n", "import time" ] }, { "cell_type": "markdown", "metadata": { "id": "wfodePkj3jEa" }, "source": [ "## データセットのダウンロードと準備\n", "\n", "ここでは、http://www.manythings.org/anki/ で提供されている言語データセットを使用します。このデータセットには、次のような書式の言語翻訳ペアが含まれています。\n", "\n", "\n", "```\n", "May I borrow this book?\t¿Puedo tomar prestado este libro?\n", "```\n", "\n", "さまざまな言語が用意されていますが、ここでは英語ースペイン語のデータセットを使用します。利便性を考えてこのデータセットは Google Cloud 上に用意してありますが、ご自分でダウンロードすることも可能です。データセットをダウンロードしたあと、データを準備するために下記のようないくつかの手順を実行します。\n", "\n", "1. それぞれの文ごとに、*開始* と *終了* のトークンを付加する\n", "2. 特殊文字を除去して文をきれいにする\n", "3. 単語インデックスと逆単語インデックス(単語 → id と id → 単語のマッピングを行うディクショナリ)を作成する\n", "4. 最大長にあわせて各文をパディングする" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:13.966226Z", "iopub.status.busy": "2022-12-14T23:10:13.965458Z", "iopub.status.idle": "2022-12-14T23:10:14.080520Z", "shell.execute_reply": "2022-12-14T23:10:14.079926Z" }, "id": "kRVATYOgJs1b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 8192/2638744 [..............................] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "2638744/2638744 [==============================] - 0s 0us/step\n" ] } ], "source": [ "# ファイルのダウンロード\n", "path_to_zip = tf.keras.utils.get_file(\n", " 'spa-eng.zip', origin='http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip',\n", " extract=True)\n", "\n", "path_to_file = os.path.dirname(path_to_zip)+\"/spa-eng/spa.txt\"" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:14.083878Z", "iopub.status.busy": "2022-12-14T23:10:14.083629Z", "iopub.status.idle": "2022-12-14T23:10:14.088456Z", "shell.execute_reply": "2022-12-14T23:10:14.087890Z" }, "id": "rd0jw-eC3jEh" }, "outputs": [], "source": [ "# ユニコードファイルを ascii に変換\n", "def unicode_to_ascii(s):\n", " return ''.join(c for c in unicodedata.normalize('NFD', s)\n", " if unicodedata.category(c) != 'Mn')\n", "\n", "\n", "def preprocess_sentence(w):\n", " w = unicode_to_ascii(w.lower().strip())\n", "\n", " # 単語とそのあとの句読点の間にスペースを挿入\n", " # 例: \"he is a boy.\" => \"he is a boy .\"\n", " # 参照:- https://stackoverflow.com/questions/3645931/python-padding-punctuation-with-white-spaces-keeping-punctuation\n", " w = re.sub(r\"([?.!,¿])\", r\" \\1 \", w)\n", " w = re.sub(r'[\" \"]+', \" \", w)\n", "\n", " # (a-z, A-Z, \".\", \"?\", \"!\", \",\") 以外の全ての文字をスペースに置き換え\n", " w = re.sub(r\"[^a-zA-Z?.!,¿]+\", \" \", w)\n", "\n", " w = w.rstrip().strip()\n", "\n", " # 文の開始と終了のトークンを付加\n", " # モデルが予測をいつ開始し、いつ終了すれば良いかを知らせるため\n", " w = ' ' + w + ' '\n", " return w" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:14.091708Z", "iopub.status.busy": "2022-12-14T23:10:14.091191Z", "iopub.status.idle": "2022-12-14T23:10:14.095075Z", "shell.execute_reply": "2022-12-14T23:10:14.094499Z" }, "id": "opI2GzOt479E" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " may i borrow this book ? \n", "b' \\xc2\\xbf puedo tomar prestado este libro ? '\n" ] } ], "source": [ "en_sentence = u\"May I borrow this book?\"\n", "sp_sentence = u\"¿Puedo tomar prestado este libro?\"\n", "print(preprocess_sentence(en_sentence))\n", "print(preprocess_sentence(sp_sentence).encode('utf-8'))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:14.098358Z", "iopub.status.busy": "2022-12-14T23:10:14.097911Z", "iopub.status.idle": "2022-12-14T23:10:14.101680Z", "shell.execute_reply": "2022-12-14T23:10:14.101127Z" }, "id": "OHn4Dct23jEm" }, "outputs": [], "source": [ "# 1. アクセント記号を除去\n", "# 2. 文をクリーニング\n", "# 3. [ENGLISH, SPANISH] の形で単語のペアを返す\n", "def create_dataset(path, num_examples):\n", " lines = io.open(path, encoding='UTF-8').read().strip().split('\\n')\n", "\n", " word_pairs = [[preprocess_sentence(w) for w in l.split('\\t')] for l in lines[:num_examples]]\n", "\n", " return zip(*word_pairs)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:14.104736Z", "iopub.status.busy": "2022-12-14T23:10:14.104330Z", "iopub.status.idle": "2022-12-14T23:10:17.998563Z", "shell.execute_reply": "2022-12-14T23:10:17.997907Z" }, "id": "cTbSbBz55QtF" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " if you want to sound like a native speaker , you must be willing to practice saying the same sentence over and over in the same way that banjo players practice the same phrase over and over until they can play it correctly and at the desired tempo . \n", " si quieres sonar como un hablante nativo , debes estar dispuesto a practicar diciendo la misma frase una y otra vez de la misma manera en que un musico de banjo practica el mismo fraseo una y otra vez hasta que lo puedan tocar correctamente y en el tiempo esperado . \n" ] } ], "source": [ "en, sp = create_dataset(path_to_file, None)\n", "print(en[-1])\n", "print(sp[-1])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:18.002280Z", "iopub.status.busy": "2022-12-14T23:10:18.001795Z", "iopub.status.idle": "2022-12-14T23:10:18.005098Z", "shell.execute_reply": "2022-12-14T23:10:18.004540Z" }, "id": "OmMZQpdO60dt" }, "outputs": [], "source": [ "def max_length(tensor):\n", " return max(len(t) for t in tensor)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:18.008332Z", "iopub.status.busy": "2022-12-14T23:10:18.007825Z", "iopub.status.idle": "2022-12-14T23:10:18.011579Z", "shell.execute_reply": "2022-12-14T23:10:18.011028Z" }, "id": "bIOn8RCNDJXG" }, "outputs": [], "source": [ "def tokenize(lang):\n", " lang_tokenizer = tf.keras.preprocessing.text.Tokenizer(\n", " filters='')\n", " lang_tokenizer.fit_on_texts(lang)\n", "\n", " tensor = lang_tokenizer.texts_to_sequences(lang)\n", "\n", " tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor,\n", " padding='post')\n", "\n", " return tensor, lang_tokenizer" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:18.014661Z", "iopub.status.busy": "2022-12-14T23:10:18.014217Z", "iopub.status.idle": "2022-12-14T23:10:18.017795Z", "shell.execute_reply": "2022-12-14T23:10:18.017249Z" }, "id": "eAY9k49G3jE_" }, "outputs": [], "source": [ "def load_dataset(path, num_examples=None):\n", " # クリーニングされた入力と出力のペアを生成\n", " targ_lang, inp_lang = create_dataset(path, num_examples)\n", "\n", " input_tensor, inp_lang_tokenizer = tokenize(inp_lang)\n", " target_tensor, targ_lang_tokenizer = tokenize(targ_lang)\n", "\n", " return input_tensor, target_tensor, inp_lang_tokenizer, targ_lang_tokenizer" ] }, { "cell_type": "markdown", "metadata": { "id": "GOi42V79Ydlr" }, "source": [ "### 実験を速くするためデータセットのサイズを制限(オプション)\n", "\n", "100,000 を超える文のデータセットを使って訓練するには長い時間がかかります。訓練を速くするため、データセットのサイズを 30,000 に制限することができます(もちろん、データが少なければ翻訳の品質は低下します)。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:18.021090Z", "iopub.status.busy": "2022-12-14T23:10:18.020592Z", "iopub.status.idle": "2022-12-14T23:10:19.584221Z", "shell.execute_reply": "2022-12-14T23:10:19.583521Z" }, "id": "cnxC7q-j3jFD" }, "outputs": [], "source": [ "# このサイズのデータセットで実験\n", "num_examples = 30000\n", "input_tensor, target_tensor, inp_lang, targ_lang = load_dataset(path_to_file, num_examples)\n", "\n", "# ターゲットテンソルの最大長を計算\n", "max_length_targ, max_length_inp = max_length(target_tensor), max_length(input_tensor)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:19.588570Z", "iopub.status.busy": "2022-12-14T23:10:19.587903Z", "iopub.status.idle": "2022-12-14T23:10:19.596336Z", "shell.execute_reply": "2022-12-14T23:10:19.595698Z" }, "id": "4QILQkOs3jFG" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "24000 24000 6000 6000\n" ] } ], "source": [ "# 80-20で分割を行い、訓練用と検証用のデータセットを作成\n", "input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(input_tensor, target_tensor, test_size=0.2)\n", "\n", "# 長さを表示\n", "print(len(input_tensor_train), len(target_tensor_train), len(input_tensor_val), len(target_tensor_val))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:19.599578Z", "iopub.status.busy": "2022-12-14T23:10:19.599064Z", "iopub.status.idle": "2022-12-14T23:10:19.602302Z", "shell.execute_reply": "2022-12-14T23:10:19.601766Z" }, "id": "lJPmLZGMeD5q" }, "outputs": [], "source": [ "def convert(lang, tensor):\n", " for t in tensor:\n", " if t!=0:\n", " print (\"%d ----> %s\" % (t, lang.index_word[t]))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:19.605340Z", "iopub.status.busy": "2022-12-14T23:10:19.604868Z", "iopub.status.idle": "2022-12-14T23:10:19.608746Z", "shell.execute_reply": "2022-12-14T23:10:19.608167Z" }, "id": "VXukARTDd7MT" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input Language; index to word mapping\n", "1 ----> \n", "4 ----> tom\n", "7 ----> es\n", "36 ----> muy\n", "2138 ----> capaz\n", "3 ----> .\n", "2 ----> \n", "\n", "Target Language; index to word mapping\n", "1 ----> \n", "5 ----> tom\n", "8 ----> is\n", "48 ----> very\n", "4910 ----> competent\n", "3 ----> .\n", "2 ----> \n" ] } ], "source": [ "print (\"Input Language; index to word mapping\")\n", "convert(inp_lang, input_tensor_train[0])\n", "print ()\n", "print (\"Target Language; index to word mapping\")\n", "convert(targ_lang, target_tensor_train[0])" ] }, { "cell_type": "markdown", "metadata": { "id": "rgCLkfv5uO3d" }, "source": [ "### tf.data データセットの作成" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:19.611971Z", "iopub.status.busy": "2022-12-14T23:10:19.611432Z", "iopub.status.idle": "2022-12-14T23:10:22.968347Z", "shell.execute_reply": "2022-12-14T23:10:22.967632Z" }, "id": "TqHsArVZ3jFS" }, "outputs": [], "source": [ "BUFFER_SIZE = len(input_tensor_train)\n", "BATCH_SIZE = 64\n", "steps_per_epoch = len(input_tensor_train)//BATCH_SIZE\n", "embedding_dim = 256\n", "units = 1024\n", "vocab_inp_size = len(inp_lang.word_index)+1\n", "vocab_tar_size = len(targ_lang.word_index)+1\n", "\n", "dataset = tf.data.Dataset.from_tensor_slices((input_tensor_train, target_tensor_train)).shuffle(BUFFER_SIZE)\n", "dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:22.971669Z", "iopub.status.busy": "2022-12-14T23:10:22.971418Z", "iopub.status.idle": "2022-12-14T23:10:23.024947Z", "shell.execute_reply": "2022-12-14T23:10:23.024260Z" }, "id": "qc6-NK1GtWQt" }, "outputs": [ { "data": { "text/plain": [ "(TensorShape([64, 16]), TensorShape([64, 11]))" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "example_input_batch, example_target_batch = next(iter(dataset))\n", "example_input_batch.shape, example_target_batch.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "TNfHIF71ulLu" }, "source": [ "## エンコーダー・デコーダーモデルの記述\n", "\n", "TensorFlow の [Neural Machine Translation (seq2seq) tutorial](https://github.com/tensorflow/nmt) に記載されているアテンション付きのエンコーダー・デコーダーモデルを実装します。この例では、最新の API セットを使用します。このノートブックは、上記の seq2seq チュートリアルにある [attention equations](https://github.com/tensorflow/nmt#background-on-the-attention-mechanism) を実装します。下図は、入力の単語ひとつひとつにアテンション機構によって重みが割り当てられ、それを使ってデコーダーが文中の次の単語を予測することを示しています。下記の図と式は [Luong の論文](https://arxiv.org/abs/1508.04025v5) にあるアテンション機構の例です。\n", "\n", "\"attention\n", "\n", "入力がエンコーダーを通過すると、shape が *(batch_size, max_length, hidden_size)* のエンコーダー出力と、shape が *(batch_size, hidden_size)* のエンコーダーの隠れ状態が得られます。\n", "\n", "下記に実装されている式を示します。\n", "\n", "\"attention\n", "\"attention\n", "\n", "このチュートリアルでは、エンコーダーでは [Bahdanau attention](https://arxiv.org/pdf/1409.0473.pdf) を使用します。簡略化した式を書く前に、表記方法を定めましょう。\n", "\n", "* FC = 全結合 (Dense) レイヤー\n", "* EO = エンコーダーの出力\n", "* H = 隠れ状態\n", "* X = デコーダーへの入力\n", "\n", "\n", "擬似コードは下記のとおりです。\n", "\n", "* `score = FC(tanh(FC(EO) + FC(H)))`\n", "* `attention weights = softmax(score, axis = 1)` softmax は既定では最後の軸に対して実行されますが、スコアの shape が *(batch_size, max_length, hidden_size)* であるため、*最初の軸* に適用します。`max_length` は入力の長さです。入力それぞれに重みを割り当てようとしているので、softmax はその軸に適用されなければなりません。\n", "* `context vector = sum(attention weights * EO, axis = 1)`. 上記と同様の理由で axis = 1 に設定しています。\n", "* `embedding output` = デコーダーへの入力 X は Embedding レイヤーを通して渡されます。\n", "* `merged vector = concat(embedding output, context vector)`\n", "* この結合されたベクトルがつぎに GRU に渡されます。\n", "\n", "それぞれのステップでのベクトルの shape は、コードのコメントに指定されています。" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.028512Z", "iopub.status.busy": "2022-12-14T23:10:23.027970Z", "iopub.status.idle": "2022-12-14T23:10:23.033200Z", "shell.execute_reply": "2022-12-14T23:10:23.032611Z" }, "id": "nZ2rI24i3jFg" }, "outputs": [], "source": [ "class Encoder(tf.keras.Model):\n", " def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):\n", " super(Encoder, self).__init__()\n", " self.batch_sz = batch_sz\n", " self.enc_units = enc_units\n", " self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n", " self.gru = tf.keras.layers.GRU(self.enc_units,\n", " return_sequences=True,\n", " return_state=True,\n", " recurrent_initializer='glorot_uniform')\n", "\n", " def call(self, x, hidden):\n", " x = self.embedding(x)\n", " output, state = self.gru(x, initial_state = hidden)\n", " return output, state\n", "\n", " def initialize_hidden_state(self):\n", " return tf.zeros((self.batch_sz, self.enc_units))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.036483Z", "iopub.status.busy": "2022-12-14T23:10:23.035906Z", "iopub.status.idle": "2022-12-14T23:10:23.655432Z", "shell.execute_reply": "2022-12-14T23:10:23.654734Z" }, "id": "60gSVh05Jl6l" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Encoder output shape: (batch size, sequence length, units) (64, 16, 1024)\n", "Encoder Hidden state shape: (batch size, units) (64, 1024)\n" ] } ], "source": [ "encoder = Encoder(vocab_inp_size, embedding_dim, units, BATCH_SIZE)\n", "\n", "# サンプル入力\n", "sample_hidden = encoder.initialize_hidden_state()\n", "sample_output, sample_hidden = encoder(example_input_batch, sample_hidden)\n", "print ('Encoder output shape: (batch size, sequence length, units) {}'.format(sample_output.shape))\n", "print ('Encoder Hidden state shape: (batch size, units) {}'.format(sample_hidden.shape))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.659318Z", "iopub.status.busy": "2022-12-14T23:10:23.658725Z", "iopub.status.idle": "2022-12-14T23:10:23.664300Z", "shell.execute_reply": "2022-12-14T23:10:23.663742Z" }, "id": "umohpBN2OM94" }, "outputs": [], "source": [ "class BahdanauAttention(tf.keras.layers.Layer):\n", " def __init__(self, units):\n", " super(BahdanauAttention, self).__init__()\n", " self.W1 = tf.keras.layers.Dense(units)\n", " self.W2 = tf.keras.layers.Dense(units)\n", " self.V = tf.keras.layers.Dense(1)\n", "\n", " def call(self, query, values):\n", " # hidden shape == (batch_size, hidden size)\n", " # hidden_with_time_axis shape == (batch_size, 1, hidden size)\n", " # スコアを計算するためにこのように加算を実行する\n", " hidden_with_time_axis = tf.expand_dims(query, 1)\n", "\n", " # score shape == (batch_size, max_length, 1)\n", " # スコアを self.V に適用するために最後の軸は 1 となる\n", " # self.V に適用する前のテンソルの shape は (batch_size, max_length, units)\n", " score = self.V(tf.nn.tanh(\n", " self.W1(values) + self.W2(hidden_with_time_axis)))\n", "\n", " # attention_weights の shape == (batch_size, max_length, 1)\n", " attention_weights = tf.nn.softmax(score, axis=1)\n", "\n", " # context_vector の合計後の shape == (batch_size, hidden_size)\n", " context_vector = attention_weights * values\n", " context_vector = tf.reduce_sum(context_vector, axis=1)\n", "\n", " return context_vector, attention_weights" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.667603Z", "iopub.status.busy": "2022-12-14T23:10:23.667070Z", "iopub.status.idle": "2022-12-14T23:10:23.707933Z", "shell.execute_reply": "2022-12-14T23:10:23.707349Z" }, "id": "k534zTHiDjQU" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Attention result shape: (batch size, units) (64, 1024)\n", "Attention weights shape: (batch_size, sequence_length, 1) (64, 16, 1)\n" ] } ], "source": [ "attention_layer = BahdanauAttention(10)\n", "attention_result, attention_weights = attention_layer(sample_hidden, sample_output)\n", "\n", "print(\"Attention result shape: (batch size, units) {}\".format(attention_result.shape))\n", "print(\"Attention weights shape: (batch_size, sequence_length, 1) {}\".format(attention_weights.shape))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.711232Z", "iopub.status.busy": "2022-12-14T23:10:23.710686Z", "iopub.status.idle": "2022-12-14T23:10:23.716748Z", "shell.execute_reply": "2022-12-14T23:10:23.716130Z" }, "id": "yJ_B3mhW3jFk" }, "outputs": [], "source": [ "class Decoder(tf.keras.Model):\n", " def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):\n", " super(Decoder, self).__init__()\n", " self.batch_sz = batch_sz\n", " self.dec_units = dec_units\n", " self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n", " self.gru = tf.keras.layers.GRU(self.dec_units,\n", " return_sequences=True,\n", " return_state=True,\n", " recurrent_initializer='glorot_uniform')\n", " self.fc = tf.keras.layers.Dense(vocab_size)\n", "\n", " # アテンションのため\n", " self.attention = BahdanauAttention(self.dec_units)\n", "\n", " def call(self, x, hidden, enc_output):\n", " # enc_output の shape == (batch_size, max_length, hidden_size)\n", " context_vector, attention_weights = self.attention(hidden, enc_output)\n", "\n", " # 埋め込み層を通過したあとの x の shape == (batch_size, 1, embedding_dim)\n", " x = self.embedding(x)\n", "\n", " # 結合後の x の shape == (batch_size, 1, embedding_dim + hidden_size)\n", " x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)\n", "\n", " # 結合したベクトルを GRU 層に渡す\n", " output, state = self.gru(x)\n", "\n", " # output shape == (batch_size * 1, hidden_size)\n", " output = tf.reshape(output, (-1, output.shape[2]))\n", "\n", " # output shape == (batch_size, vocab)\n", " x = self.fc(output)\n", "\n", " return x, state, attention_weights" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.719802Z", "iopub.status.busy": "2022-12-14T23:10:23.719257Z", "iopub.status.idle": "2022-12-14T23:10:23.781576Z", "shell.execute_reply": "2022-12-14T23:10:23.781013Z" }, "id": "P5UY8wko3jFp" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Decoder output shape: (batch_size, vocab size) (64, 4935)\n" ] } ], "source": [ "decoder = Decoder(vocab_tar_size, embedding_dim, units, BATCH_SIZE)\n", "\n", "sample_decoder_output, _, _ = decoder(tf.random.uniform((64, 1)),\n", " sample_hidden, sample_output)\n", "\n", "print ('Decoder output shape: (batch_size, vocab size) {}'.format(sample_decoder_output.shape))" ] }, { "cell_type": "markdown", "metadata": { "id": "_ch_71VbIRfK" }, "source": [ "## オプティマイザと損失関数の定義" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.784627Z", "iopub.status.busy": "2022-12-14T23:10:23.784187Z", "iopub.status.idle": "2022-12-14T23:10:23.791050Z", "shell.execute_reply": "2022-12-14T23:10:23.790486Z" }, "id": "WmTHr5iV3jFr" }, "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam()\n", "loss_object = tf.keras.losses.SparseCategoricalCrossentropy(\n", " from_logits=True, reduction='none')\n", "\n", "def loss_function(real, pred):\n", " mask = tf.math.logical_not(tf.math.equal(real, 0))\n", " loss_ = loss_object(real, pred)\n", "\n", " mask = tf.cast(mask, dtype=loss_.dtype)\n", " loss_ *= mask\n", "\n", " return tf.reduce_mean(loss_)" ] }, { "cell_type": "markdown", "metadata": { "id": "DMVWzzsfNl4e" }, "source": [ "## チェックポイント(オブジェクトベースの保存)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.794522Z", "iopub.status.busy": "2022-12-14T23:10:23.793979Z", "iopub.status.idle": "2022-12-14T23:10:23.797472Z", "shell.execute_reply": "2022-12-14T23:10:23.796929Z" }, "id": "Zj8bXQTgNwrF" }, "outputs": [], "source": [ "checkpoint_dir = './training_checkpoints'\n", "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n", "checkpoint = tf.train.Checkpoint(optimizer=optimizer,\n", " encoder=encoder,\n", " decoder=decoder)" ] }, { "cell_type": "markdown", "metadata": { "id": "hpObfY22IddU" }, "source": [ "## 訓練\n", "\n", "1. *入力* を *エンコーダー* に通すと、*エンコーダー出力* と *エンコーダーの隠れ状態* が返される\n", "2. エンコーダーの出力とエンコーダーの隠れ状態、そしてデコーダーの入力(これが *開始トークン*)がデコーダーに渡される\n", "3. デコーダーは *予測値* と *デコーダーの隠れ状態* を返す\n", "4. つぎにデコーダーの隠れ状態がモデルに戻され、予測値が損失関数の計算に使用される\n", "5. デコーダーへの次の入力を決定するために *Teacher Forcing* が使用される\n", "6. *Teacher Forcing* は、*正解単語* をデコーダーの *次の入力* として使用するテクニックである\n", "7. 最後に勾配を計算し、それをオプティマイザに与えて誤差逆伝播を行う" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.800778Z", "iopub.status.busy": "2022-12-14T23:10:23.800335Z", "iopub.status.idle": "2022-12-14T23:10:23.805612Z", "shell.execute_reply": "2022-12-14T23:10:23.805020Z" }, "id": "sC9ArXSsVfqn" }, "outputs": [], "source": [ "@tf.function\n", "def train_step(inp, targ, enc_hidden):\n", " loss = 0\n", "\n", " with tf.GradientTape() as tape:\n", " enc_output, enc_hidden = encoder(inp, enc_hidden)\n", "\n", " dec_hidden = enc_hidden\n", "\n", " dec_input = tf.expand_dims([targ_lang.word_index['']] * BATCH_SIZE, 1)\n", "\n", " # Teacher Forcing - 正解値を次の入力として供給\n", " for t in range(1, targ.shape[1]):\n", " # passing enc_output to the decoder\n", " predictions, dec_hidden, _ = decoder(dec_input, dec_hidden, enc_output)\n", "\n", " loss += loss_function(targ[:, t], predictions)\n", "\n", " # Teacher Forcing を使用\n", " dec_input = tf.expand_dims(targ[:, t], 1)\n", "\n", " batch_loss = (loss / int(targ.shape[1]))\n", "\n", " variables = encoder.trainable_variables + decoder.trainable_variables\n", "\n", " gradients = tape.gradient(loss, variables)\n", "\n", " optimizer.apply_gradients(zip(gradients, variables))\n", "\n", " return batch_loss" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:10:23.808713Z", "iopub.status.busy": "2022-12-14T23:10:23.808272Z", "iopub.status.idle": "2022-12-14T23:14:07.201703Z", "shell.execute_reply": "2022-12-14T23:14:07.200849Z" }, "id": "ddefjBMa3jF0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 0 Loss 4.7353\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 100 Loss 2.3236\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 200 Loss 1.6937\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 300 Loss 1.7070\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Loss 2.0369\n", "Time taken for 1 epoch 38.7444052696228 sec\n", "\n", "Epoch 2 Batch 0 Loss 1.6072\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Batch 100 Loss 1.4702\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Batch 200 Loss 1.4290\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Batch 300 Loss 1.3025\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Loss 1.4043\n", "Time taken for 1 epoch 21.323351621627808 sec\n", "\n", "Epoch 3 Batch 0 Loss 1.0264\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Batch 100 Loss 1.0971\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Batch 200 Loss 0.9568\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Batch 300 Loss 0.8830\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Loss 0.9820\n", "Time taken for 1 epoch 20.229315757751465 sec\n", "\n", "Epoch 4 Batch 0 Loss 0.7010\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Batch 100 Loss 0.7372\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Batch 200 Loss 0.6545\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Batch 300 Loss 0.5471\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Loss 0.6590\n", "Time taken for 1 epoch 20.86075496673584 sec\n", "\n", "Epoch 5 Batch 0 Loss 0.3788\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Batch 100 Loss 0.4551\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Batch 200 Loss 0.5846\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Batch 300 Loss 0.4743\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Loss 0.4479\n", "Time taken for 1 epoch 20.013705730438232 sec\n", "\n", "Epoch 6 Batch 0 Loss 0.3106\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Batch 100 Loss 0.2062\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Batch 200 Loss 0.3290\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Batch 300 Loss 0.3195\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Loss 0.3081\n", "Time taken for 1 epoch 20.81093120574951 sec\n", "\n", "Epoch 7 Batch 0 Loss 0.2261\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Batch 100 Loss 0.3102\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Batch 200 Loss 0.1855\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Batch 300 Loss 0.2770\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Loss 0.2200\n", "Time taken for 1 epoch 20.144649267196655 sec\n", "\n", "Epoch 8 Batch 0 Loss 0.1757\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Batch 100 Loss 0.1824\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Batch 200 Loss 0.1366\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Batch 300 Loss 0.1332\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Loss 0.1618\n", "Time taken for 1 epoch 20.600513696670532 sec\n", "\n", "Epoch 9 Batch 0 Loss 0.1050\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Batch 100 Loss 0.1242\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Batch 200 Loss 0.1232\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Batch 300 Loss 0.1080\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Loss 0.1271\n", "Time taken for 1 epoch 20.18126344680786 sec\n", "\n", "Epoch 10 Batch 0 Loss 0.0934\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Batch 100 Loss 0.1031\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Batch 200 Loss 0.1194\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Batch 300 Loss 0.1105\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Loss 0.1017\n", "Time taken for 1 epoch 20.478492975234985 sec\n", "\n" ] } ], "source": [ "EPOCHS = 10\n", "\n", "for epoch in range(EPOCHS):\n", " start = time.time()\n", "\n", " enc_hidden = encoder.initialize_hidden_state()\n", " total_loss = 0\n", "\n", " for (batch, (inp, targ)) in enumerate(dataset.take(steps_per_epoch)):\n", " batch_loss = train_step(inp, targ, enc_hidden)\n", " total_loss += batch_loss\n", "\n", " if batch % 100 == 0:\n", " print('Epoch {} Batch {} Loss {:.4f}'.format(epoch + 1,\n", " batch,\n", " batch_loss.numpy()))\n", " # 2 エポックごとにモデル(のチェックポイント)を保存\n", " if (epoch + 1) % 2 == 0:\n", " checkpoint.save(file_prefix = checkpoint_prefix)\n", "\n", " print('Epoch {} Loss {:.4f}'.format(epoch + 1,\n", " total_loss / steps_per_epoch))\n", " print('Time taken for 1 epoch {} sec\\n'.format(time.time() - start))" ] }, { "cell_type": "markdown", "metadata": { "id": "mU3Ce8M6I3rz" }, "source": [ "## 翻訳\n", "\n", "* 評価関数は、*Teacher Forcing* を使わないことを除いては、訓練ループと同様である。タイムステップごとのデコーダーへの入力は、過去の予測値に加えて、隠れ状態とエンコーダーのアウトプットである。\n", "* モデルが *終了トークン* を予測したら、予測を停止する。\n", "* また、*タイムステップごとのアテンションの重み* を保存する。\n", "\n", "Note: エンコーダーの出力は 1 つの入力に対して 1 回だけ計算されます。" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:07.205521Z", "iopub.status.busy": "2022-12-14T23:14:07.204937Z", "iopub.status.idle": "2022-12-14T23:14:07.211834Z", "shell.execute_reply": "2022-12-14T23:14:07.211228Z" }, "id": "EbQpyYs13jF_" }, "outputs": [], "source": [ "def evaluate(sentence):\n", " attention_plot = np.zeros((max_length_targ, max_length_inp))\n", "\n", " sentence = preprocess_sentence(sentence)\n", "\n", " inputs = [inp_lang.word_index[i] for i in sentence.split(' ')]\n", " inputs = tf.keras.preprocessing.sequence.pad_sequences([inputs],\n", " maxlen=max_length_inp,\n", " padding='post')\n", " inputs = tf.convert_to_tensor(inputs)\n", "\n", " result = ''\n", "\n", " hidden = [tf.zeros((1, units))]\n", " enc_out, enc_hidden = encoder(inputs, hidden)\n", "\n", " dec_hidden = enc_hidden\n", " dec_input = tf.expand_dims([targ_lang.word_index['']], 0)\n", "\n", " for t in range(max_length_targ):\n", " predictions, dec_hidden, attention_weights = decoder(dec_input,\n", " dec_hidden,\n", " enc_out)\n", "\n", " # 後ほどプロットするためにアテンションの重みを保存\n", " attention_weights = tf.reshape(attention_weights, (-1, ))\n", " attention_plot[t] = attention_weights.numpy()\n", "\n", " predicted_id = tf.argmax(predictions[0]).numpy()\n", "\n", " result += targ_lang.index_word[predicted_id] + ' '\n", "\n", " if targ_lang.index_word[predicted_id] == '':\n", " return result, sentence, attention_plot\n", "\n", " # 予測された ID がモデルに戻される\n", " dec_input = tf.expand_dims([predicted_id], 0)\n", "\n", " return result, sentence, attention_plot" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:07.214977Z", "iopub.status.busy": "2022-12-14T23:14:07.214410Z", "iopub.status.idle": "2022-12-14T23:14:07.219347Z", "shell.execute_reply": "2022-12-14T23:14:07.218805Z" }, "id": "s5hQWlbN3jGF" }, "outputs": [], "source": [ "# アテンションの重みをプロットする関数\n", "def plot_attention(attention, sentence, predicted_sentence):\n", " fig = plt.figure(figsize=(10,10))\n", " ax = fig.add_subplot(1, 1, 1)\n", " ax.matshow(attention, cmap='viridis')\n", "\n", " fontdict = {'fontsize': 14}\n", "\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n", "\n", " ax.xaxis.set_major_locator(ticker.MultipleLocator(1))\n", " ax.yaxis.set_major_locator(ticker.MultipleLocator(1))\n", "\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:07.222394Z", "iopub.status.busy": "2022-12-14T23:14:07.221960Z", "iopub.status.idle": "2022-12-14T23:14:07.225818Z", "shell.execute_reply": "2022-12-14T23:14:07.225194Z" }, "id": "sl9zUHzg3jGI" }, "outputs": [], "source": [ "def translate(sentence):\n", " result, sentence, attention_plot = evaluate(sentence)\n", "\n", " print('Input: %s' % (sentence))\n", " print('Predicted translation: {}'.format(result))\n", "\n", " attention_plot = attention_plot[:len(result.split(' ')), :len(sentence.split(' '))]\n", " plot_attention(attention_plot, sentence.split(' '), result.split(' '))" ] }, { "cell_type": "markdown", "metadata": { "id": "n250XbnjOaqP" }, "source": [ "## 最後のチェックポイントを復元しテストする" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:07.228821Z", "iopub.status.busy": "2022-12-14T23:14:07.228402Z", "iopub.status.idle": "2022-12-14T23:14:07.459975Z", "shell.execute_reply": "2022-12-14T23:14:07.459249Z" }, "id": "UJpT9D5_OgP6" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# checkpoint_dir の中の最後のチェックポイントを復元\n", "checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:07.463620Z", "iopub.status.busy": "2022-12-14T23:14:07.463027Z", "iopub.status.idle": "2022-12-14T23:14:07.758396Z", "shell.execute_reply": "2022-12-14T23:14:07.757563Z" }, "id": "WrAM0FDomq3E" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: hace mucho frio aqui . \n", "Predicted translation: it s very cold here . \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_146998/2662029192.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_146998/2662029192.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "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fOa5NIIAgPpAEFDFXnvtVe3JNJCCYcOGxfTp06N3794xdOjQ6NixYzRs6FclQH00bdq0L3zfAw44YCNOki2HDFHFzJkzo3fv3jFq1Kg45ZRTsh4H6lSrVq1iu+22i5kzZ9arE8YAqKqgoOAL/66v7nDSryp/9qKKJ554Inr37h2nnXZa3HrrrbHXXntF27Ztq/yDccgE9dG//vWvOOCAA8QAQAIuv/zyKr/vZ82aFY899lhsv/32se+++0bbtm1j6dKl8eyzz8brr78e/fv3j169emU0ce2wh4Aq/vMzCdYnl8vVqzqGiIh99903OnToEPfdd1/WowBQx5555pk46KCD4te//nV85zvfqRQL+Xw+Ro0aFeeff3488cQTsd9++2U46cYlCKhi6tSpG7ztgQceWIuTQN17/PHHY8CAAfH000/Xu78AAbB+vXv3jpYtW8YDDzxQ4zZHH310fPTRR/HUU0/V4WS1yyFDVOFN/qbhwQcfjHHjxsW8efNi1apV8eabb0ZExLx58+Lhhx+Ok046KTp06JDxlF99Y8aMqbLs8MMPjwMPPDBOOumk6NGjRzRr1qza+zrHBqB+ef7556v9YNb/9PWvfz1+9atf1dFEdcMeAtjElJeXxwknnBD3339/REQ0bdo0/vWvf1UcnrV06dLo2LFjXHXVVTF8+PAsR60Xqjuh7L9/LVa33iFzAPVPy5Yto1evXjFp0qQatznssMPiueeeiw8//LAOJ6td9hCwXosWLYrFixdHaWlptevr0yW3NhU33XRT/OlPf4qzzz47rr322rjxxhvjZz/7WcX6tm3bxv777x+TJk0SBBvBHXfckfUIAGwiDj744Ljvvvvi2muvjWHDhkXjxo0r1n366adxww03xGOPPRbHHXdchlNufPYQUK1HHnkkfvzjH8cbb7yx3u38hXTj22WXXWKzzTaL5557LiIirrzyyrjqqqsqvdZnnnlmTJo0Kd59992sxgSAeuedd96JXr16xXvvvRdt2rSJPffcM9q0aRPLli2LuXPnxrJly6J9+/Yxc+bM6NixY9bjbjQbdjkZkvL000/HUUcdFZ988kmcc845kc/n44ADDogzzzwzdtppp8jn83H44YfH5ZdfnvWo9dKbb74Z+++//3q3admyZb3aVQkAm4KOHTvG3LlzY8iQIVFcXByTJk2KO+64IyZNmhTFxcUxZMiQmDNnTr2KgQiHDFGNa6+9NrbYYot4/vnno23btnHrrbdGnz59KgJg5MiRcfXVV8dVV12V8aT1U9OmTaO4uHi92yxcuDCaN29eNwMlZuLEiXH77bfHr3/962jfvn2V9YsXL45zzjknzjjjjDj00EMzmBA2nn/+858REdGhQ4do0KBBxe0N0blz59oaCzLVrl27GD16dIwaNSpee+21KC4ujqKiothhhx0qHUJUnwgCqpgzZ04MGjQo2rZtW7GsvLy84r8PHz48Jk2aFJdffnk8/PDDWYxYr3Xv3j0ee+yxWL16dTRp0qTK+uXLl8eUKVOcv1FLfvOb38TixYurjYGIiPbt28eCBQviN7/5jSDgK69r166Ry+Xi1VdfjR122KHi9mfJ5XKxZs2aOpgQstOoUaPYeeedsx6jTggCqli1alWly1kWFhZGSUlJpW169erlZMxact5558VRRx0VxxxzTPz+97+vtO6tt96K008/PYqLi+O8887LaML67aWXXoojjjhivdv07NkzJk6cWEcTQe055ZRTIpfLRVFRUaXbQFoEAVW0a9cu3n///YrbHTp0iH/84x+Vtvnwww+dUFxLBg4cGBdffHH84he/iC5dusTmm28eERFt2rSJDz/8MPL5fFx22WXRt2/fjCetn5YvXx5t2rRZ7zatWrWKDz74oI4mgtozevTo9d6GFP35z3+OG2+8MebMmRMff/xxpaMk1qlve8kEAVXstttu8fLLL1fc7tOnT9x5550xbty4GDBgQEyfPj3uu+++2GOPPTKcsn4bOXJk9O3bN37961/Hc889F6tXr47y8vI45JBD4rzzzov+/ftnPWK91bp163jttdfWu81rr70WLVq0qKOJAKgrDzzwQBx33HFRXl4eXbp0iR133DEaNqz/b5dddpQqbr/99jjnnHPi1VdfjS5dusSCBQtijz32qHSia8OGDeOJJ55wHDv1zkknnRQPPPBAzJ49O3bdddcq61966aXYe++94+ijj45x48ZlMCEAtWW33XaL+fPnx0MPPZTUnnhBwAZ566234sYbb4z58+dHly5d4uyzz47dd98967Fgo/vb3/4We++9dzRu3Dh+9KMfxUEHHRQdOnSId999Nx5//PG44YYboqysLJ577rlqgwG+yjb0DVAul4snn3yylqeButekSZMYMmRIjBo1KutR6pQggE2My15m74EHHoihQ4fGv/71r0rL8/l8bLHFFjFmzJgYNGhQNsNBLSooWP/HE+Vyucjn85HL5ZxHRr3UoUOHOPbYY+OWW27JepQ6JQio4vTTT49BgwbFgAEDatxm4sSJ8b//+79x++231+FkaTj00ENj8eLF8dJLL9W4Tffu3aNDhw6udFOLli1bFqNHj445c+ZEcXFxNG/ePPbee+8YOnRotG7dOuvx6r0ZM2bEiy++GCUlJdGsWbPYfffdY9999816rGSVlJTEX//617jkkkuiY8eOMW7cuGjQoEHWY8FGd/7558ef//zneOmll5I4d2AdQUAVBQUFMWLEiPV+EvE111wTl19+ub8Q1YL27dvHEUccEX/4wx9q3Obss8+OiRMnxjvvvFOHk0Hte/bZZ+O0006LN998MyKi4q/RERHbb7993HHHHbHPPvtkOWLSVqxYEbvsskucfvrpPq2eemnlypVx8MEHR7t27eKmm25K5gP40kkfNqrVq1cnVc51yWUvSdU//vGPOPjgg2PVqlVx0EEHRZ8+fWLrrbeOJUuWxFNPPRWPP/549O/fP2bNmhU77bRT1uMmacstt4xDDz007rjjDkFAvbTLLrtEWVlZzJo1KyZMmBDNmzev+JyO/5TL5eKtt97KYMLa4R0d1arpg2ny+XwsWrQoJk+eXOMnufLluOxltsaMGbPB255yyim1OEl6rrrqqvj000/j0UcfjUMOOaTSuosvvjimTJkSAwYMiKuuuiruvffejKakoKAg3nvvvazHgFpRXl4eDRs2rLRnoLqDaerbATYOGSIi/v0Lfl0E/Ocu+prk8/m4+OKLY+TIkXUxXlJc9jJb//lvoSZOqqwdbdu2jW9961txzz331LjNiSeeGE8++WQsXbq0Didjnfnz50evXr2iRYsWMW/evKzHATYSewiIiIgDDjig4k3QtGnTonPnztG1a9cq2zVo0CBatGgRffv2jTPOOKOOp0zDxRdfHA888EDst99+NV72sqCgIIYPH571qPXSHXfcUe3y4uLi+Otf/xr33HNPDBgwII488sg6nqz+Ky4ujm7duq13m27dulX6TBQ2rtNPP73a5WvWrIl33303pk+fHmVlZXHVVVfV8WRAbbKHgCo25KRiapfLXm66Zs6cGX379o2JEyfGt771razHqVe22Wab6Nat23qvb9+vX7+YP39+zJ8/vw4nS8dnXXb0a1/7Wlx44YXx3e9+t44mguy88sorMW/evFi5cmUMGTIk63FqlSCATZTLXm66jjvuuHjnnXdixowZWY9Sr/zwhz+MW2+9NS655JL46U9/Gk2aNKlYt3r16hg5cmRcffXVcd5558VNN92U4aT118KFC6tdXlBQEM2bN48tt9yyjieCujdnzpw444wz4u9//3vFsnWHiE6bNi0OOeSQuPfee9d7efavGkFAtcrLy6v8pWjmzJkxceLEaNKkSZx22mnRsWPHjKaDbF100UXx29/+Nj755JOsR6lXPvzww+jZs2csWLAgWrZsGXvvvXe0bds2li5dGnPmzIn3338/ttlmm5g9e7aT6oFa8Y9//CN69eoVBQUFccYZZ8S8efNi8uTJFUGQz+ejS5cuceCBB8bYsWMznnbjWf++QZJ0wQUXxGabbRYff/xxxbL7778/9t9//xg5cmRcccUV0aNHD9fAJ0n5fD6mTZsWTZs2zXqUeqdly5Yxa9asGDp0aHzyySfx6KOPxh133BGPPvporFixIk477bSYNWuWGABqzRVXXBEREc8//3xcf/31sddee1Van8vlYp999ok5c+ZkMV6tcVIxVTz11FPRt2/faN68ecWyyy+/PIqKiuKWW26JJUuWxPDhw+P666+Pm2++ObM567vVq1fHnDlzYvHixVFaWlrtNi57ufFNmzat2uXrTqocM2ZMzJkzx2tfS1q1ahW33357/P73v4958+ZVfFLxjjvuGI0aNcp6vHrvi54snMvl4rLLLtvI00Ddmzp1ahxzzDGx3Xbb1bhN586dY8qUKXU4Ve0TBFSxaNGiOPDAAytuL1iwIObNmxdXXHFFnHzyyRER8cwzz9S7fwybkt/85jdx2WWX1Xg1lXWXvfSmdOPr3bv3ei87ms/nY999940bb7yxDqdKT6NGjWKXXXbJeozkjBgxotL//v/zqOKalq9bJwioD1asWPGZHw76r3/9q95ddloQUMXKlStj8803r7g9derUyOVyceihh1Ys22mnndZ7JRC+uP/93/+Nc889N3bZZZe47LLL4sILL4xBgwZFz549Y9q0aTF58uQ45phj4ogjjsh61Hrp8ssvrzYICgoKYquttoq99torevbsmcFkUPueeuqpuOGGG+Lxxx+PIUOGxP77719xHse0adPirrvuiv79+8ewYcOyHhVqRadOnSqdTFydv/71r7HtttvW0UR1QxBQRfv27St9Uu6UKVNiiy22iD322KNiWUlJSRQWFmYxXr138803R5s2bWLmzJmx2WabxYUXXhi77757XHzxxXHxxRfHPffcE0OHDo0f/OAHWY9aL40YMSLrEZLRt2/fyOVyceedd0bHjh2jb9++G3S/XC7nDxK15I033oinn346nn/++fjGN75Rad0pp5wS559/fnzzm9+MgQMH1viZBfBVdsQRR8SvfvWr+POf/xz9+vWrsv6+++6LWbNm1bs9Yq4yRBWnnXZajBs3Lq6//vpo0qRJfP/7349BgwbFfffdV7HNIYccEu+991689NJLGU5aPzVv3jwGDx4cf/jDHyLi33+Zvuyyy+LKK6+s2KZ///5RVlYWf/nLX7Ias95bu3ZtvPPOO7F48eIoKyurdpsDDjigjqeqX9Z9KvSrr74aO+yww2deA38dnxJde3bZZZfYZ599Kn7/VOeMM86IWbNmfeZfUeGr6P33348ePXrE0qVLY+jQobFkyZJ49NFH49Zbb42ZM2fGuHHjonPnzvHCCy9EUVFR1uNuNPYQUMVPf/rTmDBhQpx//vmRz+dj8803r/RX0xUrVsS0adPi1FNPzWzG+qysrKzS5ww0bdq00hWfIiJ222239f4fNl9ceXl5/PznP49bbrklli9fvt5tvSn9csrLy9d7m7r35ptvfubhiC1btoy33nqrjiaCutW6deuYOnVqDBkyJP74xz9WLD/nnHMiIqJnz54xbty4ehUDEYKAamy33XbxyiuvxAMPPBAREUceeWR06dKlYv0bb7wRZ511Vpx44olZjVivtW/fPt57772K2126dIkXXnih0jYLFy6Mhg39860Nw4cPj1/+8pfRpk2bOO2002Lrrbf2WpOM1q1bx+TJk+PnP/95tefSlJeXx+TJk6NVq1YZTAd1Y5tttokZM2bEiy++GLNmzYrly5dHs2bNomfPnlUuQ1pfOGQINjEnnnhivPLKK/Hiiy9GRMSwYcPilltuiauvvjoGDBgQ06dPj3POOSf69esXkydPznbYeqhdu3ax1VZbxZw5c2KLLbbIepykNGjQII4//vi4++67sx4lWT/5yU/iuuuui8MOOyyuueaa2G233SrWvfjii/HTn/40pkyZEhdddFGMHDkyw0mBjUkQUMnixYtj7ty50aNHjxo/iXjOnDmxZMmSOOKII9Z7eUa+mAcffDAuueSSmDx5cnTt2jXef//92HPPPSs+CC6fz0dRUVFMmzbNZRlrwRZbbBFnn312XH/99VmPkpytttoqzjrrrLj22muzHiVZq1evjiOPPDKefPLJyOVysfnmm0fr1q3j/fffj5UrV0Y+n49+/frFww8/HE2aNMl6XNioUn4PJAio5J133okuXbrEaaedFrfddluV9WvXro0OHTpE586dY/bs2RlMmKaPPvoobrvttpg/f3506dIlhgwZEh06dMh6rHrpm9/8ZnTt2jXuueeerEdJTv/+/aOgoMCer4zl8/m48847Y8yYMfG3v/0tiouLo6ioKHbbbbcYMmRIDB06tF69EYJ1Un4PJAioom/fvvHCCy/EkiVLqlxadMqUKXHYYYfFLbfcEueee25GE0LtmTRpUnz729+O6dOnR48ePbIeJykzZ86M3r17x6hRo3zoHpCJVN8DOVOOKk455ZSYOnVqPPLII3HsscdWWnf33XdHo0aNnFBcyz799NOYMGFCzJkzJz7++ONqr2aTy+UqXQGBjePwww+P0aNHx6GHHhoDBgyI3XbbLZo1a1bttt60blxPPPFE9O7dO0477bS49dZbY6+99oq2bdtW+Wu0T8WtG2vXro0PPvggSktLq13fuXPnOp4Ial+q74HsIaCKTz75JNq1axff+ta34qGHHqpYvmrVqmjbtm306dMnHn744QwnrN8WLlwYBx10ULz11luxvn+ersVeO0pLS+O73/1u3HPPPRWv/3+/Ic3n817/WuBzCDYNzz//fFxyySUxbdq0+PTTT6vdJpfLxZo1a+p4Mqh9qb4HsoeAKrbYYosYOHBgPPDAA7F8+fJo0aJFREQ89NBDsWrVKn8VrWUXXHBBvPnmmzFkyJA4/fTTo2PHji57WYeGDRsWd999d+y6665x7LHHuuxoLXr44Ydjxx13jB122CEiIp566qmMJ+LFF1+M/fffPxo2bBgHH3xwPPLII7HbbrtFu3bt4q9//Wu8//770bt370qXoob6JNn3QHmoxuTJk/O5XC7/29/+tmLZYYcdlt9qq63ypaWlGU5W/xUVFeX79euX9RjJat26dX7PPffMl5WVZT1KvVdQUJC/8sorK25369Ytf8stt2Q4EUcffXS+adOm+VdeeSWfz+fzuVyu4me0atWq/Pe+971869at8wsWLMhwSqhdKb4H2rD9syTn4IMPjnbt2sXYsWMjIuKDDz6IJ554Ir797W9H48aNM56ufisvL4/u3btnPUayVq9eHX369LFXoA40atQoysrKKm6//fbbVT6Vm7o1ffr0GDBgQHz961+vWJb//4fONW3aNH79619H+/bt45JLLslqRKh1Kb4HEgRUq6CgIE444YR47rnnYv78+TF+/PhYu3ZtDBkyJOvR6r2ePXvGq6++mvUYydpjjz3izTffzHqMJHTu3DmmT59e6XwAl7PMVnFxcWyzzTYVtxs1ahSffPJJxe2CgoLo3bt3PPnkk1mMB3UixfdAgoAanXLKKZHP5+Ouu+6Ku+66K7p27Rr77bdf1mPVe9dee2385S9/ifvvvz/rUZL085//PKZMmRITJ07MepR678QTT4ypU6dGixYtKt6E3nTTTbHNNtus92vbbbfNePL6q02bNvHRRx9V3G7Xrl288cYblbZZvXp1rFq1qq5HgzqV2nsg+8Sp0W677Ra77LJL/O53v4tly5bFpZdemvVI9dJVV11VZVmfPn3iuOOOiwMPPDB69OhR7WUvXXqxdqy79OXAgQOjb9++NV521Ov/5V166aXRpEmTmDRpUixevDhyuVzk8/n1Xl0rIj5zPV/cTjvtFK+99lrF7X333TcmTJgQM2fOjH322SdeffXVuO+++2LHHXfMcMq0rV27Nt59992IcOnX2pTaeyCXHWW9rr/++rjooosil8vF66+/7i9ztWBDL7X431x6sXa49GV2CgoKYsSIEXH55ZdnPUqybr311rjgggti0aJFsfXWW8dLL70UvXr1ik8//TRatGgRH330UZSXl8cDDzwQRx11VNbjJum1116Lr3/961FQUODSr7UspfdAgoD1eu+99+Kb3/xm7LrrrpWux8vGM3Xq1C983wMPPHAjTkLE5/t5eP03riuvvDL69OkTBxxwQNajJKusrCyWL18eW221VcXJk88++2xcc801MX/+/OjSpUuce+65cfjhh2c8abrmz58fffv2jVwuFwsWLMh6nHotpfdAggAAABLmpGIAAEiYIAAAgIQJAtartLQ0RowYEaWlpVmPkiSvf/b8DLLl9c+W1z9bXv/spfIzcA4B61VSUhJFRUVRXFxc7aUXqV1e/+z5GWTL658tr3+2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kDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJa5j1AADUrnxpadYjJK3bGf/MeoSkLfv2TlmPkLw205pkPUKyylYWRHzrs7ezhwAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAAS1jDrAeqb0tLSKC0trbhdUlKS4TQAALB+9hBsZCNHjoyioqKKr06dOmU9EgAA1EgQbGTDhw+P4uLiiq9FixZlPRIAANTIIUMbWWFhYRQWFmY9BgAAbBB7CAAAIGGCAAAAEiYIPoe33nor5s2bF2VlZVmPAgAAG4Ug+By+9a1vxde//vV49913sx4FAAA2CkEAAAAJc5Whz+Htt9/OegQAANio7CEAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEhYw6wHAKCW5XJZT5C08pX/ynqEpLX98+KsR0jemCunZT1CskpWlMd9G7CdPQQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQsGSCYMSIEZHL5eLpp5/OehQAANhkJBMEAABAVYIAAAASVqtBsGjRonj33Xdr8ym+tNmzZ0d5eXnWYwAAQCY2ehCsWLEiRo8eHX379o0uXbrEnDlzKq1ftmxZXHDBBbHddttFYWFhtGrVKo455ph4+eWXqzxW165do2vXrvHJJ5/E+eefH+3bt4/CwsLYdddd4/7776/2+RctWhQnnHBCtGjRIrbYYos48MADY9q0aTXOO3jw4OjcuXNcfPHF8Y9//OPLffMAAPAVs1GCYO3atTFlypQ46aSTol27dnHaaafF888/H0OHDo0ePXpUbPfWW2/FHnvsETfffHNsu+22ce6558Zhhx0WU6ZMiV69esVzzz1X5bHLysri4IMPjscffzyOOeaYOPnkk+Ott96KwYMHx+OPP15p2/feey/22WefuPfee2PvvfeO8847L1q0aBEHHXRQzJo1q9rZf/SjH8VWW20V1113Xey8887Ro0ePuPnmm2Pp0qUb46UBAIBNWi6fz+e/6J1feumlGDNmTNxzzz2xZMmSaNSoURx88MExZMiQGDBgQDRt2rTS9vvuu28899xzMWnSpOjfv3/F8tdffz323HPP6Nq1a/ztb3+rWN61a9dYuHBhDBw4MO67775o3LhxREQ8+eST0a9fv+jfv39MmTKlYvtTTz017rzzzrj66qvjpz/9acXyP/zhD3HWWWdFRMRTTz0VvXv3rvK9vPjii3HXXXfFuHHjYvHixdGwYcOK72XgwIFVvpealJaWRmlpacXtkpKS6NSpU/SOgdEw12iDHgNgo8rlsp4gabmGfvdnqUHHrbMeIXmTZjyU9QjJKllRHlvtMD+Ki4ujWbNmNW73uYNg8eLFcc8998SYMWPi73//e0RE9OzZM04++eQ4/vjjo1WrVtXe74UXXogePXrE6aefHn/84x+rrL/wwgvjxhtvjL///e+x8847R8T/BcH8+fOjW7dulbbv2rVrrFixIj788MOIiPj000+jqKgomjVrFgsXLowmTZpUbFteXh477rhjvPHGGzUGwX9u+5e//CXGjh0bDz74YKxYsSKaNWsWxx57bJxyyilxwAEHRG49/+c6YsSIuPLKK6ssFwRAZgRBpgRBtgRB9gRBdjY0CBp+3gfed9994+233442bdrEFVdcESeffHJst912n3m/dYfsLF26NEaMGFFl/bx58yr+c10QREQ0b968SgxERHTs2DFmzpxZcfu1116L1atXR9++fSvFQEREQUFB7LvvvvHGG2985pwFBQXRr1+/6NevX/zP//xPTJgwIf7whz/E7bffHrfffntMmDAhBg4cWOP9hw8fHsOGDau4vW4PAQAAbIo+dxDsvPPO8fbbb8eyZctiypQp0apVqzjuuOOidevW673f8uXLIyJi0qRJMWnSpBq3W7lyZaXbRUVF1W7XsGHDSlcHKi4ujoiINm3aVLt927Zt1zvff1u7dm0888wzMWXKlJg7d25ERLRq1SratWu33vsVFhZGYWHh53ouAADIyuc+qfiRRx6J119/PS699NJYunRpnHvuudG+ffs47LDD4p577qnyhn6ddbspbr311sjn8zV+DR069At9I+vCYdmyZdWu39CThJ9//vm44IILomPHjtG/f/8YP358HHLIIfHQQw/F4sWLo2fPnl9oPgAA2BR9oasMbb/99vGzn/0s5s+fH1OnTo1TTz01nn322TjppJOibdu2cfLJJ8fkyZNjzZo1FfdZ90b6Pw/z2Zh22GGHaNKkScydOzdWr15daV15eXk8++yzNd53/vz58bOf/Sx23HHH2HPPPSuugvT73/8+lixZEn/6059iwIAB0aiR40ABAKhfvtRlR3O5XBxwwAExatSoWLJkSYwfPz569+4d48ePj8MOOyw6dOhQcSnRvffeO3r27Bnjxo2L8ePHV3ms8vLymDp16heepbCwMAYPHhzLli2LG264odK62267LV5//fVq7zdgwIDYdttt4/LLL4+1a9fGiBEj4q233orp06fHmWeeGc2bN//CMwEAwKbuc59DUJMmTZrE4MGDY/DgwfH+++/HPffcE2PHjo0lS5ZUbDNu3Ljo06dPHH/88XHzzTdHjx49omnTpvHPf/4zZs6cGe+//36Vv+5/Htdee208+eSTcemll8b06dOje/fu8eqrr8ajjz5a8VkG/+3dd9+Ns88+O4YMGRLf/OY3v/BzAwDAV9FGC4L/1Lp16zj//PPj/PPPj7Vr11Ys79atW7zwwgtx4403xoQJE+KOO+6IBg0axNZbbx0HHHBAHHvssV/qebfeeut49tln46KLLorHHnsspk2bFnvssUc88cQT8Ze//KXaIJg9e3Y0aNDgSz0vAAB8VX2pDybjs5WUlERRUZHPIQCy43MIMuVzCLLlcwiy53MIsrOhn0Pwpc4hAAAAvtoEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwhpmPQAAtSyfz3qCpOXLPs16hKStWbAw6xGS17/97lmPkKw1+bKImP+Z29lDAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJCwhlkPUN+UlpZGaWlpxe2SkpIMpwEAgPWzh2AjGzlyZBQVFVV8derUKeuRAACgRrl8Pp/Peoj6pLo9BJ06dYreMTAa5hplOBkAAClZky+Lp+OhKC4ujmbNmtW4nUOGNrLCwsIoLCzMegwAANggDhkCAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEhYw6wHqO/y+XxERKyJsoh8xsMAAJCMNVEWEf/3frQmgqCWrVixIiIipsejGU8CAECKVqxYEUVFRTWuz+U/Kxn4UsrLy2Px4sWx5ZZbRi6Xy3qcz62kpCQ6deoUixYtimbNmmU9TnK8/tnzM8iW1z9bXv9sef2z91X/GeTz+VixYkW0b98+CgpqPlPAHoJaVlBQEB07dsx6jC+tWbNmX8l/CPWF1z97fgbZ8vpny+ufLa9/9r7KP4P17RlYx0nFAACQMEEAAAAJEwSsV2FhYVxxxRVRWFiY9ShJ8vpnz88gW17/bHn9s+X1z14qPwMnFQMAQMLsIQAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASNj/A0b+tqykwPyQAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "translate(u'hace mucho frio aqui.')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:07.761513Z", "iopub.status.busy": "2022-12-14T23:14:07.761280Z", "iopub.status.idle": "2022-12-14T23:14:08.033508Z", "shell.execute_reply": "2022-12-14T23:14:08.032669Z" }, "id": "zSx2iM36EZQZ" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: esta es mi vida . \n", "Predicted translation: this is my life . \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_146998/2662029192.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_146998/2662029192.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "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j+KSSy6J+++/PwYOHJg45brlmDLq7c4774wzzjgjXnvttZUu50QfAAB82ptvvhl77bVXvP3227HZZpvFbrvtFptttlnMnTs3nnrqqZg7d2507NgxJk6cGJ06dcoed50QZdTLI488Evvuu2+0b98+Dj/88LjyyiujV69ese2228Zjjz0WL7zwQhxyyCGx6667xjnnnJM9LgAA66HZs2fHD3/4w7jlllti4cKFtY+3aNEijjzyyLjooouiffv2iROuW6KMejnggANi0qRJ8corr0S7du2ipKQkRo4cGWeffXZERFx44YVx/vnnx+OPPx477bRT7rAAsIrefPPNePjhh1e4W77rb8LasWjRonjllVdi/vz5UVFREdtss02TOpZsKVFGvbRp0yb69esXo0aNioiPr1t29tlnx8iRI2uX+drXvhatW7eOv/zlLzlDspyqqqr41a9+FQ8++OBKv3BMnTo1YTqAXGeccUZcfvnly+x2XywWa6+dtPTPdssH1hZnX6RePvjgg9h8881r75eVlUVlZeUyy+y1117x+OOPr+vRWIF33nkndtlll/jRj34UTz/9dLzyyivx73//O+bMmRMzZsyIGTNmxEcffRQ1NTXZowKsc9dcc01ccskl0adPn7jtttuiWCzGscceG2PHjo2TTjopmjVrFgMGDIi//e1v2aMCjZgoo17at28f77zzTu39zTffPF544YVllnn33Xf9NnE9MnLkyJg6dWrccMMN8e9//zsiIk477bRYsGBBTJ48OfbYY4/o1q3bcusRoCn43e9+F926dYt77703DjvssIiI6NatWwwcODCuuuqq+Otf/xp//vOfl/m3D/j8HnzwwTjooIOibdu20bx58ygtLV3u1qxZ0zlRfNP5pKwRO+64Y/zzn/+svd+nT5+4/vrrY+zYsXHooYfGY489FrfcckvsuuuuiVPySffcc0/ss88+MWjQoOWe23333ePee++NL3/5y3HuuefGz372s4QJAfK8/PLLMXjw4Cgp+b/fUy9evLj2z7169YqDDz44Lr744jjiiCMyRoRG5/bbb4+BAwdGTU1NdO3aNbbddtsmFWB1adqfnno79NBD4zvf+U68/vrr0bVr1/h//+//xe23377MF/5mzZrF+eefnzgln/T222/HgAEDau+XlpbGhx9+WHt/k002iQMPPDBuueUWUQY0Sa1atar980YbbRTvvvvuMs9/8YtfjAcffHAdTwWN13nnnRcbbrhh3HHHHdG3b9/scdYLdl+kXo4//vj44IMPomvXrhERscUWW8STTz4ZJ510Uuy3335xwgknxOTJk104ej1SUVERixYtqr2/ySabxJtvvrnMMuXl5TFnzpx1PRpAus0333yZ/0/s3r17TJ48eZll/vnPf8ZGG220rkeDRuuVV16Jo446SpB9gi1lfG7du3ePq666KnsMVmDLLbeMGTNm1N7feeed44EHHoh333032rRpEx9++GHceeed0aVLl7whAZL06NEjHn300dr7/fv3j/PPPz9OPPHE2t3y77333jj88MMTp4TGpU2bNvGFL3whe4z1ii1l1Mvxxx//mae6v+uuu+L4449fRxPxWfbbb7946KGH4oMPPoiIiBNPPDHmzp0bO+64YwwYMCC23377mDp1ahx33HG5gwIkGDx4cHTv3j1ef/31iPj49Pg77bRTXHPNNXHooYfGz372s+jatWv84he/SJ4UGo8jjjgiHnzwwWWO32zqXKeMevn0xaLr8tOf/jTOPvtsZ2BcT7z99tsxYcKE2GeffWLTTTeNiIhLLrkkzj///Jg/f35suOGGMWzYsLjooouitLQ0eVqAfIsWLYo77rgjpk6dGl27do1+/frZfRHWoAULFsR+++0X7du3j0svvdTeOiHKqKdVibKzzjorfv7zn9d5gWLWH0uWLIl//etfsdlmm9VeIBUAYG3bcsstY9GiRTFr1qyI+PhkOxUVFcstVygUYurUqet6vBR2X6TeVvQFvlgsxhtvvBH33ntvdOzYcR1PxYpMmDAh3njjjeUeLy0tjXbt2kWhUIiZM2fGhAkTEqYDAJqampqaaNasWXTp0iW6dOkS5eXlUSwWl7vV1NRkj7rO2FLGZyopKakNsWKx+JlbVYrFYvzgBz+ICy+8cF2Mx2coLS2Nc845xy6nABGrfcxzoVCIa6+9dg1PA/AxZ1/kM/Xs2bM2xCZMmBBdunSJbt26LbdcaWlptG7dOvr27RsnnHDCOp6SFVmV37vU1NTYhRFoEkaNGlXn44VCoc7/v1z6uCgD1iZRxmd65JFHav9cUlISQ4cOXelWFxqe1157rc59uQEam+nTpy9zv6amJoYPHx6TJk2K4cOHx9577x3t2rWLOXPmxIQJE+KKK66Ir3zlK3HppZcmTQyN24svvhgvv/xyLFiwIAYPHpw9Thq7L0Ij9Mndc0aNGhU77bRT7LTTTsstt2TJktrjyQ488MC488471+GUAPkuuuiiuPTSS+PZZ5+NDh06LPf8W2+9FTvvvHN8//vfjzPPPDNhQmicnnzyyTjhhBPi+eefr31s6WEUEyZMiAMOOCD++Mc/xqGHHpo14jolyqi3mpqaKClZ9hwxEydOjLvuuitatGgRQ4cOjU6dOiVNR0Qss35WtEvOJ5/ffffdY8yYMbHVVluti/EA1htbb711HHDAAXHllVeucJnvfOc7cf/998drr722DieDxuuFF16IvfbaK0pKSuKEE06Il19+Oe69997aKCsWi9G1a9fo1atXjB49OnnadcPui9TLaaedFldffXXMnj07WrVqFRERt912Wxx11FG1Z8i58sor45lnnhFmiZbunlMsFmPLLbeMU089NYYPH77ccqWlpbHJJpu4/g7QZL355pvRokWLlS7TokWLePPNN9fRRND4nXPOORER8fTTT8dWW20V5557btx77721zxcKhfjKV74STz75ZNaI65woo14efvjh6Nu3b22QRUScffbZUVFREZdffnnMnj07RowYERdffHFcdtllaXM2dV27dq3983XXXRc77bTTMo8Ba8Z5550XhUIhTj755GjdunWcd955q/S6QqEQZ5111lqejlXRqVOn+POf/xw/+clP6oyzDz74IP785z/7RSOsQePHj4/DDz98pXvodOnSJe677751OFUuUUa9zJw5M3r16lV7f/r06fHyyy/HOeecE4MGDYqIiEcffbRJ/SVa3x177LF1Pl4sFuN//ud/okWLFtG5c+d1PBWry3pbv4wcOTIKhUIMHDgwWrduHSNHjlyl14my9ce3vvWtGDFiRPTo0SPOPvvs+NrXvhZt2rSJd999Nx599NE477zzYsaMGS7zAmtQVVVVbLbZZitd5sMPP2xSl+oRZdTLggULltnVbfz48VEoFOLAAw+sfexLX/pSPPTQQxnjUYc//elPMW7cuLj88stjk002iYiIGTNmRL9+/eLFF1+MiIgBAwbEjTfeGKWlpZmj8gnWW8Pw8MMPR8THv9H95H0ajjPOOCNeffXVuO666+I///M/I+Lj43KX7pJfLBZj6NChccYZZ2SOCY1K586dlznBR12eeeaZ6N69+zqaKJ8oo146duwYr7zySu39++67LzbeeOPYddddax+rrKyMsrKyjPGow9VXXx1z5syp/WIf8fGxgS+88EL07ds33n333bj11ltjn332cX259Yj11jB8cs+Buu6z/ispKYlrr702hgwZEtdff3384x//iPnz50dFRUXsuOOOMXjw4Ojdu3f2mNCoHHLIIXHFFVfEgw8+GPvuu+9yz99yyy0xadKkJrVHgbMvUi9Dhw6NsWPHxsUXXxwtWrSIYcOGxTe+8Y245ZZbapc54IAD4u23347nnnsucVKW2nzzzePAAw+M3//+9xHx8S4Dbdq0icMPPzzGjh0bixYtip133jlatmwZEydOTJ6Wpay3hm3JkiXx5ptvxqxZs2LRokV1LtOzZ891PBXA+uGdd96JXXbZJebMmRPHHntszJ49O+6555648sorY+LEiTF27Njo0qVLTJkypclcR9WWMurlRz/6UYwbNy6GDx8exWIxNtpoo2WOoaiqqooJEybEcccdlzYjy5o3b160b9++9v5jjz0WixcvjqOPPjoiIpo3bx5f//rX48Ybb8wakTpYbw1TTU1NXHDBBXH55ZfHvHnzVrpsUzpWAuCT2rZtG+PHj4/BgwfHtddeW/v4d77znYiI2HPPPWPs2LFNJsgiRBn1tNVWW8WLL74Yt99+e0RE9OvXb5mz+r322mtx4oknxje/+c2sEfmU8vLyePfdd2vvP/zww1FSUhJ777137WPNmzePBQsWZIzHClhvDdOIESPiF7/4RWy22WYxdOjQ6NChQzRr5p/a9ckbb7wRER9vjS4tLa29vyqWHjsIfH5bbrllPP744/Hss8/GpEmTYt68eVFeXh577rln7L777tnjrXN2X4RGrlevXjF16tR47rnnorS0NLbffvvYfPPNY/LkybXLDBw4MJ588smYNm1a4qR8kvXWMLVv3z422WSTePLJJ2PjjTfOHoc6lJSURKFQiJdeeim22Wab2vufpVAoxOLFi9fBhEBT5Nd3rLJZs2bFU089FbvssssKr9fy5JNPxuzZs+OQQw5ZpX/kWPu++93vxoABA6JTp061W1bOP//8ZZaZNGlS7LLLLkkTUhfrrWF6//33Y9CgQYJsPTZkyJAoFAq1u0UtvQ+sG75P1k2UscpqamrisMMOi6FDh9aefOCTlixZEv369YsuXbpEv379EiakLocffnhcddVV8fvf/z4KhUIcddRRyxzzN378+KisrIwDDjggb0iWY701TDvssEPMmjUrewxWYtSoUSu9D6xdvk/Wze6L1Evfvn1jypQpMXv27OVOe3/ffffFQQcdFJdffnmccsopSRMC5Ln77rtjwIAB8dhjj9mK2UDsvffeMWTIkBgwYEC0atUqexxoEnyfXF5J9gA0LEOGDInKysq48847l3vuxhtvjObNmzvJx3po8eLFcemll8Yee+wR5eXly5x44Nlnn41hw4bFq6++mjghdbHeGp6DDz44Ro0aFQceeGCccMIJ8atf/SpuuOGGOm+sHyZNmhQnnXRSdOjQIY444oi44447VngZA2DN8H1yebaUUS/vv/9+tG/fPvbZZ5+44447ah//4IMPol27dtGnT5/4y1/+kjghn/bhhx/GfvvtF48//ni0bds2mjdvHm+//Xbt6bjnz58f7du3j+9973vLHbNEHuutYaquro5vfetbcdNNN8XSf14/fTxEsViMQqHglPjriXfeeSduuummGD16dDzzzDNRKBRik002iYEDB8YxxxwTX/3qV7NHhEbH98nl2VJGvWy88cbRv3//uP/++5e5Bs8dd9wRH3zwQQwZMiRxOupywQUXxOOPPx4XXXRRzJ49O771rW8t83xFRUX06tUr7r///qQJqYv11jCdfvrpceONN8aXv/zlOO+88+Kaa66JP/zhD8vcrrvuuvjDH/6QPSr/q23btjF8+PB46qmn4sUXX4wf/vCH0bJly7j66qtj7733jq222irOPffc+J//+Z/sUaHR8H1yebaUUW9L9/W96qqr4tvf/nZEfLzLzsSJE2P27NmxwQYbJE/IJ22zzTbRuXPneOihhyIi4txzz43zzjtvmd/SDxs2LG6//faYM2dO1ph8ivXWMG222WbRtWvXmDhxouuTNXDjx4+PMWPGxG233RaVlZVOiQ9rmO+Ty7KljHrbb7/9on379jF69OiIiPjXv/4VDzzwQAwYMKDJ/QVqCN54443YbbfdVrpMy5YtY/78+etoIlaF9dYwLVy4MPr06SPIGoFevXrFiBEj4qSTTopmzZqF32HDmuX75LL8q0G9lZSUxNFHHx2XXXZZTJs2Le69995YsmRJDB48OHs06tCyZcuYO3fuSpeZOnVqtG3bdh1NxKqw3hqmXXfd1W5uDdy8efPi5ptvjjFjxsSkSZMiIqK8vDwGDBiQPBk0Lr5PLsuWMlbLkCFDolgsxpgxY2LMmDHRrVu3+NrXvpY9FnXYa6+94s4774z33nuvzudnzpwZ99xzT/Ts2XPdDsZKWW8N0wUXXBD33Xdf3HXXXdmjUA8fffRR3HbbbfGNb3wjOnbsGCeffHI89dRTccghh8TNN98cs2fPjt/97nfZY0Kj4/vk/7GljNWy4447xpe//OW4+uqrY+7cufHjH/84eyRW4Iwzzog+ffrEPvvsE1dccUXtMREffPBBTJw4MU455ZRYvHhxnH766cmT8knWW8P0wAMPRO/evaN///7Rt2/f2HHHHaO8vHy55QqFQpx11lkJE/Jp3/rWt+L222+PysrKKBaLsccee8TgwYPjqKOOijZt2mSPx+e0ZMmSeOuttyIiokuXLsnT8Gm+T/4fJ/pgtV188cVx5plnRqFQiFdffTW6d++ePRIrcPXVV8fw4cPrPAV3aWlp/PrXv17u7H7ks94anpKSVdsBxSnx1x8lJSXRrVu3GDRoUAwePDi23nrr7JFYg1555ZXYbrvtoqSkxIla1lO+T35MlLHa3n777fjqV78aO+ywwzLXmGD99NJLL8VvfvObmDx5csybNy/Ky8tjzz33jGHDhsV//Md/ZI/HClhvDcv48eNXedlevXqtxUlYVY899liT3V2qKZg2bVr07ds3CoVCTJ8+PXsc6uD75MdEGQAAQCIn+gAAAEgkygAAABKJMlZbdXV1jBw5Mqqrq7NHoR6st4bJemuYrLeGyXprmKy3hsl6+5hjylhtlZWVUVFREfPnz6/zlM+sn6y3hsl6a5ist4bJemuYrLeGyXr7mC1lAAAAiUQZAABAombZAzR2NTU1MWvWrGjZsmUUCoXscdaoysrKZf5Lw2C9NUzWW8NkvTVM1lvDZL01TI15vRWLxaiqqoqOHTtGScnKt4U5pmwte/PNN6Nz587ZYwAAAAlmzpwZnTp1WukytpStZS1btoyIiK/FQdEsmidPAwBAg9TI9rhqChYXF8VjcXdtD6yMKFvLlu6y2CyaR7OCKAMAYDWIsoapGKt0CJMTfQAAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkanRRdtxxx0WhUIgZM2as0vKPPPJIFAqFGDly5FqdCwAAoC4NMsqEFAAA0Fg0yx4g2x577BEvvfRSbLrpptmjAAAATVCTj7IvfOELse2222aPAQAANFENbvfFkSNHRp8+fSIi4txzz41CoVB7++RxZMViMa644orYdttto6ysLLp27Rrnnntu1NTULPPzVrQr5GuvvRZDhw6NLbbYIsrKyqJ169ax4447xqmnnhrFYnFtf0wAAKCJaHBbynr37h0zZsyI66+/Pnr16hW9e/eufa5Vq1a1fz7jjDNi/Pjxccghh8T+++8f48aNi5EjR8ZHH30UP/3pT1f6HrNmzYo99tgjFixYEAcffHAMHDgwFixYEK+99lr8+te/josvvjiaNWtw/9MBAADroQZXFksj7Prrr4/evXuv8GQfzzzzTPzjH/+IDh06RETEWWedFVtvvXVceeWVcc4558QGG2ywwve4/fbb47333ovLLrsshg8fvsxz8+bNW2mQVVdXR3V1de39ysrKVfxkAABAU9Tgdl9cVWeddVZtkEVEbLrpptG/f/+oqqqKV155ZZV+xoYbbrjcY61bt17pay688MKoqKiovXXu3Ll+gwMAAE1Ko42yXXfddbnHOnXqFBER77333kpf269fv9hoo43i5JNPjoEDB8Z1110X06ZNW6X3HTFiRMyfP7/2NnPmzHrPDgAANB2NNsrKy8uXe2zpbodLlixZ6Wu7desWkyZNiv79+8c999wTxx9/fHTv3j222267uPXWW1f62rKysigvL1/mBgAAsCKNNso+r+233z5uu+22mDdvXkycODHOPvvsmD17dgwcODAef/zx7PEAAIBGokFGWWlpaUR89havNaF58+ax1157xbnnnhtXXHFFFIvFuOuuu9b6+wIAAE1Dg4yypSfbWFvHaz399NN1njVxzpw5ERHRokWLtfK+AABA09PgTokfEbHttttGx44d449//GOUlZVFp06dolAoxCmnnLJGfv7o0aPjt7/9bfTs2TO6d+8e5eXl8eKLL8Y999wTrVu3jqFDh66R9wEAAGiQUVZaWhp/+tOf4gc/+EGMHTs2qqqqIiJi0KBBa+TnH3300bFw4cJ4/PHH4+9//3tUV1dHp06d4tvf/nacccYZ0aVLlzXyPgAAAIVisVjMHqIxq6ysjIqKiugd/aNZoXn2OAAANESFQvYE1NPi4qJ4pDgu5s+f/5lnZG+Qx5QBAAA0FqIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIFGz7AGaitI2raO0ZIPsMaiHD3fdInsEVsMGZ87OHoHVUPKN+dkjsDqWLMmegNVQ/Oij7BFYDcXFi7NHoL6KxVVe1JYyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTK/teMGTOiUCjEcccdlz0KAADQhIgyAACARM2yB1hfbL755vHSSy9FRUVF9igAAEATIsr+V/PmzWPbbbfNHgMAAGhi7L74v+o6puztt9+O4cOHx9Zbbx0bbrhhtGrVKrbbbrs46aSTYv78+XnDAgAAjYYtZSvwwQcfRI8ePWLGjBmx3377xWGHHRYfffRRTJ8+PUaPHh3f//737eoIAAB8bqJsBR566KGYPn16nHrqqXHppZcu89z7778fzZs3r/N11dXVUV1dXXu/srJyrc4JAAA0bHZf/Awbbrjhco9tvPHGUVZWVufyF154YVRUVNTeOnfuvLZHBAAAGjBRtgI9e/aMDh06xEUXXRQHH3xwXH311fHiiy9GsVhc6etGjBgR8+fPr73NnDlzHU0MAAA0RKJsBSoqKmLSpEkxZMiQmDRpUgwbNiz+4z/+I7p27Rq//vWvV/i6srKyKC8vX+YGAACwIqJsJbp06RKjRo2Kd955J6ZMmRI/+9nPoqamJk4++eQYO3Zs9ngAAEAjIMpWQUlJSey0005x5pln1sbYX/7yl+SpAACAxkCUrcALL7wQc+bMWe7xpY+1aNFiXY8EAAA0Qk6JvwIPPPBAnHHGGdGjR4/YZpttok2bNjFt2rT4y1/+Ei1atIiTTz45e0QAAKAREGUrsP/++8eMGTNiwoQJ8ac//Snef//92HzzzWPgwIFx5plnxpe+9KXsEQEAgEZAlP2vbt26LXO6++222y4uu+yyvIEAAIAmwTFlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQKJm2QM0FcWFC6NYqMkeg3ooe+T57BFYDaXPtcoegdXw5re+nD0Cq6GmNHsCVkfHx97PHoHV8fcXsiegvoo1Eav49d+WMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASNSoouyRRx6JQqEQI0eOjCeeeCL69OkTLVu2jLZt28awYcPiww8/jIiIu+++O77yla/ERhttFO3atYszzzwzFi9eHBERv//976NQKMTPf/7zOt/jb3/7WxQKhTjxxBPX2ecCAAAar0YVZUtNnjw59tlnn6ioqIgTTzwxunTpEldffXWccMIJcfPNN8cRRxwRXbt2jRNPPDFatWoVv/jFL+KCCy6IiIijjz46ysvL49prr63zZ19zzTUREXHCCSess88DAAA0XoVisVjMHmJNeeSRR6JPnz4RETFu3Ljo379/REQsWrQodtttt3j++eejTZs2cc8998Tuu+8eERFVVVWx1VZbxeLFi2P27NnRvHnzGDZsWFx99dXxyCOPRK9evWp//rx586Jjx46x3XbbxZQpU+qcobq6Oqqrq2vvV1ZWRufOnaPvRkdHs8IGa+ujsxYU/3frKQ1L6SatskdgNbx5dPfsEVgNNaXZE7A6Oj72fvYIrI6/v5A9AfW0uLgoHqn5U8yfPz/Ky8tXumyj3FLWp0+f2iCLiGjevHkcccQRUSwWo1+/frVBFhHRsmXLOOSQQ2LevHnx5ptvRkTESSedFBEf78r4SaNHj47q6uqVbiW78MILo6KiovbWuXPnNfnRAACARqZRRtlOO+203GMdOnT4zOdmzZoVERE77LBD7LXXXnHbbbfFe++9V7vctddeG1/4whfimGOOWeF7jxgxIubPn197mzlz5up/EAAAoNFrlFFW1+bBZs2afeZzixYtqn3sxBNPjIULF8aYMWMi4uPj1J5//vkYMGBAVFRUrPC9y8rKory8fJkbAADAijTKKFsTBg4cGK1atardhXHpf53gAwAAWJNE2QpsuOGGMWTIkHjuuefi4Ycfjptvvjm222676NGjR/ZoAABAIyLKVmLptcgGDRoUVVVVtpIBAABrnChbiS996Uux9957x6xZs6KsrCyGDBmSPRIAANDIiLLPcOyxx0ZExGGHHRZt2rRJngYAAGhsGtXFo9eG73znO3HVVVfFQw89FH379q336ysrK6OiosLFoxsgF49umFw8umFy8eiGycWjGyYXj26gXDy6wWnyF49eU9555524/vrr44tf/GL06dMnexwAAKARapY9wPro7rvvjmeeeSZuu+22eP/992PkyJFRKBSyxwIAABohUVaHW2+9Na6//vro2LFjXHDBBXHUUUdljwQAADRSoqwOo0aNilGjRmWPAQAANAGOKQMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEjXLHqCpqFnwQdQUFmWPAY3e4tlzskdgNbS/bG72CKyGfw/ZK3sEVkPFxW9lj8BqqNq3efYI1FNJsRixcBWXXbujAAAAsDKiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEjUqKJsxowZUSgU4rjjjqt97LjjjotCoRAzZsxYZtlFixbFyJEjY+utt46ysrIoFAoxbty4dTovAABAs+wBslxyySVx7rnnRs+ePePII4+M5s2bx7bbbps9FgAA0MQ0+ii78MIL44c//GFsvvnmyzx+1113xcYbbxwPPPBAbLDBBknTAQAATV2jj7IOHTpEhw4dlnt81qxZ0aZNG0EGAACkalTHlNXl08eUjRw5MgqFQkyfPj1ef/31KBQKUSgUolu3bsu8bsKECdGvX7/YdNNNo6ysLLbeeuv48Y9/HB988MG6/xAAAECj1ei3lH1a7969IyLisssui4iIU089NSIiWrVqVbvM1VdfHSeffHK0atUq+vXrF5tttlk89dRT8dOf/jQefvjhePjhh21hAwAA1ogmGWW9e/eOUaNGRcTHW84+6cUXX4zvfve7scMOO8RDDz0Ubdq0qX3uoosuihEjRsSVV14Z3/ve9+r8+dXV1VFdXV17v7Kyco1/BgAAoPFo9Lsv1tdvf/vbWLx4cVx55ZXLBFlExJlnnhlt27aNsWPHrvD1F154YVRUVNTeOnfuvLZHBgAAGrAmt6Xss0yaNCkiIu6///546KGHlnu+efPm8fLLL6/w9SNGjIjTTz+99n5lZaUwAwAAVkiUfcq8efMiIuKnP/3par2+rKwsysrK1uRIAABAI2b3xU8pLy+PiI+3cBWLxRXeAAAA1gRR9il77rlnRPzfbowAAABrkyj7lGHDhkWzZs3ilFNOiTfeeGO55997772YMmVKwmQAAEBj5JiyT9l+++3j17/+dXz729+OL37xi3HQQQdF9+7do6qqKqZNmxbjx4+P4447Ln7zm99kjwoAADQCoqwOJ5xwQuy0007xy1/+MiZMmBB33nlnVFRURJcuXeK0006LY489NntEAACgkSgUnbViraqsrIyKioroHf2jWaF59jgA66dCIXsCVsO/h+yVPQKrodsJr2aPwGqo2ndB9gjU0+LiR/G3hbfE/Pnza08muCKOKQMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASNcseAACiWMyegNWwyfUTs0dgNUz50leyR2A1LLm4JnsE6qnmw4UR379llZa1pQwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIFGz7AEam+rq6qiurq69X1lZmTgNAACwvrOlbA278MILo6KiovbWuXPn7JEAAID1mChbw0aMGBHz58+vvc2cOTN7JAAAYD1m98U1rKysLMrKyrLHAAAAGghbygAAABKJMgAAgESirB6mTp0aL7/8cixatCh7FAAAoJEQZfWwzz77xHbbbRdvvfVW9igAAEAjIcoAAAASOftiPcyYMSN7BAAAoJGxpQwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABI1Cx7AAAA1p2tL3wxewRWwz0vjs8egXqqrKqJTb6/asvaUgYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJmkyUjRw5MgqFQjzyyCPZowAAANRqMlEGAACwPhJlAAAAidZqlM2cOTPeeuuttfkWn9vf//73qKmpyR4DAABootZ4lFVVVcWoUaOib9++0bVr13jyySeXeX7u3Llx2mmnxVZbbRVlZWWx6aabxuGHHx7//Oc/l/tZ3bp1i27dusX7778fw4cPj44dO0ZZWVnssMMOcdttt9X5/jNnzoyjjz46WrduHRtvvHH06tUrJkyYsMJ5jzzyyOjSpUv84Ac/iBdeeOHzfXgAAIB6WiNRtmTJkrjvvvvimGOOifbt28fQoUPj6aefjmOPPTZ22WWX2uWmTp0au+66a1x22WXRvXv3OOWUU+Kggw6K++67L/baa6+YPHnycj970aJFsd9++8Vf//rXOPzww2PQoEExderUOPLII+Ovf/3rMsu+/fbb8ZWvfCX++Mc/xh577BHf/e53o3Xr1vH1r389Jk2aVOfs3//+92OTTTaJn//857H99tvHLrvsEpdddlnMmTNnTfxPAwAAsFKFYrFYXN0XP/fcc3HDDTfETTfdFLNnz47mzZvHfvvtF4MHD45DDz00Ntxww2WW79GjR0yePDnuvvvu2H///Wsff/XVV2O33XaLbt26xT/+8Y/ax7t16xavv/569O/fP2655ZbYYIMNIiLioYcein333Tf233//uO+++2qXP+644+L666+P888/P370ox/VPv673/0uTjzxxIiIePjhh6N3797LfZZnn302xowZE2PHjo1Zs2ZFs2bNaj9L//79l/ssK1JdXR3V1dW19ysrK6Nz587RO/pHs0LzVfoZAABrS2mriuwRWA33vDg+ewTqqbKqJjbZZlrMnz8/ysvLV7psvaNs1qxZcdNNN8UNN9wQzz//fERE7LnnnjFo0KA46qijYtNNN63zdVOmTIlddtkljj/++Lj22muXe/573/te/PKXv4znn38+tt9++4j4vyibNm1abLHFFsss361bt6iqqop33303IiI++uijqKioiPLy8nj99dejRYsWtcvW1NTEtttuG6+99toKo+yTy/7tb3+L0aNHx5///OeoqqqK8vLyOOKII2LIkCHRs2fPKBQKK3z9yJEj49xzz13ucVEGAKwPRFnDJMoanvpEWbP6/vAePXrEjBkzYrPNNotzzjknBg0aFFtttdVnvm7p7oNz5syJkSNHLvf8yy+/XPvfpVEWEdGqVavlgiwiolOnTjFx4sTa+6+88kosXLgw+vbtu0yQRUSUlJREjx494rXXXvvMOUtKSmLfffeNfffdN37zm9/EuHHj4ne/+1384Q9/iD/84Q8xbty46N+//wpfP2LEiDj99NNr7y/dUgYAAFCXekfZ9ttvHzNmzIi5c+fGfffdF5tuumkMHDgw2rZtu9LXzZs3LyIi7r777rj77rtXuNyCBQuWuV9RUfdvc5o1a7bMWRPnz58fERGbbbZZncu3a9dupfN92pIlS+LRRx+N++67L5566qmIiNh0002jffv2K31dWVlZlJWV1eu9AACApqveJ/q4884749VXX40f//jHMWfOnDjllFOiY8eOcdBBB8VNN920XFQttXST3ZVXXhnFYnGFt2OPPXa1PsjSeJs7d26dz6/qiTuefvrpOO2006JTp06x//77x8033xwHHHBA3HHHHTFr1qzYc889V2s+AACAuqzW2Re33nrr+MlPfhLTpk2L8ePHx3HHHRdPPPFEHHPMMdGuXbsYNGhQ3HvvvbF48eLa1yyNmU/ucrgmbbPNNtGiRYt46qmnYuHChcs8V1NTE0888cQKXztt2rT4yU9+Ettuu23stttutWeH/O1vfxuzZ8+OW2+9NQ499NBo3twxYQAAwJr1uU6JXygUomfPnnHNNdfE7Nmz4+abb47evXvHzTffHAcddFBsvvnmtae532OPPWLPPfeMsWPHxs0337zcz6qpqYnx41f/AMaysrI48sgjY+7cuXHJJZcs89zvf//7ePXVV+t83aGHHhrdu3ePs88+O5YsWRIjR46MqVOnxmOPPRb//d//Ha1atVrtmQAAAD5LvY8pW5EWLVrEkUceGUceeWS88847cdNNN8Xo0aNj9uzZtcuMHTs2+vTpE0cd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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "translate(u'esta es mi vida.')" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:08.036843Z", "iopub.status.busy": "2022-12-14T23:14:08.036603Z", "iopub.status.idle": "2022-12-14T23:14:08.331874Z", "shell.execute_reply": "2022-12-14T23:14:08.331043Z" }, "id": "A3LLCx3ZE0Ls" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: ¿ todavia estan en casa ? \n", "Predicted translation: are you still at home ? \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_146998/2662029192.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_146998/2662029192.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2UAAANyCAYAAADipWNwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABTlUlEQVR4nO3deZzVdd3//+cMILjAiMgqCGIWmisu4JKCIpaauG+J61Wa17dcsqvLckHTC9tz6bIrSwn3rVBSXBMRFQUXUnMLRUlEcGMIlPX8/vDm/JoGsYyZt8zc77fbudX5nM+cec1nBM7jfJZTValUKgEAAKCI6tIDAAAAtGSiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmV8rHnz5uX9998vPQYAADRLoowVev7557P22mtn6623Lj0KAAA0S6KMFbryyitTqVTy3HPPZcqUKaXHAQCAZkeUsUJXXXVVNtpoo1RXV+fKK68sPQ4AADQ7ooyPdP/992fGjBk58cQTM2TIkFx33XVZunRp6bGgUc2YMSPHH398Ntxww6y++upp1apVg1vr1q1LjwkANCNeWfCRRo8enVatWuXwww/POuusk7vuuivjxo3L3nvvXXo0aBQvvfRSBgwYkHfeeSef//zns3DhwvTu3Tvt2rXLSy+9lMWLF2eLLbbI2muvXXpUAKAZsaeM5Xr//fdz0003ZciQIencuXP233//rL766g5hpFk755xzMnfu3Nx7772ZOnVqkuSYY47Js88+m+nTp2efffbJ/Pnzc9NNNxWeFABoTkQZyzVmzJjMmzcvRxxxRJJkzTXXzD777JOxY8dm7ty5haeDxnHPPfdkzz33zC677FK3rFKpJEm6d++e66+/Pkny3e9+t8h8AEDzJMpYrtGjR6d9+/bZb7/96pYdccQRef/993PjjTcWnAwaz5tvvpl+/frV3W/dunUWLFhQd79t27bZfffd84c//KHEeABAMyXKaOCNN97I3XffnX333Terr7563fI99tgjnTt3zujRowtOB41n3XXXzfz58+vdnz59er11WrdunXfffbdpBwOAFmrs2LGZPHly6TEanSijgWuuuSbLli2rO3TxQ61atcrBBx+cBx98MC+//HKh6aDxbLTRRpk2bVrd/e222y533nlnXnrppSTJnDlzctNNN2XDDTcsNSIAtBgTJkzIsGHD8uUvf7nZXwFclNHAlVdeme7du2fIkCENHvvKV76SSqWSq666qsBk0Li+9KUv5b777qvbE3byySdn3rx52XzzzbPtttvms5/9bGbNmpVvfOMbZQcFgBbgw6Oz5syZk3HjxhWepnGJMup5+umn8+STT+bQQw9NVVVVg8cHDhyYvn37ugojzdLXv/71jB8/Pq1atUqSDBo0KNddd1169+6dp59+Ol27ds1FF12Ur371q4UnBYDm7cMrgQ8aNChrrrlms3/tWVX58NJikGT+/Pl5880307lz56yxxhrLXefNN9/M/Pnz07t37yaeDgCAluD666/P4Ycfnquvvjrjxo3LjTfemFmzZqVDhw6lR2sU9pRRz5prrpnevXt/ZJAlH1z8QJABANBYrrzyyrorgX/lK19p9lcAF2U0MGHChLz66qsrXGfGjBmZMGFCE00EAEBLMXv27Nx1113Zb7/90rZt2wwZMiTdunVr1lcAF2U0MHjw4IwaNWqF64wePTqDBw9umoGgkVRXV6d169Z54YUX6u63atXqY2+tW7cuPDkANF/XXnttli5dmuHDhyf54N/nQw45JBMnTmzwUTXNhVcWNPDPnGa4bNmy5V4IBFYlO++8c6qqquoO1/3wPgBQzujRo9OjR4/suuuudcuGDx+eCy+8MFdddVXOOOOMgtM1DlHGJ/Liiy+mpqam9Bjwbxk/fvwK7wMATevPf/5znnjiiZx22mn1lvfv3z+f+9zncuWVV4oymq9jjz223v0xY8Ysd/fw0qVL684n+9KXvtRE0wEA0BKMHj06VVVVOeKIIxo8dvjhh2fEiBF55JFHMmDAgALTNR6XxCfJB8fqfqiqqmqFhzBWVVVl2223zVVXXZXPfOYzTTEeNInhw4fnyCOPzJAhQxzGCABNrFKpZP31188666yTqVOnNnj85ZdfzoYbbpgTTzwxl1xySYEJG489ZST54D/y5IM/DH379s3JJ5+ck046qcF6rVq1SseOHbPmmms29YjQ6K6++upcc8016datWw477LAcccQR2XLLLUuPBQAtwpQpU9K6descf/zxy318gw02yN57751HHnkklUqlWb2Bak8ZDfz2t7/NVlttlc0337z0KNCknnjiiYwePTrXXXdd3njjjVRVVWWTTTbJkUcemcMPPzzrrbde6REBgGZIlNFAdXV1DjvssFx99dWlR4Eili1bljvvvDNXXXVVbrnllixYsCDV1dUZNGhQhg8fngMOOCBrrbVW6TGbtSVLluT555/Pu+++m6VLly53nZ133rmJpwKAxiHKaKBjx445/vjjc8EFF5QeBYqbP39+brrpplx11VW57777UqlUsvrqq+dvf/tb6dGapUqlkrPOOisXX3xx5s2bt8J1PyrWAGBVI8poYOjQoWnVqlXGjRtXehT41Pjb3/6Wiy66KOecc06WLFkiCBrJueeemxEjRmTttdfOsGHD0rNnz4/8sO6zzz67iacDYGWbMGHCJ/7a5nTEhCijgYcffjiDBg3KZZddliOPPLL0OFDMPx7G+N5776Wqqiq77bZb7rzzztLjNUt9+vRJVVVVpkyZkk6dOpUeB4BGVl1d/Ykv2NGc3iB19UUauPvuuzNo0KAcc8wxufjii7Ptttuma9euDf7AVFVV5cwzzyw0JTSeKVOm5Kqrrsp1112XOXPmpFKpZLPNNsvw4cNz+OGHp0ePHqVHbLZmzZqVr3/964IMoIU466yzGrzGnDRpUu68885stNFG2XHHHdO1a9e88cYbeeihh/LCCy9kjz32yMCBAwtN3DjsKaOBv//MshWpqqpqVu9QwHnnnZerr746L7zwQiqVSrp3757DDz88w4cPdzXSJrLxxhtnhx12yG9+85vSowBQwAMPPJDdd989l1xySY477rh6wVapVHLZZZflpJNOyt13352ddtqp4KQrlyijgfvvv/+fXneXXXZpxEmgaVVXV2fNNdfMfvvtl+HDh2e33Xb7p9+kYOW46KKLcv755+epp55Kly5dSo8DQBMbNGhQOnXqlJtvvvkj19l///3zzjvv5L777mvCyRqXwxdpQGjRUo0ePTr7779/1lhjjdKjtFjDhg3LAw88kB122CFnnXVW+vfvnw4dOix33fXXX7+JpwOgsT322GM56aSTVrjOxhtvnIsuuqiJJmoa9pQB8Knx4QnflUplhSd+V1VVZcmSJU04GQBNoVOnThk4cGBuu+22j1xnzz33zCOPPJK33nqrCSdrXPaUsUIzZszIzJkzs3DhwuU+3pwuRQp/b+nSpXnzzTc/8r99e2kax5FHHvmJr8IFwKpv6NChueGGG3LBBRfk1FNPzWqrrVb32KJFi/KTn/wkd955Zw455JCCU6589pSxXGPHjs23v/3tvPjiiytcz4U+aG4ee+yxfPe7382ECROyaNGi5a5jLw3QWObNm5dLLrkk99xzz0e+KVpVVZVp06YVmA4a31//+tcMHDgwr7/+erp06ZJtttkmXbp0yezZszNlypTMnj07PXr0yMMPP5yePXuWHnelsaeMBsaPH5/99tsv3bp1y//7f/8vF198cXbZZZf069cvEydOzDPPPJO99947W2+9delRYaV68skn84UvfCGtW7fO0KFDM3bs2GyxxRbp1q1bHn/88cyZMyeDBg1K7969S48KNENz5szJDjvskGnTpqVDhw6pra1NTU1NFi1alPfeey9J0qNHj7Rp06bwpNB4evbsmSlTpuS///u/c8MNN9Q7jLFdu3YZPnx4LrjggnTr1q3glCufy4rRwAUXXJC11lorjz32WC688MIkyeDBg3PppZfmqaeeyvnnn5977703w4YNKzwprFzf//73kySPPPJIbrnlliTJfvvtl3HjxmX69Ok54YQT8vTTT+fss88uOSbQTI0YMSLTpk3L6NGj88477yRJTjnllMyfPz+PPPJItttuu/Tp0yfPPPNM4UmhcXXr1i2jRo3K3Llz86c//SkPPPBA/vSnP+Xdd9/NqFGjml2QJaKM5Zg8eXL23XffdO3atW7ZsmXL6v7/6aefnq222ipnnXVWifGg0UycODH77LNPNt5447plHx7hvfrqq+eSSy5Jjx498t3vfrfUiC3CvHnzMnLkyOy2227ZeOON07dv3wa3DTfcsPSYsNLdfvvt2W233XLEEUc0OLdy2223rXuD6Jxzzik0ITStNm3aZNNNN82OO+6YTTfdtN75Zc2NKKOBBQsWZL311qu737Zt29TW1tZbZ+DAgXnwwQebejRoVHPnzk3fvn3r7rdp0yZ/+9vf6u5XV1dn0KBBuffee0uM1yLMmTMn/fv3z/e+97089thjef755/POO+/kjTfeyPTp0zN9+vQsWrSo3htF0Fy8/vrr2Wqrrerut2rVqu6wxSTp2LFjvvSlL+WGG24oMR7QiEQZDXTr1i1z5sypu7/eeus1OFTirbfecpEPmp0uXbrUHTKUfPBn4R8vdvP+++9nwYIFTT1ai+HwLVqympqaLF68uO5+x44d89e//rXeOh06dMgbb7zR1KNBk7rnnnuy5557pnPnzmnTpk1atWrV4Na6dfO6NEbz+mlYKbbYYos8/fTTdfcHDx6c3/72t7n22muzzz77ZOLEibnhhhtc6INmZ5NNNsnzzz9fd3/HHXfMmDFj8vDDD2f77bfPs88+mxtuuCH9+vUrOGXz9veHb/2jDw/f2myzzXLOOefkBz/4QYEJofH07ds306dPr7u/1VZb5e67785bb72VTp065b333svYsWN9JAfN2s0335xDDjkky5YtS+/evdOvX79mF2DLY08ZDeyzzz558skn88orryRJvvvd72attdbKEUcckQ4dOmTPPffMkiVLct555xWeFFauvfbaKxMmTMjrr7+eJPnOd76TSqWSnXbaKZ07d85mm22Wd9991zlljcjhW7RkQ4cOzb333lu3N/7444/P7Nmzs8UWW+Sggw7KpptummnTpuXoo48uOyg0onPPPTerr7567rnnnrz88st54IEHct999y331pyIMho49thjs2DBgrrLfm+wwQaZPHlyTjjhhAwdOjRf/epX88gjj/jgaJqdE044Ia+99lo6deqU5IO9xvfee2+++MUvZt11182QIUMyduzY7LfffoUnbb4cvkVLdsIJJ+Syyy6ri7L9998/P/rRjzJ//vzcfPPNmTVrVk499dR8+9vfLjwpNJ7nn38+hx56aHbdddfSozQpHx4NwKfG9ttvn27duuX3v/99kmSPPfbI1KlT88wzz9QdvrXFFlukuro6zz33XOFpoWksXbo0b775Zrp06dLgqozQ3Ky33no58MAD6z6WqaWwp4wGjj322Nx6660rXOcPf/hDjj322CaaCGgpHL4FDbVq1Spdu3YVZLQIBx54YO65554sWbKk9ChNyp4yGqiurs6IESNW+Dlk559/fs466yxXYGSVNmHChE/8tQ7fbRyvv/56JkyYkN122y3rrrtukuQnP/lJzjvvvMydOzerr756TjzxxFxwwQVp1apV4Wlh5ZoxY0ZefPHFDBw4MGussUaSDz4n9Ec/+lFuvfXWtGvXLqeeemr22muvwpNC45k/f36GDh2abt265Wc/+1mLubCNKKOBfybKzjzzzPzwhz/MwoULm3AyWLmqq6s/8TvP3pBoWg7foiU4+uijM3bs2MyaNStt2rRJknz/+9/P2WefXbdOq1at8tBDD2XbbbctNSY0qr59+2bx4sWZOXNmkmTttddOTU1Ng/Wqqqoybdq0ph6v0TT/60vyiXzUi55KpZIZM2Zk3Lhx6dGjRxNPBSvXWWed1eC/9UmTJuXOO+/MRhttlB133DFdu3bNG2+8kYceeigvvPBC9thjjwwcOLDQxM3fhAkT0qdPnwbvjH54+Fbywd6El19+2d5Kmp0HH3wwQ4YMqQuySqWSSy65JP369ctdd92VWbNmZciQIfnRj37kCqQ0W8uWLUvr1q3r/TuwvH1IzW2/kj1lJKm/x6BSqXzsO9GVSiXf+c53MnLkyKYYD5rEAw88kN133z2XXHJJjjvuuHp/DiqVSi677LKcdNJJufvuu7PTTjsVnLT5atWqVc4++2yHT9Mi1dTU5Pjjj88Pf/jDJMkTTzyRrbfeOr/4xS/y9a9/PckHe9Puv//+vPzyyyVHBVYye8pI8sH5MR++AJ0wYULWX3/99OnTp8F6rVq1yjrrrJNdd901X/3qV5t4SmhcZ555Zvbaa6/8x3/8R4PHqqqq8rWvfS133HFHzjzzzGb3+SifFv/M+4TLli1zCCPN0rJly7Js2bK6++PHj09VVVW9S4Ovt956mTVrVonxgEYkykjywV/8H6qurs4xxxyzwneqoTl67LHHctJJJ61wnY033jgXXXRRE03E8rz44ovLPb8AVnXrr79+Hn300br7Y8aMSffu3fO5z32ubtmsWbOy9tprF5gOmt6f//znPPfcc5k/f36GDx9eepxGJcpo4O/fpYOWZLXVVssTTzyxwnWeeOKJrLbaak00Ucvwjx+vMWbMmEyfPr3BekuXLs2MGTMyYcKEfOlLX2qi6aDpHHDAATn//PNz4IEHpl27dpk4cWL+3//7f/XW+fOf/5y+ffsWmhCaxuTJk/PVr341Tz31VN2yD6NswoQJ+eIXv5jrrrsu++yzT6kRVzrnlLFcy5YtS3V1/Y+xe/jhh/OHP/wh7dq1yzHHHJOePXsWmg4ax2GHHZYbbrgh559/fk499dR68bVo0aL85Cc/yRlnnJFDDjkk11xzTcFJm5e//7umqqpqhYcwVlVVZdttt81VV12Vz3zmM00xHjSZ2traDB06tG5v2eabb5777rsvHTt2TJK88sor6du3b/77v/87559/fslRodE888wzGThwYKqrq/PVr341zz33XMaNG1d3HnGlUknv3r2zyy675Morryw87cojymjglFNOyaWXXlrvEImbbrophx56aN1etHXXXTePP/64MKNZ+etf/5qBAwfm9ddfT5cuXbLNNtukS5cumT17dqZMmZLZs2enR48eefjhh/23vxK98sorST74h7Zv3745+eSTl3sYaatWrdKxY8esueaaTT0iNKmnn346yQeHS//95/G98sorefLJJ7PNNttkvfXWKzUeNKoDDzwwd955Z5544ol85jOfyTnnnJNzzz233sWdDjnkkEydOjXPPfdcwUlXLocv0sB9992XXXfdtd4x62eddVZqampy4YUXZtasWTn99NPz4x//OD//+c+LzQkrW8+ePTNlypT893//d2644YbcdtttdY+1a9cuw4cPzwUXXJBu3boVnLL56d27d93/v+KKK7LlllvWW0bTWrRoUcaMGZPJkyfn3XffXe5VLquqqvKb3/ymwHQtw6abbrrc5b179/Zng2bv/vvvzwEHHLDCoyHWX3/93HHHHU04VeMTZTQwY8aM7LLLLnX3X3755Tz33HM5++yzc8QRRyT54NLhze0PAyRJt27dMmrUqFx22WV5/vnnM3fu3NTU1OSzn/2sc8mawFFHHbXc5ZVKJX/5y1/Srl279OrVq4mnajleeeWV7L777pk2bdrHHkYqyoDGMG/evHTp0mWF67z33nvN7mNRRBkNzJ8/v97hQffff3+qqqrqnVi/ySab5N577y0xHjSJNm3afOS71TSe3/3udxkzZkwuvPDCuvNopk+fni9/+cv585//nCQ56KCDcvXVV9c7rIuV45RTTslf/vKXDB8+PMcee2x69uyZ1q29VGhK8+bNyyWXXJJ77rknM2fOzMKFCxusU1VVlWnTphWYDhpfr1696l3gY3kef/zxbLjhhk00UdPwNy0N9OjRI88//3zd/TvuuCNrrbVWtt5667pltbW1adu2bYnxoEk8+OCDefLJJ1NbW5sOHTpkyy23zI477lh6rGbv0ksvzRtvvFEXZMkHofDMM89k1113zVtvvZUbb7wxu+22m89KbAR//OMfs9tuu+W3v/1t6VFapDlz5mSHHXbItGnT0qFDh9TW1qampiaLFi3Ke++9l+SDf6PbtGlTeFJoPHvvvXcuuuii3HPPPRkyZEiDx2+44YZMmjQpZ555ZoHpGo8oo4Fddtkl1157bS655JK0a9cuv/vd77LvvvvWe1d62rRpLnRAs/TQQw/lmGOOyV/+8pckHxw29+EHFW+00Ua54oorsv3225ccsVn785//XG+v/Lx583LbbbflkEMOybXXXpvFixdnq622yuWXXy7KGsGyZcuy1VZblR6jxRoxYkSmTZuW0aNH5ytf+UpatWqVU045JWeddVYmT56cb3zjG2ndunXuuuuu0qNCo/nud7+bm266KXvuuWeOOuqoug9L/9///d88/PDDufbaa9OnT5+ceuqphSdduUQZDXzve9/LmDFjctJJJ6VSqWTNNdfMiBEj6h6fN29eJkyYkKOPPrrYjNAYnnnmmQwdOjQLFizI7rvvnsGDB6d79+6ZNWtW7rvvvtx1113ZY489MmnSpGyyySalx22W3n777XoXUpk4cWKWLFmSww47LMkHh5Xuvvvuufrqq0uN2KwNGDAgzz77bOkxWqzbb789u+22W935239v2223zbhx47LZZpvlnHPOyQ9+8IMCE0Lj69y5c+6///4MHz683rmrH35m34ABA3Lttdempqam1IiNQpTRwGc+85n8+c9/zs0335wk+fKXv1zvak8vvvhijj/++Bx++OGlRoRGce6552bRokW5/fbb88UvfrHeY9/5zndyxx13ZJ999sm5556b6667rtCUzVuHDh3y1ltv1d2/7777Ul1dnS984Qt1y9q0aZP58+eXGK/Zu+CCC7LzzjvnpptuyoEHHlh6nBbn9ddfz0EHHVR3v1WrVnWHLSZJx44d86UvfSk33HCDKKNZ69u3b91pBJMmTcrbb7+dDh06ZMCAAdl2221Lj9coRBnL1b1797p3JP5R//79079//yaeCBrf+PHjc+CBBzYIsg998YtfzIEHHugiN42oX79+GTt2bM4777y0atUq11xzTbbeeut655i98sor6dq1a8Epm6/bbrstgwcPziGHHJJddtkl/fv3T4cOHRqsV1VV1ezO5/g0qKmpyeLFi+vud+zYMX/961/rrdOhQ4e88cYbTT0aFLHllltmyy23LD1GkxBl1DNz5sxMmTIl/fv3/8hzxiZPnpxZs2Zl7733rjvXBpqDuXPnZoMNNljhOhtssEHmzp3bRBO1PN/85jdz0EEHpWfPnnV7xM4777x660yaNMkbQ43k7w9VHz9+fMaPH7/c9URZ4+jbt2+mT59ed3+rrbbK3XffnbfeeiudOnXKe++9l7Fjx2b99dcvNyQ0opb8OlSUUc+yZcuy33775Zhjjsmvf/3rBo8vXbo0X/7yl7P++uvny1/+coEJofH06NEjkyZNWuE6jzzySHr06NFEE7U8BxxwQH7xi1/k17/+daqqqnLooYfWO3/1/vvvT21t7UfuzeTfc99995UeoUUbOnRofvazn2XBggVZY401cvzxx+fAAw/MFltske233z6PP/54pk+fnvPPP7/0qNAoWvTr0Ar8g8GDB1fWXnvtyvvvv9/gsXHjxlWqqqoqF110UYHJoHGddNJJlerq6soZZ5xRee+99+o99t5771XOOuusSnV1deXkk08uNCHQnM2cObNy3XXXVebMmVO37Mc//nFl7bXXrlRVVVXWWGONymmnnVZZsmRJwSmhcbXU16FVlUqlUjoM+XQZNWpUjjvuuFx//fUNTvQePnx4brjhhsycOTOdOnUqNCE0jrfeeisDBgzIyy+/nE6dOmW77bZL165d88Ybb2Ty5MmZM2dO+vbtm0cffTTrrLNO6XGbrSVLluTiiy/Otddem+eeey4LFizIkiVLkiRPPvlkfvWrX+Xkk0/OZz/72cKTNk+2/6fP0qVL8+abb6ZLly7N6nAtWJ6W+jq0uvQAfPoceOCBWX311XPllVfWW75gwYKMGTMme+yxR7P7gwBJ0qlTp0yaNClHHXVU/va3v+X222/PFVdckdtvvz3z5s3LMccck0mTJgmyRvTee+9l8ODB+da3vpVXXnklHTp0yN+/d7jBBhvkiiuuyOjRowtO2Xx9uP1PO+0027+ABx98MKeeemrd5zJ9qFWrVunatWtmzZqVU0899WMPs4ZVWUt9HSrKaGCttdbKsGHDcuedd+btt9+uW37LLbdkwYIFOfLIIwtOx9877rjj0qVLl7z44oulR2kWXn311ay22mq5/PLLM3fu3EydOjUPPPBApk6dmrlz5+Y3v/lN2rZtm1dffbX0qM3W//zP/+TBBx/MBRdckFmzZuU//uM/6j1eU1OTXXbZJXfeeWehCZu3D7f/yJEjbf8CfvrTn2bs2LH1Pqvv73Xv3j1/+MMf8rOf/ayJJ2v+LrnkkvTp0ydrrrlm9t9//7z22mulR2qxWurrUFHGcg0fPjyLFi3K9ddfX7fsqquuSk1NTfbZZ5+Ck/H3zjjjjLz77ru58MILS4/SLGywwQZ127JNmzbZbLPNsuOOO2azzTZLmzZtkiQXXXTRx16hkU/u+uuvz+DBg/Nf//VfqaqqWu6hWn379hXGjcT2L2vy5MnZaaedVrjOzjvvbE/ZSnbTTTflm9/8ZmbMmJE111wzY8aMyfbbb5+//OUvpUdrsVri61BRxnINHTo03bp1q9t1/Oabb+buu+/OQQcdlNVWW63wdM3XiSeemP/8z//MnDlz8uSTT+bEE0/MySefnAsvvDDvvPNOg/U32GAD71qvRJVKJR93mq3TcBvXq6++mm222WaF67Rv397HEjQS27+s2bNnZ7311lvhOt26dcvs2bObaKKW4cc//nFqamry9NNPZ/bs2RkzZkzefvvt7LbbbsKskJb4OlSUsVzV1dU57LDD8sgjj+Sll17K9ddfn6VLl2b48OGlR2vWfvnLX+aXv/xl3nnnnUybNi2//OUvc9FFF+WUU07JJptsksmTJzf4mj59+mTGjBkFpm2Z/vrXv6Z9+/alx2i22rdv/7EvOKdNm5bOnTs30UQti+1f1tprr/2xeyFfeeWVrLXWWk00Ucvw7LPP5pBDDsnGG2+cJNlnn33y+9//PnPmzEn//v1z0EEH5dhjj824ceMya9asHHvssTnuuOMKT928tcTXoT6njI905JFH5mc/+1muuuqqjBs3Ln369PnYwyr493z4GUHrr79+1llnndx3331ZtGhRJk6cmB/84AfZbbfdMnbs2Oyyyy51X/PEE0+ka9eupUZe5Z177rn17n/Uh+UuXbo0M2bMyHXXXZeBAwc2wWQt08CBAzN27Ni8++67WXvttRs8PmPGjNx+++3Zb7/9mn64FsD2L2vgwIH5/e9/nxkzZqRXr14NHn/11VczZsyY7LrrrgWma74qlUqD/95333333HbbbTn88MNz8803J0n69euXvn37ZtSoUamqqspvfvObAtO2HC3udWi5q/GzKth8880r3bp1q1RXV1fOOuus0uO0aPfee29lzTXXrKy++uqV8847r3L77bdXjj322Ep1dXXlqKOOKj3eKquqqqruVl1dXe/+8m7rrbde5dFHHy09drN1//33V6qrqyv9+/evTJw4sXLGGWdUqqurK/Pnz6/cc889lY033rjSpk2bypQpU0qP2izZ/mV9uP179epV+e1vf1uZOXNmpVL54PPLRo0aVenZs2elVatWlfvvv7/wpM3LgAEDKoMHD17uY4sXL6489dRTlUmTJlVmzpxZWbBgQWX8+PGV8ePHN/GULVNLeh3qc8pYoR//+Md1J3y/8MIL2XDDDUuP1KI98sgjGTZsWObMmZPkg3f3unXrlilTpqRHjx6Fp1s13X///Uk+2Ja77rprjj766Bx11FEN1mvVqlXWWWed9OvXL9XVjvxuTJdeemlOOumkLF26tMFjrVq1yv/+7/82uCogK4/tX9aFF16Yb33rW3Xnr1ZVVdX9/+rq6vz85z/Pf/7nf5Ycsdn5wQ9+kO9973uZOnVqPv/5z5ceh7/Tkl6HijJW6PXXX88OO+yQzTffPLfcckvpcUjyzjvv5LLLLsu0adOy4YYb5thjj826665beqxm4ZxzzsngwYOz8847lx6lxXv22Wfzy1/+Mo888kjefvvtdOjQIQMGDMiJJ57oRVMTsP3L+tOf/pRf/vKXmTx5cubOnZu111472223XU444YRsuummpcdrdubOnZtzzjknAwcOzMEHH1x6HP5OS3odKsoAAAAKcgwOAABAQaIMAACgIFHGCi1cuDAjRozIwoULS4/SItn+5fkdlGX7l2X7l2X7l+d3UFZL2v7OKWOFamtrU1NTk7lz56ZDhw6lx2lxbP/y/A7Ksv3Lsv3Lsv3L8zsoqyVtf3vKAAAAChJlAAAABbUuPUBzt2zZssycOTPt27dPVVVV6XH+ZbW1tfX+l6Zl+5fnd1CW7V+W7V+W7V+e30FZq/r2r1QqmTdvXnr06JHq6hXvC3NOWSP761//ml69epUeAwAAKGDGjBnp2bPnCtexp6yRtW/fPkmyU/ZM67QpPA0AQBNaBY8SgpVlSWVxJua2uh5YEVHWyD48ZLF12qR1lSgDAFoQUUZLV8k/dQqTC30AAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAACmoWUbZo0aJcfPHF2WOPPdKrV6+0bds2Xbp0yf77758nnnii3rqjRo1KVVVVRo0albFjx2bHHXdM+/bt06dPn3rP99Of/jT9+/fPmmuumfbt2+cLX/hCbr311ib+yQAAgOauWUTZ22+/nZNPPjkLFy7MnnvumVNOOSWDBg3K7bffnh122CGTJ09u8DU33nhj9t9//3Tp0iUnnnhivvSlLyVJFi5cmD322CPf+ta3UqlUctxxx+WII47IK6+8kmHDhuWSSy5p6h8PAABoxlqXHmBl6NixY1599dWst9569ZY/88wzGThwYL773e/m7rvvrvfYHXfckTvvvDNDhgypt/zcc8/N+PHjc+aZZ+acc85JVVVVkmTevHnZdddd861vfSv7779/evTosdxZFi5cmIULF9bdr62tXRk/IgAA0Ew1iz1lbdu2bRBkSfL5z38+gwcPzoQJE7J48eJ6jw0bNqxBkC1btiyXXnppNtxww3pBliTt27fPWWedlUWLFuV3v/vdR84ycuTI1NTU1N169er1b/50AABAc9Ys9pQlyZNPPpkf/vCHmThxYmbNmtUgwt58881079697v52223X4Dmef/75vPPOO+nRo0fOOeecBo/PmTMnSfLcc8995Bynn356Tj311Lr7tbW1wgwAAPhIzSLKHnrooey6665JkqFDh2ajjTbKWmutlaqqqowZMyZTp06td0hhknTt2rXB87z99ttJPjjs8ZlnnvnI7zd//vyPfKxt27Zp27btJ/kxAACAFqhZRNn555+fhQsX5oEHHshOO+1U77FJkyZl6tSpDb7m7w9N/FCHDh2SJAcccEBuuummxhkWAADg7zSLc8qmTZuWddZZp0GQLViwII8//vg//Twbb7xxOnTokClTpjQ4/BEAAKAxNIso6927d9555516hxwuXbo0p512Wt15YP+M1q1b5+tf/3peeeWVnHbaacsNs6effjqzZ89eKXMDAAA0i8MXv/GNb+Suu+7KTjvtlIMPPjjt2rXL+PHj89prr2XQoEEZP378P/1c55xzTh5//PFcdNFFue2227LzzjunS5cuee211/LUU09l6tSpefjhh9OlS5fG+4EAAIAWo1nsKdt7771z0003pW/fvrnqqqtyzTXXpF+/fnn00UfTu3fvf+m52rZtm3HjxuX//u//0q1bt9x88835+c9/ngkTJqR79+659NJLs9lmmzXSTwIAALQ0VZVKpVJ6iOastrY2NTU1GZRhaV3VpvQ4AABNZzkXVoOWYkllccZXxmTu3Ll1FxT8KM1iTxkAAMCqSpQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoKDWpQdoKVp1WietqlcrPUaLVNWhfekRWrTX9upReoQWr/Yzy0qP0KL1G/F86RFattZe6pS09K23S49Axb8BqwJ7ygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKCgVS7K7rnnnlRVVeXEE09c7uPTpk1LdXV19thjj7plr7zySo477rist956WW211dKzZ88cd9xxefXVVxt8fZ8+fdKnT5/lPvegQYNSVVW1Un4OAACAZBWMst122y0bbrhhrrnmmixYsKDB47/+9a9TqVTy1a9+NUnywgsvZNttt83ll1+erbfeOt/61rey1VZb5fLLL88222yTF154oal/BAAAgDqrXJRVVVXla1/7WubOnZsbb7yx3mNLlizJb3/723Tp0iXDhg1LkpxwwgmZM2dO/u///i+33nprRo4cmbFjx+YXv/hF5syZk69//esrdb6FCxemtra23g0AAOCjrHJRliTHHHNMVltttfz617+ut/y2227L66+/nqOOOipt2rTJq6++mvvuuy+bbLJJ3Z6zD51wwgnp169f/vjHP2bGjBkrbbaRI0empqam7tarV6+V9twAAEDzs0pGWefOnbP//vtn4sSJee655+qWfxhp//Ef/5EkefLJJ5Mku+yyS4Nzwaqrq7PzzjvXW29lOP300zN37ty628oMPgAAoPlZJaMsSY4//vgk/3+IzZw5M+PGjcsuu+ySz372s0lSd+hg165dl/sc3bt3r7feytC2bdt06NCh3g0AAOCjrLJRNmjQoPTr1y+jR4/OokWLcsUVV2Tp0qX1DlP8MIjeeOON5T7HrFmz6q2XfLAHbcmSJctdf+7cuStrfAAAgCSrcJQlyde+9rXMmTMnY8aMyeWXX56OHTvmgAMOqHt8yy23TJJMmDAhlUql3tdWKpVMmDCh3npJ0rFjx8yePbtBmM2fPz8vvvhi4/wgAABAi7VKR9lRRx2Vdu3a5ZRTTslLL72U4cOHp127dnWPr7/++hk8eHCeeeaZXH755fW+9le/+lWeffbZ7LrrrvUuxrHttttm8eLFufrqq+uWVSqVnH766Zk/f37j/1AAAECLUlX5x11Iq5gjjzwyV155ZZLkqaeeyqabblrv8eeffz477bRT3nrrreyzzz7ZZJNN8swzz+TWW29N586dM3HixLpz0JLk6aefztZbb51ly5blkEMOSefOnfPAAw/k3XffzVprrZWpU6c22Ou2IrW1tampqclunY5J6+rVVs4Pzb+kqkP70iO0aK/t1aP0CC1e7WeWlR6hRes34vnSI7RsrVuXnqBFW/rW26VHoOLfgFKWVBZnfGVM5s6d+7HXmVil95QlH+wtS5KBAwc2CLIk+dznPpcpU6bk6KOPzqOPPpof/ehHmTx5co455phMnjy5XpAlyaabbpo77rgjW2+9dW666aZceeWV2WSTTfLQQw9l7bXXboofCQAAaEFW+bePnnjiiSRp8Dlkf693794NDl9ckcGDB2fSpEkNlo8fP/5fng8AAGBFVuk9Ze+//34uueSSdOzYMYceemjpcQAAAP5lq+SesokTJ+b+++/PnXfemVdeeSUjR47MGmusUXosAACAf9kqGWX33HNPzjnnnKy77ro55ZRTctppp5UeCQAA4BNZJaNsxIgRGTFiROkxAAAA/m2r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AABAQaIMAACgIFEGAABQkCj7GKNGjUpVVVVGjRpVehQAAKAZEmUAAAAFiTIAAICCWmSULVq0KBdffHH22GOP9OrVK23btk2XLl2y//7754knnqhb7+ijj84xxxyTJDnmmGNSVVVVdwMAAFgZWpceoIS33347J598cr7whS9kzz33TMeOHfPSSy/l1ltvzbhx4zJhwoRsu+222XffffPuu+/mlltuybBhw7LllluWHh0AAGhmWmSUdezYMa+++mrWW2+9esufeeaZDBw4MN/97ndz991314uyfffdN0cfffTHPvfChQuzcOHCuvu1tbUre3wAAKAZaZGHL7Zt27ZBkCXJ5z//+QwePDgTJkzI4sWLP9Fzjxw5MjU1NXW3Xr16/bvjAgAAzViLjLIkefLJJ3P44Ydn/fXXz2qrrVZ3rtjYsWOzaNGivPnmm5/oeU8//fTMnTu37jZjxoyVPDkAANCctMjDFx966KHsuuuuSZKhQ4dmo402ylprrZWqqqqMGTMmU6dOrXcI4r+ibdu2adu27cocFwAAaMZaZJSdf/75WbhwYR544IHstNNO9R6bNGlSpk6dWmgyAACgpWmRhy9OmzYt66yzToMgW7BgQR5//PF6y1q1apUkWbp0aZPNBwAAtBwtMsp69+6dd955J88880zdsqVLl+a0007LnDlz6q27zjrrJIlzwwAAgEbRIg9f/MY3vpG77rorO+20Uw4++OC0a9cu48ePz2uvvZZBgwZl/Pjxdetuv/32WX311fPzn/8877zzTjp37pwkOeOMMwpNDwAANCctck/Z3nvvnZtuuil9+/bNVVddlWuuuSb9+vXLo48+mt69e9dbd5111slNN92Uz372s7nsssty5pln5swzzyw0OQAA0NxUVSqVSukhmrPa2trU1NRkUIaldVWb0uMALVBV6xZ5UMSnxrTzty09Qou2tNsnu5oyK8fGI94qPUKLt+TlV0qP0GItqSzO+NySuXPnpkOHDitct0XuKQMAAPi0EGUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKKh16QEAaFyVJUtKj9CifebcP5UeoWXbsFfpCVq0H953XekRWrz/Grhv6RFarmWLkjf+uVXtKQMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQUJNF2fjx41NVVZURI0Y01bcEAAD41LOnDAAAoCBRBgAAUJAoAwAAKKhIlE2ZMiW777572rdvn5qamuy3336ZPn16g/UefPDB7LXXXllnnXXSrl279OvXL2effXYWLFjQYN2qqqoMGjQor732Wg4//PCsu+66ad++ffbaa6+89NJLSZJnn302++67b9ZZZ520b98+Bx54YN54443lzvinP/0phx56aLp3757VVlstvXv3zje+8Y289dZbK3VbAAAALVuTR9nkyZOz8847Z7XVVsvxxx+fbbbZJmPGjMmQIUPy/vvv16134403Zpdddsn48eOz77775uSTT84aa6yRc889N7vuumu9dT/0zjvvZKeddsrLL7+co446KoMGDcrtt9+e3XffPU8//XR22GGH/O1vf8uxxx6bbbbZJjfffHMOO+ywBs9z6623Zrvttsutt96aQYMG5eSTT85mm22WSy65JNtvv33eeeedRt1GAABAy9G6qb/h7bffnuuuuy6HHHJI3bIjjzwyV155ZcaMGZNDDz00tbW1+epXv5rWrVvn4Ycfzuabb54k+Z//+Z8cfvjhuf766/OjH/0oZ555Zr3n/tOf/pRTTjklP/3pT+uWnXjiibn00kvzhS98ISNGjMhJJ52UJKlUKtl7771z++235/HHH0///v2TJG+99VaGDx+eddddNw8++GB69+5d91zXXXddDjvssJx11lm5+OKLl/vzLVy4MAsXLqy7X1tb+29uMQAAoDlr8j1lO++8c70gS5Jjjz02yQd70ZLklltuydy5c3PsscfWBVmSVFdX54c//GFat26dUaNGNXjutdZaK+edd169ZR/uCevUqVO++c1v1i2vqqrKoYcemiSZOnVq3fLRo0entrY2I0eOrBdkSXLooYemf//+ue666z7y5xs5cmRqamrqbr169frIdQEAAJp8T9nWW2/dYFnPnj2TJO+++26S5IknnkiSDBo0qMG666+/fvr27ZsXXngh8+bNS/v27ese22ijjbLGGmvUW7979+5Jks033zxVVVXLfWzmzJl1yyZNmpQkeeSRRzJt2rQG3//999/Pm2++mTfffDPrrrtug8dPP/30nHrqqXX3a2trhRkAAPCRmjzKOnTo0HCI1h+MsXTp0iT//yF/Xbt2Xe5zdO/ePS+88EJqa2vrRdmKnntFjy1evLhu2dtvv50k+cUvfrHCn2P+/PnLjbK2bdumbdu2K/xaAACAD30qL4n/YUB91JURZ82aVW+9xvjeTz31VCqVykfe/vHQRgAAgE/iUxllW221VZJk/PjxDR6bMWNGpk2blr59+9bbS7ayDBgwIEny8MMPr/TnBgAA+EefyigbNmxYampqcsUVV+SZZ56pW16pVPKd73wnS5YsydFHH90o3/uYY45J+/bt873vfa/e9/7QggUL6s47AwAA+Hc1+Tll/4wOHTrksssuy2GHHZYBAwbkkEMOSefOnXPPPffksccey3bbbZdvf/vbjfK9O3funGuvvTYHHXRQtthii3zxi19Mv379snDhwkyfPj33339/dthhh9xxxx2N8v0BAICW5VMZZUly0EEHpVu3bhk5cmR+97vfZcGCBenTp0/OPPPMfOc730m7du0a7XvvtddeeeKJJ/KjH/0o99xzT+6+++6sueaa6dmzZ4455pgcccQRjfa9AQCAlqWqUqlUSg/RnNXW1qampiaDMiytq9qUHgeAJla95pqlR2jZNvSxNCX9+NYrSo/Q4v3XwH1Lj9BiLVm2KPe8cVnmzp37sRco/FSeUwYAANBSiDIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiU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dOjQDB8+PPvss09WX331euvvuOOOeeSRR3Lbbbdljz32qFv+wgsvZJtttkmfPn3ypz/9qW55nz598sorr2TYsGG54YYbstpqqyVJ7r333gwZMiR77LFH7rjjjrr1jz766Pz2t7/Neeedl+9973t1y3/1q1/l+OOPT5Lcd999GTRoUIOf5cknn8xVV12Va6+9NjNnzkzr1q3rfpZhw4Y1+Fk+ysKFC7Nw4cK6+7W1tenVq1cGZVhaV7X5p54DgGakqqr0BC1bldPnS2q9/nqlR2jxbnvo1tIjtFi185al42dfyty5c9OhQ4cVrvsvR9nMmTNzzTXXZPTo0XnqqaeSJAMGDMgRRxyRQw89NOuuu+5yv+6JJ55I//79c+yxx+Y3v/lNg8e/9a1v5ac//WmeeuqpbLrppkn+/yh76aWXssEGG9Rbv0+fPpk3b17eeuutJMmiRYtSU1OTDh065JVXXkm7du3q1l22bFn69euXF1988SOj7O/X/eMf/5grr7wyv//97zNv3rx06NAhBx54YI488sjsvPPOqVrBP7AjRozIOeec02C5KANooURZWaKsKFFWnigr51+Jstb/6pPvuOOOmT59erp06ZKzzz47RxxxRD7zmc987Nd9ePjgG2+8kREjRjR4/Lnnnqv73w+jLEnWXnvtBkGWJD179szDDz9cd//555/P+++/n1133bVekCVJdXV1dtxxx7z44osfO2d1dXWGDBmSIUOG5Je//GXGjBmTX/3qV7n88stz+eWXZ8yYMRk2bNhHfv3pp5+eU089te7+h3vKAAAAludfjrJNN90006dPz+zZs3PHHXdk3XXXzSGHHJLOnTuv8OvefvvtJMltt92W22677SPXmz9/fr37NTU1y12vdevW9a6aOHfu3CRJly5dlrt+165dVzjfP1q6dGkeeOCB3HHHHZkyZUqSZN111023bt1W+HVt27ZN27Zt/6XvBQAAtFz/8j79sWPH5oUXXsgZZ5yRN954I9/4xjfSo0eP7LnnnrnmmmsaRNWHPtxld/HFF6dSqXzk7aijjvpEP8iH8TZ79uzlPv7PXrjjscceyymnnJKePXtmjz32yPXXX58vfvGLueWWWzJz5swMGDDgE80HAACwPJ/oQOuNNtoo3//+9/PSSy/l/vvvz9FHH52HHnooX/nKV9K1a9ccccQRGTduXJYsWVL3NR/GzN8fcrgyffazn027du0yZcqUvP/++/UeW7ZsWR566KGP/NqXXnop3//+99OvX79ss802dVeH/L//+7/MmjUrN954Y/bZZ5+0aeOcMAAAYOX6t85+raqqys4775zLLrsss2bNyvXXX59Bgwbl+uuvz5577pn11luv7jL32223XQYMGJBrr702119/fYPnWrZsWe6///5PPEvbtm1z8MEHZ/bs2fnJT35S77Ff//rXeeGFF5b7dfvss0823HDDnHXWWVm6dGlGjBiRadOmZeLEifna176Wtdde+xPPBAAA8HH+5XPKPkq7du1y8MEH5+CDD86cOXNyzTXX5Morr8ysWbPq1rn22mszePDgHHroofn5z3+e/v37Z/XVV8+rr76ahx9+OHPmzGmwl+tfccEFF+Tee+/NGWeckYkTJ2arrbbKs88+m9tvv73us87+0WuvvZYTTjghw4cPzw477PCJvzcAAMAnsdKi7O917tw5J510Uk466aQsXbq0bvkGG2yQJ554Ij/96U8zZsyYXHHFFWnVqlW6d++enXfeOQceeOC/9X27d++ehx56KP/1X/+VO++8MxMmTMjWW2+du+++O3/84x+XG2WPPvpoWrVq9W99XwAAgE/q3/rwaD5ebW1tampqfE4ZQEvlc8rK8jllRfmcsvJ8Tlk5/8rnlPmbCgAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCWpceAACatUql9AQtW2Vp6QlatCXTXy09Qou3R48tS4/QYi2pLE7y0j+1rj1lAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKKh16QGam4ULF2bhwoV192trawtOAwAAfNrZU7aSjRw5MjU1NXW3Xr16lR4JAAD4FKuqVCqV0kM0J8vbU9arV68MyrC0rmpTcDIAAKCpLKkszvjckrlz56ZDhw4rXNfhiytZ27Zt07Zt29JjAAAAqwiHLwIAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCWpceoLmrVCpJkiVZnFQKDwMAADSJJVmc5P/vgRURZY1s3rx5SZKJub3wJAAAQFObN29eampqVrhOVeWfSTc+sWXLlmXmzJlp3759qqqqSo/zL6utrU2vXr0yY8aMdOjQofQ4LY7tX57fQVm2f1m2f1m2f3l+B2Wt6tu/Uqlk3rx56dGjR6qrV3zWmD1ljay6ujo9e/YsPca/rUOHDqvkH4bmwvYvz++gLNu/LNu/LNu/PL+Dslbl7f9xe8g+5EIfAAAABYkyAACAgkQZK9S2bducffbZadu2belRWiTbvzy/g7Js/7Js/7Js//L8DspqSdvfhT4AAAAKsqcMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBB/x8oZdDvoQD0UQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "translate(u'¿todavia estan en casa?')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T23:14:08.334981Z", "iopub.status.busy": "2022-12-14T23:14:08.334744Z", "iopub.status.idle": "2022-12-14T23:14:08.599511Z", "shell.execute_reply": "2022-12-14T23:14:08.598685Z" }, "id": "DUQVLVqUE1YW" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: trata de averiguarlo . \n", "Predicted translation: try to figure it out . \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_146998/2662029192.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_146998/2662029192.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqQAAAOTCAYAAABpThEIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJLUlEQVR4nO39eXiU9b34/78mAYKiRFB2EFRs0aMiLhU3BFzADXdcUcRae863aPXU9tgqBrVFW7WtWnuOWmVRESwqtQqKC+AGBQW1biibIJtrglAikPn94Y98TBNwS/LGmcfjuuaqM/edySuDNk/uNZPNZrMBAACJFKQeAACA/CZIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghSAzc4999wThx9+eLRo0SKKioqiRYsWccQRR8S9996bejSgDmSy2Ww29RAAEBGxfv366N+/fzz00EORzWajcePG0apVq1i+fHmsWbMmMplMHH/88XH//fdHQYFtKpAr/NcMwGbjpptuigcffDAOPPDAeO6552L16tUxf/78WL16dTz//PNx0EEHxUMPPRQ333xz6lGBWmQLKQCbjT333DPWrFkTr776ajRs2LDa8rVr18Yee+wRRUVFMXv27PofEKgTtpACsNmYM2dO9OvXr8YYjYho2LBhHHvssTFnzpx6ngyoS4IUgM1Go0aNYtWqVZtcZ9WqVdGoUaN6mgioD4IUgM1Gt27dYuzYsbFkyZIaly9dujTGjh0be+21Vz1PBtQlQQrAZuOSSy6JDz/8MPbZZ5+44YYbYubMmbFo0aKYOXNmXH/99bH33nvHRx99FJdccknqUYFa5KQmADYrN954Y/zP//xPrF+/vsrr2Ww2GjRoENddd11cfPHFiaYD6oIgBWCzM2/evLjnnnti9uzZUVZWFk2bNo1u3brFGWecETvuuGPq8YBaJkgBAEjKMaQAACTVIPUAAOSvqVOnfuOv7dGjRy1OAqRklz0AyRQUFEQmk/lGX/vvJz0B3122kAKQzJAhQ75xkAK5wxZSAACSclITAJuNq666KkaNGpV6DKCeCVIANhvXXHNNvPrqq6nHAOqZIAVgs7H99tvHJ598knoMoJ4JUgA2G6eddlpMnDgxSktLU48C1CMnNQGw2SgvL4+TTjopli5dGldddVXsu+++0bJly9RjAXVMkAKw2SgsLIyIiGw2u8nLQWUymVi3bl19jQXUMdchBWCzcfDBB7suKeQhW0gBAEjKSU0AACQlSAEASMoxpABsVtavXx9jx46NJ554IpYsWRLl5eXV1slkMvHkk08mmA6oC4IUgM3GqlWr4ogjjohp06ZVnmn/xVMdNjx34hPkFrvsAdhsXHPNNfHCCy/E0KFD44MPPohsNhslJSWxdOnSGDNmTOy4445xyimn1LjVFPjuEqQAbDYeeOCB6N69e1x++eXRvHnzytdbtWoVp5xySjz99NPxxBNPxO9+97uEUwK1TZACsNl49913o3v37pXPCwoKqmwNbd++fRx99NExYsSIFOMBdUSQArDZaNKkSRQU/L9fTcXFxbF06dIq67Ru3Trefffd+h4NqEOCFIDNRseOHavE5m677RZPPfVU5VbSbDYbTz75ZLRp0ybViEAdEKQAbDYOPfTQePrppyvvU3/OOefEu+++G/vvv39ceumlcdBBB8Xs2bPjpJNOSjwpUJvcOpQvtXLlymjYsGE0btw49ShAjnv77bfjgQceiLPPPrtyK+jgwYPj1ltvrbz800knnRQjRoyILbfcMuWoQC0SpGzSW2+9Fbvuumt06dIlXnvttdTjAHnq/fffj3nz5kXHjh2jdevWqccBapkL47NJo0aNimw2G2+++WbMnDkz9tlnn9QjAXmoRYsW0aJFi9RjAHXEMaRs0t133x0777xzFBQUxKhRo1KPAwDkILvs2agpU6ZE796948Ybb4yJEyfGSy+9FEuWLInCwsLUowE5ascdd/xK62UymZg7d24dTwPUF1tI2aiRI0dGYWFhnHHGGXHGGWfEBx98EBMmTEg9FpDDKioqIpvNVnt88sknsWDBgliwYEGUl5dHRUVF6lGBWmQLKTVas2ZNtGrVKg488MB49NFHY9WqVdGqVas4+uijY8yYManHA/LQggUL4pJLLonly5fHpEmTnGUPOcQWUmr00EMPxcqVK+Oss86KiM/vntKvX794+OGHo7S0NPF0QD7q1KlTjBkzJj7++OP41a9+lXocoBYJUmo0cuTI2HrrreOEE06ofO2ss86KNWvWxP33359wMiCfNWzYMA4//PAYO3Zs6lGAWiRIqWbD7rDjjz8+tthii8rX+/TpEy1atIiRI0cmnA7Id6tXr46PPvoo9RhQLx5++OGYMWNG6jHqnCClmnvvvTcqKioqd9dvUFhYGP3794/nnnsu5s+fn2g6IJ8988wzMXr06Pj+97+fehSoc1OnTo3jjjsujj322Fi/fn3qceqUk5qoZq+99ooVK1bEokWLIpPJVFk2bdq0OOCAA2Lo0KFxxRVXJJoQyFW9e/eu8fV169bFe++9FwsWLIiIiPvvvz9OPPHEepwM6t8Pf/jDuPPOOyOTycT48ePjmGOOST1SnRGkVPHPf/4z9thjj7jkkkvi+uuvr3Gdzp07R0FBQcyZM6eepwNyXUFBzTvuMplMNGvWLPbdd9+45JJL4vDDD6/nyaB+rVmzJlq3bh177bVXzJw5M4488sicvsqNW4dSxQ477BDz58/f5C36pk2bFqtWrarHqYB84fqi8Lnx48fHypUr40c/+lF06NAh7r///igrK4umTZumHq1OOIaUKpo0aRIdO3bc5PX9tttuu+jYsWM9TgUA+WXUqFGVV7s588wzc/4qN4KUaqZOnRrvvvvuJtdZtGhRTJ06tZ4mAoD8sWLFinj88cfjhBNOiKKiojjssMOidevWOX2VG7vsqaZXr15x5ZVXxpAhQza6zsiRI2PIkCE5f9YfUL8GDRr0pesUFBRE06ZN4/vf/34cc8wx0a5du3qYDOrP6NGjY/369TFgwICI+Pzf+VNPPTVuuummWLBgQXTq1CntgHVAkFLNVznPraKiotoZ+ADf1vDhwyv/v6Wm/y/KZDJVXh88eHAMGTIkLr/88nqbEerayJEjo23btlWuOjFgwID44x//GHfffXdO/vtulz3fyNtvvx3FxcWpxwByzNy5c+OYY46Jli1bxm9+85uYMmVKvPnmmzFlypT4zW9+E61atYp+/frF9OnT47bbbou2bdvGlVdemdNnH5NfXn/99Zg1a1acfvrpVV7fa6+94vvf/36MGjUq0WR1yxZSIqL6brKHHnqo8np/X7R+/frK40ePPPLIepoOyBdjxoyJ6dOnx8svvxytWrWqfP173/teHHzwwTFw4MDYc8894+mnn46f//znceSRR8auu+4at956a5x66qkJJ4faMXLkyMhkMtVuThMRccYZZ0RJSUlMnz499ttvvwTT1R3XISUiql777993if27TCYT++67b9x9993RuXPn+hgPyBM777xzHHnkkXHTTTdtdJ3BgwfHxIkT4+23346IiDPPPDMeeeSR+OSTT+ppSqgb2Ww2tt9++2jevHm8/PLL1ZbPnz8/dtppp/iv//qvuOWWWxJMWHdsISUiovJWoNlsNnbcccf46U9/GhdddFG19QoLC6NZs2bRpEmT+h4RyAOLFy+OoqKiTa7TuHHjWLx4ceXz7bffPtasWVPXo0GdmzlzZjRo0CAuuOCCGpfvsMMOccwxx8T06dMjm83m1LkctpBSzYgRI6Jbt26xxx57pB4FyDOdO3eOTCYTr776ajRu3Lja8jVr1sTuu+8e2Ww23nnnnYiIOO+88+LRRx+NpUuX1ve4QC1xUhPVnHvuuXHdddelHgPIQ+edd17MnTs3DjrooPjb3/4WH374YUREfPjhh/G3v/0tDjrooJg3b16V496feeaZ6Nq1a6qRgVpglz3VFBcXR4cOHVKPAeShn//85/HGG2/E3XffHSeccEJEfH6M+4Zbimaz2TjjjDPif/7nfyIiYvny5XH00UdH3759k80MfHt22VPNEUccEYWFhTFhwoTUowB56qmnnopRo0bFK6+8Unn/7q5du8aZZ54Zhx56aOrxoNZ8m7se9ujRoxYnSUuQUs0LL7wQPXv2jNtvvz3OPvvs1OMAQM4qKCj4xicn5dLdEu2yp5pJkyZFz54949xzz42bb7459t1332jVqlW1/2AymUxcccUViaYEgO++IUOGVPv9Om3atHjsscdi5513jgMPPDBatWoVy5cvj+effz7mzJkTffr0ie7duyeauG7YQko1X7wm6aZkMpmc+tsZUP/efffdiIho165dFBYWVj7/Krbffvu6GguSeeaZZ+Lwww+PW265Jc4777wqsZrNZuP222+Piy66KCZNmhQHHXRQwklrlyClmilTpnzldQ855JA6nCQ/rVmzJmbMmBFLliyJ8vLyGtdxKAW5YsPuyjfeeCO+973vfeXdl5lMJtatW1cPE0L96tmzZ2y77bYxbty4ja5z4oknxscffxxPP/10PU5Wt+yypxqRmc6f/vSnuOKKK6K0tLTG5RsuhCxIyRVnn312ZDKZKC4urvIc8tWLL75Y441pvmiXXXbZ5N3MvosEKWwmHnjggRg8eHDsvvvuccUVV8R///d/x/HHHx/77bdfTJ06NSZMmBAnnXRSHHPMMalHhVozfPjwTT6HfNOoUaOYNWvWJteZNWtWNGrUqJ4mqh922bNJixYt2uSu41y65ERqPXr0iDlz5sS8efNiyy23jIKCgigpKYkhQ4ZERMS9994b55xzTuVJZ5CLRo4cGa1atYo+ffqkHgWSOP3002Ps2LHx61//Oi655JIq4fnZZ5/FDTfcEJdffnmceuqpce+99yactHYJUmr08MMPx6WXXhpvv/32JtdzUlPt2WabbaJ///5x2223RcTnx9ZdccUVMXTo0Mp1+vTpE2vXro2nnnoq1ZhQpxo2bBg/+clP4ve//33qUSCJxYsXR/fu3WPp0qXRsmXL2GeffaJly5axYsWKmDlzZqxYsSLatm0bL7zwQrRv3z71uLXGrUOpZvLkyXHCCSfEp59+Gj/5yU8im81Gjx494kc/+lHsuuuukc1m4+ijj67cckftWLt2bbRo0aLy+RZbbBGffPJJlXW6du0aL730Uj1PBvWnTZs2TlYir7Vv3z5mzpwZAwYMiNLS0njkkUfirrvuikceeSRKS0tjwIABMWPGjJyK0QhBSg2uvfba2GqrreLFF1+MP/7xjxER0atXr/jzn/8cr776avz617+OJ598Mo477rjEk+aWtm3bxtKlSyufd+zYsdpxRAsXLowGDRz6Te7q169fTJo0aaOHCUE+aN26dQwfPjxKS0vjlVdeiWeeeSZeeeWV+OSTT2L48OHRunXr1CPWOkFKNTNmzIjjjz8+WrVqVfnahvtIR0Rcdtll0a1bN1tIa9m+++5bZetn375947nnnothw4bFa6+9Fv/3f/8XDzzwQOy7774Jp4S69etf/zqaNGkSJ554Yrz22mupx4GkGjZsGLvttlsceOCBsdtuu+XciUxfJEipZvXq1dGuXbvK50VFRVFWVlZlne7du8dzzz1X36PltFNOOSXKy8tjwYIFEfF5+Ldv3z4uv/zy2GOPPeI///M/Y6uttorf/va3aQeFOtStW7dYtmxZTJw4MfbYY49o0qRJ7LDDDrHjjjtWeey0006pRwVqkX1/VNO6det4//33K5+3a9eu2paKDz/80AlNteyEE06IE044ofJ5ixYtYvbs2XHHHXfEvHnzomPHjjFgwIAqf1mAXFNRURGNGjWqdhemfz//1vm45LInnngibrzxxpgxY0Z88sknVfZSbpBrN4cQpFTTtWvX+Oc//1n5vFevXjFixIgYPXp09OvXL5599tkYO3Zs7L333gmnzA/NmjWLSy+9NPUYUG827CGAfDVu3Lg49dRTo6KiIjp27BhdunTJi3MHXPaJau688874yU9+Em+88UZ07Ngx5s+fH3vvvXeVuwc1aNAgJk2a5Dqktah3794xcODATd6F6e67744777zTZZ8AclTXrl1j3rx5MX78+Ojdu3fqceqNY0ipZtCgQbF69ero2LFjRETssMMOMWPGjPjxj38cRxxxRJx//vkxffp0MVrLJk+e/KVbhxYuXBhTpkypn4Egsddffz0eeOCBGDVqVOpRoN689dZbcdppp+VVjEbYZc9XtNNOO8Wf/vSn1GPkvVWrVkXDhg1TjwF1asaMGXH++efHq6++WvnagAEDIiJi6tSp0bdv37jvvvuiX79+qUaEOrPtttvGlltumXqMemcLKdUMGjQo/va3v21ynb///e8xaNCgepood7377ruVj4iITz75pMprGx7z58+PqVOnxrhx46JTp05ph4Y69Nprr0Xv3r1j/vz5cfHFF8eRRx5ZZfnBBx8c2223Xdx///2JJoS6dfLJJ8cTTzyRUycsfRWClGqGDx8es2fP3uQ6L7/8cowYMaJ+BsphnTp1ih122CF22GGHyGQy8cc//rHy+RcfnTt3jl69esXbb78d559/fuqxoc5ceeWVERHx4osvxvXXX1/turuZTCb233//mDFjRorxoM795je/iW222SZOPfXUyo0V+cAue76RNWvW5MVZf3Xt7LPPjkwmE9lsNkaOHBldu3aNPffcs9p6hYWF0bx58+jdu3f07du3/geFejJlypQ46aSTonPnzhtdZ/vtt4+JEyfW41RQf3bfffdYu3ZtTJs2LR566KHYZpttori4uNp6mUwm5s6dm2DCuqEoqFEmk6nx9Ww2G4sWLYoJEyZE27Zt63mq3DN8+PDKf54yZUqce+65ceGFF6YbCBJbuXJltGzZcpPr/Otf/3IdZHJWRUVFNGjQoMq1eGu6IFKuXSRJkBIREQUFBVUitKSkJEpKSja6fjabjV/84hf1MFn+mD9/fuoRILkOHTpUOZmpJi+99JI7NZGz8vVavIKUiIjo0aNHZZBOnTo1tt9++xpPnvnirmPHMgK17ZhjjombbropnnjiiTjssMOqLR87dmxMmzYtrrjiigTTAXXFhfGppqCgIEpKSmLIkCGpR8k7K1eujFtuuSWeeOKJWLJkSZSXl1dbJ9eOG4Ivev/992OvvfaK5cuXxznnnBPLli2LRx99NG6++eZ44YUXYvTo0bH99tvHrFmzajyuDnLJ66+/Hm+++WasWrWq8tJnuUqQwmbi/fffjwMOOCDmzp0bTZs2jbKysiguLo7PPvss/vWvf0VERNu2baNhw4Z275PT5s2bFwMGDIgXXnih2rL99tsvRo8e7fJn5LSarsW74bjpXL0WryClRhUVFVFQUPWqYC+88EL8/e9/j8aNG8e5554b7du3TzRdbvr//r//L/785z/HyJEj48wzz4zCwsLKLdUzZsyIwYMHR4MGDeLxxx/Py4smk39mz54d06ZNi48++iiaNm0a++23X7XLQEGuee2116J79+5RUFAQ559/frz55psxYcKEyiDNZrPRsWPHOOSQQ3LqLmaClGouvvji+POf/xzLli2LbbbZJiIi/vrXv8Zpp50WFRUVERGx3XbbxUsvvSRKa9GG641OmjQpIqofOvHxxx/H7rvvHmeeeWZcd911KUfNC/m0qwzYfJx88snx2GOPxaxZs6Jz584xdOjQuOqqq6pcWeLUU0+Nl19+Od58882Ek9YuF8anmqeffjp69+5dGaMREUOGDIni4uIYOXJk/Pa3v42PP/44rr/++nRD5qClS5dGt27dKp8XFhZW7qqPiGjWrFkceeSRMXbs2BTj5Y0ZM2bEnnvuGbvvvnuccsopMXDgwMplU6dOjS233PJL72TGNzdgwICYNGlSzl3SBr6qr3ot3qVLl9bjVHVPkFLNokWLYuedd658Pn/+/HjzzTfjwgsvjLPOOit+9rOfxVFHHeXC1LWsuLg41q5dW/m8WbNmsXjx4irrNG3aNJYvX17fo+UNt61M75577om+fftG+/bt42c/+9mX3jUOck2+XotXkFLNqlWrokmTJpXPp0yZEplMpsov51133bVaLPHt7LjjjlWuP9etW7eYNGlSfPjhhxHx+f8BPfzww1UulkztctvK9F588cW48MILo6KiIm688cbYe++9Y/fdd4/f/e538d5776UeD+pcvl6LV5BSTdu2beOtt96qfD5x4sTYaqutYu+99658raysLIqKilKMl7OOOOKIePLJJ2P16tUREXHBBRfEihUromvXrnHKKafEbrvtFnPnzq2yC5nala+7yjYn3bp1i9///vfx3nvvxSOPPBKnnXZazJ8/P37xi19Ex44d47DDDosRI0bEp59+mnpUqBPHHHNMPP744/HEE0/UuHzDtXiPP/74+h2sjglSqjnkkEPikUceiVtuuSXuuOOOeOCBB6JPnz5RWFhYuc7cuXOd0FTLfvzjH8ftt99eGaQnnnhi/O53v4tVq1bFuHHjYtmyZXHJJZfEpZdemnjS3JWvu8o2RwUFBXHkkUfGPffcE8uXL4+77rorevXqFZMnT45BgwZF69atU48IdeKXv/xltG3bNo466qg4//zzY+bMmRERceutt8aAAQPijDPOiE6dOsUll1ySeNLa5Sx7qnnnnXdi3333jbKysshms9GkSZOYPn167LrrrhHx+S/tVq1axcCBA+PWW29NPG3uW79+fXzwwQfRsmXLKrd3pfbtvPPO0blz55gwYUJERI1ntx5wwAGxatWqePnll1ONmbc+/fTTuOmmm2Lo0KGxbt06fzEgZ+XjtXjdOpRqOnfuHK+//nqMGzcuIiKOPfbY6NixY+Xyt99+Oy644II444wzUo2YkwYNGhS77757XHzxxVVeLywsjFatWiWaKr+4beXmp6KiIh577LG4++67Y/z48fGvf/0rMplMjX8+kCt23HHHeO655/LqWry2kMJmonHjxnHxxRfHsGHDUo+St9y2cvMxc+bMuPvuu+O+++6L999/P7LZbOy+++6Vuyzbtm2bekSgFglSqliyZEnMnDkz9tprr40eIzpjxoxYtmxZHHPMMXYh16L/+I//iH333TeGDx+eepS8lo+7yjYn11xzTdxzzz0xZ86cyGaz0aZNmzjjjDNiwIABsccee6QeD+pUPv8OFqRUsXjx4ujYsWOce+65cccdd1Rbvn79+mjXrl1sv/328Y9//CPBhLnrhhtuiGuvvTZmz54d7dq1Sz1O3sunXWWbk4KCgmjSpEmccMIJMWDAgDj00EOr3cYYclU+/w4WpFTTu3fvmDVrVixbtqzapZ0mTpwYRx11VPzxj3+MwYMHJ5owNy1YsCB+8pOfxKuvvho///nPY999941WrVrV+Ddg1yIlV919991x4oknxpZbbpl6FEgiX38HC1KqGT58eJx33nkxZsyYOPnkk6ssGzBgQIwdOzaWLFkS2267baIJc1NBQUFkMpnIZrOb3A2TyWRi3bp19ThZ7ho0aNA3+rpMJhN/+ctfanka/t2GK0yU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RowYEYccckj07Nmzctk222xT+c+DBw+OadOmxdFHHx3HHntstGzZMk4++eQYNmxY3HHHHdG/f/9q73377bdHgwYN4txzz62HnwQAIPflbJBGRIwYMSJ69uy50RObXnnllZg1a1Zsv/32VV7v06dPTJw4MRYsWBCdOnWqfP21116LadOmxfHHHx+tW7eu8T3Ly8ujvLy88nlZWdm3+lkAAHJdTu6y/6ouvfTSajEaEfHjH/84stls/OUvf6ny+h133BEREeeff/5G33PYsGFRXFxc+ejQoUPtDg0AkGPyOkh/8IMf1Pj60UcfHe3atYu77ror1q9fHxERn332WYwaNSo6dOgQffv23eh7XnbZZVFaWlr5WLRoUZ3MDgCQK/I6SFu1alXj64WFhfHDH/4w3nvvvZgwYUJERDz44IPx4YcfxqBBg6KgYOMfW1FRUTRt2rTKAwCAjcvrIM1kMhtd9sMf/jAKCwvj9ttvj4jPd9cXFBTEoEGD6ms8AIC8kLNBWlhYGBFRucv962rfvn0cffTR8eijj8bzzz8fTz75ZPTp06fGY04BAPjmcjZImzdvHhHxrY7hvOCCC2LdunVxyimnRDab3eTJTAAAfDM5edmniIguXbpE27Zt47777ouioqJo3759ZDKZGDx48Fd+j759+0bHjh1j4cKF0bp16zj22GPrcGIAgPyUs1tICwsL44EHHoju3bvH6NGjY8iQIXHFFVfExx9//JXfo6CgIAYMGBAREQMHDowGDXK23wEAkslks9ls6iE2Z8ccc0w8+uijMWfOnOjcufPX/vqysrIoLi6OnnFcNMg0rIMJAQA2T+uya2NyjI/S0tJNXnkoZ7eQ1obXX389Hn300Tj88MO/UYwCAPDl7IOuwb333htvvfVWjBw5MiIirrzyysQTAQDkLkFag9tuuy2eeeaZ6NixY/zlL3+JAw44IPVIAAA5S5DWYPLkyalHAADIG44hBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAF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22yzzUa/5uWXX46DDz44Vq1aFSeeeGLsvPPOMXPmzDjooIOia9eutTbbO++8E927d4/dd989Bg4cGB9++GHlFtzLLrssrr322mjXrl2ceOKJUVxcHM8880xceumlMX369Lj//vtrbQ4AgHxX50Has2fPyi2UJSUllcu+uDXyi37yk5/EypUr45577okzzjij8vUhQ4bE1VdfXWuzPffcczFkyJAYOnRoldcnTZoU1157bfTp0yfGjRsXTZo0iYiIbDYb//Vf/xX/+7//G+PGjYuTTjqpxvctLy+P8vLyyudlZWW1NjMAQC7arK5DunDhwnj22Weja9euVWI0IuIXv/hFNGvWrNa+V+vWreNXv/pVtddvueWWiIi47bbbKmM0IiKTycS1114bmUwmRo8evdH3HTZsWBQXF1c+OnToUGszAwDkono5qemrevnllyMi4sADD6y2rEmTJrHnnnvG008/XSvfq2vXrlVOstpg2rRp0aRJk7jzzjtr/Lotttgi3nzzzY2+72WXXRaXXHJJ5fOysjJRCgCwCZtVkG7Yvd2yZcsal7dq1arWvtfG3uujjz6KdevWVduV/0WrVq3a6LKioqIoKir61vMBAOSLzSpImzZtGhERK1asqHH58uXLq71WUPD5UQfr1q2rtqy0tHSj3yuTyWx0hkwmEx988MGXzgsAwLe3WR1DuuEs+ueff77astWrV1fu0v+iDceVvvfee9WWzZo162vPsN9++8WHH34Yb7/99tf+WgAAvr7NKkg7duwYBx54YMyePTvGjBlTZdnvfve7+Oijj6p9zb777hsRESNHjoyKiorK11944YW45557vvYMF154YUREDBo0KD788MNqy5ctWxZvvPHG135fAABqtlntso+IuPnmm6NHjx5x5plnxrhx46Jz587x0ksvxbRp06JHjx4xderUyt30ERHdu3ePAw88MJ566qnYf//9o0ePHrFw4cIYP358HHvssfHggw9+re/ft2/fuOKKK+Lqq6+Ozp07R9++faNjx47x4YcfxjvvvBPPPPNMXHPNNbHLLrvU9o8OAJCXNqstpBER3bp1i2eeeSYOO+ywmDBhQtxyyy1RUFAQzz77bOUxphv+d4Px48fH2WefHe+880786U9/ikWLFsXDDz8c/fr1+0YzXHXVVTFp0qQ4+OCD48knn4wbb7wx/v73v0d5eXmUlJTEmWee+a1/TgAAPpfJZrPZ1EN8FevXr4+ddtop/vWvf9V4ctPmqqysLIqLi6Nn5vhokGmYepy8lCksTD1C3su48kRSb97SJfUIea3pK/79T63NLTNTj5C31mXXxtNr74/S0tJqGxS/aLPbQrpu3boaz3C/9tprY+HChXH88cfX/1AAANSZze4Y0k8//TTatWsXhx9+eHzve9+LtWvXxvTp02PGjBnRpk2bKrcfBQDgu2+zC9Itt9wyzjvvvHjqqadi6tSpsWbNmmjTpk1ccMEFccUVV0SbNm1SjwgAQC3a7IK0UaNGceutt6YeAwCAerLZHUMKAEB+EaQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBIqkHqAfJGNhsR2dRT5KXsunWpR8h7/gzS2vXypalHyGvdHlmUeoS899Lju6YeIW8VrC+PeOMrrFf3owAAwMYJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApATpv1mwYEFkMpkYOHBg6lEAAPKCIP0KevbsGZlMJvUYAAA5qUHqATY37dq1izfeeCOKi4tTjwIAkBcE6b9p2LBhdOnSJfUYAAB5wy77f/Pvx5BmMpmYMmVK5T9veDjGFACgdthC+iWuvPLKGD58eCxcuDCuvPLKytf33HPPdEMBAOQQQfolSkpKYvLkybFw4cIoKSn50vXLy8ujvLy88nlZWVkdTgcA8N1nl30tGzZsWBQXF1c+OnTokHokAIDNmiCtZZdddlmUlpZWPhYtWpR6JACAzZpd9rWsqKgoioqKUo8BAPCdYQspAABJCdKvoLCwMCIi1q9fn3gSAIDcI0i/gubNm0dEOB4UAKAOOIb0K+jdu3f89a9/jZNOOimOPPLIaNy4cXTt2jWOPfbY1KMBAHznCdKv4Pzzz48FCxbEfffdF9ddd12sW7cuzjnnHEEKAFALBOm/6dSpU2Sz2SqvNWjQIK677rq47rrrEk0FAJC7HEMKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJBUg9QDAFC31i9fkXoESOqzlk1Sj5C31q0rjHjjy9ezhRQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBOlXkMlkomfPnqnHAADISYIUAICkBCkAAEnlVJDeddddsd9++8VWW20VW221Vey3334xfPjwKusMHz48MplMtdcjIiZPnhyZTCZKSkqqPI+ImDJlSmQymcpHTV8PAMDX1yD1ALXlwgsvjJtvvjnatWsX5513XkREjBs3Ls4999yYNWtW/PGPf/za79mpU6e48sorY+jQodGxY8cYOHBg5bI999yzliYHAMhvORGkU6dOjZtvvjl22WWXeOGFF6K4uDgiIkpKSqJ79+5x0003xcknnxwHH3zw13rfTp06RUlJSQwdOrTyn79MeXl5lJeXVz4vKyv7Wt8TACDf5MQu+xEjRkTE5wG6IUYjIpo1axZXXnllRES97WIfNmxYFBcXVz46dOhQL98XAOC7KieCdNasWRERNV6aqVevXhERMXv27HqZ5bLLLovS0tLKx6JFi+rl+wIAfFflxC77srKyKCgoiBYtWlRb1qpVq8hkMvW267yoqCiKiorq5XsBAOSCnNhC2rRp06ioqIj333+/2rIVK1ZENpuNpk2bRkREQcHnP/K6deuqrVtaWlq3gwIAUE1OBGm3bt0i4vPLNP27Da9tOCu+WbNmERHx3nvvVVt3w67/f1dQUBDr16//9oMCAFBNTgTpOeecExERQ4cOrbJrvrS0NIYOHVplnb333jsymUzcd999sWbNmsp133777Y1eGqp58+axePHiuhofACCv5cQxpD169IjBgwfHzTffHLvttlucdNJJkc1mY9y4cbF48eK48MILo0ePHhER0bZt2zj99NPj3nvvjb333jv69u0bK1asiAcffDD69u0b48aNq/b+vXv3jrFjx8bxxx8f3bp1i8LCwujXr1/sscce9f2jAgDknJwI0oiIm266Kbp16xZ//vOf47bbbouIiP/4j/+Iq666Ks4999wq695xxx2x3XbbxZgxY+JPf/pTfP/734/bbrst2rZtW2OQbthy+tRTT8XDDz8cFRUV0b59e0EKAFALMtlsNpt6iFxWVlYWxcXF0TOOiwaZhqnHAfJQpkHObHv4TtpnZvmXr0SdmnbxvqlHyFvr1q2JZ6ZeFaWlpZUnmNckJ44hBQDgu0uQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkmqQegAA6lZ23brUI+S1WUd3SD1C3rvxuVtTj5C3Pl1ZEQfv9uXr2UIKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkFSD1APkmvLy8igvL698XlZWlnAaAIDNny2ktWzYsGFRXFxc+ejQoUPqkQAANmuCtJZddtllUVpaWvlYtGhR6pEAADZrdtnXsqKioigqKko9BgDAd4YtpAAAJCVIAQBISpB+DXPnzo0333wz1q5dm3oUAICcIUi/hkMPPTR22WWXeO+991KPAgCQMwQpAABJOcv+a1iwYEHqEQAAco4tpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQapB4AAHLZuqXLU4+Q9/Zo1Dj1CHmrrFHFV1rPFlIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSypsgLSkpiUwmE5MnT049CgAAX5A3QQoAwOZJkAIAkFSdBumiRYvivffeq8tv8a394x//iIqKitRjAADkrVoP0pUrV8bw4cOjd+/e0bFjx5gxY0aV5StWrIiLL744OnfuHEVFRbHddtvFSSedFP/85z+rvVenTp2iU6dO8emnn8ZFF10Ubdu2jaKiothjjz3ir3/9a43ff9GiRXH66adH8+bNY6uttopDDjkkpk6dutF5+/fvH9tvv3384he/iNdee+3b/fAAAHxttRKk69evj4kTJ8aZZ54ZrVu3jnPPPTdefPHFOOecc2KvvfaqXG/u3Lmx9957xx/+8IfYaaedYvDgwXHUUUfFxIkTo3v37jF9+vRq77127do44ogj4vHHH4+TTjopzjrrrJg7d270798/Hn/88SrrLl26NPbff/+477774gc/+EFceOGF0bx58zj88MNj2rRpNc7+s5/9LJo1axa//e1vY7fddou99tor/vCHP8Ty5ctr46MBAOBLZLLZbPabfvHLL78cI0eOjHvvvTeWLVsWDRs2jCOOOCIGDBgQ/fr1iy222KLK+gceeGBMnz49HnnkkejTp0/l63PmzIl99tknOnXqFK+88krl6506dYqFCxfGcccdF2PHjo1GjRpFRMSTTz4Zhx12WPTp0ycmTpxYuf7AgQNjxIgRcc0118SvfvWrytdvu+22uOCCCyIi4umnn46ePXtW+1lmz54dd999d4wePTqWLFkSDRo0qPxZjjvuuGo/y8aUl5dHeXl55fOysrLo0KFD9IzjokGm4Vd6DwBySEFh6gny3mOLX0w9Qt4qW1kRzb43L0pLS6Np06YbXe9rB+mSJUvi3nvvjZEjR8arr74aERH77bdfnHXWWXHaaafFdtttV+PXzZo1K/baa68YNGhQ/OUvf6m2/L//+7/jxhtvjFdffTV22223iPh/QTpv3rzYYYcdqqzfqVOnWLlyZXz44YcREfHZZ59FcXFxNG3aNBYuXBiNGzeuXLeioiK6dOkSb7/99kaD9IvrPvXUUzFq1Kh48MEHY+XKldG0adM4+eST4+yzz44ePXpEJpPZ6NeXlJTE0KFDq70uSAHylCBNTpCm81WDtMHXfeMDDzwwFixYEC1btowrr7wyzjrrrOjcufOXft2GXebLly+PkpKSasvffPPNyv/dEKQREdtss021GI2IaN++fbzwwguVz996661Ys2ZN9O7du0qMRkQUFBTEgQceGG+//faXzllQUBCHHXZYHHbYYfG///u/8dBDD8Vtt90Wd955Z9x5553x0EMPxXHHHbfRr7/sssvikksuqXy+YQspAAA1+9pButtuu8WCBQtixYoVMXHixNhuu+3i1FNPjRYtWmzy6z766KOIiHjkkUfikUce2eh6q1atqvK8uLi4xvUaNGhQ5ez40tLSiIho2bJljeu3atVqk/P9u/Xr18czzzwTEydOjJkzZ0ZExHbbbRetW7fe5NcVFRVFUVHR1/peAAD57Guf1PTwww/HnDlz4vLLL4/ly5fH4MGDo23btnHUUUfFvffeWy0oN9iwmfbmm2+ObDa70cc555zzjX6QDeG6YsWKGpd/1ZOUXnzxxbj44oujffv20adPnxgzZkz07ds3xo8fH0uWLIn99tvvG80HAEDNvtFZ9jvvvHNcffXVMW/evJgyZUoMHDgwnn/++TjzzDOjVatWcdZZZ8WECRNi3bp1lV+zIeS+uJu9Nn3ve9+Lxo0bx8yZM2PNmjVVllVUVMTzzz+/0a+dN29eXH311dGlS5fYZ599Kq8C8H//93+xbNmyuP/++6Nfv37RsKFjQAEAatu3uuxTJpOJHj16xO233x7Lli2LMWPGRM+ePWPMmDFx1FFHRbt27Sov5fSDH/wg9ttvvxg9enSMGTOm2ntVVFTElClTvvEsRUVF0b9//1ixYkXccMMNVZbdcccdMWfOnBq/rl+/frHTTjvFkCFDYv369VFSUhJz586NZ599Nn70ox/FNtts841nAgDgy33tY0g3pnHjxtG/f//o379/vP/++3HvvffGqFGjYtmyZZXrjB49Onr16hWnnXZa/OEPf4i99tortthii3j33XfjhRdeiPfff7/a1s2v49prr40nn3wyLr/88nj22WejW7du8cYbb8Sjjz5aeS3Tf/fee+/Fj3/84xgwYEAccMAB3/h7AwDwzdRakH5RixYt4qKLLoqLLroo1q9fX/n6DjvsELNmzYobb7wxHnroobjrrruisLAw2rRpEz169IiTTz75W33fNm3axPPPPx8///nP47HHHoupU6fG3nvvHZMmTYqnnnqqxiD9xz/+EYWFLskBAJDKt7owPl+urKwsiouLXYcUIF+5DmlyrkOazle9Dmmt38seAAC+DkEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBIqkHqAQAgp1WsTz1B3uvTds/UI+Stddm1ETHvS9ezhRQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkFSD1APkmvLy8igvL698XlZWlnAaAIDNny2ktWzYsGFRXFxc+ejQoUPqkQAANmuZbDabTT1ELqlpC2mHDh2iZxwXDTINE04GAFC/1mXXxuQYH6WlpdG0adONrmeXfS0rKiqKoqKi1GMAAHxn2GUPAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkmqQeoBcl81mIyJiXayNyCYeBgCgHq2LtRHx/3poYwRpHVu5cmVERDwbjyaeBAAgjZUrV0ZxcfFGl2eyX5asfCsVFRWxZMmS2HrrrSOTyaQe52srKyuLDh06xKJFi6Jp06apx8k7Pv/0/Bmk5fNPy+efVi58/tlsNlauXBlt27aNgoKNHylqC2kdKygoiPbt26ce41tr2rTpd/Y/hlzg80/Pn0FaPv+0fP5pfdc//01tGd3ASU0AACQlSAEASEqQsklFRUVx5ZVXRlFRUepR8pLPPz1/Bmn5/NPy+aeVT5+/k5oAAEjKFlIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEn9/wCo/iT9FJd3PAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 翻訳あやまりの例\n", "translate(u'trata de averiguarlo.')" ] }, { "cell_type": "markdown", "metadata": { "id": "RTe5P5ioMJwN" }, "source": [ "## 次のステップ\n", "\n", "* [異なるデータセットをダウンロード](http://www.manythings.org/anki/)して翻訳の実験を行ってみよう。たとえば英語からドイツ語や、英語からフランス語。\n", "* もっと大きなデータセットで訓練を行ったり、もっと多くのエポックで訓練を行ったりしてみよう。" ] } ], "metadata": { "accelerator": "GPU", "colab": { "collapsed_sections": [], "name": "nmt_with_attention.ipynb", "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.16" } }, "nbformat": 4, "nbformat_minor": 0 }