[133ee8]: / trash / medllama.ipynb

Download this file

1 lines (1 with data), 161.9 kB

{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"accelerator":"GPU","colab":{"gpuType":"T4","provenance":[],"include_colab_link":true},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":218074,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":185968,"modelId":208088}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<a href=\"https://colab.research.google.com/github/sAndreotti/MedicalMeadow/blob/main/ATML_part2.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>","metadata":{"id":"view-in-github","colab_type":"text"}},{"cell_type":"markdown","source":"Import Libraries","metadata":{"id":"29nxqgohSsQ3"}},{"cell_type":"code","source":"!pip install datasets accelerate peft bitsandbytes transformers trl==0.12.0 plotly huggingface_hub\n!pip install --upgrade smart_open\n!pip install --upgrade gensim\n!pip install ffmpeg-python\n!pip install -U openai-whisper\n!pip install scipy librosa unidecode inflect","metadata":{"id":"SAho3HGib9-U","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:00:24.088105Z","iopub.execute_input":"2025-01-04T20:00:24.088491Z","iopub.status.idle":"2025-01-04T20:01:13.311397Z","shell.execute_reply.started":"2025-01-04T20:00:24.088447Z","shell.execute_reply":"2025-01-04T20:01:13.310512Z"}},"outputs":[{"name":"stdout","text":"Requirement already satisfied: datasets in /usr/local/lib/python3.10/dist-packages (3.2.0)\nRequirement already satisfied: accelerate in /usr/local/lib/python3.10/dist-packages (0.34.2)\nCollecting peft\n  Downloading peft-0.14.0-py3-none-any.whl.metadata (13 kB)\nCollecting bitsandbytes\n  Downloading bitsandbytes-0.45.0-py3-none-manylinux_2_24_x86_64.whl.metadata (2.9 kB)\nRequirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.44.2)\nCollecting trl==0.12.0\n  Downloading trl-0.12.0-py3-none-any.whl.metadata (10 kB)\nRequirement already satisfied: plotly in /usr/local/lib/python3.10/dist-packages (5.24.1)\nRequirement already satisfied: huggingface_hub in /usr/local/lib/python3.10/dist-packages (0.24.7)\nRequirement already satisfied: rich in /usr/local/lib/python3.10/dist-packages (from trl==0.12.0) (13.8.1)\nCollecting transformers\n  Downloading transformers-4.47.1-py3-none-any.whl.metadata (44 kB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.1/44.1 kB\u001b[0m \u001b[31m1.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from datasets) (3.16.1)\nRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (1.26.4)\nRequirement already satisfied: pyarrow>=15.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (18.1.0)\nRequirement already satisfied: dill<0.3.9,>=0.3.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (0.3.8)\nRequirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (2.1.4)\nRequirement already satisfied: requests>=2.32.2 in /usr/local/lib/python3.10/dist-packages (from datasets) (2.32.3)\nRequirement already satisfied: tqdm>=4.66.3 in /usr/local/lib/python3.10/dist-packages (from datasets) (4.66.5)\nRequirement already satisfied: xxhash in /usr/local/lib/python3.10/dist-packages (from datasets) (3.5.0)\nRequirement already satisfied: multiprocess<0.70.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (0.70.16)\nRequirement already satisfied: fsspec<=2024.9.0,>=2023.1.0 in /usr/local/lib/python3.10/dist-packages (from fsspec[http]<=2024.9.0,>=2023.1.0->datasets) (2024.6.1)\nRequirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from datasets) (3.10.5)\nRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from datasets) (24.1)\nRequirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (6.0.2)\nRequirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from accelerate) (5.9.5)\nRequirement already satisfied: torch>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (2.4.1+cu121)\nRequirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.10/dist-packages (from accelerate) (0.4.5)\nCollecting huggingface_hub\n  Downloading huggingface_hub-0.27.0-py3-none-any.whl.metadata (13 kB)\nRequirement already satisfied: typing_extensions>=4.8.0 in /usr/local/lib/python3.10/dist-packages (from bitsandbytes) (4.12.2)\nRequirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2024.9.11)\nCollecting tokenizers<0.22,>=0.21 (from transformers)\n  Downloading tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.7 kB)\nRequirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from plotly) (9.0.0)\nRequirement already satisfied: aiohappyeyeballs>=2.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.4.0)\nRequirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (1.3.1)\nRequirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (24.2.0)\nRequirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (1.4.1)\nRequirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (6.1.0)\nRequirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (1.11.1)\nRequirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (4.0.3)\nRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (3.10)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (2.2.3)\nRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (2024.8.30)\nRequirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (1.13.3)\nRequirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.3)\nRequirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.1.4)\nRequirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\nRequirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2024.2)\nRequirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2024.1)\nRequirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich->trl==0.12.0) (3.0.0)\nRequirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich->trl==0.12.0) (2.18.0)\nRequirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich->trl==0.12.0) (0.1.2)\nRequirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.16.0)\nRequirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.10.0->accelerate) (2.1.5)\nRequirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.10.0->accelerate) (1.3.0)\nDownloading trl-0.12.0-py3-none-any.whl (310 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m310.2/310.2 kB\u001b[0m \u001b[31m11.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hDownloading peft-0.14.0-py3-none-any.whl (374 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m374.8/374.8 kB\u001b[0m \u001b[31m17.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hDownloading bitsandbytes-0.45.0-py3-none-manylinux_2_24_x86_64.whl (69.1 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m69.1/69.1 MB\u001b[0m \u001b[31m25.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hDownloading transformers-4.47.1-py3-none-any.whl (10.1 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.1/10.1 MB\u001b[0m \u001b[31m115.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m0:01\u001b[0m\n\u001b[?25hDownloading huggingface_hub-0.27.0-py3-none-any.whl (450 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m450.5/450.5 kB\u001b[0m \u001b[31m23.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hDownloading tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.0/3.0 MB\u001b[0m \u001b[31m84.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m\n\u001b[?25hInstalling collected packages: huggingface_hub, tokenizers, bitsandbytes, transformers, peft, trl\n  Attempting uninstall: huggingface_hub\n    Found existing installation: huggingface-hub 0.24.7\n    Uninstalling huggingface-hub-0.24.7:\n      Successfully uninstalled huggingface-hub-0.24.7\n  Attempting uninstall: tokenizers\n    Found existing installation: tokenizers 0.19.1\n    Uninstalling tokenizers-0.19.1:\n      Successfully uninstalled tokenizers-0.19.1\n  Attempting uninstall: transformers\n    Found existing installation: transformers 4.44.2\n    Uninstalling transformers-4.44.2:\n      Successfully uninstalled transformers-4.44.2\nSuccessfully installed bitsandbytes-0.45.0 huggingface_hub-0.27.0 peft-0.14.0 tokenizers-0.21.0 transformers-4.47.1 trl-0.12.0\nRequirement already satisfied: smart_open in /usr/local/lib/python3.10/dist-packages (7.0.4)\nCollecting smart_open\n  Downloading smart_open-7.1.0-py3-none-any.whl.metadata (24 kB)\nRequirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from smart_open) (1.16.0)\nDownloading smart_open-7.1.0-py3-none-any.whl (61 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.7/61.7 kB\u001b[0m \u001b[31m3.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hInstalling collected packages: smart_open\n  Attempting uninstall: smart_open\n    Found existing installation: smart-open 7.0.4\n    Uninstalling smart-open-7.0.4:\n      Successfully uninstalled smart-open-7.0.4\nSuccessfully installed smart_open-7.1.0\nRequirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (4.3.3)\nRequirement already satisfied: numpy<2.0,>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.26.4)\nRequirement already satisfied: scipy<1.14.0,>=1.7.0 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.13.1)\nRequirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim) (7.1.0)\nRequirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from smart-open>=1.8.1->gensim) (1.16.0)\nCollecting ffmpeg-python\n  Downloading ffmpeg_python-0.2.0-py3-none-any.whl.metadata (1.7 kB)\nRequirement already satisfied: future in /usr/local/lib/python3.10/dist-packages (from ffmpeg-python) (1.0.0)\nDownloading ffmpeg_python-0.2.0-py3-none-any.whl (25 kB)\nInstalling collected packages: ffmpeg-python\nSuccessfully installed ffmpeg-python-0.2.0\nCollecting openai-whisper\n  Downloading openai-whisper-20240930.tar.gz (800 kB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m800.5/800.5 kB\u001b[0m \u001b[31m15.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\nRequirement already satisfied: numba in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (0.60.0)\nRequirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (1.26.4)\nRequirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (2.4.1+cu121)\nRequirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (4.66.5)\nRequirement already satisfied: more-itertools in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (10.5.0)\nRequirement already satisfied: tiktoken in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (0.8.0)\nCollecting triton>=2.0.0 (from openai-whisper)\n  Downloading triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.3 kB)\nRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from triton>=2.0.0->openai-whisper) (3.16.1)\nRequirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba->openai-whisper) (0.43.0)\nRequirement already satisfied: regex>=2022.1.18 in /usr/local/lib/python3.10/dist-packages (from tiktoken->openai-whisper) (2024.9.11)\nRequirement already satisfied: requests>=2.26.0 in /usr/local/lib/python3.10/dist-packages (from tiktoken->openai-whisper) (2.32.3)\nRequirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (4.12.2)\nRequirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (1.13.3)\nRequirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (3.3)\nRequirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (3.1.4)\nRequirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (2024.6.1)\nRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (3.10)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (2.2.3)\nRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (2024.8.30)\nRequirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->openai-whisper) (2.1.5)\nRequirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->openai-whisper) (1.3.0)\nDownloading triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (209.5 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m209.5/209.5 MB\u001b[0m \u001b[31m8.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m0:00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hBuilding wheels for collected packages: openai-whisper\n  Building wheel for openai-whisper (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n  Created wheel for openai-whisper: filename=openai_whisper-20240930-py3-none-any.whl size=803320 sha256=c9bf255fffc128af536984c1c89aabfca237ca35aeb7150a8d4d50b82ce4f360\n  Stored in directory: /root/.cache/pip/wheels/dd/4a/1f/d1c4bf3b9133c8168fe617ed979cab7b14fe381d059ffb9d83\nSuccessfully built openai-whisper\nInstalling collected packages: triton, openai-whisper\nSuccessfully installed openai-whisper-20240930 triton-3.1.0\nRequirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (1.13.1)\nRequirement already satisfied: librosa in /usr/local/lib/python3.10/dist-packages (0.10.2.post1)\nCollecting unidecode\n  Downloading Unidecode-1.3.8-py3-none-any.whl.metadata (13 kB)\nRequirement already satisfied: inflect in /usr/local/lib/python3.10/dist-packages (7.4.0)\nRequirement already satisfied: numpy<2.3,>=1.22.4 in /usr/local/lib/python3.10/dist-packages (from scipy) (1.26.4)\nRequirement already satisfied: audioread>=2.1.9 in /usr/local/lib/python3.10/dist-packages (from librosa) (3.0.1)\nRequirement already satisfied: scikit-learn>=0.20.0 in /usr/local/lib/python3.10/dist-packages (from librosa) (1.2.2)\nRequirement already satisfied: joblib>=0.14 in /usr/local/lib/python3.10/dist-packages (from librosa) (1.4.2)\nRequirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.10/dist-packages (from librosa) (4.4.2)\nRequirement already satisfied: numba>=0.51.0 in /usr/local/lib/python3.10/dist-packages (from librosa) (0.60.0)\nRequirement already satisfied: soundfile>=0.12.1 in /usr/local/lib/python3.10/dist-packages (from librosa) (0.12.1)\nRequirement already satisfied: pooch>=1.1 in /usr/local/lib/python3.10/dist-packages (from librosa) (1.8.2)\nRequirement already satisfied: soxr>=0.3.2 in /usr/local/lib/python3.10/dist-packages (from librosa) (0.5.0.post1)\nRequirement already satisfied: typing-extensions>=4.1.1 in /usr/local/lib/python3.10/dist-packages (from librosa) (4.12.2)\nRequirement already satisfied: lazy-loader>=0.1 in /usr/local/lib/python3.10/dist-packages (from librosa) (0.4)\nRequirement already satisfied: msgpack>=1.0 in /usr/local/lib/python3.10/dist-packages (from librosa) (1.0.8)\nRequirement already satisfied: more-itertools>=8.5.0 in /usr/local/lib/python3.10/dist-packages (from inflect) (10.5.0)\nRequirement already satisfied: typeguard>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from inflect) (4.3.0)\nRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from lazy-loader>=0.1->librosa) (24.1)\nRequirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba>=0.51.0->librosa) (0.43.0)\nRequirement already satisfied: platformdirs>=2.5.0 in /usr/local/lib/python3.10/dist-packages (from pooch>=1.1->librosa) (4.3.6)\nRequirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from pooch>=1.1->librosa) (2.32.3)\nRequirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.20.0->librosa) (3.5.0)\nRequirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.10/dist-packages (from soundfile>=0.12.1->librosa) (1.17.1)\nRequirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0->soundfile>=0.12.1->librosa) (2.22)\nRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch>=1.1->librosa) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch>=1.1->librosa) (3.10)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch>=1.1->librosa) (2.2.3)\nRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch>=1.1->librosa) (2024.8.30)\nDownloading Unidecode-1.3.8-py3-none-any.whl (235 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m235.5/235.5 kB\u001b[0m \u001b[31m6.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mta \u001b[36m0:00:01\u001b[0m\n\u001b[?25hInstalling collected packages: unidecode\nSuccessfully installed unidecode-1.3.8\n","output_type":"stream"}],"execution_count":1},{"cell_type":"code","source":"from datasets import load_dataset\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom collections import Counter\nfrom trl import SFTTrainer\nimport re\nfrom gensim.models.word2vec import Word2Vec\nimport plotly.express as px\nimport random\nfrom sklearn.manifold import TSNE\nfrom torch.utils.data import Dataset\nfrom torch.utils.data import random_split\nfrom peft import prepare_model_for_kbit_training, LoraConfig\nfrom huggingface_hub import login\nimport torch\nfrom transformers import (\n    AutoTokenizer,\n    AutoModelForCausalLM,\n    BitsAndBytesConfig,\n    TrainingArguments\n)\nfrom datasets import Dataset as HFDataset\nfrom peft import AutoPeftModelForCausalLM\nimport whisper\nfrom IPython.display import Audio","metadata":{"id":"q_JimYqjjY4S","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:13.312626Z","iopub.execute_input":"2025-01-04T20:01:13.312898Z","iopub.status.idle":"2025-01-04T20:01:50.935335Z","shell.execute_reply.started":"2025-01-04T20:01:13.312877Z","shell.execute_reply":"2025-01-04T20:01:50.934364Z"}},"outputs":[],"execution_count":2},{"cell_type":"markdown","source":"Import Libraries for audio part","metadata":{"id":"E2DDMWKGSsQ5"}},{"cell_type":"code","source":"from IPython.display import HTML, Audio\nfrom google.colab.output import eval_js\nfrom base64 import b64decode\nfrom scipy.io.wavfile import read as wav_read\nimport io\nimport ffmpeg\nimport scipy","metadata":{"id":"lkjSoQT4SsQ6","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:50.937063Z","iopub.execute_input":"2025-01-04T20:01:50.937638Z","iopub.status.idle":"2025-01-04T20:01:51.020626Z","shell.execute_reply.started":"2025-01-04T20:01:50.937613Z","shell.execute_reply":"2025-01-04T20:01:51.019801Z"}},"outputs":[],"execution_count":3},{"cell_type":"markdown","source":"## Investigate Dataset","metadata":{"id":"XKL46PcIc21t"}},{"cell_type":"code","source":"ds = load_dataset(\"medalpaca/medical_meadow_medical_flashcards\")\nds = ds['train']\nds","metadata":{"id":"YltBm7i4b0IM","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:51.021924Z","iopub.execute_input":"2025-01-04T20:01:51.022151Z","iopub.status.idle":"2025-01-04T20:01:53.773020Z","shell.execute_reply.started":"2025-01-04T20:01:51.022132Z","shell.execute_reply":"2025-01-04T20:01:53.772180Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"README.md:   0%|          | 0.00/1.24k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"088afe3d98844de694661524e772f2a4"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"(…)l_meadow_wikidoc_medical_flashcards.json:   0%|          | 0.00/17.7M [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"04cf5fd44aea4f99b09e62a124880296"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Generating train split:   0%|          | 0/33955 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"2e3a0964991e4f5c8720f6100bd86fa2"}},"metadata":{}},{"execution_count":4,"output_type":"execute_result","data":{"text/plain":"Dataset({\n    features: ['input', 'output', 'instruction'],\n    num_rows: 33955\n})"},"metadata":{}}],"execution_count":4},{"cell_type":"code","source":"print(ds.features, \"\\n\")\nprint(\"Instruction:\")\nprint(f\"length: {len(ds['instruction'])}\")\nprint(f\"example: {ds['instruction'][0]} \\n\")\n\nprint(f\"Input:\")\nprint(f\"length: {len(ds['input'])}\")\nprint(f\"example: {ds['input'][0]} \\n\")\n\nprint(f\"Output:\")\nprint(f\"length: {len(ds['output'])}\")\nprint(f\"example: {ds['output'][0]} \\n\")","metadata":{"id":"n89RynbpcHQB","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:53.773944Z","iopub.execute_input":"2025-01-04T20:01:53.774241Z","iopub.status.idle":"2025-01-04T20:01:53.980508Z","shell.execute_reply.started":"2025-01-04T20:01:53.774218Z","shell.execute_reply":"2025-01-04T20:01:53.979675Z"}},"outputs":[{"name":"stdout","text":"{'input': Value(dtype='string', id=None), 'output': Value(dtype='string', id=None), 'instruction': Value(dtype='string', id=None)} \n\nInstruction:\nlength: 33955\nexample: Answer this question truthfully \n\nInput:\nlength: 33955\nexample: What is the relationship between very low Mg2+ levels, PTH levels, and Ca2+ levels? \n\nOutput:\nlength: 33955\nexample: Very low Mg2+ levels correspond to low PTH levels which in turn results in low Ca2+ levels. \n\n","output_type":"stream"}],"execution_count":5},{"cell_type":"markdown","source":"### Some plots about the dataset","metadata":{"id":"a9SXu1UFoE4x"}},{"cell_type":"code","source":"instructions = ds['instruction']\ninput_phrases = ds['input']\noutput_phrases = ds['output']","metadata":{"trusted":true,"id":"nLEtHKtISsQ7","execution":{"iopub.status.busy":"2025-01-04T20:01:53.981418Z","iopub.execute_input":"2025-01-04T20:01:53.981739Z","iopub.status.idle":"2025-01-04T20:01:54.080089Z","shell.execute_reply.started":"2025-01-04T20:01:53.981707Z","shell.execute_reply":"2025-01-04T20:01:54.079347Z"}},"outputs":[],"execution_count":6},{"cell_type":"code","source":"# Count the frequency of each unique instruction\ninstruction_counts = {instruction: instructions.count(instruction) for instruction in set(instructions)}\n\n# Sort the instructions by frequency\nsorted_instructions = sorted(instruction_counts.items(), key=lambda x: x[1], reverse=True)\n\n# Separate the instructions and their counts for plotting\nsorted_instruction_names = [item[0] for item in sorted_instructions]\nsorted_instruction_counts = [item[1] for item in sorted_instructions]\n\n# Plotting the frequency of instructions\nplt.figure(figsize=(10, 5))\n\nbars = plt.barh(sorted_instruction_names, sorted_instruction_counts, color='skyblue', edgecolor='black', linewidth=1.2)\nplt.title('Instruction Frequency Distribution')\nplt.xlabel('Frequency')\nplt.ylabel('Instruction')\n\n# Show the plot\nplt.tight_layout()\nplt.show()","metadata":{"id":"4TAMV5DdnRg7","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:54.080886Z","iopub.execute_input":"2025-01-04T20:01:54.081205Z","iopub.status.idle":"2025-01-04T20:01:54.369440Z","shell.execute_reply.started":"2025-01-04T20:01:54.081174Z","shell.execute_reply":"2025-01-04T20:01:54.368576Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x500 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAA98AAAHqCAYAAAAd2/2HAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFVklEQVR4nO3deXhN5/7//9dOJJGITBISxBRTi6KUag0pjhiqpabiIMZS/aij1dKeHhynM622TlVb47dmbWlLi5KgamyJeUqDUsQU85jcvz/8so8tQRK5hXg+risXe617r/Ve9521k1fW5DDGGAEAAAAAAGvccroAAAAAAAByO8I3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAyHaRkZGKjIzM6TJwl5k4caIcDof27NljfV3R0dEqUaKE8/WePXvkcDg0YsQI6+uWpKFDh8rhcNyRdQG4NxC+AQCwIDVkrFu3zsryt27dqqFDh96REHM313C92NhYORyOdL+effbZnC4vV7m+r728vFSoUCFFRkbqrbfe0pEjR7JlPefOndPQoUMVGxubLcvLTndzbQDuPnlyugAAAJB5W7du1bBhwxQZGelydO9uqWHhwoU5UlOqfv366ZFHHnGZllP9lNul9nVycrKOHDmiX3/9VUOGDNEHH3ygmTNnqn79+s62nTp10rPPPisvL68ML//cuXMaNmyYJGXqbIovvvhCKSkpGW6fFTer7Z///KcGDRpkdf0A7i2EbwAAcjljjC5cuCBvb+87tk5PT887tq701KlTR61bt85Q2ytXriglJSXHa75XpdfXcXFxatSokVq1aqWtW7cqLCxMkuTu7i53d3er9Zw9e1b58uWTh4eH1fXcSp48eZQnD79qA/gfTjsHAOAOiY6Olq+vrw4cOKAWLVrI19dXISEhevnll5WcnOzSdvr06apWrZry588vPz8/VapUSR999JGkq6e0t2nTRpL0xBNPOE/7TT31tUSJEnryySe1YMECVa9eXd7e3ho7dqzzmteJEyemqc3hcGjo0KEu0w4cOKDu3burcOHC8vLyUsmSJdWnTx9dunTpljWkd813YmKiunfvrkKFCilv3ryqXLmyJk2a5NLm2utyP//8c0VERMjLy0uPPPKI1q5dm4Ved3Xt8keNGuVc/tatWyVJ27dvV+vWrRUUFKS8efOqevXq+u6779IsZ8uWLapfv768vb1VtGhR/ec//9H48ePTXM+cXr9KV8coOjraZVpSUpL69++v8PBweXl5qXTp0nr33Xddjt5mtn+2b9+utm3bKiQkRN7e3ipXrpxef/11SVJMTIwcDoe+/fbbNO+bOnWqHA6HVq5cmZFuTaNy5coaNWqUkpKSNHr0aOf09K75XrdunaKiohQcHCxvb2+VLFlS3bp1c25vSEiIJGnYsGHO77PUPk3dp+Lj49W0aVPlz59fHTt2dM670dkOH374oYoXLy5vb2/Vq1dPmzdvdpl/o3sWXLvMW9WW3jXfV65c0fDhw53jVqJECb322mu6ePGiS7vUffiXX35RjRo1lDdvXpUqVUqTJ09Ov8MB3BP4cxwAAHdQcnKyoqKiVLNmTY0YMUI///yzRo4cqYiICPXp00eStGjRIrVv314NGjTQu+++K0natm2bVqxYoRdffFF169ZVv3799PHHH+u1117TAw88IEnOfyVpx44dat++vZ577jn17NlT5cqVy1Sdf/31l2rUqKGkpCT16tVL5cuX14EDBzR79mydO3cuQzVc6/z584qMjNTu3bv1wgsvqGTJkpo1a5aio6OVlJSkF1980aX91KlTdfr0aT333HNyOBx677339Mwzz+iPP/7I0BHN06dP6+jRoy7TgoKCnP+fMGGCLly4oF69esnLy0tBQUHasmWLHn/8cRUpUkSDBg1Svnz5NHPmTLVo0UJff/21WrZsKUk6dOiQnnjiCV25csXZ7vPPP7+tMwvOnTunevXq6cCBA3ruuedUrFgx/frrrxo8eLAOHjyoUaNGZbp/Nm7cqDp16sjDw0O9evVSiRIlFB8fr++//15vvvmmIiMjFR4erilTpji3LdWUKVMUERGhWrVqZXmbWrdure7du2vhwoV68803022TmJioRo0aKSQkRIMGDVJAQID27Nmjb775RpIUEhKiMWPGqE+fPmrZsqWeeeYZSdJDDz3kXMaVK1cUFRWl2rVra8SIEfLx8blpXZMnT9bp06fVt29fXbhwQR999JHq16+vTZs2qVChQhnevozUdr0ePXpo0qRJat26tV566SWtXr1ab7/9trZt25bmjyC7d+929mGXLl00fvx4RUdHq1q1aqpQoUKG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7w3bnThxIk09VapUkfS/7/XUu5dn5nv9ZubMmeO8fl+S1qxZo9WrV6tJkybOaREREdq+fbvLuMfFxWnFihUuy8pMbU2bNpWkNHeu/+CDDyRJzZo1y9R2ALj3cOQbAIC7TI8ePXT8+HHVr19fRYsW1d69e/XJJ5+oSpUqziNmVapUkbu7u959912dPHlSXl5eql+/vgoWLHjLZb/zzjvq0aOHqlevrmXLlmnnzp1p2r311ltauHCh6tWrp169eumBBx7QwYMHNWvWLP3yyy8KCAjIVA29evXS2LFjFR0drd9++00lSpTQ7NmztWLFCo0aNeqm1wXfKf/9739Vu3ZtVapUST179lSpUqV0+PBhrVy5Uvv371dcXJwk6ZVXXtH/+3//T40bN9aLL77ofNRY6tH9a/Xo0UO9e/dWq1at9Le//U1xcXFasGBBmnA7cOBAfffdd3ryySedj5M6e/asNm3apNmzZ2vPnj2ZDsQff/yxateurYcffli9evVSyZIltWfPHs2bN08bNmxwadu5c2e1bt1akjR8+PBMrWf58uW6cOGCkpOTdezYMa1YsULfffed/P399e2337rc6O56kyZN0qeffqqWLVsqIiJCp0+f1hdffCE/Pz9nWPX29taDDz6oGTNmqGzZsgoKClLFihWzfE+C0qVLq3bt2urTp48uXryoUaNGqUCBAi6n/Hfr1k0ffPCBoqKi1L17dyUmJuqzzz5ThQoVdOrUKWe7zNRWuXJldenSRZ9//rmSkpJUr149rVmzRpMmTVKLFi30xBNPZGl7ANxDcu5G6wAA5F43etRYvnz50rS9/pFEs2fPNo0aNTIFCxY0np6eplixYua5554zBw8edHnfF198YUqVKmXc3d1dHvlVvHhx06xZs3TrOnfunOnevbvx9/c3+fPnN23btjWJiYnpPi5p7969pnPnziYkJMR4eXmZUqVKmb59+5qLFy/esob0HtV0+PBh07VrVxMcHGw8PT1NpUqV0jz2LPVxUO+//36a2tOr8Xq3evzVzZZvjDHx8fGmc+fOJjQ01Hh4eJgiRYqYJ5980syePdul3caNG029evVM3rx5TZEiRczw4cPNuHHj0jxqLDk52bz66qsmODjY+Pj4mKioKLN79+40jxozxpjTp0+bwYMHm9KlSxtPT08THBxsHnvsMTNixAhz6dKlLPXP5s2bTcuWLU1AQIDJmzevKVeunHnjjTfSvPfixYsmMDDQ+Pv7m/Pnz6fbN9e7/rFuHh4eJiQkxNStW9e8+eabaR7lZkzaR439/vvvpn379qZYsWLGy8vLFCxY0Dz55JNm3bp1Lu/79ddfTbVq1Yynp6fLdt5on0qdl96jxt5//30zcuRIEx4ebry8vEydOnVMXFxcmvd/9dVXplSpUsbT09NUqVLFLFiwIM0yb1bb9fu1McZcvnzZDBs2zJQsWdJ4eHiY8PBwM3jwYJfH2xlz4334Ro9AA3BvcBjDXRsAAABu18SJE9W1a1clJCS4XD98L7hy5YoKFy6s5s2ba9y4cTldDgDkSlzzDQAAcJ+bM2eOjhw5os6dO+d0KQCQa3HNNwAAwH1q9erV2rhxo4YPH66qVavm+I3vACA348g3AADAfWrMmDHq06ePChYsqMmTJ+d0OQCQq3HNNwAAAAAAlnHkGwAAAAAAywjfAAAAAABYxg3XgPtISkqK/vrrL+XPn18OhyOnywEAAADuWsYYnT59WoULF5ab2+0ftyZ8A/eRv/76S+Hh4TldBgAAAHDP+PPPP1W0aNHbXg7hG7iP5M+fX9LVDxA/P78crgYAAAC4e506dUrh4eHO36FvF+EbuI+knmru5+dH+AYAAAAyILsu1+SGawAAAAAAWEb4BgAAAADAMsI3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAAAAAlhG+AQAAAACwjPANAAAAAIBlhG8AAAAAACwjfAMAAAAAYFmenC4AwJ1Xo0YNubu753QZAAAAQLoiIiL03Xff5XQZ2YrwDdyHjl1MlhvnvQAAAOAudOzPhJwuwQrCN3Af6jt5ofL65s/pMgAAAIA0PmxdO6dLsIJjXwAAAAAAWEb4BgAAAADAMsI3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAAAAAlhG+AQAAAACwjPANAAAAAIBlhG8AAAAAACwjfAMAAAAAYBnhGwAAAAAAywjfAAAAAABYRvgGAAAAAMAywjcAAAAAAJYRvgEAAAAAsIzwDQAAAACAZYRvAAAAAAAsI3wDAAAAAGAZ4RsAAAAAAMsI3wAAAAAAWEb4BgAAAADAMsI3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAAAAAlhG+AQAAAACwjPANAAAAAIBlhG8AAAAAACwjfAMAAAAAYBnhGwAAAAAAywjfAAAAAABYRvgGAAAAAMAywjcAAAAAAJYRvgEAAAAAsIzwDQAAAACAZYRvAAAAAAAsI3wDAAAAAGAZ4RsAAAAAAMsI3wAAAAAAWEb4BgAAAADAMsI3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAAAAAlhG+AQAAAACwjPANAAAAAIBlhG8AAAAAACwjfAMAAAAAYBnhGwAAAAAAywjfAAAAAABYRvgGAAAAAMAywjcAAAAAAJYRvgEAAAAAsIzwDQAAAACAZYRvAAAAAAAsI3wDAAAAAGAZ4RsAAAAAAMsI3wAAAAAAWEb4BgAAAADAMsI3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAAAAAlhG+AQAAAACwjPANAAAAAIBlhG8AAAAAACwjfAMAAAAAYBnhGwAAAAAAywjfAAAAAABYRvgGAAAAAMAywjcAAAAAAJYRvgEAAAAAsIzwDQAAAACAZYRvAAAAAAAsI3wDAAAAAGAZ4RsAAAAAAMsI3wAAAAAAWEb4BgAAAADAMsI3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAAAAAlhG+AQAAAACwjPANAAAAAIBlhG8AAAAAACwjfAMAAAAAYBnhGwAAAAAAywjfAAAAAABYRvgGAAAAAMAywjcAAAAAAJYRvgEAAAAAsIzwDQAAAACAZYRvAAAAAAAsI3wDAAAAAGAZ4RsAAAAAAMsI3wAAAAAAWEb4BgAAAADAMsI3AAAAAACWEb4BAAAAALCM8A0AAAAAgGWEbwAAAAAALCN8AwAAAABgGeEbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAA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v//97xo/fryMMWnavf766xo5cqTWrVunPHnyqFu3bs55HTt2VNGiRbV27Vr99ttvGjRokDw8PORwOFS3bl3FxsZKuhpkt23bpvPnz2v79u2SpKVLl+qRRx6Rj4+PJKlNmzZKTEzUjz/+qN9++00PP/ywGjRooOPHjzvXt3v3bn399df65ptv0r02+7HHHtOoUaPk5+engwcP6uDBg3r55Zed80eOHKnq1atr/fr1ev7559WnTx+XPyZc64033tDWrVv1448/atu2bRozZky619unGjhwoJYuXaq5c+dq4cKFio2N1e+//37jAUjH5cuXFRUVpfz582v58uVasWKFfH191bhxY126dElXrlxRixYtVK9ePW3cuFErV65Ur1695HA41K5dO7300kuqUKGCc9vbtWuXZh1nz55VVFSUAgMDtXbtWs2aNUs///yzXnjhBZd2MTExio+PV0xMjCZNmuQMsem51bqHDh2qli1batOmTS7fPzdyq+UNGzZMbdu21caNG9W0aVN17NhRx48fd1464Ofnp1GjRt2wDzKrTZs2Sk5OdoZ8SUpMTNS8efMytD0AAAAAck6Wzm329PTUjBkzNHz4cMXFxcnb21uVKlVS8eLFM72scePG6e9//7skqXHjxjp58qSWLl2qyMhIl3Zvvvmm81FngwYNUrNmzXThwgXlzZtX+/bt08CBA1W+fHlJUpkyZZzvi4yM1NixYyVJy5YtU9WqVRUaGqrY2FiVL19esbGxzuX+8ssvWrNmjRITE52nR48YMUJz5szR7Nmz1atXL0lXTzWfPHmyQkJCbtg//v7+cjgcCg0NTTO/adOmev755yVJr776qj788EPFxMSoXLlyadru27dPVatWVfXq1SVdvWHbjZw5c0bjxo3TV199pQYNGkiSJk2apKJFi97wPemZMWOGUlJS9OWXXzqPyk6YMEEBAQGKjY1V9erVdfLkST355JOKiIiQJD3wwAPO9/v6+ipPnjzpbnuqqVOn6sKFC5o8ebLy5csnSRo9erSaN2+ud999V4UKFZIkBQYGavTo0XJ3d1f58uXVrFkzLV68WD179kyzTG9v75uuu0OHDuratWuG++FWy4uOjlb79u0lSW+99ZY+/vhjrVmzRo0bN1ZoaKgcDof8/f1v2g+Z4e3trQ4dOmjChAlq06aNJOmrr75SsWLF0uwvqS5evOhypPzUqVPZUgsAAACAzMnSke9UZcuWVZs2bfTkk09mKXjv2LFDa9ascQaYPHnyqF27dho3blyatg899JDz/6mnjScmJkq6emOrHj16qGHDhnrnnXcUHx/vbFuvXj1t3bpVR44ccYb6yMhIxcbG6vLly/r111+dwSUuLk5nzpxRgQIF5Ovr6/xKSEhwWWbx4sVvGLwz4tptSQ3oqdtyvT59+mj69OmqUqWKXnnlFf366683XG58fLwuXbqkmjVrOqcFBQWlG+pvJi4uTrt371b+/PmdfRAUFKQLFy4oPj5eQUFBio6OVlRUlJo3b66PPvpIBw8ezNQ6tm3bpsqVKzuDtyQ9/vjjSklJcTkLoEKFCnJ3d3e+DgsLu2Ff3UrqHzCyy7XjmC9fPvn5+WW5tozq2bOnFi5cqAMHDki6emp8dHT0DU9df/vtt+Xv7+/8Cg8Pt1ofAAAAgPRl6cj3rU5xHT9+fIaWM27cOF25ckWFCxd2TjPGyMvLS6NHj5a/v79zuoeHh/P/qUEjJSVF0tXTiTt06KB58+bpxx9/1JAhQzR9+nS1bNlSlSpVUlBQkJYuXaqlS5fqzTffVGhoqN59912tXbtWly9f1mOPPSbp6pHjsLAw52nq17r2Wt1rA2NWXLstqduTui3Xa9Kkifbu3av58+dr0aJFatCggfr27asRI0Zkef0OhyPNqf3XXkd95swZVatWTVOmTEnz3tQ/OkyYMEH9+vXTTz/9pBkzZuif//ynFi1apEcffTTLdaUnM311K9ePm5ub2037Ibtru931SVLVqlVVuXJlTZ48WY0aNdKWLVs0b968G7YfPHiwBgwY4Hx96tQpAjgAAACQA7IUvk+cOOHy+vLly9q8ebOSkpJUv379DC3jypUrmjx5skaOHKlGjRq5zGvRooWmTZum3r17Z7imsmXLqmzZsvrHP/6h9u3ba8KECWrZsqUcDofq1KmjuXPnasuWLapdu7Z8fHx08eJFjR07VtWrV3eGsocffliHDh1Snjx5bnp6d0Z4enoqOTn5tpaRKiQkRF26dFGXLl1Up04dDRw4MN3wHRERIQ8PD61evVrFihWTdHWsdu7c6Ty1PnV51x6p3rVrl/OGc9LVfpgxY4YKFiwoPz+/G9ZVtWpVVa1aVYMHD1atWrU0depUPfrooxna9gceeEATJ07U2bNnnf2/YsUKubm5ZfpI/bUy0+8hISE6ffq0Sw3XX8Of3eN4q/VlRI8ePTRq1CgdOHBADRs2vGmY9vLyumvuMA8AAADcz7J02vm3337r8vXDDz/ojz/+ULt27TJ85POHH37QiRMn1L17d1WsWNHlq1WrVumeep6e8+fP64UXXlBsbKz27t2rFStWaO3atS7XIEdGRmratGmqUqWKfH195ebmprp162rKlCkuobRhw4aqVauWWrRooYULF2rPnj369ddf9frrr2vdunWZ6qMSJUrozJkzWrx4sY4ePeoSbjPjX//6l+bOnavdu3dry5Yt+uGHH1y27Vq+vr7q3r27Bg4cqCVLlmjz5s2Kjo6Wm5vrMNevX1+jR4/W+vXrtW7dOvXu3dvlKG7Hjh0VHBysp59+WsuXL1dCQoJiY2PVr18/7d+/XwkJCRo8eLBWrlypvXv3auHChdq1a5ezrhIlSighIUEbNmzQ0aNH09ydO3UdefPmVZcuXbR582bFxMTo//7v/9SpUyfn9d5ZkZF1p6pZs6Z8fHz02muvKT4+XlOnTk1zM7fMLO9WMrK+jOjQoYP279+vL774ghutAQAAAPeI27rm22VBbm4aMGCAPvzwwwy1HzdunBo2bOhyanmqVq1aad26dek+S/x67u7uOnbsmDp37qyyZcuqbdu2atKkiYYNG+ZsU69ePSUnJ7vclCoyMjLNNIfDofnz56tu3brq2rWrypYtq2effVZ79+7NdCB87LHH1Lt3b7Vr104hISF67733MvX+VJ6enho8eLAeeugh1a1bV+7u7po+ffoN27///vuqU6eOmjdvroYNG6p27dqqVq2aS5uRI0cqPDxcderUUYcOHfTyyy877/YuST4+Plq2bJmKFSumZ555Rg888IC6d++uCxcuyM/PTz4+Ptq+fbtatWqlsmXLqlevXurbt6+ee+45SVfHr3HjxnriiScUEhKiadOmpanTx8dHCxYs0PHjx/XII4+odevWatCggUaPHp2lfkqVkXWnCgoK0ldffaX58+erUqVKmjZtmssj4TK7vFvJyPoywt/fX61atZKvr69atGiR5XoAAAAA3DkOk95zvbJo/vz56tKli44cOZJdi0Q2iIyMVJUqVTRq1KicLgXZpEGDBqpQoYI+/vjjTL3v1KlT8vf315Blfyivb35L1QEAAABZ92Hr2grO664tW7bkaB2p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TZs2Sbp6Crm7u7vq1auX7joKFy6sZs2aafz48apRo4a+//57Xbx4UW3atMlUrQCAjCN8AwCA+1q+fPnSPdU6X758Lq/PnDmj5s2b6913303TNiwsLMPXSjscDhljXKZde632mTNnVK1aNU2ZMiXNe6+9EZyHh0ea5aakpEiSvL29b1lHjx491KlTJ3344YeaMGGC2rVrJx8fnwxtAwAg8wjfAAAAGfDwww/r66+/VokSJZQnT9pfoSIiIuTh4aHVq1erWLFikqQTJ05o586dLkegQ0JCdPDgQefrXbt26dy5cy7rmTFjhgoWLCg/P78s1VqpUiWlpKRo6dKlztPOr9e0aVPly5dPY8aM0U8//aRly5ZlaV0AgIzhhmsAAAAZ0LdvXx0/flzt27fX2rVrFR8frwULFqhr165KTk6Wr6+vunfvroEDB2rJkiXavHmzoqOj5ebm+utW/fr1NXr0aK1fv17r1q1T7969XY5id+zYUcHBwXr66ae1fPlyJSQkKDY2Vv369dP+/fszVGuJEiXUpUsXdevWTXPmzHEuY+bMmc427u7uio6O1uDBg1WmTBnVqlUrezoKAJAuwjcAAEAGFC5cWCtWrFBycrIaNWqkSpUqqX///goICHAG7Pfff1916tRR8+bN1bBhQ9WuXTvNteMjR45UeHi46tSpow4dOujll192Od3bx8dHy5YtU7FixfTMM8/ogQceUPfu3XXhwoVMHQkfM2aMWrdureeff17ly5dXz549dfbsWZc23bt316VLl9S1a9fb6BkAQEY4zPUXHQEAACDbREZGqkqVKho1alROl5LG8uXL1aBBA/35558qVKhQTpcDALka13wDAADcZy5evKgjR45o6NChatOmDcEbAO4ATjsHAAC4z0ybNk3FixdXUlKSy7PMAQD2cNo5AAAAAACWceQbAAAAAADLCN8AAAAAAFhG+AYAAAAAwDLCNwAAAAAAlhG+AQAAAACwjPANAAAAAIBlhG8AAAAAACwjfAMAAAAAYBnhGwAAAAAAy/4/UDpB0fmB9H0AAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":7},{"cell_type":"code","source":"# Calculate the length of each phrase\ninput_lengths = [len(phrase) for phrase in input_phrases]\noutput_lengths = [len(phrase) for phrase in output_phrases]\n\n# Define the bins for the length ranges\nmax_input = max(input_lengths)\nmax_output = max(output_lengths)\n\ninput_bins = [i * max_input / 10 for i in range(1, 11)]\noutput_bins = [i * max_output / 10 for i in range(1, 11)]\nbin_labels_input = [f'{int(input_bins[i-1])}-{int(input_bins[i])}' for i in range(1, 10)]\nbin_labels_output = [f'{int(output_bins[i-1])}-{int(output_bins[i])}' for i in range(1, 10)]\n\n# Bin the lengths into the categories\ninput_binned = np.digitize(input_lengths, input_bins)  # Categorize based on input lengths\noutput_binned = np.digitize(output_lengths, output_bins)  # Categorize based on output lengths\n\n# Count how many phrases fall into each bin\ninput_bin_counts = [sum(input_binned == i) for i in range(1, len(input_bins))]\noutput_bin_counts = [sum(output_binned == i) for i in range(1, len(output_bins))]\n\n# Plotting the bar charts\nplt.figure(figsize=(20, 10))\n\n# Plotting the input phrase lengths\nplt.subplot(1, 2, 1)\nplt.bar(bin_labels_input, input_bin_counts, color='skyblue', edgecolor='black')\nplt.title('Input Phrases Length Distribution')\nplt.xlabel('Length Range')\nplt.ylabel('Number of Phrases')\n\n# Plotting the output phrase lengths\nplt.subplot(1, 2, 2)\nplt.bar(bin_labels_output, output_bin_counts, color='skyblue', edgecolor='black')\nplt.title('Output Phrases Length Distribution')\nplt.xlabel('Length Range')\nplt.ylabel('Number of Phrases')\n\n# Show the plots\nplt.tight_layout()\nplt.show()","metadata":{"id":"d9lEMELsiqIx","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:54.371925Z","iopub.execute_input":"2025-01-04T20:01:54.372191Z","iopub.status.idle":"2025-01-04T20:01:54.925931Z","shell.execute_reply.started":"2025-01-04T20:01:54.372169Z","shell.execute_reply":"2025-01-04T20:01:54.925075Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 2000x1000 with 2 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAB8UAAAPdCAYAAAATbrkYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADFM0lEQVR4nOzdeZxVBfk/8M+wDeuwiICIIKIpKm5YiokrikqaS5lKBoZhinupUYqolYkb7kqamGK5fM1KS8QlccENxV3DQjAVEBEQUBC5vz/6zc2RRUZnGL2+36/XfX295zz33OecmfnGcz/3nFNWKBQKAQAAAAAAAIASVK+uGwAAAAAAAACA2iIUBwAAAAAAAKBkCcUBAAAAAAAAKFlCcQAAAAAAAABKllAcAAAAAAAAgJIlFAcAAAAAAACgZAnFAQAAAAAAAChZQnEAAAAAAAAASpZQHAAAAAAAAICSJRQHgBX4xz/+kbKystx666113QqroKysLEcfffRqe7/K349//OMftf5ew4cPT1lZWZVlq3N/R48enbKysrz22mur5f0AAICvtoEDB6Z58+Z13QaroHJefPLJJ1fbew4cODDrrrvuanmvddddNwMHDiw+X937u9NOO2WnnXZaLe8FUOqE4gBUW10MPCuzcOHCDB8+fJXDycows/LRsGHDrLfeevnBD36Qf//737Xb7BfcF/2Dh0ceeSTDhw/PnDlzanS7r7322jK/E23bts12222Xn//855k2bVqNvdevf/3r3H777TW2vZr0Re4NAABKzQsvvJDvf//7WXvttVNeXp6OHTumf//+eeGFFz7Xdlfnv+urO6MNHDiwyuxVUVGRzTffPOeff34WLVpUu81+wa3uL3pX1+WXX57Ro0fX+HYrvwRe+WjatGk6d+6cvffeO9dee22N/V68+OKLGT58+Bfyy95f5N4ASolQHIAvvYULF+aMM86o9hm7xx57bK6//vqMGjUq/fr1y0033ZSvf/3refPNN2unUT63Rx55JGeccUaNh+KVDj744Fx//fW55pprctppp2W99dbLyJEj07179/zxj3+sUrvDDjvk/fffzw477FCt9/gsH1Cdeuqpef/996v1ms9iRb0deuihef/999OlS5da7wEAAL4Kbrvttmy11Va59957c9hhh+Xyyy/PoEGDcv/992errbbKn/70p8+87dUdild3RisvL8/111+f66+/Pr/+9a/Tpk2b/PSnP82AAQNqr1E+t9oKxStdccUVuf7663PJJZfk8MMPz+zZs/PDH/4w3/jGN/L6669Xqf3tb3+bV155pVrbf/HFF3PGGWdUO3h+5ZVX8tvf/rZar6mulfV299135+67767V9wf4qmhQ1w0AQF3p3bt3vvOd7yRJDjvssHzta1/Lsccem+uuuy5Dhw793NtfuHBhmjZt+rm3w+qz1VZb5fvf/36VZVOnTs3uu++eAQMGpHv37tl8882TJPXq1Uvjxo1rtZ8FCxakWbNmadCgQRo0qLt/ttWvXz/169evs/cHAIBS8q9//SuHHnpo1ltvvYwfPz5rrrlmcd1xxx2X3r1759BDD82zzz6b9dZbrw47rR0NGjSoMncdddRR2WabbXLTTTflggsuSMeOHT/X9pcsWZKlS5emUaNGn7dVVqPvfOc7adu2bfH5sGHDMmbMmPzgBz/Id7/73Tz66KPFdQ0bNqzVXgqFQj744IM0adIk5eXltfpen8bvMUDNcaY4ADWi8rLbb7zxRvbdd980b948a665Zn7605/mo48+KtZVXqb6vPPOy4UXXpguXbqkSZMm2XHHHfP8889X2eaK7pv08XtHvfbaa8UPEM4444zi5baGDx9e7X3YZZddkiRTpkypsnzp0qX51a9+lU6dOqVx48bZdddd8+qrry7T66abbpqJEydmhx12SNOmTfPzn/88SfLnP/85/fr1S8eOHVNeXp5u3brlrLPOqnJckmTy5Mk54IAD0qFDhzRu3DidOnXKQQcdlLlz51apu+GGG9KzZ880adIkbdq0yUEHHbTMt6ZXdVuf1WOPPZY99tgjLVu2TNOmTbPjjjvm4YcfrlJTeQm0V199NQMHDkyrVq3SsmXLHHbYYVm4cGGV2vfffz/HHnts2rZtmxYtWmSfffbJG2+8UeVnOXz48Jx00klJkq5duxZ/1p/8JvXtt9+eTTfdNOXl5dlkk01y1113fa597dKlS0aPHp3FixdnxIgRxeXLu6f4px33srKyLFiwINddd12x/8p7k1UerxdffDGHHHJIWrdune23377KuuUZM2ZMNtxwwzRu3Dg9e/bM+PHjq6xf0b3WPrnNlfW2onuKX3755dlkk02Kl3ocMmTIMmeIVP5tvPjii9l5553TtGnTrL322lWOJQAAfJWce+65WbhwYUaNGlUlEE+Stm3b5qqrrsqCBQuq/Ju5Jv5dX1n78ssv58ADD0xFRUXWWGONHHfccfnggw+K26ic25d3VvBnmdE+Tb169Yqz/ydfW53PGEaOHJlu3bqlvLw8L774YhYvXpxhw4alZ8+eadmyZZo1a5bevXvn/vvvX6aHP/7xj+nZs2datGiRioqK9OjRIxdddFGVmjlz5uT444/POuusk/Ly8qy//vo555xzsnTp0mpv67NaunRpRo4cmU022SSNGzdO+/btc8QRR+Tdd9+tUrfuuuvmW9/6Vh566KF84xvfSOPGjbPeeuvl97///TLbfPbZZ7PjjjumSZMm6dSpU375y1/m2muvrfKzXHfddfPCCy/kgQceKP6cP/l5zaJFi3LiiSdmzTXXTLNmzbLffvvl7bff/lz7279//xx++OF57LHHMm7cuOLy5f09rOy4jx49Ot/97neTJDvvvHNxHyrn+crjNXbs2Gy99dZp0qRJrrrqquK6j99TvNLChQtzxBFHZI011khFRUV+8IMfLPNzWNHnUx/f5qf1trzPxmbOnJlBgwalffv2ady4cTbffPNcd911VWo+/rcxatSo4t/G17/+9TzxxBPLPd4Apc6Z4gDUmI8++ih9+/bNNttsk/POOy/33HNPzj///HTr1i1HHnlkldrf//73ee+99zJkyJB88MEHueiii7LLLrvkueeeS/v27Vf5Pddcc81cccUVOfLII7Pffvtl//33T5Jsttlm1e7/X//6V5JkjTXWqLL8N7/5TerVq5ef/vSnmTt3bkaMGJH+/fvnscceq1L3zjvvZM8998xBBx2U73//+8X9GD16dJo3b54TTzwxzZs3z3333Zdhw4Zl3rx5Offcc5MkixcvTt++fbNo0aIcc8wx6dChQ954443ccccdmTNnTlq2bJkk+dWvfpXTTjstBx54YA4//PC8/fbbueSSS7LDDjvk6aefTqtWrVZ5W5/Vfffdlz333DM9e/bM6aefnnr16uXaa6/NLrvskgcffDDf+MY3qtQfeOCB6dq1a84+++w89dRTufrqq9OuXbucc845xZqBAwfm5ptvzqGHHpptt902DzzwQPr161dlO/vvv3/++c9/5g9/+EMuvPDC4jfIP/4h0kMPPZTbbrstRx11VFq0aJGLL744BxxwQKZNm7bMz7U6evXqlW7dulUZwj9pVY779ddfn8MPPzzf+MY3Mnjw4CRJt27dqmznu9/9bjbYYIP8+te/TqFQWGlfDzzwQG666aYce+yxKS8vz+WXX5499tgjjz/+eDbddNNq7eOq9PZxw4cPzxlnnJE+ffrkyCOPzCuvvJIrrrgiTzzxRB5++OEq39x/9913s8cee2T//ffPgQcemFtvvTWnnHJKevTokT333LNafQIAwJfdX//616y77rrp3bv3ctfvsMMOWXfddXPnnXdWe9ur8u/6Aw88MOuuu27OPvvsPProo7n44ovz7rvvLjcwXZlVmdFW1fLm8ep8xnDttdfmgw8+yODBg1NeXp42bdpk3rx5ufrqq3PwwQfnRz/6Ud57771cc8016du3bx5//PFsscUWSZJx48bl4IMPzq677lqcU1966aU8/PDDOe6445L8NwDdcccd88Ybb+SII45I586d88gjj2To0KF56623MnLkyFXe1udxxBFHZPTo0TnssMNy7LHHZsqUKbn00kvz9NNPLzOHvfrqq/nOd76TQYMGZcCAAfnd736XgQMHpmfPntlkk02S/PdLB5VB7NChQ9OsWbNcffXVy5wdPXLkyBxzzDFp3rx5fvGLXyTJMp/dHHPMMWndunVOP/30vPbaaxk5cmSOPvro3HTTTZ9rnw899NCMGjUqd999d3bbbbfl1nzacd9hhx1y7LHH5uKLL87Pf/7zdO/ePUmK/zf572XSDz744BxxxBH50Y9+lA033HClfR199NFp1apVhg8fXpyHp06dWvwC/apald4+7v33389OO+2UV199NUcffXS6du2aW265JQMHDsycOXOW+T278cYb89577+WII45IWVlZRowYkf333z///ve/a/2Me4AvnAIAVNO1115bSFJ44oknissGDBhQSFI488wzq9RuueWWhZ49exafT5kypZCk0KRJk8J//vOf4vLHHnuskKRwwgknFJftuOOOhR133HGZ9x8wYEChS5cuxedvv/12IUnh9NNPX6X+77///kKSwu9+97vC22+/XXjzzTcLd955Z2HdddctlJWVFfersq579+6FRYsWFV9/0UUXFZIUnnvuuSq9JilceeWVy7zfwoULl1l2xBFHFJo2bVr44IMPCoVCofD0008XkhRuueWWFfb92muvFerXr1/41a9+VWX5c889V2jQoEFx+apsa0UGDBhQaNas2QrXL126tLDBBhsU+vbtW1i6dGlx+cKFCwtdu3Yt7LbbbsVlp59+eiFJ4Yc//GGVbey3336FNdZYo/h84sSJhSSF448/vkrdwIEDl/m5nnvuuYUkhSlTpizTW5JCo0aNCq+++mpx2TPPPFNIUrjkkktWut+Vv5fnnnvuCmu+/e1vF5IU5s6dWygU/vf7cf/99xcKhVU/7s2aNSsMGDBgmeWVx+vggw9e4bqPS1JIUnjyySeLy6ZOnVpo3LhxYb/99isu++Tfy8q2uaLeKv/mK4/7zJkzC40aNSrsvvvuhY8++qhYd+mllxb/tipV/m38/ve/Ly5btGhRoUOHDoUDDjhgmfcCAIBSNmfOnEKSwre//e2V1u2zzz6FJIV58+YVCoWa+Xd9Ze0+++xTZflRRx1VSFJ45plnCoXC/+aja6+9dpltVGdGW57KmfPtt98uvP3224VXX3218Otf/7pQVlZW2GyzzarUVeczhoqKisLMmTOr1C5ZsqTKLF8oFArvvvtuoX379lXm1OOOO65QUVFRWLJkyQr7PuusswrNmjUr/POf/6yy/Gc/+1mhfv36hWnTpq3ytlYkSWHIkCErXP/ggw8WkhTGjBlTZfldd921zPIuXboUkhTGjx9fXDZz5sxCeXl54Sc/+Ulx2THHHFMoKysrPP3008Vl77zzTqFNmzbL/Fw32WST5X5GUzkv9unTp8rnBCeccEKhfv36hTlz5qx0vyt/L99+++3lrn/33XcLSVY6567Kcb/llluqzPAfV3m87rrrruWu+/jfU+X+9uzZs7B48eLi8hEjRhSSFP785z8Xl63os6pPbnNlvX3ys7GRI0cWkhRuuOGG4rLFixcXevXqVWjevHnx/2dU/m2sscYahdmzZxdr//znPxeSFP76178u814Apc7l0wGoUT/+8Y+rPO/du3f+/e9/L1O37777Zu211y4+/8Y3vpFtttkmf/vb32q9x0o//OEPs+aaa6Zjx47p169f8RJzW2+9dZW6ww47rMo9nCq/zf/J/SovL89hhx22zPs0adKk+N/vvfdeZs2ald69e2fhwoV5+eWXk6R49vbYsWOXubR4pdtuuy1Lly7NgQcemFmzZhUfHTp0yAYbbFC8BNyqbOuzmjRpUiZPnpxDDjkk77zzTrGHBQsWZNddd8348eOXuXTc8n4n3nnnncybNy9Jipc3P+qoo6rUHXPMMdXur0+fPlXOgthss81SUVGx3N/B6mrevHmS//4Ml6emjvsnj9fK9OrVKz179iw+79y5c7797W9n7Nixy1yevybdc889Wbx4cY4//vjUq/e/f07+6Ec/SkVFxTJntDRv3rzKPQMbNWqUb3zjGzXycwEAgC+TynmiRYsWK62rXF85N9WkIUOGVHleOXutrnl8wYIFWXPNNbPmmmtm/fXXz89//vP06tUrf/rTn5apXdXPGA444IBlzlCvX79+cZZfunRpZs+enSVLlmTrrbfOU089Vaxr1apVFixYsNIrg91yyy3p3bt3WrduXWUe79OnTz766KPibaxWZVuf1S233JKWLVtmt912q9JDz54907x582UuC7/xxhtXuRrBmmuumQ033LDK8bvrrrvSq1ev4lnzSdKmTZv079+/2v0NHjy4yhnSvXv3zkcffZSpU6dWe1sf92mzeFIzx71r167p27fvKtcPHjy4ypnWRx55ZBo0aFDrf0d/+9vf0qFDhxx88MHFZQ0bNsyxxx6b+fPn54EHHqhS/73vfS+tW7cuPl/RZ1oAXwUunw5AjWncuPEyQ2jr1q2XuadSkmywwQbLLPva176Wm2++udb6+6Rhw4ald+/eqV+/ftq2bZvu3bunQYNl/6exc+fOVZ5XDhOf3K+11167Snhe6YUXXsipp56a++67b5kPNCrvNd21a9eceOKJueCCCzJmzJj07t07++yzT77//e8Xw9bJkyenUCgs99glKQ5jq7Ktz2ry5MlJkgEDBqywZu7cuVUGrpUdv4qKikydOjX16tVL165dq9Stv/761e7vk+9V+X7L+x2srvnz5ydZ8YdXNXXcP3kcVmZFf0cLFy7M22+/nQ4dOqzytqqj8kONT15OrlGjRllvvfWW+dCjU6dOy1w+rnXr1nn22WdrpT8AAPiiqpwnVhbwfXz9p4Xnn8Un54hu3bqlXr161b4X+GfVuHHj/PWvf03y3y+Xd+3aNZ06dVpu3ap+xrCiOeq6667L+eefn5dffjkffvjhcuuPOuqo3Hzzzdlzzz2z9tprZ/fdd8+BBx6YPfbYo1gzefLkPPvssyu8NPzMmTNXeVuf1eTJkzN37ty0a9dupT1UWpX5eOrUqenVq9cydTUxj6/os5Pq+rRZPKmZ416dWTxZ9u+oefPmWWuttWr972jq1KnZYIMNqnxBPfnf5dY/OY/X1s8F4MtIKA5Ajalfv36Nbq+srGy591SuqTNge/TokT59+nxq3Yr265O9ffyM8Epz5szJjjvumIqKipx55pnp1q1bGjdunKeeeiqnnHJKlbOqzz///AwcODB//vOfc/fdd+fYY48t3uOtU6dOWbp0acrKyvL3v/99uT1Vfnt6Vbb1WVX2e+6551b5JvmK+khW/fjVhNp8r+effz7t2rVLRUXFCmtq4rgv7/fo81jRvcxq80zyT1qdvwMAAPBF1rJly6y11lqf+gXRZ599NmuvvXZx/qjNf9d/ctu1PUPUr1//c83iy7O8OeqGG27IwIEDs+++++akk05Ku3btUr9+/Zx99tnFe5gnSbt27TJp0qSMHTs2f//73/P3v/891157bX7wgx/kuuuuS/LfWXi33XbLySefvNz3/9rXvrbK2/qsli5dmnbt2mXMmDHLXb+8M+WXp7bmsNp6v+effz7JyoP6mjjuNT2Lr4x5HKBuCMUBqBOVZxx/3D//+c+su+66xeetW7de7uWcPvmt1xUN7F8E//jHP/LOO+/ktttuyw477FBcPmXKlOXW9+jRIz169Mipp56aRx55JN/85jdz5ZVX5pe//GW6deuWQqGQrl27FgfulVnZtj6rykuTV1RUrNKHGKuiS5cuWbp0aaZMmVLlm9avvvrqMrV19bOeMGFC/vWvf1W5BPiKfNpxr8l9WNHfUdOmTYsfiLRu3Tpz5sxZpm55l7Bb1d66dOmSJHnllVey3nrrFZcvXrw4U6ZMqbHfDQAAKEXf+ta38tvf/jYPPfRQtt9++2XWP/jgg3nttddyxBFHFJfV5L/rJ0+eXOWs2FdffTVLly4tzuOVZ5J+8v0+zwxRF2699dast956ue2226r0efrppy9T26hRo+y9997Ze++9s3Tp0hx11FG56qqrctppp2X99ddPt27dMn/+/FWadT5tW59Vt27dcs899+Sb3/xmjQW4Xbp0We7s/UWax6+//vok+dRLm3/aca/p/idPnpydd965+Hz+/Pl56623stdeexWXLe/vdvHixXnrrbeqLKtOb126dMmzzz6bpUuXVjlbvPL2fJXzOgDLck9xAOrE7bffnjfeeKP4/PHHH89jjz2WPffcs7isW7duefnll/P2228Xlz3zzDN5+OGHq2yradOmSZYd2L8IKr+R+/Fv4C5evDiXX355lbp58+ZlyZIlVZb16NEj9erVy6JFi5Ik+++/f+rXr58zzjhjmW/0FgqFvPPOO6u8rc+qZ8+e6datW84777ziJcw+7uM/q1VVOdh+8phccskly9Q2a9Ysyer9WU+dOjUDBw5Mo0aNctJJJ62wblWPe7NmzWqs/wkTJlS5F97rr7+eP//5z9l9992Lv3vdunXL3Llzq5yJ8tZbby33fn2r2lufPn3SqFGjXHzxxVV+F6+55prMnTs3/fr1+xx7BQAApe2kk05KkyZNcsQRRxTnuEqzZ8/Oj3/84zRt2rTK/FGT/66/7LLLqjyvnL0q5/GKioq0bdu2eJ/sSp+c2SrfK/nyzOOPPfZYJkyYUKXukz+DevXqZbPNNkuS4ix34IEHZsKECRk7duwy7zNnzpziLLgq2/qsDjzwwHz00Uc566yzllm3ZMmSz/Qz6Nu3byZMmJBJkyYVl82ePXu5Z6PX5Cy7qm688cZcffXV6dWrV3bdddcV1q3Kca/p39VRo0ZVuST/FVdckSVLlizzudYn/45GjRq1zJni1eltr732yvTp03PTTTcVly1ZsiSXXHJJmjdvnh133PGz7A7AV4IzxQGoE+uvv3623377HHnkkVm0aFFGjhyZNdZYo8qlyH74wx/mggsuSN++fTNo0KDMnDkzV155ZTbZZJMq9+Zu0qRJNt5449x000352te+ljZt2mTTTTfNpptuWhe7VsV2222X1q1bZ8CAATn22GNTVlaW66+/fplQ+7777svRRx+d7373u/na176WJUuW5Prrr0/9+vVzwAEHJPnvMPXLX/4yQ4cOzWuvvZZ99903LVq0yJQpU/KnP/0pgwcPzk9/+tNV2tbKfPjhh8s9m7xNmzY56qijcvXVV2fPPffMJptsksMOOyxrr7123njjjdx///2pqKgo3htuVfXs2TMHHHBARo4cmXfeeSfbbrttHnjggfzzn/9MUvUb0z179kyS/OIXv8hBBx2Uhg0bZu+99y4OkJ/XU089lRtuuCFLly7NnDlz8sQTT+T//u//ij+3yqF6eVb1uPfs2TP33HNPLrjggnTs2DFdu3bNNtts85n63XTTTdO3b98ce+yxKS8vL35IdcYZZxRrDjrooJxyyinZb7/9cuyxx2bhwoW54oor8rWvfa1KoF6d3tZcc80MHTo0Z5xxRvbYY4/ss88+eeWVV3L55Zfn61//+iqdUQ8AAF9VG2ywQa677rr0798/PXr0yKBBg9K1a9e89tprueaaazJr1qz84Q9/KF6pK6nZf9dPmTIl++yzT/bYY49MmDAhN9xwQw455JBsvvnmxZrDDz88v/nNb3L44Ydn6623zvjx44sz2iffK6m9Ge3z+Na3vpXbbrst++23X/r165cpU6bkyiuvzMYbb1zlS96HH354Zs+enV122SWdOnXK1KlTc8kll2SLLbYo3qf5pJNOyl/+8pd861vfysCBA9OzZ88sWLAgzz33XG699da89tpradu27Spta2WefPLJ5c7jO+20U3bcccccccQROfvsszNp0qTsvvvuadiwYSZPnpxbbrklF110Ub7zne9U6xidfPLJueGGG7LbbrvlmGOOSbNmzXL11Venc+fOmT179jLz+BVXXJFf/vKXWX/99dOuXbvssssu1Xq/lbn11lvTvHnzLF68OG+88UbGjh2bhx9+OJtvvnluueWWlb52VY77Fltskfr16+ecc87J3LlzU15enl122WWF92j/NIsXL86uu+6aAw88sDgPb7/99tlnn32q9PXjH/84BxxwQHbbbbc888wzGTt2bNq2bVtlW9XpbfDgwbnqqqsycODATJw4Meuuu25uvfXWPPzwwxk5cuRK770O8JVXAIBquvbaawtJCk888URx2YABAwrNmjVbpvb0008vfPx/bqZMmVJIUjj33HML559/fmGdddYplJeXF3r37l145plnlnn9DTfcUFhvvfUKjRo1KmyxxRaFsWPHFgYMGFDo0qVLlbpHHnmk0LNnz0KjRo0KSQqnn376Cvu///77C0kKt9xyy0r3c0V1lftw7bXXFpftuOOOhU022WS523n44YcL2267baFJkyaFjh07Fk4++eTC2LFjC0kK999/f6FQKBT+/e9/F374wx8WunXrVmjcuHGhTZs2hZ133rlwzz33LLO9//u//ytsv/32hWbNmhWaNWtW2GijjQpDhgwpvPLKK9Xe1icNGDCgkGS5j27duhXrnn766cL+++9fWGONNQrl5eWFLl26FA488MDCvffeW6yp/Nm//fbbVd6j8vdnypQpxWULFiwoDBkypNCmTZtC8+bNC/vuu2/hlVdeKSQp/OY3v6ny+rPOOquw9tprF+rVq1dlO0kKQ4YMWWafunTpUhgwYMBK97vyZ1r5aNCgQaFNmzaFbbbZpjB06NDC1KlTl3lN5e9HdX+GL7/8cmGHHXYoNGnSpJCk2NuKjtfH131c5f7ecMMNhQ022KBQXl5e2HLLLYv9fNzdd99d2HTTTQuNGjUqbLjhhoUbbrhhudtcUW/L+5kVCoXCpZdeWthoo40KDRs2LLRv375w5JFHFt59990qNSv621je3zEAAHyVPPvss4WDDz64sNZaaxUaNmxY6NChQ+Hggw8uPPfcc8ut/7z/rq+sffHFFwvf+c53Ci1atCi0bt26cPTRRxfef//9KttYuHBhYdCgQYWWLVsWWrRoUTjwwAMLM2fOXO68vaIZbXlW9NnBqtat7DOGT1q6dGnh17/+daFLly7FeemOO+5YZha59dZbC7vvvnuhXbt2hUaNGhU6d+5cOOKIIwpvvfVWle299957haFDhxbWX3/9QqNGjQpt27YtbLfddoXzzjuvsHjx4mpta3lWNIsnKZx11lnFulGjRhV69uxZaNKkSaFFixaFHj16FE4++eTCm2++Wazp0qVLoV+/fsu8x4477ljYcccdqyx7+umnC7179y6Ul5cXOnXqVDj77LMLF198cSFJYfr06cW66dOnF/r161do0aJFIUlxO8v7jKhQWHZmXpHKn2nlo3HjxoVOnToVvvWtbxV+97vfFT744INlXvNZf4a//e1vC+utt16hfv36VXpb0fGqXPfxzxQq9/eBBx4oDB48uNC6detC8+bNC/379y+88847VV770UcfFU455ZRC27ZtC02bNi307du38Oqrry73c4oV9ba8n9mMGTMKhx12WKFt27aFRo0aFXr06FHlM6pCYeV/G5/2uRlAqSorFD5xqhoA1KLXXnstXbt2zbnnnpuf/vSndd0OX2CTJk3KlltumRtuuCH9+/ev63YAAAC+1IYPH54zzjgjb7/99jJnqsLHHX/88bnqqqsyf/784mXoAeDLzj3FAYA69/777y+zbOTIkalXr1522GGHOugIAAAASt8n5/F33nkn119/fbbffnuBOAAlxT3FAYA6N2LEiEycODE777xzGjRokL///e/5+9//nsGDB2edddap6/YAAACgJPXq1Ss77bRTunfvnhkzZuSaa67JvHnzctppp9V1awBQo4TiAECd22677TJu3LicddZZmT9/fjp37pzhw4fnF7/4RV23BgAAACVrr732yq233ppRo0alrKwsW221Va655hpXbQOg5LinOAAAAAAAAAAlyz3FAQAAAAAAAChZLp9eQ5YuXZo333wzLVq0SFlZWV23AwAAwBdIoVDIe++9l44dO6ZePd9Prw7zNgAAACuyqvO2ULyGvPnmm1lnnXXqug0AAAC+wF5//fV06tSprtv4UjFvAwAA8Gk+bd4WiteQFi1aJPnvAa+oqKjjbgAAAPgimTdvXtZZZ53i7MiqM28DAACwIqs6bwvFa0jlJdwqKioM6QAAACyXy39Xn3kbAACAT/Np87YbmQEAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyarTUHz8+PHZe++907Fjx5SVleX2229fYe2Pf/zjlJWVZeTIkVWWz549O/37909FRUVatWqVQYMGZf78+VVqnn322fTu3TuNGzfOOuuskxEjRiyz/VtuuSUbbbRRGjdunB49euRvf/tbTewiAAAAAAAAAHWoTkPxBQsWZPPNN89ll1220ro//elPefTRR9OxY8dl1vXv3z8vvPBCxo0blzvuuCPjx4/P4MGDi+vnzZuX3XffPV26dMnEiRNz7rnnZvjw4Rk1alSx5pFHHsnBBx+cQYMG5emnn86+++6bfffdN88//3zN7SwAAAAAAAAAq11ZoVAo1HUTSVJWVpY//elP2Xfffassf+ONN7LNNttk7Nix6devX44//vgcf/zxSZKXXnopG2+8cZ544olsvfXWSZK77rore+21V/7zn/+kY8eOueKKK/KLX/wi06dPT6NGjZIkP/vZz3L77bfn5ZdfTpJ873vfy4IFC3LHHXcU33fbbbfNFltskSuvvHK5/S5atCiLFi0qPp83b17WWWedzJ07NxUVFTV1WAAAACgB8+bNS8uWLc2Mn4FjBwAAwIqs6sz4hb6n+NKlS3PooYfmpJNOyiabbLLM+gkTJqRVq1bFQDxJ+vTpk3r16uWxxx4r1uywww7FQDxJ+vbtm1deeSXvvvtusaZPnz5Vtt23b99MmDBhhb2dffbZadmyZfGxzjrrfK59BQAAAAAAAKDmfaFD8XPOOScNGjTIscceu9z106dPT7t27aosa9Cg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AAAAAChZQnEAAAAAAAAASpZQHAAAAAAAAICSJRQHAAAAAAAAoGQJxQEAAOAraPjw4SkrK6vy2GijjYrrP/jggwwZMiRrrLFGmjdvngMOOCAzZsyoso1p06alX79+adq0adq1a5eTTjopS5YsqVLzj3/8I1tttVXKy8uz/vrrZ/To0atj9wAAAKBIKA4AAABfUZtsskneeuut4uOhhx4qrjvhhBPy17/+NbfcckseeOCBvPnmm9l///2L6z/66KP069cvixcvziOPPJLrrrsuo0ePzrBhw4o1U6ZMSb9+/bLzzjtn0qRJOf7443P44Ydn7Nixq3U/AQAA+GprUNcNAAAAAHWjQYMG6dChwzLL586dm2uuuSY33nhjdtlllyTJtddem+7du+fRRx/Ntttum7vvvjsvvvhi7rnnnrRv3z5bbLFFzjrrrJxyyikZPnx4GjVqlCuvvDJdu3bN+eefnyTp3r17HnrooVx44YXp27fvat1XAAAAvrqcKQ4AAABfUZMnT07Hjh2z3nrrpX///pk2bVqSZOLEifnwww/Tp0+fYu1GG22Uzp07Z8KECUmSCRMmpEePHmnfvn2xpm/fvpk3b15eeOGFYs3Ht1FZU7mN5Vm0aFHmzZtX5QEAAACfh1AcAAAAvoK22WabjB49OnfddVeuuOKKTJkyJb179857772X6dOnp1GjRmnVqlWV17Rv3z7Tp09PkkyfPr1KIF65vnLdymrmzZuX999/f7l9nX322WnZsmXxsc4669TE7gIAAPAV5vLpAAAA8BW05557Fv97s802yzbbbJMuXbrk5ptvTpMmTeqsr6FDh+bEE08sPp83b55gHAAAgM/FmeIAAABAWrVqla997Wt59dVX06FDhyxevDhz5sypUjNjxoziPcg7dOiQGTNmLLO+ct3KaioqKlYYvJeXl6eioqLKAwAAAD4PoTgAAACQ+fPn51//+lfWWmut9OzZMw0bNsy9995bXP/KK69k2rRp6dWrV5KkV69eee655zJz5sxizbhx41JRUZGNN964WPPxbVTWVG4DAAAAVgehOAAAAHwF/fSnP80DDzyQ1157LY888kj222+/1K9fPwcffHBatmyZQYMG5cQTT8z999+fiRMn5rDDDkuvXr2y7bbbJkl23333bLzxxjn00EPzzDPPZOzYsTn11FMzZMiQlJeXJ0l+/OMf59///ndOPvnkvPzyy7n88stz880354QTTqjLXQcAAOArxj3FAQAA4CvoP//5Tw4++OC88847WXPNNbP99tvn0UcfzZprrpkkufDCC1OvXr0ccMABWbRoUfr27ZvLL7+8+Pr69evnjjvuyJFHHplevXqlWbNmGTBgQM4888xiTdeuXXPnnXfmhBNOyEUXXZROnTrl6quvTt++fVf7/gIAAPDVJRQHAACAr6A//vGPK13fuHHjXHbZZbnssstWWNOlS5f87W9/W+l2dtpppzz99NOfqUcAAACoCS6fDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJSsOg3Fx48fn7333jsdO3ZMWVlZbr/99uK6Dz/8MKecckp69OiRZs2apWPHjvnBD36QN998s8o2Zs+enf79+6eioiKtWrXKoEGDMn/+/Co1zz77bHr37p3GjRtnnXXWyYgRI5bp5ZZbbslGG22Uxo0bp0ePHvnb3/5WK/sMAAAAAAAAwOpTp6H4ggULsvnmm+eyyy5bZt3ChQvz1FNP5bTTTstTTz2V2267La+88kr22WefKnX9+/fPCy+8kHHjxuWOO+7I+PHjM3jw4OL6efPmZffdd0+XLl0yceLEnHvuuRk+fHhGjRpVrHnkkUdy8MEHZ9CgQXn66aez7777Zt99983zzz9fezsPAAAAAAAAQK1rUJdvvueee2bPPfdc7rqWLVtm3LhxVZZdeuml+cY3vpFp06alc+fOeemll3LXXXfliSeeyNZbb50kueSSS7LXXnvlvPPOS8eOHTNmzJgsXrw4v/vd79KoUaNssskmmTRpUi644IJieH7RRRdljz32yEknnZQkOeusszJu3LhceumlufLKK2vxCAAAAAAAAABQm75U9xSfO3duysrK0qpVqyTJhAkT0qpVq2IgniR9+vRJvXr18thjjxVrdthhhzRq1KhY07dv37zyyit59913izV9+vSp8l59+/bNhAkTVtjLokWLMm/evCoPAAAAAAAAAL5YvjSh+AcffJBTTjklBx98cCoqKpIk06dPT7t27arUNWjQIG3atMn06dOLNe3bt69SU/n802oq1y/P2WefnZYtWxYf66yzzufbQQAAAAAAAABq3JciFP/www9z4IEHplAo5IorrqjrdpIkQ4cOzdy5c4uP119/va5bAgAAAAAAAOAT6vSe4quiMhCfOnVq7rvvvuJZ4knSoUOHzJw5s0r9kiVLMnv27HTo0KFYM2PGjCo1lc8/raZy/fKUl5envLz8s+8YAAAAAAAAALXuC32meGUgPnny5Nxzzz1ZY401qqzv1atX5syZk4kTJxaX3XfffVm6dGm22WabYs348ePz4YcfFmvGjRuXDTfcMK1bty7W3HvvvVW2PW7cuPTq1au2dg0AAAAAAACA1aBOQ/H58+dn0qRJmTRpUpJkypQpmTRpUqZNm5YPP/ww3/nOd/Lkk09mzJgx+eijjzJ9+vRMnz49ixcvTpJ07949e+yxR370ox/l8ccfz8MPP5yjjz46Bx10UDp27JgkOeSQQ9KoUaMMGjQoL7zwQm666aZcdNFFOfHEE4t9HHfccbnrrrty/vnn5+WXX87w4cPz5JNP5uijj17txwQAAAAAAACAmlOnofiTTz6ZLbfcMltuuWWS5MQTT8yWW26ZYcOG5Y033shf/vKX/Oc//8kWW2yRtdZaq/h45JFHitsYM2ZMNtpoo+y6667Za6+9sv3222fUqFHF9S1btszdd9+dKVOmpGfPnvnJT36SYcOGZfDgwcWa7bbbLjfeeGNGjRqVzTffPLfeemtuv/32bLrppqvvYAAAAAAAAABQ4+r0nuI77bRTCoXCCtevbF2lNm3a5MYbb1xpzWabbZYHH3xwpTXf/e53893vfvdT3w8AAAAAAACAL48v9D3FAQAAAAAAAODzEIoDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQsoTiAAAAAAAAAJQsoTgAAAAAAAAAJUsoDgAAAAAAAEDJEooDAAAAAAAAULKE4gAAAAAAAACULKE4AAAAAAAAACVLKA4AAAAAAABAyRKKAwAAAAAAAFCyhOIAAAAAAAAAlCyhOAAAAAAAAAAlq05D8fHjx2fvvfdOx44dU1ZWlttvv73K+kKhkGHDhmWttdZKkyZN0qdPn0yePLlKzezZs9O/f/9UVFSkVatWGTRoUObPn1+l5tlnn03v3r3TuHHjrLPOOhkxYsQyvdxyyy3ZaKON0rhx4/To0SN/+9vfanx/AQAAAAAAAFi96jQUX7BgQTbffPNcdtlly10/YsSIXHzxxbnyyivz2GOPpVmzZunbt28++OCDYk3//v3zwgsvZNy4cbnjjjsyfvz4DB48uLh+3rx52X333dOlS5dMnDgx5557boYPH55Ro0YVax555JEcfPDBGTRoUJ5++unsu+++2XffffP888/X3s4DAAAAAAAAUOsa1OWb77nnntlzzz2Xu65QKGTkyJE59dRT8+1vfztJ8vvf/z7t27fP7bffnoMOOigvvfRS7rrrrjzxxBPZeuutkySXXHJJ9tprr5x33nnp2LFjxowZk8WLF+d3v/tdGjVqlE022SSTJk3KBRdcUAzPL7roouyxxx456aSTkiRnnXVWxo0bl0svvTRXXnnlajgSAAAAAAAAANSGL+w9xadMmZLp06enT58+xWUtW7bMNttskwkTJiRJJkyYkFatWhUD8STp06dP6tWrl8cee6xYs8MOO6RRo0bFmr59++aVV17Ju+++W6z5+PtU1lS+z/IsWrQo8+bNq/IAAAAAAAAA4IvlCxuKT58+PUnSvn37Ksvbt29fXDd9+vS0a9euyvoGDRqkTZs2VWqWt42Pv8eKairXL8/ZZ5+dli1bFh/rrLNOdXcRAAAAAAAAgFr2hQ3Fv+iGDh2auXPnFh+vv/56XbcEAAAAAAAAwCd8YUPxDh06JElmzJhRZfmMGTOK6zp06JCZM2dWWb9kyZLMnj27Ss3ytvHx91hRTeX65SkvL09FRUWVBwAAAAAAAABfLF/YULxr167p0KFD7r333uKyefPm5bHHHkuvXr2SJL169cqcOXMyceLEYs19992XpUuXZptttinWjB8/Ph9++GGxZty4cdlwww3TunXrYs3H36eypvJ9AAAAAAAAAPhyqtNQfP78+Zk0aVImTZqUJJkyZUomTZqUadOmpaysLMcff3x++ctf5i9/+Uuee+65/OAHP0jHjh2z7777Jkm6d++ePfbYIz/60Y/y+OOP5+GHH87RRx+dgw46KB07dkySHHLIIWnUqFEGDRqUF154ITfddFMuuuiinHjiicU+jjvuuNx11105//zz8/LLL2f48OF58sknc/TRR6/uQwIAAACr3W9+85viHF7pgw8+yJAhQ7LGGmukefPmOeCAA5a5ytq0adPSr1+/NG3aNO3atctJJ52UJUuWVKn5xz/+ka222irl5eVZf/31M3r06NWwRwAAAPA/dRqKP/nkk9lyyy2z5ZZbJklOPPHEbLnllhk2bFiS5OSTT84xxxyTwYMH5+tf/3rmz5+fu+66K40bNy5uY8yYMdloo42y6667Zq+99sr222+fUaNGFde3bNkyd999d6ZMmZKePXvmJz/5SYYNG5bBgwcXa7bbbrvceOONGTVqVDbffPPceuutuf3227PpppuupiMBAAAAdeOJJ57IVVddlc0226zK8hNOOCF//etfc8stt+SBBx7Im2++mf3337+4/qOPPkq/fv2yePHiPPLII7nuuusyevTo4kyf/PfL7/369cvOO++cSZMm5fjjj8/hhx+esWPHrrb9AwAAgAZ1+eY77bRTCoXCCteXlZXlzDPPzJlnnrnCmjZt2uTGG29c6ftsttlmefDBB1da893vfjff/e53V94wAAAAlJD58+enf//++e1vf5tf/vKXxeVz587NNddckxtvvDG77LJLkuTaa69N9+7d8+ijj2bbbbfN3XffnRdffDH33HNP2rdvny222CJnnXVWTjnllAwfPjyNGjXKlVdema5du+b8889P8t8rvj300EO58MIL07dv3zrZZwAAAL56vrD3FAcAAABq15AhQ9KvX7/06dOnyvKJEyfmww8/rLJ8o402SufOnTNhwoQkyYQJE9KjR4+0b9++WNO3b9/MmzcvL7zwQrHmk9vu27dvcRvLs2jRosybN6/KAwAAAD6POj1THAAAAKgbf/zjH/PUU0/liSeeWGbd9OnT06hRo7Rq1arK8vbt22f69OnFmo8H4pXrK9etrGbevHl5//3306RJk2Xe++yzz84ZZ5zxmfcLAAAAPsmZ4gAAAPAV8/rrr+e4447LmDFj0rhx47pup4qhQ4dm7ty5xcfrr79e1y0BAADwJScUBwAAgK+YiRMnZubMmdlq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HwAAAPD/mckBAACg+qodin/44YcpLy9Pktxzzz3ZZ599kiQbbbRR3nrrrZrtDgAAACgykwMAAED1VTsU32STTXLllVfmwQcfzLhx47LHHnskSd58882sscYaNdrcRx99lNNOOy1du3ZNkyZN0q1bt5x11lkpFArFmkKhkGHDhmWttdZKkyZN0qdPn0yePLnKdmbPnp3+/funoqIirVq1yqBBgzJ//vwqNc8++2x69+6dxo0bZ5111smIESNqdF8AAADg81qdMzkAAACUimqH4uecc06uuuqq7LTTTjn44IOz+eabJ0n+8pe/FC/hVlPOOeecXHHFFbn00kvz0ksv5ZxzzsmIESNyySWXFGtGjBiRiy++OFdeeWUee+yxNGvWLH379s0HH3xQrOnfv39eeOGFjBs3LnfccUfGjx+fwYMHF9fPmzcvu+++e7p06ZKJEyfm3HPPzfDhwzNq1Kga3R8AAAD4PFbnTA4AAAClokF1X7DTTjtl1qxZmTdvXlq3bl1cPnjw4DRt2rRGm3vkkUfy7W9/O/369UuSrLvuuvnDH/6Qxx9/PMl/zxIfOXJkTj311Hz7299Okvz+979P+/btc/vtt+eggw7KSy+9lLvuuitPPPFEtt566yTJJZdckr322ivnnXdeOnbsmDFjxmTx4sX53e9+l0aNGmWTTTbJpEmTcsEFF1QJzz9u0aJFWbRoUfH5vHnzanTfAQAA4JNW50wOAAAApaLaZ4on/w2jJ06cmKuuuirvvfdekqRRo0Y1PoBvt912uffee/PPf/4zSfLMM8/koYceyp577pkkmTJlSqZPn54+ffoUX9OyZctss802mTBhQpJkwoQJadWqVTEQT5I+ffqkXr16eeyxx4o1O+ywQxo1alSs6du3b1555ZW8++67y+3t7LPPTsuWLYuPddZZp0b3HQAAAJZndc3kAAAAUCqqfab41KlTs8cee2TatGlZtGhRdtttt7Ro0SLnnHNOFi1alCuvvLLGmvvZz36WefPmZaONNkr9+vXz0Ucf5Ve/+lX69++fJJk+fXqSpH379lVe1759++K66dOnp127dlXWN2jQIG3atKlS07Vr12W2Ubnu49++rzR06NCceOKJxefz5s0TjAMAAFCrVudMDgAAAKWi2meKH3fccdl6663z7rvvpkmTJsXl++23X+69994abe7mm2/OmDFjcuONN+app57Kddddl/POOy/XXXddjb7PZ1FeXp6KiooqDwAAAKhNq3MmBwAAgFJR7TPFH3zwwTzyyCNVLjWe/Pd+32+88UaNNZYkJ510Un72s5/loIMOSpL06NEjU6dOzdlnn50BAwakQ4cOSZIZM2ZkrbXWKr5uxowZ2WKLLZIkHTp0yMyZM6tsd8mSJZk9e3bx9R06dMiMGTOq1FQ+r6wBAACAurY6Z3IAAAAoFdU+U3zp0qX56KOPlln+n//8Jy1atKiRpiotXLgw9epVbbF+/fpZunRpkqRr167p0KFDlW/Dz5s3L4899lh69eqVJOnVq1fmzJmTiRMnFmvuu+++LF26NNtss02xZvz48fnwww+LNePGjcuGG2643EunAwAAQF1YnTM5AAAAlIpqh+K77757Ro4cWXxeVlaW+fPn5/TTT89ee+1Vk71l7733zq9+9avceeedee211/KnP/0pF1xwQfbbb7/iex9//PH55S9/mb/85S957rnn8oMf/CAdO3bMvvvumyTp3r179thjj/zoRz/K448/nocffjhHH310DjrooHTs2DFJcsghh6RRo0YZNGhQXnjhhdx000256KKLqtwzHAAAAOra6pzJAQAAoFRU+/Lp559/fvr27ZuNN944H3zwQQ455JBMnjw5bdu2zR/+8Icabe6SSy7JaaedlqOOOiozZ85Mx44dc8QRR2TYsGHFmpNPPjkLFizI4MGDM2fOnGy//fa566670rhx42LNmDFjcvTRR2fXXXdNvXr1csABB+Tiiy8urm/ZsmXuvvvuDBkyJD179kzbtm0zbNiwDB48uEb3BwAAAD6P1TmTAwAAQKmodijeqVOnPPPMM7npppvyzDPPZP78+Rk0aFD69++fJk2a1GhzLVq0yMiRI6t8C/6TysrKcuaZZ+bMM89cYU2bNm1y4403rvS9Nttsszz44IOftVUAAACodatzJgcAAIBSUe1QPEkaNGiQ/v37p3///jXdDwAAALASZnIAAAConmrfU/y6667LnXfeWXx+8sknp1WrVtluu+0yderUGm0OAAAA+B8zOQAAAFRftUPxX//618VLsk2YMCGXXnppRowYkbZt2+aEE06o8QYBAACA/zKTAwAAQPVV+/Lpr7/+etZff/0kye23357vfOc7GTx4cL75zW9mp512qun+AAAAgP/PTA4AAADVV+0zxZs3b5533nknSXL33Xdnt912S5I0btw477//fs12BwAAABSZyQEAAKD6qn2m+G677ZbDDz88W265Zf75z39mr732SpK88MILWXfddWu6PwAAAOD/M5MDAABA9VX7TPHLLrssvXr1yttvv53/+7//yxprrJEkmThxYg4++OAabxAAAAD4LzM5AAAAVF+1zxRv1apVLr300mWWn3HGGTXSEAAAALB8ZnIAAACovmqH4pUWLlyYadOmZfHixVWWb7bZZp+7KQAAAGDFzOQAAACw6qodir/99tsZOHBg7rrrruWu/+ijjz53UwAAAMCyzOQAAABQfdW+p/jxxx+fuXPn5rHHHkuTJk1y11135brrrssGG2yQv/zlL7XRIwAAABAzOQAAAHwW1T5T/L777suf//znbL311qlXr166dOmS3XbbLRUVFTn77LPTr1+/2ugTAAAAvvLM5AAAAFB91T5TfMGCBWnXrl2SpHXr1nn77beTJD169MhTTz1Vs90BAAAARWZyAAAAqL5qh+IbbrhhXnnllSTJ5ptvnquuuipvvPFGrrzyyqy11lo13iAAAADwX2ZyAAAAqL5qXz79uOOOy1tvvZUkOf3007PHHntkzJgxadSoUUaPHl3T/QEAAAD/n5kcAAAAqq/aofj3v//94n/37NkzU6dOzcsvv5zOnTunbdu2NdocAAAA8D9mcgAAAKi+al0+/cMPP0y3bt3y0ksvFZc1bdo0W221leEbAAAAapGZHAAAAD6baoXiDRs2zAcffFBbvQAAAAArYCYHAACAz6ZaoXiSDBkyJOecc06WLFlSG/0AAAAAK2AmBwAAgOqr9j3Fn3jiidx77725++6706NHjzRr1qzK+ttuu63GmgMAAAD+x0wOAAAA1VftULxVq1Y54IADaqMXAAAAYCXM5AAAAFB91Q7Fr7322troAwAAAPgUZnIAAACovmrfUxwAAAAAAAAAviyqHYrPmDEjhx56aDp27JgGDRqkfv36VR4AAABA7TCTAwAAQPVV+/LpAwcOzLRp03LaaadlrbXWSllZWW30BQAAAHyCmRwAAACqr9qh+EMPPZQHH3wwW2yxRS20AwAAAKyImRwAAACqr9qXT19nnXVSKBRqoxcAAABgJWpyJr/iiiuy2WabpaKiIhUVFenVq1f+/ve/F9d/8MEHGTJkSNZYY400b948BxxwQGbMmFFlG9OmTUu/fv3StGnTtGvXLieddFKWLFlSpeYf//hHttpqq5SXl2f99dfP6NGja6R/AAAAWFXVDsVHjhyZn/3sZ3nttddqoR0AAABgRWpyJu/UqVN+85vfZOLEiXnyySezyy675Nvf/nZeeOGFJMkJJ5yQv/71r7nlllvywAMP5M0338z+++9ffP1HH32Ufv36ZfHixXnkkUdy3XXXZfTo0Rk2bFixZsqUKenXr1923nnnTJo0Kccff3wOP/zwjB079nP3DwAAAKtqlS6f3rp16yr3KVuwYEG6deuWpk2bpmHDhlVqZ8+eXbMdAgAAwFdYbc3ke++9d5Xnv/rVr3LFFVfk0UcfTadOnXLNNdfkxhtvzC677JIkufbaa9O9e/c8+uij2XbbbXP33XfnxRdfzD333JP27dtniy22yFlnnZVTTjklw4cPT6NGjXLllVema9euOf/885Mk3bt3z0MPPZQLL7wwffv2/ayHBAAAAKpllULxkSNH1nIbAAAAwPKsjpn8o48+yi233JIFCxakV69emThxYj788MP06dOnWLPRRhulc+fOmTBhQrbddttMmDAhPXr0SPv27Ys1ffv2zZFHHpkXXnghW265ZSZMmFBlG5U1xx9//Ap7WbRoURYtWlR8Pm/evJrbUQAAAL6SVikUHzBgQG33AQAAACxHbc7kzz33XHr16pUPPvggzZs3z5/+9KdsvPHGmTRpUho1apRWrVpVqW/fvn2mT5+eJJk+fXqVQLxyfeW6ldXMmzcv77//fpo0abJMT2effXbOOOOMmtpFAAAAWPV7ii9dujTnnHNOvvnNb+brX/96fvazn+X999+vzd4AAACA1N5MvuGGG2bSpEl57LHHcuSRR2bAgAF58cUXa6Djz27o0KGZO3du8fH666/XaT8AAAB8+a1yKP6rX/0qP//5z9O8efOsvfbaueiiizJkyJDa7A0AAABI7c3kjRo1yvrrr5+ePXvm7LPPzuabb56LLrooHTp0yOLFizNnzpwq9TNmzEiHDh2SJB06dMiMGTOWWV+5bmU1FRUVyz1LPEnKy8tTUVFR5QEAAACfxyqH4r///e9z+eWXZ+zYsbn99tvz17/+NWPGjMnSpUtrsz8AAAD4yltdM/nSpUuzaNGi9OzZMw0bNsy9995bXPfKK69k2rRp6dWrV5KkV69eee655zJz5sxizbhx41JRUZGNN964WPPxbVTWVG4DAAAAVodVuqd4kkybNi177bVX8XmfPn1SVlaWN998M506daqV5gAAAIDamcmHDh2aPffcM507d857772XG2+8Mf/4xz8yduzYtGzZMoMGDcqJJ56YNm3apKKiIsccc0x69eqVbbfdNkmy++67Z+ONN86hhx6aESNGZPr06Tn11FMzZMiQlJeXJ0l+/OMf59JLL83JJ5+cH/7wh7nvvvty880358477/z8BwUAAABW0SqH4kuWLEnjxo2rLGvYsGE+/PDDGm8KAAAA+J/amMlnzpyZH/zgB3nrrbfSsmXLbLbZZhk7dmx22223JMmFF16YevXq5YADDsiiRYvSt2/fXH755cXX169fP3fccUeOPPLI9OrVK82aNcuAAQNy5plnFmu6du2aO++8MyeccEIuuuiidOrUKVdffXX69u37mfsGAACA6lrlULxQKGTgwIHFb3snyQcffJAf//jHadasWXHZbbfdVrMdAgAAwFdcbczk11xzzUrXN27cOJdddlkuu+yyFdZ06dIlf/vb31a6nZ122ilPP/30KvcFAAAANW2VQ/EBAwYss+z73/9+jTYDAAAALMtMDgAAAJ/dKofi1157bW32AQAAAKyAmRwAAAA+u3p13QAAAAAAAAAA1BahOAAAAAAAAAAlSygOAAAAAAAAQMkSigMAAAAAAABQslYpFN9qq63y7rvvJknOPPPMLFy4sFabAgAAAP7LTA4AAACfzyqF4i+99FIWLFiQJDnjjDMyf/78Wm0KAAAA+C8zOQAAAHw+DValaIsttshhhx2W7bffPoVCIeedd16aN2++3Nphw4bVaIMAAADwVWYmBwAAgM9nlULx0aNH5/TTT88dd9yRsrKy/P3vf0+DBsu+tKyszAAOAAAANchMDgAAAJ/PKoXiG264Yf74xz8mSerVq5d777037dq1q9XGAAAAADM5AAAAfF6rFIp/3NKlS2ujDwAAAOBTmMkBAACg+qodiifJv/71r4wcOTIvvfRSkmTjjTfOcccdl27dutVocwAAAEBVZnIAAAConnrVfcHYsWOz8cYb5/HHH89mm22WzTbbLI899lg22WSTjBs3rjZ6BAAAAGImBwAAgM+i2meK/+xnP8sJJ5yQ3/zmN8ssP+WUU7LbbrvVWHMAAADA/5jJAQAAoPqqfab4Sy+9lEGDBi2z/Ic//GFefPHFGmkKAAAAWJaZHAAAAKqv2qH4mmuumUmTJi2zfNKkSWnXrl1N9AQAAAAsh5kcAAAAqq/al0//0Y9+lMGDB+ff//53tttuuyTJww8/nHPOOScnnnhijTcIAAAA/JeZ/Itt2rRpmTVrVl238aXQtm3bdO7cua7bAAAAviKqHYqfdtppadGiRc4///wMHTo0SdKxY8cMHz48xx57bI03CAAAAPyXmfyLa9q0admoe/e8v3BhXbfypdCkadO8/NJLgnEAAGC1qHYoXlZWlhNOOCEnnHBC3nvvvSRJixYtarwxAAAAoCoz+RfXrFmz8v7ChTnwl1ekXdcN6rqdL7SZUybn5lOPzKxZs4TiAADAalHtUPzjDN4AAABQN8zkX0ztum6QtbtvXtdtAAAA8DH16roBAAAAAAAAAKgtQnEAAAAAAAAASpZQHAAAAAAAAICSVa1Q/MMPP8yuu+6ayZMn11Y/AAAAwHKYyQEAAOCzqVYo3rBhwzz77LO11QsAAACwAmZyAAAA+Gyqffn073//+7nmmmtqoxcAAABgJczkAAAAUH0NqvuCJUuW5He/+13uueee9OzZM82aNauy/oILLqix5gAAAID/MZMDAABA9VU7FH/++eez1VZbJUn++c9/VllXVlZWM10BAAAAyzCTAwAAQPVVOxS///77a6MPAAAA4FOYyQFg9Zo2bVpmzZpV1218KbRt2zadO3eu6zYAYLmqHYpXevXVV/Ovf/0rO+ywQ5o0aZJCoeBb6QAAALAamMkBoPZNmzYtG3XvnvcXLqzrVr4UmjRtmpdfekkwDsAXUrVD8XfeeScHHnhg7r///pSVlWXy5MlZb731MmjQoLRu3Trnn39+bfQJAAAAX3lmcgBYfWbNmpX3Fy7Mgb+8Iu26blDX7XyhzZwyOTefemRmzZolFAfgC6naofgJJ5yQhg0bZtq0aenevXtx+fe+972ceOKJBnAAAACoJWZyAFj92nXdIGt337yu2wAAPodqh+J33313xo4dm06dOlVZvsEGG2Tq1Kk11hgAAABQlZkcAAAAqq9edV+wYMGCNG3adJnls2fPTnl5eY00BQAAACzLTA4AAADVV+1QvHfv3vn9739ffF5WVpalS5dmxIgR2XnnnWu0OQAAAOB/zOQAAABQfdW+fPqIESOy66675sknn8zixYtz8skn54UXXsjs2bPz8MMP10aPAAAAQMzkAAAA8FlU+0zxTTfdNP/85z+z/fbb59vf/nYWLFiQ/fffP08//XS6detWGz0CAAAAMZMDAADAZ1HtM8WTpGXLlvnFL35R070AAAAAn8JMDgAAANXzmULxd999N9dcc01eeumlJMnGG2+cww47LG3atKnR5gAAAICqzOQAAABQPdW+fPr48eOz7rrr5uKLL867776bd999NxdffHG6du2a8ePH10aPAAAAQMzkAAAA8FlU+0zxIUOG5Hvf+16uuOKK1K9fP0ny0Ucf5aijjsqQIUPy3HPP1XiTAAAAgJkcAAAAPotqnyn+6quv5ic/+Ulx+E6S+vXr58QTT8yrr75ao80BAAAA/2MmBwAAgOqrdii+1VZbFe9b9nEvvfRSNt988xppCgAAAFiWmRwAAACqb5Uun/7ss88W//vYY4/Ncccdl1dffTXbbrttkuTRRx/NZZddlt/85je10yUAAAB8RZnJAQAA4PNZpVB8iy22SFlZWQqFQnHZySefvEzdIYccku9973s11x0AAAB8xZnJAQAA4PNZpVB8ypQptd0HAAAAsBxmcgAAAPh8VikU79KlS233AQAAACyHmRwAAAA+n1UKxT/pzTffzEMPPZSZM2dm6dKlVdYde+yxNdIYAAAAsCwzOQAAAFRPtUPx0aNH54gjjkijRo2yxhprpKysrLiurKzMAA4AAAC1xEwOAAAA1VftUPy0007LsGHDMnTo0NSrV682egIAAACWw0wOAAAA1VftCXrhwoU56KCDDN8AAACwmpnJAQAAoPqqPUUPGjQot9xyS230AgAAAKyEmRwAAACqr9qXTz/77LPzrW99K3fddVd69OiRhg0bVll/wQUX1FhzAAAAwP+YyQEAAKD6PlMoPnbs2Gy44YZJkrKysuK6j/83AAAAULPM5AAAAFB91Q7Fzz///Pzud7/LwIEDa6EdAAAAYEXM5AAAAFB91b6neHl5eb75zW/WRi8AAADASpjJAQAAoPqqHYofd9xxueSSS2qjFwAAAGAlzOQAAABQfdW+fPrjjz+e++67L3fccUc22WSTNGzYsMr62267rcaaAwAAAP7HTA4AAADVV+1QvFWrVtl///1roxcAAABgJczkAAAAUH3VDsWvvfba2ugDAAAA+BRmcgAAAKi+at9THAAAAAAAAAC+LKp9pnjXrl1TVla2wvX//ve/P1dDAPy/9u48TIrq7h/2d1hmWId9GEBAjAu4IaLBUaOoBDQYMfLEjagxLtFnUJHE7RHXxDUa3IhGo0CixiURg6ggguCGiAgRlSAiOkYFQhRQQdZ6//BHvzTMxjDQQ3vf1zUXTNXp6lNnqk/VOZ+ubgAAKJ0xOQAAAGy+zQ7FBw0alPb76tWrY8aMGTF27Ni46KKLqqteAAAAwEaMyQEAAGDzbXYofsEFF5S6fNiwYfHGG29scYUAAACA0hmTAwAAwOartu8UP+qoo+Lvf/97dW0OAAAAqCRjcgAAAChbtYXif/vb36J58+bVtTkAAACgkozJAQAAoGyb/fHp3bp1i5ycnNTvSZLEggUL4j//+U/84Q9/qNbKAQAAAP8/Y3IAAADYfJsdih977LFpv9eqVStatWoVPXv2jM6dO1dXvQAAAICNGJMDAADA5tvsUPyqq67aGvUAAAAAKmBMDgAAAJuv2r5THAAAAAAAAABqmkrfKV6rVq207y0rTU5OTqxZs2aLKwUAAAD8/4zJAQAAoOoqHYqPGjWqzHVTpkyJO+64I9atW1ctlQIAAAD+f8bkAAAAUHWVDsX79eu3ybI5c+bEpZdeGk899VQMGDAgrr322mqtHAAAAGBMDgAAAFuiSt8p/umnn8ZZZ50Ve+21V6xZsyZmzpwZI0eOjI4dO1Z3/QAAAIANGJMDAADA5tmsUHzp0qVxySWXxM477xzvvPNOTJgwIZ566qnYc889t1b9AAAAgDAmBwAAgKqq9Men33zzzXHTTTdFYWFh/PWvfy31o9sAAACA6mdMDgAAAFVX6VD80ksvjfr168fOO+8cI0eOjJEjR5Za7oknnqi2ygEAAADG5AAAALAlKh2Kn3rqqZGTk7M16wIAAACUwpgcAAAAqq7SofiIESO2YjXK9sknn8Qll1wSzz77bCxfvjx23nnnGD58eOy3334REZEkSVx11VVx3333xZIlS+Kggw6Ku+++O3bZZZfUNj7//PM477zz4qmnnopatWpF//794/bbb49GjRqlyrz11ltRXFwc06ZNi1atWsV5550XF1988TbfXwAAANhYpsbkAAAAkA1qZboC5fniiy/ioIMOirp168azzz4b7777btx6663RrFmzVJmbb7457rjjjrjnnnti6tSp0bBhw+jTp0988803qTIDBgyId955J8aPHx9jxoyJF198Mc4+++zU+mXLlkXv3r2jY8eOMX369Pjd734XV199ddx7773bdH8BAAAAAAAAqF6VvlM8E2666aZo3759DB8+PLWsU6dOqf8nSRK33XZbDBkyJPr16xcREX/+85+jdevW8eSTT8aJJ54Ys2fPjrFjx8a0adNSd5ffeeed8aMf/ShuueWWaNu2bTz00EOxatWqeOCBByI3Nzf22GOPmDlzZvz+979PC883tHLlyli5cmXq92XLlm2NJgAAAAAAAABgC9ToO8VHjx4d++23X/z0pz+NgoKC6NatW9x3332p9fPnz48FCxZEr169UsuaNGkSPXr0iClTpkRExJQpU6Jp06apQDwiolevXlGrVq2YOnVqqswhhxwSubm5qTJ9+vSJOXPmxBdffFFq3W644YZo0qRJ6qd9+/bVuu8AAAAAAAAAbLkaHYp/8MEHqe8HHzduXJx77rlx/vnnx8iRIyMiYsGCBRER0bp167THtW7dOrVuwYIFUVBQkLa+Tp060bx587QypW1jw+fY2GWXXRZLly5N/Xz88cdbuLcAAAAAAAAAVLca/fHp69ati/322y+uv/76iIjo1q1bvP3223HPPffEaaedltG65eXlRV5eXkbrAAAAAAAAAED5avSd4m3atIndd989bVmXLl2ipKQkIiIKCwsjImLhwoVpZRYuXJhaV1hYGIsWLUpbv2bNmvj888/TypS2jQ2fAwAAAAAAAIDtT40OxQ866KCYM2dO2rL33nsvOnbsGBERnTp1isLCwpgwYUJq/bJly2Lq1KlRVFQUERFFRUWxZMmSmD59eqrMxIkTY926ddGjR49UmRdffDFWr16dKjN+/PjYbbfdolmzZltt/wAAAAAAAADYump0KH7hhRfGa6+9Ftdff328//778fDDD8e9994bxcXFERGRk5MTgwYNit/+9rcxevTomDVrVpx66qnRtm3bOPbYYyPi2zvLjzzyyDjrrLPi9ddfj1deeSUGDhwYJ554YrRt2zYiIk4++eTIzc2NM844I95555149NFH4/bbb4/BgwdnatcBAAAAAAAAqAY1+jvF999//xg1alRcdtllce2110anTp3itttuiwEDBqTKXHzxxfH111/H2WefHUuWLImDDz44xo4dG/Xq1UuVeeihh2LgwIFxxBFHRK1ataJ///5xxx13pNY3adIknnvuuSguLo7u3btHy5Yt48orr4yzzz57m+4vAAAAAAAAANWrRofiERFHH310HH300WWuz8nJiWuvvTauvfbaMss0b948Hn744XKfZ++9946XXnqpyvUEAAAAAAAAoOap0R+fDgAAAAAAAABbQigOAAAAAAAAQNYSigMAAAAAAACQtYTiAAAAAAAAAGQtoTgAAAAAAAAAWUsoDgAAAAAAAEDWEooDAAAAAAAAkLWE4gAAAAAAAABkLaE4AAAAAAAAAFlLKA4AAAAAAABA1hKKAwAAAAAAAJC1hOIAAAAAAAAAZC2hOAAAAAAAAABZSygOAAAAAAAAQNYSigMAAAAAAACQtYTiAAAAAAAAAGQtoTgAAAAAAAAAWUsoDgAAAAAAAEDWEooDAAAAAAAAkLWE4gAAAAAAAABkLaE4AAAAAAAAAFlLKA4AAAAAAABA1hKKAwAAAAAAAJC1hOIAAAAAAAAAZC2hOAAAAAAAAABZSygOAAAAAAAAQNYSigMAAAAAAACQtYTiAAAAAAAAAGQtoTgAAAAAAAAAWUsoDgAAAAAAAEDWEooDAAAAAAAAkLWE4gAAAAAAAABkLaE4AAAAAAAAAFlLKA4AAAAAAABA1hKKAwAAAAAAAJC1hOIAAAAAAAAAZC2hOAAAAAAAAABZSygOAAAAAAAAQNYSigMAAAAAAACQtYTiAAAAAAAAAGQtoTgAAAAAAAAAWUsoDgAAAAAAAEDWEooDAAAAAAAAkLWE4gAAAAAAAABkLaE4AAAAAAAAAFlLKA4AAAAAAABA1hKKAwAAAAAAAJC1hOIAAAAAAAAAZC2hOAAAAAAAAABZSygOAAAAAAAAQNYSigMAAAAAAACQtYTiAAAAAAAAAGQtoTgAAAAAAAAAWUsoDgAAAAAAAEDWEooDAAAAAAAAkLWE4gAAAAAAAABkLaE4AAAAfAfdcMMNsf/++0fjxo2joKAgjj322JgzZ05amW+++SaKi4ujRYsW0ahRo+jfv38sXLgwrUxJSUn07ds3GjRoEAUFBXHRRRfFmjVr0spMmjQp9t1338jLy4udd945RowYsbV3DwAAAFKE4gAAAPAdNHny5CguLo7XXnstxo8fH6tXr47evXvH119/nSpz4YUXxlNPPRWPP/54TJ48OT799NM47rjjUuvXrl0bffv2jVWrVsWrr74aI0eOjBEjRsSVV16ZKjN//vzo27dvHHbYYTFz5swYNGhQnHnmmTFu3Lhtur8AAAB8d9XJdAUAAACAbW/s2LFpv48YMSIKCgpi+vTpccghh8TSpUvj/vvvj4cffjgOP/zwiIgYPnx4dOnSJV577bU44IAD4rnnnot33303nn/++WjdunXss88+8Zvf/CYuueSSuPrqqyM3Nzfuueee6NSpU9x6660REdGlS5d4+eWXY+jQodGnT59tvt8AAAB897hTHAAAAIilS5dGRETz5s0jImL69OmxevXq6NWrV6pM586do0OHDjFlypSIiJgyZUrstdde0bp161SZPn36xLJly+Kdd95JldlwG+vLrN/GxlauXBnLli1L+wEAAIAtIRQHAACA77h169bFoEGD4qCDDoo999wzIiIWLFgQubm50bRp07SyrVu3jgULFqTKbBiIr1+/fl15ZZYtWxYrVqzYpC433HBDNGnSJPXTvn37atlHAAAAvruE4gAAAPAdV1xcHG+//XY88sgjma5KXHbZZbF06dLUz8cff5zpKgEAALCd853iAAAA8B02cODAGDNmTLz44ouxww47pJYXFhbGqlWrYsmSJWl3iy9cuDAKCwtTZV5//fW07S1cuDC1bv2/65dtWCY/Pz/q16+/SX3y8vIiLy+vWvYNAAAAItwpDgAAAN9JSZLEwIEDY9SoUTFx4sTo1KlT2vru3btH3bp1Y8KECallc+bMiZKSkigqKoqIiKKiopg1a1YsWrQoVWb8+PGRn58fu+++e6rMhttYX2b9NgAAAGBrc6c4AAAAfAcVFxfHww8/HP/4xz+icePGqe8Ab9KkSdSvXz+aNGkSZ5xxRgwePDiaN28e+fn5cd5550VRUVEccMABERHRu3fv2H333eOUU06Jm2++ORYsWBBDhgyJ4uLi1N3e55xzTtx1111x8cUXxy9+8YuYOHFiPPbYY/H0009nbN8BAAD4bnGnOAAAAHwH3X333bF06dLo2bNntGnTJvXz6KOPpsoMHTo0jj766Ojfv38ccsghUVhYGE888URqfe3atWPMmDFRu3btKCoqip/97Gdx6qmnxrXXXpsq06lTp3j66adj/Pjx0bVr17j11lvjT3/6U/Tp02eb7i8AAADfXe4UBwAAgO+gJEkqLFOvXr0YNmxYDBs2rMwyHTt2jGeeeabc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qxft27ePm2++eWvvGgAAAKQRigMAAMB30Ndffx1du3aNYcOGlbr+5ptvjjvuuCPuueeemDp1ajRs2DD69OkT33zzTarMgAED4p133onx48fHmDFj4sUXX4yzzz47tX7ZsmXRu3fv6NixY0yfPj1+97vfxdVXXx333nvvVt8/AAAAWK9OpisAAAAAbHtHHXVUHHXUUaWuS5IkbrvtthgyZEj069cvIiL+/Oc/R+vWrePJJ5+ME088MWbPnh1jx46NadOmxX777RcREXfeeWf86Ec/iltuuSXatm0bDz30UKxatSoeeOCByM3NjT322CNmzpwZv//979PCcwAAANia3CkOAAAApJk/f34sWLAgevXqlVrWpEmT6NGjR0yZMiUiIqZMmRJNmzZNBeIREb169YpatWrF1KlTU2UOOeSQyM3NTZXp06dPzJkzJ7744otSn3vlypWxbNmytB8AAADYEkJxAAAAIM2CBQsiIqJ169Zpy1u3bp1at2DBgigoKEhbX6dOnWjevHlamdK2seFzbOyGG26IJk2apH7at2+/5TsEAADAd5pQHAAAAKgxLrvssli6dGnq5+OPP850lQAAANjOCcUBAACANIWFhRERsXDhwrTlCxcuTK0rLCyMRYsWpa1fs2ZNfP7552llStvGhs+xsby8vMjPz0/7AQAAgC0hFAcAAADSdOrUKQoLC2PChAmpZcuWLYupU6dGUVFRREQUFRXFkiVLYvr06akyEydOjHXr1kWPHj1SZV588cVYvXp1qsz48eNjt912i2bNmm2jvQEAAOC7TigOAAAA30FfffVVzJw5M2bOnBkREfPnz4+ZM2dGSUlJ5OTkxKBBg+K3v/1tjB49OmbNmhWnnnpqtG3bNo499tiIiOjSpUsceeSRcdZZZ8Xrr78er7zySgwcODBOPPHEaNu2bUREnHzyyZGbmxtnnHFGvPPOO/Hoo4/G7bffHoMHD87QXgMAAPBdVCfTFQAAAAC2vTfeeCMOO+yw1O/rg+rTTjstRowYERdffHF8/fXXcfbZZ8eSJUvi4IMPjrFjx0a9evVSj3nooYdi4MCBccQRR0StWrWif//+cccdd6TWN2nSJJ577rkoLi6O7t27R8uWLePKK6+Ms88+e9vtKAAAAN95QnEAAAD4DurZs2ckSVLm+pycnLj22mvj2muvLbNM8+bN4+GHHy73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666btPOwYcNixx13jHr16kWPHj3i9ddfr1JbbEvltft6s2fPjmOOOSaaNGkSDRs2jP333z9KSkpS66vSx1TXsV3V116m3XDDDbH//vtH48aNo6CgII499tiYM2dOWpnKtGtJSUn07ds3GjRoEAUFBXHRRRfFmjVryn3u++67L37wgx9Es2bNolmzZtGrV69yj9VzzjkncnJy4rbbbktbXpXXW6ZVpt3XS5IkjjrqqFJfF1ur3b/66qsYOHBg7LDDDlG/fv3Yfffd45577kkrU9VzeiZVpt0XLFgQp5xyShQWFkbDhg1j3333jb///e9pZapyzL388stx0EEHRYsWLaJ+/frRuXPnGDp06GbXb3tr97vvvjv23nvvyM/Pj/z8/CgqKopnn302Ir5tx/POOy922223qF+/fnTo0CHOP//8WLp0ado2qnKcP/HEE7HffvtF06ZNU337X/7yl03KbY3zSk1QXruvN2XKlDj88MOjYcOGkZ+fH4ccckisWLEitX5L+9ZXXnkl6tSpU+p1ZUXXKffee2/07Nkz8vPzIycnJ5YsWbJZ+w/bo4quhX/+859HTk5O2s+RRx6ZWj9p0qRN1q//mTZtWpnPW5nzU2Wu0yuqX01UUV9Zmb5oxx133GS/b7zxxkrXoay+srTt5uTkRHFxcURU/hy6Pdh47ujDDz8s81h+/PHHIyLin//8Z5x00knRvn37qF+/fnTp0iVuv/32Sj1fRePpypxDt9frg08++SR+9rOfpV7ve+21V7zxxhup9VdffXV07tw5GjZsmBonTJ06NW0bVbk+KK1/yMnJiT322CNVpjLzXZUZo9Q0Fb2WKzP2eO+996Jfv37RsmXLyM/Pj4MPPjheeOGFCp/7sccei3322ScaNGgQHTt2jN/97ndlli2rL7r66qs3qXvnzp03vyG2si+//DIGDRoUHTt2jPr168eBBx5Y5rmvrHmFqvTnlZnHe+edd6J///6p7W/8vOtVdH38y1/+Mr73ve9F/fr1o1WrVtGvX7/417/+VW79qlNF1wJPPPFE9O7dO1q0aBE5OTkxc+bMTbZRUd/53//+N4488sho27Zt5OXlRfv27WPgwIGxbNmycutWmTau7BzM1h4jba7qmKOOiHj66aejR48eUb9+/WjWrFkce+yxaeurMuau7LG9XmlZUUTlrreq2g9WVWWufdcrq0+57rrr4sADD4wGDRpE06ZNS33stGnT4ogjjoimTZtGs2bNok+fPvHPf/6z3LpVpt8ZMWLEJv1ZvXr10sqUda218bmiomMnGwjFqRbTpk2LP/7xj7H33nunLb/wwgvjqaeeiscffzwmT54cn376aRx33HHlbmv+/PnRr1+/OPzww2PmzJkxbty4WLx4cdrj5s+fH3379o3DDjssZs6cGYMGDYozzzwzxo0bt1X2L1NuuummuPvuu+Ouu+6K2bNnx0033RQ333xz3HnnnakyN998c9xxxx1xzz33xNSpU6Nhw4bRp0+f+Oabbyrc/i9+8Ys44YQTSl336quvxt577x1///vf46233orTTz89Tj311BgzZkxamZNOOinOOOOMmDFjRhx77LFx7LHHxttvv73lO78Nff3119G1a9cYNmzYJuuWL18eb775ZlxxxRXx5ptvxhNPPBFz5syJY445Jq3cgAED4p133onx48fHmDFj4sUXX4yzzz673OdduXJltGrVKoYMGRJdu3YttcyqVavihz/8YXz44Yfxt7/9LebMmRP33XdftGvXLlXm0UcfjcGDB8dVV10Vb775ZnTt2jX69OkTixYtqkJrbDvltXtExLx58+Lggw+Ozp07x6RJk+Ktt96KK664Iu2kXpU+prqO7S157WXS5MmTo7i4OF577bUYP358rF69Onr37h1ff/11qkxF7bp27dro27dvrFq1Kl599dUYOXJkjBgxIq688spyn3vSpElx0kknxQsvvBBTpkyJ9u3bR+/eveOTTz7ZpOyoUaPitddei7Zt226yriqvt0yrTLuvd9ttt0VOTs4my7dmuw8ePDjGjh0bDz74YMyePTsGDRoUAwcOjNGjR6fKVOX1lmmVafdTTz015syZE6NHj45Zs2bFcccdF8cff3zMmDEjVaYqx1zDhg1j4MCB8eKLL8bs2bNjyJAhMWTIkLj33ns3q37bW7vvsMMOceONN8b06dPjjTfeiMMPPzz69esX77zzTnz66afx6aefxi233BJvv/12jBgxIsaOHRtnnHFG6vFVPc6bN28el19+eUyZMiXVt59++ulp14Zb67xSE5TX7hHfTvYceeSR0bt373j99ddj2rRpMXDgwKhV6/8fDm5J37pkyZI49dRT44gjjthkXWWuU5YvXx5HHnlk/N///d8WtgRsPyq6Fo6IOPLII+Ozzz5L/fz1r39NrTvwwAPT1n322Wdx5plnRqdOnWK//fYrc5uVOT9Vpm4V1a8mqqivrGxfdO2116bt93nnnVep5y+vr5w2bVraNsePHx8RET/96U8jIip1Dt0elDZ31L59+02O5WuuuSYaNWoURx11VERETJ8+PQoKCuLBBx+Md955Jy6//PK47LLL4q677ir3+Soznq7ouIjYPq8PvvjiizjooIOibt268eyzz8a7774bt956azRr1ixVZtddd4277rorZs2aFS+//HLsuOOO0bt37/jPf/6TKlOV64Pbb7897e/58ccfR/PmzVPHc0Tl5rsqM0apaSp6LVdm7HH00UfHmjVrYuLEiTF9+vTo2rVrHH300bFgwYIyn/fZZ5+NAQMGxDnnnBNvv/12/OEPf4ihQ4eW+hopry+KiNhjjz3S9uHll1/ekibZKs4888wYP358/OUvf4lZs2ZF7969o1evXpvMLZQ3rxCx+f15Zebxli9fHjvttFPceOONUVhYWGqZylwfd+/ePYYPHx6zZ8+OcePGRZIk0bt371i7dm25dawuFV0LfP3113HwwQfHTTfdVOY2Kuo7a9WqFf369YvRo0fHe++9FyNGjIjnn38+zjnnnHLrVpk2rsxYe2uPkaqiOuao//73v8cpp5wSp59+evzzn/+MV155JU4++eTU+qqOuSvT7uuVlRWt305F11tV6Qe3RGWvfcvrU1atWhU//elP49xzzy31sV999VUceeSR0aFDh5g6dWq8/PLL0bhx4+jTp0+sXr26zOesTL8TEZGfn5/Wn3300Udp6ze+1nrggQciJycn+vfvnypT0bGTNRLYQl9++WWyyy67JOPHj08OPfTQ5IILLkiSJEmWLFmS1K1bN3n88cdTZWfPnp1ERDJlypQyt/f4448nderUSdauXZtaNnr06CQnJydZtWpVkiRJcvHFFyd77LFH2uNOOOGEpE+fPtW4Z5nXt2/f5Be/+EXasuOOOy4ZMGBAkiRJsm7duqSwsDD53e9+l1q/ZMmSJC8vL/nrX/9aqee46qqrkq5du1aq7I9+9KPk9NNPT/1+/PHHJ3379k0r06NHj+SXv/xlpbZXE0VEMmrUqHLLvP7660lEJB999FGSJEny7rvvJhGRTJs2LVXm2WefTXJycpJPPvmkUs+74WtnQ3fffXey0047pY790nz/+99PiouLU7+vXbs2adu2bXLDDTdU6rlrgtLa/YQTTkh+9rOflfmYqvYxpdncY7s6Xns1xaJFi5KISCZPnpwkSeXa9Zlnnklq1aqVLFiwIFXm7rvvTvLz85OVK1dW+rnXrFmTNG7cOBk5cmTa8n//+99Ju3btkrfffjvp2LFjMnTo0NS66ni91QQbt/t6M2bMSNq1a5d89tlnm7wutma777HHHsm1116bVm7fffdNLr/88iRJqvf1lkmltXvDhg2TP//5z2nlmjdvntx3331JklTvMfeTn/yk3H6tKq/H7UGzZs2SP/3pT6Wue+yxx5Lc3Nxk9erVSZJU33GeJEnSrVu3ZMiQIanft+V5pSbYsN179OiR1hYb29Lj/IQTTkiGDBlS6nXl5lynvPDCC0lEJF988UWFzwnZpLRr4dNOOy3p169fpbexatWqpFWrVpuczyujvPNTWeOjza1fTVXaOaq8vmjja9PNUV5fubELLrgg+d73vpesW7euzDIbn0NrurLmjkqzzz77bDIXsrH//d//TQ477LByy1RmPF2aDY+L7fX64JJLLkkOPvjgzXrM0qVLk4hInn/++SRJqu86eNSoUUlOTk7y4YcfppZVNN+VJBWPUbYHG7+WKxp7/Oc//0kiInnxxRdT65ctW5ZERDJ+/Pgyn+ekk05K/ud//idt2R133JHssMMOm/Qj5fVFmzNHmCnLly9PateunYwZMyZt+cbHRnnzCkmyZf15kpQ9j1eZ56jKPN4///nPJCKS999/v6pVrrLy5krnz5+fREQyY8aMtOVV7Ttvv/32ZIcddqh03Sr7dyxtLmBrj5G2VFXmqFevXp20a9euzPF3klTPmLu8dq/s+b6s662q9oPVpax2r6hPWW/48OFJkyZNNlk+bdq0JCKSkpKS1LK33noriYhk7ty5lapbWe1Z1nOWp1+/fsnhhx+e+r0yx062cKc4W6y4uDj69u0bvXr1Sls+ffr0WL16ddryzp07R4cOHWLKlCllbq979+5Rq1atGD58eKxduzaWLl0af/nLX6JXr15Rt27diPj2nVwbP1+fPn3K3e726MADD4wJEybEe++9FxHffmTYyy+/nHq39Pz582PBggVpbdGkSZPo0aPHVmmLpUuXRvPmzVO/f1f+DhtbunRp5OTkpD4KZcqUKdG0adO0OzJ69eoVtWrV2uSjxzbX6NGjo6ioKIqLi6N169ax5557xvXXX596Z+iqVati+vTpaX+HWrVqRa9evbbrv8O6devi6aefjl133TX69OkTBQUF0aNHj7SPr6lqH1OazT22t/Vrb2ta/5GL6/e/Mu06ZcqU2GuvvaJ169apMn369Illy5al3VFRkeXLl8fq1avT2n7dunVxyimnxEUXXZT28Xrrbc3X27a0cbtHfNseJ598cgwbNqzUd91uzXY/8MADY/To0fHJJ59EkiTxwgsvxHvvvRe9e/eOiOp9vWVSae1+4IEHxqOPPhqff/55rFu3Lh555JH45ptvomfPnhFRfcfcjBkz4tVXX41DDz200vXb3tt97dq18cgjj8TXX38dRUVFpZZZunRp5OfnR506dSKieo7zJEliwoQJMWfOnDjkkEMiYtufVzJp43ZftGhRTJ06NQoKCuLAAw+M1q1bx6GHHpp218+WHOfDhw+PDz74IK666qpN1mXrdQpsK5MmTYqCgoLYbbfd4txzz43//ve/ZZYdPXp0/Pe//43TTz99s56jMuen6qhfTVOZc1RZbrzxxmjRokV069Ytfve731X4caMR5feVG1u1alU8+OCD8Ytf/KLUTw9ab+NzaE1X1tzRxqZPnx4zZ86s8C74jcdwpaloPL2x0o6L7fX6YPTo0bHffvvFT3/60ygoKIhu3brFfffdV2b5VatWxb333htNmjRJ3YlWXdfB999/f/Tq1Ss6duyYWlbRfNf6MuWNUWq60l7LFY09WrRoEbvttlv8+c9/jq+//jrWrFkTf/zjH6OgoCC6d+9e5nOtXLlyk4/KrV+/fvz73/9Ou1uwMn3R3Llzo23btrHTTjvFgAED0r5qqCZYs2ZNrF27ttT9XX99W9G8wnpV6c+3VFWuj7/++usYPnx4dOrUKdq3b7/V61gdqtJ3fvrpp/HEE09U6ZqkIhuPtbf2GGlb2XiO+s0334xPPvkkatWqFd26dYs2bdrEUUcdlfbJl9U1t1SWyp7vy1LVfnBrqmyfUp7ddtstWrRoEffff3+sWrUqVqxYEffff3906dIldtxxxy2u41dffRUdO3aM9u3bb/KJNxtbuHBhPP3002nXWpU5drKFUJwt8sgjj8Sbb74ZN9xwwybrFixYELm5uZt8h0Lr1q3L/aiLTp06xXPPPRf/93//F3l5edG0adP497//HY899ljatjfsuNdvd9myZWnf+7G9u/TSS+PEE0+Mzp07R926daNbt24xaNCgGDBgQEREqh1La4vq/jiRxx57LKZNm5Y2yVLW32FrfZRJTfDNN9/EJZdcEieddFLk5+dHxLftUFBQkFauTp060bx58y1uiw8++CD+9re/xdq1a+OZZ56JK664Im699db47W9/GxERixcvjrVr12bd32HRokXx1VdfxY033hhHHnlkPPfcc/GTn/wkjjvuuJg8eXJEVL2P2VhVju1t+drbmtatWxeDBg2Kgw46KPbcc8+IqFy7ltU+69dV1iWXXBJt27ZNu1C+6aabok6dOnH++eeX+pit+XrbVkpr94hvP1rswAMPjH79+pX6uK3Z7nfeeWfsvvvuscMOO0Rubm4ceeSRMWzYsFSgWF2vt0wqq90fe+yxWL16dbRo0SLy8vLil7/8ZYwaNSp23nnniNjyY26HHXaIvLy82G+//aK4uDjOPPPMStdve233WbNmRaNGjSIvLy/OOeecGDVqVOy+++6blFu8eHH85je/Sfv4uS05zpcuXRqNGjWK3Nzc6Nu3b9x5553xwx/+MCK27XklU8pq9w8++CAivv2OyLPOOivGjh0b++67bxxxxBExd+7ciKj6cT537ty49NJL48EHHyw1lMnW6xTYFo488sj485//HBMmTIibbropJk+eHEcddVSZYd79998fffr0iR122KFS26/s+am66ldTVPYcVZbzzz8/HnnkkXjhhRfil7/8ZVx//fVx8cUXl/uYivrKjT355JOxZMmS+PnPf15mmdLOoTVZeXNHG1s/QXzggQeWWebVV1+NRx99tML9r2g8vV55x8X2en3wwQcfxN133x277LJLjBs3Ls4999w4//zzY+TIkWnlxowZE40aNYp69erF0KFDY/z48dGyZcuIqJ6x16effhrPPvvsJn1MRfNdERWPUWq60l7LFY09cnJy4vnnn48ZM2ZE48aNo169evH73/8+xo4dm/bR9xvr06dPPPHEEzFhwoRYt25dvPfee3HrrbdGxLcfmRtRub6oR48eqa9nuPvuu2P+/Pnxgx/8IL788stqapUt17hx4ygqKorf/OY38emnn8batWvjwQcfjClTpqT2taJ5hYiq9efVYXOuj//whz9Eo0aNolGjRvHss8/G+PHjIzc3d6vXsTpsTt950kknRYMGDaJdu3aRn58ff/rTn6q1LqWNtbfmGGlbKW2OesP9GjJkSIwZMyaaNWsWPXv2jM8//zwiqm9uqTSbc74vS1X7wa2pMn1KRRo3bhyTJk2KBx98MOrXrx+NGjWKsWPHxrPPPrvFb3Dcbbfd4oEHHoh//OMf8eCDD8a6deviwAMPjH//+9+llh85cmQ0btw47esMKnPsZAuhOFX28ccfxwUXXBAPPfTQJu/Oq6w99tgjdXJf/27QBQsWxFlnnRWnnXZaTJs2LSZPnhy5ubnxP//zP5EkSXXuQo332GOPxUMPPRQPP/xwvPnmmzFy5Mi45ZZbNhnElOeoo45KtXFV38n0wgsvxOmnnx733XdflbeRDVavXh3HH398JEkSd99992Y9dv3foFGjRhV+N86G1q1bFwUFBXHvvfdG9+7d44QTTojLL7887rnnns2t/nZl3bp1ERHRr1+/uPDCC2OfffaJSy+9NI4++ujN2vfS+pgNfdeP7eLi4nj77bfjkUceqdbtlpSUpB3z119//SZlbrzxxnjkkUdi1KhRqXPI9OnT4/bbb48RI0aUe1fM9q60dh89enRMnDgxbrvttipvt6rtHvHthNNrr70Wo0ePjunTp8ett94axcXF8fzzz1e5PjVNWcf7FVdcEUuWLInnn38+3njjjRg8eHAcf/zxMWvWrEpvu7w+/qWXXoo33ngj7rnnnrjtttvK/L7VrfV6zITddtstZs6cGVOnTo1zzz03TjvttHj33XfTyixbtiz69u0bu+++e1x99dWV3nZ5x3njxo1j5syZMW3atLjuuuti8ODBMWnSpIiovvNKTVZWu6/f91/+8pdx+umnR7du3WLo0KGpgXNlbXycr127Nk4++eS45pprYtddd91auwXfWSeeeGIcc8wxsddee8Wxxx4bY8aMiWnTpqX6tQ39+9//jnHjxm1yZ211nJ+qo341SWXOUeUZPHhw9OzZM/bee+8455xz4tZbb40777wzVq5cGRHV01fef//9cdRRR5X5HbhVPYdmyubMHa1YsSIefvjhcu8Sf/vtt6Nfv35x1VVXpe4YLuv6oLLj6S09LmqidevWxb777hvXX399dOvWLc4+++w466yzNtn3ww47LGbOnBmvvvpqHHnkkXH88cenfa9xRSqa6xg5cmQ0bdo0jj322LTllZnv2t7HKKW9lisaeyRJEsXFxVFQUBAvvfRSvP7663HsscfGj3/841TgW9o8x1lnnRUDBw6Mo48+OnJzc+OAAw6IE088MSK+vQu5sn3RUUcdFT/96U9j7733jj59+sQzzzwTS5YsSbtRqSb4y1/+EkmSRLt27SIvLy/uuOOOOOmkk6JWrVqVnlfY3P48EwYMGBAzZsyIyZMnx6677hrHH398fPPNNxmpy9Y0dOjQePPNN+Mf//hHzJs3LwYPHhwRlZvjqIzSxtrVNUbKlLLmqNfv1+WXXx79+/dPfTd9Tk5OPP7445XadlXbvTqyoojK9YPbUnXNVa5YsSLOOOOMOOigg+K1116LV155Jfbcc8/o27dv6ibPqvY7RUVFceqpp8Y+++wThx56aDzxxBPRqlWr+OMf/1hq+QceeCAGDBiQ9neqjmNne7F9fMYSNdL06dNj0aJFse+++6aWrV27Nl588cW46667Yty4cbFq1apYsmRJ2rvCFi5cmPpY2GeeeSZWr14dEd9+zE1ExLBhw6JJkyZx8803px7z4IMPRvv27WPq1KlxwAEHRGFhYSxcuDCtPgsXLoz8/PzUdrLBRRddlHr3bETEXnvtFR999FHccMMNcdppp6XaceHChdGmTZvU4xYuXBj77LNPRET86U9/SnWs6z9+fnNMnjw5fvzjH8fQoUPj1FNPTVtX1t+htI/93d6tv9j46KOPYuLEial34EV82w4bDxrXrFkTn3/+eaotZs6cmVq34WMr0qZNm6hbt27Url07taxLly6xYMGCWLVqVbRs2TJq166ddX+Hli1bRp06dTa5a6NLly6pjzIqLCysUh+z3pYc25V57dV0AwcOjDFjxsSLL76YdkdRZdq1sLAwXn/99bTtrW+vwsLCaNu2bdoxv/HHGt5yyy1x4403xvPPPx977713avlLL70UixYtig4dOqSWrV27Nn71q1/FbbfdFh9++GGlXm81WVntPnHixJg3b94m76Lu379//OAHP4hJkyZttXZfsWJF/N///V+MGjUq+vbtGxERe++9d8ycOTNuueWW6NWrV6WOi5qsrHafN29e3HXXXfH222+n3hjTtWvXeOmll2LYsGFxzz33bHEf36lTp4j49hy+cOHCuPrqq+Okk06qVP2213bPzc1N3e3SvXv3mDZtWtx+++2pAdmXX34ZRx55ZDRu3DhGjRqVdn2yJcd5rVq1Us+7zz77xOzZs+OGG26Inj17Vtt5pSYrq90vvfTSiIhS9339x2FW5Tj/8ssv44033ogZM2bEwIEDI+LbgXSSJFGnTp147rnn4uCDD87K6xTIhJ122ilatmwZ77//fhxxxBFp64YPHx4tWrSIY445Jm35lp6fqqt+NUlF56jN1aNHj1izZk18+OGHqWB1vcr2lYcffnjqMR999FE8//zz8cQTT5T6fOWdQ2uqiuaOVq5cmRrv/u1vf4vly5dvMj5b7913340jjjgizj777BgyZEhqeVnXBxWNp9ffcVnecbG9Xh+0adOm1HP/3//+97RlDRs2jJ133jl23nnnOOCAA2KXXXaJ+++/Py677LItvg5OkiQeeOCBOOWUUza5u7Wi+a7KjFFqstJey5UZe0ycODHGjBkTX3zxRao9//CHP8T48eNj5MiRcemll5Y6z5GTkxM33XRTXH/99bFgwYJo1apVTJgwISK+7Z83ty9ar2nTprHrrrvG+++/v/Uaqwq+973vxeTJk+Prr7+OZcuWRZs2beKEE06InXbaqVLzCqWpqD+vLpszj9ekSZNo0qRJ7LLLLnHAAQdEs2bNYtSoUVt0vt5WNqfvLCwsjMLCwujcuXM0b948fvCDH8QVV1xR4RxHZZQ11l4/l7elY6RMKG+OurT9ysvLi5122iltv7Zkbqksm3O+L09l+sFtqap9ysYefvjh+PDDD2PKlClRq1at1LJmzZrFP/7xjzjxxBOrrd9Z/wkspfXdL730UsyZMyceffTRtOWVOXayhTvFqbIjjjgiZs2aFTNnzkz97LfffjFgwIDU/+vWrZu6CIuImDNnTpSUlKS+m6ljx46pi+927dpFxLffdbq+Y1hvfYe5/h0rRUVFaduNiBg/fvxmfxdYTVdWW6xvh06dOkVhYWFaWyxbtiymTp2aaot27dql2njD72+qjEmTJkXfvn3jpptuKvVjyb4rf4f1Fxtz586N559/Plq0aJG2vqioKJYsWRLTp09PLZs4cWKsW7cuevToERGR+hvsvPPOm3z0TnkOOuigeP/991N/84iI9957L9q0aRO5ubmRm5sb3bt3T/s7rFu3LiZMmLBd/x1yc3Nj//33jzlz5qQtf++991LHcffu3avUx0Rs+bFdmddeTZUkSQwcODBGjRoVEydOTE2IrleZdi0qKopZs2alDQ7Gjx8f+fn5sfvuu0edOnXSjvkNL6Bvvvnm+M1vfhNjx45N+16miIhTTjkl3nrrrbTzStu2beOiiy6KcePGpZ67otdbTVRRu1966aWb7HvEt++YHj58eERsvXZfvXp1rF69utzzTWWOi5qoonZfvnx5RES5+16dffy6detSdx5Upn7ba7tvbMP9XrZsWfTu3Ttyc3Nj9OjRm7yDfEuO8/Ket7rOK9uT9fu/4447Rtu2bcvd96oc5/n5+ZuMBc4555zUJGKPHj2y9joFMuHf//53/Pe//017Q2bEt+eS4cOHx6mnnrpJQFrV81N11q+m29J9nzlzZtSqVSvVvlXpKzc0fPjwKCgoSIWAG6roHFpTVTR3tOEE+f333x/HHHNMtGrVapPtvPPOO3HYYYfFaaedFtddd13aurKuDyoaT5dlw+Nie70+OOigg8o995dlw33f0uvgyZMnx/vvv1/qnf8VzXdVZoxSk5X2Wq7M2KOsMrVq1UqVKWueY/222rVrF7m5ufHXv/41ioqKolWrVpvdF6331Vdfxbx582ps396wYcNo06ZNfPHFFzFu3Ljo169fpeYVSlNRf15dqnp9nCRJJEmyxefrbaWqfef643zlypWbNfbbWEVj7eoaI21rFc1Rd+/ePfLy8tL2a/Xq1fHhhx+m7Vd1jbk3tDnn+/JUph/clqrap2xs/Xlvw7vN1/++fr+qq99Zu3ZtzJo1q9S++/7774/u3btH165d05ZX5tjJGglUo0MPPTS54IILUr+fc845SYcOHZKJEycmb7zxRlJUVJQUFRWVu40JEyYkOTk5yTXXXJO89957yfTp05M+ffokHTt2TJYvX54kSZJ88MEHSYMGDZKLLroomT17djJs2LCkdu3aydixY7fm7m1zp512WtKuXbtkzJgxyfz585MnnngiadmyZXLxxRenytx4441J06ZNk3/84x/JW2+9lfTr1y/p1KlTsmLFinK3PXfu3GTGjBnJL3/5y2TXXXdNZsyYkcyYMSNZuXJlkiRJMnHixKRBgwbJZZddlnz22Wepn//+97+pbbzyyitJnTp1kltuuSWZPXt2ctVVVyV169ZNZs2atXUaZCv58ssvU/sfEcnvf//7ZMaMGclHH32UrFq1KjnmmGOSHXbYIZk5c2ZaW6xvqyRJkiOPPDLp1q1bMnXq1OTll19Odtlll+Skk06q8LnXP2/37t2Tk08+OZkxY0byzjvvpNaXlJQkjRs3TgYOHJjMmTMnGTNmTFJQUJD89re/TZV55JFHkry8vGTEiBHJu+++m5x99tlJ06ZNkwULFlRvQ1Wz8to9SZLkiSeeSOrWrZvce++9ydy5c5M777wzqV27dvLSSy+ltlGVPqa6ju2qvvYy7dxzz02aNGmSTJo0KW3/1/evSVJxu65ZsybZc889k969eyczZ85Mxo4dm7Rq1Sq57LLLyn3uG2+8McnNzU3+9re/pT33l19+WeZjOnbsmAwdOjRtWVVfb5lUmXbfWEQko0aNSv2+Ndv90EMPTfbYY4/khRdeSD744INk+PDhSb169ZI//OEPqTJVeb1lWkXtvmrVqmTnnXdOfvCDHyRTp05N3n///eSWW25JcnJykqeffjq1naocc3fddVcyevTo5L333kvee++95E9/+lPSuHHj5PLLL690/ZJk+2v3Sy+9NJk8eXIyf/785K233kouvfTSJCcnJ3nuueeSpUuXJj169Ej22muv5P3330/b5zVr1iRJUvXj/Prrr0+ee+65ZN68ecm7776b3HLLLUmdOnWS++67L1Vma51XaoLy2j1JkmTo0KFJfn5+8vjjjydz585NhgwZktSrVy95//33U9uojr71qquuSrp27Zq2rDLXKZ999lkyY8aM5L777ksiInnxxReTGTNmpJ2bIduUdy385ZdfJr/+9a+TKVOmJPPnz0+ef/75ZN9990122WWX5JtvvknbzvPPP59ERDJ79uxKPW9lzk8VXadvTv1qkor6yor6oldffTUZOnRoMnPmzGTevHnJgw8+mLRq1So59dRTN6sepfWVSZIka9euTTp06JBccsklm6yrzDl0e7Lx3FGSfDtHkZOTkzz77LOblJ81a1bSqlWr5Gc/+1navi9atKjc56nMeLqi4yJJts/rg9dffz2pU6dOct111yVz585NHnrooaRBgwbJgw8+mCRJknz11VfJZZddlkyZMiX58MMPkzfeeCM5/fTTk7y8vOTtt99ObWdLrg9+9rOfJT169Ch1XWXmuyozRqmJynotV2bs8Z///Cdp0aJFctxxxyUzZ85M5syZk/z6179O6tatm8ycObPM5/zPf/6T3H333cns2bOTGTNmJOeff35Sr169ZOrUqWU+prS+6Fe/+lUyadKkZP78+ckrr7yS9OrVK2nZsmWFr7VtbezYscmzzz6bfPDBB8lzzz2XdO3aNenRo0eyatWqUstvPK+wJf15RfN4K1euTJVp06ZN8utf/zqZMWNGMnfu3FSZiq6P582bl1x//fXJG2+8kXz00UfJK6+8kvz4xz9OmjdvnixcuLCKrbZ5KroW+O9//5vMmDEjefrpp5OISB555JFkxowZyWeffZbaRkV959NPP5088MADyaxZs5L58+cnY8aMSbp06ZIcdNBB5datMm1cmbH2thojbY7qmKO+4IILknbt2iXjxo1L/vWvfyVnnHFGUlBQkHz++edJklR9zF2Zdt9Yaef7iq63qtoPbomKjveNlTZX+dFHHyUzZsxIrrnmmqRRo0ap7a2fe5s9e3aSl5eXnHvuucm7776bvP3228nPfvazpEmTJsmnn35abv0q6neuueaaZNy4ccm8efOS6dOnJyeeeGJSr169tDJJ8u31ZIMGDZK777671Oep6NjJFkJxqtXGHd2KFSuS//3f/02aNWuWNGjQIPnJT36SdnIsy1//+tekW7duScOGDZNWrVolxxxzzCaD/BdeeCHZZ599ktzc3GSnnXZKhg8fXs17k3nLli1LLrjggqRDhw5JvXr1kp122im5/PLL005069atS6644oqkdevWSV5eXnLEEUckc+bMqXDbhx56aBIRm/zMnz8/SZJvByilrT/00EPTtvPYY48lu+66a5Kbm5vsscceaSHC9uKFF14odV9PO+20ZP78+aWui4jkhRdeSG3jv//9b3LSSScljRo1SvLz85PTTz+93KBvvdK227Fjx7Qyr776atKjR48kLy8v2WmnnZLrrrtuk4mPO++8M+nQoUOSm5ubfP/7309ee+216miaraq8dl/v/vvvT3beeeekXr16SdeuXZMnn3wybRtV6WOq69iu6msv08o6njfsQyvTrh9++GFy1FFHJfXr109atmyZ/OpXv0pWr15d7nN37Nix1Oe+6qqryn3MxheaVX29ZVJl2r20x2wYiifJ1mv3zz77LPn5z3+etG3bNqlXr16y2267Jbfeemuybt26VJmqntMzqTLt/t577yXHHXdcUlBQkDRo0CDZe++9kz//+c9p26nKMXfHHXcke+yxR9KgQYMkPz8/6datW/KHP/whWbt27WbVb3tr91/84hdJx44dk9zc3KRVq1bJEUcckZpULqvf3/D6I0mqdpxffvnlqfNFs2bNkqKiouSRRx7ZpNzWOK/UBOW1+3o33HBDssMOOyQNGjRIioqK0t4MkCTV07eWFfRUdJ1y1VVXbXYfCdu78q6Fly9fnvTu3Ttp1apVUrdu3aRjx47JWWedVeqbXk866aTkwAMPrPTzVub8VNF1+ubUryapqK+sqC+aPn160qNHj6RJkyZJvXr1ki5duiTXX3/9Zr8RoKy+cty4cUlElDqmqOw5dHtR2iT5ZZddlrRv3z7tWFyvrL/NxmPn0lQ0nq7MOXR7vT546qmnkj333DPJy8tLOnfunNx7772pdStWrEh+8pOfJG3btk1yc3OTNm3aJMccc0zy+uuvp22jqtcHS5YsSerXr5/2nBuqzHxXZcYoNVF5r+XKjD2mTZuW9O7dO2nevHnSuHHj5IADDkieeeaZcp/zP//5T3LAAQckDRs2TBo0aJAcccQRFc4LldYXnXDCCUmbNm2S3NzcpF27dskJJ5yQFhDWFI8++miy0047Jbm5uUlhYWFSXFycLFmypMzyG88rbEl/XlFfVNY84sZzTuVdH3/yySfJUUcdlRQUFCR169ZNdthhh+Tkk09O/vWvf1W6jbZURdcCw4cPr3CeoaK+c+LEiUlRUVHq77DLLrskl1xySfLFF1+UW7fKtHFl52C2xRhpc1THHPWqVauSX/3qV0lBQUHSuHHjpFevXmlvdkqSqo25K3tsb6i0831lxn5V6Qe3RGXmqDdU2lxlWfPNG/5tnnvuueSggw5KmjRpkjRr1iw5/PDDkylTplRYv4r6nUGDBqX6k9atWyc/+tGPkjfffHOT7fzxj39M6tevX2Z/WZljJxvkJEmSBAAAAAAAAABkId8pDgAAAAAAAEDWEooDAAAAAAAAkLWE4gAAAAAAAABkLaE4AAAAAAAAAFlLKA4AAAAAAABA1hKKAwAAAAAAAJC1hOIAAAAAAAAAZC2hOAAAAAAAAABZSygOAFTJz3/+8zj22GMzXQ0AAADIKsbbAFD9hOIAUIPVhIHwhx9+GDk5OTFz5swt3taIESMiJycncnJyolatWtGmTZs44YQToqSkZMsrCgAAAJVkvA0A3y1CcQBgm8rPz4/PPvssPvnkk/j73/8ec+bMiZ/+9KeZrhYAAABs14y3AaBsQnEA2I69/fbbcdRRR0WjRo2idevWccopp8TixYtT63v27Bnnn39+XHzxxdG8efMoLCyMq6++Om0b//rXv+Lggw+OevXqxe677x7PP/985OTkxJNPPhkREZ06dYqIiG7dukVOTk707Nkz7fG33HJLtGnTJlq0aBHFxcWxevXqcuuck5MThYWF0aZNmzjwwAPjjDPOiNdffz2WLVuWKnPJJZfErrvuGg0aNIiddtoprrjiirTtXn311bHPPvvEX/7yl9hxxx2jSZMmceKJJ8aXX36ZKvPll1/GgAEDomHDhtGmTZsYOnRo9OzZMwYNGpQqs3Llyvj1r38d7dq1i4YNG0aPHj1i0qRJlWh5AAAAspnxtvE2ANlFKA4A26klS5bE4YcfHt26dYs33ngjxo4dGwsXLozjjz8+rdzIkSOjYcOGMXXq1Lj55pvj2muvjfHjx0dExNq1a+PYY4+NBg0axNSpU+Pee++Nyy+/PO3xr7/+ekREPP/88/HZZ5/FE088kVr3wgsvxLx58+KFF16IkSNHxogRI2LEiBGV3odFixbFqFGjonbt2lG7du3U8saNG8eIESPi3Xffjdtvvz3uu+++GDp0aNpj582bF08++WSMGTMmxowZE5MnT44bb7wxtX7w4MHxyiuvxOjRo2P8+PHx0ksvxZtvvpm2jYEDB8aUKVPikUceibfeeit++tOfxpFHHhlz586t9D4AAACQXYy3jbcByD51Ml0BAKBq7rrrrujWrVtcf/31qWUPPPBAtG/fPt57773YddddIyJi7733jquuuioiInbZZZe46667YsKECfHDH/4wxo8fH/PmzYtJkyZFYWFhRERcd9118cMf/jC1zVatWkVERIsWLVJl1mvWrFncddddUbt27ejcuXP07ds3JkyYEGeddVaZ9V66dGk0atQokiSJ5cuXR0TE+eefHw0bNkyVGTJkSOr/O+64Y/z617+ORx55JC6++OLU8nXr1sWIESOicePGERFxyimnxIQJE+K6666LL7/8MkaOHBkPP/xwHHHEERERMXz48Gjbtm3q8SUlJTF8+PAoKSlJLf/1r38dY8eOjeHDh6e1KwAAAN8dxtvG2wBkH6E4AGyn/vnPf8YLL7wQjRo12mTdvHnz0gbpG2rTpk0sWrQoIiLmzJkT7du3Txt8f//73690HfbYY4+0d5y3adMmZs2aVe5jGjduHG+++WasXr06nn322XjooYfiuuuuSyvz6KOPxh133BHz5s2Lr776KtasWRP5+flpZXbcccfUAH3j/frggw9i9erVafvSpEmT2G233VK/z5o1K9auXZtqp/VWrlwZLVq0qGQLAAAAkG2Mt423Acg+QnEA2E599dVX8eMf/zhuuummTda1adMm9f+6deumrcvJyYl169ZVSx2qsu1atWrFzjvvHBERXbp0iXnz5sW5554bf/nLXyIiYsqUKTFgwIC45pprok+fPtGkSZN45JFH4tZbb93i597QV199FbVr147p06enTTRERKkTHwAAAHw3GG8bbwOQfYTiALCd2nfffePvf/977LjjjlGnTtVO6bvttlt8/PHHsXDhwmjdunVEREybNi2tTG5ubkR8+31oW8Oll14a3/ve9+LCCy+MfffdN1599dXo2LFj2netffTRR5u1zZ122inq1q0b06ZNiw4dOkTEtx8j995778UhhxwSERHdunWLtWvXxqJFi+IHP/hB9e0QAAAA2zXj7bIZbwOwvaqV6QoAAOVbunRpzJw5M+3n448/juLi4vj888/jpJNOimnTpsW8efNi3Lhxcfrpp1d6QP3DH/4wvve978Vpp50Wb731Vrzyyiup7xfLycmJiIiCgoKoX79+jB07NhYuXBhLly6t1v1r3759/OQnP4krr7wyIr79HraSkpJ45JFHYt68eXHHHXfEqFGjNmubjRs3jtNOOy0uuuiieOGFF+Kdd96JM844I2rVqpXar1133TUGDBgQp556ajzxxBMxf/78eP311+OGG26Ip59+ulr3EQAAgJrHeNt4G4DvDqE4ANRwkyZNim7duqX9XHPNNdG2bdt45ZVXYu3atdG7d+/Ya6+9YtCgQdG0adOoVatyp/jatWvHk08+GV999VXsv//+ceaZZ6beMV6vXr2IiKhTp07ccccd8cc//jHatm0b/fr1q/Z9vPDCC+Ppp5+O119/PY455pi48MILY+DAgbHPPvvEq6++GldcccVmb/P3v/99FBUVxdFHHx29evWKgw46KLp06ZLar4iI4cOHx6mnnhq/+tWvYrfddotjjz027d3uAAAAZC/jbeNtAL47cpIkSTJdCQCg5njllVfi4IMPjvfffz++973vZbo61ebrr7+Odu3axa233hpnnHFGpqsDAADAd4zxNgBkju8UB4DvuFGjRkWjRo1il112iffffz8uuOCCOOigg7b7AfqMGTPiX//6V3z/+9+PpUuXxrXXXhsRsVXeeQ8AAAAbM94GgJpDKA4A33FffvllXHLJJVFSUhItW7aMXr16xa233prpalWLW265JebMmRO5ubnRvXv3eOmll6Jly5aZrhYAAADfAcbbAFBz+Ph0AAAAAAAAALJWrUxXAAAAAAAAAAC2FqE4AAAAAAAAAFlLKA4AAAAAAABA1hKKAwAAAAAAAJC1hOIAAAAAAAAAZC2hOAAAAAAAAABZSygOAAAAAAAAQNYSigMAAAAAAACQtf4/ledPmuap0GMAAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":8},{"cell_type":"markdown","source":"## Train and evaluate models","metadata":{"id":"-BMh1vbuc5qp"}},{"cell_type":"markdown","source":"#### Create dataset","metadata":{"id":"VFt5KLR-8w3p"}},{"cell_type":"code","source":"# class MedDataset(Dataset):\n#   def __init__(self, instruction, input, output):\n#     self.instruction = instruction\n#     self.input = input\n#     self.output = output\n\n#   def __len__(self):\n#     return len(self.instruction)\n\n#   def __getitem__(self, idx):\n#     sentence = \"<s>[INST] \"+self.instruction[idx]+\". \"+self.input[idx]+\" [/INST] \"+self.output[idx]+\" </s>\"\n#     return sentence","metadata":{"id":"ND0M0R633VbB","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:54.927407Z","iopub.execute_input":"2025-01-04T20:01:54.927665Z","iopub.status.idle":"2025-01-04T20:01:54.931019Z","shell.execute_reply.started":"2025-01-04T20:01:54.927623Z","shell.execute_reply":"2025-01-04T20:01:54.930106Z"}},"outputs":[],"execution_count":9},{"cell_type":"code","source":"class MedDataset(Dataset):\n    def __init__(self, dataset, tokenizer):\n        self.dataset = dataset\n        self.tokenizer = tokenizer\n\n    def __len__(self):\n        return len(self.dataset)\n\n    def __getitem__(self, idx):\n        example = self.dataset[idx]\n        messages = [\n            {\"role\": \"system\", \"content\": example['instruction']},\n            {\"role\": \"user\", \"content\": example['input']},\n            {\"role\": \"assistant\", \"content\": example['output']}\n        ]\n\n        prompt = self.tokenizer.apply_chat_template(\n            messages,\n            tokenize=False,\n            add_generation_prompt=True\n        )\n\n        tokens = self.tokenizer(\n            prompt,\n            padding=\"max_length\",\n            truncation=True,\n            max_length=128,\n            return_tensors=\"pt\"\n        )\n\n        tokens['labels'] = tokens['input_ids'].clone()\n        tokens['labels'][tokens['input_ids'] == self.tokenizer.pad_token_id] = -100\n\n        return {\n            \"input_ids\": tokens['input_ids'].squeeze(),\n            \"attention_mask\": tokens['attention_mask'].squeeze(),\n            \"labels\": tokens['labels'].squeeze()\n        }","metadata":{"trusted":true,"id":"LacKbkPHSsQ-","execution":{"iopub.status.busy":"2025-01-04T20:01:54.931796Z","iopub.execute_input":"2025-01-04T20:01:54.932121Z","iopub.status.idle":"2025-01-04T20:01:54.948399Z","shell.execute_reply.started":"2025-01-04T20:01:54.932093Z","shell.execute_reply":"2025-01-04T20:01:54.947523Z"}},"outputs":[],"execution_count":10},{"cell_type":"code","source":"login(token=\"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\")\n\nbase_model = \"meta-llama/Llama-3.2-1B-Instruct\"\n\ntokenizer = AutoTokenizer.from_pretrained(base_model)\ntokenizer.pad_token = tokenizer.eos_token\n\n# tokenizer.padding_side = \"right\"","metadata":{"trusted":true,"id":"AelKMq1xSsQ-","execution":{"iopub.status.busy":"2025-01-04T20:01:54.949192Z","iopub.execute_input":"2025-01-04T20:01:54.949444Z","iopub.status.idle":"2025-01-04T20:01:57.117672Z","shell.execute_reply.started":"2025-01-04T20:01:54.949412Z","shell.execute_reply":"2025-01-04T20:01:57.117006Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"tokenizer_config.json:   0%|          | 0.00/54.5k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"380c38eda12f42aea18182a1c6eaf240"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"tokenizer.json:   0%|          | 0.00/9.09M [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"a5a6ceb82afc4aac96adcfa66ee0f1d4"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"special_tokens_map.json:   0%|          | 0.00/296 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"408dd0b1adad40b7930bcf25ba0fae9d"}},"metadata":{}}],"execution_count":11},{"cell_type":"code","source":"tokenized_dataset = MedDataset(ds, tokenizer)","metadata":{"id":"C6gCSyFM7IsG","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:57.118459Z","iopub.execute_input":"2025-01-04T20:01:57.118727Z","iopub.status.idle":"2025-01-04T20:01:57.122233Z","shell.execute_reply.started":"2025-01-04T20:01:57.118700Z","shell.execute_reply":"2025-01-04T20:01:57.121569Z"}},"outputs":[],"execution_count":12},{"cell_type":"code","source":"train_dataset, val_dataset, test_dataset = random_split(tokenized_dataset, [0.8, 0.1, 0.1])\nprint(f\"Train dataset dimension: {len(train_dataset)}\")\nprint(f\"Validation dataset dimension: {len(val_dataset)}\")\nprint(f\"Test dataset dimension: {len(test_dataset)}\")","metadata":{"id":"RRneCjBj9Lag","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:57.123113Z","iopub.execute_input":"2025-01-04T20:01:57.123385Z","iopub.status.idle":"2025-01-04T20:01:57.161765Z","shell.execute_reply.started":"2025-01-04T20:01:57.123365Z","shell.execute_reply":"2025-01-04T20:01:57.161155Z"}},"outputs":[{"name":"stdout","text":"Train dataset dimension: 27165\nValidation dataset dimension: 3395\nTest dataset dimension: 3395\n","output_type":"stream"}],"execution_count":13},{"cell_type":"code","source":"compute_dtype = getattr(torch, \"float16\")\n\nquant_config = BitsAndBytesConfig(\n    load_in_4bit=True,\n    bnb_4bit_quant_type=\"nf4\",\n    bnb_4bit_compute_dtype=compute_dtype,\n    bnb_4bit_use_double_quant=False,\n    bnb_4bit_representation=\"nested\"\n)\n\nmodel = AutoModelForCausalLM.from_pretrained(\n    base_model,\n    quantization_config=quant_config,\n    device_map={\"\": 0},\n    torch_dtype=torch.float32,\n    trust_remote_code=True\n)\nmodel.config.use_cache = False\nmodel.config.pretraining_tp = 1\n\nmodel.gradient_checkpointing_enable()\nmodel = prepare_model_for_kbit_training(model)","metadata":{"id":"gR4BtF8AHD0I","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:01:57.162479Z","iopub.execute_input":"2025-01-04T20:01:57.162649Z","iopub.status.idle":"2025-01-04T20:03:01.840482Z","shell.execute_reply.started":"2025-01-04T20:01:57.162634Z","shell.execute_reply":"2025-01-04T20:03:01.839883Z"}},"outputs":[{"name":"stderr","text":"Unused kwargs: ['bnb_4bit_representation']. These kwargs are not used in <class 'transformers.utils.quantization_config.BitsAndBytesConfig'>.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"config.json:   0%|          | 0.00/877 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"6cec6b8d4209431d8036028764183634"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"model.safetensors:   0%|          | 0.00/2.47G [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9d13c5397e6442be92af2c72c1b48ae0"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"generation_config.json:   0%|          | 0.00/189 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"7ccdec106f714145acd8115af2d1ea20"}},"metadata":{}}],"execution_count":14},{"cell_type":"code","source":"# def convert_to_hf_dataset(med_dataset):\n#     # Create lists to store all formatted text\n#     formatted_texts = []\n\n#     # Iterate through all items in the original dataset\n#     for idx in range(len(med_dataset.instruction)):\n#         # Get the formatted text directly using the dataset's __getitem__\n#         formatted_text = med_dataset[idx]\n#         formatted_texts.append(formatted_text)\n\n#     # Create a dictionary with the required format\n#     dataset_dict = {\n#         'text': formatted_texts\n#     }\n\n#     # Convert to HuggingFace Dataset\n#     hf_dataset = HFDataset.from_dict(dataset_dict)\n\n#     return hf_dataset\n\n# hf_dataset = convert_to_hf_dataset(garnachoDataset)","metadata":{"id":"gzL6yXsGSsQ_","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:03:01.841346Z","iopub.execute_input":"2025-01-04T20:03:01.841655Z","iopub.status.idle":"2025-01-04T20:03:01.844971Z","shell.execute_reply.started":"2025-01-04T20:03:01.841625Z","shell.execute_reply":"2025-01-04T20:03:01.844214Z"}},"outputs":[],"execution_count":15},{"cell_type":"code","source":"peft_params = LoraConfig(\n    lora_alpha=32,\n    lora_dropout=0.1,\n    r=16,\n    bias=\"none\",\n    task_type=\"CAUSAL_LM\",\n)","metadata":{"id":"ew98HuwaKW1P","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:03:01.845643Z","iopub.execute_input":"2025-01-04T20:03:01.845854Z","iopub.status.idle":"2025-01-04T20:03:01.862789Z","shell.execute_reply.started":"2025-01-04T20:03:01.845824Z","shell.execute_reply":"2025-01-04T20:03:01.862086Z"}},"outputs":[],"execution_count":16},{"cell_type":"code","source":"model.train()\ntraining_params = TrainingArguments(\n    output_dir=\"./results\",\n    num_train_epochs=1,\n    per_device_train_batch_size=8,\n    gradient_accumulation_steps=4,\n    optim=\"paged_adamw_32bit\",\n    eval_strategy=\"steps\",\n    logging_steps=90,\n    eval_steps = 90,\n    learning_rate=2e-4,\n    weight_decay=0.001,\n    fp16=False,\n    bf16=False,\n    max_grad_norm=0.3,\n    max_steps=-1,\n    warmup_ratio=0.03,\n    group_by_length=True,\n    lr_scheduler_type=\"constant\",\n    report_to=\"tensorboard\",\n    gradient_checkpointing=True\n)","metadata":{"id":"n8dBHX-j-M1J","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:03:01.863493Z","iopub.execute_input":"2025-01-04T20:03:01.863774Z","iopub.status.idle":"2025-01-04T20:03:01.908617Z","shell.execute_reply.started":"2025-01-04T20:03:01.863754Z","shell.execute_reply":"2025-01-04T20:03:01.907842Z"}},"outputs":[],"execution_count":17},{"cell_type":"code","source":"# trainer = SFTTrainer(\n#     model=model,\n#     train_dataset=train_dataset,\n#     eval_dataset=val_dataset,\n#     peft_config=peft_params,\n#     max_seq_length=256,\n#     tokenizer=tokenizer,\n#     args=training_params,\n#     packing=False,\n# )\n\n# # Train the model\n# trainer.train()\n\n# # Save the model and tokenizer\n# trainer.save_model(\"./fine-tuned-model\")\n# tokenizer.save_pretrained(\"./fine-tuned-model\")","metadata":{"trusted":true,"id":"ARnpWrEFSsQ_","execution":{"iopub.status.busy":"2025-01-04T20:03:01.909329Z","iopub.execute_input":"2025-01-04T20:03:01.909543Z","iopub.status.idle":"2025-01-04T20:03:01.912762Z","shell.execute_reply.started":"2025-01-04T20:03:01.909523Z","shell.execute_reply":"2025-01-04T20:03:01.911947Z"}},"outputs":[],"execution_count":18},{"cell_type":"code","source":"# trainer.model.save_pretrained(\"model-chatbot-medical-mew\")\n# trainer.tokenizer.save_pretrained(\"model-chatbot-medical-mew\")","metadata":{"id":"awbFBy8v5rDM","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:03:01.913577Z","iopub.execute_input":"2025-01-04T20:03:01.913868Z","iopub.status.idle":"2025-01-04T20:03:01.931446Z","shell.execute_reply.started":"2025-01-04T20:03:01.913840Z","shell.execute_reply":"2025-01-04T20:03:01.930682Z"}},"outputs":[],"execution_count":19},{"cell_type":"markdown","source":"## Test Trained Model","metadata":{"id":"MmC39wTYSsQ_"}},{"cell_type":"markdown","source":"### Load pre-trained model","metadata":{"id":"UwQNV8XLYoLX"}},{"cell_type":"code","source":"trained_model = \"/kaggle/input/medicalllm/pytorch/default/1/model-chatbot-medical-mew\"\nquestion = \"What does low Mobility suggest?\"\n\nmodel = AutoPeftModelForCausalLM.from_pretrained(\n    trained_model, # change with folder where u have the files\n    quantization_config=quant_config,\n    device_map={\"\": 0},\n    torch_dtype=torch.float32,\n    trust_remote_code=True\n)\ntokenizer = AutoTokenizer.from_pretrained(trained_model)","metadata":{"id":"A-XhCQC1YhLP","trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:03:01.932192Z","iopub.execute_input":"2025-01-04T20:03:01.932400Z","iopub.status.idle":"2025-01-04T20:03:08.053881Z","shell.execute_reply.started":"2025-01-04T20:03:01.932383Z","shell.execute_reply":"2025-01-04T20:03:08.053186Z"}},"outputs":[],"execution_count":20},{"cell_type":"code","source":"messages = [{\"role\": \"system\", \"content\": instructions[0]},\n    {\"role\": \"user\", \"content\": question}]\n\nprompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)\n\nmodel_inputs = tokenizer(prompt, return_tensors='pt', padding=True, truncation=True).to(\"cuda\")\n\noutputs = model.generate(**model_inputs, max_new_tokens=128)\n\ntext = tokenizer.decode(outputs[0], skip_special_tokens=True)\n\nprint(f\"Question: {question}\")\nprint(text.split(\"assistant\")[1])","metadata":{"trusted":true,"id":"NL-rYUPJSsRD","execution":{"iopub.status.busy":"2025-01-04T20:03:08.054650Z","iopub.execute_input":"2025-01-04T20:03:08.054906Z","iopub.status.idle":"2025-01-04T20:03:11.056335Z","shell.execute_reply.started":"2025-01-04T20:03:08.054885Z","shell.execute_reply":"2025-01-04T20:03:11.055341Z"}},"outputs":[{"name":"stderr","text":"Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n","output_type":"stream"},{"name":"stdout","text":"Question: What does low Mobility suggest?\n\n\nLow Mobility is a medical condition that is characterized by a decrease in the range of motion of the joints, making it difficult to move the affected joints. This can be due to a variety of factors, including injury, degenerative changes, or other medical conditions such as arthritis.\n","output_type":"stream"}],"execution_count":21},{"cell_type":"markdown","source":"### Compare with MedLlama","metadata":{}},{"cell_type":"code","source":"# tokenizerMED = AutoTokenizer.from_pretrained(\"OpenScienceReseach/Med-LLaMA-7b\")\n# modelMED = AutoModelForCausalLM.from_pretrained(\"OpenScienceReseach/Med-LLaMA-7b\") funzia ma lento\n\ntokenizerMED = AutoTokenizer.from_pretrained(\"medalpaca/medalpaca-7b\")\nmodelMED = AutoModelForCausalLM.from_pretrained(\"medalpaca/medalpaca-7b\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:03:36.977452Z","iopub.execute_input":"2025-01-04T20:03:36.977757Z","iopub.status.idle":"2025-01-04T20:06:32.214695Z","shell.execute_reply.started":"2025-01-04T20:03:36.977734Z","shell.execute_reply":"2025-01-04T20:06:32.213870Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"tokenizer_config.json:   0%|          | 0.00/260 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"69dd602f6d4742e3ae56b677e2f83d8f"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"tokenizer.model:   0%|          | 0.00/500k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"2b82cdfbb59641959f9a4becd177b5cf"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"added_tokens.json:   0%|          | 0.00/21.0 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"de248b7ac03c471889376937cd231570"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"special_tokens_map.json:   0%|          | 0.00/96.0 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"983002136f7043629d00997ca858c588"}},"metadata":{}},{"name":"stderr","text":"You are using the default legacy behaviour of the <class 'transformers.models.llama.tokenization_llama.LlamaTokenizer'>. This is expected, and simply means that the `legacy` (previous) behavior will be used so nothing changes for you. If you want to use the new behaviour, set `legacy=False`. This should only be set if you understand what it means, and thoroughly read the reason why this was added as explained in https://github.com/huggingface/transformers/pull/24565 - if you loaded a llama tokenizer from a GGUF file you can ignore this message\nYou are using the default legacy behaviour of the <class 'transformers.models.llama.tokenization_llama_fast.LlamaTokenizerFast'>. This is expected, and simply means that the `legacy` (previous) behavior will be used so nothing changes for you. If you want to use the new behaviour, set `legacy=False`. This should only be set if you understand what it means, and thoroughly read the reason why this was added as explained in https://github.com/huggingface/transformers/pull/24565 - if you loaded a llama tokenizer from a GGUF file you can ignore this message.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"config.json:   0%|          | 0.00/542 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"0325bad4d3bc47c392f0f488e5204767"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"model.safetensors.index.json:   0%|          | 0.00/28.1k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"3389942be52a4b8ebb23347bb9ba8465"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Downloading shards:   0%|          | 0/3 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"3fc80bcc62d741b2bbaca7bb2312fdfe"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"model-00001-of-00003.safetensors:   0%|          | 0.00/9.88G [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"de5b6b1da959422c8bf04ec7ca6178d6"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"model-00002-of-00003.safetensors:   0%|          | 0.00/9.89G [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9376d933ee1d40cf93564d3c789dc853"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"model-00003-of-00003.safetensors:   0%|          | 0.00/7.18G [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5dedd23938564e4a84c24cc4bdff83d0"}},"metadata":{}},{"name":"stderr","text":"/usr/local/lib/python3.10/dist-packages/transformers/generation/configuration_utils.py:606: UserWarning: `pad_token_id` should be positive but got -1. This will cause errors when batch generating, if there is padding. Please set `pad_token_id` explicitly as `model.generation_config.pad_token_id=PAD_TOKEN_ID` to avoid errors in generation\n  warnings.warn(\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"Loading checkpoint shards:   0%|          | 0/3 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"63bf81e806bc4737953d741452affecb"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"generation_config.json:   0%|          | 0.00/137 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"d16c0053c8fc45a4871d4100311b8866"}},"metadata":{}}],"execution_count":25},{"cell_type":"code","source":"!pip install nltk\nimport nltk\nnltk.download('punkt')\n\nfrom nltk.translate.bleu_score import sentence_bleu\n\ndef calculate_bleu(reference, candidate):\n    \"\"\"\n    Comput BLUE score between the candiate (generate answer) and the reference answer\n    \"\"\"\n    try:\n      score = sentence_bleu(reference, candidate)\n      return score\n    except Exception as e:\n      print(f\"Error during BLUE computing: {e}\")\n      return None","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:03:11.063599Z","iopub.execute_input":"2025-01-04T20:03:11.063875Z","iopub.status.idle":"2025-01-04T20:03:14.761490Z","shell.execute_reply.started":"2025-01-04T20:03:11.063847Z","shell.execute_reply":"2025-01-04T20:03:14.760443Z"}},"outputs":[{"name":"stderr","text":"/usr/lib/python3.10/pty.py:89: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.\n  pid, fd = os.forkpty()\n","output_type":"stream"},{"name":"stdout","text":"Requirement already satisfied: nltk in /usr/local/lib/python3.10/dist-packages (3.2.4)\nRequirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from nltk) (1.16.0)\n[nltk_data] Downloading package punkt to /usr/share/nltk_data...\n[nltk_data]   Package punkt is already up-to-date!\n","output_type":"stream"}],"execution_count":23},{"cell_type":"code","source":"questions = [\"What does low REM sleep latency and experiencing hallucinations/sleep paralysis suggest?\",\n             \"What are some possible causes of low PTH and high calcium levels?\",\n             \"What is the term used to describe a condition of low sodium levels and very high proteins or lipids?\"]\n\ndataset_answer = [\"Low REM sleep latency and experiencing hallucinations/sleep paralysis suggests narcolepsy.\",\n                  \"PTH-independent hypercalcemia, which can be caused by cancer, granulomatous disease, or vitamin D intoxication.\",\n                  \"The term used to describe a condition of low sodium levels and very high proteins or lipids is pseudohyponatremia.\"]\n\nllama_bleu = []\nour_bleu = []\n\nfrom transformers import pipeline\nimport time\n\nfor i, question in enumerate(questions):\n    print(f\"Question: {question}\")\n    start = time.time()    \n    # llama\n    pl = pipeline(\"text-generation\", model=modelMED, tokenizer=tokenizerMED)\n    response = pl(question)\n    end = time.time() - start\n    print(\"time for generate response: \", end)\n    print(\"Response MedLlama:\", response)\n\n    candidate = response.split()\n    bleu_score = calculate_bleu(dataset_answer[i], candidate)\n\n    if bleu_score is not None:\n        print(f\"BLEU score for Llama answer {i}: {bleu_score}\")   \n        llama_bleu.append(bleu_score)\n\n\nfor i, question in enumerate(questions):\n    # our\n    messages = [{\"role\": \"system\", \"content\": instructions[0]},\n    {\"role\": \"user\", \"content\": question}]\n    prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)\n    model_inputs = tokenizer(prompt, return_tensors='pt', padding=True, truncation=True).to(\"cuda\")\n    outputs = model.generate(**model_inputs, max_new_tokens=128)\n    text = tokenizer.decode(outputs[0], skip_special_tokens=True)\n    our = text.split(\"assistant\")[1]\n    print(\"Our Response: \", our)\n\n    candidate = our.split()\n    bleu_score = calculate_bleu(dataset_answer[i], candidate)\n\n    if bleu_score is not None:\n        print(f\"BLEU score for our answer {i}: {bleu_score}\")   \n        our_bleu.append(bleu_score)\n\nimport numpy\nprint(f\"Average BLEU score for our model: {np.median(our_bleu)}\")\nprint(f\"Average BLEU score for Llama model: {np.median(llama_bleu)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-04T20:07:28.125474Z","iopub.execute_input":"2025-01-04T20:07:28.125797Z","iopub.status.idle":"2025-01-04T20:08:25.843847Z","shell.execute_reply.started":"2025-01-04T20:07:28.125773Z","shell.execute_reply":"2025-01-04T20:08:25.842457Z"}},"outputs":[{"name":"stderr","text":"Device set to use cuda:0\n","output_type":"stream"},{"name":"stdout","text":"Question: What does low REM sleep latency and experiencing hallucinations/sleep paralysis suggest?\n","output_type":"stream"},{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mOutOfMemoryError\u001b[0m                          Traceback (most recent call last)","\u001b[0;32m<ipython-input-26-ad55525d10d4>\u001b[0m in \u001b[0;36m<cell line: 15>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     17\u001b[0m     \u001b[0mstart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\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     18\u001b[0m     \u001b[0;31m# llama\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m     \u001b[0mpl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpipeline\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"text-generation\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodelMED\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtokenizer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtokenizerMED\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     20\u001b[0m     \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquestion\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     21\u001b[0m     \u001b[0mend\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mstart\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/transformers/pipelines/__init__.py\u001b[0m in \u001b[0;36mpipeline\u001b[0;34m(task, model, config, tokenizer, feature_extractor, image_processor, processor, framework, revision, use_fast, token, device, device_map, torch_dtype, trust_remote_code, model_kwargs, pipeline_class, **kwargs)\u001b[0m\n\u001b[1;32m   1176\u001b[0m         \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"processor\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mprocessor\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1177\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1178\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mpipeline_class\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mframework\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mframework\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtask\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtask\u001b[0m\u001b[0;34m,\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[0m\n\u001b[0m","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/transformers/pipelines/text_generation.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m     94\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     95\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\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---> 96\u001b[0;31m         \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\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[0m\n\u001b[0m\u001b[1;32m     97\u001b[0m         self.check_model_type(\n\u001b[1;32m     98\u001b[0m             \u001b[0mTF_MODEL_FOR_CAUSAL_LM_MAPPING_NAMES\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframework\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"tf\"\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mMODEL_FOR_CAUSAL_LM_MAPPING_NAMES\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/transformers/pipelines/base.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, model, tokenizer, feature_extractor, image_processor, processor, modelcard, framework, task, args_parser, device, torch_dtype, binary_output, **kwargs)\u001b[0m\n\u001b[1;32m    924\u001b[0m             \u001b[0;32mand\u001b[0m \u001b[0mhf_device_map\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    925\u001b[0m         ):\n\u001b[0;32m--> 926\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdevice\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    927\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    928\u001b[0m         \u001b[0;31m# If the model can generate, create a local generation config. This is done to avoid side-effects on the model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/transformers/modeling_utils.py\u001b[0m in \u001b[0;36mto\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   3162\u001b[0m                     \u001b[0;34m\" `dtype` by passing the correct `torch_dtype` argument.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3163\u001b[0m                 )\n\u001b[0;32m-> 3164\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\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[0m\n\u001b[0m\u001b[1;32m   3165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3166\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mhalf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\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[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36mto\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1172\u001b[0m                     \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1173\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1174\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconvert\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   1175\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1176\u001b[0m     def register_full_backward_pre_hook(\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, fn, recurse)\u001b[0m\n\u001b[1;32m    778\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    779\u001b[0m             \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m(\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--> 780\u001b[0;31m                 \u001b[0mmodule\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\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    781\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    782\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mcompute_should_use_set_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_applied\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.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, fn, recurse)\u001b[0m\n\u001b[1;32m    778\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    779\u001b[0m             \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m(\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--> 780\u001b[0;31m                 \u001b[0mmodule\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\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    781\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    782\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mcompute_should_use_set_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_applied\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.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, fn, recurse)\u001b[0m\n\u001b[1;32m    778\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    779\u001b[0m             \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m(\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--> 780\u001b[0;31m                 \u001b[0mmodule\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\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    781\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    782\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mcompute_should_use_set_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_applied\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.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, fn, recurse)\u001b[0m\n\u001b[1;32m    778\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    779\u001b[0m             \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m(\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--> 780\u001b[0;31m                 \u001b[0mmodule\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\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    781\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    782\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mcompute_should_use_set_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_applied\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.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, fn, recurse)\u001b[0m\n\u001b[1;32m    778\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    779\u001b[0m             \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m(\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--> 780\u001b[0;31m                 \u001b[0mmodule\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\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    781\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    782\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mcompute_should_use_set_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_applied\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.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, fn, recurse)\u001b[0m\n\u001b[1;32m    803\u001b[0m             \u001b[0;31m# `with torch.no_grad():`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    804\u001b[0m             \u001b[0;32mwith\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mno_grad\u001b[0m\u001b[0;34m(\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--> 805\u001b[0;31m                 \u001b[0mparam_applied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam\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    806\u001b[0m             \u001b[0mp_should_use_set_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_should_use_set_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparam_applied\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36mconvert\u001b[0;34m(t)\u001b[0m\n\u001b[1;32m   1158\u001b[0m                         \u001b[0mmemory_format\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mconvert_to_format\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1159\u001b[0m                     )\n\u001b[0;32m-> 1160\u001b[0;31m                 return t.to(\n\u001b[0m\u001b[1;32m   1161\u001b[0m                     \u001b[0mdevice\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1162\u001b[0m                     \u001b[0mdtype\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_floating_point\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_complex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\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;31mOutOfMemoryError\u001b[0m: CUDA out of memory. Tried to allocate 172.00 MiB. GPU 0 has a total capacity of 14.74 GiB of which 74.12 MiB is free. Process 2351 has 14.67 GiB memory in use. Of the allocated memory 14.47 GiB is allocated by PyTorch, and 75.78 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation.  See documentation for Memory Management  (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)"],"ename":"OutOfMemoryError","evalue":"CUDA out of memory. Tried to allocate 172.00 MiB. GPU 0 has a total capacity of 14.74 GiB of which 74.12 MiB is free. Process 2351 has 14.67 GiB memory in use. Of the allocated memory 14.47 GiB is allocated by PyTorch, and 75.78 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation.  See documentation for Memory Management  (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)","output_type":"error"}],"execution_count":26}]}