Skip to content

Instantly share code, notes, and snippets.

@BrikerMan
Created May 14, 2019 10:52
Show Gist options
  • Save BrikerMan/12e4794d7078f03d9a5d0b6f38b48931 to your computer and use it in GitHub Desktop.
Save BrikerMan/12e4794d7078f03d9a5d0b6f38b48931 to your computer and use it in GitHub Desktop.
seq2seq.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "seq2seq.ipynb",
"version": "0.3.2",
"provenance": [],
"include_colab_link": true
},
"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.6.7"
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/BrikerMan/12e4794d7078f03d9a5d0b6f38b48931/seq2seq.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "OYB21k7k9nTl",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 479
},
"outputId": "8a3f90af-a9a6-4276-e839-953845f58d0a"
},
"source": [
"!pip install gensim hanziconv"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Requirement already satisfied: gensim in /usr/local/lib/python3.6/dist-packages (3.6.0)\n",
"Collecting hanziconv\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/63/71/b89cb63077fd807fe31cf7c016a06e7e579a289d8a37aa24a30282d02dd2/hanziconv-0.3.2.tar.gz (276kB)\n",
"\u001b[K |████████████████████████████████| 286kB 4.9MB/s \n",
"\u001b[?25hRequirement already satisfied: scipy>=0.18.1 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.2.1)\n",
"Requirement already satisfied: six>=1.5.0 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.12.0)\n",
"Requirement already satisfied: numpy>=1.11.3 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.16.3)\n",
"Requirement already satisfied: smart-open>=1.2.1 in /usr/local/lib/python3.6/dist-packages (from gensim) (1.8.3)\n",
"Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim) (2.21.0)\n",
"Requirement already satisfied: boto3 in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim) (1.9.145)\n",
"Requirement already satisfied: boto>=2.32 in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim) (2.49.0)\n",
"Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (2.8)\n",
"Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (1.24.3)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (2019.3.9)\n",
"Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->smart-open>=1.2.1->gensim) (3.0.4)\n",
"Requirement already satisfied: s3transfer<0.3.0,>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim) (0.2.0)\n",
"Requirement already satisfied: botocore<1.13.0,>=1.12.145 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim) (1.12.145)\n",
"Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim) (0.9.4)\n",
"Requirement already satisfied: python-dateutil<3.0.0,>=2.1; python_version >= \"2.7\" in /usr/local/lib/python3.6/dist-packages (from botocore<1.13.0,>=1.12.145->boto3->smart-open>=1.2.1->gensim) (2.5.3)\n",
"Requirement already satisfied: docutils>=0.10 in /usr/local/lib/python3.6/dist-packages (from botocore<1.13.0,>=1.12.145->boto3->smart-open>=1.2.1->gensim) (0.14)\n",
"Building wheels for collected packages: hanziconv\n",
" Building wheel for hanziconv (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Stored in directory: /root/.cache/pip/wheels/03/d8/3c/c39898fa9c9ce6e34b0ab4c6604892462d440c743715c94054\n",
"Successfully built hanziconv\n",
"Installing collected packages: hanziconv\n",
"Successfully installed hanziconv-0.3.2\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "GEglTfJU9xBp",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from tensorflow.keras.utils import to_categorical\n",
"from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
"import collections\n",
"import operator\n",
"from typing import List, Dict\n",
"\n",
"import os\n",
"import json\n",
"import gensim\n",
"import numpy as np\n",
"import pathlib\n",
"import tensorflow as tf\n",
"from tensorflow.python.keras.preprocessing.sequence import pad_sequences\n",
"from hanziconv import HanziConv"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "FzDZspNP9nTo",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "1a088554-bf25-4d87-bdb9-02488421dc46"
},
"source": [
"tf.__version__"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'1.13.1'"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "iY1BEz9y9nTu",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 258
},
"outputId": "3b733040-6f97-4893-9c65-c9b3c2df8e42"
},
"source": [
"## data from http://www.manythings.org/anki/ Chinese (Mandarin) - English cmn-eng.zip (21007)\n",
"\n",
"data_path = 'cmn.txt'\n",
"df = pd.read_table(data_path,header=None)\n",
"\n",
"df.columns=['inputs','targets']\n",
"df.head()"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:3: FutureWarning: read_table is deprecated, use read_csv instead, passing sep='\\t'.\n",
" This is separate from the ipykernel package so we can avoid doing imports until\n"
],
"name": "stderr"
},
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inputs</th>\n",
" <th>targets</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Hi.</td>\n",
" <td>嗨。</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Hi.</td>\n",
" <td>你好。</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Run.</td>\n",
" <td>你用跑的。</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Wait!</td>\n",
" <td>等等!</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Hello!</td>\n",
" <td>你好。</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inputs targets\n",
"0 Hi. 嗨。\n",
"1 Hi. 你好。\n",
"2 Run. 你用跑的。\n",
"3 Wait! 等等!\n",
"4 Hello! 你好。"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "tFUJl8hy9nTw",
"colab_type": "code",
"colab": {},
"outputId": "4db170a7-7c3d-41ae-c187-1340385fd17d"
},
"source": [
"#讲每句中文句首加上'\\t'作为起始标志,句末加上'\\n'作为终止标志\n",
"# df['targets'] = df['targets'].apply(lambda x: '\\t'+x+'\\n')\n",
"\n",
"df['inputs'] = df['inputs'].apply(lambda x: x[:-1].strip())\n",
"df['targets'] = df['targets'].apply(lambda x: x[:-1].strip())\n",
"\n",
"# df['inputs'] = df['inputs'].apply(lambda x: HanziConv.toSimplified(x))\n",
"df['targets'] = df['targets'].apply(lambda x: HanziConv.toSimplified(x))\n",
"\n",
"df['cutted_inputs'] = df['inputs'].apply(lambda x: x.split(' '))\n",
"df['cutted_targets'] = df['targets'].apply(lambda x: ['<BOS>'] + list(x) + ['<EOS>'])\n",
"df.head()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inputs</th>\n",
" <th>targets</th>\n",
" <th>cutted_inputs</th>\n",
" <th>cutted_targets</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Hi</td>\n",
" <td>嗨</td>\n",
" <td>[Hi]</td>\n",
" <td>[&lt;BOS&gt;, 嗨, &lt;EOS&gt;]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Hi</td>\n",
" <td>你好</td>\n",
" <td>[Hi]</td>\n",
" <td>[&lt;BOS&gt;, 你, 好, &lt;EOS&gt;]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Run</td>\n",
" <td>你用跑的</td>\n",
" <td>[Run]</td>\n",
" <td>[&lt;BOS&gt;, 你, 用, 跑, 的, &lt;EOS&gt;]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Wait</td>\n",
" <td>等等</td>\n",
" <td>[Wait]</td>\n",
" <td>[&lt;BOS&gt;, 等, 等, &lt;EOS&gt;]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Hello</td>\n",
" <td>你好</td>\n",
" <td>[Hello]</td>\n",
" <td>[&lt;BOS&gt;, 你, 好, &lt;EOS&gt;]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inputs targets cutted_inputs cutted_targets\n",
"0 Hi 嗨 [Hi] [<BOS>, 嗨, <EOS>]\n",
"1 Hi 你好 [Hi] [<BOS>, 你, 好, <EOS>]\n",
"2 Run 你用跑的 [Run] [<BOS>, 你, 用, 跑, 的, <EOS>]\n",
"3 Wait 等等 [Wait] [<BOS>, 等, 等, <EOS>]\n",
"4 Hello 你好 [Hello] [<BOS>, 你, 好, <EOS>]"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "JCZDj_nT9nTz",
"colab_type": "code",
"colab": {}
},
"source": [
"class Tokenizer(object):\n",
"\n",
" def __init__(self):\n",
" self.input2idx = {} # token 索引字典\n",
" self.input2count = collections.OrderedDict() # token 词频表\n",
" self.output2idx = {} # 标签索引词典\n",
" self.output2count = collections.OrderedDict() # token 词频表\n",
"\n",
" def build_token_dict(self, corpus: List[List[str]]):\n",
" \"\"\"\n",
" 构建 token 字典,这个方法将会遍历分词后的语料,构建一个标记频率字典和标记与索引的映射字典\n",
" Args:\n",
" corpus: 所有分词后的语料\n",
" \"\"\"\n",
" token2idx = {\n",
" '<PAD>': 0,\n",
" '<UNK>': 1,\n",
" '<BOS>': 2,\n",
" '<EOS>': 3\n",
" }\n",
"\n",
" token2count = {}\n",
" for sentence in corpus:\n",
" for token in sentence:\n",
" count = token2count.get(token, 0)\n",
" token2count[token] = count + 1\n",
" # 按照词频降序排序\n",
" sorted_token2count = sorted(token2count.items(),\n",
" key=operator.itemgetter(1),\n",
" reverse=True)\n",
" token2count = collections.OrderedDict(sorted_token2count)\n",
"\n",
" for token in token2count.keys():\n",
" if token not in token2idx:\n",
" token2idx[token] = len(token2idx)\n",
" return token2idx, token2count\n",
" \n",
" def build_from_w2v(self, w2v_path: str):\n",
" \"\"\"\n",
" 使用预训练词嵌入构建词表和词向量表\n",
" Args:\n",
" w2v_path: 预训练词嵌入文件路径\n",
" \"\"\"\n",
" w2v = gensim.models.KeyedVectors.load_word2vec_format(w2v_path)\n",
"\n",
" token2idx = {\n",
" '<PAD>': 0, # 由于我们用 0 补全序列,所以补全标记的索引必须为 0\n",
" '<UNK>': 1, # 新词标记的索引可以使任何一个,设置为 1 只是为了方便\n",
" '<BOS>': 2,\n",
" '<EOS>': 3\n",
" }\n",
"\n",
" # 我们遍历预训练词嵌入的词表,加入到我们的标记索引词典\n",
" token_index_list = []\n",
" for index, token in enumerate(w2v.index2word):\n",
" if len(token) == 1 and token not in token2idx:\n",
" token2idx[token] = len(token2idx)\n",
" token_index_list.append(index)\n",
" \n",
"\n",
" # 初始化一个形状为 [标记总数,预训练向量维度] 的全 0 张量\n",
" vector_matrix = np.zeros((len(token2idx), w2v.vector_size))\n",
" # 随机初始化 <UNK> 标记的张量\n",
" vector_matrix[1] = np.random.rand(300)\n",
" # 从索引 4 开始使用预训练的向量\n",
" vector_matrix[4:] = w2v.vectors[token_index_list]\n",
" \n",
" return token2idx, vector_matrix, w2v.vector_size\n",
" \n",
" @staticmethod\n",
" def numericalize_sequencese(sequence: List[str],\n",
" token2index: Dict[str, int]) -> List[int]:\n",
" \"\"\"\n",
" 将分词后的标记(token)数组转换成对应的索引数组\n",
" 如 ['我', '想', '睡觉'] -> [10, 313, 233]\n",
" Args:\n",
" sequence: 分词后的标记数组\n",
" token2index: 索引词典\n",
" Returns: 输入数据对应的索引数组\n",
" \"\"\"\n",
" token_result = []\n",
" for token in sequence:\n",
" token_index = token2index.get(token)\n",
" if token_index is None:\n",
" print(token)\n",
" token_index = token2index['<UNK>']\n",
" token_result.append(token_index)\n",
" return token_result"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "MI9jZRId9nT0",
"colab_type": "code",
"colab": {}
},
"source": [
"t = Tokenizer()\n",
"t.input2idx, t.input2count = t.build_token_dict(df.cutted_inputs.to_list())\n",
"t.output2idx, t.output2count = t.build_token_dict(df.cutted_targets.to_list())\n",
"# t.output2idx, t.output_vector_matrix, t.output_embedding_size = t.build_from_w2v('/input0/sgns.baidubaike.bigram-char')\n",
"\n",
"t.idx2output = dict([(v, k) for k, v in t.output2idx.items()])"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "s7HWqQJK9nT2",
"colab_type": "code",
"colab": {}
},
"source": [
"tokenized_input = []\n",
"tokenized_output = []\n",
"\n",
"for input_seq in df.cutted_inputs.to_list():\n",
" tokenized_input.append(t.numericalize_sequencese(input_seq, t.input2idx))\n",
"\n",
"for output_seq in df.cutted_targets.to_list():\n",
" tokenized_output.append(t.numericalize_sequencese(output_seq, t.output2idx))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "rOs_mMZ49nT4",
"colab_type": "code",
"colab": {}
},
"source": [
"encoder_input_data = pad_sequences(tokenized_input, padding='post', truncating='post')\n",
"decoder_input = pad_sequences(tokenized_output, padding='post', truncating='post')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "kjl7VXP79nT6",
"colab_type": "code",
"colab": {}
},
"source": [
"# For Decoder Input, you don't need the last word as that is only for prediction\n",
"# when we are training using Teacher Forcing.\n",
"decoder_input_data = decoder_input[:, :-1]\n",
"\n",
"# Decoder Target Data Is Ahead By 1 Time Step From Decoder Input Data (Teacher Forcing)\n",
"decoder_target_data = decoder_input[:, 1:]\n",
"\n",
"decoder_target_data = to_categorical(decoder_target_data, len(t.output2idx))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "RpYW5Dct9nT8",
"colab_type": "code",
"colab": {}
},
"source": [
"# Defining some constants: \n",
"EMBEDDING_DIM = 300 # Length of the vector that we willl get from the embedding layer\n",
"HIDDEN_LAYER_DIM = 1024 # Hidden layers dimension \n",
"\n",
"L = tf.keras.layers\n",
"\n",
"# Define an input sequence and process it.\n",
"# Input layer of the encoder :\n",
"encoder_input_layer = L.Input(shape=(None,))\n",
"encoder_embedding_layer = L.Embedding(input_dim = len(t.input2idx), output_dim = EMBEDDING_DIM)\n",
"encoder_lstm_layer = L.LSTM(HIDDEN_LAYER_DIM, return_state=True)\n",
"\n",
"\n",
"encoder_embedding = encoder_embedding_layer(encoder_input_layer)\n",
"# # Output layer of the encoder :\n",
"encoder_outputs, state_h, state_c = encoder_lstm_layer(encoder_embedding)\n",
"\n",
"# # We discard `encoder_outputs` and only keep the states.\n",
"encoder_states = [state_h, state_c]"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "b0UFwey99nT-",
"colab_type": "code",
"colab": {}
},
"source": [
"# Set up the decoder, using `encoder_states` as initial state.\n",
"# Input layer of the decoder :\n",
"decoder_input_layer = L.Input(shape=(None,))\n",
"\n",
"# Hidden layers of the decoder :\n",
"# decoder_embedding_layer = L.Embedding(input_dim = len(t.output2idx),\n",
"# output_dim = 300,\n",
"# weights=[t.output_vector_matrix],\n",
"# trainable=False)\n",
"\n",
"\n",
"decoder_embedding_layer = L.Embedding(input_dim = len(t.output2idx),\n",
" output_dim = 100)\n",
"\n",
"decoder_embedding = decoder_embedding_layer(decoder_input_layer)\n",
"\n",
"decoder_lstm_layer = L.LSTM(HIDDEN_LAYER_DIM, return_sequences=True, return_state=True)\n",
"decoder_lstm_output, state_h, state_c = decoder_lstm_layer(decoder_embedding, initial_state = encoder_states)\n",
"\n",
"# Output layer of the decoder :\n",
"decoder_dense_layer = L.Dense(len(t.output2idx), activation='softmax')\n",
"decoder_outputs = decoder_dense_layer(decoder_lstm_output)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "_O70gZr89nUA",
"colab_type": "code",
"colab": {},
"outputId": "5eb89d16-e9a8-4188-9605-0a2cb8c019ef"
},
"source": [
"model = tf.keras.Model([encoder_input_layer, decoder_input_layer], decoder_outputs)\n",
"model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])\n",
"model.summary()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Model: \"model_3\"\n",
"__________________________________________________________________________________________________\n",
"Layer (type) Output Shape Param # Connected to \n",
"==================================================================================================\n",
"input_1 (InputLayer) [(None, None)] 0 \n",
"__________________________________________________________________________________________________\n",
"input_5 (InputLayer) [(None, None)] 0 \n",
"__________________________________________________________________________________________________\n",
"embedding (Embedding) (None, None, 300) 2361000 input_1[0][0] \n",
"__________________________________________________________________________________________________\n",
"embedding_2 (Embedding) (None, None, 100) 271500 input_5[0][0] \n",
"__________________________________________________________________________________________________\n",
"lstm (LSTM) [(None, 1024), (None 5427200 embedding[0][0] \n",
"__________________________________________________________________________________________________\n",
"lstm_2 (LSTM) [(None, None, 1024), 4608000 embedding_2[0][0] \n",
" lstm[0][1] \n",
" lstm[0][2] \n",
"__________________________________________________________________________________________________\n",
"dense_1 (Dense) (None, None, 2715) 2782875 lstm_2[0][0] \n",
"==================================================================================================\n",
"Total params: 15,450,575\n",
"Trainable params: 15,450,575\n",
"Non-trainable params: 0\n",
"__________________________________________________________________________________________________\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "4x8wYbz49nUC",
"colab_type": "code",
"colab": {},
"outputId": "eab34c01-72f4-4355-bfb0-fbbc2ff0419c"
},
"source": [
"encoder_model = tf.keras.Model(encoder_input_layer, encoder_states)\n",
"encoder_model.summary(line_length=120)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Model: \"model_4\"\n",
"________________________________________________________________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"========================================================================================================================\n",
"input_1 (InputLayer) [(None, None)] 0 \n",
"________________________________________________________________________________________________________________________\n",
"embedding (Embedding) (None, None, 300) 2361000 \n",
"________________________________________________________________________________________________________________________\n",
"lstm (LSTM) [(None, 1024), (None, 1024), (None, 1024)] 5427200 \n",
"========================================================================================================================\n",
"Total params: 7,788,200\n",
"Trainable params: 7,788,200\n",
"Non-trainable params: 0\n",
"________________________________________________________________________________________________________________________\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "WSi98aIu9nUE",
"colab_type": "code",
"colab": {},
"outputId": "c8e7cf25-4835-4913-9faa-8fcd42f0f2ea"
},
"source": [
"decoder_state_input_h = L.Input(shape=(HIDDEN_LAYER_DIM,))\n",
"decoder_state_input_c = L.Input(shape=(HIDDEN_LAYER_DIM,))\n",
"decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]\n",
"\n",
"decoder_outputs, state_h, state_c = decoder_lstm_layer(decoder_embedding, \n",
" initial_state = decoder_states_inputs)\n",
"\n",
"# Output layer of the decoder :\n",
"# decoder_dense = L.Dense(len(t.output2idx), activation='softmax')\n",
"decoder_states = [state_h, state_c]\n",
"decoder_outputs = decoder_dense_layer(decoder_outputs)\n",
"\n",
"decoder_model = tf.keras.Model([decoder_input_layer] + decoder_states_inputs, [decoder_outputs] + decoder_states)\n",
"decoder_model.summary()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Model: \"model_5\"\n",
"__________________________________________________________________________________________________\n",
"Layer (type) Output Shape Param # Connected to \n",
"==================================================================================================\n",
"input_5 (InputLayer) [(None, None)] 0 \n",
"__________________________________________________________________________________________________\n",
"embedding_2 (Embedding) (None, None, 100) 271500 input_5[0][0] \n",
"__________________________________________________________________________________________________\n",
"input_6 (InputLayer) [(None, 1024)] 0 \n",
"__________________________________________________________________________________________________\n",
"input_7 (InputLayer) [(None, 1024)] 0 \n",
"__________________________________________________________________________________________________\n",
"lstm_2 (LSTM) [(None, None, 1024), 4608000 embedding_2[0][0] \n",
" input_6[0][0] \n",
" input_7[0][0] \n",
"__________________________________________________________________________________________________\n",
"dense_1 (Dense) (None, None, 2715) 2782875 lstm_2[1][0] \n",
"==================================================================================================\n",
"Total params: 7,662,375\n",
"Trainable params: 7,662,375\n",
"Non-trainable params: 0\n",
"__________________________________________________________________________________________________\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "4XBkwLSX9nUH",
"colab_type": "code",
"colab": {}
},
"source": [
"def encode_result(sentence: List[str]):\n",
" vect_sen = t.numericalize_sequencese(sentence, t.input2idx)\n",
" vect_sen = pad_sequences([vect_sen], padding='post', truncating='post')\n",
" states_value = encoder_model.predict(vect_sen)\n",
" target_seq = np.array([[t.output2idx['<BOS>']]])\n",
" \n",
" stop_condition = False\n",
" decoded_sentence = ''\n",
" while not stop_condition:\n",
" output_tokens, h, c = decoder_model.predict([target_seq] + states_value)\n",
"\n",
" # Sample a token\n",
" sampled_token_index = np.argmax(output_tokens[0, -1, :])\n",
" print(sampled_token_index)\n",
" sampled_char = t.idx2output[sampled_token_index]\n",
" \n",
" if (sampled_char == '<EOS>' or len(decoded_sentence) > 100):\n",
" stop_condition = True\n",
" else:\n",
" decoded_sentence += sampled_char\n",
" target_seq = np.array([[sampled_token_index]])\n",
" states_value = [h, c]\n",
" return decoded_sentence"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "fK4PBnh-9nUK",
"colab_type": "code",
"colab": {}
},
"source": [
"vect_sen = t.numericalize_sequencese('hello world'.split(' '), t.input2idx)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "lbUbSRI19nUM",
"colab_type": "code",
"colab": {},
"outputId": "f6fbe085-85f1-42ab-e554-c044c2d9dd0e"
},
"source": [
"encode_result('Hi'.split(' '))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"759\n",
"3\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'肯'"
]
},
"metadata": {
"tags": []
},
"execution_count": 55
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "TqhIi2ZG9nUO",
"colab_type": "code",
"colab": {}
},
"source": [
"vect_sen = pad_sequences([vect_sen], padding='post', truncating='post')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "BD_h244m9nUQ",
"colab_type": "code",
"colab": {}
},
"source": [
"import random\n",
"\n",
"class TransalteCallBack(tf.keras.callbacks.Callback):\n",
" def on_epoch_end(self, epoch, logs={}):\n",
" print('\\n')\n",
" for i in range(10):\n",
" if i < 5:\n",
" index = i\n",
" else:\n",
" index = random.randint(0, len(encoder_input_data))\n",
" sentence = df.cutted_inputs.to_list()[index]\n",
" res = encode_result(sentence)\n",
" print(f\"{' '.join(sentence):50}-> {res}\")"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "QUKL5ouV9nUS",
"colab_type": "code",
"colab": {},
"outputId": "8f9cdf53-8626-404a-bdf0-e8bde7aee2a9"
},
"source": [
"model.fit([encoder_input_data, decoder_input_data], \n",
" decoder_target_data, \n",
" epochs=100, \n",
" batch_size=64,\n",
" callbacks=[TransalteCallBack()])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 1.1243 - acc: 0.8233\n",
"\n",
"Hi -> 你的么\n",
"Hi -> 你的么\n",
"Run -> 你的么\n",
"Wait -> 你们的个个事\n",
"Hello -> 你的么\n",
"You should do your homework now -> 你是你的\n",
"Four is an unlucky number in Japanese -> 这个个个孩子的\n",
"My daughter is in her late teens -> 我的房子的一个孩\n",
"She said she had been happy -> 她们的个个儿\n",
"You'll love it -> 你的\n",
"21007/21007 [==============================] - 74s 4ms/sample - loss: 1.1240 - acc: 0.8233\n",
"Epoch 2/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.8067 - acc: 0.8598\n",
"\n",
"Hi -> 你的\n",
"Hi -> 你的\n",
"Run -> 你的事\n",
"Wait -> 助他们的\n",
"Hello -> 你的事\n",
"She's not as beautiful as her sister -> 她的孩子\n",
"He looks like a good boy -> 他一欢\n",
"There's nothing good on television now -> 天没有看\n",
"He makes three times more money than I do -> 他的一个孩子\n",
"To be always honest is not easy -> 他们不是一个\n",
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.8067 - acc: 0.8598\n",
"Epoch 3/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.6748 - acc: 0.8777\n",
"\n",
"Hi -> 始\n",
"Hi -> 始\n",
"Run -> 始\n",
"Wait -> 玛丽\n",
"Hello -> 始\n",
"Can I help -> 我们\n",
"She was afraid to cross the road -> 她很常怕\n",
"I'd like to go to London -> 我想去\n",
"Help me peel the potatoes -> 让我们的书\n",
"Where is your dog -> 你的书\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.6748 - acc: 0.8777\n",
"Epoch 4/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.5736 - acc: 0.8920\n",
"\n",
"Hi -> 始\n",
"Hi -> 始\n",
"Run -> 始\n",
"Wait -> 玛丽\n",
"Hello -> 始\n",
"No words can relieve her deep sorrow -> 她没有的法字\n",
"He has a strong sense of responsibility -> 他的\n",
"We'll die sooner or later -> 我们经常去\n",
"I want you to grow up -> 我想去\n",
"She is married to an American -> 她去学习\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.5736 - acc: 0.8920\n",
"Epoch 5/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.4872 - acc: 0.9048\n",
"\n",
"Hi -> 始\n",
"Hi -> 始\n",
"Run -> 始\n",
"Wait -> 窗般般般幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅\n",
"Hello -> 始\n",
"Tom certainly is an interesting person -> 汤姆有一个小人\n",
"Tom is in the house -> 汤姆姆经在一起\n",
"Can you imagine what the 21st century will be like-> 你想知道你的电话\n",
"I'll give you a little tip -> 我会一点\n",
"It was beginning to snow -> 开始\n",
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.4871 - acc: 0.9048\n",
"Epoch 6/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.4096 - acc: 0.9179\n",
"\n",
"Hi -> 始\n",
"Hi -> 始\n",
"Run -> 择\n",
"Wait -> 窗般般般嗜嗜嗜嗜般嗜嗜幅幅嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅嗜嗜幅嗜嗜嗜幅幅嗜嗜嗜嗜幅幅嗜\n",
"Hello -> 惯\n",
"Would you look after my cat -> 你的电脑上\n",
"Winter is my favorite season -> 数的数目\n",
"My favorite sport is baseball -> 山,我最喜欢的食物\n",
"I wish that Tom would agree to do that -> 我希望汤姆\n",
"I want to travel with you -> 我想要的方方\n",
"21007/21007 [==============================] - 72s 3ms/sample - loss: 0.4097 - acc: 0.9179\n",
"Epoch 7/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.3403 - acc: 0.9306\n",
"\n",
"Hi -> 视<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n",
"Hi -> 视<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n",
"Run -> 猜\n",
"Wait -> 惯赶<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n",
"Hello -> 惯\n",
"Tom had to sell his house -> 汤姆们经常大\n",
"What have I got to lose -> 我的钱\n",
"Rome is a city worth visiting -> 世过一个新外的城市\n",
"I stayed up late last night -> 晚晚了\n",
"Do you have any Japanese magazines -> 你的书子\n",
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.3403 - acc: 0.9306\n",
"Epoch 8/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.2799 - acc: 0.9423\n",
"\n",
"Hi -> \n",
"Hi -> \n",
"Run -> 猜\n",
"Wait -> 猜赶般\n",
"Hello -> 惯\n",
"There was no money left in my wallet -> 巴里没有钱\n",
"Shine your shoes before going out -> 路上你的地址\n",
"One's new. The other's old -> 其中的人\n",
"You should quit smoking -> 警察开始\n",
"I wish we had won the game -> 我希望的时候\n",
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.2800 - acc: 0.9423\n",
"Epoch 9/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.2265 - acc: 0.9532\n",
"\n",
"Hi -> 惯\n",
"Hi -> 惯\n",
"Run -> 猜\n",
"Wait -> 猜按\n",
"Hello -> 猜\n",
"What were you doing in Boston -> 你去了一个\n",
"The skies are clear -> 昨机\n",
"Can you guess what I have here -> 你来这里\n",
"Some people like summer, and others like winter -> 想,是有孩子\n",
"I'm under so much pressure, I just want to cry -> 我吃着很多可能的\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.2265 - acc: 0.9532\n",
"Epoch 10/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.1827 - acc: 0.9629\n",
"\n",
"Hi -> ,<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n",
"Hi -> ,<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n",
"Run -> 猜\n",
"Wait -> 猜今般9颗颗颗颗颗擅颗擅颗擅颗颗擅颗擅颗颗擅颗擅颗颗擅颗颗擅颗颗擅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅\n",
"Hello -> 猜\n",
"The towel wasn't useful at all -> 牛算已经已经做了\n",
"The rivers were flooded by the heavy rain -> 雨下了,他们可常会吃功\n",
"You need to know -> 你的想法\n",
"Your wife is mad at you -> 你的意气\n",
"I laughed at his joke -> 他的父亲\n",
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.1828 - acc: 0.9629\n",
"Epoch 11/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.1460 - acc: 0.9713\n",
"\n",
"Hi -> \n",
"Hi -> \n",
"Run -> 猜\n",
"Wait -> 冷\n",
"Hello -> 猜\n",
"We have barely enough bread for breakfast -> 早上的家子太在我们\n",
"It worried me that she looked pale -> 她相信\n",
"He has been to France three times -> 他去三次三次\n",
"I don't want Tom to die -> 我不想\n",
"Do you want to know -> 你想要\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.1460 - acc: 0.9712\n",
"Epoch 12/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.1180 - acc: 0.9776\n",
"\n",
"Hi -> 肯\n",
"Hi -> 肯\n",
"Run -> 猜\n",
"Wait -> 猜\n",
"Hello -> 猜\n",
"Tom is single and has a three-year-old daughter -> T些次, 他是没有的\n",
"Could you drive Tom home -> 你开始这个\n",
"Don't enter the room without permission -> 上学习,不是你的办公室里了\n",
"The accident almost cost him his life -> 此差他不懂他的事\n",
"The teacher got quite well again -> 大声很大\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.1180 - acc: 0.9776\n",
"Epoch 13/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0956 - acc: 0.9823\n",
"\n",
"Hi -> 肯\n",
"Hi -> 肯\n",
"Run -> 猜\n",
"Wait -> 猜\n",
"Hello -> 猜\n",
"He showed interest in the plan -> 他的钱\n",
"Tom joined our company three years ago -> 汤姆下来大学\n",
"Please give me something to eat -> 请我有吃多\n",
"What did you hear -> 听\n",
"Tom realized it was time to leave -> 汤姆想成有个多人\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0956 - acc: 0.9823\n",
"Epoch 14/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0786 - acc: 0.9861\n",
"\n",
"Hi -> 肯\n",
"Hi -> 肯\n",
"Run -> 猜\n",
"Wait -> 猜\n",
"Hello -> 猜\n",
"How deep is the hole -> 非常多\n",
"I'd like to know the exact time -> 我想要知道的方馆\n",
"We speak the same language, don't we -> 我们的理孩子是在理面\n",
"He asked her where her mother was -> 他和她妈妈\n",
"Please speak more loudly -> 入英语\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0786 - acc: 0.9861\n",
"Epoch 15/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0656 - acc: 0.9885\n",
"\n",
"Hi -> 肯\n",
"Hi -> 肯\n",
"Run -> 猜\n",
"Wait -> 雨\n",
"Hello -> 肯\n",
"Those are their books -> 这个女儿\n",
"You should read many books when you are young -> 年轻的时候,你很须很快读\n",
"She put on her hat to go out -> 她下散须\n",
"The conflict between blacks and whites in the city became worse-> 这个城市,他的办成00000个人不住在这个地方\n",
"I'm more interested in spoken English -> 我要的英语几倍\n",
"21007/21007 [==============================] - 74s 4ms/sample - loss: 0.0656 - acc: 0.9885\n",
"Epoch 16/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0557 - acc: 0.9906\n",
"\n",
"Hi -> 肯\n",
"Hi -> 肯\n",
"Run -> 猜\n",
"Wait -> 忘<PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD><PAD>\n",
"Hello -> 肯\n",
"She told me an interesting story -> 她做了一个趣的小说\n",
"You must do it -> 你\n",
"Problems that can be solved with money are not real problems-> 除的可以学生不们\n",
"I took a shower -> 即\n",
"He is the father of two children -> 他的成功留在\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0557 - acc: 0.9906\n",
"Epoch 17/100\n",
"20992/21007 [============================>.] - ETA: 0s - loss: 0.0480 - acc: 0.9920\n",
"\n",
"Hi -> 肯\n",
"Hi -> 肯\n",
"Run -> 猜\n",
"Wait -> 忘週\n",
"Hello -> 肯\n",
"How I've missed you -> 我们\n",
"I've always been smart -> 明天\n",
"He is angry with you -> 他的生气\n",
"I'll pay -> 我\n",
"This was the most interesting book that she had ever read-> 这是非常喜欢的电脑\n",
"21007/21007 [==============================] - 73s 3ms/sample - loss: 0.0480 - acc: 0.9920\n",
"Epoch 18/100\n",
" 2048/21007 [=>............................] - ETA: 1:04 - loss: 0.0342 - acc: 0.9947"
],
"name": "stdout"
},
{
"output_type": "error",
"ename": "KeyboardInterrupt",
"evalue": "",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-47-91a38accf93c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m64\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m callbacks=[TransalteCallBack()])\n\u001b[0m",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)\u001b[0m\n\u001b[1;32m 804\u001b[0m \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 805\u001b[0m \u001b[0mvalidation_freq\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_freq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 806\u001b[0;31m steps_name='steps_per_epoch')\n\u001b[0m\u001b[1;32m 807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 808\u001b[0m def evaluate(self,\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training_arrays.py\u001b[0m in \u001b[0;36mmodel_iteration\u001b[0;34m(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq, mode, validation_in_fit, prepared_feed_values_from_dataset, steps_name, **kwargs)\u001b[0m\n\u001b[1;32m 357\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 358\u001b[0m \u001b[0;31m# Get outputs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 359\u001b[0;31m \u001b[0mbatch_outs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 360\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_outs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[0mbatch_outs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mbatch_outs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m 3383\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmath_ops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3384\u001b[0m \u001b[0mconverted_inputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3385\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_graph_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mconverted_inputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3386\u001b[0m return nest.pack_sequence_as(\n\u001b[1;32m 3387\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_outputs_structure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0moutputs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 547\u001b[0m raise TypeError(\"Keyword arguments {} unknown. Expected {}.\".format(\n\u001b[1;32m 548\u001b[0m list(kwargs.keys()), list(self._arg_keywords)))\n\u001b[0;32m--> 549\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_flat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 550\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 551\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_filtered_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_call_flat\u001b[0;34m(self, args)\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[0;31m# Only need to override the gradient in graph mode and when we have outputs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 647\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecuting_eagerly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 648\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_inference_function\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mctx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 649\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 650\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_register_gradient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36mcall\u001b[0;34m(self, ctx, args)\u001b[0m\n\u001b[1;32m 420\u001b[0m attrs=(\"executor_type\", executor_type,\n\u001b[1;32m 421\u001b[0m \"config_proto\", config),\n\u001b[0;32m--> 422\u001b[0;31m ctx=ctx)\n\u001b[0m\u001b[1;32m 423\u001b[0m \u001b[0;31m# Replace empty list with None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 424\u001b[0m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moutputs\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 59\u001b[0m tensors = pywrap_tensorflow.TFE_Py_Execute(ctx._handle, device_name,\n\u001b[1;32m 60\u001b[0m \u001b[0mop_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m num_outputs)\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "0hOA0kLX9nUV",
"colab_type": "code",
"colab": {},
"outputId": "13cb87cb-2ed7-4a9a-b002-339f8e1b5145"
},
"source": [
"tf.keras.utils.plot_model(model, show_shapes=True)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABOcAAAIECAIAAADdAN3wAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzde1wTV94/8DOBJIQkBAz3izdq7atUo4KrVFhEbFgLSqUgVWntWny5thVZ665ite1jvZf2kX15o7ptnxarUPuS54VWu67VbsXYDVawXnHxyk1BJBDKRWR+f8yv80zDLYSQGcLn/Rc5c3LynQPJN19m5gxF0zQBAAAAAAAAECQR3wEAAAAAAAAAdAlVKwAAAAAAAAgXqlYAAAAAAAAQLlStAAAAAAAAIFyOfAcwkOh0uo8++ojvKAAABqOvvvqK7xAAAACAHzjW2gt37949ePAg31HA4HXw4MGysjK+oxCKsrIyvB8HCfyuAQAABjkKd74xX25ublJSEmYM+EJRVE5Ozpw5c/gORBDwfhw88LsGAAAY5HCsFQAAAAAAAIQLVSsAAAAAAAAIF6pWAAAAAAAAEC5UrQAAAAAAACBcqFoBwJ5lZ2dTv1IoFCZbb9++PWvWrPr6+pqaGrbb+PHjm5ubud24WymKCgkJseEe9EzIwa9atSonJ6djIxvP5MmTbRkPAAAADESoWgHsnNFoHDVqVGxsLN+B8GnXrl00TRuNRm5jUVFRSEiIVqt1cXFxd3enaVqv1zPtaWlp3J7MVp1Op1araZouLCy0afQ9EXLwixYtSk9PX7t2Lbdx8+bNNE3TNO3g4GDLYAAAAGCAQtUKYOdomm5vb29vb+crAIVCERYWxterd6W+vn7mzJkvvvjim2++yW2XSqVqtTorK2v//v18xWYxAQYfGBh46NChDRs25Obm8h0LAAAADFSoWgHsnFKpLC0t/eabb/gORFi2bt1aVVX1zjvvmLQ7OTnt27dPJBItXry4pKSEl9gsJszgNRpNQkLCW2+91dbWxncsAAAAMCChagWAQYem6b17906aNMnX17fj1ujo6DVr1jQ0NCQmJppcIyp8wgx+9uzZZWVlR44c4TsQAAAAGJBQtQLYs7y8PHbZG6aG4bbcunUrKSnJ1dVVrVbHxsaWlpYyz8rIyGA6+Pv76/X6qKgopVLp7OwcGRlZUFDA9Fm/fj3Thz3799ixY0yLu7s7d5zGxsaCggJmk6Ojo83noBPFxcX37t3TaDRddXj33Xe1Wu2FCxeWLl3a/VAPHjxYvnx5YGCgRCJxc3ObMWPGyZMnmU3mTDWjuro6NTV1+PDhEonEw8MjPj6+qKjI4r0TYPDjxo0jhHz77bcW7xQAAAAMajSYjVkJk+8oYPAihOTk5FjwxLi4OEJIU1OTSUtcXNyZM2eMRuPx48dlMtnEiRO5z9JoNHK5PDQ0lOmj1+vHjh0rkUhOnTrF9pHL5VOmTOE+Kzg4mFn1p5s+jMjIyCFDhuh0Ogv2iDb7/fjFF1+QX1djMmncuHGjSWe9Xq9SqZifq6urAwICCCHZ2dlMC7ugEauysnLEiBFeXl75+fkGg+HatWvx8fEURe3Zs4ft0+NUV1RUDBs2zMvL68iRIw0NDRcvXoyIiHBycjpz5kxv5kPQwRsMBkJIeHi4ScwODg6TJk3qcdfw2QsAADDI4VgrwOCVkpISGhoql8unT58eExOj1+tramq4HRobG3fu3Mn0CQkJyc7Obm1tXbZsmVVevb29nfkYsspovVJZWUkIUalU3fRxd3fPzc0Vi8WLFy++evVqp33S09Nv3ry5bdu22NhYFxeXJ5988ssvv/Tx8UlNTb137x63ZzdTnZ6efvv27Y8++uj5559XKBRBQUEHDhygabrHI6UDKHgXFxeKophpBwAAAOgtVK0Ag9fEiRPZn5lDcxUVFdwOcrmcObeTMWbMGF9f3+LiYquUH6dOnaqtrQ0NDe37UL3FnCwtFou77zZ58uSMjIzGxsbExMSmpqaOHQ4dOkQIiYmJYVukUmlUVFRTU5PJ2bDdTHVeXp5IJOLemsjb2zsoKOjcuXNlZWW93TXBBu/o6NhpGAAAAAA9QtUKMHhxDzZKJBJCiMkNclxdXU2e4unpSQi5f/9+/0fXj5ycnAghjx496rFnampqUlLSxYsXTW6QQwhpaWkxGAxOTk5KpZLb7uXlRQipqqriNnY11cwg7e3tKpWK4vjpp58IIdevX7dsBwUYfFtbm0wm68vuAAAAwKAliJVRAECYHjx4QNM0RVFsC1OvMrUrIUQkErW2tnKfUldXZzII9+kC4ePjQwhhLrbs0d69e4uKij755BOm1mVJpVKVSmUwGBoaGri1H3N6rbe3tzmDS6VSV1dXo9HY1NTUH0tVCST4+vp6mqaZaQcAAADoLRxrBYAuNTc36/V69uHPP/9cUVGh0WjY8sPHx6e8vJztUFVVdefOHZNBnJ2d2cp29OjRH3/8cT9H3bNnnnmGEGLm+bcKheLrr7+Wy+U7d+402TR79mxCCPeGLi0tLSdOnJDJZNHR0WYGEx8f39bWxi7OzNiyZcvQoUP7foNTgQTP/JEw0w4AAADQW6haAaBLKpVq9erVOp2usbGxsLAwOTlZIpFkZmayHbRabUVFxfbt241GY2lp6bJly9jDsKwJEyaUlJTcvXtXp9PduHEjPDycaZ82bZparT579qzt9udXGo3G09OzuLjYzP5BQUFZWVkd2zdt2jRixIi0tLTDhw83NDSUlJTMmzevsrIyMzOTOdXWHJs2bQoMDFy4cOHRo0cNBkNtbW1WVta6desyMjLYA5jJyckURd28edPMMQUVPCGEuReOVqu1IH4AAAAA3EugF3D3BeAX6f2db5gVd1jz58/X6XTclrfffpv+7Sq+MTExzHM1Go2fn9/ly5ejo6OVSqVMJouIiDh9+jR3/Lq6upSUFB8fH5lMFhYWptfrg4ODmXFWrlzJ9Ll69Wp4eLhcLg8ICNixYwf73PDwcDc3t97e34XVlzvf0DS9evVqR0fH8vJy5mF1dTV3EoKDgzsOtWTJEpObx9A0XVNTk5aWNmLECLFYrFKpoqOjT5w4wWwyf6qZ+6aOHDlSLBZ7eHhotdrjx49zX2XatGkKhaKtra3TfRR48DRNJyYm+vn5tba2mrTjzjcAAABgDorm47YTA1Rubm5SUhJmDPhCUVROTs6cOXNs83Ljxo2rqanpyzK2/crM92N2dvbLL7+8a9euP/3pT9x2g8EQFBQUGxu7e/fu/gzTCurq6nx9fefPn79nzx6+Y7FEcXHx+PHjv/zyy5deeslkk6OjY0hISI/H2/HZCwAAMMjhDGEAGIxUKlV+fv7Bgwd37NjBdyzdoWk6NTXVxcXl/fff5zsWS9y4cSM+Pj49Pb1jyQoAAABgJlSt8BvffPPNk08+afFapgqFgnsDjIyMDOuG1xdCjg3625IlSyiKUigU3Mbx48cXFhYePXq0vr6er8B6dO/evRs3bpw4ccLMdX2FJisra8OGDRs2bOA2rlq1inkbPn78mK/AAAAAYABB1Wp9RqNx1KhRsbGxfAfSO6WlpbNmzUpPT2dufWEZo9F4/vx5QkhcXBxN0ytWrLBegH0l5NiEJiMjg6Ko4uLi8vJyiqLWrFnDd0SWS05OZq+IMBqNJluHDx9++PBhFxcXXmIzh7e39+nTp4OCgvgOxEJbtmzpeJR18+bN7C+Fl+W4AAAAYGBB1Wp9NE23t7e3t7fzFYBCoQgLC+vts9auXfvss8+eO3eOe/PGAcqyGQDWihUruJe/r1+/nu+IAAAAAGDwsv5N7UGpVJaWlvIdRa/9/e9/l8lkfEcBAAAAAADwGzjWCv8fSlYAAAAAABAgVK1WlpeXx67309zcbNJy69atpKQkV1dXtVodGxvLHpJlLiOkKMrf31+v10dFRSmVSmdn58jIyIKCAqbP+vXrmT7sua/Hjh1jWtzd3bnjNDY2FhQUMJssXlfJigbWDLS1teXk5Dz33HPe3t4ymWzMmDGZmZnM+d51dXXc9ZyY82bb2trYloSEBGaQ6urq1NTU4cOHSyQSDw+P+Pj4oqKijrNx7dq1OXPmqNVq5mFNTU2fJhoAAAAAwC71/y1h7Yf5d7qPi4sjhDQ1NZm0xMXFnTlzxmg0Hj9+XCaTTZw4kfssjUYjl8tDQ0OZPnq9fuzYsRKJ5NSpU2wfuVw+ZcoU7rOCg4PVajW3pWOfXvHz83NwcOh0U2Rk5JAhQ3Q6XTdP5654xCWEGegqNq78/HxCyMaNG2tra6urq//2t7+JRCLudZ7R0dEikeg///kP91mhoaH79u1jfq6oqBg2bJiXl9eRI0caGhouXrwYERHh5OR05swZk9mIiIg4efJkY2Pj2bNnHRwcqquruwmMpmlCSE5OTvd9Bg/z348w0OF3DQAAMMjhWKtNpaSkhIaGyuXy6dOnx8TE6PV6k8NrjY2NO3fuZPqEhIRkZ2e3trYuW7aMr4BNtLe3M383Fo8wIGZg6tSp6enpbm5u7u7uS5cunTdvXmZmJntzlOXLl7e3t3/00Uds/4KCgjt37iQmJjIP09PTb9++/dFHHz3//PMKhSIoKOjAgQM0TS9dutTkhVauXDl16lRnZ+dJkya1tbWxR4wBAAAAAIDF/+mjg8rEiRPZnwMCAgghFRUV3FpFLpePGzeOfThmzBhfX9/i4uLKykofHx9bhtqpU6dO9XEE4c9AbGysyV2LNBpNdnb2pUuXQkNDCSFarXbMmDGfffbZunXr1Go1IeSDDz5YunSpWCxm+ufl5YlEIu4g3t7eQUFB586dKysr8/f3Z9t/97vf9Ta8pKSkpKQky3bNLlEUxXcIAAAAANC/ULXalEqlYn+WSCSEEJMb5Li6upo8xdPTs6Ki4v79+0KoWvtO+DNgMBg+/PDDQ4cOlZWV1dXVse2//PIL+3NaWtprr722c+fOtWvXlpSUfPfdd59++imzqaWlxWAwkN/uKev69evcqlUul/c2vLS0NKZ4Bp1Ot23bNubcUbBvzO+a7ygAAACAN6haheXBgwc0TXMPH92/f58Q4unpyTwUiUStra3cp3ArK8aAPvrE+wzMnDnzhx9+yMzMnDt3rru7O0VR27Zt+/Of/8w9L3r+/PmrV6/evn37X//61w8//HDBggVubm7MJqlU6urqajQam5qa+mMprNDQ0Dlz5lh92AFq27ZtmI1BAlUrAADAYIbrWoWlublZr9ezD3/++eeKigqNRsMeZvTx8SkvL2c7VFVV3blzx2QQZ2dntq4bPXr0xx9/3M9RWxNfM+Do6Hj16tXHjx8XFBR4e3unpqZ6eHgw1W9TU5NJZ6lU+vrrr9+/f//DDz/ct2+fyWW38fHxbW1t7NLHjC1btgwdOrStra3HSAAAAAAAgAtVq7CoVKrVq1frdLrGxsbCwsLk5GSJRJKZmcl20Gq1FRUV27dvNxqNpaWly5YtYw9CsiZMmFBSUnL37l2dTnfjxo3w8HBrhTdt2jS1Wn327FlrDdgRvzPg4OAwderUqqqqDz74oKampqmp6eTJk7t37+7Y8/XXX5fJZGvWrJk+ffoTTzzB3bRp06bAwMCFCxcePXrUYDDU1tZmZWWtW7cuIyNDCDciAgAAAAAYYPhbvnjgMefuC4cOHeJO7/z583U6Hbfl7bffpn+7Bm9MTAzzXI1G4+fnd/ny5ejoaKVSKZPJIiIiTp8+zR2/rq4uJSXFx8dHJpOFhYXp9frg4GBmnJUrVzJ9rl69Gh4eLpfLAwICduzYYebeMXd8MbFnzx5un/DwcDc3N+4dXEyYXKj5wQcf0DQtkBno8SLSK1eu0DRdXV29ePHigIAAsVjs5eX16quvrlq1iukQHBzMjWTRokWEkO+//77jPDx48GD58uUjR44Ui8UeHh5arfb48ePMJpPZIL15DxLc+YYDd0MZPPC7BgAAGOQoug93MRlscnNzk5KS+m/Gxo0bV1NTU1ZW1k/jC9/AmoFPP/10x44dhYWFNntFiqJycnJwJSejv9+PIBz4XQMAAAxyOEMYwEK7d+9evnw531FAD7Kzs6lfKRQKk623b9+eNWtWfX19TU0N2238+PHNzc3cbtytFEWFhITYcA96JuTgV61a1XGd51WrVrHxTJ482ZbxAAAAwECEqhWgF/bu3Tt79myj0bh79+6HDx/isOdAsWvXLpqmjUYjt7GoqCgkJESr1bq4uLi7u9M0zawEVlRUlJaWxu3JbNXpdGq1mqZpWx5gN4eQg1+0aFF6evratWu5jZs3b2bO9nFwcLBlMAAAADBAoWoVhIyMDIqiiouLy8vLKYpas2aNdcenuvbee+9Z97Us098zYEV5eXlubm67du06cOCAHa+upFAowsLCBu74Paqvr585c+aLL7745ptvctulUqlarc7Kytq/fz9fsVlMgMEHBgYeOnRow4YNubm5fMcCAAAAAxWqVkFYsWIF92rj9evXW3f8bq5sFkjV2t8zYC0pKSk0TT969Ki4uHjChAl8hwOW27p1a1VV1TvvvGPS7uTktG/fPpFItHjx4pKSEl5is5gwg9doNAkJCW+99Rbu/AQAAACWQdUKAIMOTdN79+6dNGmSr69vx63R0dFr1qxpaGhITEw0uUZU+IQZ/OzZs8vKyo4cOcJ3IAAAADAgoWoFsDfMfXcCAwMlEombm9uMGTNOnjzJbFq/fj1zZjh7du6xY8eYFnd3d6aFOVu7sbGxoKCA2cScCM20UxTl7++v1+ujoqKUSqWzs3NkZGRBQUHfx7el4uLie/fuaTSarjq8++67Wq32woULS5cu7X6obmY7Ly+PPRX/1q1bSUlJrq6uarU6Nja2tLSUO0h1dXVqaurw4cMlEomHh0d8fHxRUZHFeyfA4MeNG0cI+fbbby3eKQAAABjUrHH7nMEC9wwEfhEz7tdaWVk5YsQILy+v/Px8g8Fw7dq1+Ph4iqK4t96Vy+VTpkzhPis4OJhZqqebPgyNRiOXy0NDQ8+cOWM0GvV6/dixYyUSyalTp6wyfmRk5JAhQ3Q6Xfe7SZv9fvziiy/Ir6sxmTRu3LjRpLNer1epVMzP1dXVAQEBhJDs7GymhV3QiGXObMfFxRFC4uLimBk7fvy4TCabOHEi26GiomLYsGFeXl5HjhxpaGi4ePFiRESEk5NTNzdG7pSQgzcYDISQ8PBwk5gdHBwmTZrU467hsxcAAGCQw7FWALuSnp5+8+bNbdu2xcbGuri4PPnkk19++aWPj09qauq9e/es8hKNjY07d+4MDQ2Vy+UhISHZ2dmtra3Lli2zyuDt7e3MZ5NVRutKZWUlIUSlUnXTx93dPTc3VywWL168+OrVq532MX+2U1JSmBmbPn16TEyMXq+vqalhB7l9+/ZHH330/PPPKxSKoKCgAwcO0DTd45HSARS8i4sLRVHMtAMAAAD0FqpWALty6NAhQkhMTAzbIpVKo6KimpqarHV+plwuZ074ZIwZM8bX17e4uNgqNcmpU6dqa2tDQ0P7PlQ3mAs+xWJx990mT56ckZHR2NiYmJjY1NTUsYP5sz1x4kT2Z+YoaEVFBfMwLy9PJBLFxsayHby9vYOCgs6dO1dWVtbbXRNs8I6Ojp2GAQAAANAjVK0A9qOlpcVgMDg5OSmVSm67l5cXIaSqqsoqr+Lq6mrS4unpSQi5f/++Vca3AScnJ0LIo0ePeuyZmpqalJR08eJFkxvkkF7ONve4rkQiIYS0t7ezg7S3t6tUKu4tqX766SdCyPXr1y3bQQEG39bWJpPJ+rI7AAAAMGjZ7d0mAQYhqVSqUqkMBkNDQwO3GmFO+PT29mYeikSi1tZW7hPr6upMhqIoqqtXefDgAU3T3A5MvcrUrn0f3wZ8fHwIIczFlj3au3dvUVHRJ598wtS6LDNnu3tSqdTV1dVoNDY1NfXHqlQCCb6+vp6maWbaAQAAAHoLx1oB7Mrs2bMJIdxbjLS0tJw4cUImk0VHRzMtPj4+5eXlbIeqqqo7d+6YjOPs7MxWnqNHj/7444/ZTc3NzXq9nn34888/V1RUaDQatibp4/g28MwzzxBCzDz/VqFQfP3113K5fOfOnSabzJntHsXHx7e1tbHrMDO2bNkydOjQvt/gVCDBM38PzLQDAAAA9BaqVgC7smnTphEjRqSlpR0+fLihoaGkpGTevHmVlZWZmZnMyZ+EEK1WW1FRsX37dqPRWFpaumzZMvYwKWvChAklJSV3797V6XQ3btwIDw9nN6lUqtWrV+t0usbGxsLCwuTkZIlEkpmZyXboy/jTpk1Tq9Vnz561/tRwaDQaT0/P4uJiM/sHBQVlZWV1bDdntnu0adOmwMDAhQsXHj161GAw1NbWZmVlrVu3LiMjgz2AmZycTFHUzZs3zRxTUMETQph74Wi1WgviBwAAAMC9BHoBd18AfhEz7nxD03RNTU1aWtqIESPEYrFKpYqOjj5x4gS3Q11dXUpKio+Pj0wmCwsL0+v1wcHBzAfCypUrmT5Xr14NDw+Xy+UBAQE7duxgn6vRaPz8/C5fvhwdHa1UKmUyWURExOnTp601fnh4uJubmzk3fenLnW9oml69erWjo2N5eTnzsLq6mvvBGBwc3HGoJUuWmNw8hu52tnU6HXfMt99+m/7t2sgxMTFMT+a+qSNHjhSLxR4eHlqt9vjx49xXmTZtmkKhaGtr63QfBR48TdOJiYl+fn6tra0m7bjzDQAAAJiDovv5DhP2JDc3NykpCTMGfKEoKicnZ86cOTzGMG7cuJqamr6sbWstZr4fs7OzX3755V27dv3pT3/ithsMhqCgoNjY2N27d/dnmFZQV1fn6+s7f/78PXv28B2LJYqLi8ePH//ll1++9NJLJpscHR1DQkJ6PLSOz14AAIBBDmcIA8BgpFKp8vPzDx48uGPHDr5j6Q5N06mpqS4uLu+//z7fsVjixo0b8fHx6enpHUtWAAAAADOhagUA+7dkyRKKohQKBbdx/PjxhYWFR48era+v5yuwHt27d+/GjRsnTpwwc11focnKytqwYcOGDRu4jatWrWLukfP48WO+AgMAAIABBFUrAJglIyODoqji4uLy8nKKotasWcN3RGZJTk5mr4gwGo0mW4cPH3748GEXFxdeYjOHt7f36dOng4KC+A7EQlu2bOl4lHXz5s3sL6W/V94CAAAAO4D7tQKAWVasWLFixQq+owAAAACAQQfHWgEAAAAAAEC4ULUCAAAAAACAcKFqBQAAAAAAAOFC1QoAAAAAAADChdWYei03N5fvEGDw0ul0fIcgFMxU4P04GODPHgAAYJCjaJrmO4YBIzc3Nykpie8oAAAGI2QrAACAQQtVK8CgwPzPBe93AAAAABhwcF0rAAAAAAAACBeqVgAAAAAAABAuVK0AAAAAAAAgXKhaAQAAAAAAQLhQtQIAAAAAAIBwoWoFAAAAAAAA4ULVCgAAAAAAAMKFqhUAAAAAAACEC1UrAAAAAAAACBeqVgAAAAAAABAuVK0AAAAAAAAgXKhaAQAAAAAAQLhQtQIAAAAAAIBwoWoFAAAAAAAA4ULVCgAAAAAAAMKFqhUAAAAAAACEC1UrAAAAAAAACBeqVgAAAAAAABAuVK0AAAAAAAAgXKhaAQAAAAAAQLhQtQIAAAAAAIBwoWoFAAAAAAAA4ULVCgAAAAAAAMKFqhUAAAAAAACEC1UrAAAAAAAACBeqVgAAAAAAABAuVK0AAAAAAAAgXKhaAQAAAAAAQLhQtQIAAAAAAIBwoWoFAAAAAAAA4ULVCgAAAAAAAMKFqhUAAAAAAACEC1UrAAAAAAAACJcj3wEAQL8oKytbsGDB48ePmYcPHz5UKpVTp05lO4wePTorK4uf4AAAAAAAzIaqFcA++fv73759u7S0lNv4/fffsz///ve/t3lQAAAAAAC9hjOEAezWK6+8IhaLu9r60ksv2TIYAAAAAADLUDRN8x0DAPSL0tLSUaNGdfoeDwoKunjxou1DAgAAAADoLRxrBbBbgYGBY8eOpSjKpF0sFi9YsICXkAAAAAAAegtVK4A9e+WVVxwcHEwa29raEhMTeYkHAAAAAKC3cIYwgD2rrKz09/dvb29nW0Qi0aRJk86cOcNjVAAAAAAA5sOxVgB75uPjM2XKFJHo/97pIpHolVde4TEkAAAAAIBeQdUKYOdefvll7kOapuPj4/kKBgAAAACgt1C1Ati5hIQE9tJWBweH6dOne3p68hsSAAAAAID5ULUC2Dk3N7fnnnuOKVxpmk5OTuY7IgAAAACAXkDVCmD/kpOTmQWZxGLxCy+8wHc4AAAAAAC9gKoVwP7NmjVLKpUSQmbOnKlQKPgOBwAAAACgF1C1Atg/uVzOHGLF6cEAAAAAMPDQA19CQgLfswgAAHYiJyeH77QGyOwAAPxISEjgOwN0zpHvmbGOyZMn//nPf+Y7CoD+pdPptm3blpOTY8FzHz9+nJOTM2/ePKtHxaP//u//JoTgvQ9WlJSUxHcI8P8hswNf+pJt7RKy7eDB/K6FyU6qVn9//zlz5vAdBUC/27Ztm8V/6rNnz3ZycrJuPPz66quvCCF474MVoWoVDmR24FFfsq39QbYdPJjftTDhulaAwcLOSlYAAAAAGCRQtQIAAAAAAIBwoWoFAAAAAAAA4ULVCgAAAAAAAMKFqhUAoHdu3749a9as+vr6mpoa6lfjx49vbm7mduNupSgqJCSEr4A7JeTgV61ahdU7AQAGluzsbDZrKBQKk61Inf2t09S5atUqNp7JkyfbMh6rQ9UKYP+MRuOoUaNiY2P5DsQeFBUVhYSEaLVaFxcXd3d3mqb1ej3TnpaWxu3JbNXpdGq1mqbpwsJCnkLunJCDX7RoUXp6+tq1a235ogAAfYRsSwjZtWsXTdNGo5HbiNRpA52mzs2bNzM3O3VwcLBlMP0BVSuA/aNpur29vb29na8AFApFWFgYX69uRfX19TNnznzxxRfffPNNbrtUKlWr1VlZWfv37+crNosJMPjAwMBDhw5t2LAhNzeX71gAAMyFbNsppE7bsPvUiaoVwP4plcrS0tJvvvmG70AGvK1bt1ZVVb3zzjsm7U5OTvv27ROJRIsXL8VgbncAACAASURBVC4pKeElNosJM3iNRpOQkPDWW2+1tbXxHQsAgFmQbTuF1Gkz9p06UbUCAJiFpum9e/dOmjTJ19e349bo6Og1a9Y0NDQkJiaaXOgifMIMfvbs2WVlZUeOHOE7EAAAsBBSp43ZcepE1Qpg5/Ly8tgL8ZlPVW7LrVu3kpKSXF1d1Wp1bGxsaWkp86yMjAymg7+/v16vj4qKUiqVzs7OkZGRBQUFTJ/169czfdjzkY4dO8a0uLu7c8dpbGwsKChgNjk6Otp8DqyjuLj43r17Go2mqw7vvvuuVqu9cOHC0qVLux/qwYMHy5cvDwwMlEgkbm5uM2bMOHnyJLPJnN8Oo7q6OjU1dfjw4RKJxMPDIz4+vqioyOK9E2Dw48aNI4R8++23Fu8UAIDNINt2CqnTxsHbc+qkB76EhISEhAS+owDod8zScJY9Ny4ujhDS1NRk0hIXF3fmzBmj0Xj8+HGZTDZx4kTuszQajVwuDw0NZfro9fqxY8dKJJJTp06xfeRy+ZQpU7jPCg4OZtYh6KYPIzIycsiQITqdzrKdsvF7/4svviCEbNy40aRdr9erVCrm5+rq6oCAAEJIdnY208KuysCqrKwcMWKEl5dXfn6+wWC4du1afHw8RVF79uxh+/T426moqBg2bJiXl9eRI0caGhouXrwYERHh5OR05syZXu2UkIM3GAyEkPDw8F7tUR8RQnJycmz5itApZHbgEbKtCTPfj0yWZFZjMmlE6uQ9dTo4OEyaNKnHXRPyZy+qVoABoz/yaH5+PtuSkJBACKmurmZbmH+Onj9/nm25cOECIUSj0bAtfcmjERERbm5uvc0W3IBt+d7funUrIWTHjh0m7dzsRdO0TqcTi8VyufzKlSt0Z9nr1VdfJYTs37+fbWlubvb19ZXJZFVVVUxLj7+dBQsWEEL27dvHdqisrJRKpcHBwb3aKYEHT1HUE0880as96iNUrQKBzA48QrY10ZeqFanT9sF3mjrtoGrFGcIAg9rEiRPZn5l/FlZUVHA7yOVy5mwTxpgxY3x9fYuLiysrK/v+6qdOnaqtrQ0NDe37UDbAnPElFou77zZ58uSMjIzGxsbExMSmpqaOHQ4dOkQIiYmJYVukUmlUVFRTU5PJKT3d/Hby8vJEIhH3/gre3t5BQUHnzp0rKyvr7a4JNnhHR8dOwwAAGFgGbbZF6rR98PaaOlG1AgxqKpWK/VkikRBCTJbsd3V1NXmKp6cnIeT+/fv9H52wODk5EUIePXrUY8/U1NSkpKSLFy+arPJPCGlpaTEYDE5OTkqlktvu5eVFCKmqquI2dvXbYQZpb29XqVTcG5r/9NNPhJDr169btoMCDL6trU0mk/VldwAAhGDQZlukTqROaxHEhdoAIFgPHjygaZqiKLaFyaBMNiWEiESi1tZW7lPq6upMBuE+feDy8fEhhDBXjPRo7969RUVFn3zyCZOwWVKpVKVSGQyGhoYGbgK7d+8eIcTb29ucwaVSqaurq9FobGpq6o/1NgQSfH19PU3TzLQDANg3e822SJ1IndaCY60A0J3m5ma9Xs8+/PnnnysqKjQaDfuB6OPjU15eznaoqqq6c+eOySDOzs5srh09evTHH3/cz1H3i2eeeYYQYuZJRAqF4uuvv5bL5Tt37jTZNHv2bEIId1X6lpaWEydOyGSy6OhoM4OJj49va2tjV5hkbNmyZejQoX2/S5tAgmf+rphpBwCwb/aabZE6CVKnlaBqBYDuqFSq1atX63S6xsbGwsLC5ORkiUSSmZnJdtBqtRUVFdu3bzcajaWlpcuWLWP/McyaMGFCSUnJ3bt3dTrdjRs3wsPDmfZp06ap1eqzZ8/abn/6QKPReHp6FhcXm9k/KCgoKyurY/umTZtGjBiRlpZ2+PDhhoaGkpKSefPmVVZWZmZmMucLmWPTpk2BgYELFy48evSowWCora3Nyspat25dRkYG+1/Y5ORkiqJu3rxp5piCCp4Qwizor9VqLYgfAGBgsddsi9Rpy+CJfadOfheDsgohr3YFYEWWrWrIrAHAmj9/vk6n47a8/fbbNE1zW2JiYpjnajQaPz+/y5cvR0dHK5VKmUwWERFx+vRp7vh1dXUpKSk+Pj4ymSwsLEyv1wcHBzPjrFy5kulz9erV8PBwuVweEBDAXUgwPDx8AK0hTNP06tWrHR0dy8vLmYfV1dXceet0EcIlS5aYrCVI03RNTU1aWtqIESPEYrFKpYqOjj5x4gSzyfzfDnPzt5EjR4rFYg8PD61We/z4ce6rTJs2TaFQtLW1dbovAg+epunExEQ/P7/W1tZO4+8nBGsICwMyO/AI2dZEX9YQppE6bRg83XXqtIM1hFG1AgwYfVmL3zJMHrXlK/aK7d/7dXV1fn5+ixcvtuWLWubhw4cymSwlJYXvQCxUVFREURT3PgG2gapVIJDZgUfItib6WLUiddpMN6nTDqpWnCHcJxkZGcwSXv7+/lYc9sCBA8ywJtdz97aPjSkUCqpbhYWFFg+OqQYhUKlU+fn5Bw8e3LFjB9+xdIem6dTUVBcXl/fff5/vWCxx48aN+Pj49PT0l156ie9YAKzs4cOHu3fvnjZt2pAhQ2Qy2ahRo+bPn2/++ZMsk5ybkZHRH9FaRsixge0hddqG3adOVK19smLFCvrXe0Nb0UsvvUTTdFRUVG/7GI3GUaNGcW/lZEtGo/H8+fOEkLi4uI7/IOGu5W0BTDUIxPjx4wsLC48ePVpfX893LF26d+/ejRs3Tpw4YebihEKTlZW1YcOGDRs28B0ICN1A/Cj+y1/+snTp0ri4uMuXLz948OCTTz4pKioKDg7Oy8vr1TgmOXfFihX9E68lhBwb9LclS5ZQFKVQKLiNSJ020GnqXLVqFfPPo8ePH/MVmLWgarUrNE23t7eb3AEM+oPdTzVzcLu4uLi8vJyiqDVr1vAdkYAMHz788OHDLi4ufAfSJW9v79OnTwcFBfEdiIW2bNlir/8qBuvi/aNYoVCEhYX19lkLFy5ctmyZt7e3s7NzeHj4l19++fjx47/+9a/9EWF/s2wGgGVP2TY5OZk9VmE0Gk22InX2t05T5+bNm9lfykBZ/LIruF+rXVEqlaWlpXxH0bmOdxUb0IQ81VaxYsUK/HccAARuIH4U792716RFo9HIZLLS0lL6t7frhMEA2RbATDjWCv0uLCzss88+4zsKAAAAIWpsbGxqanrmmWdQsgIAdGVwVa3V1dWpqanDhw+XSCQeHh7x8fHMTY0IIXl5eeyyAbdv305KSlIqlWq1+uWXX3748OGtW7dmzpypVCp9fHwWLVrU0NDQcfCrV6/GxMSoVCpnZ+fIyEiTuwB389Ls01944QWVSiWXy8PDw0+fPt3pS3TTh7sLzc3NJi23bt1KSkpydXVVq9WxsbEm/5xmR3Z2dv7d7353+PDh6dOnM09MSUmxaLK7hKm22VQDANgxyz6KuWv76fX6qKgopVJpkk3Wr1/P9GHPfT127BjT4u7uzh2nsbGxoKCA2cS9ZWKvfPXVV4SQt99+uy+zwRhYM9DW1paTk/Pcc895e3vLZLIxY8ZkZmYy53vX1dVx13Nav349059tSUhIYAYx86vdtWvX5syZo1armYc1NTV9mmgAsL3+WZrYpsxco7miomLYsGFeXl5HjhxpaGi4ePFiRESEk5MT9+5VcXFxhJD4+PjCwkKj0fj5558TQmbMmBEXF3f+/PmGhobdu3cTQv785z9zR9ZoNCqVKjIy8vTp0w0NDXq9fuzYsRKJ5NSpU2a+9PXr111dXf38/P7xj380NDRcuHBBq9UOHz5cKpWyr2JOH3YXmpqaTFri4uLOnDljNBqPHz8uk8kmTpzY1cgXL16cPn26h4eHyciRkZFDhgzR6XTdTDKz+kJHn376qUlPTHU3U90V26/FL3BCXp8dBiiCO98Ig/nvbgs+imma1mg0crk8NDSU6dMxm9A0LZfLp0yZwn1WcHCwyW0YO/bpraqqKi8vr4532jA/53ZcAVEIM9DN6oys/Px8QsjGjRtra2urq6v/9re/iUQiZvFFRnR0tEgk+s9//sN9Vmho6L59+5ifzf9qFxERcfLkycbGxrNnzzo4OFRXV3cTGLKtCWTbwUPIv2t7eE+aOb8LFiwghLCfdDRNV1ZWSqVS7g2CmY+2I0eOsC3MNdnff/892zJixIjRo0dzR2YWtuWmlgsXLhBCNBqNmS+dmJhICDl48CDboby8XCqVcosZc/rQXefv/Px8toX5DyX7kd1x5Pv37zs7O5uMHBER0eMtqjvNUlOmTOmqasVUdzrVXUEeNSHkz1YYoFC1CkTfq9ZuPorpX7PJ+fPn2RaTbELbpGqtqakZN25cUlJSW1ubySaLcy4tjBkws2qdOnUqtyU5OVksFhsMBubht99+Swh5/fXX2Q6nT5/28/NrbW1lHpr/1e6bb77pJhITyLYmkG0HDyH/rgfRakx5eXkikYi7Pr63t3dQUNC5c+fKysq4dwENCQlhf/b19b106RK3xc/Pr+N91ZycnCZNmsQ+HDNmjK+vb3FxcWVlpY+PT48vfezYMUJIdHQ093WffPLJkpIStsWcPt2YOHEi+3NAQAAhpKKigjnPp+PIHh4eTz311KVLl7gjnDp1ypwX6hVMdadT3b3c3FzzO9u3srIyggkBgM5081HMkMvl48aNYx+aZBMbRNjY2BgdHf30009//vnnDg4OJlv7nnOFPwOxsbEmdy3SaDTZ2dmXLl0KDQ0lhGi12jFjxnz22Wfr1q1Tq9WEkA8++GDp0qVisZjpb/5Xu9/97ne9DQ/JhYVsO3iYvHEEZbBUrS0tLQaDgRDS6V1Dr1+/zv0NcVflFolEDg4Ozs7ObIuDg0PHRfaZKyW4LZ6enhUVFffv3x8yZEj3L+3h4dHQ0ODk5GRybytPT0+2TGppaemxT/e4ry6RSAghzF50NbKbm5s5w5qj0wtHGZhq0vupTkpK6lV/u4cJAYCOuvooZrm6upo8hc0mNqjZ2traEhMT/fz8/ud//qdjyWoVAp8BQojBYPjwww8PHTpUVlbGvdHAL7/8wv6clpb22muv7dy5c+3atSUlJd99992nn37KbOrVVzu5XN7b8JBcTGBCBgn2onGhGSxVq1QqdXV1NRqNTU1NFq+X0A3mc5Pr/v37hBBPT09zXlqpVDY0NBiNRm49U1tby42/xz6W6WpkJn4BwlTTNN3HSOwGc8Y1s5AJgFVQWMR10Hjw4AH92zvNsNmEeSgSiVpbW7lP6XgLN4v/YBYvXtzS0nLo0CE2Wz3xxBPZ2dmTJ0+2bEAL8DsDhJCZM2f+8MMPmZmZc+fOdXd3pyhq27ZtzHoWbJ/58+evXr16+/btf/3rXz/88MMFCxaw/+rt7692yLYsZNvBg/ldC9MgWkM4Pj6+ra3NZL3ZLVu2DB06tK2trY+DG41G7rmsP//8c0VFhUajYf5b2eNLz5gxg/x6+iijpqbm2rVr3P7m9LFMx5GrqqrMPK5ovpCQkAMHDvR9HEw1AAD0XXNzs16vZx+aZBNCiI+PT3l5Oduhqqrqzp07JoM4Ozuzdd3o0aM//vhjc176vffeu3Tp0v/+7/9KpdI+7UPf8DUDjo6OV69effz4cUFBgbe3d2pqqoeHB1P9NjU1mXSWSqWvv/76/fv3P/zww3379i1btoy7tV+/2gGAoAyiqnXTpk2BgYELFy48evSowWCora3Nyspat25dRkZG3/9FJ5fL33zzzR9//LGxsbGwsDA5OVkikWRmZpr50hs3bhwyZEhaWtrx48eNRuPly5eTk5NNziM1p49lTEa+ePHiH//4R29vb5Nu06ZNU6vVZ8+e7fsr9sVgmGoAAOhvKpVq9erVOp2u02xCCNFqtRUVFdu3bzcajaWlpcuWLWMPQrImTJhQUlJy9+5dnU5348aN8PDwHl/3s88++6//+q8ff/xRqVRyb+5icps0G+RcvmaA4eDgMHXq1Kqqqg8++KCmpqapqenkyZPM7QNMvP766zKZbM2aNdOnT3/iiSe4m/r1qx0ACAuva0FZh/mrXT148GD58uUjR44Ui8UeHh5arfb48ePMJp1Ox52Wt99+m/sPSELIpk2bfvjhB27Lu++++8EHHzA/+/n5/fvf/46MjFQoFDKZLCIi4vTp02a+NOPatWsvvPCCi4sLszz94cOHo6KimMFfe+01c/ocOnSIG978+fM77hT929NdYmJiTEZ2dnZ+9tlnv//++6lTpzo7O3MjDA8P7349wx4vGtm/fz+m2pyp7gpWNTQh5JXuYIAiWENYGMx5d/flo1ij0fj5+V2+fDk6OlqpVHaaTerq6lJSUnx8fGQyWVhYmF6vDw4OZsZZuXIl0+fq1avh4eFyuTwgIGDHjh3m7FpMTEznOfK3K+T3Nud+8MEHdGcZlpcZ6PH7wJUrV2iarq6uXrx4cUBAgFgs9vLyevXVV1etWsV04C4CTNP0okWLyG/vMsAy/6sdMTuBItuaQLYdPIT8u6bogX/WPs627w9PPfVUU1PT7du3+Q7E/pk/1bm5uUlJSXbwnrUWvPfB6iiKysnJmTNnDt+BDHb9/e4eN25cTU0NszLq4DSwZuDTTz/dsWNHYWGhbV4O2dYEsu3gIeTf9SA6Qxi6UlVVNWTIkEePHrEtt27dKi0tnTZtGo9R2SVMNQAAQG/t3r17+fLlfEcBAHxC1QqEEPLw4cPFixffvXv3l19++fe//52UlOTi4rJ27Vq+47JDmGoe3b59e9asWfX19TU1Ney1ZOPHj29ubuZ2426lKIp7D2EhGNDBE0Jomi4oKHjjjTeefPJJqVTq6ekZFhaWnZ3d8bBGUVFRTEyMq6urUqmcPn26yYIr5vRZtWoVc6YfAAw4e/funT17ttFo3L1798OHD3EGhPBlZ2ez2afjaiBIwf2t05S3atUqNh5bLlHeH1C1AvH29v7nP/9ZV1f3+9//3s3NbdasWaNGjfr3v/89cuRIvkOzN5hqHhUVFYWEhGi1WhcXF3d3d5qmmQuqi4qK0tLSuD2ZrTqdTq1W0zRts3PSzDSggyeEXLt2LSwsrKSk5ODBgwaD4ezZs0OHDn355Zf/8pe/cLv9+OOPzz77rFKpvHLlys2bN0eOHDl16tR//OMfveqzaNGi9PR0/FcIuDIyMiiKKi4uLi8vpyhqzZo11h2f6tp7771n3deyTH/PgBXl5eW5ubnt2rXrwIEDWF1poNi1axdN00ajkduIFGwDnaa8zZs3MxeF9tN9oW3KlhfR9hMhXzcMYEU2Xh9CLpdPmTJFyOOb/943GAz+/v6LFy/mNur1eqlUqlarCSFffvmlyVPYrCNMAzf4K1euODo61tbWsi0tLS1qtVoqlTY3NzMtjx8/DgoK8vHx+eWXX5iWtra20aNHBwQE9KoPTdNFRUXMpapmhkewGpMwILMDj5BtTZj5fvziiy/Ir1UrF1KwzXST8hwcHCZNmtTjCEL+7MWxVgCwf1u3bq2qqnrnnXdM2p2cnPbt2ycSiRYvXjzgbpw7QIN/6qmnHj165ObmxrZIJJKAgICWlhb2VKt//etfly5dSkhIkMlkTIuDg8PcuXPv3r17+PBh8/sQQjQaTUJCwltvvYWbNwIA8AIp2GbsO+WhagUAO0fT9N69eydNmuTr69txa3R09Jo1axoaGhITE00uUBG+AR08q66u7vr16+PHj1epVEzLd999RwgxuSKIeXjixAnz+zBmz55dVlZ25MiR/toBAADoAlKwjdlxykPVCmCHmPvXBQYGSiQSNze3GTNmnDx5ktm0fv165gqrsLAwpuXYsWNMi7u7O9PCXPXU2NhYUFDAbGIuKGLaKYry9/fX6/VRUVFKpdLZ2TkyMpJdBacv4/eT4uLie/fuaTSarjq8++67Wq32woULS5cu7X6obiY2Ly+PvXrt1q1bSUlJrq6uarU6Nja2tLSUO0h1dXVqaurw4cMlEomHh0d8fHxRUZHFezegg6+vry8oKJg1a5a3t/fnn3/Otl+9epUQ4u/vz+3s5+dHCGH/pW1OH8a4ceMIId9++63FcQIAdArZtkdIwTYO3p5THt+nKFuBkM/ABrAiM6+0qaysHDFihJeXV35+vsFguHbtWnx8PEVRe/bsYft0vMolODjY5DKMrq6E0Wg0crk8NDT0zJkzRqNRr9ePHTtWIpGcOnXKKuNHRkYOGTJEp9P1uKe9utJm48aNJu16vV6lUjE/V1dXBwQEEEKYxWzpzq5LMWdi4+LiCCFxcXHM5Bw/flwmk02cOJHtUFFRMWzYMC8vryNHjjQ0NFy8eDEiIsLJyenMmTM97ojdBM94//33mTQ0derUCxcucDc999xzhJCzZ89yG69fv04ImTBhgvl9GAaDgRASHh5uTlQE17UKAzI78AjZ1kRfrmtFCrZx8F2lPDu4rhVVK8CAYWYeffXVVwkh+/fvZ1uam5t9fX1lMllVVRXT0sc8Sgg5f/4823LhwgVCiEaj6ea55o8fERHh5uZmTgox872/detWQsiOHTtM2rlZh6ZpnU4nFovlcvmVK1fozrKOORPLZJ38/HxukISQ6upq5uGCBQsIIfv27WM7VFZWSqXS4ODgHnfEboJntbS0XLly5U9/+pODg8O6devY9k4rUuYIKvta5vRhURT1xBNPmBMSqlaBQGYHHiHbmuhL1YoUbPvgO015dlC14gxhAHtz6NAhQkhMTAzbIpVKo6KimpqarHXGiFwuZ05BYYwZM8bX17e4uLiysrLvg586daq2tjY0NLTvQzGYq03EYnH33SZPnpyRkdHY2JiYmNjU1NSxg/kTO3HiRPZn5l+wFRUVzMO8vDyRSBQbG8t28Pb2DgoKOnfuXFlZWW93baAHL5FInnrqqV27ds2aNeudd9755z//ybS7uroSQhobG7mdmYfMJjP7sBwdHTudFgAAiyHbmgMp2PbB22vKQ9UKYFdaWloMBoOTk5NSqeS2e3l5EUKqqqqs8iodqwJPT09CyP37960yvnU5OTkRQh49etRjz9TU1KSkpIsXL7755psmm3o1seyqQoQQiURCCGlvb2cHaW9vV6lU3Ls4/vTTT4QQ5uxWiw3o4GfOnEkIYdf+feqppwghJmm4vLycEPLkk0+a34fV1tbGLjUMANB3yLZmQgq2ffD2mvJQtQLYFalUqlKpmpubGxoauO337t0jhHh7ezMPRSJRa2srt0NdXZ3JUBRFdfUqDx48oGma28JkUCab9n186/Lx8SGEMFd69Gjv3r2jR4/+5JNPmDOdWGZObPekUqmrq6ujo+OjR486nvoSGRlp7i7ZXfBSqZQQUltbyzxkRjt37hy3D/MwKirK/D6M+vp6mqaZPwMAAKtAtjUTUrCNg7fjlIeqFcDezJ49mxDCXfS8paXlxIkTMpksOjqaafHx8WGOSjGqqqru3LljMo6zszObC0ePHv3xxx+zm5qbm/V6Pfvw559/rqio0Gg07KdkH8e3rmeeeYZ0OCjXFYVC8fXXX8vl8p07d5psMmdiexQfH9/W1sYuAsnYsmXL0KFD+353tQER/IoVK5KTk00ajx49SjhnRkVERDz99NMHDx5k7yXw+PHjAwcOBAQEsGdYmdOHwfwpMn8GAADWgmxrDqRgYtvg7TjloWoFsDebNm0aMWJEWlra4cOHGxoaSkpK5s2bV1lZmZmZyZyOQgjRarUVFRXbt283Go2lpaXLli1j/3HLmjBhQklJyd27d3U63Y0bN8LDw9lNKpVq9erVOp2usbGxsLAwOTlZIpFkZmayHfoy/rRp09Rq9dmzZ601IRqNxtPTs7i42Mz+QUFBWVlZHdvNmdgebdq0KTAwcOHChUePHjUYDLW1tVlZWevWrcvIyGBvSJCcnExR1M2bN80cc8AF/+WXX65bt+7WrVstLS23bt1auXJldnZ2cHBwSkoK00EkEv3973+vra394x//WFVV9eDBgzfeeOP69et79uxhTjYzsw+DuTGAVqs1czcBAMyBbGsOpGBbBk/sO+X1bTEnQRDyalcAVmTmqoY0TdfU1KSlpY0YMUIsFqtUqujo6BMnTnA71NXVpaSk+Pj4yGSysLAwvV4fHBzMfCasXLmS6XP16tXw8HC5XB4QEMBd/U+j0fj5+V2+fDk6OlqpVMpksoiIiNOnT1tr/PDwcOuuakjT9OrVqx0dHcvLy5mH1dXV3I/BThcPXLJkickagHS3E6vT6bhjvv322/RvT+uKiYlhejI3bRs5cqRYLPbw8NBqtcePH+e+yrRp0xQKRVtbW6f7MqCDp2naYDDs3bs3OjqaueOcQqEIDg7etGnTL7/8YtLzp59+mjFjhouLi0KhmDZtmsnfmPl9EhMT/fz8WltbuwqJi2ANYWFAZgceIdua6MsawjRSsA2Dp7tOeXawhjCqVoABw/w82q+YPMp3FDTdm/d+XV2dn5/f4sWL+zukvnv48KFMJktJSeE7EEsIMPiioiKKorj3G+geqlaBQGYHHiHbmuhj1YoUbDPdpDw7qFpxhjAA2D+VSpWfn3/w4MEdO3bwHUt3aJpOTU11cXF5//33+Y6l1wQY/I0bN+Lj49PT01966SW+YwEAGKSQgm3D7lMeqlYAGBTGjx9fWFh49OjR+vp6vmPp0r17927cuHHixAkzFxUUFAEGn5WVtWHDhg0bNvAdCADAYLFkyRKKohQKBbcRKdgGOk15q1atYu6R8/jxY74CsxZUrQBgroyMDIqiiouLy8vLKYpas2YN3xH1zvDhww8fPuzi4sJ3IF3y9vY+ffp0UFAQ34FYQoDBb9myxV7/5QwAdmyAZtvk5GT2ZE6j0WiyFSm4v3Wa8jZv3sz+Uvp75a3+5thzFwAAQgghK1asWLFiBd9RAAAA2DNkW4COcKwVAAAAAAAAhAtVKwAAAAAAAAgXqlYAAAAAAAAQLlStAAAAAAAAhAIdDQAAIABJREFUIFx2shrT2bNnExMT+Y4CoH+VlZURQvCnzmJWw8OEANglZHbgC7KtCWTbwePs2bOTJ0/mO4rOObz33nt8x9BXzIcLgN1zcXF5+umnLXtuVVXVDz/8MGrUKOuGxC9/f39/f3++owC78vTTT//hD38ICAjgO5DBDpkdeNSXbEsIOX/+fFVVlY+PjxVD4hey7eDh7+8fGhoaGhrKdyCdoGia5jsGAOh3ubm5SUlJeL8DAAD0qzlz5hBCcnNz+Q4EwK7gulYAAAAAAAAQLlStAAAAAAAAIFyoWgEAAAAAAEC4ULUCAAAAAACAcKFqBQAAAAAAAOFC1QoAAAAAAADChaoVAAAAAAAAhAtVKwAAAAAAAAgXqlYAAAAAAAAQLlStAAAAAAAAIFyoWgEAAAAAAEC4ULUCAAAAAACAcKFqBQAAAAAAAOFC1QoAAAAAAADChaoVAAAAAAAAhAtVKwAAAAAAAAgXqlYAAAAAAAAQLlStAAAAAAAAIFyoWgEAAAAAAEC4ULUCAAAAAACAcKFqBQAAAAAAAOFC1QoAAAAAAADChaoVAAAAAAAAhAtVKwAAAAAAAAgXqlYAAAAAAAAQLlStAAAAAAAAIFyoWgEAAAAAAEC4ULUCAAAAAACAcKFqBQAAAAAAAOFC1QoAAAAAAADChaoVAAAAAAAAhAtVKwAAAAAAAAiXI98BAEC/ePTokdFoZB82NjYSQh4+fMi2UBTl6urKQ2QAAAB25JdffmlpaWEftra2kt8mXKlU6uzszENkAHaEomma7xgAwPru3bvn5+f3+PHjrjpERkZ+9913tgwJAADA/uzcufONN97opsOOHTtef/11m8UDYJdwhjCAffLy8vr9738vEnX+Hqcoau7cuTYOCQAAwP4kJiY6ODh0tdXBwSExMdGW8QDYJVStAHbr5Zdf7mqTg4NDfHy8LYMBAACwSx4eHlFRUZ0Wrg4ODtOnT/fw8LB9VAB2BlUrgN168cUXHR07uXbdwcHhD3/4g1qttn1IAAAA9ic5ObnTa+5omk5OTrZ9PAD2B1UrgN1ycXGZMWNGx8IVSRQAAMCKXnjhBbFY3LHd0dFx1qxZto8HwP6gagWwZ8nJyR0XZJJIJLGxsbzEAwAAYH+USuXMmTNNCldHR8e4uDgXFxe+ogKwJ6haAexZbGysyWr7YrF49uzZcrmcr5AAAADsz/z589va2rgtjx8/nj9/Pl/xANgZVK0A9szJySk+Pp77399Hjx4hiQIAAFjX888/r1AouC1yufwPf/gDX/EA2BlUrQB2bt68eY8ePWIfuri4PPfcczzGAwAAYH8kEkliYqJEImEeisXipKQkqVTKb1QAdgNVK4Cdmz59+pAhQ5ifxWLx3Llz2ZwKAAAA1jJv3rzW1lbm50ePHs2bN4/feADsCapWADvn6Og4d+5c5iRhJFEAAIB+EhkZyd6a1d3dPSIigt94AOwJqlYA+zd37lzmJGEvL6+wsDC+wwEAALBDIpFo3rx5EolELBbPnz/fwcGB74gA7AeqVgD79+yzz/r5+RFCXnnlFZEI73oAAIB+MXfu3NbWVpzZBGB1jtwHZWVlZ86c4SsUAOg/EydOLC8vV6vVubm5fMcCANY3Z86cvg+i0+nu3r3b93EABi2aptVqNSHk5s2bt27d4jscgAEsICAgNDT0/x7THDk5OfwFBgAAABairSEhIYHv/QAAACCEkISEBG6GcuzYg6Zp24cFXUlMTCSEfPXVV3wHIhQUReXk5FjlqMJgc/DgQXwlBbA/ubm5SUlJ1hotISEBGQegR918G7l8+TIh5Omnn7Z5ULxhPoVQQYAVMRUQVydVKwDYJZSsAAAA/W1Q1asANoN1WQAAAAAAAEC4ULUCAAAAAACAcKFqBQAAAAAAAOFC1QoAAAAAAADChaoVACx3+/btWbNm1dfX19TUUL8aP358c3Mztxt3K0VRISEhfAXcqQEdPCGEpumCgoI33njjySeflEqlnp6eYWFh2dnZHZdzLCoqiomJcXV1VSqV06dPLygo6Dha931WrVqFe6QBAIAQ4EtIfxNU0kfVareMRuOoUaNiY2P5DgTsVlFRUUhIiFardXFxcXd3p2lar9cz7WlpadyezFadTqdWq2maLiws5Cnkzg3o4Akh165dCwsLKykpOXjwoMFgOHv27NChQ19++eW//OUv3G4//vjjs88+q1Qqr1y5cvPmzZEjR06dOvUf//hHr/osWrQoPT197dq1Nto3AAA7gu9mVoQvITYgqKSPqtVu0TTd3t7e3t7OVwAKhSIsLIyvV4f+Vl9fP3PmzBdffPHNN9/ktkulUrVanZWVtX//fr5is9jADd7R0TE3N3fs2LFOTk4jR4787LPP1Gr19u3bW1pamA7t7e2vvfaaq6vrp59+6uPj4+7uvmvXrsDAwJSUlF71CQwMPHTo0IYNG3Jzc/nZVQCAAQvfzawFX0JsQ1BJH1Wr3VIqlaWlpd988w3fgYB92rp1a1VV1TvvvGPS7uTktG/fPpFItHjx4pKSEl5is9gADf6pp5569OiRm5sb2yKRSAICAlpaWtgTjf71r39dunQpISFBJpMxLQ4ODnPnzr179+7hw4fN70MI0Wg0CQkJb731Vltbmy12DwDAXuC7mbXgS4jNCCfpo2oFgF6jaXrv3r2TJk3y9fXtuDU6OnrNmjUNDQ2JiYkml2cI34AOnlVXV3f9+vXx48erVCqm5bvvviOEmFwPwzw8ceKE+X0Ys2fPLisrO3LkSH/tAAAAQBfwJcTGBJL0UbXap7y8PPa6beaPntty69atpKQkV1dXtVodGxtbWlrKPCsjI4Pp4O/vr9fro6KilEqls7NzZGQkuyLL+vXrmT7sGSbHjh1jWtzd3bnjNDY2FhQUMJscHR1tPgfQj4qLi+/du6fRaLrq8O6772q12gsXLixdurT7oR48eLB8+fLAwECJROLm5jZjxoyTJ08ym8z5o2VUV1enpqYOHz5cIpF4eHjEx8cXFRVZvHcDOvj6+vqCgoJZs2Z5e3t//vnnbPvVq1cJIf7+/tzOfn5+hBD2H7rm9GGMGzeOEPLtt99aHCcAwGCD72bWgi8hNg5eKEmf5mAWiaJBSBISEhISEix7blxcHCGkqanJpCUuLu7MmTNGo/H48eMymWzixIncZ2k0GrlcHhoayvTR6/Vjx46VSCSnTp1i+8jl8ilTpnCfFRwczFwm3k0fRmRk5JAhQ3Q6nWU7RQjJycmx7LlgLV988QUhZOPGjSbter1epVIxP1dXVwcEBBBCmMVsac5aAqzKysoRI0Z4eXnl5+cbDIZr167Fx8dTFLVnzx62T49/tBUVFcOGDfPy8jpy5EhDQ8PFixcjIiKcnJzOnDnTq50a0MEz3n//feaDferUqRcuXOBueu655wghZ8+e5TZev36dEDJhwgTz+zAMBgMhJDw83IIgweqsmLv7knEABhWLv43Y5XczG1cQ+BJi4+B5Sfod8xGqVqHrj6o1Pz+fOz4hpLq6mm1h/nd1/vx5tuXChQuEEI1Gw7b05ZMxIiLCzc3Nsi/lNKpWYdi6dSshZMeOHSbt3M9cmqZ1Op1YLJbL5VeuXKE7+8x99dVXCSH79+9nW5qb/x97dx7X1LH/DXwCgRASCIIKCGhxw4oVlXqLCy8KKIioVEqMVsBaF65drLVa19Zel3r1cm9rW+tuKyiCYNWiolJa61WhDy5gxR2KyiqCICCgwHn+mNc9v9OEJSQhG5/3X2QymfM9Zw45MzlzZup79eolFApLSkpoSrsn7axZswghBw4cYDMUFxcLBAJPT88O7ZRBB89qaGi4efPm3//+d1NT07Vr17LpLfZI6R1UdlvK5GHxeLz+/furFiRoFnqtANqn8V6rQbfNtNyDQCNE+8Fr/6KveD3CCOGuaOTIkezf9LecoqIibgaRSEQHA1CvvPJKr169srOzi4uL1d/62bNnKyoqRo0apX5RoCt0aJOZmVnb2by8vKKjo2tra6VSaV1dnWKGI0eOEEKCg4PZFIFA4O/vX1dXJzcQpY2T9ujRoyYmJtyFBBwcHNzd3S9fvlxQUNDRXTP04M3NzQcNGrRt27YpU6Z89tlnP//8M023sbEhhNTW1nIz05f0LSXzsPh8fouHBQAAVIC2mfLQCNF+8Ppw0UevtStiJ2ghhJibmxNC5CZhV2yh9uzZkxDy6NGjzo8ODICFhQUh5MWLF+3mXLhwoUwmu379utzc9ISQhoaGqqoqCwsLKysrbrq9vT0hpKSkhJvY2klLC2lubpZIJNxluK9cuUIIoaNbVWbQwU+ePJkQws79O2jQIEKI3EWosLCQEDJw4EDl87AaGxvZqYYBAEBNaJspD40Q7QevDxd9Q30OGzpVeXk5HQzAptDvRPr9SAgxMTF5/vw59yOVlZVyhXA/DkbG0dGREEKfc2jX7t27s7Ky9u7dSy8zLIFAIJFIqqqqqquruV+7paWlhBAHBwdlChcIBDY2NjU1NXV1dZ0xsYThBi8QCAghFRUV9KWvr++6desuX74cGRnJ5rl8+TIhxN/fX/k81NOnTxmGoacBAABoAdpmLDRCtBy8nlz0ca8VWlBfX5+Zmcm+/OOPP4qKijw8PNjz1dHRkd6BoUpKSh48eCBXiKWlJfvt6ebmtnPnzk6OGrRnyJAhROGmXGvEYvHhw4dFItF3330n99bUqVMJIdy51BsaGtLS0oRCYWBgoJLBhIaGNjY2slMpUps2berdu7f6a4sZRPBLliwJDw+XS0xJSSGccUE+Pj6DBw9OSkpiZ9JvamqKj493cXFhxxcpk4ei//70NAAAAC1A24yFRgjRbvB6ctFHrxVaIJFIVq5cmZ6eXltbe+nSpfDwcHNz8y1btrAZAgICioqKvv3225qamtzc3A8//JD9qY81YsSIO3fuPHz4MD09PS8vz9vbm6b7+fnZ2dllZGRob39A0zw8PHr27Jmdna1kfnd39x07diimb9y40dXVddGiRcePH6+urr5z585bb71VXFy8ZcsWOspFGRs3buzXr98777yTkpJSVVVVUVGxY8eOtWvXRkdHs78dhoeH83i8P//8U8kyDS74uLi4tWvX5ufnNzQ05OfnL1u2bP/+/Z6ennPnzqUZTExM9uzZU1FRMXv27JKSkvLy8vfee+/u3bu7du1if8FVJg9Fp8UPCAhQcjcBAEBNaJux0AjRZvBEfy763KmZMIewHlJtRkf6iDZr5syZ6enp3JRVq1YxDMNNCQ4Opp/18PBwcnK6ceNGYGCglZWVUCj08fE5f/48t/zKysq5c+c6OjoKhcKxY8dmZmZ6enrScpYtW0bz3Lp1y9vbWyQSubi4cOd58/b2xhzCRmDlypV8Pr+wsJC+LCsr455OLU6dt2DBArkZ8BiGefz48aJFi1xdXc3MzCQSSWBgYFpaGn1L+ZOWLlnWt29fMzOzHj16BAQEpKamcrfi5+cnFosbGxtb3BeDDp5hmKqqqt27dwcGBtL11sRisaen58aNG589eyaX88qVK0FBQdbW1mKx2M/PT+7/Wvk8UqnUycnp+fPnrYUE2oQ5hAG0T4XWiBG3zbTfg0AjRGvBMzq66GPlG8Oj/TYE/WbU5hY7RIXrBHSGyspKJyenqKgoXQfSvidPngiFwrlz5+o6EFXoYfBZWVk8Ho872z7oFnqtANqn5daInrfNtN+DQCNEa3R10dfAyjfR0dF0gilnZ+eOflZrxGIxdy6s6Ojo1nI2NTVt37599OjREonEzMysV69eEydO/Pbbb/Pz82mGYcOG8dqzfv36mpoaborcLxxcS5cu5X5Q4/sOoB0SiSQ5OTkpKWnr1q26jqUtDMMsXLjQ2tp63bp1uo6lw/Qw+Ly8vNDQ0BUrVkyfPl3XsYBR6aTWRXx8PC1WbpR7R/No38mTJwcOHKjy/C5yDSFFly5dUjk2VBboHBoh2qFXF/0O91qXLFnC/G+xY71VU1Nz9epVQkhISAjDMEuWLGktZ0RExHvvvffGG2/k5ORUV1f/97//HT58+MKFC1999VU2T2JiItvLj4qKIoSkpKSwKTKZjBAiFosZhqEbJYS0dmqWl5dv376dEDJz5kyGYVavXq25nQbQtuHDh1+6dCklJeXp06e6jqVVpaWleXl5aWlpSk6pp1f0MPgdO3Zs2LBhw4YNug4EjE0ntS6mT5/OMIzcJNjK5KmpqRkwYAB3GUOtyc3NnTJlyooVK+h0oKqRawjJ4a6EoQJUFugDNEK0QK8u+lqajUksFo8dO1Y721JeZmbmwYMH58yZ88knnzg7O1tYWPTr12/Dhg0LFixQuUyhUNinT5+UlJQWf8X88ssv6fK++on+epqdnV1YWMjj8dCphna99NJLx48ft7a21nUgrXJwcDh//ry7u7uuA1GFHga/adMmffjBFaCzMQzT3Nwst2Cmdnz66aejR4++fPmy3EqM0BodVpYWoG3WBjRCOpteXfS79HqtOTk5hBA3Nze59GnTptEB+uR/s2a1IT4+nvvSxMRk+fLlCxYsWL9+/dGjR7lvVVZWbtu27T//+c/bb7+tZuSdZMmSJW3clwYAAOgirKyscnNzdbLpPXv2CIXCTt2E4jKeBk2HlaUFaJsBUF165Rs6MXRqaqpcuo+Pz+PHj1Uudvbs2U5OTj/99NO1a9e46V9//fXEiRP79euncskAAABg3Dq1yzp27Ngffvih88oHAOgkmum1NjQ0fPbZZ4MGDbK0tLS1tZ08efJPP/3U1NRE/jewoba29sKFC/QBejq1wNGjR9kpAe7fvy+TyaysrOzs7CIiIp48eZKfnz958mQrKytHR8d58+ZVV1drJE453t7eDg4Op0+fDgoKOnv2rKbGlggEgqVLlzIMwx0FXlNT880336xcuVIjmwAAANChsrKyhQsX0sWWevToERoayg5NUv/6fuvWreDgYIlEYmlp6evre+HCBSU3zX78jTfekEgkIpHI29v7/PnzLW6ijTzcXaivr5dLyc/Pl8lkNjY2dnZ2kyZNkrvLx5ZsaWn5t7/97fjx4+PGjaMfZNdP1h+oLAOqLICujvt0vvLzVstNwD137lyJRHLmzJlnz56VlJTQkQy//vorm0EkEo0ZM0axnJCQEEJIaGjopUuXampqYmJiCCFBQUEhISFXr16trq6mcxd99NFH3E/5+vra2tqmp6e3EWEbkxBw/fe//2UfNO3Zs+fMmTPj4uJqa2tby684G5PcRkUiEcMwz549s7e3NzExuXHjBn3rn//857Rp0+gWyf9mY1IG1iGQQ7DyDQAAh/ZXvikqKurTp4+9vf2JEyeqq6uvX7/u4+NjYWHBXexRteu7h4eHRCLx9fU9f/58dXV1Zmbm0KFDzc3Nz549q+Sm7969a2Nj4+TkdObMmerq6mvXrgUEBLz00ksCgYDdijJ52F2oq6uTSwkJCbl48WJNTU1qaqpQKBw5cmRrJV+/fn3cuHE9evSQK1lJTk5OpqamLb6lfENI0ffffy+XE5WlQmWhNcKFtTNB4zS2Xqtcr9XV1XX06NHcDAMHDlS+13rixAk2hT6v/Ntvv3ELd3Nz437Kx8en3aWQley1MgxTX1+/b9++kJAQdtoDOzu71lYlUrLXyjDMpk2bCCHh4eEMw9TW1trb22dnZzPotaoN1wkAAC7t91pnzZpFCDlw4ACbUlxcLBAIPD092RTVru90WlpuZ4w+a+Ph4aHkpqVSKSEkKSmJzVBYWCgQCLhdEWXyMK13hJKTk9mUsLAwQkhZWVlrJT969MjS0lLjvVaVG0JjxoxprdeKyupQZaE1woVeK2ic4vVIM7MxTZgwYdu2bfPnz3/nnXdGjhxpamp6+/Zt5T/OXWamV69eOTk53BQnJ6fs7Gxu/rNnz6od8v8RCASRkZGRkZGNjY3nzp3btWtXfHx8eHi4m5vb8OHDVS723Xff3bx588GDB9esWZOcnOzl5TV06FDVisrIyKDfrUB9+eWXiYmJuo4CAEAvFBQUaHmLR48eNTEx4S404uDg4O7ufvny5YKCAu4anh29vhNCLCwsXnvtNfblK6+80qtXr+zs7OLiYkdHx3Y3ferUKUJIYGAgd7sDBw68c+cOm6JMnjaMHDmS/ZsO1yoqKurevXuLJffo0WPQoEF09kcN0mxDiEJldbSy0Bph0W8hNFZBgzIyMry8vLgpmnmudevWrTExMXl5ef7+/tbW1hMmTDhy5IjyH+fOWG1iYmJqamppacmmmJqaamc2cz6f7+fnd/DgwWXLljU1NSUlJalTmlgsXrRoUVNT05o1a6KjozFTOQAAGIGGhoaqqqrm5maJRMLjuHLlCiHk7t273MwqXN/t7Ox4PB43pWfPnoSQR48etbvphoaG6upqCwsLsVisWAIbf7t52sZd7NTc3JwQQveitZK7deumZMlacP78+dYWMkBlET2rLADg0sy9Vh6PFxERERER8eLFi7Nnz0ZHR4eGhv773/9evHgxm0EjG9KsCxcuhIaGKq7i7evru2nTpidPnqhZ/gcffBAdHR0XFxcUFMT9wbKjvLy88GMei8fjffTRR9OmTdN1IAAAeuHQoUMymUxrmxMIBDY2NjU1NXV1dXR6Rc2qqqqSS3n06BEhpGfPnsps2srKqrq6uqamhtsbqaio4Mbfbh7VtFYyjd8odfHKQmuERb+F0FgFDVK8da+Ze602Nja3bt0ihJiZmY0fP57O3nbixAk2g6Wl5fPnz+nfbm5uO3fu1Mh2VcPn82m0DMM8evQoIyNDLsOlS5cIIeoMD6YkEsnixYslEglutAIAgNEIDQ1tbGyUmy1206ZNvXv3bmxsVLPwmpoa7kjUP/74o6ioyMPDw9HRUZlNBwUFkf8N/qQeP34s99SSMnlUo1hySUmJkmNZtenVV1+VW21eNagsANAaja3X+ve///3atWsNDQ2PHj3avHkzwzB+fn7suyNGjLhz587Dhw/T09Pz8vK8vb3V2Zafn5+dnZ1ib1M106ZNi4uLKyoqamhoyM/Pj46OXrt2raenZ2RkpPqFf/bZZ5WVlaNHj1a/KAAAAH2wcePGfv36vfPOOykpKVVVVRUVFTt27Fi7dm10dLT6d19FItH777//+++/19bWXrp0KTw83NzcfMuWLUpu+osvvrC1tV20aFFqampNTc2NGzfCw8PlRoEqk0c1ciVfv3599uzZDg4O6pcsR7MNIZWhsgBAe7hTMykzA9i//vUv7sdXrVrFMExWVlZUVNTLL79M12v18vLatWtXc3Mz+6lbt255e3uLRCIXF5etW7cyDJOeni5XTmZmJjdl48aNdLpd1po1a2hp3t7ebU+dJxKJ2t7rmzdvMgzT1NR0/vz5JUuWvPbaa7169eLz+VZWVq+++uoXX3yhuPjN999/L1dIdXV1axsNDAxsMTC5Er755pu2jzaDOYQVEMzaBwDAof05hBmGKS8vX7x4cd++fc3MzHr06BEQEJCamkrfUu36zrYunJyc/t//+3++vr5isVgoFPr4+Jw/f17JTVO3b99+4403rK2t6Uonx48f9/f3p4XPmTNHmTxyc3PMnDlTcaeYv17Tg4OD5Uq2tLQcPXr0b7/99vrrr1taWipfC8nJyYrtll27dnHzqN8QomsloLJUriyC1ggH5hAGjVO8HvEYzn8yHZXOKHSuQIfoqG48KsDi8XgJCQl4kgQAgNLgtRtXnM4waNCgurq6+/fv6zoQaJ/ylYXWCBd6EKBxitcjjY0QBtAf+/fvZ6crVBxHdP/+/SlTpjx9+vTx48dstuHDh9fX13Ozcd/l8XjqzKfV2U6ePDlw4MA2BuZlZWUFBwfb2NhYWVmNGzdO7imjJ0+ebN++3c/Pz9bWVigUDhgwYObMmYorHHBNmTKFx+OtX7+em7h8+XL6a6vKUDWoGq3R56pZvnw5ewzl5v0HPVdSUmJra/vixQs2JT8/Pzc3l/vMFOgJVJYOGcc1xaCD51LzgqhMHvXbIYR0fIQwaBlGCMshSozJiY2NJYRs27ZN8a2rV692796dOzabHQ0VFRWlmD89Pd3Ozk7NmDvPvXv3Jk+ePHToUGtr69YWo8/IyBAKhTKZrKioqKysbN68eXw+//Tp02yGOXPm8Pn8r776qri4uLa29ty5c4MHDzY1NT1y5EiLBe7bt48esXXr1skF4+rqunr1atX2BVWDqtEOA6oaU1PT1157rd090skIYWhRcXExIWT27NkPHjyora39/fff//a3v9na2ubm5uo6NJCnZmUp0xrpOjr0LWRk1xSDDl4jF0Rl8qjQDlG8HqHXqu+03IYQiURjxozR5/LV6bVWVVU5OzvLfa1kZmYKBAI7OztCSFxcnNxH9PzrZsaMGRs3bnzx4oWTk1OLXzdNTU3u7u6Ojo7Pnj2jKY2NjW5ubi4uLvX19TRlzpw58+fP534qKyuLEDJgwADFAgsLC7t16xYREaHY/qYfpIOmOrojqBoGVaMtBlQ16LUaop9//nnq1KkvvfSSubm5vb39zJkz7927x77bxl0EdvIO0Jq2K6tt2uy16n/bTPlvIeO7phh08Bq5ICqTh+l4OwS9VsODXqscdXqtq1at4vP5hYWF3MTMzEyJRHLq1CkTExMrK6vbt29z39Xzrxv2C6K1r5tff/2VEPLBBx9wEz///HNCSFJSUhslC4VCExMT7pxq1MSJE+fPn0+PsGL7m2EYqVTq7Oz84sWLDu0IqoZC1WiBAVUNeq0Aegu9Vi7lv4WM75pi0MFr5IKo/EWzQ+0QxesRnmuFroJhmN27d9P5ohXfDQwMXL16dXV1tVQqlXsyQZ8JhcK2M/zyyy+EELmnKejLtLS01j5VW1tbV1c3ZMgQHo/HTd+7d29OTk50dHQbW5w6dWpBQQF3ueZ2oWpYqBotMI6qAQAwOEZ5TaEMNHiNXBCVv2iqebFDr9UrL0wWAAAgAElEQVR40Pnl+/XrZ25u3q1bt6CgIPrjByFk/fr19FnwsWPH0pRTp07RlO7du9OU6OhoHo9XW1t74cIF+hZ9LJum83g8Z2fnzMxMf39/KysrS0tLX19f9klrdcrXmuzs7NLSUg8Pj9YyrFmzJiAg4Nq1ax988EHbRbVxqI8ePco+eZ+fny+TyWxsbOzs7CZNmpSbm8stpKysbOHChXRgUo8ePUJDQ+kIQ826desWIcTZ2Zmb6OTkRAhpYy11OmPbqlWruIkFBQUff/zx3r17rays2tjisGHDCCGnT59WPkhUDQtVg6oBAGOCthmXcV9TDDr41ihzQVT+oqnuxY574xUjhPWQkuO1iouLXV1d7e3tk5OTq6qqbt++HRoayuPxuCu8KY4A8fT0lBu30NooEQ8PD5FINGrUqIsXL9bU1GRmZg4dOtTc3Pzs2bMaKd/X19fW1jY9Pb3dPSWqjhCmiV988YVcZjq0g/5dVlbm4uJCCNm/fz9NURzaocyhDgkJIYSEhITQw5WamkpXmWMzFBUV9enTx97e/sSJE9XV1devX/fx8bGwsGhj8b22tTa0Y/z48YSQjIwMbuLdu3cJISNGjGixqJKSEnt7+7lz58qlBwYGvvvuu/TvNsY6VlVVEUK8vb2VDx5Vw0LVoGq4MEIYQG8p0xrpOm0zJb+FjPKaYtDBs9S5ICp/0exQOwTPtRoeJdsQb7/9NvnfouFUfX19r169hEJhSUkJTVHzm5EQcvXqVTbl2rVrhBAPD482Pqt8+T4+Pm0vmM5Sude6efNmQsjWrVvlMnO/bhiGSU9PNzMzE4lEN2/eZFr6ulHmUNOvm+TkZDZPWFgYIaSsrIy+nDVrFiHkwIEDbIbi4mKBQODp6dneAWhZh75u6E9fLW7r8ePHw4YNk8lkjY2N3PSdO3f27du3pqaGvmyj/c0wDI/H69+/v/LBo2pYqBpUDRd6rQB6S5nWSNdpmyn5LWSU1xSDDp6lzgWxQxdN5dsheK7VaB05coQQEhwczKYIBAJ/f/+6ujpNjToTiUT0zj71yiuv9OrVKzs7m84dr6azZ89WVFSMGjVK/aJaQx8zMDMzazubl5dXdHR0bW2tVCqtq6tTzKD8oR45ciT7N/3traioiL48evSoiYnJpEmT2AwODg7u7u6XL18uKCjo6K61wcbGhhBSW1vLTaQv6Vty6YGBgYMHDz5w4ICpqSmb/uDBg6VLl+7du1ckEimzUT6f3+Khaw2qhoWqQdUAgNFA20xOV7imGHTwipS5IHbooqnOxQ69VmPQ0NBQVVVlYWEh9+iUvb09IaSkpEQjW1E883r27EkIefTokUbK72wWFhaEEO564q1ZuHChTCa7fv36+++/L/dWhw61RCJh/zY3NyeENDc3s4U0NzdLJBLuCtRXrlwhhNAxFZoyaNAgQojcV1hhYSEhZODAgdzExsZGqVTq5OS0b98+buObEEIHsbz++utsqHQNj08//ZS+vHfvnlxR7T7fz4WqYaFqUDUAYBzQNlPURa4pBh28HGUuiMpfNIl6Fzv0Wo2BQCCQSCT19fXV1dXc9NLSUkKIg4MDfWliYvL8+XNuhsrKSrmieH+d/ZKrvLyc+etac/Q7kX4/ql9+Z3N0dCSE0CH17dq9e7ebm9vevXvpoD6Wkoe6bQKBwMbGhs/ntzj3t6+vr7K7pARa2uXLl7mJ9KW/vz83MSoqqqGh4dChQ+xMDP3798/IyCCEvPfee3JByo117N+/P1vO06dPGYahR1tJqBoWqqY1qBoAMCxomynqOtcUgw6eS5kLovIXTTUvdui1GompU6cSQrhzSTc0NKSlpQmFwsDAQJri6OhIf/mgSkpKHjx4IFeOpaUl++3m5ua2c+dO9q36+vrMzEz25R9//FFUVOTh4cGefGqW39mGDBlCFH4Kao1YLD58+LBIJPruu+/k3lLmULcrNDS0sbGRneiP2rRpU+/evRsbG5UsRBk+Pj6DBw9OSkpi52FvamqKj493cXHhjk75/PPPc3Jyjh07JhAI1NwiPQfo0VYSqoamoGrahqoBAMOCtpmcrnNNMejguZS5ICp50STqX+y4vXPMxqSHVJhD+OnTp+yMZDt37mTz0IEK33zzTXV19b1796ZNm+bk5CT3jPiECRMkEsmDBw8uXrzI5/Nv3LhB0z08PCQSib+/fxvz1KlTvhbmEG5ubu7Zs6fifANyj9Fz7d+/nxDSxuRvrR1q+hh9XV0dm7Js2TLCmTKhtLS0X79+ffv2PXnyZGVlZXl5+fbt2y0tLbm7NnPmTEJIXl5e2ztLtfYYPcMw6enpFhYW06dPLy4ufvz4cVRUFJ/PP3XqFJvh+++/b+37obUaaWNembi4OELIkSNHlN8RVA2qhkHV/LVqKMzGBKC3lGmNdJ22mZLfQkZ5TTHo4FnqXBCVzMO0frFrEeYQNjzKtyEeP368aNEiV1dXMzMziUQSGBiYlpbGzVBZWTl37lxHR0ehUDh27NjMzExPT0/azFq2bBnNc+vWLW9vb5FI5OLiwp3kzcPDw8nJ6caNG4GBgVZWVkKh0MfH5/z585oq39vbu7PnEGYYZuXKlXw+v7CwkL4sKyvjtjVbnHhtwYIFcl83TJuHOj09nVvmqlWrmL8O3QkODqY56Wpdffv2NTMz69GjR0BAQGpqKncrfn5+YrFYblZSOcnJyYqNZu7k6dSVK1eCgoKsra3FYrGfn59cxcn9EtZ2+zsqKkouT2BgIDcDfczv+fPnHdoRVA2qBlXDrRoKvVYAvUWUaI0wXaZtpvy3kDFdUww6eEojF0Tl87R2sWsReq2GR0/aEPSbUddRMIx6vdbKykonJ6eoqKhOi05jnjx5IhQKFZd/1HNZWVk8Ho87n7uSO4Kq6WyoGr2lWDUs9FoB9JaSvdZOpT9tM+W/hXBN0Q49DL6Ni12LsPINdGkSiSQ5OTkpKWnr1q26jqUtDMMsXLjQ2tp63bp1uo6lA/Ly8kJDQ1esWDF9+nSaovyOoGo6FapGbylWDQCAEcM1RQv0MHiNXOzQawWjtWDBAh6PJxaLuYnDhw+/dOlSSkrK06dPdRVYu0pLS/Py8tLS0pScTU5P7NixY8OGDRs2bGBTOrQjqJrOg6rRW4pVQwhZvnw5XcagqalJV4EBAHQSXFM6mx4G3+LFrqN4DGe09KFDh2QyGfPX8dOgW1KplBCSmJioqwCio6OXLl3Kvly1atX69et1FQwhhMfjJSQkTJs2TYcxAADoDw1eu3V+xQEwFLptjehb2ww9CNA4xesRX3fBgGFYsmTJkiVLdB0FAAAAABCCthl0SRghDAAAAAAAAPoLvVYAAAAAAADQX+i1AgAAAAAAgP5CrxUAAAAAAAD0F3qtAAAAAAAAoMcYjoSEBF2HAwAAAB3GaEJYWJiu9wMAAIAQQsLCwrhXqL+s11pQUHDx4kUdBgcA0NlSU1N/+eWXvLy8bt26jRo1asyYMf3799d1UADq0si6kenp6Q8fPlS/HOgiKioqLl68eOHChby8PBsbm1GjRoWFhYnFYl3HBQDGwMXFZdSoUezLv/RaAQC6iPz8/ISEhB9++OHWrVu9e/d+4403Zs2aNWLECF3HBQCg7548eZKcnJyYmHjq1CmRSDRlyhSpVBoUFMTn83UdGgAYLfRaAaBLy8nJSUxMjI2NzcvLGzx4sFQqDQ8Px91XAAA5dXV1P//8c2xs7LFjx0xMTMaNGyeVSsPCwiwtLXUdGgAYP/RaAQBIc3PzxYsXExMTExISSktLPT09IyIiZDKZg4ODrkMDANClhoaGM2fOJCYmHjlypK6uztfXNyIiYurUqVZWVroODQC6EPRaAQD+T1NTU3p6emxsbHx8fE1NzahRo6RS6cyZM7t3767r0AAAtIf9Le/gwYPl5eX0y3DGjBk9e/bUdWgA0BWh1woA0IL6+vrU1NTExMTDhw83NTWNHz9eKpWGhoZiohEAMG45OTmxsbExMTHFxcX0uYnIyMi+ffvqOi4A6NLQawUAaEtVVdWxY8cSExNPnz7N5/MnTZoUERExYcIEMzMzXYcGAKAxN27cOHToUFxc3N27d1966SWZTDZ79mw3NzddxwUAQAh6rQAASqqoqEhKSoqJibl48aKNjc2kSZMiIyP9/PxMTEx0HRoAgIoePnz4448/JiYmXrhwwdnZOTQ0VCqVjh07VtdxAQD8BXqtAAAdg0YeABg6/AwHAIYFvVYAABVhQB0AGBY88gAABgq9VgAAdWHyEgDQZ5heDgAMHXqtAACagYUiAECvYCkvADAa6LUCAGhYQ0PDmTNnEhMTjxw5UldX5+vrGxERMXXqVCsrK12HBgBdwuXLl2NiYhISEkpLSwcPHhwZGTlr1iwHBwddxwUAoCL0WgEAOktdXd3PP/8cGxt77NgxExOTcePGSaXSsLAwS0tLXYcGAEYoJycnMTExNjY2Ly+PPq0QHh7ev39/XccFAKAu9FoBADrdkydPkpOTExMTT506JRKJpkyZIpVKg4KC+Hy+rkMDAIOXn5+fkJDwww8/3Lp1q3fv3m+88casWbNGjBih67gAADQGvVYAAO0pLCxMSkpKTEy8ePGira3tm2++GRERMWbMGB6Pp+vQAMDA4PsEALoO9FoBAHTg/v378fHx3HsjkZGRnp6euo4LAPQdO3YjJSXFyspq8uTJGLsBAEYPvVYAAF2iz6Ht378/NzeXPoc2c+bMAQMG6DouANAveE4eALoy9FoBAPSC4pyfkZGRjo6Ouo4LAHQJc5IDABD0WgEA9ArWVwQAwln/OS4urqKiAus/A0AXh14rAIA+qq+vT01NTUxM/PHHHxsbG8ePHy+VSkNDQ8Visa5DA4BOlJOTExsbGxMTU1xcTJ8amDVrlqurq67jAgDQJfRaAQD0WlVV1bFjxxITE0+fPs3n8ydNmhQREREYGGhubq7r0ABAY+gj7nFxcXfv3nV1dZ02bdrs2bPd3Nx0HRcAgF5ArxUAwDBUVFQcP348NjY2LS3NxsZm0qRJUql04sSJpqamug4NAFT08OHDH3/8MTEx8cKFC87OzqGhoVKpdOzYsbqOCwBAv6DXCgBgYLjNXCcnpzfffFMqlWKRRgADUl5efvjw4ZiYmIsXL3br1i04ODgyMtLf3x//xQAALUKvFQDAUN24cePQoUMHDx68c+fOSy+9JJPJ3n777UGDBuk6LgBoWYsD/idMmGBmZqbr0AAA9Bp6rQAABo9O3xIbG1tUVESnb4mMjOzbt6+u4wIAQjiTqx0+fLipqYlOrvbmm2+KRCJdhwYAYBjQawUAMBLsUhkHDx4sLy+nS2VMnz7d3t5e16EBdEXsQlYHDx6sra3FQlYAACpDrxUAwNg0NTX9+uuvMTExR48effbsmZeXV2Rk5PTp062trXUdGoDxY38/io+Pf/TokaenZ0REhEwmc3Bw0HVoAACGCr1WAACjVVdX9/PPP8fGxh47dszExGTcuHFSqTQsLMzS0lLXoQEYIbp6TWxsbF5eHh2rHx4e3r9/f13HBQBg8NBrBQAwfpWVlT/99FNiYuKpU6dEItGUKVOkUinmgAHQiPz8/ISEhO+///727dt9+vQJCQmZNWvWiBEjdB0XAIDxQK8VAKALKSoqSkxMTExMvHjxoq2t7ZtvvhkREYFVcwBUUFhYmJSURNeg6t69e2hoKP6bAAA6CXqtAABd0f37948ePbpv376rV6+6uLhMnTpVKpWOHTtW13EB6LsnT54kJycnJiampKRYWVlNnjxZKpUGBQXx+XxdhwYAYLTQawUA6NLok3j79+/Pzc2lT+LNnDlzwIABuo4LQL/U1dUdP348JibmzJkz9CnxyMjIkJAQc3NzXYcGAGD80GsFAABCCLl8+XJMTMyhQ4dKSkoGDx4cGRkZGRnp6Oio67gAdKmhoeHMmTOJiYlHjhypq6vz9fWNiIiYOnWqlZWVrkMDAOhC0GsFAID/w64wGR8fX1NTQ1eYfOutt3r06KHr0AC0h129Ji4urqKigv4jzJgxo2fPnroODQCgK0KvFQAAWsDeYvrxxx8bGxvHjx8vlUpDQ0PFYrGuQwPoRDk5ObGxsTExMcXFxXTM/KxZs1xdXXUdFwBAl4ZeKwAAtOXZs2cnTpyIiYk5ffo0n8/39/fH43xgfOgD3gcOHLh3797LL788bdq0t956a+DAgbqOCwAACEGvFQAAlFRRUXH8+PHY2Ni0tDQbG5tJkyZh6lQwdA8ePDhy5EhMTMyVK1ecnZ1DQ0MxmTYAgB5CrxUAADqmoKDg8OHDdJlKJyenN998UyqVYplKMCDl5eWHDx+OiYm5ePFit27dgoODIyMj/f39cQ4DAOgn9FoBAEBFN2/eTEhIOHjw4J07d/r06TN9+vS333570KBBbX+qurr6nXfe2bVrl42NjXbiBKO3c+dOW1vbsLCwtrNVVlb+9NNPiYmJp06dMjc3Dw4OjoiImDBhgpmZmXbiBAAA1aDXCgAA6qLPBMbExPz55590ApuIiIh+/fq1mDkmJmbWrFl9+/Y9fvz4yy+/rOVQwcjU1dXNmzfvwIEDEydOPHHiRIt56uvrU1NTExMTDx8+3NTURKcWe/PNN0UikZajBQAA1aDXCgAAmsEuFhIfH//o0SNPT8+IiIjp06fb29tzswUGBqalpfF4PHNz8wMHDrzxxhu6ChgM3f3796dMmXLz5s0XL17w+fzS0lJbW1v23aampl9//TUmJubo0aPPnj3z8vKKjIycPn26tbW1DmMGAAAVoNcKAAAa1kZvoayszNHRsampiRBCnyH85JNPNmzYYGpqquuowcCcO3du6tSp1dXVL168IISYmppu27Zt3rx5Lf56IpPJHBwcdB0yAACoCL1WAADoLM+ePTt27Fh8fPypU6dMTU2Dg4NtbW337NlDe62Uqampr6/voUOHunXrpsNQwbDs3Lnz3XffJYSw55KJiYmHh4evr29CQkJhYeGwYcNmzJgxffr03r176zRSAADQAPRaAQCg07Gz4Jw5c6axsbG5uZn7rpmZmaOj4/Hjx1955RVdRQiGor6+fu7cuXFxcYoNGB6P5+TkFBoa+vbbbw8fPlwn4QEAQGdArxUAALTk4cOHffr0afG6w+fzTUxMdu3aFRkZqf3AwFA8ePBg8uTJN27caGxsVHyXz+dv3rz5o48+0n5gAADQqUx0HQAAAHQVBw8ebO351cbGxufPn8+aNWv+/PktdkgATp069corr9y8ebO1M6SpqWnfvn1ajgoAALQA91oBAEBLhgwZcuPGjbavO6ampl5eXj/++GPPnj21FhjoOYZhNm/evHLlSkKI3PByRXfu3BkwYIBW4gIAAC1BrxVAXf/5z3/S09N1HQWAvquurj59+jSPx6NTB7eGYRiGYYRC4ZgxY2xsbLQWHuitxsbGzMzMwsJCQoiJSTtjxJqbm93d3bEOMIAyEhMTdR0CgLL4ug4AwOClp6dnZGR4eXnpOhDQmIyMDEII6pSVlJTk5eXl7OysTiF1dXV9+/ZVPv/9+/eFQqFAIFBno2AE/vzzT4FAoPzJ027PFgAKCgrolQ7AUKDXCqABXl5e+MHSmEilUoIfoTl4PN5HH300bdo0XQcCAAAacOjQIZlMpusoADoAv0cCAAAAAACA/kKvFQAAAAAAAPQXeq0AAAAAAACgv9BrBQAAAAAAAP2FXisAAHSK/fv38/5HLBbLvXv//v0pU6Y8ffr08ePHbLbhw4fX19dzs3Hf5fF4r776qhb3oH0GHTzXyZMnBw4cyOe3OkdjVlZWcHCwjY2NlZXVuHHjLly40NE8y5cvT0hIUCdI4zhnuNQ87E+ePNm+fbufn5+tra1QKBwwYMDMmTOzs7Pb2OKUKVN4PN769eu5iagaRfpcNcuXL2ePIea6h64DvVYAAI2pqakZMGDApEmTdB2IHtm2bRvDMDU1NdzErKysV199NSAgwNraunv37gzDZGZm0vRFixZxc9J309PT7ezsGIa5dOmSVqNvj0EHT+Xm5k6ZMmXFihWlpaWt5fn9999Hjx5tZWV18+bNP//8s2/fvq+//vqZM2c6lGfevHkrVqz49NNPVYvTaM4ZSiOHfenSpR988EFISMiNGzfKy8v37t2blZXl6el59OjRFguMiYlJTk5WTEfVcOl/1fzzn/+k61qbmpqqupcABogBAPWEhYWFhYXpOgrQJJXr9OnTp3379g0KCtJ4SEoSiURjxozReLGEkISEhI5+KjY2lvyv18pVVVXl7OwcFRXFTczMzBQIBHZ2doSQuLg4uY+wzVz9ZNDBz5gxY+PGjS9evHBycjI1NVXM0NTU5O7u7ujo+OzZM5rS2Njo5ubm4uJSX1+vfB6GYbKysng8ngrnkvGdMxo57HPmzJk/fz73U1lZWYSQAQMGKBZYWFjYrVu3iIgIQsi6devk3kXVsAyoakxNTV977TUV9pFhGHoLV7XPAugE7rUCAGiMlZVVbm7uyZMndR2IXtu8eXNJSclnn30ml25hYXHgwAETE5OoqKg7d+7oJDaVGW7we/bsWb58eRsjIc+dO5eTkxMWFiYUCmmKqanpjBkzHj58ePz4ceXzEEI8PDzCwsI+/vjjxsbGDgVpfOeMRg777t27d+zYwf2Uh4eHUCjMzc1lGEauwHnz5kml0oCAgBY3h6phGU3VABgZ9FoBAEB7GIbZvXv3a6+91qtXL8V3AwMDV69eXV1dLZVK5Z6I038GGjzb8m7NL7/8QgiRewSRvkxLS1M+DzV16tSCgoITJ04oH6FRnjMaOeyKamtr6+rqhgwZwuPxuOl79+7NycmJjo5uY4uoGso4qgbA+KDXCgCgGUePHmVnyKBNNG5Kfn6+TCazsbGxs7ObNGlSbm4u/VR0dDTN4OzsnJmZ6e/vb2VlZWlp6evry07vsX79eppn7NixNOXUqVM0pXv37txyamtrL1y4QN9q416BDmVnZ5eWlnp4eLSWYc2aNQEBAdeuXfvggw/aLqq8vHzx4sX9+vUzNzfv1q1bUFDQr7/+St9S5shTZWVlCxcufOmll8zNzXv06BEaGkoH8qnGoINvza1btwghzs7O3EQnJydCCHsPTZk81LBhwwghp0+fVj4A4z5nWqP8IeVKTEwkhKxatYqbWFBQ8PHHH+/du9fKyqqNLaJqlGQQVQNghHQ6PhnAGOC5VuOjTp2GhIQQQurq6uRSQkJCLl68WFNTk5qaKhQKR44cyf2Uh4eHSCQaNWoUzZOZmTl06FBzc/OzZ8+yeRSfWfX09JR7PKy151p9fX1tbW3T09NV2ymiuedaaeIXX3whlzkzM1MikdC/y8rKXFxcCCH79++nKYoPwhUXF7u6utrb2ycnJ1dVVd2+fTs0NJTH4+3atYvN0+6RLyoq6tOnj729/YkTJ6qrq69fv+7j42NhYXHx4sUO7alBB89q7Sm+8ePHE0IyMjK4iXfv3iWEjBgxQvk8VFVVFSHE29tb+cCM8pxhqXPY5ZSUlNjb28+dO1cuPTAw8N1336V/04Op+PAkg6pRoP9Vg+daoUvBvVYAAG2YO3fuqFGjRCLRuHHjgoODMzMzHz9+zM1QW1v73Xff0Tyvvvrq/v37nz9//uGHH2pk683NzfRLXyOlqaO4uJgQIpFI2sjTvXv3Q4cOmZmZRUVF0dsailasWPHnn39+9dVXkyZNsra2HjhwYFxcnKOj48KFC+Vm/mzjyK9YseL+/fv/+c9/Jk6cKBaL3d3d4+PjGYZp976QsQavPHouyY11VCaPtbU1j8ejp4GSjP6cUV4bh728vHzChAmvv/769u3buem7du26e/fu5s2b2y0cVaMOfasaAOODXisAgDaMHDmS/ZveeSgqKuJmEIlEdBgY9corr/Tq1Ss7O1sjLZWzZ89WVFSMGjVK/aLURMdOm5mZtZ3Ny8srOjq6trZWKpXW1dUpZjhy5AghJDg4mE0RCAT+/v51dXVy4+jaOPJHjx41MTHhrlTk4ODg7u5++fLlgoKCju6acQSvyMbGhhBSW1vLTaQv6VtK5mHx+fwWD0trusI5o6hDh7S2tjYwMHDw4MEHDhzgroby4MGDpUuX7t27VyQSKbNRVI0yDKJqAIwPeq0AANrAvR1hbm5OCGlubuZmUGzu9OzZkxDy6NGjzo9OeywsLAghL168aDfnwoULZTLZ9evX33//fbm3GhoaqqqqLCws5B4Gs7e3J4SUlJRwE1s78rSQ5uZmiUTC47hy5QohhI73U5lBBy9n0KBBhBC5dn9hYSEhZODAgcrnYTU2NrY74Q1XFzln5Ch/SBsbG6VSqZOT0759++QW8KQDbl9//XU2VLq8yqeffkpf3rt3T64oVE27DKJqAIwPeq0AAHqhvLxcbgQv7a/SvishxMTE5Pnz59wMlZWVcoW0PWJTHzg6OhJC6GNa7dq9e7ebm9vevXvpE18sgUAgkUjq6+urq6u56XQwoYODgzKFCwQCGxsbPp//4sULxednfH19ld0lYwyei5Z2+fJlbiJ96e/vr3we6unTpwzD0NNASV3nnOFS/pBGRUU1NDQcOnSInYCtf//+GRkZhJD33ntPLki5hyf79+/PloOqUZJBVA2A8UGvFQBAL9TX12dmZrIv//jjj6KiIg8PD7al4ujoSH/Op0pKSh48eCBXiKWlJduzdXNz27lzZydH3WFDhgwhCrcpWiMWiw8fPiwSib777ju5t6ZOnUoI4S4F0dDQkJaWJhQKAwMDlQwmNDS0sbGRnauZ2rRpU+/evdVfGtGgg+fy8fEZPHhwUlISu3hJU1NTfHy8i4sLO6RTmTwUPYfpaaCkrnPOcCl5SD///POcnJxjx44JBAI1t4iqUZJBVA2A8UGvFQBAL0gkkpUrV6anp9fW1l66dCk8PNzc3HzLli1shoCAgKKiom+//bampiY3N/fDDz9kb/lhagAAACAASURBVMOyRowYcefOnYcPH6anp+fl5Xl7e9N0Pz8/Ozs7+hu/bnl4ePTs2TM7O1vJ/O7u7jt27FBM37hxo6ur66JFi44fP15dXX3nzp233nqruLh4y5YtdGChMjZu3NivX7933nknJSWlqqqqoqJix44da9eujY6OZu+NhIeH83i8P//8U8kyjSZ4lomJyZ49eyoqKmbPnl1SUlJeXv7ee+/dvXt3165ddICoknkouhJJQEAAm9JukF3qnGEpc0h/+OGHf/zjH7///ruVlRV3WKzcejBKQtUoSR+qBqArUhxHAQAdgpVvjI9qdUonFGHNnDkzPT2dm7Jq1Srmr2OAg4OD6Wc9PDycnJxu3LgRGBhoZWUlFAp9fHzOnz/PLb+ysnLu3LmOjo5CoXDs2LGZmZmenp60nGXLltE8t27d8vb2FolELi4uW7duZT/r7e3drVs3lVeAIJpb+YZhmJUrV/L5/MLCQvqyrKyMe0w8PT0Vi1qwYIHcUhkMwzx+/HjRokWurq5mZmYSiSQwMDAtLY2+pfyRp6tE9u3b18zMrEePHgEBAampqdyt+Pn5icXixsbGFvfRoIOnkpOTFdsG3BVHqCtXrgQFBVlbW4vFYj8/P7mTU/k89DG/58+fdyhIYzpnKI0cdrn72FyKy1xFRUXJ5QkMDORmQNVQBlE1FFa+gS4F5yuAutBrNT7ar1Paa9XmFjuEaLTXWllZ6eTkFBUVpaHoOtGTJ0+EQqHiKosGQQ+Dz8rK4vF4Bw8eZFOUDBLnTGdD1egtxaphodcKXQpGCAMAgFZJJJLk5OSkpKStW7fqOpa2MAyzcOFCa2vrdevW6TqWDtPD4PPy8kJDQ1esWDF9+nSaonyQOGc6FapGbylWDUCXhV4rgDZER0fTZ1qcnZ11HUtbTp48OXDgQPYRoI4Si8XcB3iio6Nby9nU1LR9+/bRo0dLJBIzM7NevXpNnDjx22+/zc/PpxmGDRvGa8/69etramq4KXIDybiWLl3K/aBqOwgqWLBgAY/HE4vF3MThw4dfunQpJSXl6dOnugqsXaWlpXl5eWlpaUrOYqpX9DD4HTt2bNiwYcOGDWxKh4LEOdN5UDV6S7FqCCHLly+n17KmpiZdBQagA7q80QtgFJQfTarPo0Dv3bs3efLkoUOHWltbm5qaqlzO1atXCSEhISFtZ5sxY4aJicmmTZsePnxYV1d37969lStX8ng89mEnDw+PxMRENj997CclJYVNkclk7AoBdKOEkKCgoBY39/jxY9prmjlzpjJ7oc0Rwv/617+438n0kS19Q1QaIQwAAPoJI4TB4OBeK4D+EovFY8eO1c62Pv3009GjR1++fFlunffOkJmZefDgwTlz5nzyySfOzs4WFhb9+vXbsGHDggULVC5TKBT26dMnJSXl0qVLiu9++eWXLi4uaoTciZYsWcL9UsZ9YAAAAAA56LUCACGE7NmzZ/ny5SqPDe6QnJwcQoibm5tc+rRp09i/s7KywsLC2igkPj5+9erV7EsTE5Ply5cTQhR7fZWVldu2bVu2bJmaYQMAAACATqDXCgCEECIUCrW2Lbr+Xmpqqly6j4/P48ePVS529uzZTk5OP/3007Vr17jpX3/99cSJE/v166dyyQAAAACgQ+i1AuhMQ0PDZ599NmjQIEtLS1tb28mTJ//00090cgU6e1Ntbe2FCxfopAv0LujRo0fZKYXu378vk8msrKzs7OwiIiKePHmSn58/efJkKysrR0fHefPmVVdX63oXW+bt7e3g4HD69OmgoKCzZ882NzdrpFiBQLB06VKGYbgTV9TU1HzzzTcrV67UyCYAAAAAQPvQawXQmffff//rr7/+5ptvysvLb968OWjQoJCQkP/+97/kf886ikSiMWPG0McdGxsbCSFvvPEGwzAhISGEkMWLF3/yySclJSVfffXV/v37Z86cuWjRonXr1hUXF3/++ee7d+9es2aNZgP28/Ozs7PLyMhQsxyxWJyYmOji4nLq1ClfX19HR8fw8PCDBw8+e/ZMzZLnz59vb2+flJR08+ZNmrJ161Y/P7+XX35ZzZIBAAAAQFfQawXQmbS0NHd39/HjxwuFQnt7+3/9618DBw5U/uNz5szx9PQUiUQRERHu7u4pKSmLFy8eNmyYWCyOiopydXU9efKkZgNubm6mXWj1ixo7duzdu3f37dsXEhJSV1d34MCBt956q3fv3vHx8eoUKxQKFy9e3Nzc/MUXXxBCnj179uWXX65atUr9gAEAAABAV7Qx8woAtGjChAnbtm2bP3/+O++8M3LkSFNT09u3byv/8VdffZX9u1evXjk5OdwUJyen7OxsTYZLyNmzZzVYmkAgiIyMjIyMbGxsPHfu3K5du+Lj48PDw93c3IYPH65yse++++7mzZsPHjy4Zs2a5ORkLy+voUOHqlBOUlISj8dTOQzjI5PJZDKZrqMAAACArgi9VgCd2bp166hRo/bt2+fv708I8fb2joqKmjp1qpIft7a2Zv82MTExNTW1tLRkU0xNTTX1vGhn4/P5fn5+fn5+ffr02bRpU1JSkjq9VrFYvGjRok8//XTNmjVnz549duyYauV4eXl99NFHKodhZGQy2aJFi0aNGqXrQAAAQAPS09O/+uorXUcB0AHotQLoDI/Hi4iIiIiIePHixdmzZ6Ojo0NDQ//9738vXryYzaDbCDvJhQsXQkNDS0tL5dJ9fX03bdr05MkTNcv/4IMPoqOj4+LigoKCuPefO8TZ2Zm7Ek8XJ5PJRo0ahQMCAGA00GsFw4LnWgF0xsbG5tatW4QQMzOz8ePH0/mBT5w4wWawtLR8/vw5/dvNzW3nzp26CVRD+Hw+3V+GYR49eqQ4q9OlS5cIIercaKUkEsnixYslEgl3QVcAAAAAMFDotQLo0t///vdr1641NDQ8evRo8+bNDMP4+fmx744YMeLOnTsPHz5MT0/Py8vz9vbWYahEc3MIU9OmTYuLiysqKmpoaMjPz4+Ojl67dq2np2dkZKT6hX/22WeVlZWjR49WvygAAAAA0C30WgG0ga6/mp2dXVhYyOPx6D3A3377bdCgQdOnT7e1tX355ZdPnTq1a9cu7sqiX3311dChQ19++WWZTLZly5aXX345IyODx+PRZzWFQuHq1asvXbrE4/FOnz7d1NTE4/H++c9/nj9/nsfj/fbbb7W1tTwe7/PPP1cmwuPHj9NlYAsLC2lRPB5v9+7d3DyNjY1tzyEsFovpndJjx47xFNClaAkho0ePPn/+vEwm+/rrr0eOHCkWi4cOHZqQkPD555+fO3dOIBBwy/zhhx94PN6OHTsIIUFBQTwer6amRnGjdGcnTJjQYmA8Ho/2+Q8cOMDj8b799ltljgkAAAAA6AOeRhaxAOjKpFIpISQxMVHXgYDGoE7l8Hi8hIQEPNcKAGAcDh06JJPJ0AsAA4J7rQAAoAH79+9n76uLxWK5d+/fvz9lypSnT58+fvyYzTZ8+PD6+npuNu67PB5P5cm0OolBB8918uTJgQMH8vmtzsiYlZUVHBxsY2NjZWU1bty4CxcucN998uTJ9u3b/fz8bG1thULhgAEDZs6c2fZSW1OmTOHxeOvXr+cmLl++PCEhQZ0dMY7zigtVo85GO5U+V83y5cvZY+jl5dXxnQMwBAwAqCcsLCwsLEzXUYAmoU7lEEISEhLazhMbG0sI2bZtm+JbV69e7d69+zfffMOmZGZm0mtQVFSUYv709HQ7Ozs1Y+48Bh38vXv3Jk+ePHToUGtra1NT0xbzZGRkCIVCmUxWVFRUVlY2b948Pp9/+vRpNsOcOXP4fP5XX31VXFxcW1t77ty5wYMHm5qaHjlypMUC9+3bR4/YunXr5IJxdXVdvXq1avtiZOcVqka1bWmBAVWNqanpa6+9psxO0a6vMjkB9ATOVwB16X8Pp43frdasWaPr6PSRlutUJBKNGTNGn8tXp9daVVXl7Ows11TNzMwUCAR2dnaEkLi4OLmP6HkT1qCDnzFjxsaNG1+8eOHk5NRi+7upqcnd3d3R0fHZs2c0pbGx0c3NzcXFpb6+nqbMmTNn/vz53E9lZWURQgYMGKBYYGFhYbdu3SIiIhTb3/SDdPx5R3fE+M4rVE1HN6Q1BlQ16LWCEcMIYQDj18ZXgJJzNQGobPPmzSUlJZ999plcuoWFxYEDB0xMTKKiou7cuaOT2FRmuMHv2bNn+fLlbYxyPHfuXE5OTlhYmFAopCmmpqYzZsx4+PDh8ePHacru3bvpBGksDw8PoVCYm5vLKPxMNm/ePKlUGhAQ0OLmPDw8wsLCPv7448bGxg7tiPGdV6gavWU0VQNg0NBrBQCAzsIwzO7du1977bVevXopvhsYGLh69erq6mqpVCr3tJv+M9Dg2VZ1a3755RdCiNzjhfRlWlpaa5+qra2tq6sbMmQIj8fjpu/duzcnJyc6OrqNLU6dOrWgoIC7VHW7jPK8QtXoLeOoGgBDh14rAIDqysvLFy9e3K9fP3Nz827dugUFBf3666/0rfXr19O5McaOHUtTTp06RVO6d+9OU+iSSLW1tRcuXKBv0Z/zaTqPx3N2ds7MzPT397eysrK0tPT19WVn+FCnfK3Jzs4uLS318PBoLcOaNWsCAgKuXbv2wQcftF1UG4f66NGj7Ewk+fn5MpnMxsbGzs5u0qRJubm53ELKysoWLlz40ksvmZub9+jRIzQ0lA7SU41BB9+aW7duEUKcnZ25iU5OToSQNu6P0Qm3V61axU0sKCj4+OOP9+7da2Vl1cYWhw0bRgg5ffq08kEa93nVGlQNqoalQtUAGDwtjEIGMG76/1wrdJSSdVpcXOzq6mpvb5+cnFxVVXX79u3Q0FAej7dr1y42j+IzpZ6ennJPcLX23KmHh4dIJBo1atTFixdramoyMzOHDh1qbm5+9uxZjZTv6+tra2ubnp7e7p4SVZ9rpYlffPGFXObMzEyJREL/Lisrc3FxIYTs37+fpig+5KbMoQ4JCSGEhISE0MOVmpoqFApHjhzJZigqKurTp4+9vf2JEyeqq6uvX7/u4+NjYWFx8eLFdo+A0QTPau0JvfHjxxNCMjIyuIl3794lhIwYMaLFokpKSuzt7efOnSuXHhgY+O6779K/6Zmg+IQewzBVVVWEEG9vb+WDN8rzioWqYVA1DMOoVDV4rhWMGM5XAHWh12p8lKzTt99+mxBy8OBBNqW+vr5Xr15CobCkpISmqNlrJYRcvXqVTbl27RohxMPDo43PKl++j49Pt27dlGnAqdxr3bx5MyFk69atcpm5TViGYdLT083MzEQi0c2bN5mWmrDKHGrahE1OTmbzhIWFEULKysroy1mzZhFCDhw4wGYoLi4WCASenp7tHQDjCZ7VofY3vV/U4rYeP348bNgwmUzW2NjITd+5c2ffvn1ramroyzba3wzD8Hi8/v37Kx+8UZ5XLFQNg6phGEalqkGvFYwYRggDAKjoyJEjhJDg4GA2RSAQ+Pv719XVaWrglkgkoiPBqFdeeaVXr17Z2dnFxcXqF3727NmKiopRo0apX1Rr6KNrZmZmbWfz8vKKjo6ura2VSqV1dXWKGZQ/1CNHjmT/pvdzioqK6MujR4+amJhMmjSJzeDg4ODu7n758uWCgoKO7ppxBK/IxsaGEFJbW8tNpC/pW3LpgYGBgwcPPnDggKmpKZv+4MGDpUuX7t27VyQSKbNRPp/f4qFrTVc4rxShalA1XB2tGgBDh14rAIAqGhoaqqqqLCws5J4+sre3J4SUlJRoZCuKLZ6ePXsSQh49eqSR8jubhYUFIeTFixft5ly4cKFMJrt+/fr7778v91aHDrVEImH/Njc3J4Q0NzezhTQ3N0skEh7HlStXCCF0LJ/KDDp4OYMGDSKEyLXpCwsLCSEDBw7kJjY2NkqlUicnp3379nEb34QQOqrz9ddfZ0Ola3h8+umn9OW9e/fkimp3whuuLnJeyUHVoGrkiupQ1QAYOvRaAQBUIRAIJBJJfX19dXU1N720tJQQ4uDgQF+amJg8f/6cm6GyslKuKN5fJ5DkKi8vZ/66KALtr9K+q/rldzZHR0dCCH0Eq127d+92c3Pbu3cvHRfHUvJQt00gENjY2PD5/BcvXiiOO/L19VV2l4wxeC5a2uXLl7mJ9KW/vz83MSoqqqGh4dChQ+wUX/3798/IyCCEvPfee3JByo117N+/P1vO06dPGYahp4qSus55xYWqQdWw5ahQNQCGDr1WAAAVTZ06lRDCXXugoaEhLS1NKBQGBgbSFEdHR/qLO1VSUvLgwQO5ciwtLdmep5ub286dO9m36uvrMzMz2Zd//PFHUVGRh4cH21hRs/zONmTIEKJwC6I1YrH48OHDIpHou+++k3tLmUPdrtDQ0MbGRnYSZmrTpk29e/dWf9lDgw6ey8fHZ/DgwUlJSezCJE1NTfHx8S4uLtzhmp9//nlOTs6xY8cEAoGaW6QnMD1VlNR1zisuVA2qhqVC1QAYOvRaAQBUtHHjRldX10WLFh0/fry6uvrOnTtvvfVWcXHxli1b6Eg2QkhAQEBRUdG3335bU1OTm5v74YcfsrdJWSNGjLhz587Dhw/T09Pz8vK8vb3ZtyQSycqVK9PT02tray9duhQeHm5ubr5lyxY2gzrl+/n52dnZ0Z/5O4mHh0fPnj2zs7OVzO/u7r5jxw7FdGUOdbs2btzYr1+/d955JyUlpaqqqqKiYseOHWvXro2Ojmbve4SHh/N4vD///FPJMo0meJaJicmePXsqKipmz55dUlJSXl7+3nvv3b17d9euXXTwJyHkhx9++Mc//vH7779bWVlxx17KLTqiJLoSSUBAAJvS7o50qfOKhapB1bAUqwbA+CmOmgCADsEcwsZH+Tp9/PjxokWLXF1dzczMJBJJYGBgWloaN0NlZeXcuXMdHR2FQuHYsWMzMzM9PT3p1++yZctonlu3bnl7e4tEIhcXF+7cmx4eHk5OTjdu3AgMDLSyshIKhT4+PufPn9dU+d7e3p09hzDDMCtXruTz+YWFhfRlWVkZ9xrU4gSbCxYskJtQlGnzUKenp3PLXLVqFfPXYdXBwcE0J10Bsm/fvmZmZj169AgICEhNTeVuxc/PTywWy03syTLo4Knk5GTFlgB3NRHqypUrQUFB1tbWYrHYz89P7qzj3j6So7iQUlRUlFyewMBAbgb6mN/z5887tCPGdF5RqBq5RFRNh6qGwhzCYMRwvgKoC71W46MndUp7rbqOgmHU67VWVlY6OTlFRUV1WnQa8+TJE6FQqLiCokEw0OCzsrJ4PB53gRMldwTnVWdD1egtxaphodcKRgwjhAEAoBNJJJLk5OSkpKStW7fqOpa2MAyzcOFCa2vrdevW6TqWDjPQ4PPy8kJDQ1esWDF9+nSaovyO4LzqVKgavaVYNQBdBHqtAACgMQsWLODxeGKxmJs4fPjwS5cupaSkPH36VFeBtau0tDQvLy8tLU3JGUr1ioEGv2PHjg0bNmzYsIFN6dCO4LzqPKgavaVYNYSQ5cuX06dkm5qadBUYQGfjMX99EgAAOkoqlRJCEhMTdR0IaIzO6zQ6Onrp0qXsy1WrVq1fv15XwRBCeDxeQkLCtGnTdBgDAABoyqFDh2QyGXoBYED4ug4AAADkLVmyZMmSJbqOAgAAAEAvYIQwAAAAAAAA6C/0WgEAAAAAAEB/odcKAAAAAAAA+gu9VgAAAAAAANBfmI0JQAMKCgoOHTqk6yhAYwoKCgghqFOu9PR0XYcAAACaga90MDhY+QZAXVKpNCkpSddRAAAAAHQAegFgQNBrBQAA0FNYKRcAAIDguVYAAAAAAADQZ+i1AgAAAAAAgP5CrxUAAAAAAAD0F3qtAAAAAAAAoL/QawUAAAAAAAD9hV4rAAAAAAAA6C/0WgEAAAAAAEB/odcKAAAAAAAA+gu9VgAAAAAAANBf6LUCAAAAAACA/kKvFQAAAAAAAPQXeq0AAAAAAACgv9BrBQAAAAAAAP2FXisAAAAAAADoL/RaAQAAAAAAQH+h1woAAAAAAAD6C71WAAAAAAAA0F/otQIAAAAAAID+Qq8VAAAAAAAA9Bd6rQAAAAAAAKC/0GsFAAAAAAAA/YVeKwAAAAAAAOgv9FoBAAAAAABAf6HXCgAAAAAAAPoLvVYAAAAAAADQX+i1AgAAAAAAgP5CrxUAAAAAAAD0F3qtAAAAAAAAoL/QawUAAAAAAAD9hV4rAAAAAAAA6C/0WgEA4P+3d+9hUVXrH8DX5jLDMAwDgnJTEzHqiDUachRjQqGYPKAIgaOJXUgPp1TkySzRtPJ69OEprTQJoiwxAXuk0Kw8lM856uAZMDA1wNBKrnKJ4XIAxdm/P9bv7GefQcbhInsGvp+/Zq/9ztrv3u1w3mevvRYAAACA+ULVCgAAAAAAAOYLVSsAAAAAAACYL4ZlWaFzAAAAAEIISUhIKCsr4zbPnz/v7e3t7OxMN62trQ8cODB27FiBsgMAABCGjdAJAAAAwP9zc3P78MMP+S0XLlzgPk+cOBElKwAAjEAYIQwAAGAunn766d52iUSi5557bghzAQAAMBcYIQwAAGBGpkyZcvny5Tv+61xWVubr6zv0KQEAAAgLz1oBAADMyDPPPGNtbW3QyDCMQqFAyQoAACMTqlYAAAAzsnjx4tu3bxs0WltbP/vss4LkAwAAIDiMEAYAADAvs2bNOnfunF6v51oYhrl+/bqXl5eAWQEAAAgFz1oBAADMy9KlSxmG4TatrKyCgoJQsgIAwIiFqhUAAMC8xMbG8jcZhnnmmWeESgYAAEBwqFoBAADMi6ura2hoKDcnE8MwUVFRwqYEAAAgIFStAAAAZicuLo5OPGFtba1SqVxcXITOCAAAQDCoWgEAAMxOdHS0SCQihLAsGxcXJ3Q6AAAAQkLVCgAAYHakUmlERAQhRCQSzZs3T+h0AAAAhISqFQAAwBwtWbKEEBIVFSWVSoXOBQAAQEhYrxUARqjs7Gy1Wi10FgAAli0mJiYnJ0foLABgmLMROgEAACFlZWUJnQL0k1qtTkpKCgwMFDqRe+jgwYOLFi2ysbn7P9YajWb37t24n2GIvfPOO0KnAAAjAqpWABjRFi5cKHQK0E9qtTowMHB4/xecP3++nZ2dicG7d+8e3lcDzBCesgLA0MB7rQAAAGbK9JIVAABgGEPVCgAAAAAAAOYLVSsAAAAAAACYL1StAAAAAAAAYL5QtQIAAIw4v/322/z581taWhoaGpj/mjZtWmdnJz+Mv5dhmOnTpwuV8B1ZdPJ8X3/9ta+vr5HJoouLi8PDw52cnGQy2eOPP37mzBn+3j/++GP//v0hISGjRo2SSCT333//kiVLSkpKjBxx/vz5DMNs3bqV37hu3TpMQw0A5glVKwAAjCBtbW33339/RESE0IkIqbi4ePr06WFhYY6Ojq6urizLarVa2p6UlMSPpHs1Go2LiwvLsoWFhQKlfGcWnTxVUVExf/785OTkurq63mLOnTs3a9YsmUz2888/X7t2beLEibNnz/7uu++4gLVr165atSoyMvLy5cuNjY0ZGRnFxcX+/v65ubl37PDTTz/Ny8vr2b58+fLk5OSNGzcO/LwAAAYXqlYAABhBWJbV6/V6vV6oBBwcHIKCgoQ6OiGkpaVl3rx5Tz311MqVK/ntYrHYxcUlNTX1888/Fyq3frPc5Ddu3Dhr1qyioiKZTHbHAL1e/8ILLzg5OX388cceHh6urq4ffPCBj4/PsmXLurq6uLD4+PjVq1e7u7vb29srlcpDhw7dvn371Vdf7dlhdXV1UlLS0qVLe+7y8fE5evTotm3bsrOzB+sEAQAGBapWAAAYQWQyWUVFxddffy10IoLZtWtXbW3tpk2bDNrt7OwyMzOtrKwSEhLKy8sFya3fLDf5jz76aN26dUbGBv/zn/+8dOlSTEyMRCKhLdbW1osXL75+/fqxY8doS3p6empqKv9bCoVCIpFUVFSwLGvQ4fLly2NjY8PCwu54OIVCERMTs2bNmu7u7v6fFQDAYEPVCgAAMFKwLJuenj5jxgxPT8+ee1Uq1euvv97a2hobG2vwjqj5s9DkuVq0N99//z0hxOClXLqZn5/f27fa29s7OjqmTJnCMAy/PSMj49KlSykpKUaOGBUVVVlZefz48bsmDwAwZFC1AgDASJGbm8vNzUMLG37Lr7/+qlarnZycXFxcIiIiKioq6LdSUlJowNixY7VabWhoqEwms7e3nzNnDjcpztatW2kMN/r3m2++oS2urq78ftrb28+cOUN3GXnCdo+UlJTU1dUpFIreAt54442wsLALFy6sWrXKeFeNjY0vv/yyj4+PSCRydnaeO3fuDz/8QHeZclWp+vr6xMTECRMmiESi0aNHR0dHFxcX9/vsLDr53pSWlhJCxo4dy2/08vIihBh5qpyTk0MI2bBhA7+xsrJyzZo1GRkZvY1GpqZOnUoI+fbbbweQNQDAYGMBAEYkOlWm0FlA/xFCsrKy+vHFyMhIQkhHR4dBS2Rk5NmzZ9va2k6ePCmRSAICAvjfUigUUqk0MDCQxmi12ocfflgkEp06dYqLkUqljz76KP9b/v7+dCogIzHUnDlzRo0apdFo+nFGrMn382effUYI2b59u0G7VquVy+X0c319/bhx4wghBw8epC3chEacmpoab29vNze3vLw8nU5XVlYWHR3NMExaWhoXc9erWl1dfd9997m5uR0/fry1tfXixYvBwcF2dnZnz57t07lbdPIcLy8va2vrnu1PPPEEIaSgoIDfeOXKFULII488cseuamtr3dzcli1bZtCuUqleeukl+pneCVu2bOn5dZ1ORwhRKpWmpB0TExMTE2NKJADAQOBZKwAAACGELFu2LDAwUCqVPv744+Hh4VqttqGhgR/Q3t6+b98+GjN9+vSDBw/evHlz9erVg3J0vV5P/2EeZZAvdgAAF4pJREFUlN56U1NTQwiRy+VGYlxdXbOzs21tbRMSEuiDvp6Sk5OvXbu2e/fuiIgIR0dHX1/fQ4cOeXh4JCYmGsyFa+SqJicn//bbb2+//fZf/vIXBwcHPz+/w4cPsyx71yelwzV509H7xGD0L9XY2Pjkk0/Onj17//79/Pa0tLQrV67s2rXrrp07OjoyDENvFQAAM4GqFQAAgBBCAgICuM/0eV11dTU/QCqV0sGT1EMPPeTp6VlSUjIov+9PnTrV1NQUGBg48K6MoOOibW1tjYfNnDkzJSWlvb09Nja2o6OjZ8DRo0cJIeHh4VyLWCwODQ3t6OgwGFlq5Krm5uZaWVnxVyFyd3f38/MrKiqqrKzs66kNj+R7cnJyIoS0t7fzG+km3WXQrlKpJk+enJmZaW1tzbX//vvva9euzcjIkEqlphzUxsbmjpcOAEAoqFoBAAAI+d8nkCKRiBBisEBOzyJhzJgxhJAbN27c++wGh52dHSHk1q1bd41MTExUq9UXL140WCCHENLV1aXT6ezs7Axej3RzcyOE1NbW8ht7u6q0E71eL5fLGZ7z588TQugI2H6z6OQNPPjgg4QQg0q4qqqKEOLr68tv7O7ujo2N9fLyOnDgAL9kJYTQsdCzZ8/mUqUr32zcuJFu/vLLLwZd3XWaKACAoYSqFQAAwCSNjY0GI3hpvUprV0KIlZXVzZs3+QHNzc0GndxxVOeQ8fDwIITQFxfvKj09/YEHHsjIyKDvQHLEYrFcLu/s7GxtbeW30+G17u7upnQuFoudnJxsbGxu3brV8/2lOXPmmHpKwzF5PtpbUVERv5FuhoaG8hsTEhK6urqys7O5Wb4mTZpUUFBACFmxYoVBkgbvtU6aNInrp6WlhWVZeqsAAJgJVK0AAAAm6ezs1Gq13OZPP/1UXV2tUCi43/ceHh70IRhVW1v7+++/G3Rib2/PVbYPPPDAhx9+eI+z/h9TpkwhPR7c9cbBweGLL76QSqX79u0z2BUVFUUI4S+O0tXVlZ+fL5FIVCqViclER0d3d3dz8zBTO3fuHD9+/MAXC7Xo5PmCg4MnT5585MgRbjmf27dvHz58eNy4cfxBzm+++ealS5e+/PJLsVg8wCPSe5jeKgAAZgJVKwAAgEnkcvn69es1Gk17e3thYWFcXJxIJNqzZw8XEBYWVl1d/f7777e1tVVUVKxevZp7DMt55JFHysvLr1+/rtForl69qlQqaXtISIiLiwt9MnbvKBSKMWPGlJSUmBjv5+eXmpras33Hjh3e3t5JSUnHjh1rbW0tLy9/+umna2pq9uzZQ4fammLHjh0+Pj7x8fEnTpzQ6XRNTU2pqambN29OSUnhnhbGxcUxDHPt2jUT+xw2yXOsrKw++uijpqam559/vra2trGxccWKFVeuXElLS6PjvQkhn3zyyVtvvXXu3DmZTMYfsWywVI+J6Po9YWFhA0kbAGCQDdZkxAAAlgUr31g60veVb+g0PJwlS5ZoNBp+y4YNG9j/HQMcHh5Ov6tQKLy8vC5fvqxSqWQymUQiCQ4OPn36NL//5ubmZcuWeXh4SCSSoKAgrVbr7+9P+3nttddoTGlpqVKplEql48aN27t3L/ddpVLp7Ozc73VTTL+f169fb2NjU1VVRTfr6+v55+vv79/zKy+++KLB4jEsyzY0NCQlJXl7e9va2srlcpVKlZ+fT3eZflXpuqkTJ060tbUdPXp0WFjYyZMn+UcJCQlxcHDo7u6+47lYdPJUXl5ez99m/DV4qPPnz8+dO9fR0dHBwSEkJMTgxuM/dDXQcy2lhIQEgxiVSsUPoC/H3rx500jaHKx8AwBDg2Hv8ST7AADmKTs7W61W42+g5WIYJisra+HChUNzuKlTpzY0NAzu9LCDyPT7WafT+fn5RUREGKyMYoaam5s9PT2XLFmSlpYmdC59ZqHJl5SUTJs27dChQ4sWLTIlPjY2lhCSk5Nzj/MCgJEOI4QBAPrg8OHDdOgdNzbPgjg4OPBHD1pZWTk7OysUipdeeslgrhcYxuRyeV5e3pEjR/bu3St0LsawLJuYmOjo6Lhlyxahc+kzC03+6tWr0dHRycnJJpasAABDBlUrAEAfLFq0iGVZg6k7LUVbW9uPP/5ICImMjGRZ9tatW6WlpZs3by4tLZ0+ffrzzz//n//8R+gcYShMmzatsLDwxIkTLS0tQufSq7q6uqtXr+bn55s4r69ZsdDkU1NTt23btm3bNqETAQAwhKoVAGCEsra2dnNzi4yM/P7771999dVPPvlk8eLFGDLdU0pKCsMwJSUlVVVVDMO8/vrrQmc0CCZMmHDs2DFHR0ehE+mVu7v76dOn/fz8hE6kPyw0+Z07d+IpKwCYJ1StAABA/v73v8+YMeOrr746fPiw0LmYnVdeeYU/IcTWrVuFzggAAGBkQdUKAACEYZiVK1cSQnoubgkAAAAgLFStAAB3UVpaumDBArlcLpVKlUrl6dOne8bU19cnJiZOmDBBJBKNHj06OjqarnlICMnNzeUmQPr111/VarWTk5OLi0tERAR/NcWurq5NmzY9+OCD9vb2o0aNmjdv3ldffXX79m1TDjEogoKCCCEFBQW3bt0aNicFAAAAwwCqVgAAY3755ZfAwMDCwsIjR47U1dXt27dvy5Yt/MKMEFJTUxMQEJCdnb1v376mpqZTp041NTUFBgbShR8XLFjAsmxkZCQhJCkpKSkpqaqqKisr6/vvv1+8eDHXycqVK99999333nuvsbHx559/fvDBByMjI//1r3+ZcggqJCTExcWloKCgf2dKp43p7u5uaGgwn5MCAAAAMGlFcgCA4ScrK8uUv4F0NcIjR45wLVVVVWKxWCwWcy3PPvssISQzM5NrqampEYvF/v7+XAst8PLy8riWmJgYQkh9fT3d9Pb2njVrFv/Qvr6+P/zwg+mHCA4OdnZ2Pnv2rJHT4c8hbICbQLi6utp8TsoIQkhWVpYpkSOBifczwOCKiYmJiYkROgsAGP5shrxMBgCwJN988w0hRKVScS2enp6+vr7l5eVcS25urpWVVUREBNfi7u7u5+dXVFRUWVk5duxYrj0gIID7PG7cOEJIdXW1q6srIeTJJ5/84IMP/vrXv8bHxwcEBFhbW5eVlfXpEKdOnRrImdbU1BBCbG1taT5mclLG4aksh16K7OxsoROBkcXE/1UBAAYIVSsAQK+6urpaW1vt7OwcHBz47WPGjOGq1q6uLp1ORwiRy+U9e7hy5Qr/Jx0/RiQSEUL0ej3d3Lt3b2Bg4IEDB+hisEqlMiEhISoqqq+H6Df6vm5gYKCtra2lnNTu3bt3797dh5Mc7tRqtdApwIhDR1gAANxTeK8VAKBXYrFYJpN1dna2tbXx25uamvgxTk5ONjY2t27d6jmgZc6cOSYei2GYpUuX/uMf/2hubs7NzWVZNjo6+u233x7EQxih1+v37t1LCFmxYoUFnRRGCHMwQhgEgZIVAIYGqlYAAGPmzp1L/jtOmGpoaOAPcyWEREdHd3d3nzlzht+4c+fO8ePHd3d3m3ggJyen0tJSQoitre0TTzxBJ+k9fvz4IB7CiOTk5H//+99RUVH0Pd7BOqKwJwUAAADDA6pWAABjtm/fPmrUqKSkpJMnT7a1tV2+fDkuLs5gwPCOHTt8fHzi4+NPnDih0+mamppSU1M3b96ckpJiY9OHFzH+9re/Xbhwoaur68aNG7t27WJZNiQkxPRD9HUOYb1ef+PGjS+//DI0NHTXrl3x8fGZmZkMw5jVSQEAAABgNBEAjFCmj6gsKytbsGCBo6OjRCIJCAg4duwYfUuTEPLCCy/QmMbGxpdffnnixIm2trajR48OCws7efIk3WUwY9CGDRtYluW3hIeHsyxbXFyckJDwpz/9iS5tOnPmzLS0NL1ez6Vh5BCUUqk0PoewVCrlH5dhGLlc/tBDD7344otFRUU9483hpIwgGCHMgxHCIAjMIQwAQ4Nh//d3BgDACJGdna1Wq/E30HIxDJOVlbVw4UKhEzELuJ9BEPSdgpycHKETAYBhDiOEAQAAAAAAwHyhagUAABhxfvvtt/nz57e0tDQ0NDD/NW3atM7OTn4Yfy/DMNOnTxcq4Tuy6OQJIX/88cf+/ftDQkJGjRolkUjuv//+JUuWlJSU8GP279/P9ILOFcf39ddf+/r69vZaeFBQUM9OkpKSuIB169bRoeYAAOYGVSsAAMDIUlxcPH369LCwMEdHR1dXV5ZltVotbefXMIQQulej0bi4uLAsW1hYKFDKd2bRyRNC1q5du2rVqsjIyMuXLzc2NmZkZBQXF/v7++fm5pry9VmzZnGfKyoq5s+fn5ycXFdX1+98li9fnpycvHHjxn73AABwj6BqBQAAuAsHB4egoCDL7Z+vpaVl3rx5Tz311MqVK/ntYrHYxcUlNTX1888/H5pMBpHlJh8fH7969Wp3d3d7e3ulUnno0KHbt2+/+uqr/JjIyEiDWUnKy8vFYvHy5cu5mI0bN86aNauoqEgmkxk5nFarNehq9+7d3F4fH5+jR49u27YtOzt70M8UAGAgULUCAACMILt27aqtrd20aZNBu52dXWZmppWVVUJCQnl5uSC59ZuFJp+enp6amspvUSgUEomkoqKCm1hr0qRJSqXS4IvvvffeggUL3N3duZaPPvpo3bp1A18ySqFQxMTErFmzBmsmA4BZQdUKAAAwUrAsm56ePmPGDE9Pz557VSrV66+/3traGhsba/COqPmz6OQ57e3tHR0dU6ZM4VZOfvzxx9esWcOPaW1tPXDgwEsvvcRvlEgkg5VDVFRUZWXl8ePHB6tDAICBQ9UKAADDGV0S1sfHRyQSOTs7z50794cffqC7tm7dSiek4UbnfvPNN7TF1dWVtqSkpDAM097efubMGbqLPs6i7QzDjB07VqvVhoaGymQye3v7OXPmnDlzZuD93yMlJSV1dXUKhaK3gDfeeCMsLOzChQurVq0y3pWRC5ubm8tN9vPrr7+q1WonJycXF5eIiIiKigp+J/X19YmJiRMmTBCJRKNHj46Oji4uLu732Vl08hRdQmbDhg1GYj7++OPx48c/9thj/ej/s88+mzp1qlQqlcvldEByz5ipU6cSQr799tt+9A8AcK/c09VgAQDMFp0qU+gsoP8IIVlZWcZjampqvL293dzc8vLydDpdWVlZdHQ0wzBpaWlcjFQqffTRR/nf8vf3p/P3GImhFAqFVCoNDAw8e/ZsW1ubVqt9+OGHRSLRqVOnBqX/OXPmjBo1SqPRGD9N1uT7+bPPPiOEbN++3aBdq9XK5XL6ub6+fty4cYSQgwcP0hZuQiOOKRc2MjKSEBIZGUkvzsmTJyUSSUBAABdQXV193333ubm5HT9+vLW19eLFi8HBwXZ2dmfPnr3riQyb5Plqa2vd3NyWLVtmJEav1/v6+u7bt6+3AC8vL2tr6zvuevTRR5cuXVpUVNTW1lZaWrp06VJCyKpVqwzCdDodIUSpVJqSc0xMTExMjCmRAAADgV9sADBCoWq1dKZUrc899xwh5PPPP+daOjs7PT09JRJJbW0tbRlg1UoI+fHHH7mWCxcuEEIUCoWR75ref3BwsLOzsymFkIn3865duwghe/fuNWjnF34sy2o0GltbW6lU+vPPP7N3KvxMubC08MvLy+NiYmJiCCH19fV089lnnyWEZGZmcgE1NTVisdjf3/+uJzJskuc0NDRMnTpVrVZ3d3cbCTt+/LhMJmttbe0twEjV2tOf//xnQkhBQYFBO8MwkyZNMqUHVK0AMDQwQhgAAIato0ePEkLCw8O5FrFYHBoa2tHRMVgDIKVSKR1RST300EOenp4lJSU1NTUD7/zUqVNNTU2BgYED74qiL3za2toaD5s5c2ZKSkp7e3tsbGxHR0fPANMvbEBAAPeZPgWtrq6mm7m5uVZWVhEREVyAu7u7n59fUVFRZWVlX0/NopNvb29XqVSTJ0/OzMy0trY2Evnuu+8+88wzDg4OfT3EHdFSPC8vz6DdxsbmjpcOAEAoqFoBAGB46urq0ul0dnZ2BmuBuLm5EUJqa2sH5ShOTk4GLWPGjCGE3LhxY1D6H1x2dnaEkFu3bt01MjExUa1WX7x40WCBHNLHCyuXy7nPIpGIEKLX67lO9Hq9XC5neM6fP08IuXLlSv9O0BKT7+7ujo2N9fLyOnDggPGStby8/LvvvjOYh2kgPDw8yJ3u1e7u7kGc3gkAYODu4ZQPAAAAAhKLxXK5XKfTtba28kuUuro6Qgi3aoiVldXNmzf5X2xubjboipvQtafGxkaWZfkBtAagtevA+x9ctEqhLy7eVXp6enFxcUZGBq11OSZeWOPEYrGTk1NbW1tHR8e9mIDKgpJPSEjo6uo6evQo19WkSZMOHjw4c+ZMg8h33333sccemzx58gCPyKGPjrl7lWppaWFZlt4qAABmAs9aAQBg2IqKiiKE8Nfw6Orqys/Pl0gkKpWKtnh4eFRVVXEBtbW1v//+u0E/9vb2XOX5wAMPfPjhh9yuzs5OrVbLbf7000/V1dUKhYL70T/A/gfXlClTCCEmDmF1cHD44osvpFLpvn37DHaZcmHvKjo6uru7m5tymdq5c+f48eMHvliopST/5ptvXrp06csvvxSLxcYjW1paPv300xUrVpjeOV96erq/vz+/hWXZ7OxsQsi8efP47fR2pbcKAICZQNUKAADD1o4dO7y9vZOSko4dO9ba2lpeXv7000/X1NTs2bOHjgglhISFhVVXV7///vttbW0VFRWrV682ePRECHnkkUfKy8uvX7+u0WiuXr2qVCq5XXK5fP369RqNpr29vbCwMC4uTiQS7dmzhwsYSP8hISEuLi4FBQWDdUEUCsWYMWNKSkpMjPfz80tNTe3ZbsqFvasdO3b4+PjEx8efOHFCp9M1NTWlpqZu3rw5JSWFe+oYFxfHMMy1a9dM7NOykv/kk0/eeuutc+fOyWQy/khjgyV2qIyMDAcHB1py98/58+dXrFjxyy+/dHZ2lpWV0fmEV61aNWPGDH4YXb8nLCys3wcCABh8As8GBQAgEMwhbOmICXMIsyzb0NCQlJTk7e1ta2srl8tVKlV+fj4/oLm5edmyZR4eHhKJJCgoSKvVco+kXnvtNRpTWlqqVCqlUum4ceP4E/AqFAovL6/Lly+rVCqZTCaRSIKDg0+fPj1Y/SuVysGdQ5hl2fXr19vY2FRVVdHN+vp6/q+CO06B++KLLxpMw8savbAajYbf54YNG1iW5beEh4fTSLpu6sSJE21tbUePHh0WFnby5En+UUJCQhwcHHqbVteik2dZlj8jlAGD5Y70ev2kSZM2bdrUW1c9Z1QihPDX8uns7MzJyYmKivLx8aHDpGfPnn3o0KGeXdGXbG/evNnbsfgwhzAADA2G/d+/xQAAI0R2drZarcbfQMvFMExWVtbChQsFzGHq1KkNDQ0DmfB2sJh+P+t0Oj8/v4iIiP379w9BYgPR3Nzs6em5ZMmStLQ0oXPpMwtNvqSkZNq0aYcOHVq0aJEp8bGxsYSQnJyce5wXAIx0GCEMAAAwgsjl8ry8vCNHjuzdu1foXIxhWTYxMdHR0XHLli1C59JnFpr81atXo6Ojk5OTTSxZAQCGDKpWAACAkWXatGmFhYUnTpxoaWkROpde1dXVXb16NT8/38R5fc2KhSafmpq6bdu2bdu2CZ0IAIAhrHwDAADQZykpKWvXrqWfGYbZsGHD1q1bhU2pTyZMmHDs2DGhszDG3d399OnTQmfRTxaa/M6dO4VOAQDgzlC1AgAA9Nkrr7zyyiuvCJ0FAADAiIARwgAAAAAAAGC+ULUCAAAAAACA+ULVCgAAAAAAAOYLVSsAAAAAAACYL8zGBAAjWmxsrNApQP+98847OTk5QmdhFiorKwnuZxhyBQUFM2fOFDoLABj+GJZlhc4BAEAAGo3m7bffFjoLAADLFhgY+PLLLwudBQAMc6haAQAAAAAAwHzhvVYAAAAAAAAwX6haAQAAAAAAwHyhagUAAAAAAADzhaoVAAAAAAAAzNf/ASNfHtFHVit+AAAAAElFTkSuQmCC\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {
"tags": []
},
"execution_count": 25
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "T0OSHK2D9nUX",
"colab_type": "code",
"colab": {},
"outputId": "d07ef317-7be3-48b6-a564-b94bf1f7170d"
},
"source": [
"!apt update && apt install -y graphviz"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Hit:1 http://security.ubuntu.com/ubuntu bionic-security InRelease\n",
"Hit:2 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic InRelease\n",
"Hit:3 http://archive.ubuntu.com/ubuntu bionic InRelease\n",
"Hit:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease\n",
"Hit:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease\n",
"Reading package lists... Done\n",
"Building dependency tree \n",
"Reading state information... Done\n",
"41 packages can be upgraded. Run 'apt list --upgradable' to see them.\n",
"Reading package lists... Done\n",
"Building dependency tree \n",
"Reading state information... Done\n",
"The following additional packages will be installed:\n",
" libcairo2 libdatrie1 libgraphite2-3 libgvc6 libgvpr2 libharfbuzz0b\n",
" liblab-gamut1 libltdl7 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0\n",
" libpathplan4 libthai-data libthai0 libxaw7 libxcb-shm0 libxmu6 libxrender1\n",
" libxt6\n",
"Suggested packages:\n",
" gsfonts graphviz-doc\n",
"The following NEW packages will be installed:\n",
" graphviz libcairo2 libdatrie1 libgraphite2-3 libgvc6 libgvpr2 libharfbuzz0b\n",
" liblab-gamut1 libltdl7 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0\n",
" libpathplan4 libthai-data libthai0 libxaw7 libxcb-shm0 libxmu6 libxrender1\n",
" libxt6\n",
"0 upgraded, 20 newly installed, 0 to remove and 41 not upgraded.\n",
"29 not fully installed or removed.\n",
"Need to get 3279 kB of archives.\n",
"After this operation, 13.2 MB of additional disk space will be used.\n",
"Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxcb-shm0 amd64 1.13-2~ubuntu18.04 [5600 B]\n",
"Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxrender1 amd64 1:0.9.10-1 [18.7 kB]\n",
"Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libcairo2 amd64 1.15.10-2ubuntu0.1 [580 kB]\n",
"Get:4 http://archive.ubuntu.com/ubuntu bionic/main amd64 libltdl7 amd64 2.4.6-2 [38.8 kB]\n",
"Get:5 http://archive.ubuntu.com/ubuntu bionic/main amd64 libthai-data all 0.1.27-2 [133 kB]\n",
"Get:6 http://archive.ubuntu.com/ubuntu bionic/main amd64 libdatrie1 amd64 0.2.10-7 [17.8 kB]\n",
"Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 libthai0 amd64 0.1.27-2 [18.0 kB]\n",
"Get:8 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpango-1.0-0 amd64 1.40.14-1ubuntu0.1 [153 kB]\n",
"Get:9 http://archive.ubuntu.com/ubuntu bionic/main amd64 libgraphite2-3 amd64 1.3.11-2 [78.7 kB]\n",
"Get:10 http://archive.ubuntu.com/ubuntu bionic/main amd64 libharfbuzz0b amd64 1.7.2-1ubuntu1 [232 kB]\n",
"Get:11 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpangoft2-1.0-0 amd64 1.40.14-1ubuntu0.1 [33.2 kB]\n",
"Get:12 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpangocairo-1.0-0 amd64 1.40.14-1ubuntu0.1 [20.8 kB]\n",
"Get:13 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libpathplan4 amd64 2.40.1-2 [22.6 kB]\n",
"Get:14 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libgvc6 amd64 2.40.1-2 [601 kB]\n",
"Get:15 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libgvpr2 amd64 2.40.1-2 [169 kB]\n",
"Get:16 http://archive.ubuntu.com/ubuntu bionic/universe amd64 liblab-gamut1 amd64 2.40.1-2 [178 kB]\n",
"Get:17 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxt6 amd64 1:1.1.5-1 [160 kB]\n",
"Get:18 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxmu6 amd64 2:1.1.2-2 [46.0 kB]\n",
"Get:19 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxaw7 amd64 2:1.0.13-1 [173 kB]\n",
"Get:20 http://archive.ubuntu.com/ubuntu bionic/universe amd64 graphviz amd64 2.40.1-2 [601 kB]\n",
"Fetched 3279 kB in 5s (705 kB/s)\n",
"debconf: unable to initialize frontend: Dialog\n",
"debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76, <> line 20.)\n",
"debconf: falling back to frontend: Readline\n",
"\n",
"(Reading database ... 19585 files and directories currently installed.)\n",
"Preparing to unpack .../00-libxcb-shm0_1.13-2~ubuntu18.04_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 0%]\u001b[49m\u001b[39m [..........................................................] \u001b8Unpacking libxcb-shm0:amd64 (1.13-2~ubuntu18.04) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 1%]\u001b[49m\u001b[39m [..........................................................] \u001b8Selecting previously unselected package libxrender1:amd64.\n",
"Preparing to unpack .../01-libxrender1_1%3a0.9.10-1_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 2%]\u001b[49m\u001b[39m [#.........................................................] \u001b8Unpacking libxrender1:amd64 (1:0.9.10-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 3%]\u001b[49m\u001b[39m [#.........................................................] \u001b8Selecting previously unselected package libcairo2:amd64.\n",
"Preparing to unpack .../02-libcairo2_1.15.10-2ubuntu0.1_amd64.deb ...\n",
"Unpacking libcairo2:amd64 (1.15.10-2ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 4%]\u001b[49m\u001b[39m [##........................................................] \u001b8Selecting previously unselected package libltdl7:amd64.\n",
"Preparing to unpack .../03-libltdl7_2.4.6-2_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 5%]\u001b[49m\u001b[39m [###.......................................................] \u001b8Unpacking libltdl7:amd64 (2.4.6-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 6%]\u001b[49m\u001b[39m [###.......................................................] \u001b8Selecting previously unselected package libthai-data.\n",
"Preparing to unpack .../04-libthai-data_0.1.27-2_all.deb ...\n",
"Unpacking libthai-data (0.1.27-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 7%]\u001b[49m\u001b[39m [####......................................................] \u001b8Selecting previously unselected package libdatrie1:amd64.\n",
"Preparing to unpack .../05-libdatrie1_0.2.10-7_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 9%]\u001b[49m\u001b[39m [####......................................................] \u001b8Unpacking libdatrie1:amd64 (0.2.10-7) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 9%]\u001b[49m\u001b[39m [#####.....................................................] \u001b8Selecting previously unselected package libthai0:amd64.\n",
"Preparing to unpack .../06-libthai0_0.1.27-2_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 10%]\u001b[49m\u001b[39m [#####.....................................................] \u001b8Unpacking libthai0:amd64 (0.1.27-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 11%]\u001b[49m\u001b[39m [######....................................................] \u001b8Selecting previously unselected package libpango-1.0-0:amd64.\n",
"Preparing to unpack .../07-libpango-1.0-0_1.40.14-1ubuntu0.1_amd64.deb ...\n",
"Unpacking libpango-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 12%]\u001b[49m\u001b[39m [#######...................................................] \u001b8Selecting previously unselected package libgraphite2-3:amd64.\n",
"Preparing to unpack .../08-libgraphite2-3_1.3.11-2_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 13%]\u001b[49m\u001b[39m [#######...................................................] \u001b8Unpacking libgraphite2-3:amd64 (1.3.11-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 14%]\u001b[49m\u001b[39m [########..................................................] \u001b8Selecting previously unselected package libharfbuzz0b:amd64.\n",
"Preparing to unpack .../09-libharfbuzz0b_1.7.2-1ubuntu1_amd64.deb ...\n",
"Unpacking libharfbuzz0b:amd64 (1.7.2-1ubuntu1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 15%]\u001b[49m\u001b[39m [########..................................................] \u001b8Selecting previously unselected package libpangoft2-1.0-0:amd64.\n",
"Preparing to unpack .../10-libpangoft2-1.0-0_1.40.14-1ubuntu0.1_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 16%]\u001b[49m\u001b[39m [#########.................................................] \u001b8Unpacking libpangoft2-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 17%]\u001b[49m\u001b[39m [#########.................................................] \u001b8Selecting previously unselected package libpangocairo-1.0-0:amd64.\n",
"Preparing to unpack .../11-libpangocairo-1.0-0_1.40.14-1ubuntu0.1_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 18%]\u001b[49m\u001b[39m [##########................................................] \u001b8Unpacking libpangocairo-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 19%]\u001b[49m\u001b[39m [###########...............................................] \u001b8Selecting previously unselected package libpathplan4.\n",
"Preparing to unpack .../12-libpathplan4_2.40.1-2_amd64.deb ...\n",
"Unpacking libpathplan4 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 20%]\u001b[49m\u001b[39m [###########...............................................] \u001b8Selecting previously unselected package libgvc6.\n",
"Preparing to unpack .../13-libgvc6_2.40.1-2_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 21%]\u001b[49m\u001b[39m [############..............................................] \u001b8Unpacking libgvc6 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 22%]\u001b[49m\u001b[39m [############..............................................] \u001b8Selecting previously unselected package libgvpr2.\n",
"Preparing to unpack .../14-libgvpr2_2.40.1-2_amd64.deb ...\n",
"Unpacking libgvpr2 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 23%]\u001b[49m\u001b[39m [#############.............................................] \u001b8Selecting previously unselected package liblab-gamut1.\n",
"Preparing to unpack .../15-liblab-gamut1_2.40.1-2_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 24%]\u001b[49m\u001b[39m [##############............................................] \u001b8Unpacking liblab-gamut1 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 25%]\u001b[49m\u001b[39m [##############............................................] \u001b8Selecting previously unselected package libxt6:amd64.\n",
"Preparing to unpack .../16-libxt6_1%3a1.1.5-1_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 26%]\u001b[49m\u001b[39m [###############...........................................] \u001b8Unpacking libxt6:amd64 (1:1.1.5-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 27%]\u001b[49m\u001b[39m [###############...........................................] \u001b8Selecting previously unselected package libxmu6:amd64.\n",
"Preparing to unpack .../17-libxmu6_2%3a1.1.2-2_amd64.deb ...\n",
"Unpacking libxmu6:amd64 (2:1.1.2-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 28%]\u001b[49m\u001b[39m [################..........................................] \u001b8Selecting previously unselected package libxaw7:amd64.\n",
"Preparing to unpack .../18-libxaw7_2%3a1.0.13-1_amd64.deb ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 29%]\u001b[49m\u001b[39m [################..........................................] \u001b8Unpacking libxaw7:amd64 (2:1.0.13-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 30%]\u001b[49m\u001b[39m [#################.........................................] \u001b8Selecting previously unselected package graphviz.\n",
"Preparing to unpack .../19-graphviz_2.40.1-2_amd64.deb ...\n",
"Unpacking graphviz (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 31%]\u001b[49m\u001b[39m [##################........................................] \u001b8Setting up libgts-0.7-5:amd64 (0.7.6+darcs121130-4) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 32%]\u001b[49m\u001b[39m [##################........................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 34%]\u001b[49m\u001b[39m [###################.......................................] \u001b8Setting up libpathplan4 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 34%]\u001b[49m\u001b[39m [###################.......................................] \u001b8Setting up liblab-gamut1 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 35%]\u001b[49m\u001b[39m [####################......................................] \u001b8Setting up libpng16-16:amd64 (1.6.34-1ubuntu0.18.04.2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 36%]\u001b[49m\u001b[39m [####################......................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 37%]\u001b[49m\u001b[39m [#####################.....................................] \u001b8Setting up libjbig0:amd64 (2.1-3.1build1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 38%]\u001b[49m\u001b[39m [######################....................................] \u001b8Setting up fonts-dejavu-core (2.37-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 39%]\u001b[49m\u001b[39m [######################....................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 40%]\u001b[49m\u001b[39m [#######################...................................] \u001b8Setting up libdatrie1:amd64 (0.2.10-7) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 41%]\u001b[49m\u001b[39m [########################..................................] \u001b8Setting up libtiff5:amd64 (4.0.9-5ubuntu0.2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 42%]\u001b[49m\u001b[39m [########################..................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 43%]\u001b[49m\u001b[39m [########################..................................] \u001b8Setting up libbsd0:amd64 (0.8.7-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 44%]\u001b[49m\u001b[39m [#########################.................................] \u001b8Setting up fonts-liberation (1:1.07.4-7~18.04.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 45%]\u001b[49m\u001b[39m [##########################................................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 46%]\u001b[49m\u001b[39m [##########################................................] \u001b8Setting up ucf (3.0038) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 47%]\u001b[49m\u001b[39m [###########################...............................] \u001b8debconf: unable to initialize frontend: Dialog\n",
"debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)\n",
"debconf: falling back to frontend: Readline\n",
"Setting up libfreetype6:amd64 (2.8.1-2ubuntu2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 48%]\u001b[49m\u001b[39m [############################..............................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 49%]\u001b[49m\u001b[39m [############################..............................] \u001b8Setting up libgraphite2-3:amd64 (1.3.11-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 50%]\u001b[49m\u001b[39m [#############################.............................] \u001b8Setting up libpixman-1-0:amd64 (0.34.0-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 51%]\u001b[49m\u001b[39m [#############################.............................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 52%]\u001b[49m\u001b[39m [##############################............................] \u001b8Processing triggers for libc-bin (2.27-3ubuntu1) ...\n",
"Setting up libltdl7:amd64 (2.4.6-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 53%]\u001b[49m\u001b[39m [##############################............................] \u001b8Setting up libann0 (1.1.2+doc-6) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 54%]\u001b[49m\u001b[39m [###############################...........................] \u001b8Setting up libthai-data (0.1.27-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 55%]\u001b[49m\u001b[39m [################################..........................] \u001b8Setting up libxdmcp6:amd64 (1:1.1.2-3) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 56%]\u001b[49m\u001b[39m [################################..........................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 57%]\u001b[49m\u001b[39m [#################################.........................] \u001b8Setting up x11-common (1:7.7+19ubuntu7.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 59%]\u001b[49m\u001b[39m [#################################.........................] \u001b8debconf: unable to initialize frontend: Dialog\n",
"debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)\n",
"debconf: falling back to frontend: Readline\n",
"update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults\n",
"invoke-rc.d: could not determine current runlevel\n",
"invoke-rc.d: policy-rc.d denied execution of start.\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 59%]\u001b[49m\u001b[39m [##################################........................] \u001b8Setting up libcdt5 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 60%]\u001b[49m\u001b[39m [##################################........................] \u001b8Setting up libx11-data (2:1.6.4-3ubuntu0.2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 61%]\u001b[49m\u001b[39m [###################################.......................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 62%]\u001b[49m\u001b[39m [####################################......................] \u001b8Setting up libxau6:amd64 (1:1.0.8-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 63%]\u001b[49m\u001b[39m [####################################......................] \u001b8Setting up libcgraph6 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 64%]\u001b[49m\u001b[39m [#####################################.....................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 65%]\u001b[49m\u001b[39m [#####################################.....................] \u001b8Setting up libwebp6:amd64 (0.6.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 66%]\u001b[49m\u001b[39m [######################################....................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 67%]\u001b[49m\u001b[39m [######################################....................] \u001b8Setting up fontconfig-config (2.12.6-0ubuntu2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 68%]\u001b[49m\u001b[39m [#######################################...................] \u001b8Setting up libgvpr2 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 69%]\u001b[49m\u001b[39m [########################################..................] \u001b8Setting up libharfbuzz0b:amd64 (1.7.2-1ubuntu1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 70%]\u001b[49m\u001b[39m [########################################..................] \u001b8Setting up libthai0:amd64 (0.1.27-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 71%]\u001b[49m\u001b[39m [#########################################.................] \u001b8Setting up libice6:amd64 (2:1.0.9-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 72%]\u001b[49m\u001b[39m [#########################################.................] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 73%]\u001b[49m\u001b[39m [##########################################................] \u001b8Setting up libxcb1:amd64 (1.13-2~ubuntu18.04) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 74%]\u001b[49m\u001b[39m [###########################################...............] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 75%]\u001b[49m\u001b[39m [###########################################...............] \u001b8Setting up libfontconfig1:amd64 (2.12.6-0ubuntu2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 76%]\u001b[49m\u001b[39m [############################################..............] \u001b8Setting up libsm6:amd64 (2:1.2.2-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 77%]\u001b[49m\u001b[39m [############################################..............] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 78%]\u001b[49m\u001b[39m [#############################################.............] \u001b8Setting up libxcb-render0:amd64 (1.13-2~ubuntu18.04) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 79%]\u001b[49m\u001b[39m [#############################################.............] \u001b8Setting up libx11-6:amd64 (2:1.6.4-3ubuntu0.2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 80%]\u001b[49m\u001b[39m [##############################################............] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 81%]\u001b[49m\u001b[39m [###############################################...........] \u001b8Setting up libxcb-shm0:amd64 (1.13-2~ubuntu18.04) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 82%]\u001b[49m\u001b[39m [###############################################...........] \u001b8Setting up libxpm4:amd64 (1:3.5.12-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 84%]\u001b[49m\u001b[39m [################################################..........] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 84%]\u001b[49m\u001b[39m [################################################..........] \u001b8Setting up libxt6:amd64 (1:1.1.5-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 85%]\u001b[49m\u001b[39m [#################################################.........] \u001b8Setting up libxrender1:amd64 (1:0.9.10-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 86%]\u001b[49m\u001b[39m [#################################################.........] \u001b8Setting up fontconfig (2.12.6-0ubuntu2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 87%]\u001b[49m\u001b[39m [##################################################........] \u001b8Regenerating fonts cache... done.\n",
"Setting up libxext6:amd64 (2:1.3.3-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 88%]\u001b[49m\u001b[39m [###################################################.......] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 89%]\u001b[49m\u001b[39m [###################################################.......] \u001b8Setting up libgd3:amd64 (2.2.5-4ubuntu0.3) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 90%]\u001b[49m\u001b[39m [####################################################......] \u001b8Setting up libxmu6:amd64 (2:1.1.2-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 91%]\u001b[49m\u001b[39m [#####################################################.....] \u001b8\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 92%]\u001b[49m\u001b[39m [#####################################################.....] \u001b8Setting up libpango-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 93%]\u001b[49m\u001b[39m [#####################################################.....] \u001b8Setting up libxaw7:amd64 (2:1.0.13-1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 94%]\u001b[49m\u001b[39m [######################################################....] \u001b8Setting up libcairo2:amd64 (1.15.10-2ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 95%]\u001b[49m\u001b[39m [#######################################################...] \u001b8Setting up libpangoft2-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 96%]\u001b[49m\u001b[39m [#######################################################...] \u001b8Setting up libpangocairo-1.0-0:amd64 (1.40.14-1ubuntu0.1) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 97%]\u001b[49m\u001b[39m [########################################################..] \u001b8Setting up libgvc6 (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 98%]\u001b[49m\u001b[39m [#########################################################.] \u001b8Setting up graphviz (2.40.1-2) ...\n",
"\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 99%]\u001b[49m\u001b[39m [#########################################################.] \u001b8Processing triggers for libc-bin (2.27-3ubuntu1) ...\n",
"\n",
"\u001b7\u001b[0;24r\u001b8\u001b[1A\u001b[J"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "f44uvtcY9nUZ",
"colab_type": "code",
"colab": {}
},
"source": [
"print('a ')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "_8lD4s-S9nUa",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment