[
  {
    "path": ".gitignore",
    "content": "# BERN\nnormalization/\npmc/\npubmed/\npubmed_pubtator/\n.idea/\nbiobert_ner/pretrainedBERT/\nbiobert_ner/result/\nbiobert_ner/tmp/\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n"
  },
  {
    "path": "LICENSE",
    "content": "BSD 2-Clause License\n\nCopyright (c) 2019, Donghyeon Kim, Jinhyuk Lee, Chan Ho So, Hwisang Jeon, Minbyul Jeong, Yonghwa Choi, Wonjin Yoon, Mujeen Sung, Jaewoo Kang\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "# BERN\nBERN is a BioBERT-based multi-type NER tool that also supports normalization of extracted entities. This repository contains the official implementation of BERN. You can use BERN at https://bern.korea.ac.kr, or host your own server by following the description below. Please refer to our [paper (Kim et al., IEEE Access 2019)](https://doi.org/10.1109/ACCESS.2019.2920708) for more details. This project is done by [DMIS Laboratory](https://dmis.korea.ac.kr) at Korea University.\n\n**[Updates]**\n\n***** **Check out [BERN2](https://github.com/dmis-lab/BERN2), an improved version of BERN with much faster and more accurate inference!** *****\n\n**Fixed our gene normalizer to respond to issues between 2020-03-12 and 2020-03-13**\n1. Download gnormplus-normalization_19.jar at [this URL](https://drive.google.com/open?id=1ZTKJyRLBeqG2ioTtUqvmW0C_H6PmHZGl) and place (overwrite) the file under normalization/resources/normalizers/gene directory.  \n2. Stop normalizers by running stop_normalizers.sh  \n3. Start the normalizers by running load_dicts.sh  \n\n**Done - Server down due to air conditioning problems in our server room 2019-10-10 - 2019-10-11 7:55 AM (UTC-0)**  \n\n**Fixed our disease normalizer 2019-08-19, 2019-08-10 and 2019-08-02 issues**\n1. Download disease_normalizer_19.jar at [this URL](https://drive.google.com/open?id=1YbAanyQJ24PPBOu0NO8a1aCxWLdlQhk-) and place the file under normalization/resources/normalizers/disease directory.   \n2. Stop normalizers by running stop_normalizers.sh and restart the normalizers by running load_dicts.sh \n\n**Done - Server check 2019-07-18 8:20 AM - 1:30 PM (UTC-0)**\n\n![BERN](https://github.com/dmis-lab/bern/blob/master/bern_overview.jpg?raw=true)\n<p align=\"center\">Overview of BERN.</p>\n\nThe description below gives instructions on hosting your own BERN. Please refer to https://bern.korea.ac.kr for the RESTful Web service of BERN.\n\n## Requirements\n* Environment\n    * Python >= 3.6 \n    * CUDA 9 or higher\n* Main components\n    * [BioBERT NER models (Lee et al., 2019)](https://arxiv.org/abs/1901.08746)\n    * [tmTool APIs (Wei et al., 2016)](https://www.ncbi.nlm.nih.gov/research/bionlp/APIs/) \n    * [GNormPlus (Wei et al., 2015)](https://www.ncbi.nlm.nih.gov/research/bionlp/Tools/gnormplus/)\n    * [tmVar 2.0 (Wei et al., 2018)](https://www.ncbi.nlm.nih.gov/research/bionlp/Tools/tmvar/)\n    * [TensorFlow 1.13.1](https://github.com/tensorflow/tensorflow/releases/tag/v1.13.1)\n\nNote that you will need at least 66 GB of free disk space and 32 GB or more RAM.\n\n##  Installation\n* Clone this repo\n```\ncd\ngit clone https://github.com/dmis-lab/bern.git\n```\n\n* Install python packages\n```\npip3 install -r requirements.txt --user\n```\n\n* Install GNormPlus & run GNormPlusServer.jar\n    * FYI: Download Google Drive files with WGET: https://gist.github.com/iamtekeste/3cdfd0366ebfd2c0d805#gistcomment-2316906\n```\ncd ~/bern\nwget https://www.ncbi.nlm.nih.gov/CBBresearch/Lu/Demo/tmTools/download/GNormPlus/GNormPlusJava.zip\nunzip GNormPlusJava.zip\n\ncd GNormPlusJava\nwget -O ./crfpp-0.58.tar.gz https://drive.google.com/uc?id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ\ntar xvfz crfpp-0.58.tar.gz\ncp -rf CRF++-0.58/* CRF\ncd CRF\nsh ./configure\nmake\nsudo make install\n\ncd ..\nchmod 764 Ab3P\n# chmod 764 CRF/crf_test\n\n# Set FocusSpecies to 9606 (Human)\nsed -i 's/= All/= 9606/g' setup.txt; echo \"FocusSpecies: from All to 9606 (Human)\"\nsh Installation.sh\n\nrm -r CRF++-0.58\nrm crfpp-0.58.tar.gz\n\n# Download GNormPlusServer.jar\nwget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1g-JlhqeDIlZX5YFk8Y27_M8BXUXcQRSX' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1g-JlhqeDIlZX5YFk8Y27_M8BXUXcQRSX\" -O GNormPlusServer.jar && rm -rf /tmp/cookies.txt\n\n# Start GNormPlusServer\nnohup java -Xmx16G -Xms16G -jar GNormPlusServer.jar 18895 >> ~/bern/logs/nohup_gnormplus.out 2>&1 &\n```\n\n\n* Install tmVar2 & run tmVar2Server.jar\n```\ncd ~/bern\nwget ftp://ftp.ncbi.nlm.nih.gov/pub/lu/Suppl/tmVar2/tmVarJava.zip\nunzip tmVarJava.zip\n\ncd tmVarJava\nwget -O ./crfpp-0.58.tar.gz https://drive.google.com/uc?id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ\ntar xvfz crfpp-0.58.tar.gz\ncp -rf CRF++-0.58/* CRF\ncd CRF\nsh ./configure\nmake\nsudo make install\n\ncd ..\nchmod 764 CRF/crf_test\n\nsh Installation.sh\n\nrm -r CRF++-0.58\nrm crfpp-0.58.tar.gz\n\n# Download tmVar2Server.jar\nwget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1kQYzLHLFLsU9qKpRRGjXkIYmaYK6bPJm' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1kQYzLHLFLsU9qKpRRGjXkIYmaYK6bPJm\" -O tmVar2Server.jar && rm -rf /tmp/cookies.txt\n\n# Download dependencies\nwget https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.20.0/sqlite-jdbc-3.20.0.jar\nwget https://repo1.maven.org/maven2/edu/stanford/nlp/stanford-corenlp/3.5.2/stanford-corenlp-3.5.2.jar\n\n# Start tmVar2Server\nnohup java -Xmx8G -Xms8G -jar tmVar2Server.jar 18896 >> ~/bern/logs/nohup_tmvar.out 2>&1 &\n```\n \n* Download normalization resources and pre-trained BioBERT NER models\n```\ncd ~/bern/scripts\nsh download_norm.sh\nsh download_biobert_ner_models.sh\n```\n\n* Run named entity normalizers\n```\ncd ..\nsh load_dicts.sh\n```\n\n* Run BERN server\n```\n# Check your GPU number(s)\necho $CUDA_VISIBLE_DEVICES\n\n# Set your GPU number(s)\nexport CUDA_VISIBLE_DEVICES=0\n\n# Run BERN\n# Please check gnormplus_home directory and tmvar2_home directory.\nnohup python3 -u server.py --port 8888 --gnormplus_home ~/bern/GNormPlusJava --gnormplus_port 18895 --tmvar2_home ~/bern/tmVarJava --tmvar2_port 18896 >> logs/nohup_BERN.out 2>&1 &\n\n# Print logs\ntail -F logs/nohup_BERN.out\n```\n\n* Usage\n    * PMID(s) (HTTP GET)\n        * http://\\<YOUR_SERVER_ADDRESS>:8888/?pmid=\\<a PMID or comma seperate PMIDs>&format=\\<json or pubtator>\n        * Example: http://\\<YOUR_SERVER_ADDRESS>:8888/?pmid=30429607&format=json&indent=true\n        * Example: http://\\<YOUR_SERVER_ADDRESS>:8888/?pmid=30429607&format=pubtator\n        * Example: http://\\<YOUR_SERVER_ADDRESS>:8888/?pmid=30429607,29446767&format=json&indent=true\n    * Raw text (HTTP POST)\n        * POST Address: http://\\<YOUR_SERVER_ADDRESS>:8888\n        * Set key, value of a body as follows:          \n        ```\n        import requests\n        import json\n        body_data = {\"param\": json.dumps({\"text\": \"CLAPO syndrome: identification of somatic activating PIK3CA mutations and delineation of the natural history and phenotype. PURPOSE: CLAPO syndrome is a rare vascular disorder characterized by capillary malformation of the lower lip, lymphatic malformation predominant on the face and neck, asymmetry, and partial/generalized overgrowth. Here we tested the hypothesis that, although the genetic cause is not known, the tissue distribution of the clinical manifestations in CLAPO seems to follow a pattern of somatic mosaicism. METHODS: We clinically evaluated a cohort of 13 patients with CLAPO and screened 20 DNA blood/tissue samples from 9 patients using high-throughput, deep sequencing. RESULTS: We identified five activating mutations in the PIK3CA gene in affected tissues from 6 of the 9 patients studied; one of the variants (NM_006218.2:c.248T>C; p.Phe83Ser) has not been previously described in developmental disorders. CONCLUSION: We describe for the first time the presence of somatic activating PIK3CA mutations in patients with CLAPO. We also report an update of the phenotype and natural history of the syndrome.\"})}\n        response = requests.post('http://<YOUR_SERVER_ADDRESS>:8888', data=body_data)\n        result_dict = response.json()\n        print(result_dict)\n        ```\n\n## Result\n<details>\n    <summary>See a result example in JSON (PMID:29446767) </summary>\n<pre>\n[\n    {\n        \"denotations\": [\n            {\n                \"id\": [\n                    \"MESH:C567763\",\n                    \"BERN:262813101\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 0,\n                    \"end\": 13\n                }\n            },\n            {\n                \"id\": [\n                    \"MIM:171834\",\n                    \"HGNC:8975\",\n                    \"Ensembl:ENSG00000121879\",\n                    \"BERN:324295302\"\n                ],\n                \"obj\": \"gene\",\n                \"span\": {\n                    \"begin\": 53,\n                    \"end\": 58\n                }\n            },\n            {\n                \"id\": [\n                    \"MESH:C567763\",\n                    \"BERN:262813101\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 133,\n                    \"end\": 146\n                }\n            },\n            {\n                \"id\": [\n                    \"MESH:D014652\",\n                    \"BERN:256572101\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 158,\n                    \"end\": 174\n                }\n            },\n            {\n                \"id\": [\n                    \"MESH:C567763\",\n                    \"BERN:262813101\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 193,\n                    \"end\": 231\n                }\n            },\n            {\n                \"id\": [\n                    \"MESH:C567763\",\n                    \"BERN:262813101\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 234,\n                    \"end\": 288\n                }\n            },\n            {\n                \"id\": [\n                    \"MESH:C567763\",\n                    \"BERN:262813101\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 589,\n                    \"end\": 593\n                }\n            },\n            {\n                \"id\": [\n                    \"MIM:171834\",\n                    \"HGNC:8975\",\n                    \"Ensembl:ENSG00000121879\",\n                    \"BERN:324295302\"\n                ],\n                \"obj\": \"gene\",\n                \"span\": {\n                    \"begin\": 748,\n                    \"end\": 758\n                }\n            },\n            {\n                \"id\": [\n                    \"CUI-less\"\n                ],\n                \"mutationType\": \"ProteinMutation\",\n                \"normalizedName\": \"p.F83S;CorrespondingGene:5290\",\n                \"obj\": \"mutation\",\n                \"span\": {\n                    \"begin\": 857,\n                    \"end\": 866\n                }\n            },\n            {\n                \"id\": [\n                    \"BERN:257523801\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 906,\n                    \"end\": 928\n                }\n            },\n            {\n                \"id\": [\n                    \"CUI-less\"\n                ],\n                \"obj\": \"gene\",\n                \"span\": {\n                    \"begin\": 1009,\n                    \"end\": 1024\n                }\n            },\n            {\n                \"id\": [\n                    \"MESH:C567763\",\n                    \"BERN:262813101\"\n                ],\n                \"obj\": \"disease\",\n                \"span\": {\n                    \"begin\": 1043,\n                    \"end\": 1047\n                }\n            }\n        ],\n        \"elapsed_time\": {\n            \"ner\": 0.611,\n            \"normalization\": 0.218,\n            \"tmtool\": 1.281,\n            \"total\": 2.111\n        },\n        \"project\": \"BERN\",\n        \"sourcedb\": \"PubMed\",\n        \"sourceid\": \"29446767\",\n        \"text\": \"CLAPO syndrome: identification of somatic activating PIK3CA mutations and delineation of the natural history and phenotype. PURPOSE: CLAPO syndrome is a rare vascular disorder characterized by capillary malformation of the lower lip, lymphatic malformation predominant on the face and neck, asymmetry, and partial/generalized overgrowth. Here we tested the hypothesis that, although the genetic cause is not known, the tissue distribution of the clinical manifestations in CLAPO seems to follow a pattern of somatic mosaicism. METHODS: We clinically evaluated a cohort of 13 patients with CLAPO and screened 20 DNA blood/tissue samples from 9 patients using high-throughput, deep sequencing. RESULTS: We identified five activating mutations in the PIK3CA gene in affected tissues from 6 of the 9 patients studied; one of the variants (NM_006218.2:c.248T>C; p.Phe83Ser) has not been previously described in developmental disorders. CONCLUSION: We describe for the first time the presence of somatic activating PIK3CA mutations in patients with CLAPO. We also report an update of the phenotype and natural history of the syndrome.\",\n        \"timestamp\": \"Thu Jul 04 06:15:27 +0000 2019\"\n    }\n]\n</pre>\n</details>\n\n\n## Restart\n```\n# Start GNormPlusServer\ncd ~/bern/GNormPlusJava\nnohup java -Xmx16G -Xms16G -jar GNormPlusServer.jar 18895 >> ~/bern/logs/nohup_gnormplus.out 2>&1 &\n\n# Start tmVar2Server\ncd ~/bern/tmVarJava\nnohup java -Xmx8G -Xms8G -jar tmVar2Server.jar 18896 >> ~/bern/logs/nohup_tmvar.out 2>&1 &\n\n# Start normalizers\ncd ~/bern/\nsh load_dicts.sh\n\n# Check your GPU number(s)\necho $CUDA_VISIBLE_DEVICES\n\n# Set your GPU number(s)\nexport CUDA_VISIBLE_DEVICES=0\n\n# Run BERN\nnohup python3 -u server.py --port 8888 --gnormplus_home ~/bern/GNormPlusJava --gnormplus_port 18895 --tmvar2_home ~/bern/tmVarJava --tmvar2_port 18896 >> logs/nohup_BERN.out 2>&1 &\n\n# Print logs\ntail -F logs/nohup_BERN.out\n```\n\n\n## Troubleshooting\n* Trouble: It takes a long time to get results. \n    * Solution: Make sure TensorFlow is using a GPU.\n    For more details, visit https://stackoverflow.com/questions/42326748/tensorflow-on-gpu-no-known-devices-despite-cudas-devicequery-returning-a-pas/48079860#48079860\n\n## Monitoring\n* List processes (every 5s)\n```\nwatch -n 5 \"ps auxww | egrep 'python|java|node' | grep -v grep\"\n```\n\n* Periodic HTTPS GET checker\n    * Permission setting\n    ```\n    chmod +x scripts/bern_checker.sh\n    ```\n\n    * crontab (every 30 min)\n    ```\n    crontab -e\n    */30 * * * * /home/<YOUR_ACCOUNT>/bern/scripts/bern_checker.sh >> /home/<YOUR_ACCOUNT>/bern/logs/bern_checker.out 2>&1\n    ```\n\n## Bug report\nAdd a new issue to https://github.com/dmis-lab/bern/issues\n\n## Contact\ndonghyeon@korea.ac.kr\n\n## Citation\n* Please cite the following two papers if you use BERN on your work.\n```\n@article{kim2019neural,\n  title={A Neural Named Entity Recognition and Multi-Type Normalization Tool for Biomedical Text Mining},\n  author={Kim, Donghyeon and Lee, Jinhyuk and So, Chan Ho and Jeon, Hwisang and Jeong, Minbyul and Choi, Yonghwa and Yoon, Wonjin and Sung, Mujeen and and Kang, Jaewoo},\n  journal={IEEE Access},\n  volume={7},\n  pages={73729--73740},\n  year={2019},\n  publisher={IEEE}\n}\n\n@article{10.1093/bioinformatics/btz682,\n    author = {Lee, Jinhyuk and Yoon, Wonjin and Kim, Sungdong and Kim, Donghyeon and Kim, Sunkyu and So, Chan Ho and Kang, Jaewoo},\n    title = \"{BioBERT: a pre-trained biomedical language representation model for biomedical text mining}\",\n    journal = {Bioinformatics},\n    year = {2019},\n    month = {09},\n    issn = {1367-4803},\n    doi = {10.1093/bioinformatics/btz682},\n    url = {https://doi.org/10.1093/bioinformatics/btz682},\n}\n```\n"
  },
  {
    "path": "__init__.py",
    "content": ""
  },
  {
    "path": "biobert_ner/__init__.py",
    "content": ""
  },
  {
    "path": "biobert_ner/conf/bert_config.json",
    "content": "{\n  \"attention_probs_dropout_prob\": 0.1,\n  \"hidden_act\": \"gelu\",\n  \"hidden_dropout_prob\": 0.1,\n  \"hidden_size\": 768,\n  \"initializer_range\": 0.02,\n  \"intermediate_size\": 3072,\n  \"max_position_embeddings\": 512,\n  \"num_attention_heads\": 12,\n  \"num_hidden_layers\": 12,\n  \"type_vocab_size\": 2,\n  \"vocab_size\": 28996\n}\n"
  },
  {
    "path": "biobert_ner/conf/vocab.txt",
    "content": "[PAD]\n[unused1]\n[unused2]\n[unused3]\n[unused4]\n[unused5]\n[unused6]\n[unused7]\n[unused8]\n[unused9]\n[unused10]\n[unused11]\n[unused12]\n[unused13]\n[unused14]\n[unused15]\n[unused16]\n[unused17]\n[unused18]\n[unused19]\n[unused20]\n[unused21]\n[unused22]\n[unused23]\n[unused24]\n[unused25]\n[unused26]\n[unused27]\n[unused28]\n[unused29]\n[unused30]\n[unused31]\n[unused32]\n[unused33]\n[unused34]\n[unused35]\n[unused36]\n[unused37]\n[unused38]\n[unused39]\n[unused40]\n[unused41]\n[unused42]\n[unused43]\n[unused44]\n[unused45]\n[unused46]\n[unused47]\n[unused48]\n[unused49]\n[unused50]\n[unused51]\n[unused52]\n[unused53]\n[unused54]\n[unused55]\n[unused56]\n[unused57]\n[unused58]\n[unused59]\n[unused60]\n[unused61]\n[unused62]\n[unused63]\n[unused64]\n[unused65]\n[unused66]\n[unused67]\n[unused68]\n[unused69]\n[unused70]\n[unused71]\n[unused72]\n[unused73]\n[unused74]\n[unused75]\n[unused76]\n[unused77]\n[unused78]\n[unused79]\n[unused80]\n[unused81]\n[unused82]\n[unused83]\n[unused84]\n[unused85]\n[unused86]\n[unused87]\n[unused88]\n[unused89]\n[unused90]\n[unused91]\n[unused92]\n[unused93]\n[unused94]\n[unused95]\n[unused96]\n[unused97]\n[unused98]\n[unused99]\n[UNK]\n[CLS]\n[SEP]\n[MASK]\n[unused100]\n[unused101]\n!\n\"\n#\n$\n%\n&\n'\n(\n)\n*\n+\n,\n-\n.\n/\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n:\n;\n<\n=\n>\n?\n@\nA\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nL\nM\nN\nO\nP\nQ\nR\nS\nT\nU\nV\nW\nX\nY\nZ\n[\n\\\n]\n^\n_\n`\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz\n{\n|\n}\n~\n¡\n¢\n£\n¥\n§\n¨\n©\nª\n«\n¬\n®\n°\n±\n²\n³\n´\nµ\n¶\n·\n¹\nº\n»\n¼\n½\n¾\n¿\nÀ\nÁ\nÂ\nÄ\nÅ\nÆ\nÇ\nÈ\nÉ\nÍ\nÎ\nÑ\nÓ\nÖ\n×\nØ\nÚ\nÜ\nÞ\nß\nà\ná\nâ\nã\nä\nå\næ\nç\nè\né\nê\në\nì\ní\nî\nï\nð\nñ\nò\nó\nô\nõ\nö\n÷\nø\nù\nú\nû\nü\ný\nþ\nÿ\nĀ\nā\nă\ną\nĆ\nć\nČ\nč\nď\nĐ\nđ\nē\nė\nę\ně\nğ\nġ\nĦ\nħ\nĩ\nĪ\nī\nİ\nı\nļ\nĽ\nľ\nŁ\nł\nń\nņ\nň\nŋ\nŌ\nō\nŏ\nő\nŒ\nœ\nř\nŚ\nś\nŞ\nş\nŠ\nš\nŢ\nţ\nť\nũ\nū\nŭ\nů\nű\nų\nŵ\nŷ\nź\nŻ\nż\nŽ\nž\nƏ\nƒ\nơ\nư\nǎ\nǐ\nǒ\nǔ\nǫ\nȘ\nș\nȚ\nț\nɐ\nɑ\nɔ\nɕ\nə\nɛ\nɡ\nɣ\nɨ\nɪ\nɲ\nɾ\nʀ\nʁ\nʂ\nʃ\nʊ\nʋ\nʌ\nʐ\nʑ\nʒ\nʔ\nʰ\nʲ\nʳ\nʷ\nʻ\nʼ\nʾ\nʿ\nˈ\nː\nˡ\nˢ\nˣ\ń\ñ\n̍\n̯\n͡\nΑ\nΒ\nΓ\nΔ\nΕ\nΗ\nΘ\nΙ\nΚ\nΛ\nΜ\nΝ\nΟ\nΠ\nΣ\nΤ\nΦ\nΧ\nΨ\nΩ\nά\nέ\nή\nί\nα\nβ\nγ\nδ\nε\nζ\nη\nθ\nι\nκ\nλ\nμ\nν\nξ\nο\nπ\nρ\nς\nσ\nτ\nυ\nφ\nχ\nψ\nω\nό\nύ\nώ\nІ\nЈ\nА\nБ\nВ\nГ\nД\nЕ\nЖ\nЗ\nИ\nК\nЛ\nМ\nН\nО\nП\nР\nС\nТ\nУ\nФ\nХ\nЦ\nЧ\nШ\nЭ\nЮ\nЯ\nа\nб\nв\nг\nд\nе\nж\nз\nи\nй\nк\nл\nм\nн\nо\nп\nр\nс\nт\nу\nф\nх\nц\nч\nш\nщ\nъ\nы\nь\nэ\nю\nя\nё\nі\nї\nј\nњ\nћ\nԱ\nՀ\nա\nե\nի\nկ\nմ\nյ\nն\nո\nս\nտ\nր\nւ\nְ\nִ\nֵ\nֶ\nַ\nָ\nֹ\nּ\nא\nב\nג\nד\nה\nו\nז\nח\nט\nי\nכ\nל\nם\nמ\nן\nנ\nס\nע\nפ\nצ\nק\nר\nש\nת\n،\nء\nآ\nأ\nإ\nئ\nا\nب\nة\nت\nث\nج\nح\nخ\nد\nذ\nر\nز\nس\nش\nص\nض\nط\nظ\nع\nغ\nف\nق\nك\nل\nم\nن\nه\nو\nى\nي\nَ\nِ\nٹ\nپ\nچ\nک\nگ\nہ\nی\nے\nं\nआ\nक\nग\nच\nज\nण\nत\nद\nध\nन\nप\nब\nभ\nम\nय\nर\nल\nव\nश\nष\nस\nह\nा\nि\nी\nु\nे\nो\n्\n।\n॥\nআ\nই\nএ\nও\nক\nখ\nগ\nচ\nছ\nজ\nট\nত\nথ\nদ\nধ\nন\nপ\nব\nম\nয\nর\nল\nশ\nস\nহ\n়\nা\nি\nী\nু\nে\nো\n্\nয়\nக\nத\nப\nம\nய\nர\nல\nவ\nா\nி\nு\n்\nร\n་\nག\nང\nད\nན\nབ\nམ\nར\nལ\nས\nི\nུ\nེ\nོ\nა\nე\nი\nლ\nნ\nო\nრ\nს\nᴬ\nᴵ\nᵀ\nᵃ\nᵇ\nᵈ\nᵉ\nᵍ\nᵏ\nᵐ\nᵒ\nᵖ\nᵗ\nᵘ\nᵢ\nᵣ\nᵤ\nᵥ\nᶜ\nᶠ\nḍ\nḤ\nḥ\nḨ\nḩ\nḳ\nṃ\nṅ\nṇ\nṛ\nṣ\nṭ\nạ\nả\nấ\nầ\nẩ\nậ\nắ\nế\nề\nể\nễ\nệ\nị\nọ\nố\nồ\nổ\nộ\nớ\nờ\nợ\nụ\nủ\nứ\nừ\nử\nữ\nự\nỳ\nỹ\nἀ\nἐ\nὁ\nὐ\nὰ\nὶ\nὸ\nῆ\nῖ\nῦ\nῶ\n‐\n‑\n‒\n–\n—\n―\n‖\n‘\n’\n‚\n“\n”\n„\n†\n‡\n•\n…\n‰\n′\n″\n⁄\n⁰\nⁱ\n⁴\n⁵\n⁶\n⁷\n⁸\n⁹\n⁺\n⁻\nⁿ\n₀\n₁\n₂\n₃\n₄\n₅\n₆\n₇\n₈\n₉\n₊\n₍\n₎\nₐ\nₑ\nₒ\nₓ\nₕ\nₖ\nₘ\nₙ\nₚ\nₛ\nₜ\n₤\n€\n₱\n₹\nℓ\n№\nℝ\n⅓\n←\n↑\n→\n↔\n⇌\n⇒\n∂\n∈\n−\n∗\n∘\n√\n∞\n∧\n∨\n∩\n∪\n≈\n≠\n≡\n≤\n≥\n⊂\n⊆\n⊕\n⋅\n─\n│\n■\n●\n★\n☆\n☉\n♠\n♣\n♥\n♦\n♭\n♯\n⟨\n⟩\nⱼ\n、\n。\n《\n》\n「\n」\n『\n』\n〜\nい\nう\nえ\nお\nか\nき\nく\nけ\nこ\nさ\nし\nす\nせ\nそ\nた\nち\nつ\nて\nと\nな\nに\nの\nは\nひ\nま\nみ\nむ\nめ\nも\nや\nゆ\nよ\nら\nり\nる\nれ\nん\nア\nィ\nイ\nウ\nエ\nオ\nカ\nガ\nキ\nク\nグ\nコ\nサ\nシ\nジ\nス\nズ\nタ\nダ\nッ\nテ\nデ\nト\nド\nナ\nニ\nハ\nバ\nパ\nフ\nブ\nプ\nマ\nミ\nム\nャ\nュ\nラ\nリ\nル\nレ\nロ\nン\n・\nー\n一\n三\n上\n下\n中\n事\n二\n井\n京\n人\n亻\n仁\n佐\n侍\n光\n公\n力\n北\n十\n南\n原\n口\n史\n司\n吉\n同\n和\n囗\n国\n國\n土\n城\n士\n大\n天\n太\n夫\n女\n子\n宀\n安\n宮\n宿\n小\n尚\n山\n島\n川\n州\n平\n年\n心\n愛\n戸\n文\n新\n方\n日\n明\n星\n書\n月\n木\n本\n李\n村\n東\n松\n林\n正\n武\n氏\n水\n氵\n江\n河\n海\n版\n犬\n王\n生\n田\n白\n皇\n省\n真\n石\n社\n神\n竹\n美\n義\n花\n藤\n西\n谷\n車\n辶\n道\n郎\n郡\n部\n野\n金\n長\n門\n陽\n青\n食\n馬\n高\n龍\n龸\n사\n씨\n의\n이\n한\nﬁ\nﬂ\n！\n（\n）\n，\n－\n／\n：\nthe\nof\nand\nto\nin\nwas\nThe\nis\nfor\nas\non\nwith\nthat\n##s\nhis\nby\nhe\nat\nfrom\nit\nher\nHe\nhad\nan\nwere\nyou\nbe\nIn\nshe\nare\nbut\nwhich\nIt\nnot\nor\nhave\nmy\nhim\none\nthis\nme\nhas\nalso\nup\ntheir\nfirst\nout\nwho\nbeen\nthey\nShe\ninto\nall\nwould\nits\n##ing\ntime\ntwo\n##a\n##e\nsaid\nabout\nwhen\nover\nmore\nother\ncan\nafter\nback\nthem\nthen\n##ed\nthere\nlike\nso\nonly\n##n\ncould\n##d\n##i\n##y\nwhat\nno\n##o\nwhere\nThis\nmade\nthan\nif\nYou\n##ly\nthrough\nwe\nbefore\n##r\njust\nsome\n##er\nyears\ndo\nNew\n##t\ndown\nbetween\nnew\nnow\nwill\nthree\nmost\nOn\naround\nyear\nused\nsuch\nbeing\nwell\nduring\nThey\nknow\nagainst\nunder\nlater\ndid\npart\nknown\noff\nwhile\nHis\nre\n...\n##l\npeople\nuntil\nway\nAmerican\ndidn\nUniversity\nyour\nboth\nmany\nget\nUnited\nbecame\nhead\nThere\nsecond\nAs\nwork\nany\nBut\nstill\nagain\nborn\neven\neyes\nAfter\nincluding\nde\ntook\nAnd\nlong\nteam\nseason\nfamily\nsee\nright\nsame\ncalled\nname\nbecause\nfilm\ndon\n10\nfound\nmuch\nschool\n##es\ngoing\nwon\nplace\naway\nWe\nday\nleft\nJohn\n000\nhand\nsince\nWorld\nthese\nhow\nmake\nnumber\neach\nlife\narea\nman\nfour\ngo\nNo\nhere\nvery\nNational\n##m\nplayed\nreleased\nnever\nbegan\nStates\nalbum\nhome\nlast\ntoo\nheld\nseveral\nMay\nown\n##on\ntake\nend\nSchool\n##h\nll\nseries\nWhat\nwant\nuse\nanother\ncity\nWhen\n2010\nside\nAt\nmay\nThat\ncame\nface\nJune\nthink\ngame\nthose\nhigh\nMarch\nearly\nSeptember\n##al\n2011\nlooked\nJuly\nstate\nsmall\nthought\nwent\nJanuary\nOctober\n##u\nbased\nAugust\n##us\nworld\ngood\nApril\nYork\nus\n12\n2012\n2008\nFor\n2009\ngroup\nalong\nfew\nSouth\nlittle\n##k\nfollowing\nNovember\nsomething\n2013\nDecember\nset\n2007\nold\n2006\n2014\nlocated\n##an\nmusic\nCounty\nCity\nformer\n##in\nroom\nve\nnext\nAll\n##man\ngot\nfather\nhouse\n##g\nbody\n15\n20\n18\nstarted\nIf\n2015\ntown\nour\nline\nWar\nlarge\npopulation\nnamed\nBritish\ncompany\nmember\nfive\nMy\nsingle\n##en\nage\nState\nmoved\nFebruary\n11\nHer\nshould\ncentury\ngovernment\nbuilt\ncome\nbest\nshow\nHowever\nwithin\nlook\nmen\ndoor\nwithout\nneed\nwasn\n2016\nwater\nOne\nsystem\nknew\nevery\ndied\nLeague\nturned\nasked\nNorth\nSt\nwanted\nbuilding\nreceived\nsong\nserved\nthough\nfelt\n##ia\nstation\nband\n##ers\nlocal\npublic\nhimself\ndifferent\ndeath\nsay\n##1\n30\n##2\n2005\n16\nnight\nbehind\nchildren\nEnglish\nmembers\nnear\nsaw\ntogether\nson\n14\nvoice\nvillage\n13\nhands\nhelp\n##3\ndue\nFrench\nLondon\ntop\ntold\nopen\npublished\nthird\n2017\nplay\nacross\nDuring\nput\nfinal\noften\ninclude\n25\n##le\nmain\nhaving\n2004\nonce\never\nlet\nbook\nled\ngave\nlate\nfront\nfind\nclub\n##4\nGerman\nincluded\nspecies\nCollege\nform\nopened\nmother\nwomen\nenough\nWest\nmust\n2000\npower\nreally\n17\nmaking\nhalf\n##6\norder\nmight\n##is\ngiven\nmillion\ntimes\ndays\npoint\nfull\nservice\nWith\nkm\nmajor\n##7\noriginal\nbecome\nseen\nII\nnorth\nsix\n##te\nlove\n##0\nnational\nInternational\n##5\n24\nSo\nDistrict\nlost\nrun\ncouldn\ncareer\nalways\n##9\n2003\n##th\ncountry\n##z\nHouse\nair\ntell\nsouth\nworked\nwoman\nplayer\n##A\nalmost\nwar\nRiver\n##ic\nmarried\ncontinued\nThen\nJames\nclose\nblack\nshort\n##8\n##na\nusing\nhistory\nreturned\nlight\ncar\n##ra\nsure\nWilliam\nthings\nGeneral\n##ry\n2002\nbetter\nsupport\n100\namong\nFrom\nfeet\nKing\nanything\n21\n19\nestablished\ndistrict\n2001\nfeel\ngreat\n##ton\nlevel\nCup\nThese\nwritten\ngames\nothers\nalready\ntitle\nstory\n##p\nlaw\nthing\nUS\nrecord\nrole\nhowever\nBy\nstudents\nEngland\nwhite\ncontrol\nleast\ninside\nland\n##C\n22\ngive\ncommunity\nhard\n##ie\nnon\n##c\nproduced\nGeorge\nround\nperiod\nPark\nbusiness\nvarious\n##ne\ndoes\npresent\nwife\nfar\ntaken\nper\nreached\nDavid\nable\nversion\nworking\nyoung\nlive\ncreated\njoined\nEast\nliving\nappeared\ncase\nHigh\ndone\n23\nimportant\nPresident\nAward\nFrance\nposition\noffice\nlooking\ntotal\ngeneral\nclass\nTo\nproduction\n##S\nfootball\nparty\nbrother\nkeep\nmind\nfree\nStreet\nhair\nannounced\ndevelopment\neither\nnothing\nmoment\nChurch\nfollowed\nwrote\nwhy\nIndia\nSan\nelection\n1999\nlead\nHow\n##ch\n##rs\nwords\nEuropean\ncourse\nconsidered\nAmerica\narms\nArmy\npolitical\n##la\n28\n26\nwest\neast\nground\nfurther\nchurch\nless\nsite\nFirst\nNot\nAustralia\ntoward\nCalifornia\n##ness\ndescribed\nworks\nAn\nCouncil\nheart\npast\nmilitary\n27\n##or\nheard\nfield\nhuman\nsoon\nfounded\n1998\nplaying\ntrying\n##x\n##ist\n##ta\ntelevision\nmouth\nalthough\ntaking\nwin\nfire\nDivision\n##ity\nParty\nRoyal\nprogram\nSome\nDon\nAssociation\nAccording\ntried\nTV\nPaul\noutside\ndaughter\nBest\nWhile\nsomeone\nmatch\nrecorded\nCanada\nclosed\nregion\nAir\nabove\nmonths\nelected\n##da\n##ian\nroad\n##ar\nbrought\nmove\n1997\nleave\n##um\nThomas\n1996\nam\nlow\nRobert\nformed\nperson\nservices\npoints\nMr\nmiles\n##b\nstop\nrest\ndoing\nneeded\ninternational\nrelease\nfloor\nstart\nsound\ncall\nkilled\nreal\ndark\nresearch\nfinished\nlanguage\nMichael\nprofessional\nchange\nsent\n50\nupon\n29\ntrack\nhit\nevent\n2018\nterm\nexample\nGermany\nsimilar\nreturn\n##ism\nfact\npulled\nstood\nsays\nran\ninformation\nyet\nresult\ndeveloped\ngirl\n##re\nGod\n1995\nareas\nsigned\ndecided\n##ment\nCompany\nseemed\n##el\nco\nturn\nrace\ncommon\nvideo\nCharles\nIndian\n##ation\nblood\nart\nred\n##able\nadded\nrather\n1994\nmet\ndirector\naddition\ndesign\naverage\nminutes\n##ies\n##ted\navailable\nbed\ncoming\nfriend\nidea\nkind\nUnion\nRoad\nremained\n##ting\neverything\n##ma\nrunning\ncare\nfinally\nChinese\nappointed\n1992\nAustralian\n##ley\npopular\nmean\nteams\nprobably\n##land\nusually\nproject\nsocial\nChampionship\npossible\nword\nRussian\ninstead\nmi\nherself\n##T\nPeter\nHall\nCenter\nseat\nstyle\nmoney\n1993\nelse\nDepartment\ntable\nMusic\ncurrent\n31\nfeatures\nspecial\nevents\ncharacter\nTwo\nsquare\nsold\ndebut\n##v\nprocess\nAlthough\nSince\n##ka\n40\nCentral\ncurrently\neducation\nplaced\nlot\nChina\nquickly\nforward\nseven\n##ling\nEurope\narm\nperformed\nJapanese\n1991\nHenry\nNow\nDr\n##ion\nweek\nGroup\nmyself\nbig\nUK\nWashington\nten\ndeep\n1990\nClub\nJapan\nspace\nLa\ndirected\nsmile\nepisode\nhours\nwhole\n##de\n##less\nWhy\nwouldn\ndesigned\nstrong\ntraining\nchanged\nSociety\nstage\ninvolved\nhadn\ntowards\nleading\npolice\neight\nkept\nInstitute\nstudy\nlargest\nchild\neventually\nprivate\nmodern\nCourt\nthroughout\ngetting\noriginally\nattack\n##E\ntalk\nGreat\nlonger\nsongs\nalone\n##ine\nwide\ndead\nwalked\nshot\n##ri\nOh\nforce\n##st\nArt\ntoday\nfriends\nIsland\nRichard\n1989\ncenter\nconstruction\nbelieve\nsize\nWhite\nship\ncompleted\n##B\ngone\nJust\nrock\nsat\n##R\nradio\nbelow\nentire\nfamilies\nleague\nincludes\ntype\nlived\nofficial\nrange\nhold\nfeatured\nMost\n##ter\npresident\npassed\nmeans\n##f\nforces\nlips\nMary\nDo\nguitar\n##ce\nfood\nwall\nOf\nspent\nIts\nperformance\nhear\n##P\nWestern\nreported\nsister\n##et\nmorning\n##M\nespecially\n##ive\nMinister\nitself\npost\nbit\ngroups\n1988\n##tion\nBlack\n##ng\nWell\nraised\nsometimes\nCanadian\nParis\nSpanish\nreplaced\nschools\nAcademy\nleaving\ncentral\nfemale\nChristian\nJack\nwhose\ncollege\nonto\nprovided\n##D\n##ville\nplayers\nactually\nstopped\n##son\nMuseum\ndoesn\n##ts\nbooks\nfight\nallowed\n##ur\nbeginning\nRecords\nawarded\nparents\ncoach\n##os\nRed\nsaying\n##ck\nSmith\nYes\nLake\n##L\naircraft\n1987\n##ble\nprevious\nft\naction\nItalian\nAfrican\nhappened\nvocals\nAct\nfuture\ncourt\n##ge\n1986\ndegree\nphone\n##ro\nIs\ncountries\nwinning\nbreath\nLove\nriver\nmatter\nLord\nOther\nlist\nself\nparts\n##ate\nprovide\ncut\nshows\nplan\n1st\ninterest\n##ized\nAfrica\nstated\nSir\nfell\nowned\nearlier\nended\ncompetition\nattention\n1985\nlower\nnearly\nbad\nolder\nstay\nSaint\n##se\ncertain\n1984\nfingers\nblue\ntry\nfourth\nGrand\n##as\nking\n##nt\nmakes\nchest\nmovement\nstates\nmoving\ndata\nintroduced\nmodel\ndate\nsection\nLos\ndeal\n##I\nskin\nentered\nmiddle\nsuccess\nTexas\n##w\nsummer\nisland\n##N\nRepublic\nlength\nhusband\n1980\n##ey\nreason\nanyone\nforced\nvia\nbase\n500\njob\ncovered\nFestival\nRoman\nsuccessful\nrights\ncover\nMan\nwriting\nIreland\n##F\nrelated\ngoal\ntakes\nbuildings\ntrue\nweeks\n1983\nBecause\nopening\nnovel\nISBN\nmeet\ngold\n##ous\nmid\nkm²\nstanding\nFootball\nChicago\nshook\nwhom\n##ki\n1982\nDay\nfeeling\nscored\nboy\nhigher\nForce\nleader\nheavy\nfall\nquestion\nsense\narmy\nSecond\nenergy\nmeeting\nthemselves\nkill\n##am\nboard\ncensus\n##ya\n##ns\nmine\nmeant\nmarket\nrequired\nbattle\ncampaign\nattended\napproximately\nKingdom\nruns\nactive\n##ha\ncontract\nclear\npreviously\nhealth\n1979\nArts\ncomplete\nCatholic\ncouple\nunits\n##ll\n##ty\nCommittee\nshoulder\nsea\nsystems\nlisted\n##O\ncaught\ntournament\n##G\nnorthern\nauthor\nFilm\nYour\n##men\nholding\noffered\npersonal\n1981\nsouthern\nartist\ntraditional\nstudio\n200\ncapital\n##ful\nregular\nask\ngiving\norganization\nmonth\nnews\nAre\nread\nmanaged\nhelped\nstudied\nstudent\ndefeated\nnatural\nindustry\nYear\nnoted\ndecision\nGovernment\nquite\n##id\nsmiled\n1972\nMaybe\ntracks\n##ke\nMark\nal\nmedia\nengine\nhour\nTheir\nrelationship\nplays\nproperty\nstructure\n1976\nago\nHill\nMartin\n1978\nready\nMany\nLike\nBay\nimmediately\ngenerally\nItaly\nGreek\npractice\ncaused\ndivision\nsignificant\nJoseph\nspeed\nLet\nthinking\ncompletely\n1974\nprimary\nmostly\n##field\n##K\n1975\n##to\nEven\nwriter\n##led\ndropped\nmagazine\ncollection\nunderstand\nroute\nhighest\nparticular\nfilms\nlines\nnetwork\nScience\nloss\ncarried\ndirection\ngreen\n1977\nlocation\nproducer\naccording\nWomen\nQueen\nneck\nthus\nindependent\nview\n1970\nAngeles\nSoviet\ndistance\nproblem\nBoard\ntour\nwestern\nincome\nappearance\naccess\nMexico\nnodded\nstreet\nsurface\narrived\nbelieved\nOld\n1968\n1973\nbecoming\nwhether\n1945\nfigure\nsinger\nstand\nFollowing\nissue\nwindow\nwrong\npain\neveryone\nlives\nissues\npark\nslowly\nla\nact\n##va\nbring\nLee\noperations\nkey\ncomes\nfine\ncold\nfamous\nNavy\n1971\nMe\nadditional\nindividual\n##ner\nZealand\ngoals\ncounty\ncontains\nService\nminute\n2nd\nreach\ntalking\nparticularly\n##ham\nmovie\nDirector\nglass\npaper\nstudies\n##co\nrailway\nstandard\nEducation\n45\nrepresented\nChief\nLouis\nlaunched\nStar\nterms\n60\n1969\nexperience\nwatched\nAnother\nPress\nTom\nstaff\nstarting\nsubject\nbreak\nVirginia\nnine\neye\n##age\nevidence\nfoot\n##est\ncompanies\nPrince\n##V\ngun\ncreate\nBig\nPeople\nguy\nGreen\nsimply\nnumerous\n##line\nincreased\ntwenty\n##ga\n##do\n1967\naward\nofficer\nstone\nBefore\nmaterial\nNorthern\ngrew\nmale\nplant\nLife\nlegs\nstep\nAl\nunit\n35\nexcept\nanswer\n##U\nreport\nresponse\nEdward\ncommercial\nedition\ntrade\nscience\n##ca\nIrish\nLaw\nshown\nrate\nfailed\n##ni\nremains\nchanges\nmm\nlimited\nlarger\nLater\ncause\nwaiting\nTime\n##wood\ncost\nBill\nmanager\nactivities\nlikely\nallow\noperated\nretired\n##ping\n65\ndirectly\nWho\nassociated\neffect\nhell\nFlorida\nstraight\nhot\nValley\nmanagement\ngirls\nexpected\neastern\nMike\nchance\ncast\ncentre\nchair\nhurt\nproblems\n##li\nwalk\nprograms\nTeam\ncharacters\nBattle\nedge\npay\nmaybe\ncorner\nmajority\nmedical\nJoe\nSummer\n##io\nattempt\nPacific\ncommand\nRadio\n##by\nnames\nmunicipality\n1964\ntrain\neconomic\nBrown\nfeature\nsex\nsource\nagreed\nremember\nThree\n1966\n1965\nPennsylvania\nvictory\nsenior\nannual\nIII\nSouthern\nresults\nSam\nserving\nreligious\nJones\nappears\n##der\ndespite\nclaimed\nBoth\nmusical\nmatches\nfast\nsecurity\nselected\nYoung\ndouble\ncomplex\nhospital\nchief\nTimes\n##ve\nChampionships\nfilled\nPublic\nDespite\nbeautiful\nResearch\nplans\nProvince\n##ally\nWales\n##ko\nartists\nmetal\nnearby\nSpain\n##il\n32\nhouses\nsupported\npiece\n##no\nstared\nrecording\nnature\nlegal\nRussia\n##ization\nremaining\nlooks\n##sh\nbridge\ncloser\ncases\nscene\nmarriage\nLittle\n##é\nuses\nEarth\nspecific\nFrank\ntheory\nGood\ndiscovered\nreferred\nbass\nculture\nuniversity\npresented\nCongress\n##go\nmetres\ncontinue\n1960\nisn\nAwards\nmeaning\ncell\ncomposed\nseparate\nSeries\nforms\nBlue\ncross\n##tor\nincrease\ntest\ncomputer\nslightly\nWhere\nJewish\nTown\ntree\nstatus\n1944\nvariety\nresponsible\npretty\ninitially\n##way\nrealized\npass\nprovides\nCaptain\nAlexander\nrecent\nscore\nbroke\nScott\ndrive\nfinancial\nshowed\nLine\nstories\nordered\nsoldiers\ngenus\noperation\ngaze\nsitting\nsociety\nOnly\nhope\nactor\nfollow\nEmpire\nYeah\ntechnology\nhappy\nfocus\npolicy\nspread\nsituation\n##ford\n##ba\nMrs\nwatch\nCan\n1963\nCommission\ntouch\nearned\ntroops\nUnder\n1962\nindividuals\ncannot\n19th\n##lin\nmile\nexpression\nexactly\nsuddenly\nweight\ndance\nstepped\nplaces\nappear\ndifficult\nRailway\nanti\nnumbers\nkilometres\nstar\n##ier\ndepartment\nice\nBritain\nremoved\nOnce\n##lo\nBoston\nvalue\n##ant\nmission\ntrees\nOrder\nsports\njoin\nserve\nMajor\npoor\nPoland\nmainly\nTheatre\npushed\nStation\n##it\nLady\nfederal\nsilver\n##ler\nforeign\n##ard\nEastern\n##den\nbox\nhall\nsubsequently\nlies\nacquired\n1942\nancient\nCD\nHistory\nJean\nbeyond\n##ger\nEl\n##les\ngrowing\nchampionship\nnative\nParliament\nWilliams\nwatching\ndirect\noverall\noffer\nAlso\n80\nSecretary\nspoke\nLatin\nability\n##ated\nsafe\npresence\n##ial\nheaded\nregional\nplanned\n1961\nJohnson\nthroat\nconsists\n##W\nextended\nOr\nbar\nwalls\nChris\nstations\npolitician\nOlympics\ninfluence\nshare\nfighting\nspeak\nhundred\nCarolina\ndie\nstars\n##tic\ncolor\nChapter\n##ish\nfear\nsleep\ngoes\nFrancisco\noil\nBank\nsign\nphysical\n##berg\nDutch\nseasons\n##rd\nGames\nGovernor\nsorry\nlack\nCentre\nmemory\nbaby\nsmaller\ncharge\nDid\nmultiple\nships\nshirt\nAssembly\namount\nleaves\n3rd\nFoundation\nconditions\n1943\nRock\nDemocratic\nDaniel\n##at\nwinner\nproducts\n##ina\nstore\nlatter\nProfessor\ncivil\nprior\nhost\n1956\nsoft\nvote\nneeds\nEach\nrules\n1958\npressure\nletter\nnormal\nproposed\nlevels\nrecords\n1959\npaid\nintended\nVictoria\npurpose\nokay\nhistorical\nissued\n1980s\nbroadcast\nrule\nsimple\npicked\nfirm\nSea\n1941\nElizabeth\n1940\nserious\nfeaturing\nhighly\ngraduated\nmentioned\nchoice\n1948\nreplied\npercent\nScotland\n##hi\nfemales\nconstructed\n1957\nsettled\nSteve\nrecognized\ncities\ncrew\nglanced\nkiss\ncompeted\nflight\nknowledge\neditor\nMore\nConference\n##H\nfifth\nelements\n##ee\n##tes\nfunction\nnewspaper\nrecently\nMiss\ncultural\nbrown\ntwice\nOffice\n1939\ntruth\nCreek\n1946\nhouseholds\nUSA\n1950\nquality\n##tt\nborder\nseconds\ndestroyed\npre\nwait\nahead\nbuild\nimage\n90\ncars\n##mi\n33\npromoted\nprofessor\net\nbank\nmedal\ntext\nbroken\nMiddle\nrevealed\nsides\nwing\nseems\nchannel\n1970s\nBen\nloved\neffort\nofficers\nWill\n##ff\n70\nIsrael\nJim\nupper\nfully\nlabel\nJr\nassistant\npowerful\npair\npositive\n##ary\ngives\n1955\n20th\nraces\nremain\nkitchen\nprimarily\n##ti\nSydney\neasy\nTour\nwhispered\nburied\n300\nNews\nPolish\n1952\nDuke\nColumbia\nproduce\naccepted\n00\napproach\nminor\n1947\nSpecial\n44\nAsian\nbasis\nvisit\nFort\nCivil\nfinish\nformerly\nbeside\nleaned\n##ite\nmedian\nrose\ncoast\neffects\nsupposed\nCross\n##hip\nCorps\nresidents\nJackson\n##ir\nBob\nbasketball\n36\nAsia\nseem\nBishop\nBook\n##ber\nring\n##ze\nowner\nBBC\n##ja\ntransferred\nacting\nDe\nappearances\nwalking\nLe\npress\ngrabbed\n1954\nofficially\n1953\n##pe\nrisk\ntaught\nreview\n##X\nlay\n##well\ncouncil\nAvenue\nseeing\nlosing\nOhio\nSuper\nprovince\nones\ntravel\n##sa\nprojects\nequipment\nspot\nBerlin\nadministrative\nheat\npotential\nshut\ncapacity\nelections\ngrowth\nfought\nRepublican\nmixed\nAndrew\nteacher\nturning\nstrength\nshoulders\nbeat\nwind\n1949\nHealth\nfollows\ncamp\nsuggested\nperhaps\nAlex\nmountain\ncontact\ndivided\ncandidate\nfellow\n34\nShow\nnecessary\nworkers\nball\nhorse\nways\nquestions\nprotect\ngas\nactivity\nyounger\nbottom\nfounder\nScottish\nscreen\ntreatment\neasily\ncom\n##house\ndedicated\nMaster\nwarm\nNight\nGeorgia\nLong\nvon\n##me\nperfect\nwebsite\n1960s\npiano\nefforts\n##ide\nTony\nsort\noffers\nDevelopment\nSimon\nexecutive\n##nd\nsave\nOver\nSenate\n1951\n1990s\ndraw\nmaster\nPolice\n##ius\nrenamed\nboys\ninitial\nprominent\ndamage\nCo\n##ov\n##za\nonline\nbegin\noccurred\ncaptured\nyouth\nTop\naccount\ntells\nJustice\nconducted\nforest\n##town\nbought\nteeth\nJersey\n##di\npurchased\nagreement\nMichigan\n##ure\ncampus\nprison\nbecomes\nproduct\nsecret\nguess\nRoute\nhuge\ntypes\ndrums\n64\nsplit\ndefeat\nestate\nhousing\n##ot\nbrothers\nCoast\ndeclared\nhappen\ntitled\ntherefore\nsun\ncommonly\nalongside\nStadium\nlibrary\nHome\narticle\nsteps\ntelling\nslow\nassigned\nrefused\nlaughed\nwants\nNick\nwearing\nRome\nOpen\n##ah\nHospital\npointed\nTaylor\nlifted\nescape\nparticipated\n##j\ndrama\nparish\nSanta\n##per\norganized\nmass\npick\nAirport\ngets\nLibrary\nunable\npull\nLive\n##ging\nsurrounding\n##ries\nfocused\nAdam\nfacilities\n##ning\n##ny\n38\n##ring\nnotable\nera\nconnected\ngained\noperating\nlaid\nRegiment\nbranch\ndefined\nChristmas\nmachine\nFour\nacademic\nIran\nadopted\nconcept\nMen\ncompared\nsearch\ntraffic\nMax\nMaria\ngreater\n##ding\nwidely\n##burg\nserves\n1938\n37\nGo\nhotel\nshared\ntypically\nscale\n1936\nleg\nsuffered\nyards\npieces\nMinistry\nWilson\nepisodes\nempty\n1918\nsafety\ncontinues\nyellow\nhistoric\nsettlement\n400\nCome\nCorporation\nenemy\ncontent\npicture\nevening\nterritory\nmethod\ntrial\nsolo\ndriver\nHere\n##ls\nentrance\nPrize\nspring\nwhatever\n##ent\n75\n##ji\nreading\nArthur\n##cy\nOur\nclothes\nPrime\nIllinois\nKong\ncode\n##ria\nsit\nHarry\nFederal\nchosen\nadministration\nbodies\nbegins\nstomach\nThough\nseats\nHong\ndensity\nSun\nleaders\nField\nmuseum\nchart\nplatform\nlanguages\n##ron\nbirth\nholds\nGold\n##un\nfish\ncombined\n##ps\n4th\n1937\nlargely\ncaptain\ntrust\nGame\nvan\nboat\nOxford\nbasic\nbeneath\nIslands\npainting\nnice\nToronto\npath\nmales\nsources\nblock\nconference\nparties\nmurder\nclubs\ncrowd\ncalling\nAbout\nBusiness\npeace\nknows\nlake\nspeaking\nstayed\nBrazil\nallowing\nBorn\nunique\nthick\nTechnology\n##que\nreceive\ndes\nsemi\nalive\nnoticed\nformat\n##ped\ncoffee\ndigital\n##ned\nhanded\nguard\ntall\nfaced\nsetting\nplants\npartner\nclaim\nreduced\ntemple\nanimals\ndetermined\nclasses\n##out\nestimated\n##ad\nOlympic\nproviding\nMassachusetts\nlearned\nInc\nPhiladelphia\nSocial\ncarry\n42\npossibly\nhosted\ntonight\nrespectively\nToday\nshape\nMount\nroles\ndesignated\nbrain\netc\nKorea\nthoughts\nBrian\nHighway\ndoors\nbackground\ndrew\nmodels\nfootballer\ntone\nturns\n1935\nquiet\ntower\nwood\nbus\nwrite\nsoftware\nweapons\nflat\nmarked\n1920\nnewly\ntight\nEric\nfinger\nJournal\nFC\nVan\nrise\ncritical\nAtlantic\ngranted\nreturning\ncommunities\nhumans\nquick\n39\n48\nranked\nsight\npop\nSwedish\nStephen\ncard\nanalysis\nattacked\n##wa\nSunday\nidentified\nJason\nchampion\nsituated\n1930\nexpanded\ntears\n##nce\nreaching\nDavis\nprotection\nEmperor\npositions\nnominated\nBridge\ntax\ndress\nallows\navoid\nleadership\nkilling\nactress\nguest\nsteel\nknowing\nelectric\ncells\ndisease\ngrade\nunknown\n##ium\nresulted\nPakistan\nconfirmed\n##ged\ntongue\ncovers\n##Y\nroof\nentirely\napplied\nvotes\ndrink\ninterview\nexchange\nTownship\nreasons\n##ised\npage\ncalls\ndog\nagent\nnose\nteaching\n##ds\n##ists\nadvanced\nwish\nGolden\nexisting\nvehicle\ndel\n1919\ndevelop\nattacks\npressed\nSports\nplanning\nresulting\nfacility\nSarah\nnotes\n1933\nClass\nHistoric\nwinter\n##mo\naudience\nCommunity\nhousehold\nNetherlands\ncreation\n##ize\nkeeping\n1914\nclaims\ndry\nguys\nopposite\n##ak\nexplained\nOntario\nsecondary\ndifference\nFrancis\nactions\norganizations\nyard\nanimal\nUp\nLewis\ntitles\nSeveral\n1934\nRyan\n55\nSupreme\nrolled\n1917\ndistribution\nfigures\nafraid\nrural\nyourself\n##rt\nsets\nbarely\nInstead\npassing\nawards\n41\nsilence\nauthority\noccupied\nenvironment\nwindows\nengineering\nsurprised\nflying\ncrime\nreports\nMountain\npowers\ndriving\nsucceeded\nreviews\n1929\nHead\nmissing\nSong\nJesus\nopportunity\ninspired\nends\nalbums\nconversation\nimpact\ninjury\nsurprise\nbillion\nlearning\nheavily\noldest\nunion\ncreating\n##ky\nfestival\nliterature\nletters\nsexual\n##tte\napartment\nFinal\ncomedy\nnation\norders\n##sen\ncontemporary\nPower\ndrawn\nexistence\nconnection\n##ating\nPost\nJunior\nremembered\nmessage\nMedal\ncastle\nnote\nengineer\nsounds\nBeach\ncrossed\n##dy\near\nscientific\nsales\n##ai\ntheme\nstarts\nclearly\n##ut\ntrouble\n##gan\nbag\n##han\nBC\nsons\n1928\nsilent\nversions\ndaily\nStudies\nending\nRose\nguns\n1932\nheadquarters\nreference\nobtained\nSquadron\nconcert\nnone\ndu\nAmong\n##don\nprevent\nMember\nanswered\nstaring\nBetween\n##lla\nportion\ndrug\nliked\nassociation\nperformances\nNations\nformation\nCastle\nlose\nlearn\nscoring\nrelatively\nquarter\n47\nPremier\n##ors\nSweden\nbaseball\nattempted\ntrip\nworth\nperform\nairport\nfields\nenter\nhonor\nMedical\nrear\ncommander\nofficials\ncondition\nsupply\nmaterials\n52\nAnna\nvolume\nthrew\nPersian\n43\ninterested\nGallery\nachieved\nvisited\nlaws\nrelief\nArea\nMatt\nsingles\nLieutenant\nCountry\nfans\nCambridge\nsky\nMiller\neffective\ntradition\nPort\n##ana\nminister\nextra\nentitled\nSystem\nsites\nauthorities\nacres\ncommittee\nracing\n1931\ndesk\ntrains\nass\nweren\nFamily\nfarm\n##ance\nindustrial\n##head\niron\n49\nabandoned\nOut\nHoly\nchairman\nwaited\nfrequently\ndisplay\nLight\ntransport\nstarring\nPatrick\nEngineering\neat\nFM\njudge\nreaction\ncenturies\nprice\n##tive\nKorean\ndefense\nGet\narrested\n1927\nsend\nurban\n##ss\npilot\nOkay\nMedia\nreality\narts\nsoul\nthirty\n##be\ncatch\ngeneration\n##nes\napart\nAnne\ndrop\nSee\n##ving\nsixth\ntrained\nManagement\nmagic\ncm\nheight\nFox\nIan\nresources\nvampire\nprincipal\nWas\nhaven\n##au\nWalter\nAlbert\nrich\n1922\ncausing\nentry\n##ell\nshortly\n46\nworry\ndoctor\ncomposer\nrank\nNetwork\nbright\nshowing\nregions\n1924\nwave\ncarrying\nkissed\nfinding\nmissed\nEarl\nlying\ntarget\nvehicles\nMilitary\ncontrolled\ndinner\n##board\nbriefly\nlyrics\nmotion\nduty\nstrange\nattempts\ninvited\nkg\nvillages\n5th\nLand\n##mer\nChrist\nprepared\ntwelve\ncheck\nthousand\nearth\ncopies\nen\ntransfer\ncitizens\nAmericans\npolitics\nnor\ntheatre\nProject\n##bo\nclean\nrooms\nlaugh\n##ran\napplication\ncontained\nanyway\ncontaining\nSciences\n1925\nrare\nspeech\nexist\n1950s\nfalling\npassenger\n##im\nstands\n51\n##ol\n##ow\nphase\ngovernor\nkids\ndetails\nmethods\nVice\nemployed\nperforming\ncounter\nJane\nheads\nChannel\nwine\nopposition\naged\n1912\nEvery\n1926\nhighway\n##ura\n1921\naired\n978\npermanent\nForest\nfinds\njoint\napproved\n##pur\nbrief\ndoubt\nacts\nbrand\nwild\nclosely\nFord\nKevin\nchose\nshall\nport\nsweet\nfun\nasking\nBe\n##bury\nsought\nDave\nMexican\nmom\nRight\nHoward\nMoscow\nCharlie\nStone\n##mann\nadmitted\n##ver\nwooden\n1923\nOfficer\nrelations\nHot\ncombat\npublication\nchain\nshop\ninhabitants\nproved\nideas\naddress\n1915\nMemorial\nexplain\nincreasing\nconflict\nAnthony\nMelbourne\nnarrow\ntemperature\nslid\n1916\nworse\nselling\ndocumentary\nAli\nRay\nopposed\nvision\ndad\nextensive\nInfantry\ncommissioned\nDoctor\noffices\nprogramming\ncore\nrespect\nstorm\n##pa\n##ay\n##om\npromotion\nder\nstruck\nanymore\nshit\nRegion\nreceiving\nDVD\nalternative\n##ue\nride\nmaximum\n1910\n##ious\nThird\nAffairs\ncancer\nExecutive\n##op\ndream\n18th\nDue\n##ker\n##worth\neconomy\nIV\nBillboard\nidentity\nsubsequent\nstatement\nskills\n##back\nfunding\n##ons\nRound\nForeign\ntruck\nPlease\nlights\nwondered\n##ms\nframe\nyes\nStill\ndistricts\nfiction\nColonel\nconverted\n150\ngrown\naccident\ncritics\nfit\nInformation\narchitecture\nPoint\nFive\narmed\nBilly\npoet\nfunctions\nconsisted\nsuit\nTurkish\nBand\nobject\ndesire\n##ities\nsounded\nflow\nNorwegian\narticles\nMarie\npulling\nthin\nsinging\nHunter\nHuman\nBattalion\nFederation\nKim\norigin\nrepresent\ndangerous\nweather\nfuel\nex\n##sing\nLast\nbedroom\naid\nknees\nAlan\nangry\nassumed\nplane\nSomething\nfounding\nconcerned\nglobal\nFire\ndi\nplease\nPortuguese\ntouched\nRoger\nnuclear\nRegister\nJeff\nfixed\nroyal\nlie\nfinals\nNFL\nManchester\ntowns\nhandle\nshaped\nChairman\nDean\nlaunch\nunderstanding\nChildren\nviolence\nfailure\nsector\nBrigade\nwrapped\nfired\nsharp\ntiny\ndeveloping\nexpansion\nFree\ninstitutions\ntechnical\nNothing\notherwise\nMain\ninch\nSaturday\nwore\nSenior\nattached\ncheek\nrepresenting\nKansas\n##chi\n##kin\nactual\nadvantage\nDan\nAustria\n##dale\nhoped\nmulti\nsquad\nNorway\nstreets\n1913\nServices\nhired\ngrow\npp\nwear\npainted\nMinnesota\nstuff\nBuilding\n54\nPhilippines\n1900\n##ties\neducational\nKhan\nMagazine\n##port\nCape\nsignal\nGordon\nsword\nAnderson\ncool\nengaged\nCommander\nimages\nUpon\ntied\nSecurity\ncup\nrail\nVietnam\nsuccessfully\n##red\nMuslim\ngain\nbringing\nNative\nhers\noccurs\nnegative\nPhilip\nKelly\nColorado\ncategory\n##lan\n600\nHave\nsupporting\nwet\n56\nstairs\nGrace\nobserved\n##ung\nfunds\nrestaurant\n1911\nJews\n##ments\n##che\nJake\nBack\n53\nasks\njournalist\naccept\nbands\nbronze\nhelping\n##ice\ndecades\nmayor\nsurvived\nusual\ninfluenced\nDouglas\nHey\n##izing\nsurrounded\nretirement\nTemple\nderived\nPope\nregistered\nproducing\n##ral\nstructures\nJohnny\ncontributed\nfinishing\nbuy\nspecifically\n##king\npatients\nJordan\ninternal\nregarding\nSamuel\nClark\n##q\nafternoon\nFinally\nscenes\nnotice\nrefers\nquietly\nthreat\nWater\nThose\nHamilton\npromise\nfreedom\nTurkey\nbreaking\nmaintained\ndevice\nlap\nultimately\nChampion\nTim\nBureau\nexpressed\ninvestigation\nextremely\ncapable\nqualified\nrecognition\nitems\n##up\nIndiana\nadult\nrain\ngreatest\narchitect\nMorgan\ndressed\nequal\nAntonio\ncollected\ndrove\noccur\nGrant\ngraduate\nanger\nSri\nworried\nstandards\n##ore\ninjured\nsomewhere\ndamn\nSingapore\nJimmy\npocket\nhomes\nstock\nreligion\naware\nregarded\nWisconsin\n##tra\npasses\nfresh\n##ea\nargued\nLtd\nEP\nDiego\nimportance\nCensus\nincident\nEgypt\nMissouri\ndomestic\nleads\nceremony\nEarly\ncamera\nFather\nchallenge\nSwitzerland\nlands\nfamiliar\nhearing\nspend\neducated\nTennessee\nThank\n##ram\nThus\nconcern\nputting\ninches\nmap\nclassical\nAllen\ncrazy\nvalley\nSpace\nsoftly\n##my\npool\nworldwide\nclimate\nexperienced\nneighborhood\nscheduled\nneither\nfleet\n1908\nGirl\n##J\nPart\nengines\nlocations\ndarkness\nRevolution\nestablishment\nlawyer\nobjects\napparently\nQueensland\nEntertainment\nbill\nmark\nTelevision\n##ong\npale\ndemand\nHotel\nselection\n##rn\n##ino\nLabour\nLiberal\nburned\nMom\nmerged\nArizona\nrequest\n##lia\n##light\nhole\nemployees\n##ical\nincorporated\n95\nindependence\nWalker\ncovering\njoining\n##ica\ntask\npapers\nbacking\nsell\nbiggest\n6th\nstrike\nestablish\n##ō\ngently\n59\nOrchestra\nWinter\nprotein\nJuan\nlocked\ndates\nBoy\naren\nshooting\nLuke\nsolid\ncharged\nPrior\nresigned\ninterior\ngarden\nspoken\nimprove\nwonder\npromote\nhidden\n##med\ncombination\nHollywood\nSwiss\nconsider\n##ks\nLincoln\nliterary\ndrawing\nMarine\nweapon\nVictor\nTrust\nMaryland\nproperties\n##ara\nexhibition\nunderstood\nhung\nTell\ninstalled\nloud\nfashion\naffected\njunior\nlanding\nflowers\n##he\nInternet\nbeach\nHeart\ntries\nMayor\nprogramme\n800\nwins\nnoise\n##ster\n##ory\n58\ncontain\nfair\ndelivered\n##ul\nwedding\nSquare\nadvance\nbehavior\nProgram\nOregon\n##rk\nresidence\nrealize\ncertainly\nhill\nHouston\n57\nindicated\n##water\nwounded\nVillage\nmassive\nMoore\nthousands\npersonnel\ndating\nopera\npoetry\n##her\ncauses\nfeelings\nFrederick\napplications\npush\napproached\nfoundation\npleasure\nsale\nfly\ngotten\nnortheast\ncosts\nraise\npaintings\n##ney\nviews\nhorses\nformal\nArab\nhockey\ntypical\nrepresentative\nrising\n##des\nclock\nstadium\nshifted\nDad\npeak\nFame\nvice\ndisappeared\nusers\nWay\nNaval\nprize\nhoping\nvalues\nevil\nBell\nconsisting\n##ón\nRegional\n##ics\nimproved\ncircle\ncarefully\nbroad\n##ini\nFine\nmaintain\noperate\noffering\nmention\nDeath\nstupid\nThrough\nPrincess\nattend\ninterests\nruled\nsomewhat\nwings\nroads\ngrounds\n##ual\nGreece\nChampions\nfacing\nhide\nvoted\nrequire\nDark\nMatthew\ncredit\nsighed\nseparated\nmanner\n##ile\nBoys\n1905\ncommitted\nimpossible\nlip\ncandidates\n7th\nBruce\narranged\nIslamic\ncourses\ncriminal\n##ened\nsmell\n##bed\n08\nconsecutive\n##ening\nproper\npurchase\nweak\nPrix\n1906\naside\nintroduction\nLook\n##ku\nchanging\nbudget\nresistance\nfactory\nForces\nagency\n##tone\nnorthwest\nuser\n1907\nstating\n##one\nsport\nDesign\nenvironmental\ncards\nconcluded\nCarl\n250\naccused\n##ology\nGirls\nsick\nintelligence\nMargaret\nresponsibility\nGuard\n##tus\n17th\nsq\ngoods\n1909\nhate\n##ek\ncapture\nstores\nGray\ncomic\nModern\nSilver\nAndy\nelectronic\nwheel\n##ied\nDeputy\n##bs\nCzech\nzone\nchoose\nconstant\nreserve\n##lle\nTokyo\nspirit\nsub\ndegrees\nflew\npattern\ncompete\nDance\n##ik\nsecretary\nImperial\n99\nreduce\nHungarian\nconfused\n##rin\nPierre\ndescribes\nregularly\nRachel\n85\nlanded\npassengers\n##ise\n##sis\nhistorian\nmeters\nYouth\n##ud\nparticipate\n##cing\narrival\ntired\nMother\n##gy\njumped\nKentucky\nfaces\nfeed\nIsraeli\nOcean\n##Q\n##án\nplus\nsnow\ntechniques\nplate\nsections\nfalls\njazz\n##ris\ntank\nloan\nrepeated\nopinion\n##res\nunless\nrugby\njournal\nLawrence\nmoments\nshock\ndistributed\n##ded\nadjacent\nArgentina\ncrossing\nuncle\n##ric\nDetroit\ncommunication\nmental\ntomorrow\nsession\nEmma\nWithout\n##gen\nMiami\ncharges\nAdministration\nhits\ncoat\nprotected\nCole\ninvasion\npriest\n09\nGary\nenjoyed\nplot\nmeasure\nbound\nfriendly\nthrow\nmusician\n##lon\n##ins\nAge\nknife\ndamaged\nbirds\ndriven\nlit\nears\nbreathing\nArabic\nJan\nfaster\nJonathan\n##gate\nIndependent\nstarred\nHarris\nteachers\nAlice\nsequence\nmph\nfile\ntranslated\ndecide\ndetermine\nReview\ndocuments\nsudden\nthreatened\n##ft\nbear\ndistinct\ndecade\nburning\n##sky\n1930s\nreplace\nbegun\nextension\n##time\n1904\nequivalent\naccompanied\nChristopher\nDanish\n##ye\nBesides\n##more\npersons\nfallen\nRural\nroughly\nsaved\nwilling\nensure\nBelgium\n05\nmusicians\n##ang\ngiant\nSix\nRetrieved\nworst\npurposes\n##bly\nmountains\nseventh\nslipped\nbrick\n07\n##py\nsomehow\nCarter\nIraq\ncousin\nfavor\nislands\njourney\nFIFA\ncontrast\nplanet\nvs\ncalm\n##ings\nconcrete\nbranches\ngray\nprofit\nRussell\n##ae\n##ux\n##ens\nphilosophy\nbusinesses\ntalked\nparking\n##ming\nowners\nPlace\n##tle\nagricultural\nKate\n06\nsoutheast\ndraft\nEddie\nearliest\nforget\nDallas\nCommonwealth\nedited\n66\ninner\ned\noperates\n16th\nHarvard\nassistance\n##si\ndesigns\nTake\nbathroom\nindicate\nCEO\nCommand\nLouisiana\n1902\nDublin\nBooks\n1901\ntropical\n1903\n##tors\nPlaces\ntie\nprogress\nforming\nsolution\n62\nletting\n##ery\nstudying\n##jo\nduties\nBaseball\ntaste\nReserve\n##ru\nAnn\n##gh\nvisible\n##vi\nnotably\nlink\nNCAA\nsouthwest\nNever\nstorage\nmobile\nwriters\nfavorite\nPro\npages\ntruly\ncount\n##tta\nstring\nkid\n98\nRoss\nrow\n##idae\nKennedy\n##tan\nHockey\nhip\nwaist\ngrandfather\nlisten\n##ho\nfeels\nbusy\n72\nstream\nobvious\ncycle\nshaking\nKnight\n##ren\nCarlos\npainter\ntrail\nweb\nlinked\n04\nPalace\nexisted\n##ira\nresponded\nclosing\nEnd\nexamples\nMarshall\nweekend\njaw\nDenmark\nlady\ntownship\nmedium\nchin\nStory\noption\nfifteen\nMoon\nrepresents\nmakeup\ninvestment\njump\nchildhood\nOklahoma\nroll\nnormally\nTen\nOperation\nGraham\nSeattle\nAtlanta\npaused\npromised\nrejected\ntreated\nreturns\nflag\n##ita\nHungary\ndanger\nglad\nmovements\nvisual\nsubjects\ncredited\nsoldier\nNorman\nill\ntranslation\nJosé\nQuebec\nmedicine\nwarning\ntheater\npraised\nmunicipal\n01\ncommune\nchurches\nacid\nfolk\n8th\ntesting\nadd\nsurvive\nSound\ndevices\nresidential\nsevere\npresidential\nMississippi\nAustin\nPerhaps\nCharlotte\nhanging\nMontreal\ngrin\n##ten\nracial\npartnership\nshoot\nshift\n##nie\nLes\ndowntown\nBrothers\nGarden\nmatters\nrestored\nmirror\nforever\nwinners\nrapidly\npoverty\n##ible\nUntil\nDC\nfaith\nhundreds\nReal\nUkraine\nNelson\nbalance\nAdams\ncontest\nrelative\nethnic\nEdinburgh\ncomposition\n##nts\nemergency\n##van\nmarine\nreputation\nDown\npack\n12th\nCommunist\nMountains\npro\nstages\nmeasures\n##ld\nABC\nLi\nvictims\nbenefit\nIowa\nBroadway\ngathered\nrating\nDefense\nclassic\n##ily\nceiling\n##ions\nsnapped\nEverything\nconstituency\nFranklin\nThompson\nStewart\nentering\nJudge\nforth\n##sk\nwanting\nsmiling\nmoves\ntunnel\npremiered\ngrass\nunusual\nUkrainian\nbird\nFriday\ntail\nPortugal\ncoal\nelement\nFred\nguards\nSenator\ncollaboration\nbeauty\nWood\nchemical\nbeer\njustice\nsigns\n##Z\nsees\n##zi\nPuerto\n##zed\n96\nsmooth\nBowl\ngift\nlimit\n97\nheading\nSource\nwake\nrequires\nEd\nConstitution\nfactor\nLane\nfactors\nadding\nNote\ncleared\npictures\npink\n##ola\nKent\nLocal\nSingh\nmoth\nTy\n##ture\ncourts\nSeven\ntemporary\ninvolving\nVienna\nemerged\nfishing\nagree\ndefensive\nstuck\nsecure\nTamil\n##ick\nbottle\n03\nPlayer\ninstruments\nSpring\npatient\nflesh\ncontributions\ncry\nMalaysia\n120\nGlobal\nda\nAlabama\nWithin\n##work\ndebuted\nexpect\nCleveland\nconcerns\nretained\nhorror\n10th\nspending\nPeace\nTransport\ngrand\nCrown\ninstance\ninstitution\nacted\nHills\nmounted\nCampbell\nshouldn\n1898\n##ably\nchamber\nsoil\n88\nEthan\nsand\ncheeks\n##gi\nmarry\n61\nweekly\nclassification\nDNA\nElementary\nRoy\ndefinitely\nSoon\nRights\ngate\nsuggests\naspects\nimagine\ngolden\nbeating\nStudios\nWarren\ndifferences\nsignificantly\nglance\noccasionally\n##od\nclothing\nAssistant\ndepth\nsending\npossibility\nmode\nprisoners\nrequirements\ndaughters\ndated\nRepresentatives\nprove\nguilty\ninteresting\nsmoke\ncricket\n93\n##ates\nrescue\nConnecticut\nunderground\nOpera\n13th\nreign\n##ski\nthanks\nleather\nequipped\nroutes\nfan\n##ans\nscript\nWright\nbishop\nWelsh\njobs\nfaculty\neleven\nRailroad\nappearing\nanniversary\nUpper\n##down\nanywhere\nRugby\nMetropolitan\nMeanwhile\nNicholas\nchampions\nforehead\nmining\ndrinking\n76\nJerry\nmembership\nBrazilian\nWild\nRio\nscheme\nUnlike\nstrongly\n##bility\nfill\n##rian\neasier\nMP\nHell\n##sha\nStanley\nbanks\nBaron\n##ique\nRobinson\n67\nGabriel\nAustrian\nWayne\nexposed\n##wan\nAlfred\n1899\nmanage\nmix\nvisitors\neating\n##rate\nSean\ncommission\nCemetery\npolicies\nCamp\nparallel\ntraveled\nguitarist\n02\nsupplies\ncouples\npoem\nblocks\nRick\nTraining\nEnergy\nachieve\nappointment\nWing\nJamie\n63\nnovels\n##em\n1890\nsongwriter\nBase\nJay\n##gar\nnaval\nscared\nmiss\nlabor\ntechnique\ncrisis\nAdditionally\nbacked\ndestroy\nseriously\ntools\ntennis\n91\ngod\n##ington\ncontinuing\nsteam\nobviously\nBobby\nadapted\nfifty\nenjoy\nJacob\npublishing\ncolumn\n##ular\nBaltimore\nDonald\nLiverpool\n92\ndrugs\nmovies\n##ock\nHeritage\n##je\n##istic\nvocal\nstrategy\ngene\nadvice\n##bi\nOttoman\nriding\n##side\nAgency\nIndonesia\n11th\nlaughing\nsleeping\nund\nmuttered\nlistening\ndeck\ntip\n77\nownership\ngrey\nClaire\ndeeply\nprovincial\npopularity\nCooper\n##á\nEmily\n##sed\ndesigner\nMurray\ndescribe\nDanny\nAround\nParker\n##dae\n68\nrates\nsuffering\nconsiderable\n78\nnervous\npowered\ntons\ncircumstances\nwished\nbelonged\nPittsburgh\nflows\n9th\n##use\nbelt\n81\nuseful\n15th\ncontext\nList\nDead\nIron\nseek\nSeason\nworn\nfrequency\nlegislation\nreplacement\nmemories\nTournament\nAgain\nBarry\norganisation\ncopy\nGulf\nwaters\nmeets\nstruggle\nOliver\n1895\nSusan\nprotest\nkick\nAlliance\ncomponents\n1896\nTower\nWindows\ndemanded\nregiment\nsentence\nWoman\nLogan\nReferee\nhosts\ndebate\nknee\nBlood\n##oo\nuniversities\npractices\nWard\nranking\ncorrect\nhappening\nVincent\nattracted\nclassified\n##stic\nprocesses\nimmediate\nwaste\nincreasingly\nHelen\n##po\nLucas\nPhil\norgan\n1897\ntea\nsuicide\nactors\nlb\ncrash\napproval\nwaves\n##ered\nhated\ngrip\n700\namongst\n69\n74\nhunting\ndying\nlasted\nillegal\n##rum\nstare\ndefeating\n##gs\nshrugged\n°C\nJon\nCount\nOrleans\n94\naffairs\nformally\n##and\n##ves\ncriticized\nDisney\nVol\nsuccessor\ntests\nscholars\npalace\nWould\ncelebrated\nrounds\ngrant\nSchools\nSuch\ncommanded\ndemon\nRomania\n##all\nKarl\n71\n##yn\n84\nDaily\ntotally\nMedicine\nfruit\nDie\nupset\nLower\nConservative\n14th\nMitchell\nescaped\nshoes\nMorris\n##tz\nqueen\nharder\nprime\nThanks\nindeed\nSky\nauthors\nrocks\ndefinition\nNazi\naccounts\nprinted\nexperiences\n##ters\ndivisions\nCathedral\ndenied\ndepending\nExpress\n##let\n73\nappeal\nloose\ncolors\nfiled\n##isation\ngender\n##ew\nthrone\nforests\nFinland\ndomain\nboats\nBaker\nsquadron\nshore\nremove\n##ification\ncareful\nwound\nrailroad\n82\nseeking\nagents\n##ved\nBlues\n##off\ncustomers\nignored\nnet\n##ction\nhiding\nOriginally\ndeclined\n##ess\nfranchise\neliminated\nNBA\nmerely\npure\nappropriate\nvisiting\nforty\nmarkets\noffensive\ncoverage\ncave\n##nia\nspell\n##lar\nBenjamin\n##ire\nConvention\nfilmed\nTrade\n##sy\n##ct\nHaving\npalm\n1889\nEvans\nintense\nplastic\nJulia\ndocument\njeans\nvessel\nSR\n##fully\nproposal\nBirmingham\nle\n##ative\nassembly\n89\nfund\nlock\n1893\nAD\nmeetings\noccupation\nmodified\nYears\nodd\naimed\nreform\nMission\nWorks\nshake\ncat\nexception\nconvinced\nexecuted\npushing\ndollars\nreplacing\nsoccer\nmanufacturing\n##ros\nexpensive\nkicked\nminimum\nJosh\ncoastal\nChase\nha\nThailand\npublications\ndeputy\nSometimes\nAngel\neffectively\n##illa\ncriticism\nconduct\nSerbian\nlandscape\nNY\nabsence\npassage\n##ula\nBlake\nIndians\n1892\nadmit\nTrophy\n##ball\nNext\n##rated\n##ians\ncharts\nkW\norchestra\n79\nheritage\n1894\nrough\nexists\nboundary\nBible\nLegislative\nmoon\nmedieval\n##over\ncutting\nprint\n##ett\nbirthday\n##hood\ndestruction\nJulian\ninjuries\ninfluential\nsisters\nraising\nstatue\ncolour\ndancing\ncharacteristics\norange\n##ok\n##aries\nKen\ncolonial\ntwin\nLarry\nsurviving\n##shi\nBarbara\npersonality\nentertainment\nassault\n##ering\ntalent\nhappens\nlicense\n86\ncouch\nCentury\nsoundtrack\nshower\nswimming\ncash\nStaff\nbent\n1885\nbay\nlunch\n##lus\ndozen\nvessels\nCBS\ngreatly\ncritic\nTest\nsymbol\npanel\nshell\noutput\nreaches\n87\nFront\nmotor\nocean\n##era\n##ala\nmaintenance\nviolent\nscent\nLimited\nLas\nHope\nTheater\nWhich\nsurvey\nRobin\nrecordings\ncompilation\n##ward\nbomb\ninsurance\nAuthority\nsponsored\nsatellite\nJazz\nrefer\nstronger\nblow\nwhilst\nWrestling\nsuggest\n##rie\nclimbed\n##els\nvoices\nshopping\n1891\nNeil\ndiscovery\n##vo\n##ations\nburst\nBaby\npeaked\nBrooklyn\nknocked\nlift\n##try\nfalse\nnations\nHugh\nCatherine\npreserved\ndistinguished\nterminal\nresolution\nratio\npants\ncited\ncompetitions\ncompletion\nDJ\nbone\nuniform\nschedule\nshouted\n83\n1920s\nrarely\nBasketball\nTaiwan\nartistic\nbare\nvampires\narrest\nUtah\nMarcus\nassist\ngradually\nqualifying\nVictorian\nvast\nrival\nWarner\nTerry\nEconomic\n##cia\nlosses\nboss\nversus\naudio\nrunner\napply\nsurgery\nPlay\ntwisted\ncomfortable\n##cs\nEveryone\nguests\n##lt\nHarrison\nUEFA\nlowered\noccasions\n##lly\n##cher\nchapter\nyoungest\neighth\nCulture\n##room\n##stone\n1888\nSongs\nSeth\nDigital\ninvolvement\nexpedition\nrelationships\nsigning\n1000\nfault\nannually\ncircuit\nafterwards\nmeat\ncreature\n##ou\ncable\nBush\n##net\nHispanic\nrapid\ngonna\nfigured\nextent\nconsidering\ncried\n##tin\nsigh\ndynasty\n##ration\ncabinet\nRichmond\nstable\n##zo\n1864\nAdmiral\nUnit\noccasion\nshares\nbadly\nlongest\n##ify\nConnor\nextreme\nwondering\ngirlfriend\nStudio\n##tions\n1865\ntribe\nexact\nmuscles\nhat\nLuis\nOrthodox\ndecisions\namateur\ndescription\n##lis\nhips\nkingdom\n##ute\nPortland\nwhereas\nBachelor\nouter\ndiscussion\npartly\nArkansas\n1880\ndreams\nperfectly\nLloyd\n##bridge\nasleep\n##tti\nGreg\npermission\ntrading\npitch\nmill\nStage\nliquid\nKeith\n##tal\nwolf\nprocessing\nstick\nJerusalem\nprofile\nrushed\nspiritual\nargument\nIce\nGuy\ntill\nDelhi\nroots\nSection\nmissions\nGlasgow\npenalty\nNBC\nencouraged\nidentify\nkeyboards\n##zing\n##ston\ndisc\nplain\ninformed\nBernard\nthinks\nfled\nJustin\n##day\nnewspapers\n##wick\nRalph\n##zer\nunlike\nStars\nartillery\n##ified\nrecovered\narrangement\nsearching\n##pers\n##tory\n##rus\ndeaths\nEgyptian\ndiameter\n##í\nmarketing\ncorporate\nteach\nmarks\nTurner\nstaying\nhallway\nSebastian\nchapel\nnaked\nmistake\npossession\n1887\ndominated\njacket\ncreative\nFellow\nFalls\nDefence\nsuspended\nemployment\n##rry\nHebrew\nHudson\nWeek\nWars\nrecognize\nNatural\ncontroversial\nTommy\nthank\nAthletic\nbenefits\ndecline\nintention\n##ets\nLost\nWall\nparticipation\nelevation\nsupports\nparliament\n1861\nconcentration\nMovement\n##IS\ncompeting\nstops\nbehalf\n##mm\nlimits\nfunded\ndiscuss\nCollins\ndeparture\nobtain\nwoods\nlatest\nuniverse\nalcohol\nLaura\nrush\nblade\nfunny\nDennis\nforgotten\nAmy\nSymphony\napparent\ngraduating\n1862\nRob\nGrey\ncollections\nMason\nemotions\n##ugh\nliterally\nAny\ncounties\n1863\nnomination\nfighter\nhabitat\nrespond\nexternal\nCapital\nexit\nVideo\ncarbon\nsharing\nBad\nopportunities\nPerry\nphoto\n##mus\nOrange\nposted\nremainder\ntransportation\nportrayed\nLabor\nrecommended\npercussion\nrated\nGrade\nrivers\npartially\nsuspected\nstrip\nadults\nbutton\nstruggled\nintersection\nCanal\n##ability\npoems\nclaiming\nMadrid\n1886\nTogether\n##our\nMuch\nVancouver\ninstrument\ninstrumental\n1870\nmad\nangle\nControl\nPhoenix\nLeo\nCommunications\nmail\n##ette\n##ev\npreferred\nadaptation\nalleged\ndiscussed\ndeeper\n##ane\nYet\nMonday\nvolumes\nthrown\nZane\n##logy\ndisplayed\nrolling\ndogs\nAlong\nTodd\n##ivity\nwithdrew\nrepresentation\nbelief\n##sia\ncrown\nLate\nShort\nhardly\ngrinned\nromantic\nPete\n##ken\nnetworks\nenemies\nColin\nEventually\nSide\ndonated\n##su\nsteady\ngrab\nguide\nFinnish\nMilan\npregnant\ncontroversy\nreminded\n1884\nStuart\n##bach\n##ade\nRace\nBelgian\nLP\nProduction\nZone\nlieutenant\ninfantry\nChild\nconfusion\nsang\nresident\n##ez\nvictim\n1881\nchannels\nRon\nbusinessman\n##gle\nDick\ncolony\npace\nproducers\n##ese\nagencies\nCraig\nLucy\nVery\ncenters\nYorkshire\nphotography\n##ched\nAlbum\nchampionships\nMetro\nsubstantial\nStandard\nterrible\ndirectors\ncontribution\nadvertising\nemotional\n##its\nlayer\nsegment\nsir\nfolded\nRoberts\nceased\nHampshire\n##ray\ndetailed\npartners\nm²\n##pt\nBeth\ngenre\ncommented\ngenerated\nremote\naim\nHans\ncredits\nconcerts\nperiods\nbreakfast\ngay\nshadow\ndefence\nToo\nHad\ntransition\nAfghanistan\n##book\neggs\ndefend\n##lli\nwrites\nSystems\nbones\nmess\nseed\nscientists\nShortly\nRomanian\n##zy\nFreedom\nmuscle\nhero\nparent\nagriculture\nchecked\nIslam\nBristol\nFreyja\nArena\ncabin\nGermans\nelectricity\nranks\nviewed\nmedals\nWolf\nassociate\nMadison\nSorry\nfort\nChile\ndetail\nwidespread\nattorney\nboyfriend\n##nan\nStudents\nSpencer\n##ig\nbite\nMaine\ndemolished\nLisa\nerected\nSomeone\noperational\nCommissioner\nNHL\nCoach\nBar\nforcing\nDream\nRico\ncargo\nMurphy\n##fish\n##ase\ndistant\n##master\n##ora\nOrganization\ndoorway\nSteven\ntraded\nelectrical\nfrequent\n##wn\nBranch\nSure\n1882\nplacing\nManhattan\nattending\nattributed\nexcellent\npounds\nruling\nprinciples\ncomponent\nMediterranean\nVegas\nmachines\npercentage\ninfrastructure\nthrowing\naffiliated\nKings\nsecured\nCaribbean\nTrack\nTed\nhonour\nopponent\nVirgin\nConstruction\ngrave\nproduces\nChallenge\nstretched\npaying\nmurmured\n##ata\nintegrated\nwaved\nNathan\n##ator\ntransmission\nvideos\n##yan\n##hu\nNova\ndescent\nAM\nHarold\nconservative\nTherefore\nvenue\ncompetitive\n##ui\nconclusion\nfuneral\nconfidence\nreleases\nscholar\n##sson\nTreaty\nstress\nmood\n##sm\nMac\nresiding\nAction\nFund\n##ship\nanimated\nfitted\n##kar\ndefending\nvoting\ntend\n##berry\nanswers\nbelieves\n##ci\nhelps\nAaron\n##tis\nthemes\n##lay\npopulations\nPlayers\nstroke\nTrinity\nelectoral\npaint\nabroad\ncharity\nkeys\nFair\n##pes\ninterrupted\nparticipants\nmurdered\nDays\nsupporters\n##ab\nexpert\nborders\nmate\n##llo\nsolar\narchitectural\ntension\n##bling\nParish\ntape\noperator\nCultural\nClinton\nindicates\npublisher\nordinary\nsugar\narrive\nrifle\nacoustic\n##uring\nassets\n##shire\nSS\nsufficient\noptions\nHMS\nClassic\nbars\nrebuilt\ngovernments\nBeijing\nreporter\nscreamed\nAbbey\ncrying\nmechanical\ninstantly\ncommunications\nPolitical\ncemetery\nCameron\nStop\nrepresentatives\nUSS\ntexts\nmathematics\ninnings\ncivilian\nSerbia\n##hill\npractical\npatterns\ndust\nFaculty\ndebt\n##end\n##cus\njunction\nsuppose\nexperimental\nComputer\nFood\nwrist\nabuse\ndealing\nbigger\ncap\nprinciple\n##pin\nMuhammad\nFleet\nCollection\nattempting\ndismissed\n##burn\nregime\nHerbert\n##ua\nshadows\n1883\nEve\nLanka\n1878\nPerformance\nfictional\n##lock\nNoah\nRun\nVoivodeship\nexercise\nbroadcasting\n##fer\nRAF\nMagic\nBangladesh\nsuitable\n##low\n##del\nstyles\ntoured\nCode\nidentical\nlinks\ninsisted\n110\nflash\nModel\nslave\nDerek\nRev\nfairly\nGreater\nsole\n##lands\nconnecting\nzero\nbench\n##ome\nswitched\nFall\nOwen\nyours\nElectric\nshocked\nconvention\n##bra\nclimb\nmemorial\nswept\nRacing\ndecides\nbelong\n##nk\nparliamentary\n##und\nages\nproof\n##dan\ndelivery\n1860\n##ów\nsad\npublicly\nleaning\nArchbishop\ndirt\n##ose\ncategories\n1876\nburn\n##bing\nrequested\nGuinea\nHistorical\nrhythm\nrelation\n##heim\nye\npursue\nmerchant\n##mes\nlists\ncontinuous\nfrowned\ncolored\ntool\ngods\ninvolves\nDuncan\nphotographs\nCricket\nslight\nGregory\natmosphere\nwider\nCook\n##tar\nessential\nBeing\nFA\nemperor\nwealthy\nnights\n##bar\nlicensed\nHawaii\nviewers\nLanguage\nload\nnearest\nmilk\nkilometers\nplatforms\n##ys\nterritories\nRogers\nsheet\nRangers\ncontested\n##lation\nisolated\nassisted\nswallowed\nSmall\nContemporary\nTechnical\nEdwards\nexpress\nVolume\nendemic\n##ei\ntightly\nWhatever\nindigenous\nColombia\n##ulation\nhp\ncharacterized\n##ida\nNigeria\nProfessional\nduo\nSoccer\nslaves\nFarm\nsmart\nAttorney\nAttendance\nCommon\nsalt\n##vin\ntribes\nnod\nsentenced\nbid\nsample\nDrive\nswitch\ninstant\n21st\nCuba\ndrunk\nAlaska\nproud\nawareness\nhitting\nsessions\nThai\nlocally\nelsewhere\nDragon\ngentle\ntouching\n##lee\nSprings\nUniversal\nLatino\nspin\n1871\nChart\nrecalled\nType\npointing\n##ii\nlowest\n##ser\ngrandmother\nAdelaide\nJacques\nspotted\nBuffalo\nrestoration\nSon\nJoan\nfarmers\nLily\n1879\nlucky\n##dal\nluck\neldest\n##rant\nMarket\ndrummer\ndeployed\nwarned\nprince\nsing\namazing\nsailed\n##oon\n1875\nPrimary\ntraveling\nMasters\nSara\ncattle\nTrail\ngang\nFurther\ndesert\nrelocated\n##tch\n##ord\nFlight\nillness\nMunich\nninth\nrepair\nSingles\n##lated\nTyler\ntossed\nboots\nWork\nsized\nearning\nshoved\nmagazines\nhoused\ndam\nresearchers\nFormer\nspun\npremiere\nspaces\norganised\nwealth\ncrimes\ndevoted\nstones\nUrban\nautomatic\nhop\naffect\noutstanding\ntanks\nmechanism\nMuslims\nMs\nshots\nargue\nJeremy\nconnections\nArmenian\nincreases\nrubbed\n1867\nretail\ngear\nPan\nbonus\njurisdiction\nweird\nconcerning\nwhisper\n##gal\nMicrosoft\ntenure\nhills\nwww\nGmina\nporch\nfiles\nreportedly\nventure\nStorm\n##ence\nNature\nkiller\npanic\nfate\nSecret\nWang\nscream\ndrivers\nbelongs\nChamber\nclan\nmonument\nmixing\nPeru\nbet\nRiley\nFriends\nIsaac\nsubmarine\n1877\n130\njudges\nharm\nranging\naffair\nprepare\npupils\nhouseholder\nPolicy\ndecorated\nNation\nslammed\nactivist\nimplemented\nRoom\nqualify\nPublishing\nestablishing\nBaptist\ntouring\nsubsidiary\n##nal\nlegend\n1872\nlaughter\nPC\nAthens\nsettlers\nties\ndual\ndear\nDraft\nstrategic\nIvan\nreveal\nclosest\ndominant\nAh\n##ult\nDenver\nbond\nboundaries\ndrafted\ntables\n##TV\neyed\nEdition\n##ena\n1868\nbelonging\n1874\nIndustrial\ncream\nRidge\nHindu\nscholarship\nMa\nopens\ninitiated\n##ith\nyelled\ncompound\nrandom\nThroughout\ngrades\nphysics\nsank\ngrows\nexclusively\nsettle\nSaints\nbrings\nAmsterdam\nMake\nHart\nwalks\nbattery\nviolin\n##born\nexplanation\n##ware\n1873\n##har\nprovinces\nthrust\nexclusive\nsculpture\nshops\n##fire\nVI\nconstitution\nBarcelona\nmonster\nDevon\nJefferson\nSullivan\nbow\n##din\ndesperate\n##ć\nJulie\n##mon\n##ising\nterminus\nJesse\nabilities\ngolf\n##ple\n##via\n##away\nRaymond\nmeasured\njury\nfiring\nrevenue\nsuburb\nBulgarian\n1866\n##cha\ntimber\nThings\n##weight\nMorning\nspots\nAlberta\nData\nexplains\nKyle\nfriendship\nraw\ntube\ndemonstrated\naboard\nimmigrants\nreply\nbreathe\nManager\nease\n##ban\n##dia\nDiocese\n##vy\n##ía\npit\nongoing\n##lie\nGilbert\nCosta\n1940s\nReport\nvoters\ncloud\ntraditions\n##MS\ngallery\nJennifer\nswung\nBroadcasting\nDoes\ndiverse\nreveals\narriving\ninitiative\n##ani\nGive\nAllied\nPat\nOutstanding\nmonastery\nblind\nCurrently\n##war\nbloody\nstopping\nfocuses\nmanaging\nFlorence\nHarvey\ncreatures\n900\nbreast\ninternet\nArtillery\npurple\n##mate\nalliance\nexcited\nfee\nBrisbane\nlifetime\nPrivate\n##aw\n##nis\n##gue\n##ika\nphrase\nregulations\nreflected\nmanufactured\nconventional\npleased\nclient\n##ix\n##ncy\nPedro\nreduction\n##con\nwelcome\njail\ncomfort\nIranian\nNorfolk\nDakota\n##tein\nevolution\neverywhere\nInitially\nsensitive\nOlivia\nOscar\nimplementation\nsits\nstolen\ndemands\nslide\ngrandson\n##ich\nmerger\n##mic\nSpirit\n##°\nticket\nroot\ndifficulty\nNevada\n##als\nlined\nDylan\nOriginal\nCall\nbiological\nEU\ndramatic\n##hn\nOperations\ntreaty\ngap\n##list\nAm\nRomanized\nmoral\nButler\nperspective\nFurthermore\nManuel\nabsolutely\nunsuccessful\ndisaster\ndispute\npreparation\ntested\ndiscover\n##ach\nshield\nsqueezed\nbrushed\nbattalion\nArnold\n##ras\nsuperior\ntreat\nclinical\n##so\nApple\nSyria\nCincinnati\npackage\nflights\neditions\nLeader\nminority\nwonderful\nhang\nPop\nPhilippine\ntelephone\nbell\nhonorary\n##mar\nballs\nDemocrat\ndirty\nthereafter\ncollapsed\nInside\nslip\nwrestling\n##ín\nlistened\nregard\nbowl\nNone\nSport\ncompleting\ntrapped\n##view\ncopper\nWallace\nHonor\nblame\nPeninsula\n##ert\n##oy\nAnglo\nbearing\nsimultaneously\nhonest\n##ias\nMix\nGot\nspeaker\nvoiced\nimpressed\nprices\nerror\n1869\n##feld\ntrials\nNine\nIndustry\nsubstitute\nMunicipal\ndeparted\nslept\n##ama\nJunction\nSocialist\nflower\ndropping\ncomment\nfantasy\n##ress\narrangements\ntravelled\nfurniture\nfist\nrelieved\n##tics\nLeonard\nlinear\nearn\nexpand\nSoul\nPlan\nLeeds\nSierra\naccessible\ninnocent\nWinner\nFighter\nRange\nwinds\nvertical\nPictures\n101\ncharter\ncooperation\nprisoner\ninterviews\nrecognised\nsung\nmanufacturer\nexposure\nsubmitted\nMars\nleaf\ngauge\nscreaming\nlikes\neligible\n##ac\ngathering\ncolumns\n##dra\nbelly\nUN\nmaps\nmessages\nspeakers\n##ants\ngarage\nunincorporated\nNumber\nWatson\nsixteen\nlots\nbeaten\nCould\nMunicipality\n##ano\nHorse\ntalks\nDrake\nscores\nVenice\ngenetic\n##mal\n##ère\nCold\nJose\nnurse\ntraditionally\n##bus\nTerritory\nKey\nNancy\n##win\nthumb\nSão\nindex\ndependent\ncarries\ncontrols\nComics\ncoalition\nphysician\nreferring\nRuth\nBased\nrestricted\ninherited\ninternationally\nstretch\nTHE\nplates\nmargin\nHolland\nknock\nsignificance\nvaluable\nKenya\ncarved\nemotion\nconservation\nmunicipalities\noverseas\nresumed\nFinance\ngraduation\nblinked\ntemperatures\nconstantly\nproductions\nscientist\nghost\ncuts\npermitted\n##ches\nfirmly\n##bert\npatrol\n##yo\nCroatian\nattacking\n1850\nportrait\npromoting\nsink\nconversion\n##kov\nlocomotives\nGuide\n##val\nnephew\nrelevant\nMarc\ndrum\noriginated\nChair\nvisits\ndragged\nPrice\nfavour\ncorridor\nproperly\nrespective\nCaroline\nreporting\ninaugural\n1848\nindustries\n##ching\nedges\nChristianity\nMaurice\nTrent\nEconomics\ncarrier\nReed\n##gon\ntribute\nPradesh\n##ale\nextend\nattitude\nYale\n##lu\nsettlements\nglasses\ntaxes\ntargets\n##ids\nquarters\n##ological\nconnect\nhence\nmetre\ncollapse\nunderneath\nbanned\nFuture\nclients\nalternate\nexplosion\nkinds\nCommons\nhungry\ndragon\nChapel\nBuddhist\nlover\ndepression\npulls\n##ges\n##uk\norigins\ncomputers\ncrosses\nkissing\nassume\nemphasis\nlighting\n##ites\npersonally\ncrashed\nbeam\ntouchdown\nlane\ncomparison\n##mont\nHitler\n##las\nexecution\n##ene\nacre\nsum\nPearl\nray\n##point\nessentially\nworker\nconvicted\ntear\nClay\nrecovery\nLiterature\nUnfortunately\n##row\npartial\nPetersburg\nBulgaria\ncoaching\nevolved\nreception\nenters\nnarrowed\nelevator\ntherapy\ndefended\npairs\n##lam\nbreaks\nBennett\nUncle\ncylinder\n##ison\npassion\nbases\nActor\ncancelled\nbattles\nextensively\noxygen\nAncient\nspecialized\nnegotiations\n##rat\nacquisition\nconvince\ninterpretation\n##00\nphotos\naspect\ncolleges\nArtist\nkeeps\n##wing\nCroatia\n##ona\nHughes\nOtto\ncomments\n##du\nPh\nSweet\nadventure\ndescribing\nStudent\nShakespeare\nscattered\nobjective\nAviation\nPhillips\nFourth\nathletes\n##hal\n##tered\nGuitar\nintensity\nnée\ndining\ncurve\nObama\ntopics\nlegislative\nMill\nCruz\n##ars\nMembers\nrecipient\nDerby\ninspiration\ncorresponding\nfed\nYouTube\ncoins\npressing\nintent\nKaren\ncinema\nDelta\ndestination\nshorter\nChristians\nimagined\ncanal\nNewcastle\nShah\nAdrian\nsuper\nMales\n160\nliberal\nlord\nbat\nsupplied\nClaude\nmeal\nworship\n##atic\nHan\nwire\n°F\n##tha\npunishment\nthirteen\nfighters\n##ibility\n1859\nBall\ngardens\n##ari\nOttawa\npole\nindicating\nTwenty\nHigher\nBass\nIvy\nfarming\n##urs\ncertified\nSaudi\nplenty\n##ces\nrestaurants\nRepresentative\nMiles\npayment\n##inger\n##rit\nConfederate\nfestivals\nreferences\n##ić\nMario\nPhD\nplayoffs\nwitness\nrice\nmask\nsaving\nopponents\nenforcement\nautomatically\nrelegated\n##oe\nradar\nwhenever\nFinancial\nimperial\nuncredited\ninfluences\nAbraham\nskull\nGuardian\nHaven\nBengal\nimpressive\ninput\nmixture\nWarsaw\naltitude\ndistinction\n1857\ncollective\nAnnie\n##ean\n##bal\ndirections\nFlying\n##nic\nfaded\n##ella\ncontributing\n##ó\nemployee\n##lum\n##yl\nruler\noriented\nconductor\nfocusing\n##die\nGiants\nMills\nmines\nDeep\ncurled\nJessica\nguitars\nLouise\nprocedure\nMachine\nfailing\nattendance\nNepal\nBrad\nLiam\ntourist\nexhibited\nSophie\ndepicted\nShaw\nChuck\n##can\nexpecting\nchallenges\n##nda\nequally\nresignation\n##logical\nTigers\nloop\npitched\noutdoor\nreviewed\nhopes\nTrue\ntemporarily\nBorough\ntorn\njerked\ncollect\nBerkeley\nIndependence\ncotton\nretreat\ncampaigns\nparticipating\nIntelligence\nHeaven\n##ked\nsituations\nborough\nDemocrats\nHarbor\n##len\nLiga\nserial\ncircles\nfourteen\n##lot\nseized\nfilling\ndepartments\nfinance\nabsolute\nRoland\nNate\nfloors\nraced\nstruggling\ndeliver\nprotests\n##tel\nExchange\nefficient\nexperiments\n##dar\nfaint\n3D\nbinding\nLions\nlightly\nskill\nproteins\ndifficulties\n##cal\nmonthly\ncamps\nflood\nloves\nAmanda\nCommerce\n##oid\n##lies\nelementary\n##tre\norganic\n##stein\n##ph\nreceives\nTech\nenormous\ndistinctive\nJoint\nexperiment\nCircuit\ncitizen\n##hy\nshelter\nideal\npractically\nformula\naddressed\nFoster\nProductions\n##ax\nvariable\npunk\nVoice\nfastest\nconcentrated\n##oma\n##yer\nstored\nsurrender\nvary\nSergeant\nWells\nward\nWait\n##ven\nplayoff\nreducing\ncavalry\n##dle\nVenezuela\ntissue\namounts\nsweat\n##we\nNon\n##nik\nbeetle\n##bu\n##tu\nJared\nHunt\n##₂\nfat\nSultan\nLiving\nCircle\nSecondary\nSuddenly\nreverse\n##min\nTravel\n##bin\nLebanon\n##mas\nvirus\nWind\ndissolved\nenrolled\nholiday\nKeep\nhelicopter\nClarke\nconstitutional\ntechnologies\ndoubles\ninstructions\n##ace\nAzerbaijan\n##ill\noccasional\nfrozen\ntrick\nwiped\nwritings\nShanghai\npreparing\nchallenged\nmainstream\nsummit\n180\n##arian\n##rating\ndesignation\n##ada\nrevenge\nfilming\ntightened\nMiguel\nMontana\nreflect\ncelebration\nbitch\nflashed\nsignals\nrounded\npeoples\n##tation\nrenowned\nGoogle\ncharacteristic\nCampaign\nsliding\n##rman\nusage\nRecord\nUsing\nwoke\nsolutions\nholes\ntheories\nlogo\nProtestant\nrelaxed\nbrow\nnickname\nReading\nmarble\n##tro\nsymptoms\nOverall\ncapita\n##ila\noutbreak\nrevolution\ndeemed\nPrincipal\nHannah\napproaches\ninducted\nWellington\nvulnerable\nEnvironmental\nDrama\nincumbent\nDame\n1854\ntravels\nsamples\naccurate\nphysically\nSony\nNashville\n##sville\n##lic\n##og\nProducer\nLucky\ntough\nStanford\nresort\nrepeatedly\neyebrows\nFar\nchoir\ncommenced\n##ep\n##ridge\nrage\nswing\nsequel\nheir\nbuses\nad\nGrove\n##late\n##rick\nupdated\n##SA\nDelaware\n##fa\nAthletics\nwarmth\nOff\nexcitement\nverse\nProtection\nVilla\ncorruption\nintellectual\nJenny\n##lyn\nmystery\nprayer\nhealthy\n##ologist\nBear\nlab\nErnest\nRemix\nregister\nbasement\nMontgomery\nconsistent\ntier\n1855\nPreston\nBrooks\n##maker\nvocalist\nlaboratory\ndelayed\nwheels\nrope\nbachelor\npitcher\nBlock\nNevertheless\nsuspect\nefficiency\nNebraska\nsiege\nFBI\nplanted\n##AC\nNewton\nbreeding\n##ain\neighteen\nArgentine\nencounter\nservant\n1858\nelder\nShadow\nEpisode\nfabric\ndoctors\nsurvival\nremoval\nchemistry\nvolunteers\nKane\nvariant\narrives\nEagle\nLeft\n##fe\nJo\ndivorce\n##ret\nyesterday\nBryan\nhandling\ndiseases\ncustomer\nSheriff\nTiger\nHarper\n##oi\nresting\nLinda\nSheffield\ngasped\nsexy\neconomics\nalien\ntale\nfootage\nLiberty\nyeah\nfundamental\nGround\nflames\nActress\nphotographer\nMaggie\nAdditional\njoke\ncustom\nSurvey\nAbu\nsilk\nconsumption\nEllis\nbread\n##uous\nengagement\nputs\nDog\n##hr\npoured\nguilt\nCDP\nboxes\nhardware\nclenched\n##cio\nstem\narena\nextending\n##com\nexamination\nSteel\nencountered\nrevised\n140\npicking\nCar\nhasn\nMinor\npride\nRoosevelt\nboards\n##mia\nblocked\ncurious\ndrag\nnarrative\nbrigade\nPrefecture\nmysterious\nnamely\nconnects\nDevil\nhistorians\nCHAPTER\nquit\ninstallation\nGolf\nempire\nelevated\n##eo\nreleasing\nBond\n##uri\nharsh\nban\n##BA\ncontracts\ncloth\npresents\nstake\nchorus\n##eau\nswear\n##mp\nallies\ngenerations\nMotor\nmeter\npen\nwarrior\nveteran\n##EC\ncomprehensive\nmissile\ninteraction\ninstruction\nRenaissance\nrested\nDale\nfix\nfluid\nles\ninvestigate\nloaded\nwidow\nexhibit\nartificial\nselect\nrushing\ntasks\nsignature\nnowhere\nEngineer\nfeared\nPrague\nbother\nextinct\ngates\nBird\nclimbing\nheels\nstriking\nartwork\nhunt\nawake\n##hin\nFormula\nthereby\ncommitment\nimprisoned\nBeyond\n##MA\ntransformed\nAgriculture\nLow\nMovie\nradical\ncomplicated\nYellow\nAuckland\nmansion\ntenth\nTrevor\npredecessor\n##eer\ndisbanded\nsucked\ncircular\nwitch\ngaining\nlean\nBehind\nillustrated\nrang\ncelebrate\nbike\nconsist\nframework\n##cent\nShane\nowns\n350\ncomprises\ncollaborated\ncolleagues\n##cast\nengage\nfewer\n##ave\n1856\nobservation\ndiplomatic\nlegislature\nimprovements\nInterstate\ncraft\nMTV\nmartial\nadministered\njet\napproaching\npermanently\nattraction\nmanuscript\nnumbered\nHappy\nAndrea\nshallow\nGothic\nAnti\n##bad\nimprovement\ntrace\npreserve\nregardless\nrode\ndies\nachievement\nmaintaining\nHamburg\nspine\n##air\nflowing\nencourage\nwidened\nposts\n##bound\n125\nSoutheast\nSantiago\n##bles\nimpression\nreceiver\nSingle\nclosure\n##unt\ncommunist\nhonors\nNorthwest\n105\n##ulated\ncared\nun\nhug\nmagnetic\nseeds\ntopic\nperceived\nprey\nprevented\nMarvel\nEight\nMichel\nTransportation\nrings\nGate\n##gne\nByzantine\naccommodate\nfloating\n##dor\nequation\nministry\n##ito\n##gled\nRules\nearthquake\nrevealing\nBrother\nCeltic\nblew\nchairs\nPanama\nLeon\nattractive\ndescendants\nCare\nAmbassador\ntours\nbreathed\nthreatening\n##cho\nsmiles\nLt\nBeginning\n##iness\nfake\nassists\nfame\nstrings\nMobile\nLiu\nparks\nhttp\n1852\nbrush\nAunt\nbullet\nconsciousness\n##sta\n##ther\nconsequences\ngather\ndug\n1851\nbridges\nDoug\n##sion\nArtists\nignore\nCarol\nbrilliant\nradiation\ntemples\nbasin\nclouds\n##cted\nStevens\nspite\nsoap\nconsumer\nDamn\nSnow\nrecruited\n##craft\nAdvanced\ntournaments\nQuinn\nundergraduate\nquestioned\nPalmer\nAnnual\nOthers\nfeeding\nSpider\nprinting\n##orn\ncameras\nfunctional\nChester\nreaders\nAlpha\nuniversal\nFaith\nBrandon\nFrançois\nauthored\nRing\nel\naims\nathletic\npossessed\nVermont\nprogrammes\n##uck\nbore\nFisher\nstatements\nshed\nsaxophone\nneighboring\npronounced\nbarrel\nbags\n##dge\norganisations\npilots\ncasualties\nKenneth\n##brook\nsilently\nMalcolm\nspan\nEssex\nanchor\n##hl\nvirtual\nlessons\nHenri\nTrump\nPage\npile\nlocomotive\nwounds\nuncomfortable\nsustained\nDiana\nEagles\n##pi\n2000s\ndocumented\n##bel\nCassie\ndelay\nkisses\n##ines\nvariation\n##ag\ngrowled\n##mark\n##ways\nLeslie\nstudios\nFriedrich\naunt\nactively\narmor\neaten\nhistorically\nBetter\npurse\nhoney\nratings\n##ée\nnaturally\n1840\npeer\nKenny\nCardinal\ndatabase\nLooking\nrunners\nhandsome\nDouble\nPA\n##boat\n##sted\nprotecting\n##jan\nDiamond\nconcepts\ninterface\n##aki\nWatch\nArticle\nColumbus\ndialogue\npause\n##rio\nextends\nblanket\npulse\n1853\naffiliate\nladies\nRonald\ncounted\nkills\ndemons\n##zation\nAirlines\nMarco\nCat\ncompanion\nmere\nYugoslavia\nForum\nAllan\npioneer\nCompetition\nMethodist\npatent\nnobody\nStockholm\n##ien\nregulation\n##ois\naccomplished\n##itive\nwashed\nsake\nVladimir\ncrops\nprestigious\nhumor\nSally\nlabour\ntributary\ntrap\naltered\nexamined\nMumbai\nbombing\nAsh\nnoble\nsuspension\nruins\n##bank\nspare\ndisplays\nguided\ndimensional\nIraqi\n##hon\nsciences\nFranz\nrelating\nfence\nfollowers\nPalestine\ninvented\nproceeded\nBatman\nBradley\n##yard\n##ova\ncrystal\nKerala\n##ima\nshipping\nhandled\nWant\nabolished\nDrew\n##tter\nPowell\nHalf\n##table\n##cker\nexhibitions\nWere\nassignment\nassured\n##rine\nIndonesian\nGrammy\nacknowledged\nKylie\ncoaches\nstructural\nclearing\nstationed\nSay\nTotal\nRail\nbesides\nglow\nthreats\nafford\nTree\nMusical\n##pp\nelite\ncentered\nexplore\nEngineers\nStakes\nHello\ntourism\nseverely\nassessment\n##tly\ncrack\npoliticians\n##rrow\nsheets\nvolunteer\n##borough\n##hold\nannouncement\nrecover\ncontribute\nlungs\n##ille\nmainland\npresentation\nJohann\nWriting\n1849\n##bird\nStudy\nBoulevard\ncoached\nfail\nairline\nCongo\nPlus\nSyrian\nintroduce\nridge\nCasey\nmanages\n##fi\nsearched\nSupport\nsuccession\nprogressive\ncoup\ncultures\n##lessly\nsensation\nCork\nElena\nSofia\nPhilosophy\nmini\ntrunk\nacademy\nMass\nLiz\npracticed\nReid\n##ule\nsatisfied\nexperts\nWilhelm\nWoods\ninvitation\nAngels\ncalendar\njoy\nSr\nDam\npacked\n##uan\nbastard\nWorkers\nbroadcasts\nlogic\ncooking\nbackward\n##ack\nChen\ncreates\nenzyme\n##xi\nDavies\naviation\nVII\nConservation\nfucking\nKnights\n##kan\nrequiring\nhectares\nwars\nate\n##box\nMind\ndesired\noak\nabsorbed\nReally\nVietnamese\nPaulo\nathlete\n##car\n##eth\nTalk\nWu\n##cks\nsurvivors\nYang\nJoel\nAlmost\nHolmes\nArmed\nJoshua\npriests\ndiscontinued\n##sey\nblond\nRolling\nsuggesting\nCA\nclay\nexterior\nScientific\n##sive\nGiovanni\nHi\nfarther\ncontents\nWinners\nanimation\nneutral\nmall\nNotes\nlayers\nprofessionals\nArmstrong\nAgainst\nPiano\ninvolve\nmonitor\nangel\nparked\nbears\nseated\nfeat\nbeliefs\n##kers\nVersion\nsuffer\n##ceae\nguidance\n##eur\nhonored\nraid\nalarm\nGlen\nEllen\nJamaica\ntrio\nenabled\n##ils\nprocedures\n##hus\nmoderate\nupstairs\n##ses\ntorture\nGeorgian\nrebellion\nFernando\nNice\n##are\nAires\nCampus\nbeast\n##hing\n1847\n##FA\nIsle\n##logist\nPrinceton\ncathedral\nOakland\nSolomon\n##tto\nMilwaukee\nupcoming\nmidfielder\nNeither\nsacred\nEyes\nappreciate\nBrunswick\nsecrets\nRice\nSomerset\nChancellor\nCurtis\n##gel\nRich\nseparation\ngrid\n##los\n##bon\nurge\n##ees\n##ree\nfreight\ntowers\npsychology\nrequirement\ndollar\n##fall\n##sman\nexile\ntomb\nSalt\nStefan\nBuenos\nRevival\nPorter\ntender\ndiesel\nchocolate\nEugene\nLegion\nLaboratory\nsheep\narched\nhospitals\norbit\nFull\n##hall\ndrinks\nripped\n##RS\ntense\nHank\nleagues\n##nberg\nPlayStation\nfool\nPunjab\nrelatives\nComedy\nsur\n1846\nTonight\nSox\n##if\nRabbi\norg\nspeaks\ninstitute\ndefender\npainful\nwishes\nWeekly\nliteracy\nportions\nsnake\nitem\ndeals\n##tum\nautumn\nsharply\nreforms\nthighs\nprototype\n##ition\nargues\ndisorder\nPhysics\nterror\nprovisions\nrefugees\npredominantly\nindependently\nmarch\n##graphy\nArabia\nAndrews\nBus\nMoney\ndrops\n##zar\npistol\nmatrix\nrevolutionary\n##ust\nStarting\n##ptic\nOak\nMonica\n##ides\nservants\n##hed\narchaeological\ndivorced\nrocket\nenjoying\nfires\n##nel\nassembled\nqualification\nretiring\n##fied\nDistinguished\nhandful\ninfection\nDurham\n##itz\nfortune\nrenewed\nChelsea\n##sley\ncurved\ngesture\nretain\nexhausted\n##ifying\nPerth\njumping\nPalestinian\nSimpson\ncolonies\nsteal\n##chy\ncorners\nFinn\narguing\nMartha\n##var\nBetty\nemerging\nHeights\nHindi\nManila\npianist\nfounders\nregret\nNapoleon\nelbow\noverhead\nbold\npraise\nhumanity\n##ori\nRevolutionary\n##ere\nfur\n##ole\nAshley\nOfficial\n##rm\nlovely\nArchitecture\n##sch\nBaronet\nvirtually\n##OS\ndescended\nimmigration\n##das\n##kes\nHolly\nWednesday\nmaintains\ntheatrical\nEvan\nGardens\nciting\n##gia\nsegments\nBailey\nGhost\n##city\ngoverning\ngraphics\n##ined\nprivately\npotentially\ntransformation\nCrystal\nCabinet\nsacrifice\nhesitated\nmud\nApollo\nDesert\nbin\nvictories\nEditor\nRailways\nWeb\nCase\ntourists\nBrussels\nFranco\ncompiled\ntopped\nGene\nengineers\ncommentary\negg\nescort\nnerve\narch\nnecessarily\nfrustration\nMichelle\ndemocracy\ngenes\nFacebook\nhalfway\n##ient\n102\nflipped\nWon\n##mit\nNASA\nLynn\nProvincial\nambassador\nInspector\nglared\nChange\nMcDonald\ndevelopments\ntucked\nnoting\nGibson\ncirculation\ndubbed\narmies\nresource\nHeadquarters\n##iest\nMia\nAlbanian\nOil\nAlbums\nexcuse\nintervention\nGrande\nHugo\nintegration\ncivilians\ndepends\nreserves\nDee\ncompositions\nidentification\nrestrictions\nquarterback\nMiranda\nUniverse\nfavourite\nranges\nhint\nloyal\nOp\nentity\nManual\nquoted\ndealt\nspecialist\nZhang\ndownload\nWestminster\nRebecca\nstreams\nAnglican\nvariations\nMine\ndetective\nFilms\nreserved\n##oke\n##key\nsailing\n##gger\nexpanding\nrecall\ndiscovers\nparticles\nbehaviour\nGavin\nblank\npermit\nJava\nFraser\nPass\n##non\n##TA\npanels\nstatistics\nnotion\ncourage\ndare\nvenues\n##roy\nBox\nNewport\ntravelling\nThursday\nwarriors\nGlenn\ncriteria\n360\nmutual\nrestore\nvaried\nbitter\nKatherine\n##lant\nritual\nbits\n##à\nHenderson\ntrips\nRichardson\nDetective\ncurse\npsychological\nIl\nmidnight\nstreak\nfacts\nDawn\nIndies\nEdmund\nroster\nGen\n##nation\n1830\ncongregation\nshaft\n##ically\n##mination\nIndianapolis\nSussex\nloving\n##bit\nsounding\nhorrible\nContinental\nGriffin\nadvised\nmagical\nmillions\n##date\n1845\nSafety\nlifting\ndetermination\nvalid\ndialect\nPenn\nKnow\ntriple\navoided\ndancer\njudgment\nsixty\nfarmer\nlakes\nblast\naggressive\nAbby\ntag\nchains\ninscription\n##nn\nconducting\nScout\nbuying\n##wich\nspreading\n##OC\narray\nhurried\nEnvironment\nimproving\nprompted\nfierce\nTaking\nAway\ntune\npissed\nBull\ncatching\n##ying\neyebrow\nmetropolitan\nterrain\n##rel\nLodge\nmanufacturers\ncreator\n##etic\nhappiness\nports\n##ners\nRelations\nfortress\ntargeted\n##ST\nallegedly\nblues\n##osa\nBosnia\n##dom\nburial\nsimilarly\nstranger\npursued\nsymbols\nrebels\nreflection\nroutine\ntraced\nindoor\neventual\n##ska\n##ão\n##una\nMD\n##phone\noh\ngrants\nReynolds\nrid\noperators\n##nus\nJoey\nvital\nsiblings\nkeyboard\nbr\nremoving\nsocieties\ndrives\nsolely\nprincess\nlighter\nVarious\nCavalry\nbelieving\nSC\nunderwent\nrelay\nsmelled\nsyndrome\nwelfare\nauthorized\nseemingly\nHard\nchicken\n##rina\nAges\nBo\ndemocratic\nbarn\nEye\nshorts\n##coming\n##hand\ndisappointed\nunexpected\ncentres\nExhibition\nStories\nSite\nbanking\naccidentally\nAgent\nconjunction\nAndré\nChloe\nresist\nwidth\nQueens\nprovision\n##art\nMelissa\nHonorary\nDel\nprefer\nabruptly\nduration\n##vis\nGlass\nenlisted\n##ado\ndiscipline\nSisters\ncarriage\n##ctor\n##sburg\nLancashire\nlog\nfuck\n##iz\ncloset\ncollecting\nholy\nrape\ntrusted\ncleaning\ninhabited\nRocky\n104\neditorial\n##yu\n##ju\nsucceed\nstrict\nCuban\n##iya\nBronze\noutcome\n##ifies\n##set\ncorps\nHero\nbarrier\nKumar\ngroaned\nNina\nBurton\nenable\nstability\nMilton\nknots\n##ination\nslavery\n##borg\ncurriculum\ntrailer\nwarfare\nDante\nEdgar\nrevival\nCopenhagen\ndefine\nadvocate\nGarrett\nLuther\novercome\npipe\n750\nconstruct\nScotia\nkings\nflooding\n##hard\nFerdinand\nFelix\nforgot\nFish\nKurt\nelaborate\n##BC\ngraphic\ngripped\ncolonel\nSophia\nAdvisory\nSelf\n##uff\n##lio\nmonitoring\nseal\nsenses\nrises\npeaceful\njournals\n1837\nchecking\nlegendary\nGhana\n##power\nammunition\nRosa\nRichards\nnineteenth\nferry\naggregate\nTroy\ninter\n##wall\nTriple\nsteep\ntent\nCyprus\n1844\n##woman\ncommanding\nfarms\ndoi\nnavy\nspecified\nna\ncricketer\ntransported\nThink\ncomprising\ngrateful\nsolve\n##core\nbeings\nclerk\ngrain\nvector\ndiscrimination\n##TC\nKatie\nreasonable\ndrawings\nveins\nconsideration\nMonroe\nrepeat\nbreed\ndried\nwitnessed\nordained\nCurrent\nspirits\nremarkable\nconsultant\nurged\nRemember\nanime\nsingers\nphenomenon\nRhode\nCarlo\ndemanding\nfindings\nmanual\nvarying\nFellowship\ngenerate\nsafely\nheated\nwithdrawn\n##ao\nheadquartered\n##zon\n##lav\n##ency\nCol\nMemphis\nimposed\nrivals\nPlanet\nhealing\n##hs\nensemble\nWarriors\n##bone\ncult\nFrankfurt\n##HL\ndiversity\nGerald\nintermediate\n##izes\nreactions\nSister\n##ously\n##lica\nquantum\nawkward\nmentions\npursuit\n##ography\nvaries\nprofession\nmolecular\nconsequence\nlectures\ncracked\n103\nslowed\n##tsu\ncheese\nupgraded\nsuite\nsubstance\nKingston\n1800\nIdaho\nTheory\n##een\nain\nCarson\nMolly\n##OR\nconfiguration\nWhitney\nreads\naudiences\n##tie\nGeneva\nOutside\n##nen\n##had\ntransit\nvolleyball\nRandy\nChad\nrubber\nmotorcycle\nrespected\neager\nLevel\ncoin\n##lets\nneighbouring\n##wski\nconfident\n##cious\npoll\nuncertain\npunch\nthesis\nTucker\nIATA\nAlec\n##ographic\n##law\n1841\ndesperately\n1812\nLithuania\naccent\nCox\nlightning\nskirt\n##load\nBurns\nDynasty\n##ug\nchapters\nWorking\ndense\nMorocco\n##kins\ncasting\nSet\nactivated\noral\nBrien\nhorn\nHIV\ndawn\nstumbled\naltar\ntore\nconsiderably\nNicole\ninterchange\nregistration\nbiography\nHull\nStan\nbulk\nconsent\nPierce\n##ER\nFifth\nmarched\nterrorist\n##piece\n##itt\nPresidential\nHeather\nstaged\nPlant\nrelegation\nsporting\njoins\n##ced\nPakistani\ndynamic\nHeat\n##lf\nourselves\nExcept\nElliott\nnationally\ngoddess\ninvestors\nBurke\nJackie\n##ā\n##RA\nTristan\nAssociate\nTuesday\nscope\nNear\nbunch\n##abad\n##ben\nsunlight\n##aire\nmanga\nWillie\ntrucks\nboarding\nLion\nlawsuit\nLearning\nDer\npounding\nawful\n##mine\nIT\nLegend\nromance\nSerie\nAC\ngut\nprecious\nRobertson\nhometown\nrealm\nGuards\nTag\nbatting\n##vre\nhalt\nconscious\n1838\nacquire\ncollar\n##gg\n##ops\nHerald\nnationwide\ncitizenship\nAircraft\ndecrease\nem\nFiction\nFemale\ncorporation\nLocated\n##ip\nfights\nunconscious\nTampa\nPoetry\nlobby\nMalta\n##sar\n##bie\nlayout\nTate\nreader\nstained\n##bre\n##rst\n##ulate\nloudly\nEva\nCohen\nexploded\nMerit\nMaya\n##rable\nRovers\n##IC\nMorrison\nShould\nvinyl\n##mie\nonwards\n##gie\nvicinity\nWildlife\nprobability\nMar\nBarnes\n##ook\nspinning\nMoses\n##vie\nSurrey\nPlanning\nconferences\nprotective\nPlaza\ndeny\nCanterbury\nmanor\nEstate\ntilted\ncomics\nIBM\ndestroying\nserver\nDorothy\n##horn\nOslo\nlesser\nheaven\nMarshal\nscales\nstrikes\n##ath\nfirms\nattract\n##BS\ncontrolling\nBradford\nsoutheastern\nAmazon\nTravis\nJanet\ngoverned\n1842\nTrain\nHolden\nbleeding\ngifts\nrent\n1839\npalms\n##ū\njudicial\nHo\nFinals\nconflicts\nunlikely\ndraws\n##cies\ncompensation\nadds\nelderly\nAnton\nlasting\nNintendo\ncodes\nministers\npot\nassociations\ncapabilities\n##cht\nlibraries\n##sie\nchances\nperformers\nrunway\n##af\n##nder\nMid\nVocals\n##uch\n##eon\ninterpreted\npriority\nUganda\nruined\nMathematics\ncook\nAFL\nLutheran\nAIDS\nCapitol\nchase\naxis\nMoreover\nMaría\nSaxon\nstoryline\n##ffed\nTears\nKid\ncent\ncolours\nSex\n##long\npm\nblonde\nEdwin\nCE\ndiocese\n##ents\n##boy\nInn\n##ller\nSaskatchewan\n##kh\nstepping\nWindsor\n##oka\n##eri\nXavier\nResources\n1843\n##top\n##rad\n##lls\nTestament\npoorly\n1836\ndrifted\nslope\nCIA\nremix\nLords\nmature\nhosting\ndiamond\nbeds\n##ncies\nluxury\ntrigger\n##lier\npreliminary\nhybrid\njournalists\nEnterprise\nproven\nexpelled\ninsects\nBeautiful\nlifestyle\nvanished\n##ake\n##ander\nmatching\nsurfaces\nDominican\nKids\nreferendum\nOrlando\nTruth\nSandy\nprivacy\nCalgary\nSpeaker\nsts\nNobody\nshifting\n##gers\nRoll\nArmenia\nHand\n##ES\n106\n##ont\nGuild\nlarvae\nStock\nflame\ngravity\nenhanced\nMarion\nsurely\n##tering\nTales\nalgorithm\nEmmy\ndarker\nVIII\n##lash\nhamlet\ndeliberately\noccurring\nchoices\nGage\nfees\nsettling\nridiculous\n##ela\nSons\ncop\ncustody\n##ID\nproclaimed\nCardinals\n##pm\nMetal\nAna\n1835\nclue\nCardiff\nriders\nobservations\nMA\nsometime\n##och\nperformer\nintact\nPoints\nallegations\nrotation\nTennis\ntenor\nDirectors\n##ats\nTransit\nthigh\nComplex\n##works\ntwentieth\nFactory\ndoctrine\nDaddy\n##ished\npretend\nWinston\ncigarette\n##IA\nspecimens\nhydrogen\nsmoking\nmathematical\narguments\nopenly\ndeveloper\n##iro\nfists\nsomebody\n##san\nStanding\nCaleb\nintelligent\nStay\nInterior\nechoed\nValentine\nvarieties\nBrady\ncluster\nEver\nvoyage\n##of\ndeposits\nultimate\nHayes\nhorizontal\nproximity\n##ás\nestates\nexploration\nNATO\nClassical\n##most\nbills\ncondemned\n1832\nhunger\n##ato\nplanes\ndeserve\noffense\nsequences\nrendered\nacceptance\n##ony\nmanufacture\nPlymouth\ninnovative\npredicted\n##RC\nFantasy\n##une\nsupporter\nabsent\nPicture\nbassist\nrescued\n##MC\nAhmed\nMonte\n##sts\n##rius\ninsane\nnovelist\n##és\nagrees\nAntarctic\nLancaster\nHopkins\ncalculated\nstartled\n##star\ntribal\nAmendment\n##hoe\ninvisible\npatron\ndeer\nWalk\ntracking\nLyon\ntickets\n##ED\nphilosopher\ncompounds\nchuckled\n##wi\npound\nloyalty\nAcademic\npetition\nrefuses\nmarking\nMercury\nnortheastern\ndimensions\nscandal\nCanyon\npatch\npublish\n##oning\nPeak\nminds\n##boro\nPresbyterian\nHardy\ntheoretical\nmagnitude\nbombs\ncage\n##ders\n##kai\nmeasuring\nexplaining\navoiding\ntouchdowns\nCard\ntheology\n##ured\nPopular\nexport\nsuspicious\nProbably\nphotograph\nLou\nParks\nArms\ncompact\nApparently\nexcess\nBanks\nlied\nstunned\nterritorial\nFilipino\nspectrum\nlearns\nwash\nimprisonment\nugly\n##rose\nAlbany\nErik\nsends\n##hara\n##rid\nconsumed\n##gling\nBelgrade\nDa\nopposing\nMagnus\nfootsteps\nglowing\ndelicate\nAlexandria\nLudwig\ngorgeous\nBros\nIndex\n##PA\ncustoms\npreservation\nbonds\n##mond\nenvironments\n##nto\ninstructed\nparted\nadoption\nlocality\nworkshops\ngoalkeeper\n##rik\n##uma\nBrighton\nSlovenia\n##ulating\n##tical\ntowel\nhugged\nstripped\nBears\nupright\nWagner\n##aux\nsecretly\nAdventures\nnest\nCourse\nLauren\nBoeing\nAbdul\nLakes\n450\n##cu\nUSSR\ncaps\nChan\n##nna\nconceived\nActually\nBelfast\nLithuanian\nconcentrate\npossess\nmilitia\npine\nprotagonist\nHelena\n##PS\n##band\nBelle\nClara\nReform\ncurrency\npregnancy\n1500\n##rim\nIsabella\nhull\nName\ntrend\njournalism\ndiet\n##mel\nRecording\nacclaimed\nTang\nJace\nsteering\nvacant\nsuggestion\ncostume\nlaser\n##š\n##ink\n##pan\n##vić\nintegral\nachievements\nwise\nclassroom\nunions\nsouthwestern\n##uer\nGarcia\ntoss\nTara\nLarge\n##tate\nevident\nresponsibilities\npopulated\nsatisfaction\n##bia\ncasual\nEcuador\n##ght\narose\n##ović\nCornwall\nembrace\nrefuse\nHeavyweight\nXI\nEden\nactivists\n##uation\nbiology\n##shan\nfraud\nFuck\nmatched\nlegacy\nRivers\nmissionary\nextraordinary\nDidn\nholder\nwickets\ncrucial\nWriters\nHurricane\nIceland\ngross\ntrumpet\naccordance\nhurry\nflooded\ndoctorate\nAlbania\n##yi\nunited\ndeceased\njealous\ngrief\nflute\nportraits\n##а\npleasant\nFounded\nFace\ncrowned\nRaja\nadvisor\nSalem\n##ec\nAchievement\nadmission\nfreely\nminimal\nSudan\ndevelopers\nestimate\ndisabled\n##lane\ndownstairs\nBruno\n##pus\npinyin\n##ude\nlecture\ndeadly\nunderlying\noptical\nwitnesses\nCombat\nJulius\ntapped\nvariants\n##like\nColonial\nCritics\nSimilarly\nmouse\nvoltage\nsculptor\nConcert\nsalary\nFrances\n##ground\nhook\npremises\nSoftware\ninstructor\nnominee\n##ited\nfog\nslopes\n##zu\nvegetation\nsail\n##rch\nBody\nApart\natop\nView\nutility\nribs\ncab\nmigration\n##wyn\nbounded\n2019\npillow\ntrails\n##ub\nHalifax\nshade\nRush\n##lah\n##dian\nNotre\ninterviewed\nAlexandra\nSpringfield\nIndeed\nrubbing\ndozens\namusement\nlegally\n##lers\nJill\nCinema\nignoring\nChoice\n##ures\npockets\n##nell\nlaying\nBlair\ntackles\nseparately\n##teen\nCriminal\nperforms\ntheorem\nCommunication\nsuburbs\n##iel\ncompetitors\nrows\n##hai\nManitoba\nEleanor\ninteractions\nnominations\nassassination\n##dis\nEdmonton\ndiving\n##dine\nessay\n##tas\nAFC\nEdge\ndirecting\nimagination\nsunk\nimplement\nTheodore\ntrembling\nsealed\n##rock\nNobel\n##ancy\n##dorf\n##chen\ngenuine\napartments\nNicolas\nAA\nBach\nGlobe\nStore\n220\n##10\nRochester\n##ño\nalert\n107\nBeck\n##nin\nNaples\nBasin\nCrawford\nfears\nTracy\n##hen\ndisk\n##pped\nseventeen\nLead\nbackup\nreconstruction\n##lines\nterrified\nsleeve\nnicknamed\npopped\n##making\n##ern\nHoliday\nGospel\nibn\n##ime\nconvert\ndivine\nresolved\n##quet\nski\nrealizing\n##RT\nLegislature\nreservoir\nRain\nsinking\nrainfall\nelimination\nchallenging\ntobacco\n##outs\nGiven\nsmallest\nCommercial\npin\nrebel\ncomedian\nexchanged\nairing\ndish\nSalvador\npromising\n##wl\nrelax\npresenter\ntoll\naerial\n##eh\nFletcher\nbrass\ndisappear\nzones\nadjusted\ncontacts\n##lk\nsensed\nWalt\nmild\ntoes\nflies\nshame\nconsiders\nwildlife\nHanna\nArsenal\nLadies\nnaming\n##ishing\nanxiety\ndiscussions\ncute\nundertaken\nCash\nstrain\nWyoming\ndishes\nprecise\nAngela\n##ided\nhostile\ntwins\n115\nBuilt\n##pel\nOnline\ntactics\nNewman\n##bourne\nunclear\nrepairs\nembarrassed\nlisting\ntugged\nVale\n##gin\nMeredith\nbout\n##cle\nvelocity\ntips\nfroze\nevaluation\ndemonstrate\n##card\ncriticised\nNash\nlineup\nRao\nmonks\nbacteria\nlease\n##lish\nfrightened\nden\nrevived\nfinale\n##rance\nflee\nLetters\ndecreased\n##oh\nSounds\nwrap\nSharon\nincidents\nrenovated\neverybody\nstole\nBath\nboxing\n1815\nwithdraw\nbacks\ninterim\nreact\nmurders\nRhodes\nCopa\nframed\nflown\nEstonia\nHeavy\nexplored\n##rra\n##GA\n##ali\nIstanbul\n1834\n##rite\n##aging\n##ues\nEpiscopal\narc\norientation\nMaxwell\ninfected\n##rot\nBCE\nBrook\ngrasp\nRoberto\nExcellence\n108\nwithdrawal\nMarines\nrider\nLo\n##sin\n##run\nSubsequently\ngarrison\nhurricane\nfacade\nPrussia\ncrushed\nenterprise\n##mber\nTwitter\nGeneration\nPhysical\nSugar\nediting\ncommunicate\nEllie\n##hurst\nErnst\nwagon\npromotional\nconquest\nParliamentary\ncourtyard\nlawyers\nSuperman\nemail\nPrussian\nlately\nlecturer\nSinger\nMajesty\nParadise\nsooner\nHeath\nslot\ncurves\nconvoy\n##vian\ninduced\nsynonym\nbreeze\n##plane\n##ox\npeered\nCoalition\n##hia\nodds\n##esh\n##lina\nTomorrow\nNadu\n##ico\n##rah\ndamp\nautonomous\nconsole\nVictory\ncounts\nLuxembourg\nintimate\nArchived\nCarroll\nspy\nZero\nhabit\nAlways\nfaction\nteenager\nJohnston\nchaos\nruin\ncommerce\nblog\n##shed\n##the\nreliable\nWord\nYu\nNorton\nparade\nCatholics\ndamned\n##iling\nsurgeon\n##tia\nAllison\nJonas\nremarked\n##ès\nidiot\nMaking\nproposals\nIndustries\nstrategies\nartifacts\nbatteries\nreward\n##vers\nAgricultural\ndistinguish\nlengths\nJeffrey\nProgressive\nkicking\nPatricia\n##gio\nballot\n##ios\nskilled\n##gation\nColt\nlimestone\n##AS\npeninsula\n##itis\nLA\nhotels\nshapes\nCrime\ndepicting\nnorthwestern\nHD\nsilly\nDas\n##²\n##ws\n##ash\n##matic\nthermal\nHas\nforgive\nsurrendered\nPalm\nNacional\ndrank\nhaired\nMercedes\n##foot\nloading\nTimothy\n##roll\nmechanisms\ntraces\ndigging\ndiscussing\nNatalie\n##zhou\nForbes\nlandmark\nAnyway\nManor\nconspiracy\ngym\nknocking\nviewing\nFormation\nPink\nBeauty\nlimbs\nPhillip\nsponsor\nJoy\ngranite\nHarbour\n##ero\npayments\nBallet\nconviction\n##dam\nHood\nestimates\nlacked\nMad\nJorge\n##wen\nrefuge\n##LA\ninvaded\nKat\nsuburban\n##fold\ninvestigated\nAri\ncomplained\ncreek\nGeorges\n##uts\npowder\naccepting\ndeserved\ncarpet\nThunder\nmolecules\nLegal\ncliff\nstrictly\nenrollment\nranch\n##rg\n##mba\nproportion\nrenovation\ncrop\ngrabbing\n##liga\nfinest\nentries\nreceptor\nhelmet\nblown\nListen\nflagship\nworkshop\nresolve\nnails\nShannon\nportal\njointly\nshining\nViolet\noverwhelming\nupward\nMick\nproceedings\n##dies\n##aring\nLaurence\nChurchill\n##rice\ncommit\n170\ninclusion\nExamples\n##verse\n##rma\nfury\npaths\n##SC\nankle\nnerves\nChemistry\nrectangular\nsworn\nscreenplay\ncake\nMann\nSeoul\nAnimal\nsizes\nSpeed\nvol\nPopulation\nSouthwest\nHold\ncontinuously\nQualified\nwishing\nFighting\nMade\ndisappointment\nPortsmouth\nThirty\n##beck\nAhmad\nteammate\nMLB\ngraph\nCharleston\nrealizes\n##dium\nexhibits\npreventing\n##int\nfever\nrivalry\nMale\nmentally\ndull\n##lor\n##rich\nconsistently\n##igan\nMadame\ncertificate\nsuited\nKrishna\naccuracy\nWebb\nBudapest\nRex\n1831\nCornell\nOK\nsurveillance\n##gated\nhabitats\nAdventure\nConrad\nSuperior\nGay\nsofa\naka\nboot\nStatistics\nJessie\nLiberation\n##lip\n##rier\nbrands\nsaint\nHeinrich\nChristine\nbath\nRhine\nballet\nJin\nconsensus\nchess\nArctic\nstack\nfurious\ncheap\ntoy\n##yre\n##face\n##gging\ngastropod\n##nne\nRomans\nmembrane\nanswering\n25th\narchitects\nsustainable\n##yne\nHon\n1814\nBaldwin\ndome\n##awa\n##zen\ncelebrity\nenclosed\n##uit\n##mmer\nElectronic\nlocals\n##CE\nsupervision\nmineral\nChemical\nSlovakia\nalley\nhub\n##az\nheroes\nCreative\n##AM\nincredible\npolitically\nESPN\nyanked\nhalls\nAboriginal\nGreatest\nyield\n##20\ncongressional\nrobot\nKiss\nwelcomed\nMS\nspeeds\nproceed\nSherman\neased\nGreene\nWalsh\nGeoffrey\nvariables\nrocky\n##print\nacclaim\nReverend\nWonder\ntonnes\nrecurring\nDawson\ncontinent\nfinite\nAP\ncontinental\nID\nfacilitate\nessays\nRafael\nNeal\n1833\nancestors\n##met\n##gic\nEspecially\nteenage\nfrustrated\nJules\ncock\nexpense\n##oli\n##old\nblocking\nNotable\nprohibited\nca\ndock\norganize\n##wald\nBurma\nGloria\ndimension\naftermath\nchoosing\nMickey\ntorpedo\npub\n##used\nmanuscripts\nlaps\nUlster\nstaircase\nsphere\nInsurance\nContest\nlens\nrisks\ninvestigations\nERA\nglare\n##play\nGraduate\nauction\nChronicle\n##tric\n##50\nComing\nseating\nWade\nseeks\ninland\nThames\nRather\nbutterfly\ncontracted\npositioned\nconsumers\ncontestants\nfragments\nYankees\nSantos\nadministrator\nhypothesis\nretire\nDenis\nagreements\nWinnipeg\n##rill\n1820\ntrophy\ncrap\nshakes\nJenkins\n##rium\nya\ntwist\nlabels\nMaritime\n##lings\n##iv\n111\n##ensis\nCairo\nAnything\n##fort\nopinions\ncrowded\n##nian\nabandon\n##iff\ndrained\nimported\n##rr\ntended\n##rain\nGoing\nintroducing\nsculptures\nbankruptcy\ndanced\ndemonstration\nstance\nsettings\ngazed\nabstract\npet\nCalvin\nstiff\nstrongest\nwrestler\n##dre\nRepublicans\ngrace\nallocated\ncursed\nsnail\nadvancing\nReturn\nerrors\nMall\npresenting\neliminate\nAmateur\nInstitution\ncounting\n##wind\nwarehouse\n##nde\nEthiopia\ntrailed\nhollow\n##press\nLiterary\ncapability\nnursing\npreceding\nlamp\nThomson\nMorton\n##ctic\nCrew\nClose\ncomposers\nboom\nClare\nmissiles\n112\nhunter\nsnap\n##oni\n##tail\nUs\ndeclaration\n##cock\nrally\nhuh\nlion\nstraightened\nPhilippe\nSutton\nalpha\nvalued\nmaker\nnavigation\ndetected\nfavorable\nperception\nCharter\n##ña\nRicky\nrebounds\ntunnels\nslapped\nEmergency\nsupposedly\n##act\ndeployment\nsocialist\ntubes\nanybody\ncorn\n##NA\nSeminary\nheating\npump\n##AA\nachieving\nsouls\n##ass\nLink\n##ele\n##smith\ngreeted\nBates\nAmericas\nElder\ncure\ncontestant\n240\nfold\nRunner\nUh\nlicked\nPolitics\ncommittees\nneighbors\nfairy\nSilva\nLeipzig\ntipped\ncorrectly\nexciting\nelectronics\nfoundations\ncottage\ngovernmental\n##hat\nallied\nclaws\npresidency\ncruel\nAgreement\nslender\naccompanying\nprecisely\n##pass\ndriveway\nswim\nStand\ncrews\n##mission\nrely\neveryday\nWings\ndemo\n##hic\nrecreational\nmin\nnationality\n##duction\nEaster\n##hole\ncanvas\nKay\nLeicester\ntalented\nDiscovery\nshells\n##ech\nKerry\nFerguson\nLeave\n##place\naltogether\nadopt\nbutt\nwolves\n##nsis\n##ania\nmodest\nsoprano\nBoris\n##ught\nelectron\ndepicts\nhid\ncruise\ndiffer\ntreasure\n##nch\nGun\nMama\nBengali\ntrainer\nmerchants\ninnovation\npresumably\nShirley\nbottles\nproceeds\nFear\ninvested\nPirates\nparticle\nDominic\nblamed\nFight\nDaisy\n##pper\n##graphic\nnods\nknight\nDoyle\ntales\nCarnegie\nEvil\nInter\nShore\nNixon\ntransform\nSavannah\n##gas\nBaltic\nstretching\nworlds\nprotocol\nPercy\nToby\nHeroes\nbrave\ndancers\n##aria\nbackwards\nresponses\nChi\nGaelic\nBerry\ncrush\nembarked\npromises\nMadonna\nresearcher\nrealised\ninaugurated\nCherry\nMikhail\nNottingham\nreinforced\nsubspecies\nrapper\n##kie\nDreams\nRe\nDamon\nMinneapolis\nmonsters\nsuspicion\nTel\nsurroundings\nafterward\ncomplaints\nOF\nsectors\nAlgeria\nlanes\nSabha\nobjectives\nDonna\nbothered\ndistracted\ndeciding\n##ives\n##CA\n##onia\nbishops\nStrange\nmachinery\nVoiced\nsynthesis\nreflects\ninterference\n##TS\n##ury\nkeen\n##ign\nfrown\nfreestyle\nton\nDixon\nSacred\nRuby\nPrison\n##ión\n1825\noutfit\n##tain\ncuriosity\n##ight\nframes\nsteadily\nemigrated\nhorizon\n##erly\nDoc\nphilosophical\nTable\nUTC\nMarina\n##DA\nsecular\n##eed\nZimbabwe\ncops\nMack\nsheriff\nSanskrit\nFrancesco\ncatches\nquestioning\nstreaming\nKill\ntestimony\nhissed\ntackle\ncountryside\ncopyright\n##IP\nBuddhism\n##rator\nladder\n##ON\nPast\nrookie\ndepths\n##yama\n##ister\n##HS\nSamantha\nDana\nEducational\nbrows\nHammond\nraids\nenvelope\n##sco\n##hart\n##ulus\nepic\ndetection\nStreets\nPotter\nstatistical\nfür\nni\naccounting\n##pot\nemployer\nSidney\nDepression\ncommands\nTracks\naveraged\nlets\nRam\nlongtime\nsuits\nbranded\nchip\nShield\nloans\nought\nSaid\nsip\n##rome\nrequests\nVernon\nbordered\nveterans\n##ament\nMarsh\nHerzegovina\nPine\n##igo\nmills\nanticipation\nreconnaissance\n##ef\nexpectations\nprotested\narrow\nguessed\ndepot\nmaternal\nweakness\n##ap\nprojected\npour\nCarmen\nprovider\nnewer\nremind\nfreed\n##rily\n##wal\n##tones\nintentions\nFiji\ntiming\nMatch\nmanagers\nKosovo\nHerman\nWesley\nChang\n135\nsemifinals\nshouting\nIndo\nJaneiro\nChess\nMacedonia\nBuck\n##onies\nrulers\nMail\n##vas\n##sel\nMHz\nProgramme\nTask\ncommercially\nsubtle\npropaganda\nspelled\nbowling\nbasically\nRaven\n1828\nColony\n109\n##ingham\n##wara\nanticipated\n1829\n##iers\ngraduates\n##rton\n##fication\nendangered\nISO\ndiagnosed\n##tage\nexercises\nBattery\nbolt\npoison\ncartoon\n##ción\nhood\nbowed\nheal\nMeyer\nReagan\n##wed\nsubfamily\n##gent\nmomentum\ninfant\ndetect\n##sse\nChapman\nDarwin\nmechanics\nNSW\nCancer\nBrooke\nNuclear\ncomprised\nhire\nsanctuary\nwingspan\ncontrary\nremembering\nsurprising\nBasic\nstealing\nOS\nhatred\n##lled\nmasters\nviolation\nRule\n##nger\nassuming\nconquered\nlouder\nrobe\nBeatles\nlegitimate\n##vation\nmassacre\nRica\nunsuccessfully\npoets\n##enberg\ncareers\ndoubled\npremier\nbattalions\nDubai\nPaper\nLouisville\ngestured\ndressing\nsuccessive\nmumbled\nVic\nreferee\npupil\n##cated\n##rre\nceremonies\npicks\n##IN\ndiplomat\nalike\ngeographical\nrays\n##HA\n##read\nharbour\nfactories\npastor\nplaywright\nUltimate\nnationalist\nuniforms\nobtaining\nkit\nAmber\n##pling\nscreenwriter\nancestry\n##cott\nFields\nPR\nColeman\nrat\nBavaria\nsqueeze\nhighlighted\nAdult\nreflecting\nMel\n1824\nbicycle\norganizing\nsided\nPreviously\nUnderground\nProf\nathletics\ncoupled\nmortal\nHampton\nworthy\nimmune\nAva\n##gun\nencouraging\nsimplified\n##ssa\n##nte\n##ann\nProvidence\nentities\nPablo\nStrong\nHousing\n##ista\n##ators\nkidnapped\nmosque\nKirk\nwhispers\nfruits\nshattered\nfossil\nEmpress\nJohns\nWebster\nThing\nrefusing\ndifferently\nspecimen\nHa\n##EN\n##tina\n##elle\n##night\nHorn\nneighbourhood\nBolivia\n##rth\ngenres\nPre\n##vich\nAmelia\nswallow\nTribune\nForever\nPsychology\nUse\n##bers\nGazette\nash\n##usa\nMonster\n##cular\ndelegation\nblowing\nOblast\nretreated\nautomobile\n##ex\nprofits\nshirts\ndevil\nTreasury\n##backs\nDrums\nRonnie\ngameplay\nexpertise\nEvening\nresides\nCaesar\nunity\nCrazy\nlinking\nVision\ndonations\nIsabel\nvalve\nSue\nWWE\nlogical\navailability\nfitting\nrevolt\n##mill\nLinux\ntaxi\nAccess\npollution\nstatues\nAugustus\n##pen\ncello\n##some\nlacking\n##ati\nGwen\n##aka\n##ovich\n1821\nWow\ninitiatives\nUruguay\nCain\nstroked\nexamine\n##ī\nmentor\nmoist\ndisorders\nbuttons\n##tica\n##anna\nSpecies\nLynch\nmuseums\nscorer\nPoor\neligibility\nop\nunveiled\ncats\nTitle\nwheat\ncritically\nSyracuse\n##osis\nmarketed\nenhance\nRyder\n##NG\n##ull\n##rna\nembedded\nthrows\nfoods\nhappily\n##ami\nlesson\nformats\npunched\n##rno\nexpressions\nqualities\n##sal\nGods\n##lity\nelect\nwives\n##lling\njungle\nToyota\nreversed\nGrammar\nCloud\nAgnes\n##ules\ndisputed\nverses\nLucien\nthreshold\n##rea\nscanned\n##bled\n##dley\n##lice\nKazakhstan\nGardner\nFreeman\n##rz\ninspection\nRita\naccommodation\nadvances\nchill\nElliot\nthriller\nConstantinople\n##mos\ndebris\nwhoever\n1810\nSanto\nCarey\nremnants\nGuatemala\n##irs\ncarriers\nequations\nmandatory\n##WA\nanxious\nmeasurement\nSummit\nTerminal\nErin\n##zes\nLLC\n##uo\nglancing\nsin\n##₃\nDowntown\nflowering\nEuro\nLeigh\nLance\nwarn\ndecent\nrecommendations\n##ote\nQuartet\n##rrell\nClarence\ncolleague\nguarantee\n230\nClayton\nBeast\naddresses\nprospect\ndestroyer\nvegetables\nLeadership\nfatal\nprints\n190\n##makers\nHyde\npersuaded\nillustrations\nSouthampton\nJoyce\nbeats\neditors\nmount\n##grave\nMalaysian\nBombay\nendorsed\n##sian\n##bee\napplying\nReligion\nnautical\nbomber\nNa\nairfield\ngravel\n##rew\nCave\nbye\ndig\ndecree\nburden\nElection\nHawk\nFe\n##iled\nreunited\n##tland\nliver\nTeams\nPut\ndelegates\nElla\n##fect\nCal\ninvention\nCastro\nbored\n##kawa\n##ail\nTrinidad\nNASCAR\npond\ndevelops\n##pton\nexpenses\nZoe\nReleased\n##rf\norgans\nbeta\nparameters\nNeill\n##lene\nlateral\nBeat\nblades\nEither\n##hale\nMitch\n##ET\n##vous\nRod\nburnt\nphones\nRising\n##front\ninvestigating\n##dent\nStephanie\n##keeper\nscreening\n##uro\nSwan\nSinclair\nmodes\nbullets\nNigerian\nmelody\n##ques\nRifle\n##12\n128\n##jin\ncharm\nVenus\n##tian\nfusion\nadvocated\nvisitor\npinned\ngenera\n3000\nFerry\nSolo\nquantity\nregained\nplatinum\nshoots\nnarrowly\npreceded\nupdate\n##ichi\nequality\nunaware\nregiments\nally\n##tos\ntransmitter\nlocks\nSeeing\noutlets\nfeast\nreopened\n##ows\nstruggles\nBuddy\n1826\nbark\nelegant\namused\nPretty\nthemed\nschemes\nLisbon\nTe\npatted\nterrorism\nMystery\n##croft\n##imo\nMadagascar\nJourney\ndealer\ncontacted\n##quez\nITV\nvacation\nWong\nSacramento\norganisms\n##pts\nbalcony\ncoloured\nsheer\ndefines\nMC\nabortion\nforbidden\naccredited\nNewfoundland\ntendency\nentrepreneur\nBenny\nTanzania\nneeding\nfinalist\nmythology\nweakened\ngown\nsentences\nGuest\nwebsites\nTibetan\nUFC\nvoluntary\nannoyed\nWelcome\nhonestly\ncorrespondence\ngeometry\nDeutsche\nBiology\nHelp\n##aya\nLines\nHector\n##ael\nreluctant\n##ages\nwears\ninquiry\n##dell\nHolocaust\nTourism\nWei\nvolcanic\n##mates\nVisual\nsorts\nneighborhoods\nRunning\napple\nshy\nLaws\nbend\nNortheast\nfeminist\nSpeedway\nMurder\nvisa\nstuffed\nfangs\ntransmitted\nfiscal\nAin\nenlarged\n##ndi\nCecil\nPeterson\nBenson\nBedford\nacceptable\n##CC\n##wer\npurely\ntriangle\nfoster\nAlberto\neducator\nHighland\nacute\nLGBT\nTina\nMi\nadventures\nDavidson\nHonda\ntranslator\nmonk\nenacted\nsummoned\n##ional\ncollector\nGenesis\nUn\nliner\nDi\nStatistical\n##CS\nfilter\nKnox\nReligious\nStella\nEstonian\nTurn\n##ots\nprimitive\nparishes\n##lles\ncomplexity\nautobiography\nrigid\ncannon\npursuing\nexploring\n##gram\n##mme\nfreshman\ncaves\nExpedition\nTraditional\niTunes\ncertification\ncooling\n##ort\n##gna\n##IT\n##lman\n##VA\nMotion\nexplosive\nlicence\nboxer\nshrine\nloosely\nBrigadier\nSavage\nBrett\nMVP\nheavier\n##elli\n##gged\nBuddha\nEasy\nspells\nfails\nincredibly\nGeorg\nstern\ncompatible\nPerfect\napplies\ncognitive\nexcessive\nnightmare\nneighbor\nSicily\nappealed\nstatic\n##₁\nAberdeen\n##leigh\nslipping\nbride\n##guard\nUm\nClyde\n1818\n##gible\nHal\nFrost\nSanders\ninteractive\nHour\n##vor\nhurting\nbull\ntermed\nshelf\ncapturing\n##pace\nrolls\n113\n##bor\nChilean\nteaches\n##rey\nexam\nshipped\nTwin\nborrowed\n##lift\nShit\n##hot\nLindsay\nBelow\nKiev\nLin\nleased\n##sto\nEli\nDiane\nVal\nsubtropical\nshoe\nBolton\nDragons\n##rification\nVatican\n##pathy\nCrisis\ndramatically\ntalents\nbabies\n##ores\nsurname\n##AP\n##cology\ncubic\nopted\nArcher\nsweep\ntends\nKarnataka\nJudy\nstint\nSimilar\n##nut\nexplicitly\n##nga\ninteract\nMae\nportfolio\nclinic\nabbreviated\nCounties\n##iko\nhearts\n##ı\nproviders\nscreams\nIndividual\n##etti\nMonument\n##iana\naccessed\nencounters\ngasp\n##rge\ndefunct\nAvery\n##rne\nnobility\nuseless\nPhase\nVince\nsenator\n##FL\n1813\nsurprisingly\n##illo\n##chin\nBoyd\nrumors\nequity\nGone\nHearts\nchassis\novernight\nTrek\nwrists\nsubmit\ncivic\ndesigners\n##rity\nprominence\ndecorative\nderives\nstarter\n##AF\nwisdom\nPowers\nreluctantly\nmeasurements\ndoctoral\nNoel\nGideon\nBaden\nCologne\nlawn\nHawaiian\nanthology\n##rov\nRaiders\nembassy\nSterling\n##pal\nTelugu\ntroubled\n##FC\n##bian\nfountain\nobserve\nore\n##uru\n##gence\nspelling\nBorder\ngrinning\nsketch\nBenedict\nXbox\ndialects\nreadily\nimmigrant\nConstitutional\naided\nnevertheless\nSE\ntragedy\n##ager\n##rden\nFlash\n##MP\nEuropa\nemissions\n##ield\npanties\nBeverly\nHomer\ncurtain\n##oto\ntoilet\nIsn\nJerome\nChiefs\nHermann\nsupernatural\njuice\nintegrity\nScots\nauto\nPatriots\nStrategic\nengaging\nprosecution\ncleaned\nByron\ninvestments\nadequate\nvacuum\nlaughs\n##inus\n##nge\nUsually\nRoth\nCities\nBrand\ncorpse\n##ffy\nGas\nrifles\nPlains\nsponsorship\nLevi\ntray\nowed\ndella\ncommanders\n##ead\ntactical\n##rion\nGarcía\nharbor\ndischarge\n##hausen\ngentleman\nendless\nhighways\n##itarian\npleaded\n##eta\narchive\nMidnight\nexceptions\ninstances\nGibraltar\ncart\n##NS\nDarren\nBonnie\n##yle\n##iva\nOCLC\nbra\nJess\n##EA\nconsulting\nArchives\nChance\ndistances\ncommissioner\n##AR\nLL\nsailors\n##sters\nenthusiasm\nLang\n##zia\nYugoslav\nconfirm\npossibilities\nSuffolk\n##eman\nbanner\n1822\nSupporting\nfingertips\ncivilization\n##gos\ntechnically\n1827\nHastings\nsidewalk\nstrained\nmonuments\nFloyd\nChennai\nElvis\nvillagers\nCumberland\nstrode\nalbeit\nBelieve\nplanets\ncombining\nMohammad\ncontainer\n##mouth\n##tures\nverb\nBA\nTank\nMidland\nscreened\nGang\nDemocracy\nHelsinki\nscreens\nthread\ncharitable\n##version\nswiftly\nma\nrational\ncombine\n##SS\n##antly\ndragging\nCliff\nTasmania\nquest\nprofessionally\n##aj\nrap\n##lion\nlivestock\n##hua\ninformal\nspecially\nlonely\nMatthews\nDictionary\n1816\nObservatory\ncorrespondent\nconstitute\nhomeless\nwaving\nappreciated\nAnalysis\nMeeting\ndagger\n##AL\nGandhi\nflank\nGiant\nChoir\n##not\nglimpse\ntoe\nWriter\nteasing\nsprings\n##dt\nGlory\nhealthcare\nregulated\ncomplaint\nmath\nPublications\nmakers\n##hips\ncement\nNeed\napologize\ndisputes\nfinishes\nPartners\nboring\nups\ngains\n1793\nCongressional\nclergy\nFolk\n##made\n##nza\nWaters\nstays\nencoded\nspider\nbetrayed\nApplied\ninception\n##urt\n##zzo\nwards\nbells\nUCLA\nWorth\nbombers\nMo\ntrademark\nPiper\n##vel\nincorporates\n1801\n##cial\ndim\nTwelve\n##word\nAppeals\ntighter\nspacecraft\n##tine\ncoordinates\n##iac\nmistakes\nZach\nlaptop\nTeresa\n##llar\n##yr\nfavored\nNora\nsophisticated\nIrving\nhammer\nDivisión\ncorporations\nniece\n##rley\nPatterson\nUNESCO\ntrafficking\nMing\nbalanced\nplaque\nLatvia\nbroader\n##owed\nSave\nconfined\n##vable\nDalton\ntide\n##right\n##ural\n##num\nswords\ncaring\n##eg\nIX\nActing\npaved\n##moto\nlaunching\nAntoine\nsubstantially\nPride\nPhilharmonic\ngrammar\nIndoor\nEnsemble\nenabling\n114\nresided\nAngelo\npublicity\nchaired\ncrawled\nMaharashtra\nTelegraph\nlengthy\npreference\ndifferential\nanonymous\nHoney\n##itation\nwage\n##iki\nconsecrated\nBryant\nregulatory\nCarr\n##én\nfunctioning\nwatches\n##ú\nshifts\ndiagnosis\nSearch\napp\nPeters\n##SE\n##cat\nAndreas\nhonours\ntemper\ncounsel\nUrdu\nAnniversary\nmaritime\n##uka\nharmony\n##unk\nessence\nLorenzo\nchoked\nQuarter\nindie\n##oll\nloses\n##prints\namendment\nAdolf\nscenario\nsimilarities\n##rade\n##LC\ntechnological\nmetric\nRussians\nthoroughly\n##tead\ncruiser\n1806\n##nier\n1823\nTeddy\n##psy\nau\nprogressed\nexceptional\nbroadcaster\npartnered\nfitness\nirregular\nplacement\nmothers\nunofficial\nGarion\nJohannes\n1817\nregain\nSolar\npublishes\nGates\nBroken\nthirds\nconversations\ndive\nRaj\ncontributor\nquantities\nWorcester\ngovernance\n##flow\ngenerating\npretending\nBelarus\n##voy\nradius\nskating\nMarathon\n1819\naffection\nundertook\n##wright\nlos\n##bro\nlocate\nPS\nexcluded\nrecreation\ntortured\njewelry\nmoaned\n##logue\n##cut\nComplete\n##rop\n117\n##II\nplantation\nwhipped\nslower\ncrater\n##drome\nVolunteer\nattributes\ncelebrations\nregards\nPublishers\noath\nutilized\nRobbie\nGiuseppe\nfiber\nindication\nmelted\narchives\nDamien\nstorey\naffecting\nidentifying\ndances\nalumni\ncomparable\nupgrade\nrented\nsprint\n##kle\nMarty\n##lous\ntreating\nrailways\nLebanese\nerupted\noccupy\nsympathy\nJude\nDarling\nQatar\ndrainage\nMcCarthy\nheel\nKlein\ncomputing\nwireless\nflip\nDu\nBella\n##ast\n##ssen\nnarrator\nmist\nsings\nalignment\n121\n2020\nsecuring\n##rail\nProgress\nmissionaries\nbrutal\nmercy\n##shing\nHip\n##ache\n##olo\nswitching\n##here\nMalay\n##ob\nconstituted\nMohammed\nOften\nstandings\nsurge\nteachings\nink\ndetached\nsystematic\nTrial\nMyanmar\n##wo\noffs\nReyes\ndecoration\ntranslations\nwherever\nreviewer\nspeculation\nBangkok\nterminated\n##ester\nbeard\nRCA\nAidan\nAssociated\nEmerson\nCharity\n1803\ngenerous\nDudley\nATP\n##haven\nprizes\ntoxic\ngloves\n##iles\n##dos\nTurning\nmyth\nParade\n##building\nHits\n##eva\nteamed\nAbove\nDuchess\nHolt\n##oth\nSub\nAce\natomic\ninform\nShip\ndepend\nJun\n##bes\nNorwich\nglobe\nBaroque\nChristina\nCotton\nTunnel\nkidding\nConcerto\nBrittany\ntasted\nphases\nstems\nangles\n##TE\n##nam\n##40\ncharted\nAlison\nintensive\nWillis\nglory\n##lit\nBergen\nest\ntaller\n##dicate\nlabeled\n##ido\ncommentator\nWarrior\nViscount\nshortened\naisle\nAria\nSpike\nspectators\ngoodbye\noverlooking\nmammals\n##lude\nwholly\nBarrett\n##gus\naccompany\nseventy\nemploy\n##mb\nambitious\nbeloved\nbasket\n##mma\n##lding\nhalted\ndescendant\npad\nexclaimed\ncloak\n##pet\nStrait\nBang\nAviv\nsadness\n##ffer\nDonovan\n1880s\nagenda\nswinging\n##quin\njerk\nBoat\n##rist\nnervously\nSilence\nEcho\nshout\nimplies\n##iser\n##cking\nShiva\nWeston\ndamages\n##tist\neffectiveness\nHorace\ncycling\nRey\nache\nPhotography\nPDF\nDear\nleans\nLea\n##vision\nbooth\nattained\ndisbelief\n##eus\n##ution\nHop\npension\ntoys\nEurovision\nfaithful\n##heads\nAndre\nowe\ndefault\nAtlas\nMegan\nhighlights\nlovers\nConstantine\nSixth\nmasses\n##garh\nemerge\nAuto\nSlovak\n##oa\n##vert\nSuperintendent\nflicked\ninventor\nChambers\nFrankie\nRomeo\npottery\ncompanions\nRudolf\n##liers\ndiary\nUnless\ntap\nalter\nRandall\n##ddle\n##eal\nlimitations\n##boards\nutterly\nknelt\nguaranteed\nCowboys\nIslander\nhorns\n##ike\nWendy\nsexually\nSmart\nbreasts\n##cian\ncompromise\nDuchy\nAT\nGalaxy\nanalog\nStyle\n##aking\nweighed\nNigel\noptional\nCzechoslovakia\npracticing\nHam\n##0s\nfeedback\nbatted\nuprising\noperative\napplicable\ncriminals\nclassrooms\nSomehow\n##ode\n##OM\nNaomi\nWinchester\n##pping\nBart\nRegina\ncompetitor\nRecorded\nYuan\nVera\nlust\nConfederation\n##test\nsuck\n1809\nLambert\n175\nFriend\n##ppa\nSlowly\n##⁺\nWake\nDec\n##aneous\nchambers\nColor\nGus\n##site\nAlternative\n##world\nExeter\nOmaha\ncelebrities\nstriker\n210\ndwarf\nmeals\nOriental\nPearson\nfinancing\nrevenues\nunderwater\nSteele\nscrew\nFeeling\nMt\nacids\nbadge\nswore\ntheaters\nMoving\nadmired\nlung\nknot\npenalties\n116\nfork\n##cribed\nAfghan\noutskirts\nCambodia\noval\nwool\nfossils\nNed\nCountess\nDarkness\ndelicious\n##nica\nEvelyn\nRecordings\nguidelines\n##CP\nSandra\nmeantime\nAntarctica\nmodeling\ngranddaughter\n##rial\nRoma\nSeventh\nSunshine\nGabe\n##nton\nShop\nTurks\nprolific\nsoup\nparody\n##nta\nJudith\ndisciplines\nresign\nCompanies\nLibya\nJets\ninserted\nMile\nretrieve\nfilmmaker\n##rand\nrealistic\nunhappy\n##30\nsandstone\n##nas\n##lent\n##ush\n##rous\nBrent\ntrash\nRescue\n##unted\nAutumn\ndisgust\nflexible\ninfinite\nsideways\n##oss\n##vik\ntrailing\ndisturbed\n50th\nNewark\nposthumously\n##rol\nSchmidt\nJosef\n##eous\ndetermining\nmenu\nPole\nAnita\nLuc\npeaks\n118\nYard\nwarrant\ngeneric\ndeserted\nWalking\nstamp\ntracked\n##berger\npaired\nsurveyed\nsued\nRainbow\n##isk\nCarpenter\nsubmarines\nrealization\ntouches\nsweeping\nFritz\nmodule\nWhether\nresembles\n##form\n##lop\nunsure\nhunters\nZagreb\nunemployment\nSenators\nGeorgetown\n##onic\nBarker\nfoul\ncommercials\nDresden\nWords\ncollision\nCarlton\nFashion\ndoubted\n##ril\nprecision\nMIT\nJacobs\nmob\nMonk\nretaining\ngotta\n##rod\nremake\nFast\nchips\n##pled\nsufficiently\n##lights\ndelivering\n##enburg\nDancing\nBarton\nOfficers\nmetals\n##lake\nreligions\n##ré\nmotivated\ndiffers\ndorsal\n##birds\n##rts\nPriest\npolished\n##aling\nSaxony\nWyatt\nknockout\n##hor\nLopez\nRNA\n##link\nmetallic\n##kas\ndaylight\nMontenegro\n##lining\nwrapping\nresemble\nJam\nViking\nuncertainty\nangels\nenables\n##fy\nStuttgart\ntricks\ntattoo\n127\nwicked\nasset\nbreach\n##yman\nMW\nbreaths\nJung\nim\n1798\nnoon\nvowel\n##qua\ncalmly\nseasonal\nchat\ningredients\ncooled\nRandolph\nensuring\n##ib\n##idal\nflashing\n1808\nMacedonian\nCool\ncouncils\n##lick\nadvantages\nImmediately\nMadras\n##cked\nPain\nfancy\nchronic\nMalayalam\nbegged\n##nese\nInner\nfeathers\n##vey\nNames\ndedication\nSing\npan\nFischer\nnurses\nSharp\ninning\nstamps\nMeg\n##ello\nedged\nmotioned\nJacksonville\n##ffle\n##dic\n##US\ndivide\ngarnered\nRanking\nchasing\nmodifications\n##oc\nclever\nmidst\nflushed\n##DP\nvoid\n##sby\nambulance\nbeaches\ngroan\nisolation\nstrengthen\nprevention\n##ffs\nScouts\nreformed\ngeographic\nsquadrons\nFiona\nKai\nConsequently\n##uss\novertime\n##yas\nFr\n##BL\nPapua\nMixed\nglances\nHaiti\nSporting\nsandy\nconfronted\nRené\nTanner\n1811\n##IM\nadvisory\ntrim\n##ibe\nGonzález\ngambling\nJupiter\n##ility\n##owski\n##nar\n122\napology\nteased\nPool\nfeminine\nwicket\neagle\nshiny\n##lator\nblend\npeaking\nnasty\nnodding\nfraction\ntech\nNoble\nKuwait\nbrushing\nItalia\nCanberra\nduet\nJohan\n1805\nWritten\ncameo\nStalin\npig\ncord\n##zio\nSurely\nSA\nowing\nholidays\n123\nRanger\nlighthouse\n##ige\nminers\n1804\n##ë\n##gren\n##ried\ncrashing\n##atory\nwartime\nhighlight\ninclined\nTorres\nTax\n##zel\n##oud\nOwn\n##corn\nDivine\nEMI\nRelief\nNorthwestern\nethics\nBMW\nclick\nplasma\nChristie\ncoordinator\nShepherd\nwashing\ncooked\n##dio\n##eat\nCerambycidae\nalgebra\nEngine\ncostumes\nVampire\nvault\nsubmission\nvirtue\nassumption\n##rell\nToledo\n##oting\n##rva\ncrept\nemphasized\n##lton\n##ood\nGreeks\nsurgical\ncrest\nPatrol\nBeta\nTessa\n##GS\npizza\ntraits\nrats\nIris\nspray\n##GC\nLightning\nbinary\nescapes\n##take\nClary\ncrowds\n##zong\nhauled\nmaid\n##fen\nManning\n##yang\nNielsen\naesthetic\nsympathetic\naffiliation\nsoaked\nMozart\npersonalities\nbegging\n##iga\nclip\nRaphael\nyearly\nLima\nabundant\n##lm\n1794\nstrips\nInitiative\nreporters\n##vsky\nconsolidated\n##itated\nCivic\nrankings\nmandate\nsymbolic\n##ively\n1807\nrental\nduck\nnave\ncomplications\n##nor\nIrene\nNazis\nhaunted\nscholarly\nPratt\nGran\nEmbassy\nWave\npity\ngenius\nbats\ncanton\nTropical\nmarker\n##cos\nescorted\nClimate\n##posed\nappreciation\nfreezing\npuzzle\nInternal\npools\nShawn\npathway\nDaniels\nFitzgerald\nextant\nolive\nVanessa\nmarriages\ncocked\n##dging\nprone\nchemicals\ndoll\ndrawer\n##HF\nStark\nProperty\n##tai\nflowed\nSheridan\n##uated\nLess\nOmar\nremarks\ncatalogue\nSeymour\nwreck\nCarrie\n##bby\nMercer\ndisplaced\nsovereignty\nrip\nFlynn\nArchie\nQuarterfinals\nHassan\n##ards\nvein\nOsaka\npouring\nwages\nRomance\n##cript\n##phere\n550\n##eil\n##stown\nDocumentary\nancestor\nCNN\nPanthers\npublishers\nRise\n##mu\nbiting\nBright\nString\nsucceeding\n119\nloaned\nWarwick\nSheikh\nVon\nAfterwards\nJax\nCamden\nhelicopters\nHence\nLaurel\n##ddy\ntransaction\nCorp\nclause\n##owing\n##kel\nInvestment\ncups\nLucia\nMoss\nGiles\nchef\nLópez\ndecisive\n30th\ndistress\nlinguistic\nsurveys\nReady\nmaiden\nTouch\nfrontier\nincorporate\nexotic\nmollusk\nLeopold\nRide\n##wain\n##ndo\nteammates\ntones\ndrift\nordering\nFeb\nPenny\nNormandy\nPresent\nFlag\npipes\n##rro\ndelight\nmotto\nTibet\nleap\nEliza\nProduced\nteenagers\nsitcom\nTry\nHansen\nCody\nwandered\nterrestrial\nfrog\nscare\nresisted\nemployers\ncoined\n##DS\nresistant\nFly\ncaptive\ndissolution\njudged\nassociates\ndefining\n##court\nHale\n##mbo\nraises\nclusters\ntwelfth\n##metric\nRoads\n##itude\nsatisfy\nAndroid\nReds\nGloucester\nCategory\nValencia\nDaemon\nstabbed\nLuna\nChurches\nCanton\n##eller\nAttack\nKashmir\nannexed\ngrabs\nasteroid\nHartford\nrecommendation\nRodriguez\nhanding\nstressed\nfrequencies\ndelegate\nBones\nErie\nWeber\nHands\nActs\nmillimetres\n24th\nFat\nHowe\ncasually\n##SL\nconvent\n1790\nIF\n##sity\n1795\nyelling\n##ises\ndrain\naddressing\namino\nMarcel\nSylvia\nParamount\nGerard\nVolleyball\nbutter\n124\nAlbion\n##GB\ntriggered\n1792\nfolding\naccepts\n##ße\npreparations\nWimbledon\ndose\n##grass\nescaping\n##tling\nimport\ncharging\n##dation\n280\nNolan\n##fried\nCalcutta\n##pool\nCove\nexamining\nminded\nheartbeat\ntwisting\ndomains\nbush\nTunisia\nPurple\nLeone\n##code\nevacuated\nbattlefield\ntiger\nElectrical\n##ared\nchased\n##cre\ncultivated\nJet\nsolved\nshrug\nringing\nImpact\n##iant\nkilometre\n##log\ncommemorate\nmigrated\nsingular\ndesigning\npromptly\nHiggins\n##own\n##aves\nfreshwater\nMarketing\nPayne\nbeg\nlocker\npray\nimplied\nAAA\ncorrected\nTrans\nEuropeans\nAshe\nacknowledge\nIntroduction\n##writer\n##llen\nMunster\nauxiliary\ngrowl\nHours\nPoems\n##AT\nreduces\nPlain\nplague\ncanceled\ndetention\npolite\nnecklace\nGustav\n##gu\n##lance\nEn\nAngola\n##bb\ndwelling\n##hea\n5000\nQing\nDodgers\nrim\n##ored\n##haus\nspilled\nElisabeth\nViktor\nbackpack\n1802\namended\n##worthy\nPhantom\n##ctive\nkeeper\n##loom\nVikings\n##gua\nemploys\nTehran\nspecialty\n##bate\nMarx\nMirror\nJenna\nrides\nneedle\nprayers\nclarinet\nforewings\n##walk\nMidlands\nconvincing\nadvocacy\nCao\nBirds\ncycles\nClement\nGil\nbubble\nMaximum\nhumanitarian\nTan\ncries\n##SI\nParsons\nTrio\noffshore\nInnovation\nclutched\n260\n##mund\n##duct\nPrairie\nrelied\nFalcon\n##ste\nKolkata\nGill\nSwift\nNegro\nZoo\nvalleys\n##OL\nOpening\nbeams\nMPs\noutline\nBermuda\nPersonal\nexceed\nproductive\n##MT\nrepublic\nforum\n##sty\ntornado\nKnown\ndipped\nEdith\nfolks\nmathematician\nwatershed\nRicardo\nsynthetic\n##dication\ndeity\n##₄\ngaming\nsubjected\nsuspects\nFoot\nswollen\nMotors\n##tty\n##ý\naloud\nceremonial\nes\nnuts\nintend\nCarlisle\ntasked\nhesitation\nsponsors\nunified\ninmates\n##ctions\n##stan\ntiles\njokes\nwhereby\noutcomes\nLights\nscary\nStoke\nPortrait\nBlind\nsergeant\nviolations\ncultivation\nfuselage\nMister\nAlfonso\ncandy\nsticks\nteen\nagony\nEnough\ninvite\nPerkins\nAppeal\nmapping\nundergo\nGlacier\nMelanie\naffects\nincomplete\n##dd\nColombian\n##nate\nCBC\npurchasing\nbypass\nDrug\nElectronics\nFrontier\nCoventry\n##aan\nautonomy\nscrambled\nRecent\nbounced\ncow\nexperiencing\nRouge\ncuisine\nElite\ndisability\nJi\ninheritance\nwildly\nInto\n##wig\nconfrontation\nWheeler\nshiver\nPerforming\naligned\nconsequently\nAlexis\nSin\nwoodland\nexecutives\nStevenson\nFerrari\ninevitable\n##cist\n##dha\n##base\nCorner\ncomeback\nLeón\n##eck\n##urus\nMacDonald\npioneering\nbreakdown\nlandscapes\nVeterans\nRican\nTheological\nstirred\nparticipant\nCredit\nHyderabad\nsnails\nClaudia\n##ocene\ncompliance\n##MI\nFlags\nMiddlesex\nstorms\nwinding\nasserted\ner\n##ault\n##kal\nwaking\n##rates\nabbey\nAugusta\ntooth\ntrustees\nCommodore\n##uded\nCunningham\nNC\nWitch\nmarching\nSword\nSame\nspiral\nHarley\n##ahan\nZack\nAudio\n1890s\n##fit\nSimmons\nKara\nVeronica\nnegotiated\nSpeaking\nFIBA\nConservatory\nformations\nconstituencies\nexplicit\nfacial\neleventh\n##ilt\nvillain\n##dog\n##case\n##hol\narmored\ntin\nhairs\n##umi\n##rai\nmattress\nAngus\ncease\nverbal\nRecreation\nsavings\nAurora\npeers\nMonastery\nAirways\ndrowned\nadditions\ndownstream\nsticking\nShi\nmice\nskiing\n##CD\nRaw\nRiverside\nwarming\nhooked\nboost\nmemorable\nposed\ntreatments\n320\n##dai\ncelebrating\nblink\nhelpless\ncirca\nFlowers\nPM\nuncommon\nOct\nHawks\noverwhelmed\nSparhawk\nrepaired\nMercy\npose\ncounterpart\ncompare\nsurvives\n##½\n##eum\ncoordinate\nLil\ngrandchildren\nnotorious\nYi\nJudaism\nJuliet\naccusations\n1789\nfloated\nmarathon\nroar\nfortified\nreunion\n145\nNov\nPaula\n##fare\n##toria\ntearing\nCedar\ndisappearance\nSi\ngifted\nscar\n270\nPBS\nTechnologies\nMarvin\n650\nroller\ncupped\nnegotiate\n##erman\npassport\ntram\nmiracle\nstyled\n##tier\nnecessity\nDes\nrehabilitation\nLara\nUSD\npsychic\nwipe\n##lem\nmistaken\n##lov\ncharming\nRider\npageant\ndynamics\nCassidy\n##icus\ndefenses\n##tadt\n##vant\naging\n##inal\ndeclare\nmistress\nsupervised\n##alis\n##rest\nAshton\nsubmerged\nsack\nDodge\ngrocery\nramp\nTeacher\nlineage\nimagery\narrange\ninscriptions\nOrganisation\nSiege\ncombines\npounded\nFleming\nlegends\ncolumnist\nApostolic\nprose\ninsight\nArabian\nexpired\n##uses\n##nos\nAlone\nelbows\n##asis\n##adi\n##combe\nStep\nWaterloo\nAlternate\ninterval\nSonny\nplains\nGoals\nincorporating\nrecruit\nadjoining\nCheshire\nexcluding\nmarrying\nducked\nCherokee\npar\n##inate\nhiking\nCoal\n##bow\nnatives\nribbon\nAllies\ncon\ndescriptions\npositively\n##lal\ndefendant\n22nd\nVivian\n##beat\nWeather\npossessions\nDate\nsweetheart\ninability\nSalisbury\nadviser\nideology\nNordic\n##eu\nCubs\nIP\nAdministrative\n##nick\nfacto\nliberation\nBurnett\nJavier\nfashioned\nElectoral\nTurin\ntheft\nunanimous\nPer\n1799\nClan\nHawkins\nTeachers\n##wes\nCameroon\nParkway\n##gment\ndemolition\natoms\nnucleus\n##thi\nrecovering\n##yte\n##vice\nlifts\nMust\ndeposit\nHancock\nSemi\ndarkened\nDeclaration\nmoan\nmuscular\nMyers\nattractions\nsauce\nsimulation\n##weed\nAlps\nbarriers\n##baum\nBarack\ngalleries\nMin\nholders\nGreenwich\ndonation\nEverybody\nWolfgang\nsandwich\nKendra\nCollegiate\ncasino\nSlavic\nensuing\nPorto\n##grapher\nJesuit\nsuppressed\ntires\nIbrahim\nprotesters\nIbn\nAmos\n1796\nphenomena\nHayden\nParaguay\nSquad\nReilly\ncomplement\naluminum\n##eers\ndoubts\ndecay\ndemise\nPractice\npatience\nfireplace\ntransparent\nmonarchy\n##person\nRodney\nmattered\nrotating\nClifford\ndisposal\nStandards\npaced\n##llie\narise\ntallest\ntug\ndocumentation\nnode\nfreeway\nNikolai\n##cite\nclicked\nimaging\nLorraine\nTactical\nDifferent\nRegular\nHolding\n165\nPilot\nguarded\n##polis\nClassics\nMongolia\nBrock\nmonarch\ncellular\nreceptors\nMini\nChandler\nfinanced\nfinancially\nLives\nerection\nFuller\nunnamed\nKannada\ncc\npassive\nplateau\n##arity\nfreak\n##rde\nretrieved\ntransactions\n##sus\n23rd\nswimmer\nbeef\nfulfill\nArlington\noffspring\nreasoning\nRhys\nsaves\npseudonym\ncentimetres\nshivered\nshuddered\n##ME\nFeel\n##otic\nprofessors\nBlackburn\n##eng\n##life\n##haw\ninterred\nlodge\nfragile\nDella\nguardian\n##bbled\ncatalog\nclad\nobserver\ntract\ndeclaring\n##headed\nLok\ndean\nIsabelle\n1776\nirrigation\nspectacular\nshuttle\nmastering\n##aro\nNathaniel\nRetired\n##lves\nBrennan\n##kha\ndick\n##dated\n##hler\nRookie\nleapt\ntelevised\nweekends\nBaghdad\nYemen\n##fo\nfactions\nion\nLab\nmortality\npassionate\nHammer\nencompasses\nconfluence\ndemonstrations\nKi\nderivative\nsoils\n##unch\nRanch\nUniversities\nconventions\noutright\naiming\nhierarchy\nreside\nillusion\ngraves\nrituals\n126\nAntwerp\nDover\n##ema\ncampuses\nHobart\nlifelong\naliens\n##vity\nMemory\ncoordination\nalphabet\n##mina\nTitans\npushes\nFlanders\n##holder\nNormal\nexcellence\ncapped\nprofound\nTaipei\nportrayal\nsparked\nscratch\nse\n##eas\n##hir\nMackenzie\n##cation\nNeo\nShin\n##lined\nmagnificent\nposter\nbatsman\n##rgent\npersuade\n##ement\nIcelandic\nmiserable\ncollegiate\nFeature\ngeography\n##mura\nComic\nCircus\nprocessor\nbarracks\nTale\n##11\nBulls\n##rap\nstrengthened\n##bell\ninjection\nminiature\nbroadly\nLetter\nfare\nhostage\ntraders\n##nium\n##mere\nFortune\nRivera\nLu\ntriumph\nBrowns\nBangalore\ncooperative\nBasel\nannouncing\nSawyer\n##him\n##cco\n##kara\ndarted\n##AD\n##nova\nsucking\n##position\nperimeter\nflung\nHoldings\n##NP\nBasque\nsketches\nAugustine\nSilk\nElijah\nanalyst\narmour\nriots\nacquiring\nghosts\n##ems\n132\nPioneer\nColleges\nSimone\nEconomy\nAuthor\nsemester\nSoldier\nil\n##unting\n##bid\nfreaking\nVista\ntumor\n##bat\nmurderer\n##eda\nunreleased\n##grove\n##sser\n##té\nedit\nstatute\nsovereign\n##gawa\nKiller\nstares\nFury\ncomply\n##lord\n##nant\nbarrels\nAndhra\nMaple\ngenerator\nmascot\nunusually\neds\n##ante\n##runner\nrod\n##tles\nHistorically\nJennings\ndumped\nEstablished\nresemblance\n##lium\n##cise\n##body\n##voke\nLydia\n##hou\n##iring\nnonetheless\n1797\ncorrupt\npatrons\nphysicist\nsneak\nLivingston\nCitizens\nArchitects\nWerner\ntrends\nMelody\neighty\nmarkings\nbrakes\n##titled\noversaw\nprocessed\nmock\nMidwest\nintervals\n##EF\nstretches\nwerewolf\n##MG\nPack\ncontroller\n##dition\nHonours\ncane\nGriffith\nvague\nrepertoire\nCourtney\norgasm\nAbdullah\ndominance\noccupies\nYa\nintroduces\nLester\ninstinct\ncollaborative\nIndigenous\nrefusal\n##rank\noutlet\ndebts\nspear\n155\n##keeping\n##ulu\nCatalan\n##osh\ntensions\n##OT\nbred\ncrude\nDunn\nabdomen\naccurately\n##fu\n##lough\naccidents\nRow\nAudrey\nrude\nGetting\npromotes\nreplies\nPaolo\nmerge\n##nock\ntrans\nEvangelical\nautomated\nCanon\n##wear\n##ggy\n##gma\nBroncos\nfoolish\nicy\nVoices\nknives\nAside\ndreamed\ngenerals\nmolecule\nAG\nrejection\ninsufficient\n##nagar\ndeposited\nsacked\nLanding\narches\nhelpful\ndevotion\nintake\nFlower\nPGA\ndragons\nevolutionary\n##mail\n330\nGM\ntissues\n##tree\narcade\ncomposite\nlid\nAcross\nimplications\nlacks\ntheological\nassessed\nconcentrations\nDen\n##mans\n##ulous\nFu\nhomeland\n##stream\nHarriet\necclesiastical\ntroop\necological\nwinked\n##xed\neighteenth\nCasino\nspecializing\n##sworth\nunlocked\nsupreme\ndevastated\nsnatched\ntrauma\nGDP\nNord\nsaddle\nWes\nconvenient\ncompetes\n##nu\n##iss\nMarian\nsubway\n##rri\nsuccesses\numbrella\n##far\n##ually\nDundee\n##cence\nspark\n##rix\n##я\nQuality\nGeological\ncockpit\nrpm\nCam\nBucharest\nriot\n##PM\nLeah\n##dad\n##pose\nKa\nm³\nBundesliga\nWolfe\ngrim\ntextile\nquartet\nexpressing\nfantastic\ndestroyers\neternal\npicnic\n##oro\ncontractor\n1775\nspanning\ndeclining\n##cating\nLowe\nSutherland\nEmirates\ndownward\nnineteen\nviolently\nscout\nviral\nmelting\nenterprises\n##cer\nCrosby\nJubilee\nantenna\nurgent\nRory\n##uin\n##sure\nwandering\n##gler\n##vent\nSuzuki\nLifetime\nDirty\noccupying\n##quent\nDisc\nGuru\nmound\nLennon\nHumanities\nlisteners\nWalton\nuh\nBraves\nBologna\n##bis\n##gra\nDwight\ncrawl\nflags\nmemoir\nThorne\nArchdiocese\ndairy\n##uz\n##tery\nroared\nadjust\npatches\ninn\nKnowing\n##bbed\n##zan\nscan\nPapa\nprecipitation\nangrily\npassages\npostal\nPhi\nembraced\nblacks\neconomist\ntriangular\nSen\nshooter\npunished\nMillennium\nSwimming\nconfessed\nAston\ndefeats\nEra\ncousins\nWilliamson\n##rer\ndaytime\ndumb\n##rek\nunderway\nspecification\nBuchanan\nprayed\nconcealed\nactivation\n##issa\ncanon\nawesome\nStarr\nplural\nsummers\n##fields\nSlam\nunnecessary\n1791\nresume\ntrilogy\ncompression\n##rough\nselective\ndignity\nYan\n##xton\nimmense\n##yun\nlone\nseeded\nhiatus\nlightweight\nsummary\nYo\napprove\nGalway\nrejoined\nElise\ngarbage\nburns\nspeeches\n129\nHonduras\n##liness\ninventory\njersey\nFK\nassure\nslumped\nLionel\nSuite\n##sbury\nLena\ncontinuation\n##AN\nbrightly\n##nti\nGT\nKnowledge\n##park\n##lius\nlethal\n##tribution\n##sions\nCertificate\nMara\n##lby\nalgorithms\nJade\nblows\npirates\nfleeing\nwheelchair\nStein\nsophomore\nAlt\nTerritorial\ndiploma\nsnakes\n##olic\n##tham\nTiffany\nPius\nflush\nurging\nHanover\nReich\n##olate\nUnity\nPike\ncollectively\nTheme\nballad\nkindergarten\nrocked\nzoo\n##page\nwhip\nRodríguez\nstrokes\nchecks\nBecky\nStern\nupstream\n##uta\nSilent\nvolunteered\nSigma\n##ingen\n##tract\n##ede\nGujarat\nscrewed\nentertaining\n##action\n##ryn\ndefenders\ninnocence\nlesbian\nque\nRichie\nnodes\nLie\njuvenile\nJakarta\nsafer\nconfront\nBert\nbreakthrough\ngospel\nCable\n##zie\ninstitutional\nArchive\nbrake\nliquor\nfeeds\n##iate\nchancellor\nEncyclopedia\nAnimation\nscanning\nteens\n##mother\nCore\nRear\nWine\n##flower\nreactor\nAve\ncardinal\nsodium\nstrands\nOlivier\ncrouched\nVaughan\nSammy\nImage\nscars\nEmmanuel\nflour\nbias\nnipple\nrevelation\n##ucci\nDenny\n##ssy\nForm\nRunners\nadmits\nRama\nviolated\nBurmese\nfeud\nunderwear\nMohamed\nNamed\nswift\nstatewide\nDoor\nRecently\ncomparing\nHundred\n##idge\n##nity\n##rds\nRally\nReginald\nAuburn\nsolving\nwaitress\nTreasurer\n##ilization\nHalloween\nMinisters\nBoss\nShut\n##listic\nRahman\ndemonstrating\n##pies\nGaza\nYuri\ninstallations\nMath\nschooling\n##bble\nBronx\nexiled\ngasoline\n133\nbundle\nhumid\nFCC\nproportional\nrelate\nVFL\n##dez\ncontinuity\n##cene\nsyndicated\natmospheric\narrows\nWanderers\nreinforcements\nWillow\nLexington\nRotten\n##yon\ndiscovering\nSerena\nportable\n##lysis\ntargeting\n£1\nGoodman\nSteam\nsensors\ndetachment\nMalik\n##erie\nattitudes\nGoes\nKendall\nRead\nSleep\nbeans\nNikki\nmodification\nJeanne\nknuckles\nEleven\n##iously\nGross\nJaime\ndioxide\nmoisture\nStones\nUCI\ndisplacement\nMetacritic\nJury\nlace\nrendering\nelephant\nSergei\n##quire\nGP\nAbbott\n##type\nprojection\nMouse\nBishops\nwhispering\nKathleen\nRams\n##jar\nwhites\n##oran\nassess\ndispatched\n##hire\nkin\n##mir\nNursing\nadvocates\ntremendous\nsweater\nassisting\n##bil\nFarmer\nprominently\nreddish\nHague\ncyclone\n##SD\nSage\nLawson\nSanctuary\ndischarged\nretains\n##ube\nshotgun\nwilderness\nReformed\nsimilarity\nEntry\nWatts\nBahá\nQuest\nLooks\nvisions\nReservoir\nArabs\ncurls\nBlu\ndripping\naccomplish\nVerlag\ndrill\nsensor\nDillon\nphysicians\nsmashed\n##dir\npainters\nRenault\nstraw\nfading\nDirectorate\nlounge\ncommissions\nBrain\n##graph\nneo\n##urg\nplug\ncoordinated\n##houses\nCritical\nlamps\nillustrator\nReturning\nerosion\nCrow\n##ciation\nblessing\nThought\nWife\nmedalist\nsynthesizer\nPam\nThornton\nEsther\nHBO\nfond\nAssociates\n##raz\npirate\npermits\nWide\ntire\n##PC\nErnie\nNassau\ntransferring\nRFC\n##ntly\num\nspit\nAS\n##mps\nMining\npolar\nvilla\nanchored\n##zzi\nembarrassment\nrelates\n##ă\nRupert\ncounterparts\n131\nBaxter\n##18\nIgor\nrecognizes\nClive\n##hane\n##eries\n##ibly\noccurrence\n##scope\nfin\ncolorful\nRapids\nbanker\ntile\n##rative\n##dus\ndelays\ndestinations\n##llis\nPond\nDane\ngrandparents\nrewarded\nsocially\nmotorway\n##hof\n##lying\n##human\nmodeled\nDayton\nForward\nconscience\nSharma\nwhistle\nMayer\nSasha\n##pical\ncircuits\nZhou\n##ça\nLatvian\nfinalists\npredators\nLafayette\ncloses\nobligations\nResolution\n##vier\nTrustees\nreminiscent\n##hos\nHighlands\nProtected\nasylum\nevacuation\n##acy\nChevrolet\nconfession\nSomalia\nemergence\nseparating\n##rica\nalright\ncalcium\nLaurent\nWelfare\nLeonardo\nashes\ndental\nDeal\nminerals\n##lump\n##mount\naccounted\nstaggered\nslogan\nphotographic\nbuilder\n##imes\n##raft\ntragic\n144\nSEC\nHit\ntailed\n##ples\n##rring\n##rson\nethical\nwrestlers\nconcludes\nlunar\n##ept\nnitrogen\nAid\ncyclist\nquarterfinals\n##ه\nharvest\n##hem\nPasha\nIL\n##mis\ncontinually\n##forth\nIntel\nbucket\n##ended\nwitches\npretended\ndresses\nviewer\npeculiar\nlowering\nvolcano\nMarilyn\nQualifier\nclung\n##sher\nCut\nmodules\nBowie\n##lded\nonset\ntranscription\nresidences\n##pie\n##itor\nscrapped\n##bic\nMonaco\nMayo\neternity\nStrike\nuncovered\nskeleton\n##wicz\nIsles\nbug\nPromoted\n##rush\nMechanical\nXII\n##ivo\ngripping\nstubborn\nvelvet\nTD\ndecommissioned\noperas\nspatial\nunstable\nCongressman\nwasted\n##aga\n##ume\nadvertisements\n##nya\nobliged\nCannes\nConway\nbricks\n##gnant\n##mity\n##uise\njumps\nClear\n##cine\n##sche\nchord\nutter\nSu\npodium\nspokesman\nRoyce\nassassin\nconfirmation\nlicensing\nliberty\n##rata\nGeographic\nindividually\ndetained\n##ffe\nSaturn\ncrushing\nairplane\nbushes\nknights\n##PD\nLilly\nhurts\nunexpectedly\nConservatives\npumping\nForty\ncandle\nPérez\npeasants\nsupplement\nSundays\n##ggs\n##rries\nrisen\nenthusiastic\ncorresponds\npending\n##IF\nOwens\nfloods\nPainter\ninflation\npresumed\ninscribed\nChamberlain\nbizarre\n1200\nliability\nreacted\ntub\nLegacy\n##eds\n##pted\nshone\n##litz\n##NC\nTiny\ngenome\nbays\nEduardo\nrobbery\nstall\nhatch\nDepot\nVariety\nFlora\nreprinted\ntrembled\noutlined\nCR\nTheresa\nspans\n##plication\nJensen\n##eering\nposting\n##rky\npays\n##ost\nMarcos\nfortifications\ninferior\n##ential\nDevi\ndespair\nTalbot\n##chus\nupdates\nego\nBooth\nDarius\ntops\n##lau\nScene\n##DC\nHarlem\nTrey\nGenerally\ncandles\n##α\nNeville\nAdmiralty\n##hong\niconic\nvictorious\n1600\nRowan\nabundance\nminiseries\nclutching\nsanctioned\n##words\nobscure\n##ision\n##rle\n##EM\ndisappearing\nResort\nObviously\n##eb\nexceeded\n1870s\nAdults\n##cts\nCry\nKerr\nragged\nselfish\n##lson\ncircled\npillars\ngalaxy\n##asco\n##mental\nrebuild\ncaution\nResistance\nStart\nbind\nsplitting\nBaba\nHogan\nps\npartnerships\nslam\nPeggy\ncourthouse\n##OD\norganizational\npackages\nAngie\n##nds\npossesses\n##rp\nExpressway\nGould\nTerror\nHim\nGeoff\nnobles\n##ope\nshark\n##nh\nidentifies\n##oor\ntestified\nPlaying\n##ump\n##isa\nstool\nIdol\n##pice\n##tana\nByrne\nGerry\ngrunted\n26th\nobserving\nhabits\nprivilege\nimmortal\nwagons\n##thy\ndot\nBring\n##lian\n##witz\nnewest\n##uga\nconstraints\nScreen\nIssue\n##RNA\n##vil\nreminder\n##gles\naddiction\npiercing\nstunning\nvar\n##rita\nSignal\naccumulated\n##wide\nfloat\ndevastating\nviable\ncartoons\nUttar\nflared\n##encies\nTheology\npatents\n##bahn\nprivileges\n##ava\n##CO\n137\n##oped\n##NT\norchestral\nmedication\n225\nerect\nNadia\nÉcole\nfried\nSales\nscripts\n##rease\nairs\nCage\ninadequate\nstructured\ncountless\nAvengers\nKathy\ndisguise\nmirrors\nInvestigation\nreservation\n##nson\nLegends\nhumorous\nMona\ndecorations\nattachment\nVia\nmotivation\nBrowne\nstrangers\n##ński\nShadows\nTwins\n##pressed\nAlma\nNominated\n##ott\nSergio\ncanopy\n152\nSemifinals\ndevised\n##irk\nupwards\nTraffic\nGoddess\nMove\nbeetles\n138\nspat\n##anne\nholdings\n##SP\ntangled\nWhilst\nFowler\nanthem\n##ING\n##ogy\nsnarled\nmoonlight\nsongwriting\ntolerance\nWorlds\nexams\n##pia\nnotices\nsensitivity\npoetic\nStephens\nBoone\ninsect\nreconstructed\nFresh\n27th\nballoon\n##ables\nBrendan\nmug\n##gee\n1780\napex\nexports\nslides\nLahore\nhiring\nShell\nelectorate\nsexuality\npoker\nnonprofit\n##imate\ncone\n##uce\nOkinawa\nsuperintendent\n##HC\nreferenced\nturret\nSprint\nCitizen\nequilibrium\nStafford\ncurb\nDriver\nValerie\n##rona\naching\nimpacts\n##bol\nobservers\nDowns\nShri\n##uth\nairports\n##uda\nassignments\ncurtains\nsolitary\nicon\npatrols\nsubstances\nJasper\nmountainous\nPublished\nached\n##ingly\nannounce\ndove\ndamaging\n##tism\nPrimera\nDexter\nlimiting\nbatch\n##uli\nundergoing\nrefugee\nYe\nadmiral\npavement\n##WR\n##reed\npipeline\ndesires\nRamsey\nSheila\nthickness\nBrotherhood\nTea\ninstituted\nBelt\nBreak\nplots\n##ais\nmasculine\n##where\nTheo\n##aged\n##mined\nExperience\nscratched\nEthiopian\nTeaching\n##nov\nAiden\nAbe\nSamoa\nconditioning\n##mous\nOtherwise\nfade\nJenks\n##encing\nNat\n##lain\nAnyone\n##kis\nsmirk\nRiding\n##nny\nBavarian\nblessed\npotatoes\nHook\n##wise\nlikewise\nhardened\nMerry\namid\npersecution\n##sten\nElections\nHoffman\nPitt\n##vering\ndistraction\nexploitation\ninfamous\nquote\naveraging\nhealed\nRhythm\nGermanic\nMormon\nilluminated\nguides\n##ische\ninterfere\n##ilized\nrector\nperennial\n##ival\nEverett\ncourtesy\n##nham\nKirby\nMk\n##vic\nMedieval\n##tale\nLuigi\nlimp\n##diction\nAlive\ngreeting\nshove\n##force\n##fly\nJasmine\nBend\nCapt\nSuzanne\nditch\n134\n##nning\nHost\nfathers\nrebuilding\nVocal\nwires\n##manship\ntan\nFactor\nfixture\n##LS\nMāori\nPlate\npyramid\n##umble\nslap\nSchneider\nyell\n##ulture\n##tional\nGoodbye\nsore\n##pher\ndepressed\n##dox\npitching\nFind\nLotus\n##wang\nstrand\nTeen\ndebates\nprevalent\n##bilities\nexposing\nhears\nbilled\n##rse\nreorganized\ncompelled\ndisturbing\ndisplaying\n##tock\nClinical\nemotionally\n##iah\nDerbyshire\ngrouped\n##quel\nBahrain\nJournalism\nIN\npersistent\nblankets\nCrane\ncamping\nDirect\nproving\nLola\n##dding\nCorporate\nbirthplace\n##boats\n##ender\nFigure\ndared\nAssam\nprecursor\n##nched\nTribe\nRestoration\nslate\nMeyrick\nhunted\nstroking\nEarlier\nKind\npolls\nappeals\nmonetary\n##reate\nKira\nLangdon\nexplores\nGPS\nextensions\nsquares\nResults\ndraped\nannouncer\nmerit\n##ennial\n##tral\n##roved\n##cion\nrobots\nsupervisor\nsnorted\n##group\nCannon\nprocession\nmonkey\nfreeze\nsleeves\nNile\nverdict\nropes\nfirearms\nextraction\ntensed\nEC\nSaunders\n##tches\ndiamonds\nMarriage\n##amble\ncurling\nAmazing\n##haling\nunrelated\n##roads\nDaughter\ncum\ndiscarded\nkidney\ncliffs\nforested\nCandy\n##lap\nauthentic\ntablet\nnotation\n##nburg\nBulldogs\nCallum\nMeet\nmouths\ncoated\n##xe\nTruman\ncombinations\n##mation\nSteelers\nFan\nThan\npaternal\n##father\n##uti\nRebellion\ninviting\nFun\ntheatres\n##ي\n##rom\ncurator\n##cision\nnetworking\nOz\ndrought\n##ssel\ngranting\nMBA\nShelby\nElaine\njealousy\nKyoto\nshores\nsignaling\ntenants\ndebated\nIntermediate\nWise\n##hes\n##pu\nHavana\nduke\nvicious\nexited\nservers\nNonetheless\nReports\nexplode\n##beth\nNationals\nofferings\nOval\nconferred\neponymous\nfolklore\n##NR\nShire\nplanting\n1783\nZeus\naccelerated\nConstable\nconsuming\ntroubles\nMcCartney\ntexture\nbust\nImmigration\nexcavated\nhopefully\n##cession\n##coe\n##name\n##ully\nlining\nEinstein\nVenezuelan\nreissued\nminorities\nBeatrice\ncrystals\n##nies\ncircus\nlava\nBeirut\nextinction\n##shu\nBecker\n##uke\nissuing\nZurich\nextract\n##esta\n##rred\nregulate\nprogression\nhut\nalcoholic\nplea\nAB\nNorse\nHubert\nMansfield\nashamed\n##put\nBombardment\nstripes\nelectrons\nDenise\nhorrified\nNor\narranger\nHay\nKoch\n##ddling\n##iner\nBirthday\nJosie\ndeliberate\nexplorer\n##jiang\n##signed\nArrow\nwiping\nsatellites\nbaritone\nmobility\n##rals\nDorset\nturbine\nCoffee\n185\n##lder\nCara\nColts\npits\nCrossing\ncoral\n##birth\nTai\nzombie\nsmoothly\n##hp\nmates\n##ady\nMarguerite\n##tary\npuzzled\ntapes\noverly\nSonic\nPrayer\nThinking\n##uf\nIEEE\nobligation\n##cliffe\nBasil\nredesignated\n##mmy\nnostrils\nBarney\nXIII\n##phones\nvacated\nunused\nBerg\n##roid\nTowards\nviola\n136\nEvent\nsubdivided\nrabbit\nrecruiting\n##nery\nNamibia\n##16\n##ilation\nrecruits\nFamous\nFrancesca\n##hari\nGoa\n##lat\nKarachi\nhaul\nbiblical\n##cible\nMGM\n##rta\nhorsepower\nprofitable\nGrandma\nimportantly\nMartinez\nincoming\n##kill\nbeneficial\nnominal\npraying\n##isch\ngable\nnail\nnoises\n##ttle\nPolytechnic\nrub\n##cope\nThor\naudition\nerotic\n##ending\n##iano\nUltimately\narmoured\n##mum\npresently\npedestrian\n##tled\nIpswich\noffence\n##ffin\n##borne\nFlemish\n##hman\necho\n##cting\nauditorium\ngentlemen\nwinged\n##tched\nNicaragua\nUnknown\nprosperity\nexhaust\npie\nPeruvian\ncompartment\nheights\ndisabilities\n##pole\nHarding\nHumphrey\npostponed\nmoths\nMathematical\nMets\nposters\naxe\n##nett\nNights\nTypically\nchuckle\ncouncillors\nalternating\n141\nNorris\n##ately\n##etus\ndeficit\ndreaming\ncooler\noppose\nBeethoven\n##esis\nMarquis\nflashlight\nheadache\ninvestor\nresponding\nappointments\n##shore\nElias\nideals\nshades\ntorch\nlingering\n##real\npier\nfertile\nDiploma\ncurrents\nSnake\n##horse\n##15\nBriggs\n##ota\n##hima\n##romatic\nCoastal\nKuala\nankles\nRae\nslice\nHilton\nlocking\nApproximately\nWorkshop\nNiagara\nstrangely\n##scence\nfunctionality\nadvertisement\nRapid\nAnders\nho\nSoviets\npacking\nbasal\nSunderland\nPermanent\n##fting\nrack\ntying\nLowell\n##ncing\nWizard\nmighty\ntertiary\npencil\ndismissal\ntorso\ngrasped\n##yev\nSand\ngossip\n##nae\nBeer\nimplementing\n##19\n##riya\nFork\nBee\n##eria\nWin\n##cid\nsailor\npressures\n##oping\nspeculated\nFreddie\noriginating\n##DF\n##SR\n##outh\n28th\nmelt\nBrenda\nlump\nBurlington\nUSC\nmarginal\n##bine\nDogs\nswamp\ncu\nEx\nuranium\nmetro\nspill\nPietro\nseize\nChorus\npartition\n##dock\n##media\nengineered\n##oria\nconclusions\nsubdivision\n##uid\nIllustrated\nLeading\n##hora\nBerkshire\ndefinite\n##books\n##cin\n##suke\nnoun\nwinced\nDoris\ndissertation\nWilderness\n##quest\nbraced\narbitrary\nkidnapping\nKurdish\n##but\nclearance\nexcavations\nwanna\nAllmusic\ninsult\npresided\nyacht\n##SM\nHonour\nTin\nattracting\nexplosives\nGore\nBride\n##ience\nPackers\nDevils\nObserver\n##course\nLoser\n##erry\n##hardt\n##mble\nCyrillic\nundefeated\n##stra\nsubordinate\n##ame\nWigan\ncompulsory\nPauline\nCruise\nOpposition\n##ods\nPeriod\ndispersed\nexpose\n##60\n##has\nCertain\nClerk\nWolves\n##hibition\napparatus\nallegiance\norbital\njustified\nthanked\n##ević\nBiblical\nCarolyn\nGraves\n##tton\nHercules\nbackgrounds\nreplica\n1788\naquatic\nMega\nStirling\nobstacles\nfiling\nFounder\nvowels\nDeborah\nRotterdam\nsurpassed\nBelarusian\n##ologists\nZambia\nRen\nOlga\nAlpine\nbi\ncouncillor\nOaks\nAnimals\neliminating\ndigit\nManaging\n##GE\nlaundry\n##rdo\npresses\nslamming\nTudor\nthief\nposterior\n##bas\nRodgers\nsmells\n##ining\nHole\nSUV\ntrombone\nnumbering\nrepresentations\nDomingo\nParalympics\ncartridge\n##rash\nCombined\nshelves\nKraków\nrevision\n##frame\nSánchez\n##tracted\n##bler\nAlain\ntownships\nsic\ntrousers\nGibbs\nanterior\nsymmetry\nvaguely\nCastile\nIRA\nresembling\nPenguin\n##ulent\ninfections\n##stant\nraped\n##pressive\nworrying\nbrains\nbending\nJR\nEvidence\nVenetian\ncomplexes\nJonah\n850\nexported\nAmbrose\nGap\nphilanthropist\n##atus\nMarxist\nweighing\n##KO\n##nath\nSoldiers\nchiefs\nreject\nrepeating\nshaky\nZürich\npreserving\n##xin\ncigarettes\n##break\nmortar\n##fin\nAlready\nreproduction\nsocks\nWaiting\namazed\n##aca\ndash\n##path\nAirborne\n##harf\n##get\ndescending\nOBE\nSant\nTess\nLucius\nenjoys\n##ttered\n##ivation\n##ete\nLeinster\nPhillies\nexecute\ngeological\nunfinished\nCourts\nSP\nBeaver\nDuck\nmotions\nPlatinum\nfriction\n##aud\n##bet\nParts\nStade\nentirety\nsprang\nSmithsonian\ncoffin\nprolonged\nBorneo\n##vise\nunanimously\n##uchi\nCars\nCassandra\nAustralians\n##CT\n##rgen\nLouisa\nspur\nConstance\n##lities\nPatent\nracism\ntempo\n##ssion\n##chard\n##nology\n##claim\nMillion\nNichols\n##dah\nNumerous\ning\nPure\nplantations\ndonor\n##EP\n##rip\nconvenience\n##plate\ndots\nindirect\n##written\nDong\nfailures\nadapt\nwizard\nunfortunately\n##gion\npractitioners\neconomically\nEnrique\nunchanged\nkingdoms\nrefined\ndefinitions\nlazy\nworries\nrailing\n##nay\nKaiser\n##lug\ncracks\nsells\nninety\n##WC\nDirected\ndenotes\ndevelopmental\npapal\nunfortunate\ndisappointing\nsixteenth\nJen\n##urier\nNWA\ndrifting\nHorror\n##chemical\nbehaviors\nbury\nsurfaced\nforeigners\nslick\nAND\n##rene\n##ditions\n##teral\nscrap\nkicks\ncomprise\nbuddy\n##anda\nMental\n##ype\nDom\nwines\nLimerick\nLuca\nRand\n##won\nTomatoes\nhomage\ngeometric\n##nted\ntelescope\nShelley\npoles\n##fan\nshareholders\nAutonomous\ncope\nintensified\nGenoa\nReformation\ngrazing\n##tern\nZhao\nprovisional\n##bies\nCon\n##riel\nCynthia\nRaleigh\nvivid\nthreaten\nLength\nsubscription\nroses\nMüller\n##isms\nrobin\n##tial\nLaos\nStanton\nnationalism\n##clave\n##ND\n##17\n##zz\nstaging\nBusch\nCindy\nrelieve\n##spective\npacks\nneglected\nCBE\nalpine\nEvolution\nuneasy\ncoastline\nDestiny\nBarber\nJulio\n##tted\ninforms\nunprecedented\nPavilion\n##bei\n##ference\nbetrayal\nawaiting\nleaked\nV8\npuppet\nadverse\nBourne\nSunset\ncollectors\n##glass\n##sque\ncopied\nDemon\nconceded\nresembled\nRafe\nLevy\nprosecutor\n##ject\nflora\nmanned\ndeaf\nMosque\nreminds\nLizzie\nProducts\nFunny\ncassette\ncongress\n##rong\nRover\ntossing\nprompting\nchooses\nSatellite\ncautiously\nReese\n##UT\nHuang\nGloucestershire\ngiggled\nKitty\n##å\nPleasant\nAye\n##ond\njudging\n1860s\nintentionally\nHurling\naggression\n##xy\ntransfers\nemploying\n##fies\n##oda\nArchibald\nBlessed\nSki\nflavor\nRosie\n##burgh\nsunset\nScholarship\nWC\nsurround\nranged\n##jay\nDegree\nHouses\nsqueezing\nlimb\npremium\nLeningrad\nsteals\n##inated\n##ssie\nmadness\nvacancy\nhydraulic\nNorthampton\n##prise\nMarks\nBoxing\n##fying\nacademics\n##lich\n##TY\nCDs\n##lma\nhardcore\nmonitors\npaperback\ncables\nDimitri\nupside\nadvent\nRa\n##clusive\nAug\nChristchurch\nobjected\nstalked\nSimple\ncolonists\n##laid\nCT\ndiscusses\nfellowship\nCarnival\ncares\nMiracle\npastoral\nrooted\nshortage\nborne\nQuentin\nmeditation\ntapping\nNovel\n##ades\nAlicia\nBurn\nfamed\nresidency\nFernández\nJohannesburg\nZhu\noffended\nMao\noutward\n##inas\nXV\ndenial\nnoticing\n##ís\nquarry\n##hound\n##amo\nBernie\nBentley\nJoanna\nmortgage\n##rdi\n##sumption\nlenses\nextracted\ndepiction\n##RE\nNetworks\nBroad\nRevenue\nflickered\nvirgin\nflanked\n##о\nEnterprises\nprobable\nLiberals\nFalcons\ndrowning\nphrases\nloads\nassumes\ninhaled\nawe\nlogs\nslightest\nspiders\nwaterfall\n##pate\nrocking\nshrub\n##uil\nroofs\n##gard\nprehistoric\nwary\n##rak\nTO\nclips\nsustain\ntreason\nmicrophone\nvoter\nLamb\npsychologist\nwrinkled\n##ères\nmating\nCarrier\n340\n##lbert\nsensing\n##rino\ndestiny\ndistract\nweaker\nUC\nNearly\nneurons\nspends\nApache\n##rem\ngenuinely\nwells\n##lanted\nstereo\n##girl\nLois\nLeaving\nconsul\nfungi\nPier\nCyril\n80s\nJungle\n##tani\nillustration\nSplit\n##hana\nAbigail\n##patrick\n1787\ndiminished\nSelected\npackaging\n##EG\nMartínez\ncommunal\nManufacturing\nsentiment\n143\nunwilling\npraising\nCitation\npills\n##iti\n##rax\nmuffled\nneatly\nworkforce\nYep\nleisure\nTu\n##nding\nWakefield\nancestral\n##uki\ndestructive\nseas\nPassion\nshowcase\n##ceptive\nheroic\n142\nexhaustion\nCustoms\n##aker\nScholar\nsliced\n##inian\nDirection\n##OW\nSwansea\naluminium\n##eep\nceramic\nMcCoy\nCareer\nSector\nchartered\nDamascus\npictured\nInterest\nstiffened\nPlateau\nobsolete\n##tant\nirritated\ninappropriate\novers\n##nko\nbail\nTalent\nSur\nours\n##nah\nbarred\nlegged\nsociology\nBud\ndictionary\n##luk\nCover\nobey\n##oring\nannoying\n##dong\napprentice\nCyrus\nRole\n##GP\n##uns\n##bag\nGreenland\nPorsche\nRocket\n##32\norganism\n##ntary\nreliability\n##vocation\n##й\nFound\n##hine\nmotors\npromoter\nunfair\n##oms\n##note\ndistribute\neminent\nrails\nappealing\nchiefly\nmeaningful\nStephan\n##rehension\nConsumer\npsychiatric\nbowler\nsaints\n##iful\n##н\n1777\nPol\nDorian\nTownsend\nhastily\n##jima\nQuincy\nSol\nfascinated\nScarlet\nalto\nAvon\ncertainty\n##eding\nKeys\n##chu\nChu\n##VE\nions\ntributaries\nThanksgiving\n##fusion\nastronomer\noxide\npavilion\nSupply\nCasa\nBollywood\nsadly\nmutations\nKeller\n##wave\nnationals\n##rgo\n##ym\npredict\nCatholicism\nVega\n##eration\n##ums\nMali\ntuned\nLankan\nPlans\nradial\nBosnian\nLexi\n##14\n##ü\nsacks\nunpleasant\nEmpty\nhandles\n##taking\nBon\nswitches\nintently\ntuition\nantique\n##jk\nfraternity\nnotebook\nDesmond\n##sei\nprostitution\n##how\ndeed\n##OP\n501\nSomewhere\nRocks\n##mons\ncampaigned\nfrigate\ngases\nsuppress\n##hang\nMerlin\nNorthumberland\ndominate\nexpeditions\nthunder\n##ups\n##rical\nCap\nthorough\nAriel\n##kind\nrenewable\nconstructing\npacing\nterrorists\nBowen\ndocumentaries\nwestward\n##lass\n##nage\nMerchant\n##ued\nBeaumont\nDin\n##hian\nDanube\npeasant\nGarrison\nencourages\ngratitude\nreminding\nstormed\n##ouse\npronunciation\n##ailed\nWeekend\nsuggestions\n##ffing\n##DI\nActive\nColombo\n##logists\nMerrill\n##cens\nArchaeological\nMedina\ncaptained\n##yk\nduel\ncracking\nWilkinson\nGuam\npickup\nrenovations\n##ël\n##izer\ndelighted\n##iri\nWeaver\n##ctional\ntens\n##hab\nClint\n##usion\n##each\npetals\nFarrell\n##sable\ncaste\n##will\nEzra\n##qi\n##standing\nthrilled\nambush\nexhaled\n##SU\nResource\nblur\nforearm\nspecifications\ncontingent\ncafe\n##iology\nAntony\nfundraising\ngrape\n##rgy\nturnout\n##udi\nClifton\nlaboratories\nIrvine\n##opus\n##lid\nMonthly\nBihar\nstatutory\nRoses\nEmil\n##rig\nlumber\noptimal\n##DR\npumps\nplaster\nMozambique\n##aco\nnightclub\npropelled\n##hun\nked\nsurplus\nwax\n##urai\npioneered\nSunny\nimprint\nForget\nEliot\napproximate\npatronage\n##bek\n##ely\n##mbe\nPartnership\ncurl\nsnapping\n29th\nPatriarch\n##jord\nseldom\n##ature\nastronomy\nBremen\nXIV\nairborne\n205\n1778\nrecognizing\nstranded\narrogant\nbombardment\ndestined\nensured\n146\nrobust\nDavenport\nInteractive\nOffensive\nFi\nprevents\nprobe\npropeller\nsorrow\nBlade\nmounting\nautomotive\n##dged\nwallet\n201\nlashes\nForrest\n##ift\nCell\nYounger\nshouts\n##cki\nfolds\n##chet\nEpic\nyields\nhomosexual\ntunes\n##minate\n##text\nManny\nchemist\nhindwings\n##urn\npilgrimage\n##sfield\n##riff\nMLS\n##rive\nHuntington\ntranslates\nPath\nslim\n##ndra\n##oz\nclimax\ncommuter\ndesperation\n##reet\ndenying\n##rious\ndaring\nseminary\npolo\n##clamation\nTeatro\nTorah\nCats\nidentities\nPoles\nphotographed\nfiery\npopularly\n##cross\nwinters\nHesse\n##vio\nNurse\nSenegal\nSalon\nprescribed\njustify\n##gues\n##и\n##orted\nHQ\n##hiro\nevaluated\nmomentarily\n##unts\nDebbie\n##licity\n##TP\nMighty\nRabbit\n##chal\nEvents\nSavoy\n##ht\nBrandenburg\nBordeaux\n##laus\nRelease\n##IE\n##kowski\n1900s\nSK\nStrauss\n##aly\nSonia\nUpdated\nsynagogue\nMcKay\nflattened\n370\nclutch\ncontests\ntoast\nevaluate\npope\nheirs\njam\ntutor\nreverted\n##ading\nnonsense\nhesitate\nLars\nCeylon\nLaurie\n##guchi\naccordingly\ncustomary\n148\nEthics\nMultiple\ninstincts\nIGN\n##ä\nbullshit\n##hit\n##par\ndesirable\n##ducing\n##yam\nalias\nashore\nlicenses\n##lification\nmisery\n147\nCola\nassassinated\nfiercely\n##aft\nlas\ngoat\nsubstrate\nlords\nCass\nBridges\nICC\nlasts\nsights\nreproductive\n##asi\nIvory\nClean\nfixing\n##lace\nseeming\naide\n1850s\nharassment\n##FF\n##LE\nreasonably\n##coat\n##cano\nNYC\n1784\nFifty\nimmunity\nCanadians\nCheng\ncomforting\nmeanwhile\n##tera\n##blin\nbreeds\nglowed\n##vour\nAden\n##verted\n##aded\n##oral\nneat\nenforced\npoisoning\n##ews\n##hone\nenforce\npredecessors\nsurvivor\nMonth\nunfamiliar\npierced\nwaived\ndump\nresponds\nMai\nDeclan\nangular\nDoesn\ninterpretations\n##yar\ninvest\nDhaka\npoliceman\nCongregation\nEighth\npainfully\n##este\n##vior\nWürttemberg\n##cles\nblockade\nencouragement\n##fie\nCaucasus\nMalone\nUniversidad\nutilize\nNissan\ninherent\n151\nagreeing\nsyllable\ndetermines\nProtocol\nconclude\n##gara\n40th\nXu\nTaiwanese\n##ather\nboiler\nprinter\nLacey\ntitular\nKlaus\nFallon\nWembley\nfox\nChandra\nGovernorate\nobsessed\n##Ps\nmicro\n##25\nCooke\ngymnasium\nweaving\nShall\nHussein\nglaring\nsoftball\nReader\nDominion\nTrouble\nvarsity\nCooperation\nChaos\nKang\nKramer\nEisenhower\nproves\nConnie\nconsortium\ngovernors\nBethany\nopener\nNormally\nWilly\nlinebacker\nRegent\nUsed\nAllMusic\nTwilight\n##shaw\nCompanion\nTribunal\nsimpler\n##gam\nExperimental\nSlovenian\ncellar\ndeadline\ntrout\nHubbard\nads\nidol\n##hetto\nGranada\nclues\nsalmon\n1700\nOmega\nCaldwell\nsoftened\nBills\nHonolulu\n##gn\nTerrace\nsuitcase\n##IL\nfrantic\n##oons\nAbbot\nSitting\nFortress\nRiders\nsickness\nenzymes\ntrustee\nBern\nforged\n##13\n##ruff\n##rl\n##versity\ninspector\nchampagne\n##held\n##FI\nhereditary\nTaliban\nhandball\n##wine\nSioux\n##dicated\nhonoured\n139\n##tude\nSkye\nmeanings\n##rkin\ncardiac\nanalyzed\nvegetable\n##FS\nRoyals\ndial\nfreelance\n##fest\npartisan\npetroleum\nridden\nLincolnshire\npanting\n##comb\npresidents\nHaley\n##chs\ncontributes\nJew\ndiscoveries\npanicked\nWoody\neyelids\nFate\nTulsa\nmg\nwhiskey\nzombies\nWii\n##udge\ninvestigators\n##bull\ncentred\n##screen\nBone\nLana\n##oise\nforts\n##ske\nConan\nLyons\n##writing\nSH\n##ride\nrhythmic\n154\n##llah\npioneers\n##bright\ncaptivity\nSanchez\nOman\n##mith\nFlint\nPlatform\n##ioned\nemission\npacket\nPersia\n##formed\ntakeover\ntempted\nVance\nFew\nToni\nreceptions\n##ن\nexchanges\nCamille\nwhale\nChronicles\n##rent\n##ushing\n##rift\nAlto\nGenus\n##asing\nonward\nforemost\nlonging\nRockefeller\ncontainers\n##cribe\nintercepted\n##olt\npleading\nBye\nbee\n##umbling\n153\nundertake\nIzzy\ncheaper\nUltra\nvalidity\n##pse\nSa\nhovering\n##pert\nvintage\nengraved\n##rise\nfarmland\n##ever\n##ifier\nAtlantis\npropose\nCatalonia\nplunged\n##edly\ndemonstrates\ngig\n##cover\n156\nOsborne\ncowboy\nherd\ninvestigator\nloops\nBurning\nrests\nInstrumental\nembarrassing\nfocal\ninstall\nreadings\nswirling\nChatham\nparameter\n##zin\n##holders\nMandarin\nMoody\nconverting\nEscape\nwarnings\n##chester\nincarnation\n##ophone\nadopting\n##lins\nCromwell\n##laws\nAxis\nVerde\nKappa\nSchwartz\nSerbs\ncaliber\nWanna\nChung\n##ality\nnursery\nprincipally\nBulletin\nlikelihood\nlogging\n##erty\nBoyle\nsupportive\ntwitched\n##usive\nbuilds\nMarseille\nomitted\nmotif\nLands\n##lusion\n##ssed\nBarrow\nAirfield\nHarmony\nWWF\nendured\nmerging\nconvey\nbranding\nexaminations\n167\nItalians\n##dh\ndude\n1781\n##teau\ncrawling\nthoughtful\nclasped\nconcluding\nbrewery\nMoldova\nWan\nTowers\nHeidelberg\n202\n##ict\nLagos\nimposing\n##eval\n##serve\nBacon\nfrowning\nthirteenth\nconception\ncalculations\n##ович\n##mile\n##ivated\nmutation\nstrap\n##lund\ndemographic\nnude\nperfection\nstocks\n##renched\n##dit\nAlejandro\nbites\nfragment\n##hack\n##rchy\nGB\nSurgery\nBerger\npunish\nboiling\nconsume\nElle\nSid\nDome\nrelies\nCrescent\ntreasurer\nBloody\n1758\nupheld\nGuess\nRestaurant\nsignatures\nfont\nmillennium\nmural\nstakes\nAbel\nhailed\ninsists\nAlumni\nBreton\n##jun\ndigits\n##FM\n##thal\nTalking\nmotive\nreigning\nbabe\nmasks\n##ø\nShaun\npotato\nsour\nwhitish\nSomali\n##derman\n##rab\n##wy\nchancel\ntelecommunications\nNoise\nmessenger\ntidal\ngrinding\n##ogenic\nRebel\nconstituent\nperipheral\nrecruitment\n##ograph\n##tler\npumped\nRavi\npoked\n##gley\nOlive\ndiabetes\ndiscs\nliking\nsting\nfits\nstir\nMari\nSega\ncreativity\nweights\nMacau\nmandated\nBohemia\ndisastrous\nKatrina\nBaku\nRajasthan\nwaiter\n##psis\nSiberia\nverbs\n##truction\npatented\n1782\n##ndon\nRelegated\nHunters\nGreenwood\nShock\naccusing\nskipped\nSessions\nmarkers\nsubset\nmonumental\nViola\ncomparative\nAlright\nBarbados\nsetup\nSession\nstandardized\n##ík\n##sket\nappoint\nAFB\nNationalist\n##WS\nTroop\nleaped\nTreasure\ngoodness\nweary\noriginates\n100th\ncompassion\nexpresses\nrecommend\n168\ncomposing\nseventeenth\nTex\nAtlético\nbald\nFinding\nPresidency\nSharks\nfavoured\ninactive\n##lter\nsuffix\nprinces\nbrighter\n##ctus\nclassics\ndefendants\nculminated\nterribly\nStrategy\nevenings\n##ção\n##iver\n##urance\nabsorb\n##rner\nTerritories\nRBI\nsoothing\nMartín\nconcurrently\n##tr\nNicholson\nfibers\nswam\n##oney\nAllie\nAlgerian\nDartmouth\nMafia\n##bos\n##tts\nCouncillor\nvocabulary\n##bla\n##lé\nintending\n##dler\nGuerrero\nsunshine\npedal\n##TO\nadministrators\nperiodic\nscholarships\nLoop\nMadeline\nexaggerated\n##ressed\nRegan\n##cellular\nExplorer\n##oids\nAlexandre\nvows\nReporter\nUnable\nAverage\nabsorption\n##bedience\nFortunately\nAuxiliary\nGrandpa\n##HP\n##ovo\npotent\ntemporal\nadrenaline\n##udo\nconfusing\nguiding\nDry\nqualifications\njoking\nwherein\nheavyweight\n##ices\nnightmares\npharmaceutical\nCommanding\n##aled\n##ove\nGregor\n##UP\ncensorship\ndegradation\nglorious\nAustro\n##rench\n380\nMiriam\nsped\n##orous\noffset\n##KA\nfined\nspecialists\nPune\nJoão\n##dina\npropped\nfungus\n##ς\nfrantically\nGabrielle\nHare\ncommitting\n##plied\nAsk\nWilmington\nstunt\nnumb\nwarmer\npreacher\nearnings\n##lating\ninteger\n##ija\nfederation\nhomosexuality\n##cademia\nepidemic\ngrumbled\nshoving\nMilk\nSatan\nTobias\ninnovations\n##dington\ngeology\nmemoirs\n##IR\nspared\nculminating\nDaphne\nFocus\nsevered\nstricken\nPaige\nMans\nflats\nRusso\ncommunes\nlitigation\nstrengthening\n##powered\nStaffordshire\nWiltshire\nPainting\nWatkins\n##د\nspecializes\nSelect\n##rane\n##aver\nFulton\nplayable\n##VN\nopenings\nsampling\n##coon\n##21\nAllah\ntravelers\nallocation\n##arily\nLoch\n##hm\ncommentators\nfulfilled\n##troke\nEmeritus\nVanderbilt\nVijay\npledged\n##tative\ndiagram\ndrilling\n##MD\n##plain\nEdison\nproductivity\n31st\n##rying\n##ption\n##gano\n##oration\n##bara\nposture\nbothering\nplatoon\npolitely\n##inating\nredevelopment\nJob\n##vale\nstark\nincorrect\nMansion\nrenewal\nthreatens\nBahamas\nfridge\n##tata\nUzbekistan\n##edia\nSainte\n##mio\ngaps\nneural\n##storm\noverturned\nPreservation\nshields\n##ngo\n##physics\nah\ngradual\nkillings\n##anza\nconsultation\npremiership\nFelipe\ncoincidence\n##ène\n##any\nHandbook\n##loaded\nEdit\nGuns\narguably\n##ş\ncompressed\ndepict\nseller\n##qui\nKilkenny\n##kling\nOlympia\nlibrarian\n##acles\ndramas\nJP\nKit\nMaj\n##lists\nproprietary\n##nged\n##ettes\n##tok\nexceeding\nLock\ninduction\nnumerical\n##vist\nStraight\nfoyer\nimaginary\n##pop\nviolinist\nCarla\nbouncing\n##ashi\nabolition\n##uction\nrestoring\nscenic\n##č\nDoom\noverthrow\npara\n##vid\n##ughty\nConcord\nHC\ncocaine\ndeputies\n##aul\nvisibility\n##wart\nKapoor\nHutchinson\n##agan\nflashes\nkn\ndecreasing\n##ronology\nquotes\nvain\nsatisfying\n##iam\n##linger\n310\nHanson\nfauna\n##zawa\n##rrel\nTrenton\n##VB\nEmployment\nvocational\nExactly\nbartender\nbutterflies\ntow\n##chers\n##ocks\npigs\nmerchandise\n##game\n##pine\nShea\n##gration\nConnell\nJosephine\nmonopoly\n##dled\nCobb\nwarships\ncancellation\nsomeday\nstove\n##Cs\ncandidacy\nsuperhero\nunrest\nToulouse\nadmiration\nundergone\nwhirled\nReconnaissance\ncostly\n##ships\n290\nCafe\namber\nTory\n##mpt\ndefinitive\n##dress\nproposes\nredesigned\nacceleration\n##asa\n##raphy\nPresley\nexits\nLanguages\n##cel\nMode\nspokesperson\n##tius\nBan\nforthcoming\ngrounded\nACC\ncompelling\nlogistics\nretailers\nabused\n##gating\nsoda\n##yland\n##lution\nLandmark\nXVI\nblush\n##tem\nhurling\ndread\nTobago\nFoley\n##uad\nscenarios\n##mentation\n##rks\nScore\nfatigue\nhairy\ncorrespond\n##iard\ndefences\nconfiscated\n##rudence\n1785\nFormerly\nShot\nadvertised\n460\nText\nridges\nPromise\nDev\nexclusion\nNHS\ntuberculosis\nrockets\n##offs\nsparkling\n256\ndisappears\nmankind\n##hore\nHP\n##omo\ntaxation\nMulti\nDS\nVirgil\n##ams\nDell\nstacked\nguessing\nJump\nNope\ncheer\nhates\nballots\noverlooked\nanalyses\nPrevention\nmaturity\ndos\n##cards\n##lect\nMare\n##yssa\nPetty\n##wning\ndiffering\niOS\n##ior\nJoachim\nSentinel\n##nstein\n90s\nPamela\n480\nAsher\n##lary\nVicente\nlandings\nportray\n##rda\n##xley\nVirtual\n##uary\nfinances\nJain\nSomebody\nTri\nbehave\nMichele\n##ider\ndwellings\nFAA\nGallagher\n##lide\nMonkey\n195\naforementioned\n##rism\n##bey\n##kim\n##puted\nMesa\nhopped\nunopposed\nrecipients\nReality\nBeen\ngritted\n149\nplayground\npillar\n##rone\nGuinness\n##tad\nThéâtre\ndepended\nTipperary\nReuben\nfrightening\nwooded\nTarget\nglobally\n##uted\nMorales\nBaptiste\ndrunken\nInstitut\ncharacterised\n##chemistry\nStrip\ndiscrete\nPremiership\n##zzling\ngazing\nOuter\n##quisition\nSikh\nBooker\n##yal\ncontemporaries\nJericho\n##chan\n##physical\n##witch\nMilitia\n##rez\n##zard\ndangers\n##utter\n##₀\nPrograms\ndarling\nparticipates\nrailroads\n##ienne\nbehavioral\nbureau\n##rook\n161\nHicks\n##rises\nComes\ninflicted\nbees\nkindness\nnorm\n##ković\ngenerators\n##pard\n##omy\n##ili\nmethodology\nAlvin\nfaçade\nlatitude\n##plified\nDE\nMorse\n##mered\neducate\nintersects\n##MF\n##cz\n##vated\nAL\n##graded\n##fill\nconstitutes\nartery\nfeudal\navant\ncautious\n##ogue\nimmigrated\n##chenko\nSaul\nClinic\nFang\nchoke\nCornelius\nflexibility\ntemperate\npins\n##erson\noddly\ninequality\n157\nNatasha\nSal\n##uter\n215\naft\nblinking\n##ntino\nnorthward\nExposition\ncookies\nWedding\nimpulse\nOverseas\nterrifying\n##ough\nMortimer\n##see\n440\nhttps\nog\nimagining\n##cars\nNicola\nexceptionally\nthreads\n##cup\nOswald\nProvisional\ndismantled\ndeserves\n1786\nFairy\ndiscourse\nCounsel\ndeparting\nArc\nguarding\n##orse\n420\nalterations\nvibrant\nEm\nsquinted\nterrace\nrowing\nLed\naccessories\nSF\nSgt\ncheating\nAtomic\n##raj\nBlackpool\n##iary\nboarded\nsubstituted\nbestowed\nlime\nkernel\n##jah\nBelmont\nshaken\nsticky\nretrospective\nLouie\nmigrants\nweigh\nsunglasses\nthumbs\n##hoff\nexcavation\n##nks\nExtra\nPolo\nmotives\nDrum\ninfrared\ntastes\nberth\nverge\n##stand\nprogrammed\nwarmed\nShankar\nTitan\nchromosome\ncafeteria\ndividing\npepper\nCPU\nStevie\nsatirical\nNagar\nscowled\nDied\nbackyard\n##gata\n##reath\n##bir\nGovernors\nportraying\n##yah\nRevenge\n##acing\n1772\nmargins\nBahn\nOH\nlowland\n##razed\ncatcher\nreplay\n##yoshi\nSeriously\n##licit\nAristotle\n##ald\nHabsburg\nweekday\nSecretariat\nCO\n##dly\n##joy\n##stad\nlitre\nultra\n##cke\nMongol\nTucson\ncorrelation\ncompose\ntraps\nGroups\nHai\nSalvatore\n##dea\ncents\n##eese\nconcession\nclash\nTrip\nPanzer\nMoroccan\ncruisers\ntorque\nBa\ngrossed\n##arate\nrestriction\nconcentrating\nFDA\n##Leod\n##ones\nScholars\n##esi\nthrobbing\nspecialised\n##heses\nChicken\n##fia\n##ificant\nErich\nResidence\n##trate\nmanipulation\nnamesake\n##tom\nHoover\ncue\nLindsey\nLonely\n275\n##HT\ncombustion\nsubscribers\nPunjabi\nrespects\nJeremiah\npenned\n##gor\n##rilla\nsuppression\n##tration\nCrimson\npiston\nDerry\ncrimson\nlyrical\noversee\nportrays\nCF\nDistricts\nLenin\nCora\nsearches\nclans\nVHS\n##hel\nJacqueline\nRedskins\nClubs\ndesktop\nindirectly\nalternatives\nmarijuana\nsuffrage\n##smos\nIrwin\n##liff\nProcess\n##hawks\nSloane\n##bson\nSonata\nyielded\nFlores\n##ares\narmament\nadaptations\nintegrate\nneighbours\nshelters\n##tour\nSkinner\n##jet\n##tations\n1774\nPeterborough\n##elles\nripping\nLiang\nDickinson\ncharities\nRwanda\nmonasteries\ncrossover\nracist\nbarked\nguerrilla\n##ivate\nGrayson\n##iques\n##vious\n##got\nRolls\ndenominations\natom\naffinity\n##delity\nWish\n##inted\n##inae\ninterrogation\n##cey\n##erina\n##lifting\n192\nSands\n1779\nmast\nLikewise\n##hyl\n##oft\ncontempt\n##por\nassaulted\nfills\nestablishments\nMal\nconsulted\n##omi\n##sight\ngreet\n##roma\n##egan\nPulitzer\n##rried\n##dius\n##ractical\n##voked\nHasan\nCB\n##zzy\nRomanesque\nPanic\nwheeled\nrecorder\n##tters\n##warm\n##gly\nbotanist\nBalkan\nLockheed\nPolly\nfarewell\nsuffers\npurchases\nEaton\n##80\nQuick\ncommenting\nSaga\nbeasts\nhides\nmotifs\n##icks\nAlonso\nSpringer\nWikipedia\ncirculated\nencoding\njurisdictions\nsnout\nUAE\nIntegrated\nunmarried\nHeinz\n##lein\n##figured\ndeleted\n##tley\nZen\nCycling\nFuel\nScandinavian\n##rants\nConner\nreef\nMarino\ncuriously\nlingered\nGina\nmanners\nactivism\nMines\nExpo\nMicah\npromotions\nServer\nbooked\nderivatives\neastward\ndetailing\nreelection\n##chase\n182\nCampeonato\nPo\n158\nPeel\nwinger\n##itch\ncanyon\n##pit\nLDS\nA1\n##shin\nGiorgio\npathetic\n##rga\n##mist\nAren\n##lag\nconfronts\nmotel\ntextbook\nshine\nturbines\n1770\nDarcy\n##cot\nSoutheastern\n##lessness\nBanner\nrecognise\nstray\nKitchen\npaperwork\nrealism\nChrysler\nfilmmakers\nfishermen\n##hetic\nvariously\nVishnu\nfiddle\nEddy\nOrigin\n##tec\n##ulin\nFlames\nRs\nbankrupt\nExtreme\nPomeranian\n##emption\nratified\n##iu\njockey\nStratford\n##ivating\n##oire\nBabylon\npardon\nAI\naffordable\ndeities\ndisturbance\nTrying\n##sai\nIda\nPapers\nadvancement\n70s\narchbishop\nLuftwaffe\nannounces\ntugging\n##lphin\n##sistence\n##eel\n##ishes\nambition\naura\n##fled\n##lected\n##vue\nPrasad\nboiled\nclarity\nViolin\ninvestigative\nrouting\nYankee\n##uckle\nMcMahon\nbugs\neruption\n##rooms\nMinutes\nrelics\n##ckle\n##nse\nsipped\nvalves\nweakly\n##ital\nMiddleton\ncollided\n##quer\nbamboo\ninsignia\nTyne\nexercised\nNinth\nechoing\npolynomial\nconsiderations\nlunged\n##bius\nobjections\ncomplain\ndisguised\nplaza\n##VC\ninstitutes\nJudicial\nascent\nimminent\nWaterford\nhello\nLumpur\nNiger\nGoldman\nvendors\nKensington\nWren\nbrowser\n##bner\n##tri\n##mize\n##pis\n##lea\nCheyenne\nBold\nSettlement\nHollow\nParalympic\naxle\n##toire\n##actic\nimpose\nperched\nutilizing\nslips\nBenz\nMichaels\nmanipulate\nChiang\n##mian\nDolphins\nprohibition\nattacker\necology\nEstadio\n##SB\n##uild\nattracts\nrecalls\nglacier\nlad\n##rima\nBarlow\nkHz\nmelodic\n##aby\n##iracy\nassumptions\nCornish\n##aru\nDOS\nMaddie\n##mers\nlyric\nLuton\nnm\n##tron\nReno\nFin\nYOU\nBroadcast\nFinch\nsensory\n##bent\nJeep\n##uman\nadditionally\nBuildings\nbusinessmen\ntreaties\n235\nStranger\ngateway\nCharlton\naccomplishments\nDiary\napologized\nzinc\nhistories\nsupplier\n##tting\n162\nasphalt\nTreatment\nAbbas\n##pating\n##yres\nBloom\nsedan\nsoloist\n##cum\nantagonist\ndenounced\nFairfax\n##aving\n##enko\nnoticeable\nBudget\nBuckingham\nSnyder\nretreating\nJai\nspoon\ninvading\ngiggle\nwoven\ngunfire\narrests\n##vered\n##come\nrespiratory\nviolet\n##aws\nByrd\nshocking\ntenant\nJamaican\nOttomans\nSeal\ntheirs\n##isse\n##48\ncooperate\npeering\n##nius\n163\nComposer\norganist\nMongolian\nBauer\nSpy\ncollects\nprophecy\ncongregations\n##moor\nBrick\ncalculation\nfixtures\nexempt\n##dden\nAda\nThousand\n##lue\ntracing\n##achi\nbodyguard\nvicar\nsupplying\nŁódź\ninterception\nmonitored\n##heart\nPaso\noverlap\nannoyance\n##dice\nyellowish\nstables\nelders\nillegally\nhonesty\n##oar\nskinny\nspinal\n##puram\nBourbon\n##cor\nflourished\nMedium\n##stics\n##aba\nFollow\n##ckey\nstationary\n##scription\ndresser\nscrutiny\nBuckley\nClearly\n##SF\nLyrics\n##heimer\ndrying\nOracle\ninternally\nrains\n##last\nEnemy\n##oes\nMcLean\nOle\nphosphate\nRosario\nRifles\n##mium\nbattered\nPepper\nPresidents\nconquer\nChâteau\ncastles\n##aldo\n##ulf\nDepending\nLesser\nBoom\ntrades\nPeyton\n164\nemphasize\naccustomed\nSM\nAi\nClassification\n##mins\n##35\n##rons\nleak\npiled\ndeeds\nlush\n##self\nbeginnings\nbreathless\n1660\nMcGill\n##ago\n##chaft\n##gies\nhumour\nBomb\nsecurities\nMight\n##zone\n##eves\nMatthias\nMovies\nLevine\nvengeance\n##ads\nChallenger\nMisty\nTraditionally\nconstellation\n##rass\ndeepest\nworkplace\n##oof\n##vina\nimpatient\n##ML\nMughal\nAlessandro\nscenery\nSlater\npostseason\ntroupe\n##ń\nVolunteers\nFacility\nmilitants\nReggie\nsanctions\nExpeditionary\nNam\ncountered\ninterpret\nBasilica\ncoding\nexpectation\nDuffy\ndef\nTong\nwakes\nBowling\nVehicle\nAdler\nsalad\nintricate\nstronghold\nmedley\n##uries\n##bur\njoints\n##rac\n##yx\n##IO\nOrdnance\nWelch\ndistributor\nArk\ncavern\ntrench\nWeiss\nMauritius\ndecreases\ndocks\neagerly\nirritation\nMatilda\nbiographer\nVisiting\n##marked\n##iter\n##ear\n##gong\nMoreno\nattendant\nBury\ninstrumentation\ntheologian\nclit\nnuns\nsymphony\ntranslate\n375\nloser\n##user\n##VR\n##meter\n##orious\nharmful\n##yuki\nCommissioners\nMendoza\nsniffed\nHulk\n##dded\n##ulator\n##nz\nDonnell\n##eka\ndeported\nMet\nSD\nAerospace\n##cultural\n##odes\nFantastic\ncavity\nremark\nemblem\nfearing\n##iance\nICAO\nLiberia\nstab\n##yd\nPac\nGymnasium\nIS\nEverton\n##vanna\nmantle\n##ief\nRamon\n##genic\nShooting\nSmoke\nRandom\nAfricans\nMB\ntavern\nbargain\nvoluntarily\nIon\nPeoples\nRusty\nattackers\nPatton\nsins\n##cake\nHat\nmoderately\n##hala\n##alia\nrequesting\nmechanic\n##eae\nSeine\nRobbins\n##ulum\nsusceptible\nBravo\nSlade\nStrasbourg\nrubble\nentrusted\nCreation\n##amp\nsmoothed\n##uintet\nevenly\nreviewers\nskip\nSculpture\n177\nRough\n##rrie\nReeves\n##cede\nAdministrator\ngarde\nminus\ncarriages\ngrenade\nNinja\nfuscous\n##kley\nPunk\ncontributors\nAragon\nTottenham\n##cca\n##sir\nVA\nlaced\ndealers\n##sonic\ncrisp\nharmonica\nArtistic\nButch\nAndes\nFarmers\ncorridors\nunseen\n##tium\nCountries\nLone\nenvisioned\nKaty\n##lang\n##cc\nQuarterly\n##neck\nconsort\n##aceae\nbidding\nCorey\nconcurrent\n##acts\n##gum\nHighness\n##lient\n##rators\narising\n##unta\npathways\n49ers\nbolted\ncomplaining\necosystem\nlibretto\nSer\nnarrated\n212\nSoft\ninflux\n##dder\nincorporation\nplagued\ntents\n##ddled\n1750\nRisk\ncitation\nTomas\nhostilities\nseals\nBruins\nDominique\nattic\ncompetent\n##UR\n##cci\nhugging\nBreuning\nbacterial\nShrewsbury\nvowed\neh\nelongated\nhangs\nrender\ncentimeters\n##ficient\nMu\nturtle\nbesieged\n##gaard\ngrapes\nbravery\ncollaborations\ndeprived\n##amine\n##using\n##gins\narid\n##uve\ncoats\nhanged\n##sting\nPa\nprefix\n##ranged\nExit\nChain\nFlood\nMaterials\nsuspicions\n##ö\nhovered\nHidden\n##state\nMalawi\n##24\nMandy\nnorms\nfascinating\nairlines\ndelivers\n##rust\nCretaceous\nspanned\npillows\n##onomy\njar\n##kka\nregent\nfireworks\nmorality\ndiscomfort\nlure\nuneven\n##jack\nLucian\n171\narchaeology\n##til\nmornings\nBillie\nMarquess\nimpending\nspilling\ntombs\n##volved\nCelia\nCoke\nunderside\n##bation\nVaughn\nDaytona\nGodfrey\nPascal\nAlien\n##sign\n172\n##lage\niPhone\nGonna\ngenocide\n##rber\noven\nendure\ndashed\nsimultaneous\n##phism\nWally\n##rō\nants\npredator\nreissue\n##aper\nSpeech\nfunk\nRudy\nclaw\nHindus\nNumbers\nBing\nlantern\n##aurus\nscattering\npoisoned\n##active\nAndrei\nalgebraic\nbaseman\n##ritz\nGregg\n##cola\nselections\n##putation\nlick\nLaguna\n##IX\nSumatra\nWarning\nturf\nbuyers\nBurgess\nOldham\nexploit\nworm\ninitiate\nstrapped\ntuning\nfilters\nhaze\n##е\n##ledge\n##ydro\n##culture\namendments\nPromotion\n##union\nClair\n##uria\npetty\nshutting\n##eveloped\nPhoebe\nZeke\nconducts\ngrains\nclashes\n##latter\nillegitimate\nwillingly\nDeer\nLakers\nReference\nchaplain\ncommitments\ninterrupt\nsalvation\nPanther\nQualifying\nAssessment\ncancel\nefficiently\nattorneys\nDynamo\nimpress\naccession\nclinging\nrandomly\nreviewing\nRomero\nCathy\ncharting\nclapped\nrebranded\nAzerbaijani\ncoma\nindicator\npunches\n##tons\nSami\nmonastic\nprospects\nPastor\n##rville\nelectrified\n##CI\n##utical\ntumbled\nChef\nmuzzle\nselecting\nUP\nWheel\nprotocols\n##tat\nExtended\nbeautifully\nnests\n##stal\nAndersen\n##anu\n##³\n##rini\nkneeling\n##reis\n##xia\nanatomy\ndusty\nSafe\nturmoil\nBianca\n##elo\nanalyze\n##ر\n##eran\npodcast\nSlovene\nLocke\nRue\n##retta\n##uni\nPerson\nProphet\ncrooked\ndisagreed\nVersailles\nSarajevo\nUtrecht\n##ogen\nchewing\n##ception\n##iidae\nMissile\nattribute\nmajors\nArch\nintellectuals\n##andra\nideological\nCory\nSalzburg\n##fair\nLot\nelectromagnetic\nDistribution\n##oper\n##pered\nRuss\nTerra\nrepeats\nfluttered\nRiga\n##ific\n##gt\ncows\nHair\nlabelled\nprotects\nGale\nPersonnel\nDüsseldorf\nMoran\nrematch\n##OE\nSlow\nforgiveness\n##ssi\nproudly\nMacmillan\ninsist\nundoubtedly\nQuébec\nViolence\n##yuan\n##aine\nmourning\nlinen\naccidental\n##iol\n##arium\ngrossing\nlattice\nmaneuver\n##marine\nprestige\npetrol\ngradient\ninvasive\nmilitant\nGalerie\nwidening\n##aman\n##quist\ndisagreement\n##ales\ncreepy\nremembers\nbuzz\n##erial\nExempt\nDirk\nmon\nAddison\n##inen\ndeposed\n##agon\nfifteenth\nHang\nornate\nslab\n##lades\nFountain\ncontractors\ndas\nWarwickshire\n1763\n##rc\nCarly\nEssays\nIndy\nLigue\ngreenhouse\nslit\n##sea\nchewed\nwink\n##azi\nPlayhouse\n##kon\nGram\nKo\nSamson\ncreators\nrevive\n##rians\nspawned\nseminars\nCraft\nTall\ndiverted\nassistants\ncomputational\nenclosure\n##acity\nCoca\n##eve\ndatabases\nDrop\n##loading\n##hage\nGreco\nPrivy\nentrances\npork\nprospective\nMemories\nrobes\n##market\ntransporting\n##lik\nRudolph\nHorton\nvisually\n##uay\n##nja\nCentro\nTor\nHowell\n##rsey\nadmitting\npostgraduate\nherbs\n##att\nChin\nRutherford\n##bot\n##etta\nSeasons\nexplanations\n##bery\nFriedman\nheap\n##ryl\n##sberg\njaws\n##agh\nChoi\nKilling\nFanny\n##suming\n##hawk\nhopeful\n##aid\nMonty\ngum\nremarkably\nSecrets\ndisco\nharp\nadvise\n##avia\nMarathi\n##cycle\nTruck\nabbot\nsincere\nurine\n##mology\nmasked\nbathing\n##tun\nFellows\n##TM\n##gnetic\nowl\n##jon\nhymn\n##leton\n208\nhostility\n##cée\nbaked\nBottom\n##AB\nshudder\n##ater\n##von\n##hee\nreorganization\nCycle\n##phs\nLex\n##style\n##rms\nTranslation\n##erick\n##imeter\n##ière\nattested\nHillary\n##DM\ngal\nwander\nSalle\n##laming\nPerez\nPit\n##LP\nUSAF\ncontexts\nDisease\nblazing\naroused\nrazor\nwalled\nDanielle\nMont\nFunk\nroyalty\nthee\n203\ndonors\n##erton\nfamously\nprocessors\nreassigned\nwelcoming\nGoldberg\n##quities\nundisclosed\nOrient\nPatty\nvaccine\nrefrigerator\nCypriot\nconsonant\n##waters\n176\nsober\n##lement\nRacecourse\n##uate\nLuckily\nSelection\nconceptual\nvines\nBreaking\nwa\nlions\noversight\nsheltered\nDancer\nponds\nborrow\n##BB\n##pulsion\nDaly\n##eek\nfertility\nspontaneous\nWorldwide\ngasping\n##tino\n169\nABS\nVickers\nambient\nenergetic\nprisons\n##eson\nStacy\n##roach\nGmbH\nAfro\nMarin\nfarmhouse\npinched\n##cursion\n##sp\nSabine\n##pire\n181\nnak\nswelling\nhumble\nperfume\n##balls\nRai\ncannons\n##taker\nMarried\nMaltese\ncanals\ninterceptions\nhats\nlever\nslowing\n##ppy\nNike\nSilas\nScarborough\nskirts\n166\ninauguration\nShuttle\nalloy\nbeads\nbelts\nCompton\nCause\nbattling\ncritique\nsurf\nDock\nroommate\n##ulet\ninvade\nGarland\n##slow\nnutrition\npersona\n##zam\nWichita\nacquaintance\ncoincided\n##cate\nDracula\nclamped\n##gau\noverhaul\n##broken\n##rrier\nmelodies\nventures\nPaz\nconvex\nRoots\n##holding\nTribute\ntransgender\n##ò\nchimney\n##riad\nAjax\nThereafter\nmessed\nnowadays\npH\n##100\n##alog\nPomerania\n##yra\nRossi\nglove\n##TL\nRaces\n##asily\ntablets\nJase\n##ttes\ndiner\n##rns\nHu\nMohan\nanytime\nweighted\nremixes\nDove\ncherry\nimports\n##urity\nGA\n##TT\n##iated\n##sford\nClarkson\nevidently\nrugged\nDust\nsiding\n##ometer\nacquitted\nchoral\n##mite\ninfants\nDomenico\ngallons\nAtkinson\ngestures\nslated\n##xa\nArchaeology\nunwanted\n##ibes\n##duced\npremise\nColby\nGeelong\ndisqualified\n##pf\n##voking\nsimplicity\nWalkover\nQaeda\nWarden\n##bourg\n##ān\nInvasion\nBabe\nharness\n183\n##tated\nmaze\nBurt\nbedrooms\n##nsley\nHorizon\n##oast\nminimize\npeeked\nMLA\nTrains\ntractor\nnudged\n##iform\nGrowth\nBenton\nseparates\n##about\n##kari\nbuffer\nanthropology\nbrigades\nfoil\n##wu\nDomain\nlicking\nwhore\n##rage\n##sham\nInitial\nCourthouse\nRutgers\ndams\nvillains\nsupermarket\n##brush\nBrunei\nPalermo\narises\nPassenger\noutreach\n##gill\nLabrador\nMcLaren\n##uy\nLori\n##fires\nHeads\nmagistrate\n¹⁄₂\nWeapons\n##wai\n##roke\nprojecting\n##ulates\nbordering\nMcKenzie\nPavel\nmidway\nGuangzhou\nstreamed\nracer\n##lished\neccentric\nspectral\n206\n##mism\nWilde\nGrange\npreparatory\nlent\n##tam\nstarving\nGertrude\n##cea\n##ricted\nBreakfast\nMira\nblurted\nderive\n##lair\nblunt\nsob\nCheltenham\nHenrik\nreinstated\nintends\n##istan\nunite\n##ector\nplayful\nsparks\nmapped\nCadet\nluggage\nprosperous\n##ein\nsalon\n##utes\nBiological\n##rland\nTyrone\nbuyer\n##lose\namounted\nSaw\nsmirked\nRonan\nReviews\nAdele\ntrait\n##proof\nBhutan\nGinger\n##junct\ndigitally\nstirring\n##isted\ncoconut\nHamlet\nDinner\nScale\npledge\n##RP\nWrong\nGoal\nPanel\ntherapeutic\nelevations\ninfectious\npriesthood\n##inda\nGuyana\ndiagnostic\n##mbre\nBlackwell\nsails\n##arm\nliteral\nperiodically\ngleaming\nRobot\nRector\n##abulous\n##tres\nReaching\nRomantic\nCP\nWonderful\n##tur\nornamental\n##nges\ntraitor\n##zilla\ngenetics\nmentioning\n##eim\nresonance\nAreas\nShopping\n##nard\nGail\nSolid\n##rito\n##mara\nWillem\nChip\nMatches\nVolkswagen\nobstacle\nOrgan\ninvites\nCoral\nattain\n##anus\n##dates\nMidway\nshuffled\nCecilia\ndessert\nGateway\nCh\nNapoleonic\nPetroleum\njets\ngoose\nstriped\nbowls\nvibration\nSims\nnickel\nThirteen\nproblematic\nintervene\n##grading\n##unds\nMum\nsemifinal\nRadical\n##izations\nrefurbished\n##sation\n##harine\nMaximilian\ncites\nAdvocate\nPotomac\nsurged\npreserves\nCurry\nangled\nordination\n##pad\nCade\n##DE\n##sko\nresearched\ntorpedoes\nResident\nwetlands\nhay\napplicants\ndepart\nBernstein\n##pic\n##ario\n##rae\nfavourable\n##wari\n##р\nmetabolism\nnobleman\nDefaulted\ncalculate\nignition\nCelebrity\nBelize\nsulfur\nFlat\nSc\nUSB\nflicker\nHertfordshire\nSept\nCFL\nPasadena\nSaturdays\nTitus\n##nir\nCanary\nComputing\nIsaiah\n##mler\nformidable\npulp\norchid\nCalled\nSolutions\nkilograms\nsteamer\n##hil\nDoncaster\nsuccessors\nStokes\nHolstein\n##sius\nsperm\nAPI\nRogue\ninstability\nAcoustic\n##rag\n159\nundercover\nWouldn\n##pra\n##medical\nEliminated\nhonorable\n##chel\ndenomination\nabrupt\nBuffy\nblouse\nfi\nRegardless\nSubsequent\n##rdes\nLover\n##tford\nbacon\n##emia\ncarving\n##cripts\nMassacre\nRamos\nLatter\n##ulp\nballroom\n##gement\nrichest\nbruises\nRest\nWiley\n##aster\nexplosions\n##lastic\nEdo\n##LD\nMir\nchoking\ndisgusted\nfaintly\nBarracks\nblasted\nheadlights\nTours\nensued\npresentations\n##cale\nwrought\n##oat\n##coa\nQuaker\n##sdale\nrecipe\n##gny\ncorpses\n##liance\ncomfortably\n##wat\nLandscape\nniche\ncatalyst\n##leader\nSecurities\nmessy\n##RL\nRodrigo\nbackdrop\n##opping\ntreats\nEmilio\nAnand\nbilateral\nmeadow\nVC\nsocialism\n##grad\nclinics\n##itating\n##ppe\n##ymphonic\nseniors\nAdvisor\nArmoured\nMethod\nAlley\n##orio\nSad\nfueled\nraided\nAxel\nNH\nrushes\nDixie\nOtis\nwrecked\n##22\ncapitalism\ncafé\n##bbe\n##pion\n##forcing\nAubrey\nLublin\nWhenever\nSears\nScheme\n##lana\nMeadows\ntreatise\n##RI\n##ustic\nsacrifices\nsustainability\nBiography\nmystical\nWanted\nmultiplayer\nApplications\ndisliked\n##tisfied\nimpaired\nempirical\nforgetting\nFairfield\nSunni\nblurred\nGrowing\nAvalon\ncoil\nCamera\nSkin\nbruised\nterminals\n##fted\n##roving\nCommando\n##hya\n##sper\nreservations\nneedles\ndangling\n##rsch\n##rsten\n##spect\n##mbs\nyoga\nregretted\nBliss\nOrion\nRufus\nglucose\nOlsen\nautobiographical\n##dened\n222\nhumidity\nShan\n##ifiable\nsupper\n##rou\nflare\n##MO\ncampaigning\ndescend\nsocio\ndeclares\nMounted\nGracie\nArte\nendurance\n##ety\nCopper\ncosta\nairplay\n##MB\nProceedings\ndislike\ngrimaced\noccupants\nbirths\nglacial\noblivious\ncans\ninstallment\nmuddy\n##ł\ncaptains\npneumonia\nQuiet\nSloan\nExcuse\n##nine\nGeography\ngymnastics\nmultimedia\ndrains\nAnthology\nGear\ncylindrical\nFry\nundertaking\n##pler\n##tility\nNan\n##recht\nDub\nphilosophers\npiss\nAtari\n##pha\nGalicia\nMéxico\n##nking\nContinuing\nbump\ngraveyard\npersisted\nShrine\n##erapy\ndefects\nAdvance\nBomber\n##oil\n##ffling\ncheerful\n##lix\nscrub\n##eto\nawkwardly\ncollaborator\nfencing\n##alo\nprophet\nCroix\ncoughed\n##lication\nroadway\nslaughter\nelephants\n##erated\nSimpsons\nvulnerability\nivory\nBirth\nlizard\nscarce\ncylinders\nfortunes\n##NL\nHate\nPriory\n##lai\nMcBride\n##copy\nLenny\nliaison\nTriangle\ncoronation\nsampled\nsavage\namidst\nGrady\nwhatsoever\ninstinctively\nReconstruction\ninsides\nseizure\nDrawing\n##rlin\nAntioch\nGao\nDíaz\n1760\nSparks\n##tien\n##bidae\nrehearsal\n##bbs\nbotanical\n##hers\ncompensate\nwholesale\nSeville\nshareholder\nprediction\nastronomical\nReddy\nhardest\ncircling\nwhereabouts\ntermination\nRep\nAssistance\nDramatic\nHerb\n##ghter\nclimbs\n188\nPoole\n301\n##pable\nwit\n##istice\nWalters\nrelying\nJakob\n##redo\nproceeding\nLangley\naffiliates\nou\n##allo\n##holm\nSamsung\n##ishi\nMissing\nXi\nvertices\nClaus\nfoam\nrestless\n##uating\n##sso\n##ttering\nPhilips\ndelta\nbombed\nCatalogue\ncoaster\nLing\nWillard\nsatire\n410\nComposition\nNet\nOrioles\n##ldon\nfins\nPalatinate\nWoodward\ntease\ntilt\nbrightness\n##70\n##bbling\n##loss\n##dhi\n##uilt\nWhoever\n##yers\nhitter\nElton\nExtension\nace\nAffair\nrestructuring\n##loping\nPaterson\nhi\n##rya\nspouse\nShay\nHimself\npiles\npreaching\n##gical\nbikes\nBrave\nexpulsion\nMirza\nstride\nTrees\ncommemorated\nfamine\nmasonry\nSelena\nWatt\nBanking\nRancho\nStockton\ndip\ntattoos\nVlad\nacquainted\nFlyers\nruthless\nfourteenth\nillustrate\n##akes\nEPA\n##rows\n##uiz\nbumped\nDesigned\nLeaders\nmastered\nManfred\nswirled\nMcCain\n##rout\nArtemis\nrabbi\nflinched\nupgrades\npenetrate\nshipyard\ntransforming\ncaretaker\n##eiro\nMaureen\ntightening\n##founded\nRAM\n##icular\n##mper\n##rung\nFifteen\nexploited\nconsistency\ninterstate\n##ynn\nBridget\ncontamination\nMistress\n##rup\ncoating\n##FP\n##jective\nLibyan\n211\nGemma\ndependence\nshrubs\n##ggled\nGermain\nretaliation\ntraction\n##PP\nDangerous\nterminology\npsychiatrist\n##garten\nhurdles\nNatal\nwasting\nWeir\nrevolves\nstripe\n##reased\npreferences\n##entation\n##lde\n##áil\n##otherapy\nFlame\n##ologies\nviruses\nLabel\nPandora\nveil\n##ogical\nColiseum\nCottage\ncreeping\nJong\nlectured\n##çaise\nshoreline\n##fference\n##hra\nShade\nClock\nFaye\nbilingual\nHumboldt\nOperating\n##fter\n##was\nalgae\ntowed\namphibious\nParma\nimpacted\nsmacked\nPiedmont\nMonsters\n##omb\nMoor\n##lberg\nsinister\nPostal\n178\nDrummond\nSign\ntextbooks\nhazardous\nBrass\nRosemary\nPick\nSit\nArchitect\ntransverse\nCentennial\nconfess\npolling\n##aia\nJulien\n##mand\nconsolidation\nEthel\n##ulse\nseverity\nYorker\nchoreographer\n1840s\n##ltry\nsofter\nversa\n##geny\n##quila\n##jō\nCaledonia\nFriendship\nVisa\nrogue\n##zzle\nbait\nfeather\nincidence\nFoods\nShips\n##uto\n##stead\narousal\n##rote\nHazel\n##bolic\nSwing\n##ej\n##cule\n##jana\n##metry\n##uity\nValuable\n##ₙ\nShropshire\n##nect\n365\nOnes\nrealise\nCafé\nAlbuquerque\n##grown\n##stadt\n209\n##ᵢ\nprefers\nwithstand\nLillian\nMacArthur\nHara\n##fulness\ndomination\n##VO\n##school\nFreddy\nethnicity\n##while\nadorned\nhormone\nCalder\nDomestic\nFreud\nShields\n##phus\n##rgan\nBP\nSegunda\nMustang\n##GI\nBonn\npatiently\nremarried\n##umbria\nCrete\nElephant\nNuremberg\ntolerate\nTyson\n##evich\nProgramming\n##lander\nBethlehem\nsegregation\nConstituency\nquarterly\nblushed\nphotographers\nSheldon\nporcelain\nBlanche\ngoddamn\nlively\n##fused\nbumps\n##eli\ncurated\ncoherent\nprovoked\n##vet\nMadeleine\n##isco\nrainy\nBethel\naccusation\nponytail\ngag\n##lington\nquicker\nscroll\n##vate\nBow\nGender\nIra\ncrashes\nACT\nMaintenance\n##aton\n##ieu\nbitterly\nstrains\nrattled\nvectors\n##arina\n##ishly\n173\nparole\n##nx\namusing\nGonzalez\n##erative\nCaucus\nsensual\nPenelope\ncoefficient\nMateo\n##mani\nproposition\nDuty\nlacrosse\nproportions\nPlato\nprofiles\nBotswana\nBrandt\nreins\nmandolin\nencompassing\n##gens\nKahn\nprop\nsummon\n##MR\n##yrian\n##zaki\nFalling\nconditional\nthy\n##bao\n##ych\nradioactive\n##nics\nNewspaper\n##people\n##nded\nGaming\nsunny\n##look\nSherwood\ncrafted\nNJ\nawoke\n187\ntimeline\ngiants\npossessing\n##ycle\nCheryl\nng\nRuiz\npolymer\npotassium\nRamsay\nrelocation\n##leen\nSociology\n##bana\nFranciscan\npropulsion\ndenote\n##erjee\nregisters\nheadline\nTests\nemerges\nArticles\nMint\nlivery\nbreakup\nkits\nRap\nBrowning\nBunny\n##mington\n##watch\nAnastasia\nZachary\narranging\nbiographical\nErica\nNippon\n##membrance\nCarmel\n##sport\n##xes\nPaddy\n##holes\nIssues\nSpears\ncompliment\n##stro\n##graphs\nCastillo\n##MU\n##space\nCorporal\n##nent\n174\nGentlemen\n##ilize\n##vage\nconvinces\nCarmine\nCrash\n##hashi\nFiles\nDoctors\nbrownish\nsweating\ngoats\n##conductor\nrendition\n##bt\nNL\n##spiration\ngenerates\n##cans\nobsession\n##noy\nDanger\nDiaz\nheats\nRealm\npriorities\n##phon\n1300\ninitiation\npagan\nbursts\narchipelago\nchloride\nScreenplay\nHewitt\nKhmer\nbang\njudgement\nnegotiating\n##ait\nMabel\ndensely\nBoulder\nknob\n430\nAlfredo\n##kt\npitches\n##ées\n##ان\nMacdonald\n##llum\nimply\n##mot\nSmile\nspherical\n##tura\nDerrick\nKelley\nNico\ncortex\nlaunches\ndiffered\nparallels\nNavigation\n##child\n##rming\ncanoe\nforestry\nreinforce\n##mote\nconfirming\ntasting\nscaled\n##resh\n##eting\nUnderstanding\nprevailing\nPearce\nCW\nearnest\nGaius\nasserts\ndenoted\nlandmarks\nChargers\nwarns\n##flies\nJudges\njagged\n##dain\ntails\nHistorian\nMillie\n##sler\n221\n##uard\nabsurd\nDion\n##ially\nmakeshift\nSpecifically\nignorance\nEat\n##ieri\ncomparisons\nforensic\n186\nGiro\nskeptical\ndisciplinary\nbattleship\n##45\nLibby\n520\nOdyssey\nledge\n##post\nEternal\nMissionary\ndeficiency\nsettler\nwonders\n##gai\nraging\n##cis\nRomney\nUlrich\nannexation\nboxers\nsect\n204\nARIA\ndei\nHitchcock\nte\nVarsity\n##fic\nCC\nlending\n##nial\n##tag\n##rdy\n##obe\nDefensive\n##dson\n##pore\nstellar\nLam\nTrials\ncontention\nSung\n##uminous\nPoe\nsuperiority\n##plicate\n325\nbitten\nconspicuous\n##olly\nLila\nPub\nPetit\ndistorted\nISIL\ndistinctly\n##family\nCowboy\nmutant\n##cats\n##week\nChanges\nSinatra\nepithet\nneglect\nInnocent\ngamma\nthrill\nreggae\n##adia\n##ational\n##due\nlandlord\n##leaf\nvisibly\n##ì\nDarlington\nGomez\n##iting\nscarf\n##lade\nHinduism\nFever\nscouts\n##roi\nconvened\n##oki\n184\nLao\nboycott\nunemployed\n##lore\n##ß\n##hammer\nCurran\ndisciples\nodor\n##ygiene\nLighthouse\nPlayed\nwhales\ndiscretion\nYves\n##ceived\npauses\ncoincide\n##nji\ndizzy\n##scopic\nrouted\nGuardians\nKellan\ncarnival\nnasal\n224\n##awed\nMitsubishi\n640\nCast\nsilky\nProjects\njoked\nHuddersfield\nRothschild\nzu\n##olar\nDivisions\nmildly\n##eni\n##lge\nAppalachian\nSahara\npinch\n##roon\nwardrobe\n##dham\n##etal\nBubba\n##lini\n##rumbling\nCommunities\nPoznań\nunification\nBeau\nKris\nSV\nRowing\nMinh\nreconciliation\n##saki\n##sor\ntaped\n##reck\ncertificates\ngubernatorial\nrainbow\n##uing\nlitter\n##lique\n##oted\nButterfly\nbenefited\nImages\ninduce\nBalkans\nVelvet\n##90\n##xon\nBowman\n##breaker\npenis\n##nitz\n##oint\n##otive\ncrust\n##pps\norganizers\nOutdoor\nnominees\n##rika\nTX\n##ucks\nProtestants\n##imation\nappetite\nBaja\nawaited\n##points\nwindshield\n##igh\n##zled\nBrody\nBuster\nstylized\nBryce\n##sz\nDollar\nvest\nmold\nounce\nok\nreceivers\n##uza\nPurdue\nHarrington\nHodges\ncaptures\n##ggio\nReservation\n##ssin\n##tman\ncosmic\nstraightforward\nflipping\nremixed\n##athed\nGómez\nLim\nmotorcycles\neconomies\nowning\nDani\n##rosis\nmyths\nsire\nkindly\n1768\nBean\ngraphs\n##mee\n##RO\n##geon\npuppy\nStephenson\nnotified\n##jer\nWatching\n##rama\nSino\nurgency\nIslanders\n##mash\nPlata\nfumble\n##chev\n##stance\n##rack\n##she\nfacilitated\nswings\nakin\nenduring\npayload\n##phine\nDeputies\nmurals\n##tooth\n610\nJays\neyeing\n##quito\ntransparency\n##cote\nTimor\nnegatively\n##isan\nbattled\n##fected\nthankful\nRage\nhospitality\nincorrectly\n207\nentrepreneurs\n##cula\n##wley\nhedge\n##cratic\nCorpus\nOdessa\nWhereas\n##ln\nfetch\nhappier\nAmherst\nbullying\ngraceful\nHeight\nBartholomew\nwillingness\nqualifier\n191\nSyed\nWesleyan\nLayla\n##rrence\nWebber\n##hum\nRat\n##cket\n##herence\nMonterey\ncontaminated\nBeside\nMustafa\nNana\n213\n##pruce\nReason\n##spense\nspike\n##gé\nAU\ndisciple\ncharcoal\n##lean\nformulated\nDiesel\nMariners\naccreditation\nglossy\n1800s\n##ih\nMainz\nunison\nMarianne\nshear\noverseeing\nvernacular\nbowled\n##lett\nunpopular\n##ckoned\n##monia\nGaston\n##TI\n##oters\nCups\n##bones\n##ports\nMuseo\nminors\n1773\nDickens\n##EL\n##NBC\nPresents\nambitions\naxes\nRío\nYukon\nbedside\nRibbon\nUnits\nfaults\nconceal\n##lani\nprevailed\n214\nGoodwin\nJaguar\ncrumpled\nCullen\nWireless\nceded\nremotely\nBin\nmocking\nstraps\nceramics\n##avi\n##uding\n##ader\nTaft\ntwenties\n##aked\nProblem\nquasi\nLamar\n##ntes\n##avan\nBarr\n##eral\nhooks\nsa\n##ône\n194\n##ross\nNero\nCaine\ntrance\nHomeland\nbenches\nGuthrie\ndismiss\n##lex\nCésar\nfoliage\n##oot\n##alty\nAssyrian\nAhead\nMurdoch\ndictatorship\nwraps\n##ntal\nCorridor\nMackay\nrespectable\njewels\nunderstands\n##pathic\nBryn\n##tep\nON\ncapsule\nintrigued\nSleeping\ncommunists\n##chayat\n##current\n##vez\ndoubling\nbooklet\n##uche\nCreed\n##NU\nspies\n##sef\nadjusting\n197\nImam\nheaved\nTanya\ncanonical\nrestraint\nsenators\nstainless\n##gnate\nMatter\ncache\nrestrained\nconflicting\nstung\n##ool\nSustainable\nantiquity\n193\nheavens\ninclusive\n##ador\nfluent\n303\n911\narchaeologist\nsuperseded\n##plex\nTammy\ninspire\n##passing\n##lub\nLama\nMixing\n##activated\n##yote\nparlor\ntactic\n198\nStefano\nprostitute\nrecycling\nsorted\nbanana\nStacey\nMusée\naristocratic\ncough\n##rting\nauthorised\ngangs\nrunoff\nthoughtfully\n##nish\nFisheries\nProvence\ndetector\nhum\n##zhen\npill\n##árez\nMap\nLeaves\nPeabody\nskater\nvent\n##color\n390\ncerebral\nhostages\nmare\nJurassic\nswell\n##isans\nKnoxville\nNaked\nMalaya\nscowl\nCobra\n##anga\nSexual\n##dron\n##iae\n196\n##drick\nRavens\nBlaine\n##throp\nIsmail\nsymmetric\n##lossom\nLeicestershire\nSylvester\nglazed\n##tended\nRadar\nfused\nFamilies\nBlacks\nSale\nZion\nfoothills\nmicrowave\nslain\nCollingwood\n##pants\n##dling\nkillers\nroutinely\nJanice\nhearings\n##chanted\n##ltration\ncontinents\n##iving\n##yster\n##shot\n##yna\ninjected\nGuillaume\n##ibi\nkinda\nConfederacy\nBarnett\ndisasters\nincapable\n##grating\nrhythms\nbetting\ndraining\n##hak\nCallie\nGlover\n##iliated\nSherlock\nhearted\npunching\nWolverhampton\nLeaf\nPi\nbuilders\nfurnished\nknighted\nPhoto\n##zle\nTouring\nfumbled\npads\n##ий\nBartlett\nGunner\neerie\nMarius\nBonus\npots\n##hino\n##pta\nBray\nFrey\nOrtiz\nstalls\nbelongings\nSubway\nfascination\nmetaphor\nBat\nBoer\nColchester\nsway\n##gro\nrhetoric\n##dheim\nFool\nPMID\nadmire\n##hsil\nStrand\nTNA\n##roth\nNottinghamshire\n##mat\n##yler\nOxfordshire\n##nacle\n##roner\nBS\n##nces\nstimulus\ntransports\nSabbath\n##postle\nRichter\n4000\n##grim\n##shima\n##lette\ndeteriorated\nanalogous\n##ratic\nUHF\nenergies\ninspiring\nYiddish\nActivities\n##quential\n##boe\nMelville\n##ilton\nJudd\nconsonants\nlabs\nsmuggling\n##fari\navid\n##uc\ntruce\nundead\n##raith\nMostly\nbracelet\nConnection\nHussain\nawhile\n##UC\n##vention\nliable\ngenetically\n##phic\nImportant\nWildcats\ndaddy\ntransmit\n##cas\nconserved\nYesterday\n##lite\nNicky\nGuys\nWilder\nLay\nskinned\nCommunists\nGarfield\nNearby\norganizer\nLoss\ncrafts\nwalkway\nChocolate\nSundance\nSynod\n##enham\nmodify\nswayed\nSurface\nanalysts\nbrackets\ndrone\nparachute\nsmelling\nAndrés\nfilthy\nfrogs\nvertically\n##OK\nlocalities\nmarries\nAHL\n35th\n##pian\nPalazzo\ncube\ndismay\nrelocate\n##на\nHear\n##digo\n##oxide\nprefecture\nconverts\nhangar\n##oya\n##ucking\nSpectrum\ndeepened\nspoiled\nKeeping\n##phobic\nVerona\noutrage\nImprovement\n##UI\nmasterpiece\nslung\nCalling\nchant\nHaute\nmediated\nmanipulated\naffirmed\n##hesis\nHangul\nskies\n##llan\nWorcestershire\n##kos\nmosaic\n##bage\n##wned\nPutnam\nfolder\n##LM\nguts\nnoteworthy\n##rada\nAJ\nsculpted\n##iselle\n##rang\nrecognizable\n##pent\ndolls\nlobbying\nimpatiently\nSe\nstaple\nSerb\ntandem\nHiroshima\nthieves\n##ynx\nfaculties\nNorte\n##alle\n##trusion\nchords\n##ylon\nGareth\n##lops\n##escu\nFIA\nLevin\nauspices\ngroin\nHui\nnun\nListed\nHonourable\nLarsen\nrigorous\n##erer\nTonga\n##pment\n##rave\n##track\n##aa\n##enary\n540\nclone\nsediment\nesteem\nsighted\ncruelty\n##boa\ninverse\nviolating\nAmtrak\nStatus\namalgamated\nvertex\nAR\nharmless\nAmir\nmounts\nCoronation\ncounseling\nAudi\nCO₂\nsplits\n##eyer\nHumans\nSalmon\n##have\n##rado\n##čić\n216\ntakeoff\nclassmates\npsychedelic\n##gni\nGypsy\n231\nAnger\nGAA\nME\n##nist\n##tals\nLissa\nOdd\nbaptized\nFiat\nfringe\n##hren\n179\nelevators\nperspectives\n##TF\n##ngle\nQuestion\nfrontal\n950\nthicker\nMolecular\n##nological\nSixteen\nBaton\nHearing\ncommemorative\ndorm\nArchitectural\npurity\n##erse\nrisky\nGeorgie\nrelaxing\n##ugs\ndowned\n##rar\nSlim\n##phy\nIUCN\n##thorpe\nParkinson\n217\nMarley\nShipping\nsweaty\nJesuits\nSindh\nJanata\nimplying\nArmenians\nintercept\nAnkara\ncommissioners\nascended\nsniper\nGrass\nWalls\nsalvage\nDewey\ngeneralized\nlearnt\nPT\n##fighter\n##tech\nDR\n##itrus\n##zza\nmercenaries\nslots\n##burst\n##finger\n##nsky\nPrinces\nRhodesia\n##munication\n##strom\nFremantle\nhomework\nins\n##Os\n##hao\n##uffed\nThorpe\nXiao\nexquisite\nfirstly\nliberated\ntechnician\nOilers\nPhyllis\nherb\nsharks\nMBE\n##stock\nProduct\nbanjo\n##morandum\n##than\nVisitors\nunavailable\nunpublished\noxidation\nVogue\n##copic\n##etics\nYates\n##ppard\nLeiden\nTrading\ncottages\nPrinciples\n##Millan\n##wife\n##hiva\nVicar\nnouns\nstrolled\n##eorological\n##eton\n##science\nprecedent\nArmand\nGuido\nrewards\n##ilis\n##tise\nclipped\nchick\n##endra\naverages\ntentatively\n1830s\n##vos\nCertainly\n305\nSociété\nCommandant\n##crats\n##dified\n##nka\nmarsh\nangered\nventilation\nHutton\nRitchie\n##having\nEclipse\nflick\nmotionless\nAmor\nFest\nLoire\nlays\n##icit\n##sband\nGuggenheim\nLuck\ndisrupted\n##ncia\nDisco\n##vigator\ncriticisms\ngrins\n##lons\n##vial\n##ody\nsalute\nCoaches\njunk\nsaxophonist\n##eology\nUprising\nDiet\n##marks\nchronicles\nrobbed\n##iet\n##ahi\nBohemian\nmagician\nwavelength\nKenyan\naugmented\nfashionable\n##ogies\nLuce\nF1\nMonmouth\n##jos\n##loop\nenjoyment\nexemption\nCenters\n##visor\nSoundtrack\nblinding\npractitioner\nsolidarity\nsacrificed\n##oso\n##cture\n##riated\nblended\nAbd\nCopyright\n##nob\n34th\n##reak\nClaudio\nhectare\nrotor\ntestify\n##ends\n##iably\n##sume\nlandowner\n##cess\n##ckman\nEduard\nSilesian\nbackseat\nmutually\n##abe\nMallory\nbounds\nCollective\nPoet\nWinkler\npertaining\nscraped\nPhelps\ncrane\nflickering\nProto\nbubbles\npopularized\nremoves\n##86\nCadillac\nWarfare\naudible\nrites\nshivering\n##sist\n##nst\n##biotic\nMon\nfascist\nBali\nKathryn\nambiguous\nfuriously\nmorale\npatio\nSang\ninconsistent\ntopology\nGreens\nmonkeys\nKöppen\n189\nToy\nvow\n##ías\nbombings\n##culus\nimprovised\nlodged\nsubsidiaries\ngarment\nstartling\npractised\nHume\nThorn\ncategorized\nTill\nEileen\nwedge\n##64\nFederico\npatriotic\nunlock\n##oshi\nbadminton\nCompared\nVilnius\n##KE\nCrimean\nKemp\ndecks\nspaced\nresolutions\nsighs\n##mind\nImagine\nCartoon\nhuddled\npolicemen\nforwards\n##rouch\nequals\n##nter\ninspected\nCharley\nMG\n##rte\npamphlet\nArturo\ndans\nscarcely\n##ulton\n##rvin\nparental\nunconstitutional\nwatts\nSusannah\nDare\n##sitive\nRowland\nValle\ninvalid\n##ué\nDetachment\nacronym\nYokohama\nverified\n##lsson\ngroove\nLiza\nclarified\ncompromised\n265\n##rgon\n##orf\nhesitant\nFruit\nApplication\nMathias\nicons\n##cell\nQin\ninterventions\n##uron\npunt\nremnant\n##rien\nAmes\nmanifold\nspines\nfloral\n##zable\ncomrades\nFallen\norbits\nAnnals\nhobby\nAuditorium\nimplicated\nresearching\nPueblo\nTa\nterminate\n##pella\nRings\napproximation\nfuzzy\n##ús\nthriving\n##ket\nConor\nalarmed\netched\nCary\n##rdon\nAlly\n##rington\nPay\nmint\n##hasa\n##unity\n##dman\n##itate\nOceania\nfurrowed\ntrams\n##aq\nWentworth\nventured\nchoreography\nprototypes\nPatel\nmouthed\ntrenches\n##licing\n##yya\nLies\ndeception\n##erve\n##vations\nBertrand\nearthquakes\n##tography\nSouthwestern\n##aja\ntoken\nGupta\n##yō\nBeckett\ninitials\nironic\nTsar\nsubdued\nshootout\nsobbing\nliar\nScandinavia\nSouls\nch\ntherapist\ntrader\nRegulation\nKali\nbusiest\n##pation\n32nd\nTelephone\nVargas\n##moky\n##nose\n##uge\nFavorite\nabducted\nbonding\n219\n255\ncorrection\nmat\ndrown\nfl\nunbeaten\nPocket\nSummers\nQuite\nrods\nPercussion\n##ndy\nbuzzing\ncadet\nWilkes\nattire\ndirectory\nutilities\nnaive\npopulous\nHendrix\n##actor\ndisadvantage\n1400\nLandon\nUnderworld\n##ense\nOccasionally\nmercury\nDavey\nMorley\nspa\nwrestled\n##vender\neclipse\nSienna\nsupplemented\nthou\nStream\nliturgical\n##gall\n##berries\n##piration\n1769\nBucks\nabandoning\n##jutant\n##nac\n232\nvenom\n##31\nRoche\ndotted\nCurrie\nCórdoba\nMilo\nSharif\ndivides\njustification\nprejudice\nfortunate\n##vide\n##ābād\nRowe\ninflammatory\n##eld\navenue\nSources\n##rimal\nMessenger\nBlanco\nadvocating\nformulation\n##pute\nemphasizes\nnut\nArmored\n##ented\nnutrients\n##tment\ninsistence\nMartins\nlandowners\n##RB\ncomparatively\nheadlines\nsnaps\n##qing\nCelebration\n##mad\nrepublican\n##NE\nTrace\n##500\n1771\nproclamation\nNRL\nRubin\nBuzz\nWeimar\n##AG\n199\nposthumous\n##ental\n##deacon\nDistance\nintensely\noverheard\nArcade\ndiagonal\nhazard\nGiving\nweekdays\n##ù\nVerdi\nactresses\n##hare\nPulling\n##erries\n##pores\ncatering\nshortest\n##ctors\n##cure\n##restle\n##reta\n##runch\n##brecht\n##uddin\nMoments\nsenate\nFeng\nPrescott\n##thest\n218\ndivisional\nBertie\nsparse\nsurrounds\ncoupling\ngravitational\nwerewolves\n##lax\nRankings\n##mated\n##tries\nShia\n##mart\n##23\n##vocative\ninterfaces\nmorphology\nnewscast\n##bide\ninputs\nsolicitor\nOlaf\ncabinets\npuzzles\n##tains\nUnified\n##firmed\nWA\nsolemn\n##opy\nTito\nJaenelle\nNeolithic\nhorseback\n##ires\npharmacy\nprevalence\n##lint\nSwami\n##bush\n##tudes\nPhilipp\nmythical\ndivers\nScouting\naperture\nprogressively\n##bay\n##nio\nbounce\nFloor\n##elf\nLucan\nadulthood\nhelm\nBluff\nPassage\nSalvation\nlemon\nnapkin\nscheduling\n##gets\nElements\nMina\nNovak\nstalled\n##llister\nInfrastructure\n##nky\n##tania\n##uished\nKatz\nNorma\nsucks\ntrusting\n1765\nboilers\nAccordingly\n##hered\n223\nCrowley\n##fight\n##ulo\nHenrietta\n##hani\npounder\nsurprises\n##chor\n##glia\nDukes\n##cracy\n##zier\n##fs\nPatriot\nsilicon\n##VP\nsimulcast\ntelegraph\nMysore\ncardboard\nLen\n##QL\nAuguste\naccordion\nanalytical\nspecify\nineffective\nhunched\nabnormal\nTransylvania\n##dn\n##tending\nEmilia\nglittering\nMaddy\n##wana\n1762\nExternal\nLecture\nendorsement\nHernández\nAnaheim\nWare\noffences\n##phorus\nPlantation\npopping\nBonaparte\ndisgusting\nneared\n##notes\nIdentity\nheroin\nnicely\n##raverse\napron\ncongestion\n##PR\npadded\n##fts\ninvaders\n##came\nfreshly\nHalle\nendowed\nfracture\nROM\n##max\nsediments\ndiffusion\ndryly\n##tara\nTam\nDraw\nSpin\nTalon\nAnthropology\n##lify\nnausea\n##shirt\ninsert\nFresno\ncapitalist\nindefinitely\napples\nGift\nscooped\n60s\nCooperative\nmistakenly\n##lover\nmurmur\n##iger\nEquipment\nabusive\norphanage\n##9th\n##lterweight\n##unda\nBaird\nant\nsaloon\n33rd\nChesapeake\n##chair\n##sound\n##tend\nchaotic\npornography\nbrace\n##aret\nheiress\nSSR\nresentment\nArbor\nheadmaster\n##uren\nunlimited\n##with\n##jn\nBram\nEly\nPokémon\npivotal\n##guous\nDatabase\nMarta\nShine\nstumbling\n##ovsky\n##skin\nHenley\nPolk\nfunctioned\n##layer\n##pas\n##udd\n##MX\nblackness\ncadets\nferal\nDamian\n##actions\n2D\n##yla\nApocalypse\n##aic\ninactivated\n##china\n##kovic\n##bres\ndestroys\nnap\nMacy\nsums\nMadhya\nWisdom\nrejects\n##amel\n60th\nCho\nbandwidth\n##sons\n##obbing\n##orama\nMutual\nshafts\n##estone\n##rsen\naccord\nreplaces\nwaterfront\n##gonal\n##rida\nconvictions\n##ays\ncalmed\nsuppliers\nCummings\nGMA\nfearful\nScientist\nSinai\nexamines\nexperimented\nNetflix\nEnforcement\nScarlett\n##lasia\nHealthcare\n##onte\nDude\ninverted\n##36\n##regation\n##lidae\nMunro\n##angay\nAirbus\noverlapping\nDrivers\nlawsuits\nbodily\n##udder\nWanda\nEffects\nFathers\n##finery\n##islav\nRidley\nobservatory\npod\n##utrition\nElectricity\nlandslide\n##mable\n##zoic\n##imator\n##uration\nEstates\nsleepy\nNickelodeon\nsteaming\nirony\nschedules\nsnack\nspikes\nHmm\n##nesia\n##bella\n##hibit\nGreenville\nplucked\nHarald\n##ono\nGamma\ninfringement\nroaring\ndeposition\n##pol\n##orum\n660\nseminal\npassports\nengagements\nAkbar\nrotated\n##bina\n##gart\nHartley\n##lown\n##truct\nuttered\ntraumatic\nDex\n##ôme\nHolloway\nMV\napartheid\n##nee\nCounter\nColton\nOR\n245\nSpaniards\nRegency\nSchedule\nscratching\nsquads\nverify\n##alk\nkeyboardist\nrotten\nForestry\naids\ncommemorating\n##yed\n##érie\nSting\n##elly\nDai\n##fers\n##berley\n##ducted\nMelvin\ncannabis\nglider\n##enbach\n##rban\nCostello\nSkating\ncartoonist\nAN\naudit\n##pectator\ndistributing\n226\n312\ninterpreter\nheader\nAlternatively\n##ases\nsmug\n##kumar\ncabins\nremastered\nConnolly\nKelsey\nLED\ntentative\nCheck\nSichuan\nshaved\n##42\nGerhard\nHarvest\ninward\n##rque\nHopefully\nhem\n##34\nTypical\nbinds\nwrath\nWoodstock\nforcibly\nFergus\n##charged\n##tured\nprepares\namenities\npenetration\n##ghan\ncoarse\n##oned\nenthusiasts\n##av\n##twined\nfielded\n##cky\nKiel\n##obia\n470\nbeers\ntremble\nyouths\nattendees\n##cademies\n##sex\nMacon\ncommunism\ndir\n##abi\nLennox\nWen\ndifferentiate\njewel\n##SO\nactivate\nassert\nladen\nunto\nGillespie\nGuillermo\naccumulation\n##GM\nNGO\nRosenberg\ncalculating\ndrastically\n##omorphic\npeeled\nLiège\ninsurgents\noutdoors\n##enia\nAspen\nSep\nawakened\n##eye\nConsul\nMaiden\ninsanity\n##brian\nfurnace\nColours\ndistributions\nlongitudinal\nsyllables\n##scent\nMartian\naccountant\nAtkins\nhusbands\nsewage\nzur\ncollaborate\nhighlighting\n##rites\n##PI\ncolonization\nnearer\n##XT\ndunes\npositioning\nKu\nmultitude\nluxurious\nVolvo\nlinguistics\nplotting\nsquared\n##inder\noutstretched\n##uds\nFuji\nji\n##feit\n##ahu\n##loat\n##gado\n##luster\n##oku\nAmérica\n##iza\nResidents\nvine\nPieces\nDD\nVampires\n##ová\nsmoked\nharshly\nspreads\n##turn\n##zhi\nbetray\nelectors\n##settled\nConsidering\nexploits\nstamped\nDusty\nenraged\nNairobi\n##38\nintervened\n##luck\norchestras\n##lda\nHereford\nJarvis\ncalf\n##itzer\n##CH\nsalesman\nLovers\ncigar\nAngelica\ndoomed\nheroine\n##tible\nSanford\noffenders\n##ulously\narticulated\n##oam\nEmanuel\nGardiner\nEdna\nShu\ngigantic\n##stable\nTallinn\ncoasts\nMaker\nale\nstalking\n##oga\n##smus\nlucrative\nsouthbound\n##changing\nReg\n##lants\nSchleswig\ndiscount\ngrouping\nphysiological\n##OH\n##sun\nGalen\nassurance\nreconcile\nrib\nscarlet\nThatcher\nanarchist\n##oom\nTurnpike\n##ceding\ncocktail\nSweeney\nAllegheny\nconcessions\noppression\nreassuring\n##poli\n##ticus\n##TR\n##VI\n##uca\n##zione\ndirectional\nstrikeouts\nBeneath\nCouldn\nKabul\n##national\nhydroelectric\n##jit\nDesire\n##riot\nenhancing\nnorthbound\n##PO\nOk\nRoutledge\nvolatile\nBernardo\nPython\n333\nample\nchestnut\nautomobiles\n##innamon\n##care\n##hering\nBWF\nsalaries\nTurbo\nacquisitions\n##stituting\nstrengths\npilgrims\nPonce\nPig\nActors\nBeard\nsanitation\n##RD\n##mett\nTelecommunications\nworms\n##idas\nJuno\nLarson\nVentura\nNortheastern\nweighs\nHoughton\ncollaborating\nlottery\n##rano\nWonderland\ngigs\n##lmer\n##zano\n##edd\n##nife\nmixtape\npredominant\ntripped\n##ruly\nAlexei\ninvesting\nBelgarath\nBrasil\nhiss\n##crat\n##xham\nCôte\n560\nkilometer\n##cological\nanalyzing\n##As\nengined\nlistener\n##cakes\nnegotiation\n##hisky\nSantana\n##lemma\nIAAF\nSeneca\nskeletal\nCovenant\nSteiner\n##lev\n##uen\nNeptune\nretention\n##upon\nClosing\nCzechoslovak\nchalk\nNavarre\nNZ\n##IG\n##hop\n##oly\n##quatorial\n##sad\nBrewery\nConflict\nThem\nrenew\nturrets\ndisagree\nPetra\nSlave\n##reole\nadjustment\n##dela\n##regard\n##sner\nframing\nstature\n##rca\n##sies\n##46\n##mata\nLogic\ninadvertently\nnaturalist\nspheres\ntowering\nheightened\nDodd\nrink\n##fle\nKeyboards\nbulb\ndiver\nul\n##tsk\nExodus\nDeacon\nEspaña\nCanadiens\noblique\nthud\nreigned\nrug\nWhitman\nDash\n##iens\nHaifa\npets\n##arland\nmanually\ndart\n##bial\nSven\ntextiles\nsubgroup\nNapier\ngraffiti\nrevolver\nhumming\nBabu\nprotector\ntyped\nProvinces\nSparta\nWills\nsubjective\n##rella\ntemptation\n##liest\nFL\nSadie\nmanifest\nGuangdong\nTransfer\nentertain\neve\nrecipes\n##33\nBenedictine\nretailer\n##dence\nestablishes\n##cluded\n##rked\nUrsula\n##ltz\n##lars\n##rena\nqualifiers\n##curement\ncolt\ndepictions\n##oit\nSpiritual\ndifferentiation\nstaffed\ntransitional\n##lew\n1761\nfatalities\n##oan\nBayern\nNorthamptonshire\nWeeks\n##CU\nFife\ncapacities\nhoarse\n##latt\n##ة\nevidenced\n##HD\n##ographer\nassessing\nevolve\nhints\n42nd\nstreaked\n##lve\nYahoo\n##estive\n##rned\n##zas\nbaggage\nElected\nsecrecy\n##champ\nCharacter\nPen\nDecca\ncape\nBernardino\nvapor\nDolly\ncounselor\n##isers\nBenin\n##khar\n##CR\nnotch\n##thus\n##racy\nbounty\nlend\ngrassland\n##chtenstein\n##dating\npseudo\ngolfer\nsimplest\n##ceive\nLucivar\nTriumph\ndinosaur\ndinosaurs\n##šić\nSeahawks\n##nco\nresorts\nreelected\n1766\nreproduce\nuniversally\n##OA\nER\ntendencies\nConsolidated\nMassey\nTasmanian\nreckless\n##icz\n##ricks\n1755\nquestionable\nAudience\n##lates\npreseason\nQuran\ntrivial\nHaitian\nFreeway\ndialed\nAppointed\nHeard\necosystems\n##bula\nhormones\nCarbon\nRd\n##arney\n##working\nChristoph\npresiding\npu\n##athy\nMorrow\nDar\nensures\nposing\nremedy\nEA\ndisclosed\n##hui\n##rten\nrumours\nsurveying\n##ficiency\nAziz\nJewel\nPlays\n##smatic\nBernhard\nChristi\n##eanut\n##friend\njailed\n##dr\ngovern\nneighbour\nbutler\nAcheron\nmurdering\noils\nmac\nEditorial\ndetectives\nbolts\n##ulon\nGuitars\nmalaria\n36th\nPembroke\nOpened\n##hium\nharmonic\nserum\n##sio\nFranks\nfingernails\n##gli\nculturally\nevolving\nscalp\nVP\ndeploy\nuploaded\nmater\n##evo\nJammu\nSpa\n##icker\nflirting\n##cursions\nHeidi\nMajority\nsprawled\n##alytic\nZheng\nbunker\n##lena\nST\n##tile\nJiang\nceilings\n##ently\n##ols\nRecovery\ndire\n##good\nManson\nHonestly\nMontréal\n1764\n227\nquota\nLakshmi\nincentive\nAccounting\n##cilla\nEureka\nReaper\nbuzzed\n##uh\ncourtroom\ndub\n##mberg\nKC\nGong\nTheodor\nAcadémie\nNPR\ncriticizing\nprotesting\n##pired\n##yric\nabuses\nfisheries\n##minated\n1767\nyd\nGemini\nSubcommittee\n##fuse\nDuff\nWasn\nWight\ncleaner\n##tite\nplanetary\nSurvivor\nZionist\nmounds\n##rary\nlandfall\ndisruption\nyielding\n##yana\nbids\nunidentified\nGarry\nEllison\nElmer\nFishing\nHayward\ndemos\nmodelling\n##anche\n##stick\ncaressed\nentertained\n##hesion\npiers\nCrimea\n##mass\nWHO\nboulder\ntrunks\n1640\nBiennale\nPalestinians\nPursuit\n##udes\nDora\ncontender\n##dridge\nNanjing\n##ezer\n##former\n##ibel\nWhole\nproliferation\n##tide\n##weiler\nfuels\npredictions\n##ente\n##onium\nFilming\nabsorbing\nRamón\nstrangled\nconveyed\ninhabit\nprostitutes\nrecession\nbonded\nclinched\n##eak\n##iji\n##edar\nPleasure\nRite\nChristy\nTherapy\nsarcasm\n##collegiate\nhilt\nprobation\nSarawak\ncoefficients\nunderworld\nbiodiversity\nSBS\ngroom\nbrewing\ndungeon\n##claiming\nHari\nturnover\n##ntina\n##omer\n##opped\northodox\nstyling\n##tars\n##ulata\npriced\nMarjorie\n##eley\n##abar\nYong\n##tically\nCrambidae\nHernandez\n##ego\n##rricular\n##ark\n##lamour\n##llin\n##augh\n##tens\nAdvancement\nLoyola\n##4th\n##hh\ngoin\nmarshes\nSardinia\n##ša\nLjubljana\nSinging\nsuspiciously\n##hesive\nFélix\nRegarding\nflap\nstimulation\n##raught\nApr\nYin\ngaping\ntighten\nskier\n##itas\n##lad\n##rani\n264\nAshes\nOlson\nProblems\nTabitha\n##rading\nbalancing\nsunrise\n##ease\n##iture\n##ritic\nFringe\n##iciency\nInspired\nLinnaeus\nPBA\ndisapproval\n##kles\n##rka\n##tails\n##urger\nDisaster\nLaboratories\napps\nparadise\nAero\nCame\nsneaking\nGee\nBeacon\nODI\ncommodity\nEllington\ngraphical\nGretchen\nspire\n##skaya\n##trine\nRTÉ\nefficacy\nplc\ntribunal\n##ytic\ndownhill\nflu\nmedications\n##kaya\nwiden\nSunrise\n##nous\ndistinguishing\npawn\n##BO\n##irn\n##ssing\n##ν\nEaston\n##vila\nRhineland\n##aque\ndefect\n##saurus\nGoose\nJu\n##classified\nMiddlesbrough\nshaping\npreached\n1759\n##erland\nEin\nHailey\nmusicals\n##altered\nGalileo\nHilda\nFighters\nLac\n##ometric\n295\nLeafs\nMilano\n##lta\n##VD\n##ivist\npenetrated\nMask\nOrchard\nplaintiff\n##icorn\nYvonne\n##fred\noutfielder\npeek\nCollier\nCaracas\nrepealed\nBois\ndell\nrestrict\nDolores\nHadley\npeacefully\n##LL\ncondom\nGranny\nOrders\nsabotage\n##toon\n##rings\ncompass\nmarshal\ngears\nbrigadier\ndye\nYunnan\ncommunicating\ndonate\nemerald\nvitamin\nadminister\nFulham\n##classical\n##llas\nBuckinghamshire\nHeld\nlayered\ndisclosure\nAkira\nprogrammer\nshrimp\nCrusade\n##ximal\nLuzon\nbakery\n##cute\nGarth\nCitadel\nuniquely\nCurling\ninfo\nmum\nPara\n##ști\nsleek\n##ione\nhey\nLantern\nmesh\n##lacing\n##lizzard\n##gade\nprosecuted\nAlba\nGilles\ngreedy\ntwists\n##ogged\nViper\n##kata\nAppearances\nSkyla\nhymns\n##pelled\ncurving\npredictable\nGrave\nWatford\n##dford\n##liptic\n##vary\nWestwood\nfluids\nModels\nstatutes\n##ynamite\n1740\n##culate\nFramework\nJohanna\n##gression\nVuelta\nimp\n##otion\n##raga\n##thouse\nCiudad\nfestivities\n##love\nBeyoncé\nitalics\n##vance\nDB\n##haman\nouts\nSingers\n##ueva\n##urning\n##51\n##ntiary\n##mobile\n285\nMimi\nemeritus\nnesting\nKeeper\nWays\n##onal\n##oux\nEdmond\nMMA\n##bark\n##oop\nHampson\n##ñez\n##rets\nGladstone\nwreckage\nPont\nPlayboy\nreluctance\n##ná\napprenticeship\npreferring\nValue\noriginate\n##wei\n##olio\nAlexia\n##rog\nParachute\njammed\nstud\nEton\nvols\n##ganized\n1745\nstraining\ncreep\nindicators\n##mán\nhumiliation\nhinted\nalma\ntanker\n##egation\nHaynes\nPenang\namazement\nbranched\nrumble\n##ddington\narchaeologists\nparanoid\nexpenditure\nAbsolutely\nMusicians\nbanished\n##fining\nbaptism\nJoker\nPersons\nhemisphere\n##tieth\n##ück\nflock\n##xing\nlbs\nKung\ncrab\n##dak\n##tinent\nRegulations\nbarrage\nparcel\n##ós\nTanaka\n##rsa\nNatalia\nVoyage\nflaws\nstepfather\n##aven\n##eological\nBotanical\nMinsk\n##ckers\nCinderella\nFeast\nLoving\nPrevious\nShark\n##took\nbarrister\ncollaborators\n##nnes\nCroydon\nGraeme\nJuniors\n##7th\n##formation\n##ulos\n##ák\n£2\n##hwa\n##rove\n##ș\nWhig\ndemeanor\nOtago\n##TH\n##ooster\nFaber\ninstructors\n##ahl\n##bha\nemptied\n##schen\nsaga\n##lora\nexploding\n##rges\nCrusaders\n##caster\n##uations\nstreaks\nCBN\nbows\ninsights\nka\n1650\ndiversion\nLSU\nWingspan\n##liva\nResponse\nsanity\nProducers\nimitation\n##fine\nLange\nSpokane\nsplash\nweed\nSiberian\nmagnet\n##rocodile\ncapitals\n##rgus\nswelled\nRani\nBells\nSilesia\narithmetic\nrumor\n##hampton\nfavors\nWeird\nmarketplace\n##orm\ntsunami\nunpredictable\n##citation\n##ferno\nTradition\npostwar\nstench\nsucceeds\n##roup\nAnya\nUsers\noversized\ntotaling\npouch\n##nat\nTripoli\nleverage\nsatin\n##cline\nBathurst\nLund\nNiall\nthereof\n##quid\nBangor\nbarge\nAnimated\n##53\n##alan\nBallard\nutilizes\nDone\nballistic\nNDP\ngatherings\n##elin\n##vening\nRockets\nSabrina\nTamara\nTribal\nWTA\n##citing\nblinded\nflux\nKhalid\nUna\nprescription\n##jee\nParents\n##otics\n##food\nSilicon\ncured\nelectro\nperpendicular\nintimacy\n##rified\nLots\n##ceiving\n##powder\nincentives\nMcKenna\n##arma\n##ounced\n##rinkled\nAlzheimer\n##tarian\n262\nSeas\n##cam\nNovi\n##hout\n##morphic\n##hazar\n##hul\n##nington\nHuron\nBahadur\nPirate\npursed\nGriffiths\nindicted\nswap\nrefrain\n##mulating\nLal\nstomped\n##Pad\n##mamoto\nReef\ndisposed\nplastered\nweeping\n##rato\nMinas\nhourly\ntumors\n##ruising\nLyle\n##yper\n##sol\nOdisha\ncredibility\n##Dowell\nBraun\nGraphic\nlurched\nmuster\n##nex\n##ührer\n##connected\n##iek\n##ruba\nCarthage\nPeck\nmaple\nbursting\n##lava\nEnrico\nrite\n##jak\nMoment\n##skar\nStyx\npoking\nSpartan\n##urney\nHepburn\nMart\nTitanic\nnewsletter\nwaits\nMecklenburg\nagitated\neats\n##dious\nChow\nmatrices\nMaud\n##sexual\nsermon\n234\n##sible\n##lung\nQi\ncemeteries\nmined\nsprinter\n##ckett\ncoward\n##gable\n##hell\n##thin\n##FB\nContact\n##hay\nrainforest\n238\nHemisphere\nboasts\n##nders\n##verance\n##kat\nConvent\nDunedin\nLecturer\nlyricist\n##bject\nIberian\ncomune\n##pphire\nchunk\n##boo\nthrusting\nfore\ninforming\npistols\nechoes\nTier\nbattleships\nsubstitution\n##belt\nmoniker\n##charya\n##lland\nThoroughbred\n38th\n##01\n##tah\nparting\ntongues\nCale\n##seau\nUnionist\nmodular\ncelebrates\npreview\nsteamed\nBismarck\n302\n737\nvamp\n##finity\n##nbridge\nweaknesses\nhusky\n##berman\nabsently\n##icide\nCraven\ntailored\nTokugawa\nVIP\nsyntax\nKazan\ncaptives\ndoses\nfiltered\noverview\nCleopatra\nConversely\nstallion\nBurger\nSuez\nRaoul\nth\n##reaves\nDickson\nNell\nRate\nanal\ncolder\n##sław\nArm\nSemitic\n##green\nreflective\n1100\nepiscopal\njourneys\n##ours\n##pository\n##dering\nresidue\nGunn\n##27\n##ntial\n##crates\n##zig\nAstros\nRenee\nEmerald\n##vili\nconnectivity\nundrafted\nSampson\ntreasures\n##kura\n##theon\n##vern\nDestroyer\n##iable\n##ener\nFrederic\nbriefcase\nconfinement\nBree\n##WD\nAthena\n233\nPadres\nThom\nspeeding\n##hali\nDental\nducks\nPutin\n##rcle\n##lou\nAsylum\n##usk\ndusk\npasture\nInstitutes\nONE\njack\n##named\ndiplomacy\nIntercontinental\nLeagues\nTowns\ncomedic\npremature\n##edic\n##mona\n##ories\ntrimmed\nCharge\nCream\nguarantees\nDmitry\nsplashed\nPhilosophical\ntramway\n##cape\nMaynard\npredatory\nredundant\n##gratory\n##wry\nsobs\nBurgundy\nedible\noutfits\nHandel\ndazed\ndangerously\nidle\nOperational\norganizes\n##sional\nblackish\nbroker\nweddings\n##halt\nBecca\nMcGee\n##gman\nprotagonists\n##pelling\nKeynes\naux\nstumble\n##ordination\nNokia\nreel\nsexes\n##woods\n##pheric\n##quished\n##voc\n##oir\n##pathian\n##ptus\n##sma\n##tating\n##ê\nfulfilling\nsheath\n##ayne\nMei\nOrdinary\nCollin\nSharpe\ngrasses\ninterdisciplinary\n##OX\nBackground\n##ignment\nAssault\ntransforms\nHamas\nSerge\nratios\n##sik\nswaying\n##rcia\nRosen\n##gant\n##versible\ncinematographer\ncurly\npenny\nKamal\nMellon\nSailor\nSpence\nphased\nBrewers\namassed\nSocieties\n##ropriations\n##buted\nmythological\n##SN\n##byss\n##ired\nSovereign\npreface\nParry\n##ife\naltitudes\ncrossings\n##28\nCrewe\nsouthernmost\ntaut\nMcKinley\n##owa\n##tore\n254\n##ckney\ncompiling\nShelton\n##hiko\n228\nPoll\nShepard\nLabs\nPace\nCarlson\ngrasping\n##ов\nDelaney\nWinning\nrobotic\nintentional\nshattering\n##boarding\n##git\n##grade\nEditions\nReserves\nignorant\nproposing\n##hanna\ncutter\nMongols\nNW\n##eux\nCodex\nCristina\nDaughters\nRees\nforecast\n##hita\nNGOs\nStations\nBeaux\nErwin\n##jected\n##EX\n##trom\nSchumacher\n##hrill\n##rophe\nMaharaja\nOricon\n##sul\n##dynamic\n##fighting\nCe\nIngrid\nrumbled\nProspect\nstairwell\nBarnard\napplause\ncomplementary\n##uba\ngrunt\n##mented\nBloc\nCarleton\nloft\nnoisy\n##hey\n490\ncontrasted\n##inator\n##rief\n##centric\n##fica\nCantonese\nBlanc\nLausanne\nLicense\nartifact\n##ddin\nrot\nAmongst\nPrakash\nRF\n##topia\nmilestone\n##vard\nWinters\nMead\nchurchyard\nLulu\nestuary\n##ind\nCha\nInfinity\nMeadow\nsubsidies\n##valent\nCONCACAF\nChing\nmedicinal\nnavigate\nCarver\nTwice\nabdominal\nregulating\nRB\ntoilets\nBrewer\nweakening\nambushed\n##aut\n##vignon\nLansing\nunacceptable\nreliance\nstabbing\n##mpo\n##naire\nInterview\n##ested\n##imed\nbearings\n##lts\nRashid\n##iation\nauthenticity\nvigorous\n##frey\n##uel\nbiologist\nNFC\n##rmaid\n##wash\nMakes\n##aunt\n##steries\nwithdrawing\n##qa\nBuccaneers\nbleed\ninclination\nstain\n##ilo\n##ppel\nTorre\nprivileged\ncereal\ntrailers\nalumnus\nneon\nCochrane\nMariana\ncaress\n##47\n##ients\nexperimentation\nWindow\nconvict\nsignaled\n##YP\nrower\nPharmacy\ninteracting\n241\nStrings\ndominating\nkinase\nDinamo\nWire\npains\nsensations\n##suse\nTwenty20\n##39\nspotlight\n##hend\nelemental\n##pura\nJameson\nSwindon\nhonoring\npained\n##ediatric\n##lux\nPsychological\nassemblies\ningredient\nMartial\nPenguins\nbeverage\nMonitor\nmysteries\n##ION\nemigration\nmused\n##sique\ncrore\nAMC\nFunding\nChinatown\nEstablishment\nFinalist\nenjoyable\n1756\n##mada\n##rams\nNO\nnewborn\nCS\ncomprehend\nInvisible\nSiemens\n##acon\n246\ncontraction\n##volving\n##moration\n##rok\nmontane\n##ntation\nGalloway\n##llow\nVerity\ndirectorial\npearl\nLeaning\n##rase\nFernandez\nswallowing\nAutomatic\nMadness\nhaunting\npaddle\n##UE\n##rrows\n##vies\n##zuki\n##bolt\n##iber\nFender\nemails\npaste\n##lancing\nhind\nhomestead\nhopeless\n##dles\nRockies\ngarlic\nfatty\nshrieked\n##ismic\nGillian\nInquiry\nSchultz\nXML\n##cius\n##uld\nDomesday\ngrenades\nnorthernmost\n##igi\nTbilisi\noptimistic\n##poon\nRefuge\nstacks\nBose\nsmash\nsurreal\nNah\nStraits\nConquest\n##roo\n##weet\n##kell\nGladys\nCH\n##lim\n##vitation\nDoctorate\nNRHP\nknocks\nBey\nRomano\n##pile\n242\nDiamonds\nstrides\neclectic\nBetsy\nclade\n##hady\n##leashed\ndissolve\nmoss\nSuburban\nsilvery\n##bria\ntally\nturtles\n##uctive\nfinely\nindustrialist\n##nary\nErnesto\noz\npact\nloneliness\n##hov\nTomb\nmultinational\nrisked\nLayne\nUSL\nne\n##quiries\nAd\nMessage\nKamen\nKristen\nreefs\nimplements\n##itative\neducators\ngarments\ngunshot\n##essed\n##rve\nMontevideo\nvigorously\nStamford\nassemble\npackaged\n##same\nétat\nViva\nparagraph\n##eter\n##wire\nStick\nNavajo\nMCA\n##pressing\nensembles\nABA\n##zor\n##llus\nPartner\nraked\n##BI\nIona\nthump\nCeleste\nKiran\n##iscovered\n##rith\ninflammation\n##arel\nFeatures\nloosened\n##yclic\nDeluxe\nSpeak\neconomical\nFrankenstein\nPicasso\nshowcased\n##zad\n##eira\n##planes\n##linear\n##overs\nmonsoon\nprosecutors\nslack\nHorses\n##urers\nAngry\ncoughing\n##truder\nQuestions\n##tō\n##zak\nchallenger\nclocks\n##ieving\nNewmarket\n##acle\ncursing\nstimuli\n##mming\n##qualified\nslapping\n##vasive\nnarration\n##kini\nAdvertising\nCSI\nalliances\nmixes\n##yes\ncovert\namalgamation\nreproduced\n##ardt\n##gis\n1648\nid\nAnnette\nBoots\nChampagne\nBrest\nDaryl\n##emon\n##jou\n##llers\nMean\nadaptive\ntechnicians\n##pair\n##usal\nYoga\nfronts\nleaping\nJul\nharvesting\nkeel\n##44\npetitioned\n##lved\nyells\nEndowment\nproponent\n##spur\n##tised\n##zal\nHomes\nIncludes\n##ifer\n##oodoo\n##rvette\nawarding\nmirrored\nransom\nFlute\noutlook\n##ganj\nDVDs\nSufi\nfrontman\nGoddard\nbarren\n##astic\nSuicide\nhillside\nHarlow\nLau\nnotions\nAmnesty\nHomestead\n##irt\nGE\nhooded\numpire\nmustered\nCatch\nMasonic\n##erd\nDynamics\nEquity\nOro\nCharts\nMussolini\npopulace\nmuted\naccompaniment\n##lour\n##ndes\nignited\n##iferous\n##laced\n##atch\nanguish\nregistry\n##tub\n##hards\n##neer\n251\nHooker\nuncomfortably\n##6th\n##ivers\nCatalina\nMiG\ngiggling\n1754\nDietrich\nKaladin\npricing\n##quence\nSabah\n##lving\n##nical\nGettysburg\nVita\nTelecom\nWorst\nPalais\nPentagon\n##brand\n##chichte\nGraf\nunnatural\n1715\nbio\n##26\nRadcliffe\n##utt\nchatting\nspices\n##aus\nuntouched\n##eper\nDoll\nturkey\nSyndicate\n##rlene\n##JP\n##roots\nComo\nclashed\nmodernization\n1757\nfantasies\n##iating\ndissipated\nSicilian\ninspect\nsensible\nreputed\n##final\nMilford\npoised\nRC\nmetabolic\nTobacco\nMecca\noptimization\n##heat\nlobe\nrabbits\nNAS\ngeologist\n##liner\nKilda\ncarpenter\nnationalists\n##brae\nsummarized\n##venge\nDesigner\nmisleading\nbeamed\n##meyer\nMatrix\nexcuses\n##aines\n##biology\n401\nMoose\ndrafting\nSai\n##ggle\nComprehensive\ndripped\nskate\n##WI\n##enan\n##ruk\nnarrower\noutgoing\n##enter\n##nounce\noverseen\n##structure\ntravellers\nbanging\nscarred\n##thing\n##arra\nEbert\nSometime\n##nated\nBAFTA\nHurricanes\nconfigurations\n##MLL\nimmortality\n##heus\ngothic\n##mpest\nclergyman\nviewpoint\nMaxim\nInstituto\nemitted\nquantitative\n1689\nConsortium\n##rsk\nMeat\nTao\nswimmers\nShaking\nTerence\nmainline\n##linity\nQuantum\n##rogate\nNair\nbanquet\n39th\nreprised\nlagoon\nsubdivisions\nsynonymous\nincurred\npassword\nsprung\n##vere\nCredits\nPetersen\nFaces\n##vu\nstatesman\nZombie\ngesturing\n##going\nSergey\ndormant\npossessive\ntotals\nsouthward\nÁngel\n##odies\nHM\nMariano\nRamirez\nWicked\nimpressions\n##Net\n##cap\n##ème\nTransformers\nPoker\nRIAA\nRedesignated\n##chuk\nHarcourt\nPeña\nspacious\ntinged\nalternatively\nnarrowing\nBrigham\nauthorization\nMembership\nZeppelin\n##amed\nHandball\nsteer\n##orium\n##rnal\n##rops\nCommittees\nendings\n##MM\n##yung\nejected\ngrams\n##relli\nBirch\nHilary\nStadion\norphan\nclawed\n##kner\nMotown\nWilkins\nballads\noutspoken\n##ancipation\n##bankment\n##cheng\nAdvances\nharvested\nnovelty\nineligible\noversees\n##´s\nobeyed\ninevitably\nKingdoms\nburying\nFabian\nrelevance\nTatiana\n##MCA\nsarcastic\n##onda\nAkron\n229\nsandwiches\nAdobe\nMaddox\n##azar\nHunting\n##onized\nSmiling\n##tology\nJuventus\nLeroy\nPoets\nattach\nlo\n##rly\n##film\nStructure\n##igate\nolds\nprojections\nSMS\noutnumbered\n##tase\njudiciary\nparamilitary\nplayfully\n##rsing\n##tras\nChico\nVin\ninformally\nabandonment\n##russ\nBaroness\ninjuring\noctagonal\ndeciduous\n##nea\n##olm\nHz\nNorwood\nposes\nMarissa\nalerted\nwilled\n##KS\nDino\n##ddler\n##vani\nBarbie\nThankfully\n625\nbicycles\nshimmering\n##tinuum\n##wolf\nChesterfield\n##idy\n##urgency\nKnowles\nsweetly\nVentures\n##ponents\n##valence\nDarryl\nPowerplant\nRAAF\n##pec\nKingsley\nParramatta\npenetrating\nspectacle\n##inia\nMarlborough\nresidual\ncompatibility\nhike\nUnderwood\ndepleted\nministries\n##odus\n##ropriation\nrotting\nFaso\n##inn\nHappiness\nLille\nSuns\ncookie\nrift\nwarmly\n##lvin\nBugs\nGotham\nGothenburg\nProperties\n##seller\n##ubi\nCreated\nMAC\nNoelle\nRequiem\nUlysses\n##ails\nfranchises\n##icious\n##rwick\ncelestial\nkinetic\n720\nSTS\ntransmissions\namplitude\nforums\nfreeing\nreptiles\ntumbling\n##continent\n##rising\n##tropy\nphysiology\n##uster\nLoves\nbodied\nneutrality\nNeumann\nassessments\nVicky\n##hom\nhampered\n##uku\nCustom\ntimed\n##eville\n##xious\nelastic\n##section\nrig\nstilled\nshipment\n243\nartworks\nboulders\nBournemouth\n##hly\n##LF\n##linary\nrumored\n##bino\n##drum\nChun\nFreiburg\n##dges\nEquality\n252\nGuadalajara\n##sors\n##taire\nRoach\ncramped\n##ultural\nLogistics\nPunch\nfines\nLai\ncaravan\n##55\nlame\nCollector\npausing\n315\nmigrant\nhawk\nsignalling\n##erham\n##oughs\nDemons\nsurfing\nRana\ninsisting\nWien\nadolescent\n##jong\n##rera\n##umba\nRegis\nbrushes\n##iman\nresidues\nstorytelling\nConsider\ncontrasting\nregeneration\n##elling\n##hlete\nafforded\nreactors\ncosting\n##biotics\n##gat\n##евич\nchanting\nsecondly\nconfesses\n##ikos\n##uang\n##ronological\n##−\nGiacomo\n##eca\nvaudeville\nweeds\nrejecting\nrevoked\naffluent\nfullback\nprogresses\ngeologic\nproprietor\nreplication\ngliding\nrecounted\n##bah\n##igma\nFlow\nii\nnewcomer\n##lasp\n##miya\nCandace\nfractured\ninteriors\nconfidential\nInverness\nfooting\n##robe\nCoordinator\nWestphalia\njumper\n##chism\ndormitory\n##gno\n281\nacknowledging\nleveled\n##éra\nAlgiers\nmigrate\nFrog\nRare\n##iovascular\n##urous\nDSO\nnomadic\n##iera\nwoken\nlifeless\n##graphical\n##ifications\nDot\nSachs\ncrow\nnmi\nTacoma\nWeight\nmushroom\nRS\nconditioned\n##zine\nTunisian\naltering\n##mizing\nHandicap\nPatti\nMonsieur\nclicking\ngorge\ninterrupting\n##powerment\ndrawers\nSerra\n##icides\nSpecialist\n##itte\nconnector\nworshipped\n##ask\nconsoles\ntags\n##iler\nglued\n##zac\nfences\nBratislava\nhoneymoon\n313\nA2\ndisposition\nGentleman\nGilmore\nglaciers\n##scribed\nCalhoun\nconvergence\nAleppo\nshortages\n##43\n##orax\n##worm\n##codes\n##rmal\nneutron\n##ossa\nBloomberg\nSalford\nperiodicals\n##ryan\nSlayer\n##ynasties\ncredentials\n##tista\nsurveyor\nFile\nstinging\nunnoticed\nMedici\necstasy\nespionage\nJett\nLeary\ncirculating\nbargaining\nconcerto\nserviced\n37th\nHK\n##fueling\nDelilah\nMarcia\ngraded\n##join\nKaplan\nfeasible\n##nale\n##yt\nBurnley\ndreadful\nministerial\nBrewster\nJudah\n##ngled\n##rrey\nrecycled\nIroquois\nbackstage\nparchment\n##numbered\nKern\nMotorsports\nOrganizations\n##mini\nSeems\nWarrington\nDunbar\nEzio\n##eor\nparalyzed\nAra\nyeast\n##olis\ncheated\nreappeared\nbanged\n##ymph\n##dick\nLyndon\nglide\nMat\n##natch\nHotels\nHousehold\nparasite\nirrelevant\nyouthful\n##smic\n##tero\n##anti\n2d\nIgnacio\nsquash\n##nets\nshale\n##اد\nAbrams\n##oese\nassaults\n##dier\n##otte\nSwamp\n287\nSpurs\n##economic\nFargo\nauditioned\n##mé\nHaas\nune\nabbreviation\nTurkic\n##tisfaction\nfavorites\nspecials\n##lial\nEnlightenment\nBurkina\n##vir\nComparative\nLacrosse\nelves\n##lerical\n##pear\nBorders\ncontrollers\n##villa\nexcelled\n##acher\n##varo\ncamouflage\nperpetual\n##ffles\ndevoid\nschooner\n##bered\n##oris\nGibbons\nLia\ndiscouraged\nsue\n##gnition\nExcellent\nLayton\nnoir\nsmack\n##ivable\n##evity\n##lone\nMyra\nweaken\nweaponry\n##azza\nShake\nbackbone\nCertified\nclown\noccupational\ncaller\nenslaved\nsoaking\nWexford\nperceive\nshortlisted\n##pid\nfeminism\nBari\nIndie\n##avelin\n##ldo\nHellenic\nHundreds\nSavings\ncomedies\nHonors\nMohawk\nTold\ncoded\nIncorporated\nhideous\ntrusts\nhose\nCalais\nForster\nGabon\nInternationale\nAK\nColour\n##UM\n##heist\nMcGregor\nlocalized\n##tronomy\nDarrell\n##iara\nsquirrel\nfreaked\n##eking\n##manned\n##ungen\nradiated\n##dua\ncommence\nDonaldson\n##iddle\nMR\nSAS\nTavern\nTeenage\nadmissions\nInstruments\n##ilizer\nKonrad\ncontemplated\n##ductor\nJing\nReacher\nrecalling\nDhabi\nemphasizing\nillumination\n##tony\nlegitimacy\nGoethe\nRitter\nMcDonnell\nPolar\nSeconds\naspiring\nderby\ntunic\n##rmed\noutlines\nChanging\ndistortion\n##cter\nMechanics\n##urly\n##vana\nEgg\nWolverine\nStupid\ncentralized\nknit\n##Ms\nSaratoga\nOgden\nstorylines\n##vres\nlavish\nbeverages\n##grarian\nKyrgyzstan\nforcefully\nsuperb\nElm\nThessaloniki\nfollower\nPlants\nslang\ntrajectory\nNowadays\nBengals\nIngram\nperch\ncoloring\ncarvings\ndoubtful\n##aph\n##gratulations\n##41\nCurse\n253\nnightstand\nCampo\nMeiji\ndecomposition\n##giri\nMcCormick\nYours\n##amon\n##bang\nTexans\ninjunction\norganise\nperiodical\n##peculative\noceans\n##aley\nSuccess\nLehigh\n##guin\n1730\nDavy\nallowance\nobituary\n##tov\ntreasury\n##wayne\neuros\nreadiness\nsystematically\n##stered\n##igor\n##xen\n##cliff\n##lya\nSend\n##umatic\nCeltics\nJudiciary\n425\npropagation\nrebellious\n##ims\n##lut\nDal\n##ayman\n##cloth\nBoise\npairing\nWaltz\ntorment\nHatch\naspirations\ndiaspora\n##hame\nRank\n237\nIncluding\nMuir\nchained\ntoxicity\nUniversité\n##aroo\nMathews\nmeadows\n##bio\nEditing\nKhorasan\n##them\n##ahn\n##bari\n##umes\nevacuate\n##sium\ngram\nkidnap\npinning\n##diation\n##orms\nbeacon\norganising\nMcGrath\n##ogist\nQur\nTango\n##ceptor\n##rud\n##cend\n##cie\n##jas\n##sided\nTuscany\nVenture\ncreations\nexhibiting\n##rcerer\n##tten\nButcher\nDivinity\nPet\nWhitehead\nfalsely\nperished\nhandy\nMoines\ncyclists\nsynthesizers\nMortal\nnotoriety\n##ronic\nDialogue\nexpressive\nuk\nNightingale\ngrimly\nvineyards\nDriving\nrelentless\ncompiler\n##district\n##tuated\nHades\nmedicines\nobjection\nAnswer\nSoap\nChattanooga\n##gogue\nHaryana\nParties\nTurtle\n##ferred\nexplorers\nstakeholders\n##aar\n##rbonne\ntempered\nconjecture\n##tee\n##hur\nReeve\nbumper\nstew\n##church\n##generate\n##ilitating\n##chanized\n##elier\n##enne\ntranslucent\n##lows\nPublisher\nevangelical\ninherit\n##rted\n247\nSmackDown\nbitterness\nlesions\n##worked\nmosques\nwed\n##lashes\nNg\nRebels\nbooking\n##nail\nIncident\nSailing\nyo\nconfirms\nChaplin\nbaths\n##kled\nmodernist\npulsing\nCicero\nslaughtered\nboasted\n##losure\nzipper\n##hales\naristocracy\nhalftime\njolt\nunlawful\nMarching\nsustaining\nYerevan\nbracket\nram\nMarkus\n##zef\nbutcher\nmassage\n##quisite\nLeisure\nPizza\ncollapsing\n##lante\ncommentaries\nscripted\n##disciplinary\n##sused\neroded\nalleging\nvase\nChichester\nPeacock\ncommencement\ndice\nhotter\npoisonous\nexecutions\n##occo\nfrost\nfielding\nvendor\nCounts\nTroops\nmaize\nDivisional\nanalogue\nshadowy\nNuevo\nVille\nradiating\nworthless\nAdriatic\nBuy\nblaze\nbrutally\nhorizontally\nlonged\n##matical\nfederally\nRolf\nRoot\nexclude\nrag\nagitation\nLounge\nastonished\n##wirl\nImpossible\ntransformations\n##IVE\n##ceded\n##slav\ndownloaded\nfucked\nEgyptians\nWelles\n##ffington\nU2\nbefriended\nradios\n##jid\narchaic\ncompares\n##ccelerator\n##imated\n##tosis\nHung\nScientists\nThousands\ngeographically\n##LR\nMacintosh\nfluorescent\n##ipur\nWehrmacht\n##BR\n##firmary\nChao\n##ague\nBoyer\n##grounds\n##hism\n##mento\n##taining\ninfancy\n##cton\n510\nBoca\n##loy\n1644\nben\ndong\nstresses\nSweat\nexpressway\ngraders\nochreous\nnets\nLawn\nthirst\nUruguayan\nsatisfactory\n##tracts\nbaroque\nrusty\n##ław\nShen\nGdańsk\nchickens\n##graving\nHodge\nPapal\nSAT\nbearer\n##ogo\n##rger\nmerits\nCalendar\nHighest\nSkills\n##ortex\nRoberta\nparadigm\nrecounts\nfrigates\nswamps\nunitary\n##oker\nballoons\nHawthorne\nMuse\nspurred\nadvisors\nreclaimed\nstimulate\nfibre\npat\nrepeal\n##dgson\n##iar\n##rana\nanthropologist\ndescends\nflinch\nreared\n##chang\n##eric\n##lithic\ncommissioning\n##cumenical\n##lume\n##rchen\nWolff\n##tsky\nEurasian\nNepali\nNightmare\nZIP\nplayback\n##latz\n##vington\nWarm\n##75\nMartina\nRollins\nSaetan\nVariations\nsorting\n##م\n530\nJoaquin\nPtolemy\nthinner\n##iator\n##pticism\nCebu\nHighlanders\nLinden\nVanguard\n##SV\n##mor\n##ulge\nISSN\ncartridges\nrepression\nÉtienne\n311\nLauderdale\ncommodities\nnull\n##rb\n1720\ngearbox\n##reator\nAng\nForgotten\ndubious\n##rls\n##dicative\n##phate\nGroove\nHerrera\n##çais\nCollections\nMaximus\n##published\nFell\nQualification\nfiltering\n##tized\nRoe\nhazards\n##37\n##lative\n##tröm\nGuadalupe\nTajikistan\nPreliminary\nfronted\nglands\n##paper\n##iche\n##iding\nCairns\nrallies\nLocation\nseduce\n##mple\nBYU\n##itic\n##FT\nCarmichael\nPrentice\nsongwriters\nforefront\nPhysicians\n##rille\n##zee\nPreparatory\n##cherous\nUV\n##dized\nNavarro\nmisses\n##nney\nInland\nresisting\n##sect\nHurt\n##lino\ngalaxies\n##raze\nInstitutions\ndevote\n##lamp\n##ciating\nbaron\n##bracing\nHess\noperatic\n##CL\n##ος\nChevalier\nGuiana\n##lattered\nFed\n##cuted\n##smo\nSkull\ndenies\n236\nWaller\n##mah\nSakura\nmole\nnominate\nsermons\n##bering\nwidowed\n##röm\nCavendish\n##struction\nNehru\nRevelation\ndoom\nGala\nbaking\nNr\nYourself\nbanning\nIndividuals\nSykes\norchestrated\n630\nPhone\nsteered\n620\nspecialising\nstarvation\n##AV\n##alet\n##upation\nseductive\n##jects\n##zure\nTolkien\nBenito\nWizards\nSubmarine\ndictator\nDuo\nCaden\napprox\nbasins\n##nc\nshrink\n##icles\n##sponsible\n249\nmit\noutpost\n##bayashi\n##rouse\n##tl\nJana\nLombard\nRBIs\nfinalized\nhumanities\n##function\nHonorable\ntomato\n##iot\nPie\ntee\n##pect\nBeaufort\nFerris\nbucks\n##graduate\n##ocytes\nDirectory\nanxiously\n##nating\nflanks\n##Ds\nvirtues\n##believable\nGrades\ncriterion\nmanufactures\nsourced\n##balt\n##dance\n##tano\nYing\n##BF\n##sett\nadequately\nblacksmith\ntotaled\ntrapping\nexpanse\nHistoria\nWorker\nSense\nascending\nhousekeeper\n##oos\nCrafts\nResurrection\n##verty\nencryption\n##aris\n##vat\n##pox\n##runk\n##iability\ngazes\nspying\n##ths\nhelmets\nwired\n##zophrenia\nCheung\nWR\ndownloads\nstereotypes\n239\nLucknow\nbleak\nBragg\nhauling\n##haft\nprohibit\n##ermined\n##castle\nbarony\n##hta\nTyphoon\nantibodies\n##ascism\nHawthorn\nKurdistan\nMinority\nGorge\nHerr\nappliances\ndisrupt\nDrugs\nLazarus\n##ilia\n##ryo\n##tany\nGotta\nMasovian\nRoxy\nchoreographed\n##rissa\nturbulent\n##listed\nAnatomy\nexiting\n##det\n##isław\n580\nKaufman\nsage\n##apa\nSymposium\n##rolls\nKaye\n##ptera\n##rocław\njerking\n##menclature\nGuo\nM1\nresurrected\ntrophies\n##lard\nGathering\nnestled\nserpent\nDow\nreservoirs\nClaremont\narbitration\nchronicle\neki\n##arded\n##zers\n##mmoth\nCongregational\nAstronomical\nNE\nRA\nRobson\nScotch\nmodelled\nslashed\n##imus\nexceeds\n##roper\n##utile\nLaughing\nvascular\nsuperficial\n##arians\nBarclay\nCaucasian\nclassmate\nsibling\nKimberly\nShreveport\n##ilde\n##liche\nCheney\nDeportivo\nVeracruz\nberries\n##lase\nBed\nMI\nAnatolia\nMindanao\nbroadband\n##olia\n##arte\n##wab\ndarts\n##immer\n##uze\nbelievers\nordinance\nviolate\n##wheel\n##ynth\nAlongside\nCoupe\nHobbs\narrondissement\nearl\ntownland\n##dote\n##lihood\n##sla\nGhosts\nmidfield\npulmonary\n##eno\ncues\n##gol\n##zda\n322\nSiena\nSultanate\nBradshaw\nPieter\n##thical\nRaceway\nbared\ncompetence\n##ssent\nBet\n##urer\n##ła\nAlistair\nGöttingen\nappropriately\nforge\n##osterone\n##ugen\nDL\n345\nconvoys\ninventions\n##resses\n##cturnal\nFay\nIntegration\nslash\n##roats\nWidow\nbarking\n##fant\n1A\nHooper\n##cona\n##runched\nunreliable\n##emont\n##esign\n##stabulary\n##stop\nJournalists\nbony\n##iba\n##trata\n##ège\nhorrific\n##bish\nJocelyn\n##rmon\n##apon\n##cier\ntrainers\n##ulatory\n1753\nBR\ncorpus\nsynthesized\n##bidden\n##rafford\nElgin\n##entry\nDoherty\nclockwise\n##played\nspins\n##ample\n##bley\nCope\nconstructions\nseater\nwarlord\nVoyager\ndocumenting\nfairies\n##viator\nLviv\njewellery\nsuites\n##gold\nMaia\nNME\n##eavor\n##kus\nEugène\nfurnishings\n##risto\nMCC\nMetropolis\nOlder\nTelangana\n##mpus\namplifier\nsupervising\n1710\nbuffalo\ncushion\nterminating\n##powering\nsteak\nQuickly\ncontracting\ndem\nsarcastically\nElsa\n##hein\nbastards\nnarratives\nTakes\n304\ncomposure\ntyping\nvariance\n##ifice\nSoftball\n##rations\nMcLaughlin\ngaped\nshrines\n##hogany\nGlamorgan\n##icle\n##nai\n##ntin\nFleetwood\nWoodland\n##uxe\nfictitious\nshrugs\n##iper\nBWV\nconform\n##uckled\nLaunch\n##ductory\n##mized\nTad\n##stituted\n##free\nBel\nChávez\nmessing\nquartz\n##iculate\n##folia\n##lynn\nushered\n##29\n##ailing\ndictated\nPony\n##opsis\nprecinct\n802\nPlastic\n##ughter\n##uno\n##porated\nDenton\nMatters\nSPD\nhating\n##rogen\nEssential\nDeck\nDortmund\nobscured\n##maging\nEarle\n##bred\n##ittle\n##ropolis\nsaturated\n##fiction\n##ression\nPereira\nVinci\nmute\nwarehouses\n##ún\nbiographies\n##icking\nsealing\n##dered\nexecuting\npendant\n##wives\nmurmurs\n##oko\nsubstrates\nsymmetrical\nSusie\n##mare\nYusuf\nanalogy\n##urage\nLesley\nlimitation\n##rby\n##ío\ndisagreements\n##mise\nembroidered\nnape\nunarmed\nSumner\nStores\ndwell\nWilcox\ncreditors\n##rivatization\n##shes\n##amia\ndirects\nrecaptured\nscouting\nMcGuire\ncradle\n##onnell\nSato\ninsulin\nmercenary\ntolerant\nMacquarie\ntransitions\ncradled\n##berto\n##ivism\n##yotes\nFF\nKe\nReach\n##dbury\n680\n##bill\n##oja\n##sui\nprairie\n##ogan\nreactive\n##icient\n##rits\nCyclone\nSirius\nSurvival\nPak\n##coach\n##trar\nhalves\nAgatha\nOpus\ncontrasts\n##jection\nominous\n##iden\nBaylor\nWoodrow\nduct\nfortification\nintercourse\n##rois\nColbert\nenvy\n##isi\nAfterward\ngeared\n##flections\naccelerate\n##lenching\nWitness\n##rrer\nAngelina\nMaterial\nassertion\nmisconduct\nNix\ncringed\ntingling\n##eti\n##gned\nEverest\ndisturb\nsturdy\n##keepers\n##vied\nProfile\nheavenly\n##kova\n##victed\ntranslating\n##sses\n316\nInvitational\nMention\nmartyr\n##uristic\nBarron\nhardness\nNakamura\n405\nGenevieve\nreflections\n##falls\njurist\n##LT\nPyramid\n##yme\nShoot\nheck\nlinguist\n##tower\nIves\nsuperiors\n##leo\nAchilles\n##phological\nChristophe\nPadma\nprecedence\ngrassy\nOral\nresurrection\n##itting\nclumsy\n##lten\n##rue\nhuts\n##stars\nEqual\n##queduct\nDevin\nGaga\ndiocesan\n##plating\n##upe\n##graphers\nPatch\nScream\nhail\nmoaning\ntracts\n##hdi\nExamination\noutsider\n##ergic\n##oter\nArchipelago\nHavilland\ngreenish\ntilting\nAleksandr\nKonstantin\nwarship\n##emann\n##gelist\n##ought\nbillionaire\n##blivion\n321\nHungarians\ntransplant\n##jured\n##fters\nCorbin\nautism\npitchers\nGarner\nthence\nScientology\ntransitioned\nintegrating\nrepetitive\n##dant\nRene\nvomit\n##burne\n1661\nResearchers\nWallis\ninsulted\nwavy\n##wati\nEwing\nexcitedly\n##kor\nfrescoes\ninjustice\n##achal\n##lumber\n##úl\nnovella\n##sca\nLiv\n##enstein\n##river\nmonstrous\ntopping\ndownfall\nlooming\nsinks\ntrillion\n##pont\nEffect\n##phi\n##urley\nSites\ncatchment\n##H1\nHopper\n##raiser\n1642\nMaccabi\nlance\n##chia\n##sboro\nNSA\nbranching\nretorted\ntensor\nImmaculate\ndrumming\nfeeder\n##mony\nDyer\nhomicide\nTemeraire\nfishes\nprotruding\nskins\norchards\n##nso\ninlet\nventral\n##finder\nAsiatic\nSul\n1688\nMelinda\nassigns\nparanormal\ngardening\nTau\ncalming\n##inge\n##crow\nregimental\nNik\nfastened\ncorrelated\n##gene\n##rieve\nSick\n##minster\n##politan\nhardwood\nhurled\n##ssler\nCinematography\nrhyme\nMontenegrin\nPackard\ndebating\n##itution\nHelens\nTrick\nMuseums\ndefiance\nencompassed\n##EE\n##TU\n##nees\n##uben\n##ünster\n##nosis\n435\nHagen\ncinemas\nCorbett\ncommended\n##fines\n##oman\nbosses\nripe\nscraping\n##loc\nfilly\nSaddam\npointless\nFaust\nOrléans\nSyriac\n##♭\nlongitude\n##ropic\nAlfa\nbliss\ngangster\n##ckling\nSL\nblending\n##eptide\n##nner\nbends\nescorting\n##bloid\n##quis\nburials\n##sle\n##è\nAmbulance\ninsults\n##gth\nAntrim\nunfolded\n##missible\nsplendid\nCure\nwarily\nSaigon\nWaste\nastonishment\nboroughs\n##VS\n##dalgo\n##reshing\n##usage\nrue\nmarital\nversatile\nunpaid\nallotted\nbacterium\n##coil\n##cue\nDorothea\nIDF\n##location\n##yke\nRPG\n##tropical\ndevotees\nliter\n##pree\nJohnstone\nastronaut\nattends\npollen\nperiphery\ndoctrines\nmeta\nshowered\n##tyn\nGO\nHuh\nlaude\n244\nAmar\nChristensen\nPing\nPontifical\nAusten\nraiding\nrealities\n##dric\nurges\n##dek\nCambridgeshire\n##otype\nCascade\nGreenberg\nPact\n##cognition\n##aran\n##urion\nRiot\nmimic\nEastwood\n##imating\nreversal\n##blast\n##henian\nPitchfork\n##sunderstanding\nStaten\nWCW\nlieu\n##bard\n##sang\nexperimenting\nAquino\n##lums\nTNT\nHannibal\ncatastrophic\n##lsive\n272\n308\n##otypic\n41st\nHighways\naggregator\n##fluenza\nFeatured\nReece\ndispatch\nsimulated\n##BE\nCommunion\nVinnie\nhardcover\ninexpensive\ntil\n##adores\ngroundwater\nkicker\nblogs\nfrenzy\n##wala\ndealings\nerase\nAnglia\n##umour\nHapoel\nMarquette\n##raphic\n##tives\nconsult\natrocities\nconcussion\n##érard\nDecree\nethanol\n##aen\nRooney\n##chemist\n##hoot\n1620\nmenacing\nSchuster\n##bearable\nlaborers\nsultan\nJuliana\nerased\nonstage\n##ync\nEastman\n##tick\nhushed\n##yrinth\nLexie\nWharton\nLev\n##PL\nTesting\nBangladeshi\n##bba\n##usions\ncommunicated\nintegers\ninternship\nsocietal\n##odles\nLoki\nET\nGhent\nbroadcasters\nUnix\n##auer\nKildare\nYamaha\n##quencing\n##zman\nchilled\n##rapped\n##uant\nDuval\nsentiments\nOliveira\npackets\nHorne\n##rient\nHarlan\nMirage\ninvariant\n##anger\n##tensive\nflexed\nsweetness\n##wson\nalleviate\ninsulting\nlimo\nHahn\n##llars\n##hesia\n##lapping\nbuys\n##oaming\nmocked\npursuits\nscooted\n##conscious\n##ilian\nBallad\njackets\n##kra\nhilly\n##cane\nScenic\nMcGraw\nsilhouette\nwhipping\n##roduced\n##wark\n##chess\n##rump\nLemon\ncalculus\ndemonic\n##latine\nBharatiya\nGovt\nQue\nTrilogy\nDucks\nSuit\nstairway\n##ceipt\nIsa\nregulator\nAutomobile\nflatly\n##buster\n##lank\nSpartans\ntopography\nTavi\nusable\nChartered\nFairchild\n##sance\n##vyn\nDigest\nnuclei\ntyphoon\n##llon\nAlvarez\nDJs\nGrimm\nauthoritative\nfirearm\n##chschule\nOrigins\nlair\nunmistakable\n##xial\n##cribing\nMouth\n##genesis\n##shū\n##gaon\n##ulter\nJaya\nNeck\n##UN\n##oing\n##static\nrelativity\n##mott\n##utive\n##esan\n##uveau\nBT\nsalts\n##roa\nDustin\npreoccupied\nNovgorod\n##asus\nMagnum\ntempting\n##histling\n##ilated\nMusa\n##ghty\nAshland\npubs\nroutines\n##etto\nSoto\n257\nFeaturing\nAugsburg\n##alaya\nBit\nloomed\nexpects\n##abby\n##ooby\nAuschwitz\nPendleton\nvodka\n##sent\nrescuing\nsystemic\n##inet\n##leg\nYun\napplicant\nrevered\n##nacht\n##ndas\nMuller\ncharacterization\n##patient\n##roft\nCarole\n##asperated\nAmiga\ndisconnected\ngel\n##cologist\nPatriotic\nrallied\nassign\nveterinary\ninstalling\n##cedural\n258\nJang\nParisian\nincarcerated\nstalk\n##iment\nJamal\nMcPherson\nPalma\n##oken\n##viation\n512\nRourke\nirrational\n##rippled\nDevlin\nerratic\n##NI\n##payers\nNi\nengages\nPortal\naesthetics\n##rrogance\nMilne\nassassins\n##rots\n335\n385\nCambodian\nFemales\nfellows\nsi\n##block\n##otes\nJayne\nToro\nflutter\n##eera\nBurr\n##lanche\nrelaxation\n##fra\nFitzroy\n##undy\n1751\n261\ncomb\nconglomerate\nribbons\nveto\n##Es\ncasts\n##ege\n1748\nAres\nspears\nspirituality\ncomet\n##nado\n##yeh\nVeterinary\naquarium\nyer\nCouncils\n##oked\n##ynamic\nMalmö\nremorse\nauditions\ndrilled\nHoffmann\nMoe\nNagoya\nYacht\n##hakti\n##race\n##rrick\nTalmud\ncoordinating\n##EI\n##bul\n##his\n##itors\n##ligent\n##uerra\nNarayan\ngoaltender\ntaxa\n##asures\nDet\n##mage\nInfinite\nMaid\nbean\nintriguing\n##cription\ngasps\nsocket\n##mentary\n##reus\nsewing\ntransmitting\n##different\n##furbishment\n##traction\nGrimsby\nsprawling\nShipyard\n##destine\n##hropic\n##icked\ntrolley\n##agi\n##lesh\nJosiah\ninvasions\nContent\nfirefighters\nintro\nLucifer\nsubunit\nSahib\nMyrtle\ninhibitor\nmaneuvers\n##teca\nWrath\nslippery\n##versing\nShoes\n##dial\n##illiers\n##luded\n##mmal\n##pack\nhandkerchief\n##edestal\n##stones\nFusion\ncumulative\n##mell\n##cacia\n##rudge\n##utz\nfoe\nstoring\nswiped\n##meister\n##orra\nbatter\nstrung\n##venting\n##kker\nDoo\nTaste\nimmensely\nFairbanks\nJarrett\nBoogie\n1746\nmage\nKick\nlegislators\nmedial\n##ilon\n##logies\n##ranton\nHybrid\n##uters\nTide\ndeportation\nMetz\n##secration\n##virus\nUFO\n##fell\n##orage\n##raction\n##rrigan\n1747\nfabricated\n##BM\n##GR\n##rter\nmuttering\ntheorist\n##tamine\nBMG\nKincaid\nsolvent\n##azed\nThin\nadorable\nWendell\nta\n##viour\npulses\n##pologies\ncounters\nexposition\nsewer\nLuciano\nClancy\n##angelo\n##riars\nShowtime\nobserves\nfrankly\n##oppy\nBergman\nlobes\ntimetable\n##bri\n##uest\nFX\n##dust\n##genus\nGlad\nHelmut\nMeridian\n##besity\n##ontaine\nRevue\nmiracles\n##titis\nPP\nbluff\nsyrup\n307\nMessiah\n##erne\ninterfering\npicturesque\nunconventional\ndipping\nhurriedly\nKerman\n248\nEthnic\nToward\nacidic\nHarrisburg\n##65\nintimidating\n##aal\nJed\nPontiac\nmunitions\n##nchen\ngrowling\nmausoleum\n##ération\n##wami\nCy\naerospace\ncaucus\nDoing\n##around\n##miring\nCuthbert\n##poradic\n##rovisation\n##wth\nevaluating\n##scraper\nBelinda\nowes\n##sitic\n##thermal\n##fast\neconomists\n##lishing\n##uerre\n##ân\ncredible\n##koto\nFourteen\ncones\n##ebrates\nbookstore\ntowels\n##phony\nAppearance\nnewscasts\n##olin\nKarin\nBingham\n##elves\n1680\n306\ndisks\n##lston\n##secutor\nLevant\n##vout\nMicro\nsnuck\n##ogel\n##racker\nExploration\ndrastic\n##kening\nElsie\nendowment\n##utnant\nBlaze\n##rrosion\nleaking\n45th\n##rug\n##uernsey\n760\nShapiro\ncakes\n##ehan\n##mei\n##ité\n##kla\nrepetition\nsuccessively\nFriendly\nÎle\nKoreans\nAu\nTirana\nflourish\nSpirits\nYao\nreasoned\n##leam\nConsort\ncater\nmarred\nordeal\nsupremacy\n##ritable\nPaisley\neuro\nhealer\nportico\nwetland\n##kman\nrestart\n##habilitation\n##zuka\n##Script\nemptiness\ncommunion\n##CF\n##inhabited\n##wamy\nCasablanca\npulsed\n##rrible\n##safe\n395\nDual\nTerrorism\n##urge\n##found\n##gnolia\nCourage\npatriarch\nsegregated\nintrinsic\n##liography\n##phe\nPD\nconvection\n##icidal\nDharma\nJimmie\ntexted\nconstituents\ntwitch\n##calated\n##mitage\n##ringing\n415\nmilling\n##geons\nArmagh\nGeometridae\nevergreen\nneedy\nreflex\ntemplate\n##pina\nSchubert\n##bruck\n##icted\n##scher\n##wildered\n1749\nJoanne\nclearer\n##narl\n278\nPrint\nautomation\nconsciously\nflashback\noccupations\n##ests\nCasimir\ndifferentiated\npolicing\nrepay\n##aks\n##gnesium\nEvaluation\ncommotion\n##CM\n##smopolitan\nClapton\nmitochondrial\nKobe\n1752\nIgnoring\nVincenzo\nWet\nbandage\n##rassed\n##unate\nMaris\n##eted\n##hetical\nfiguring\n##eit\n##nap\nleopard\nstrategically\n##reer\nFen\nIain\n##ggins\n##pipe\nMatteo\nMcIntyre\n##chord\n##feng\nRomani\nasshole\nflopped\nreassure\nFounding\nStyles\nTorino\npatrolling\n##erging\n##ibrating\n##ructural\nsincerity\n##ät\n##teacher\nJuliette\n##cé\n##hog\n##idated\n##span\nWinfield\n##fender\n##nast\n##pliant\n1690\nBai\nJe\nSaharan\nexpands\nBolshevik\nrotate\n##root\nBritannia\nSevern\n##cini\n##gering\n##say\nsly\nSteps\ninsertion\nrooftop\nPiece\ncuffs\nplausible\n##zai\nProvost\nsemantic\n##data\n##vade\n##cimal\nIPA\nindictment\nLibraries\nflaming\nhighlands\nliberties\n##pio\nElders\naggressively\n##pecific\nDecision\npigeon\nnominally\ndescriptive\nadjustments\nequestrian\nheaving\n##mour\n##dives\n##fty\n##yton\nintermittent\n##naming\n##sets\nCalvert\nCasper\nTarzan\n##kot\nRamírez\n##IB\n##erus\nGustavo\nRoller\nvaulted\n##solation\n##formatics\n##tip\nHunger\ncolloquially\nhandwriting\nhearth\nlauncher\n##idian\n##ilities\n##lind\n##locating\nMagdalena\nSoo\nclubhouse\n##kushima\n##ruit\nBogotá\nOrganic\nWorship\n##Vs\n##wold\nupbringing\n##kick\ngroundbreaking\n##urable\n##ván\nrepulsed\n##dira\n##ditional\n##ici\nmelancholy\n##bodied\n##cchi\n404\nconcurrency\nH₂O\nbouts\n##gami\n288\nLeto\ntroll\n##lak\nadvising\nbundled\n##nden\nlipstick\nlittered\n##leading\n##mogeneous\nExperiment\nNikola\ngrove\n##ogram\nMace\n##jure\ncheat\nAnnabelle\nTori\nlurking\nEmery\nWalden\n##riz\npaints\nMarkets\nbrutality\noverrun\n##agu\n##sat\ndin\nostensibly\nFielding\nflees\n##eron\nPound\nornaments\ntornadoes\n##nikov\n##organisation\n##reen\n##Works\n##ldred\n##olten\n##stillery\nsoluble\nMata\nGrimes\nLéon\n##NF\ncoldly\npermitting\n##inga\n##reaked\nAgents\nhostess\n##dl\nDyke\nKota\navail\norderly\n##saur\n##sities\nArroyo\n##ceps\n##egro\nHawke\nNoctuidae\nhtml\nseminar\n##ggles\n##wasaki\nClube\nrecited\n##sace\nAscension\nFitness\ndough\n##ixel\nNationale\n##solidate\npulpit\nvassal\n570\nAnnapolis\nbladder\nphylogenetic\n##iname\nconvertible\n##ppan\nComet\npaler\n##definite\nSpot\n##dices\nfrequented\nApostles\nslalom\n##ivision\n##mana\n##runcated\nTrojan\n##agger\n##iq\n##league\nConcept\nController\n##barian\n##curate\n##spersed\n##tring\nengulfed\ninquired\n##hmann\n286\n##dict\n##osy\n##raw\nMacKenzie\nsu\n##ienced\n##iggs\n##quitaine\nbisexual\n##noon\nrunways\nsubsp\n##!\n##\"\n###\n##$\n##%\n##&\n##'\n##(\n##)\n##*\n##+\n##,\n##-\n##.\n##/\n##:\n##;\n##<\n##=\n##>\n##?\n##@\n##[\n##\\\n##]\n##^\n##_\n##`\n##{\n##|\n##}\n##~\n##¡\n##¢\n##£\n##¥\n##§\n##¨\n##©\n##ª\n##«\n##¬\n##®\n##±\n##´\n##µ\n##¶\n##·\n##¹\n##º\n##»\n##¼\n##¾\n##¿\n##À\n##Á\n##Â\n##Ä\n##Å\n##Æ\n##Ç\n##È\n##É\n##Í\n##Î\n##Ñ\n##Ó\n##Ö\n##×\n##Ø\n##Ú\n##Ü\n##Þ\n##â\n##ã\n##æ\n##ç\n##î\n##ï\n##ð\n##ñ\n##ô\n##õ\n##÷\n##û\n##þ\n##ÿ\n##Ā\n##ą\n##Ć\n##Č\n##ď\n##Đ\n##đ\n##ē\n##ė\n##ę\n##ě\n##ğ\n##ġ\n##Ħ\n##ħ\n##ĩ\n##Ī\n##İ\n##ļ\n##Ľ\n##ľ\n##Ł\n##ņ\n##ň\n##ŋ\n##Ō\n##ŏ\n##ő\n##Œ\n##œ\n##ř\n##Ś\n##ś\n##Ş\n##Š\n##Ţ\n##ţ\n##ť\n##ũ\n##ŭ\n##ů\n##ű\n##ų\n##ŵ\n##ŷ\n##ź\n##Ż\n##ż\n##Ž\n##ž\n##Ə\n##ƒ\n##ơ\n##ư\n##ǎ\n##ǐ\n##ǒ\n##ǔ\n##ǫ\n##Ș\n##Ț\n##ț\n##ɐ\n##ɑ\n##ɔ\n##ɕ\n##ə\n##ɛ\n##ɡ\n##ɣ\n##ɨ\n##ɪ\n##ɲ\n##ɾ\n##ʀ\n##ʁ\n##ʂ\n##ʃ\n##ʊ\n##ʋ\n##ʌ\n##ʐ\n##ʑ\n##ʒ\n##ʔ\n##ʰ\n##ʲ\n##ʳ\n##ʷ\n##ʻ\n##ʼ\n##ʾ\n##ʿ\n##ˈ\n##ː\n##ˡ\n##ˢ\n##ˣ\n##́\n##̃\n##̍\n##̯\n##͡\n##Α\n##Β\n##Γ\n##Δ\n##Ε\n##Η\n##Θ\n##Ι\n##Κ\n##Λ\n##Μ\n##Ν\n##Ο\n##Π\n##Σ\n##Τ\n##Φ\n##Χ\n##Ψ\n##Ω\n##ά\n##έ\n##ή\n##ί\n##β\n##γ\n##δ\n##ε\n##ζ\n##η\n##θ\n##ι\n##κ\n##λ\n##μ\n##ξ\n##ο\n##π\n##ρ\n##σ\n##τ\n##υ\n##φ\n##χ\n##ψ\n##ω\n##ό\n##ύ\n##ώ\n##І\n##Ј\n##А\n##Б\n##В\n##Г\n##Д\n##Е\n##Ж\n##З\n##И\n##К\n##Л\n##М\n##Н\n##О\n##П\n##Р\n##С\n##Т\n##У\n##Ф\n##Х\n##Ц\n##Ч\n##Ш\n##Э\n##Ю\n##Я\n##б\n##в\n##г\n##д\n##ж\n##з\n##к\n##л\n##м\n##п\n##с\n##т\n##у\n##ф\n##х\n##ц\n##ч\n##ш\n##щ\n##ъ\n##ы\n##ь\n##э\n##ю\n##ё\n##і\n##ї\n##ј\n##њ\n##ћ\n##Ա\n##Հ\n##ա\n##ե\n##ի\n##կ\n##մ\n##յ\n##ն\n##ո\n##ս\n##տ\n##ր\n##ւ\n##ְ\n##ִ\n##ֵ\n##ֶ\n##ַ\n##ָ\n##ֹ\n##ּ\n##א\n##ב\n##ג\n##ד\n##ה\n##ו\n##ז\n##ח\n##ט\n##י\n##כ\n##ל\n##ם\n##מ\n##ן\n##נ\n##ס\n##ע\n##פ\n##צ\n##ק\n##ר\n##ש\n##ת\n##،\n##ء\n##آ\n##أ\n##إ\n##ئ\n##ا\n##ب\n##ت\n##ث\n##ج\n##ح\n##خ\n##ذ\n##ز\n##س\n##ش\n##ص\n##ض\n##ط\n##ظ\n##ع\n##غ\n##ف\n##ق\n##ك\n##ل\n##و\n##ى\n##َ\n##ِ\n##ٹ\n##پ\n##چ\n##ک\n##گ\n##ہ\n##ی\n##ے\n##ं\n##आ\n##क\n##ग\n##च\n##ज\n##ण\n##त\n##द\n##ध\n##न\n##प\n##ब\n##भ\n##म\n##य\n##र\n##ल\n##व\n##श\n##ष\n##स\n##ह\n##ा\n##ि\n##ी\n##ु\n##े\n##ो\n##्\n##।\n##॥\n##আ\n##ই\n##এ\n##ও\n##ক\n##খ\n##গ\n##চ\n##ছ\n##জ\n##ট\n##ত\n##থ\n##দ\n##ধ\n##ন\n##প\n##ব\n##ম\n##য\n##র\n##ল\n##শ\n##স\n##হ\n##়\n##া\n##ি\n##ী\n##ু\n##ে\n##ো\n##্\n##য়\n##க\n##த\n##ப\n##ம\n##ய\n##ர\n##ல\n##வ\n##ா\n##ி\n##ு\n##்\n##ร\n##་\n##ག\n##ང\n##ད\n##ན\n##བ\n##མ\n##ར\n##ལ\n##ས\n##ི\n##ུ\n##ེ\n##ོ\n##ა\n##ე\n##ი\n##ლ\n##ნ\n##ო\n##რ\n##ს\n##ᴬ\n##ᴵ\n##ᵀ\n##ᵃ\n##ᵇ\n##ᵈ\n##ᵉ\n##ᵍ\n##ᵏ\n##ᵐ\n##ᵒ\n##ᵖ\n##ᵗ\n##ᵘ\n##ᵣ\n##ᵤ\n##ᵥ\n##ᶜ\n##ᶠ\n##ḍ\n##Ḥ\n##ḥ\n##Ḩ\n##ḩ\n##ḳ\n##ṃ\n##ṅ\n##ṇ\n##ṛ\n##ṣ\n##ṭ\n##ạ\n##ả\n##ấ\n##ầ\n##ẩ\n##ậ\n##ắ\n##ế\n##ề\n##ể\n##ễ\n##ệ\n##ị\n##ọ\n##ố\n##ồ\n##ổ\n##ộ\n##ớ\n##ờ\n##ợ\n##ụ\n##ủ\n##ứ\n##ừ\n##ử\n##ữ\n##ự\n##ỳ\n##ỹ\n##ἀ\n##ἐ\n##ὁ\n##ὐ\n##ὰ\n##ὶ\n##ὸ\n##ῆ\n##ῖ\n##ῦ\n##ῶ\n##‐\n##‑\n##‒\n##–\n##—\n##―\n##‖\n##‘\n##’\n##‚\n##“\n##”\n##„\n##†\n##‡\n##•\n##…\n##‰\n##′\n##″\n##⁄\n##⁰\n##ⁱ\n##⁴\n##⁵\n##⁶\n##⁷\n##⁸\n##⁹\n##⁻\n##ⁿ\n##₅\n##₆\n##₇\n##₈\n##₉\n##₊\n##₍\n##₎\n##ₐ\n##ₑ\n##ₒ\n##ₓ\n##ₕ\n##ₖ\n##ₘ\n##ₚ\n##ₛ\n##ₜ\n##₤\n##€\n##₱\n##₹\n##ℓ\n##№\n##ℝ\n##⅓\n##←\n##↑\n##→\n##↔\n##⇌\n##⇒\n##∂\n##∈\n##∗\n##∘\n##√\n##∞\n##∧\n##∨\n##∩\n##∪\n##≈\n##≠\n##≡\n##≤\n##≥\n##⊂\n##⊆\n##⊕\n##⋅\n##─\n##│\n##■\n##●\n##★\n##☆\n##☉\n##♠\n##♣\n##♥\n##♦\n##♯\n##⟨\n##⟩\n##ⱼ\n##、\n##。\n##《\n##》\n##「\n##」\n##『\n##』\n##〜\n##い\n##う\n##え\n##お\n##か\n##き\n##く\n##け\n##こ\n##さ\n##し\n##す\n##せ\n##そ\n##た\n##ち\n##つ\n##て\n##と\n##な\n##に\n##の\n##は\n##ひ\n##ま\n##み\n##む\n##め\n##も\n##や\n##ゆ\n##よ\n##ら\n##り\n##る\n##れ\n##ん\n##ア\n##ィ\n##イ\n##ウ\n##エ\n##オ\n##カ\n##ガ\n##キ\n##ク\n##グ\n##コ\n##サ\n##シ\n##ジ\n##ス\n##ズ\n##タ\n##ダ\n##ッ\n##テ\n##デ\n##ト\n##ド\n##ナ\n##ニ\n##ハ\n##バ\n##パ\n##フ\n##ブ\n##プ\n##マ\n##ミ\n##ム\n##ャ\n##ュ\n##ラ\n##リ\n##ル\n##レ\n##ロ\n##ン\n##・\n##ー\n##一\n##三\n##上\n##下\n##中\n##事\n##二\n##井\n##京\n##人\n##亻\n##仁\n##佐\n##侍\n##光\n##公\n##力\n##北\n##十\n##南\n##原\n##口\n##史\n##司\n##吉\n##同\n##和\n##囗\n##国\n##國\n##土\n##城\n##士\n##大\n##天\n##太\n##夫\n##女\n##子\n##宀\n##安\n##宮\n##宿\n##小\n##尚\n##山\n##島\n##川\n##州\n##平\n##年\n##心\n##愛\n##戸\n##文\n##新\n##方\n##日\n##明\n##星\n##書\n##月\n##木\n##本\n##李\n##村\n##東\n##松\n##林\n##正\n##武\n##氏\n##水\n##氵\n##江\n##河\n##海\n##版\n##犬\n##王\n##生\n##田\n##白\n##皇\n##省\n##真\n##石\n##社\n##神\n##竹\n##美\n##義\n##花\n##藤\n##西\n##谷\n##車\n##辶\n##道\n##郎\n##郡\n##部\n##野\n##金\n##長\n##門\n##陽\n##青\n##食\n##馬\n##高\n##龍\n##龸\n##사\n##씨\n##의\n##이\n##한\n##ﬁ\n##ﬂ\n##！\n##（\n##）\n##，\n##－\n##／\n##：\n"
  },
  {
    "path": "biobert_ner/fast_predict2.py",
    "content": "\"\"\"\n    Speeds up estimator.predict by preventing it from reloading the graph\n    on each call to predict.\n    It does this by creating a python generator to keep the predict call open.\n\n    Usage: Just warp your estimator in a FastPredict. i.e.\n    classifier = FastPredict(learn.Estimator(model_fn=model_params.model_fn,\n    model_dir=model_params.model_dir), my_input_fn)\n\n    This version supports tf 1.4 and above and can be used by\n    pre-made Estimators like tf.estimator.DNNClassifier.\n\n    Author: Marc Stogaitis\n \"\"\"\nimport tensorflow as tf\nimport threading\nfrom biobert_ner.utils import Profile\n\n\nclass FastPredict:\n\n    def __init__(self, estimator, input_fn):\n        self.estimator = estimator\n        self.first_run = True\n        self.closed = False\n        self.input_fn = input_fn\n        self.next_features = None\n        self.predictions = None\n        self.lock = threading.Lock()\n\n    def _create_generator(self):\n        while not self.closed:\n            # yield self.next_features\n\n            # BioBERT.recognize()\n            for f in self.next_features:\n                yield f\n\n    @Profile(__name__)\n    def predict(self, feature_batch):\n        \"\"\" Runs a prediction on a set of features. Calling multiple times\n            does *not* regenerate the graph which makes predict much faster.\n\n            feature_batch a list of list of features.\n            IMPORTANT: If you're only classifying 1 thing,\n            you still need to make it a batch of 1 by wrapping it in a list\n            (i.e. predict([my_feature]), not predict(my_feature)\n        \"\"\"\n        with self.lock:\n            self.next_features = feature_batch\n            batch_size = len(feature_batch)\n            if self.first_run:\n                # self.batch_size = len(feature_batch)\n                self.predictions = self.estimator.predict(\n                    input_fn=self.input_fn(self._create_generator))\n                self.first_run = False\n            # elif batch_size != len(feature_batch):\n            #     raise ValueError(\n            #         \"All batches must be of the same size. \"\n            #         \"First-batch:\" + str(batch_size)\n            #         + \" This-batch:\" + str(len(feature_batch)))\n\n            results = list()\n            for _ in range(batch_size):\n                results.append(next(self.predictions))\n        return results\n\n    def close(self):\n        self.closed = True\n        try:\n            next(self.predictions)\n        except Exception as e:\n            print(e, \"Exception in fast_predict. This is probably OK\")\n\n\ndef example_input_fn(generator):\n    \"\"\" An example input function to pass to predict.\n    It must take a generator as input \"\"\"\n\n    def _inner_input_fn():\n        dataset = tf.data.Dataset().from_generator(\n            generator, output_types=tf.float32).batch(1)\n        iterator = dataset.make_one_shot_iterator()\n        features = iterator.get_next()\n        return {'x': features}\n\n    return _inner_input_fn\n"
  },
  {
    "path": "biobert_ner/modeling.py",
    "content": "# coding=utf-8\n# Copyright 2018 The Google AI Language Team Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\"\"\"The main BERT model and related functions.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport collections\nimport copy\nimport json\nimport math\nimport re\nimport six\nimport tensorflow as tf\n\n\nclass BertConfig(object):\n    \"\"\"Configuration for `BertModel`.\"\"\"\n\n    def __init__(self,\n                 vocab_size,\n                 hidden_size=768,\n                 num_hidden_layers=12,\n                 num_attention_heads=12,\n                 intermediate_size=3072,\n                 hidden_act=\"gelu\",\n                 hidden_dropout_prob=0.1,\n                 attention_probs_dropout_prob=0.1,\n                 max_position_embeddings=512,\n                 type_vocab_size=16,\n                 initializer_range=0.02):\n        \"\"\"Constructs BertConfig.\n\n        Args:\n          vocab_size: Vocabulary size of `inputs_ids` in `BertModel`.\n          hidden_size: Size of the encoder layers and the pooler layer.\n          num_hidden_layers: Number of hidden layers in the Transformer encoder.\n          num_attention_heads: Number of attention heads for each attention layer in\n            the Transformer encoder.\n          intermediate_size: The size of the \"intermediate\" (i.e., feed-forward)\n            layer in the Transformer encoder.\n          hidden_act: The non-linear activation function (function or string) in the\n            encoder and pooler.\n          hidden_dropout_prob: The dropout probability for all fully connected\n            layers in the embeddings, encoder, and pooler.\n          attention_probs_dropout_prob: The dropout ratio for the attention\n            probabilities.\n          max_position_embeddings: The maximum sequence length that this model might\n            ever be used with. Typically set this to something large just in case\n            (e.g., 512 or 1024 or 2048).\n          type_vocab_size: The vocabulary size of the `token_type_ids` passed into\n            `BertModel`.\n          initializer_range: The stdev of the truncated_normal_initializer for\n            initializing all weight matrices.\n        \"\"\"\n        self.vocab_size = vocab_size\n        self.hidden_size = hidden_size\n        self.num_hidden_layers = num_hidden_layers\n        self.num_attention_heads = num_attention_heads\n        self.hidden_act = hidden_act\n        self.intermediate_size = intermediate_size\n        self.hidden_dropout_prob = hidden_dropout_prob\n        self.attention_probs_dropout_prob = attention_probs_dropout_prob\n        self.max_position_embeddings = max_position_embeddings\n        self.type_vocab_size = type_vocab_size\n        self.initializer_range = initializer_range\n\n    @classmethod\n    def from_dict(cls, json_object):\n        \"\"\"Constructs a `BertConfig` from a Python dictionary of parameters.\"\"\"\n        config = BertConfig(vocab_size=None)\n        for (key, value) in six.iteritems(json_object):\n            config.__dict__[key] = value\n        return config\n\n    @classmethod\n    def from_json_file(cls, json_file):\n        \"\"\"Constructs a `BertConfig` from a json file of parameters.\"\"\"\n        with tf.gfile.GFile(json_file, \"r\") as reader:\n            text = reader.read()\n        return cls.from_dict(json.loads(text))\n\n    def to_dict(self):\n        \"\"\"Serializes this instance to a Python dictionary.\"\"\"\n        output = copy.deepcopy(self.__dict__)\n        return output\n\n    def to_json_string(self):\n        \"\"\"Serializes this instance to a JSON string.\"\"\"\n        return json.dumps(self.to_dict(), indent=2, sort_keys=True) + \"\\n\"\n\n\nclass BertModel(object):\n    \"\"\"BERT model (\"Bidirectional Encoder Representations from Transformers\").\n\n    Example usage:\n\n    ```python\n    # Already been converted into WordPiece token ids\n    input_ids = tf.constant([[31, 51, 99], [15, 5, 0]])\n    input_mask = tf.constant([[1, 1, 1], [1, 1, 0]])\n    token_type_ids = tf.constant([[0, 0, 1], [0, 2, 0]])\n\n    config = modeling.BertConfig(vocab_size=32000, hidden_size=512,\n      num_hidden_layers=8, num_attention_heads=6, intermediate_size=1024)\n\n    model = modeling.BertModel(config=config, is_training=True,\n      input_ids=input_ids, input_mask=input_mask, token_type_ids=token_type_ids)\n\n    label_embeddings = tf.get_variable(...)\n    pooled_output = model.get_pooled_output()\n    logits = tf.matmul(pooled_output, label_embeddings)\n    ...\n    ```\n    \"\"\"\n\n    def __init__(self,\n                 config,\n                 is_training,\n                 input_ids,\n                 input_mask=None,\n                 token_type_ids=None,\n                 use_one_hot_embeddings=True,\n                 scope=None):\n        \"\"\"Constructor for BertModel.\n\n        Args:\n          config: `BertConfig` instance.\n          is_training: bool. true for training model, false for eval model. Controls\n            whether dropout will be applied.\n          input_ids: int32 Tensor of shape [batch_size, seq_length].\n          input_mask: (optional) int32 Tensor of shape [batch_size, seq_length].\n          token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length].\n          use_one_hot_embeddings: (optional) bool. Whether to use one-hot word\n            embeddings or tf.embedding_lookup() for the word embeddings. On the TPU,\n            it is much faster if this is True, on the CPU or GPU, it is faster if\n            this is False.\n          scope: (optional) variable scope. Defaults to \"bert\".\n\n        Raises:\n          ValueError: The config is invalid or one of the input tensor shapes\n            is invalid.\n        \"\"\"\n        config = copy.deepcopy(config)\n        if not is_training:\n            config.hidden_dropout_prob = 0.0\n            config.attention_probs_dropout_prob = 0.0\n\n        input_shape = get_shape_list(input_ids, expected_rank=2)\n        batch_size = input_shape[0]\n        seq_length = input_shape[1]\n\n        if input_mask is None:\n            input_mask = tf.ones(shape=[batch_size, seq_length], dtype=tf.int32)\n\n        if token_type_ids is None:\n            token_type_ids = tf.zeros(shape=[batch_size, seq_length],\n                                      dtype=tf.int32)\n\n        with tf.variable_scope(scope, default_name=\"bert\"):\n            with tf.variable_scope(\"embeddings\"):\n                # Perform embedding lookup on the word ids.\n                (\n                self.embedding_output, self.embedding_table) = embedding_lookup(\n                    input_ids=input_ids,\n                    vocab_size=config.vocab_size,\n                    embedding_size=config.hidden_size,\n                    initializer_range=config.initializer_range,\n                    word_embedding_name=\"word_embeddings\",\n                    use_one_hot_embeddings=use_one_hot_embeddings)\n\n                # Add positional embeddings and token type embeddings, then layer\n                # normalize and perform dropout.\n                self.embedding_output = embedding_postprocessor(\n                    input_tensor=self.embedding_output,\n                    use_token_type=True,\n                    token_type_ids=token_type_ids,\n                    token_type_vocab_size=config.type_vocab_size,\n                    token_type_embedding_name=\"token_type_embeddings\",\n                    use_position_embeddings=True,\n                    position_embedding_name=\"position_embeddings\",\n                    initializer_range=config.initializer_range,\n                    max_position_embeddings=config.max_position_embeddings,\n                    dropout_prob=config.hidden_dropout_prob)\n\n            with tf.variable_scope(\"encoder\"):\n                # This converts a 2D mask of shape [batch_size, seq_length] to a 3D\n                # mask of shape [batch_size, seq_length, seq_length] which is used\n                # for the attention scores.\n                attention_mask = create_attention_mask_from_input_mask(\n                    input_ids, input_mask)\n\n                # Run the stacked transformer.\n                # `sequence_output` shape = [batch_size, seq_length, hidden_size].\n                self.all_encoder_layers = transformer_model(\n                    input_tensor=self.embedding_output,\n                    attention_mask=attention_mask,\n                    hidden_size=config.hidden_size,\n                    num_hidden_layers=config.num_hidden_layers,\n                    num_attention_heads=config.num_attention_heads,\n                    intermediate_size=config.intermediate_size,\n                    intermediate_act_fn=get_activation(config.hidden_act),\n                    hidden_dropout_prob=config.hidden_dropout_prob,\n                    attention_probs_dropout_prob=config.attention_probs_dropout_prob,\n                    initializer_range=config.initializer_range,\n                    do_return_all_layers=True)\n\n            self.sequence_output = self.all_encoder_layers[-1]\n            # The \"pooler\" converts the encoded sequence tensor of shape\n            # [batch_size, seq_length, hidden_size] to a tensor of shape\n            # [batch_size, hidden_size]. This is necessary for segment-level\n            # (or segment-pair-level) classification tasks where we need a fixed\n            # dimensional representation of the segment.\n            with tf.variable_scope(\"pooler\"):\n                # We \"pool\" the model by simply taking the hidden state corresponding\n                # to the first token. We assume that this has been pre-trained\n                first_token_tensor = tf.squeeze(self.sequence_output[:, 0:1, :],\n                                                axis=1)\n                self.pooled_output = tf.layers.dense(\n                    first_token_tensor,\n                    config.hidden_size,\n                    activation=tf.tanh,\n                    kernel_initializer=create_initializer(\n                        config.initializer_range))\n\n    def get_pooled_output(self):\n        return self.pooled_output\n\n    def get_sequence_output(self):\n        \"\"\"Gets final hidden layer of encoder.\n\n        Returns:\n          float Tensor of shape [batch_size, seq_length, hidden_size] corresponding\n          to the final hidden of the transformer encoder.\n        \"\"\"\n        return self.sequence_output\n\n    def get_all_encoder_layers(self):\n        return self.all_encoder_layers\n\n    def get_embedding_output(self):\n        \"\"\"Gets output of the embedding lookup (i.e., input to the transformer).\n\n        Returns:\n          float Tensor of shape [batch_size, seq_length, hidden_size] corresponding\n          to the output of the embedding layer, after summing the word\n          embeddings with the positional embeddings and the token type embeddings,\n          then performing layer normalization. This is the input to the transformer.\n        \"\"\"\n        return self.embedding_output\n\n    def get_embedding_table(self):\n        return self.embedding_table\n\n\ndef gelu(input_tensor):\n    \"\"\"Gaussian Error Linear Unit.\n\n    This is a smoother version of the RELU.\n    Original paper: https://arxiv.org/abs/1606.08415\n\n    Args:\n      input_tensor: float Tensor to perform activation.\n\n    Returns:\n      `input_tensor` with the GELU activation applied.\n    \"\"\"\n    cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))\n    return input_tensor * cdf\n\n\ndef get_activation(activation_string):\n    \"\"\"Maps a string to a Python function, e.g., \"relu\" => `tf.nn.relu`.\n\n    Args:\n      activation_string: String name of the activation function.\n\n    Returns:\n      A Python function corresponding to the activation function. If\n      `activation_string` is None, empty, or \"linear\", this will return None.\n      If `activation_string` is not a string, it will return `activation_string`.\n\n    Raises:\n      ValueError: The `activation_string` does not correspond to a known\n        activation.\n    \"\"\"\n\n    # We assume that anything that\"s not a string is already an activation\n    # function, so we just return it.\n    if not isinstance(activation_string, six.string_types):\n        return activation_string\n\n    if not activation_string:\n        return None\n\n    act = activation_string.lower()\n    if act == \"linear\":\n        return None\n    elif act == \"relu\":\n        return tf.nn.relu\n    elif act == \"gelu\":\n        return gelu\n    elif act == \"tanh\":\n        return tf.tanh\n    else:\n        raise ValueError(\"Unsupported activation: %s\" % act)\n\n\ndef get_assignment_map_from_checkpoint(tvars, init_checkpoint):\n    \"\"\"Compute the union of the current variables and checkpoint variables.\"\"\"\n    assignment_map = {}\n    initialized_variable_names = {}\n\n    name_to_variable = collections.OrderedDict()\n    for var in tvars:\n        name = var.name\n        m = re.match(\"^(.*):\\\\d+$\", name)\n        if m is not None:\n            name = m.group(1)\n        name_to_variable[name] = var\n\n    init_vars = tf.train.list_variables(init_checkpoint)\n\n    assignment_map = collections.OrderedDict()\n    for x in init_vars:\n        (name, var) = (x[0], x[1])\n        if name not in name_to_variable:\n            continue\n        assignment_map[name] = name\n        initialized_variable_names[name] = 1\n        initialized_variable_names[name + \":0\"] = 1\n\n    return (assignment_map, initialized_variable_names)\n\n\ndef dropout(input_tensor, dropout_prob):\n    \"\"\"Perform dropout.\n\n    Args:\n      input_tensor: float Tensor.\n      dropout_prob: Python float. The probability of dropping out a value (NOT of\n        *keeping* a dimension as in `tf.nn.dropout`).\n\n    Returns:\n      A version of `input_tensor` with dropout applied.\n    \"\"\"\n    if dropout_prob is None or dropout_prob == 0.0:\n        return input_tensor\n\n    output = tf.nn.dropout(input_tensor, 1.0 - dropout_prob)\n    return output\n\n\ndef layer_norm(input_tensor, name=None):\n    \"\"\"Run layer normalization on the last dimension of the tensor.\"\"\"\n    return tf.contrib.layers.layer_norm(\n        inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1,\n        scope=name)\n\n\ndef layer_norm_and_dropout(input_tensor, dropout_prob, name=None):\n    \"\"\"Runs layer normalization followed by dropout.\"\"\"\n    output_tensor = layer_norm(input_tensor, name)\n    output_tensor = dropout(output_tensor, dropout_prob)\n    return output_tensor\n\n\ndef create_initializer(initializer_range=0.02):\n    \"\"\"Creates a `truncated_normal_initializer` with the given range.\"\"\"\n    return tf.truncated_normal_initializer(stddev=initializer_range)\n\n\ndef embedding_lookup(input_ids,\n                     vocab_size,\n                     embedding_size=128,\n                     initializer_range=0.02,\n                     word_embedding_name=\"word_embeddings\",\n                     use_one_hot_embeddings=False):\n    \"\"\"Looks up words embeddings for id tensor.\n\n    Args:\n      input_ids: int32 Tensor of shape [batch_size, seq_length] containing word\n        ids.\n      vocab_size: int. Size of the embedding vocabulary.\n      embedding_size: int. Width of the word embeddings.\n      initializer_range: float. Embedding initialization range.\n      word_embedding_name: string. Name of the embedding table.\n      use_one_hot_embeddings: bool. If True, use one-hot method for word\n        embeddings. If False, use `tf.nn.embedding_lookup()`. One hot is better\n        for TPUs.\n\n    Returns:\n      float Tensor of shape [batch_size, seq_length, embedding_size].\n    \"\"\"\n    # This function assumes that the input is of shape [batch_size, seq_length,\n    # num_inputs].\n    #\n    # If the input is a 2D tensor of shape [batch_size, seq_length], we\n    # reshape to [batch_size, seq_length, 1].\n    if input_ids.shape.ndims == 2:\n        input_ids = tf.expand_dims(input_ids, axis=[-1])\n\n    embedding_table = tf.get_variable(\n        name=word_embedding_name,\n        shape=[vocab_size, embedding_size],\n        initializer=create_initializer(initializer_range))\n\n    if use_one_hot_embeddings:\n        flat_input_ids = tf.reshape(input_ids, [-1])\n        one_hot_input_ids = tf.one_hot(flat_input_ids, depth=vocab_size)\n        output = tf.matmul(one_hot_input_ids, embedding_table)\n    else:\n        output = tf.nn.embedding_lookup(embedding_table, input_ids)\n\n    input_shape = get_shape_list(input_ids)\n\n    output = tf.reshape(output,\n                        input_shape[0:-1] + [input_shape[-1] * embedding_size])\n    return (output, embedding_table)\n\n\ndef embedding_postprocessor(input_tensor,\n                            use_token_type=False,\n                            token_type_ids=None,\n                            token_type_vocab_size=16,\n                            token_type_embedding_name=\"token_type_embeddings\",\n                            use_position_embeddings=True,\n                            position_embedding_name=\"position_embeddings\",\n                            initializer_range=0.02,\n                            max_position_embeddings=512,\n                            dropout_prob=0.1):\n    \"\"\"Performs various post-processing on a word embedding tensor.\n\n    Args:\n      input_tensor: float Tensor of shape [batch_size, seq_length,\n        embedding_size].\n      use_token_type: bool. Whether to add embeddings for `token_type_ids`.\n      token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length].\n        Must be specified if `use_token_type` is True.\n      token_type_vocab_size: int. The vocabulary size of `token_type_ids`.\n      token_type_embedding_name: string. The name of the embedding table variable\n        for token type ids.\n      use_position_embeddings: bool. Whether to add position embeddings for the\n        position of each token in the sequence.\n      position_embedding_name: string. The name of the embedding table variable\n        for positional embeddings.\n      initializer_range: float. Range of the weight initialization.\n      max_position_embeddings: int. Maximum sequence length that might ever be\n        used with this model. This can be longer than the sequence length of\n        input_tensor, but cannot be shorter.\n      dropout_prob: float. Dropout probability applied to the final output tensor.\n\n    Returns:\n      float tensor with same shape as `input_tensor`.\n\n    Raises:\n      ValueError: One of the tensor shapes or input values is invalid.\n    \"\"\"\n    input_shape = get_shape_list(input_tensor, expected_rank=3)\n    batch_size = input_shape[0]\n    seq_length = input_shape[1]\n    width = input_shape[2]\n\n    output = input_tensor\n\n    if use_token_type:\n        if token_type_ids is None:\n            raise ValueError(\"`token_type_ids` must be specified if\"\n                             \"`use_token_type` is True.\")\n        token_type_table = tf.get_variable(\n            name=token_type_embedding_name,\n            shape=[token_type_vocab_size, width],\n            initializer=create_initializer(initializer_range))\n        # This vocab will be small so we always do one-hot here, since it is always\n        # faster for a small vocabulary.\n        flat_token_type_ids = tf.reshape(token_type_ids, [-1])\n        one_hot_ids = tf.one_hot(flat_token_type_ids,\n                                 depth=token_type_vocab_size)\n        token_type_embeddings = tf.matmul(one_hot_ids, token_type_table)\n        token_type_embeddings = tf.reshape(token_type_embeddings,\n                                           [batch_size, seq_length, width])\n        output += token_type_embeddings\n\n    if use_position_embeddings:\n        assert_op = tf.assert_less_equal(seq_length, max_position_embeddings)\n        with tf.control_dependencies([assert_op]):\n            full_position_embeddings = tf.get_variable(\n                name=position_embedding_name,\n                shape=[max_position_embeddings, width],\n                initializer=create_initializer(initializer_range))\n            # Since the position embedding table is a learned variable, we create it\n            # using a (long) sequence length `max_position_embeddings`. The actual\n            # sequence length might be shorter than this, for faster training of\n            # tasks that do not have long sequences.\n            #\n            # So `full_position_embeddings` is effectively an embedding table\n            # for position [0, 1, 2, ..., max_position_embeddings-1], and the current\n            # sequence has positions [0, 1, 2, ... seq_length-1], so we can just\n            # perform a slice.\n            position_embeddings = tf.slice(full_position_embeddings, [0, 0],\n                                           [seq_length, -1])\n            num_dims = len(output.shape.as_list())\n\n            # Only the last two dimensions are relevant (`seq_length` and `width`), so\n            # we broadcast among the first dimensions, which is typically just\n            # the batch size.\n            position_broadcast_shape = []\n            for _ in range(num_dims - 2):\n                position_broadcast_shape.append(1)\n            position_broadcast_shape.extend([seq_length, width])\n            position_embeddings = tf.reshape(position_embeddings,\n                                             position_broadcast_shape)\n            output += position_embeddings\n\n    output = layer_norm_and_dropout(output, dropout_prob)\n    return output\n\n\ndef create_attention_mask_from_input_mask(from_tensor, to_mask):\n    \"\"\"Create 3D attention mask from a 2D tensor mask.\n\n    Args:\n      from_tensor: 2D or 3D Tensor of shape [batch_size, from_seq_length, ...].\n      to_mask: int32 Tensor of shape [batch_size, to_seq_length].\n\n    Returns:\n      float Tensor of shape [batch_size, from_seq_length, to_seq_length].\n    \"\"\"\n    from_shape = get_shape_list(from_tensor, expected_rank=[2, 3])\n    batch_size = from_shape[0]\n    from_seq_length = from_shape[1]\n\n    to_shape = get_shape_list(to_mask, expected_rank=2)\n    to_seq_length = to_shape[1]\n\n    to_mask = tf.cast(\n        tf.reshape(to_mask, [batch_size, 1, to_seq_length]), tf.float32)\n\n    # We don't assume that `from_tensor` is a mask (although it could be). We\n    # don't actually care if we attend *from* padding tokens (only *to* padding)\n    # tokens so we create a tensor of all ones.\n    #\n    # `broadcast_ones` = [batch_size, from_seq_length, 1]\n    broadcast_ones = tf.ones(\n        shape=[batch_size, from_seq_length, 1], dtype=tf.float32)\n\n    # Here we broadcast along two dimensions to create the mask.\n    mask = broadcast_ones * to_mask\n\n    return mask\n\n\ndef attention_layer(from_tensor,\n                    to_tensor,\n                    attention_mask=None,\n                    num_attention_heads=1,\n                    size_per_head=512,\n                    query_act=None,\n                    key_act=None,\n                    value_act=None,\n                    attention_probs_dropout_prob=0.0,\n                    initializer_range=0.02,\n                    do_return_2d_tensor=False,\n                    batch_size=None,\n                    from_seq_length=None,\n                    to_seq_length=None):\n    \"\"\"Performs multi-headed attention from `from_tensor` to `to_tensor`.\n\n    This is an implementation of multi-headed attention based on \"Attention\n    is all you Need\". If `from_tensor` and `to_tensor` are the same, then\n    this is self-attention. Each timestep in `from_tensor` attends to the\n    corresponding sequence in `to_tensor`, and returns a fixed-with vector.\n\n    This function first projects `from_tensor` into a \"query\" tensor and\n    `to_tensor` into \"key\" and \"value\" tensors. These are (effectively) a list\n    of tensors of length `num_attention_heads`, where each tensor is of shape\n    [batch_size, seq_length, size_per_head].\n\n    Then, the query and key tensors are dot-producted and scaled. These are\n    softmaxed to obtain attention probabilities. The value tensors are then\n    interpolated by these probabilities, then concatenated back to a single\n    tensor and returned.\n\n    In practice, the multi-headed attention are done with transposes and\n    reshapes rather than actual separate tensors.\n\n    Args:\n      from_tensor: float Tensor of shape [batch_size, from_seq_length,\n        from_width].\n      to_tensor: float Tensor of shape [batch_size, to_seq_length, to_width].\n      attention_mask: (optional) int32 Tensor of shape [batch_size,\n        from_seq_length, to_seq_length]. The values should be 1 or 0. The\n        attention scores will effectively be set to -infinity for any positions in\n        the mask that are 0, and will be unchanged for positions that are 1.\n      num_attention_heads: int. Number of attention heads.\n      size_per_head: int. Size of each attention head.\n      query_act: (optional) Activation function for the query transform.\n      key_act: (optional) Activation function for the key transform.\n      value_act: (optional) Activation function for the value transform.\n      attention_probs_dropout_prob: (optional) float. Dropout probability of the\n        attention probabilities.\n      initializer_range: float. Range of the weight initializer.\n      do_return_2d_tensor: bool. If True, the output will be of shape [batch_size\n        * from_seq_length, num_attention_heads * size_per_head]. If False, the\n        output will be of shape [batch_size, from_seq_length, num_attention_heads\n        * size_per_head].\n      batch_size: (Optional) int. If the input is 2D, this might be the batch size\n        of the 3D version of the `from_tensor` and `to_tensor`.\n      from_seq_length: (Optional) If the input is 2D, this might be the seq length\n        of the 3D version of the `from_tensor`.\n      to_seq_length: (Optional) If the input is 2D, this might be the seq length\n        of the 3D version of the `to_tensor`.\n\n    Returns:\n      float Tensor of shape [batch_size, from_seq_length,\n        num_attention_heads * size_per_head]. (If `do_return_2d_tensor` is\n        true, this will be of shape [batch_size * from_seq_length,\n        num_attention_heads * size_per_head]).\n\n    Raises:\n      ValueError: Any of the arguments or tensor shapes are invalid.\n    \"\"\"\n\n    def transpose_for_scores(input_tensor, batch_size, num_attention_heads,\n                             seq_length, width):\n        output_tensor = tf.reshape(\n            input_tensor, [batch_size, seq_length, num_attention_heads, width])\n\n        output_tensor = tf.transpose(output_tensor, [0, 2, 1, 3])\n        return output_tensor\n\n    from_shape = get_shape_list(from_tensor, expected_rank=[2, 3])\n    to_shape = get_shape_list(to_tensor, expected_rank=[2, 3])\n\n    if len(from_shape) != len(to_shape):\n        raise ValueError(\n            \"The rank of `from_tensor` must match the rank of `to_tensor`.\")\n\n    if len(from_shape) == 3:\n        batch_size = from_shape[0]\n        from_seq_length = from_shape[1]\n        to_seq_length = to_shape[1]\n    elif len(from_shape) == 2:\n        if (\n                batch_size is None or from_seq_length is None or to_seq_length is None):\n            raise ValueError(\n                \"When passing in rank 2 tensors to attention_layer, the values \"\n                \"for `batch_size`, `from_seq_length`, and `to_seq_length` \"\n                \"must all be specified.\")\n\n    # Scalar dimensions referenced here:\n    #   B = batch size (number of sequences)\n    #   F = `from_tensor` sequence length\n    #   T = `to_tensor` sequence length\n    #   N = `num_attention_heads`\n    #   H = `size_per_head`\n\n    from_tensor_2d = reshape_to_matrix(from_tensor)\n    to_tensor_2d = reshape_to_matrix(to_tensor)\n\n    # `query_layer` = [B*F, N*H]\n    query_layer = tf.layers.dense(\n        from_tensor_2d,\n        num_attention_heads * size_per_head,\n        activation=query_act,\n        name=\"query\",\n        kernel_initializer=create_initializer(initializer_range))\n\n    # `key_layer` = [B*T, N*H]\n    key_layer = tf.layers.dense(\n        to_tensor_2d,\n        num_attention_heads * size_per_head,\n        activation=key_act,\n        name=\"key\",\n        kernel_initializer=create_initializer(initializer_range))\n\n    # `value_layer` = [B*T, N*H]\n    value_layer = tf.layers.dense(\n        to_tensor_2d,\n        num_attention_heads * size_per_head,\n        activation=value_act,\n        name=\"value\",\n        kernel_initializer=create_initializer(initializer_range))\n\n    # `query_layer` = [B, N, F, H]\n    query_layer = transpose_for_scores(query_layer, batch_size,\n                                       num_attention_heads, from_seq_length,\n                                       size_per_head)\n\n    # `key_layer` = [B, N, T, H]\n    key_layer = transpose_for_scores(key_layer, batch_size, num_attention_heads,\n                                     to_seq_length, size_per_head)\n\n    # Take the dot product between \"query\" and \"key\" to get the raw\n    # attention scores.\n    # `attention_scores` = [B, N, F, T]\n    attention_scores = tf.matmul(query_layer, key_layer, transpose_b=True)\n    attention_scores = tf.multiply(attention_scores,\n                                   1.0 / math.sqrt(float(size_per_head)))\n\n    if attention_mask is not None:\n        # `attention_mask` = [B, 1, F, T]\n        attention_mask = tf.expand_dims(attention_mask, axis=[1])\n\n        # Since attention_mask is 1.0 for positions we want to attend and 0.0 for\n        # masked positions, this operation will create a tensor which is 0.0 for\n        # positions we want to attend and -10000.0 for masked positions.\n        adder = (1.0 - tf.cast(attention_mask, tf.float32)) * -10000.0\n\n        # Since we are adding it to the raw scores before the softmax, this is\n        # effectively the same as removing these entirely.\n        attention_scores += adder\n\n    # Normalize the attention scores to probabilities.\n    # `attention_probs` = [B, N, F, T]\n    attention_probs = tf.nn.softmax(attention_scores)\n\n    # This is actually dropping out entire tokens to attend to, which might\n    # seem a bit unusual, but is taken from the original Transformer paper.\n    attention_probs = dropout(attention_probs, attention_probs_dropout_prob)\n\n    # `value_layer` = [B, T, N, H]\n    value_layer = tf.reshape(\n        value_layer,\n        [batch_size, to_seq_length, num_attention_heads, size_per_head])\n\n    # `value_layer` = [B, N, T, H]\n    value_layer = tf.transpose(value_layer, [0, 2, 1, 3])\n\n    # `context_layer` = [B, N, F, H]\n    context_layer = tf.matmul(attention_probs, value_layer)\n\n    # `context_layer` = [B, F, N, H]\n    context_layer = tf.transpose(context_layer, [0, 2, 1, 3])\n\n    if do_return_2d_tensor:\n        # `context_layer` = [B*F, N*H]\n        context_layer = tf.reshape(\n            context_layer,\n            [batch_size * from_seq_length, num_attention_heads * size_per_head])\n    else:\n        # `context_layer` = [B, F, N*H]\n        context_layer = tf.reshape(\n            context_layer,\n            [batch_size, from_seq_length, num_attention_heads * size_per_head])\n\n    return context_layer\n\n\ndef transformer_model(input_tensor,\n                      attention_mask=None,\n                      hidden_size=768,\n                      num_hidden_layers=12,\n                      num_attention_heads=12,\n                      intermediate_size=3072,\n                      intermediate_act_fn=gelu,\n                      hidden_dropout_prob=0.1,\n                      attention_probs_dropout_prob=0.1,\n                      initializer_range=0.02,\n                      do_return_all_layers=False):\n    \"\"\"Multi-headed, multi-layer Transformer from \"Attention is All You Need\".\n\n    This is almost an exact implementation of the original Transformer encoder.\n\n    See the original paper:\n    https://arxiv.org/abs/1706.03762\n\n    Also see:\n    https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/models/transformer.py\n\n    Args:\n      input_tensor: float Tensor of shape [batch_size, seq_length, hidden_size].\n      attention_mask: (optional) int32 Tensor of shape [batch_size, seq_length,\n        seq_length], with 1 for positions that can be attended to and 0 in\n        positions that should not be.\n      hidden_size: int. Hidden size of the Transformer.\n      num_hidden_layers: int. Number of layers (blocks) in the Transformer.\n      num_attention_heads: int. Number of attention heads in the Transformer.\n      intermediate_size: int. The size of the \"intermediate\" (a.k.a., feed\n        forward) layer.\n      intermediate_act_fn: function. The non-linear activation function to apply\n        to the output of the intermediate/feed-forward layer.\n      hidden_dropout_prob: float. Dropout probability for the hidden layers.\n      attention_probs_dropout_prob: float. Dropout probability of the attention\n        probabilities.\n      initializer_range: float. Range of the initializer (stddev of truncated\n        normal).\n      do_return_all_layers: Whether to also return all layers or just the final\n        layer.\n\n    Returns:\n      float Tensor of shape [batch_size, seq_length, hidden_size], the final\n      hidden layer of the Transformer.\n\n    Raises:\n      ValueError: A Tensor shape or parameter is invalid.\n    \"\"\"\n    if hidden_size % num_attention_heads != 0:\n        raise ValueError(\n            \"The hidden size (%d) is not a multiple of the number of attention \"\n            \"heads (%d)\" % (hidden_size, num_attention_heads))\n\n    attention_head_size = int(hidden_size / num_attention_heads)\n    input_shape = get_shape_list(input_tensor, expected_rank=3)\n    batch_size = input_shape[0]\n    seq_length = input_shape[1]\n    input_width = input_shape[2]\n\n    # The Transformer performs sum residuals on all layers so the input needs\n    # to be the same as the hidden size.\n    if input_width != hidden_size:\n        raise ValueError(\n            \"The width of the input tensor (%d) != hidden size (%d)\" %\n            (input_width, hidden_size))\n\n    # We keep the representation as a 2D tensor to avoid re-shaping it back and\n    # forth from a 3D tensor to a 2D tensor. Re-shapes are normally free on\n    # the GPU/CPU but may not be free on the TPU, so we want to minimize them to\n    # help the optimizer.\n    prev_output = reshape_to_matrix(input_tensor)\n\n    all_layer_outputs = []\n    for layer_idx in range(num_hidden_layers):\n        with tf.variable_scope(\"layer_%d\" % layer_idx):\n            layer_input = prev_output\n\n            with tf.variable_scope(\"attention\"):\n                attention_heads = []\n                with tf.variable_scope(\"self\"):\n                    attention_head = attention_layer(\n                        from_tensor=layer_input,\n                        to_tensor=layer_input,\n                        attention_mask=attention_mask,\n                        num_attention_heads=num_attention_heads,\n                        size_per_head=attention_head_size,\n                        attention_probs_dropout_prob=attention_probs_dropout_prob,\n                        initializer_range=initializer_range,\n                        do_return_2d_tensor=True,\n                        batch_size=batch_size,\n                        from_seq_length=seq_length,\n                        to_seq_length=seq_length)\n                    attention_heads.append(attention_head)\n\n                attention_output = None\n                if len(attention_heads) == 1:\n                    attention_output = attention_heads[0]\n                else:\n                    # In the case where we have other sequences, we just concatenate\n                    # them to the self-attention head before the projection.\n                    attention_output = tf.concat(attention_heads, axis=-1)\n\n                # Run a linear projection of `hidden_size` then add a residual\n                # with `layer_input`.\n                with tf.variable_scope(\"output\"):\n                    attention_output = tf.layers.dense(\n                        attention_output,\n                        hidden_size,\n                        kernel_initializer=create_initializer(\n                            initializer_range))\n                    attention_output = dropout(attention_output,\n                                               hidden_dropout_prob)\n                    attention_output = layer_norm(\n                        attention_output + layer_input)\n\n            # The activation is only applied to the \"intermediate\" hidden layer.\n            with tf.variable_scope(\"intermediate\"):\n                intermediate_output = tf.layers.dense(\n                    attention_output,\n                    intermediate_size,\n                    activation=intermediate_act_fn,\n                    kernel_initializer=create_initializer(initializer_range))\n\n            # Down-project back to `hidden_size` then add the residual.\n            with tf.variable_scope(\"output\"):\n                layer_output = tf.layers.dense(\n                    intermediate_output,\n                    hidden_size,\n                    kernel_initializer=create_initializer(initializer_range))\n                layer_output = dropout(layer_output, hidden_dropout_prob)\n                layer_output = layer_norm(layer_output + attention_output)\n                prev_output = layer_output\n                all_layer_outputs.append(layer_output)\n\n    if do_return_all_layers:\n        final_outputs = []\n        for layer_output in all_layer_outputs:\n            final_output = reshape_from_matrix(layer_output, input_shape)\n            final_outputs.append(final_output)\n        return final_outputs\n    else:\n        final_output = reshape_from_matrix(prev_output, input_shape)\n        return final_output\n\n\ndef get_shape_list(tensor, expected_rank=None, name=None):\n    \"\"\"Returns a list of the shape of tensor, preferring static dimensions.\n\n    Args:\n      tensor: A tf.Tensor object to find the shape of.\n      expected_rank: (optional) int. The expected rank of `tensor`. If this is\n        specified and the `tensor` has a different rank, and exception will be\n        thrown.\n      name: Optional name of the tensor for the error message.\n\n    Returns:\n      A list of dimensions of the shape of tensor. All static dimensions will\n      be returned as python integers, and dynamic dimensions will be returned\n      as tf.Tensor scalars.\n    \"\"\"\n    if name is None:\n        name = tensor.name\n\n    if expected_rank is not None:\n        assert_rank(tensor, expected_rank, name)\n\n    shape = tensor.shape.as_list()\n\n    non_static_indexes = []\n    for (index, dim) in enumerate(shape):\n        if dim is None:\n            non_static_indexes.append(index)\n\n    if not non_static_indexes:\n        return shape\n\n    dyn_shape = tf.shape(tensor)\n    for index in non_static_indexes:\n        shape[index] = dyn_shape[index]\n    return shape\n\n\ndef reshape_to_matrix(input_tensor):\n    \"\"\"Reshapes a >= rank 2 tensor to a rank 2 tensor (i.e., a matrix).\"\"\"\n    ndims = input_tensor.shape.ndims\n    if ndims < 2:\n        raise ValueError(\"Input tensor must have at least rank 2. Shape = %s\" %\n                         (input_tensor.shape))\n    if ndims == 2:\n        return input_tensor\n\n    width = input_tensor.shape[-1]\n    output_tensor = tf.reshape(input_tensor, [-1, width])\n    return output_tensor\n\n\ndef reshape_from_matrix(output_tensor, orig_shape_list):\n    \"\"\"Reshapes a rank 2 tensor back to its original rank >= 2 tensor.\"\"\"\n    if len(orig_shape_list) == 2:\n        return output_tensor\n\n    output_shape = get_shape_list(output_tensor)\n\n    orig_dims = orig_shape_list[0:-1]\n    width = output_shape[-1]\n\n    return tf.reshape(output_tensor, orig_dims + [width])\n\n\ndef assert_rank(tensor, expected_rank, name=None):\n    \"\"\"Raises an exception if the tensor rank is not of the expected rank.\n\n    Args:\n      tensor: A tf.Tensor to check the rank of.\n      expected_rank: Python integer or list of integers, expected rank.\n      name: Optional name of the tensor for the error message.\n\n    Raises:\n      ValueError: If the expected shape doesn't match the actual shape.\n    \"\"\"\n    if name is None:\n        name = tensor.name\n\n    expected_rank_dict = {}\n    if isinstance(expected_rank, six.integer_types):\n        expected_rank_dict[expected_rank] = True\n    else:\n        for x in expected_rank:\n            expected_rank_dict[x] = True\n\n    actual_rank = tensor.shape.ndims\n    if actual_rank not in expected_rank_dict:\n        scope_name = tf.get_variable_scope().name\n        raise ValueError(\n            \"For the tensor `%s` in scope `%s`, the actual rank \"\n            \"`%d` (shape = %s) is not equal to the expected rank `%s`\" %\n            (name, scope_name, actual_rank, str(tensor.shape),\n             str(expected_rank)))\n"
  },
  {
    "path": "biobert_ner/ops.py",
    "content": "import numpy as np\nimport re\n\n\ntokenize_regex = re.compile(r'([0-9a-zA-Z]+|[^0-9a-zA-Z])')\n\n\ndef json_to_sent(data, is_raw_text=False):\n    '''data: list of json file [{pmid,abstract,title}, ...] '''\n    out = dict()\n    for paper in data:\n        sentences = list()\n        if is_raw_text:\n            # assure that paper['abstract'] is not empty\n            abst = sentence_split(paper['abstract'])\n            if len(abst) != 1 or len(abst[0].strip()) > 0:\n                sentences.extend(abst)\n        else:\n            # assure that paper['title'] is not empty\n            if len(CoNLL_tokenizer(paper['title'])) < 50:\n                title = [paper['title']]\n            else:\n                title = sentence_split(paper['title'])\n            if len(title) != 1 or len(title[0].strip()) > 0:\n                sentences.extend(title)\n\n            if len(paper['abstract']) > 0:\n                abst = sentence_split(' ' + paper['abstract'])\n                if len(abst) != 1 or len(abst[0].strip()) > 0:\n                    sentences.extend(abst)\n\n        out[paper['pmid']] = dict()\n        out[paper['pmid']]['sentence'] = sentences\n    return out\n\n\ndef input_form(sent_data):\n    '''sent_data: dict of sentence, key=pmid {pmid:[sent,sent, ...], pmid: ...}'''\n    for pmid in sent_data:\n        sent_data[pmid]['words'] = list()\n        sent_data[pmid]['wordPos'] = list()\n        doc_piv = 0\n        for sent in sent_data[pmid]['sentence']:\n            wids = list()\n            wpos = list()\n            sent_piv = 0\n            tok = CoNLL_tokenizer(sent)\n\n            for w in tok:\n                if len(w) > 20:\n                    wids.append(w[:10])\n                else:\n                    wids.append(w)\n\n                start = doc_piv + sent_piv + sent[sent_piv:].find(w)\n                end = start + len(w) - 1\n                sent_piv = end - doc_piv + 1\n                wpos.append((start, end))\n            doc_piv += len(sent)\n            sent_data[pmid]['words'].append(wids)\n            sent_data[pmid]['wordPos'].append(wpos)\n\n    return sent_data\n\n\ndef isInt(string):\n    try:\n        int(string)\n        return True\n    except ValueError:\n        return False\n\n\ndef isFloat(string):\n    try:\n        float(string)\n        return True\n    except ValueError:\n        return False\n\n\ndef softmax(logits):\n    out = list()\n    for logit in logits:\n        temp = np.subtract(logit, np.max(logit))\n        p = np.exp(temp) / np.sum(np.exp(temp))\n        out.append(np.max(p))\n    return out\n\n\ndef CoNLL_tokenizer(text):\n    rawTok = [t for t in tokenize_regex.split(text) if t]\n    assert ''.join(rawTok) == text\n    tok = [t for t in rawTok if t != ' ']\n    return tok\n\n\ndef sentence_split(text):\n    sentences = list()\n    sent = ''\n    piv = 0\n    for idx, char in enumerate(text):\n        if char in \"?!\":\n            if idx > len(text) - 3:\n                sent = text[piv:]\n                piv = -1\n            else:\n                sent = text[piv:idx + 1]\n                piv = idx + 1\n\n        elif char == '.':\n            if idx > len(text) - 3:\n                sent = text[piv:]\n                piv = -1\n            elif (text[idx + 1] == ' ') and (\n                    text[idx + 2] in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-\"' + \"'\"):\n                sent = text[piv:idx + 1]\n                piv = idx + 1\n\n        if sent != '':\n            toks = CoNLL_tokenizer(sent)\n            if len(toks) > 100:\n                while True:\n                    rawTok = [t for t in tokenize_regex.split(sent) if t]\n                    cut = ''.join(rawTok[:200])\n                    sent = ''.join(rawTok[200:])\n                    sentences.append(cut)\n\n                    if len(CoNLL_tokenizer(sent)) < 100:\n                        if sent.strip() == '':\n                            sent = ''\n                            break\n                        else:\n                            sentences.append(sent)\n                            sent = ''\n                            break\n            else:\n                sentences.append(sent)\n                sent = ''\n\n            if piv == -1:\n                break\n\n    if piv != -1:\n        sent = text[piv:]\n        toks = CoNLL_tokenizer(sent)\n        if len(toks) > 100:\n            while True:\n                rawTok = [t for t in tokenize_regex.split(sent) if t]\n                cut = ''.join(rawTok[:200])\n                sent = ''.join(rawTok[200:])\n                sentences.append(cut)\n\n                if len(CoNLL_tokenizer(sent)) < 100:\n                    if sent.strip() == '':\n                        sent = ''\n                        break\n                    else:\n                        sentences.append(sent)\n                        sent = ''\n                        break\n        else:\n            sentences.append(sent)\n            sent = ''\n\n    return sentences\n\n\ndef merge_results(data, sent_data, predicDict, logitsDict, rep_ent,\n                  is_raw_text=False):\n    # b 2   i 3   e 4   s 1   o 0\n    for idx, paper in enumerate(data):\n        pmid = paper['pmid']\n        if is_raw_text:\n            content = paper['abstract']\n        else:\n            if len(paper['abstract']) > 0:\n                content = paper['title'] + ' ' + paper['abstract']\n            else:\n                content = paper['title']\n\n        paper['entities']['drug'] = []\n        paper['entities']['gene'] = []\n        paper['entities']['disease'] = []\n        paper['entities']['species'] = []\n        paper['logits'] = dict()\n\n        for dtype in ['disease', 'gene', 'drug', 'species']:\n            for sentidx, tags in enumerate(predicDict[dtype][pmid]):\n                B_flag = False\n                for widx, tag in enumerate(tags):\n                    if tag == 'O':\n                        if B_flag:\n                            tmpSE[\"end\"] = \\\n                            sent_data[pmid]['wordPos'][sentidx][widx - 1][1]\n                            paper['entities'][dtype].append(tmpSE)\n                        B_flag = False\n                        continue\n                    elif tag == 'B':\n                        if B_flag:\n                            tmpSE[\"end\"] = \\\n                            sent_data[pmid]['wordPos'][sentidx][widx - 1][1]\n                            paper['entities'][dtype].append(tmpSE)\n                        tmpSE = {\n                            \"start\": sent_data[pmid]['wordPos'][sentidx][widx][\n                                0]}\n                        B_flag = True\n                    elif tag == \"I\":\n                        continue\n                if B_flag:\n                    tmpSE[\"end\"] = sent_data[pmid]['wordPos'][sentidx][-1][1]\n                    paper['entities'][dtype].append(tmpSE)\n\n            logs = list()\n            for t_sent in logitsDict[dtype][pmid]:\n                logs.extend(t_sent)\n            paper['logits'][dtype] = list()\n            for pos in paper['entities'][dtype]:\n                if pos['start'] == pos['end']:\n                    soft = softmax(logs[len(\n                        CoNLL_tokenizer(content[:pos['start']])):len(\n                        CoNLL_tokenizer(content[:pos['end']])) + 1])\n                    paper['logits'][dtype].append(\n                        (pos, float(np.average(soft))))\n                else:\n                    soft = softmax(logs[len(\n                        CoNLL_tokenizer(content[:pos['start']])):len(\n                        CoNLL_tokenizer(content[:pos['end']]))])\n                    paper['logits'][dtype].append(\n                        (pos, float(np.average(soft))))\n\n    if rep_ent:\n        return data\n    else:\n        for idx, paper in enumerate(data):\n            pmid = paper['pmid']\n            if is_raw_text:\n                content = paper['abstract']\n            else:\n                if len(paper['abstract']) > 0:\n                    content = paper['title'] + ' ' + paper['abstract']\n                else:\n                    content = paper['title']\n\n            dlog = list()\n            glog = list()\n            clog = list()\n            slog = list()\n\n            for t_sent in logitsDict['disease'][pmid]:\n                dlog.extend(t_sent)\n            for t_sent in logitsDict['gene'][pmid]:\n                glog.extend(t_sent)\n            for t_sent in logitsDict['drug'][pmid]:\n                clog.extend(t_sent)\n            for t_sent in logitsDict['species'][pmid]:\n                slog.extend(t_sent)\n\n            # d_ent = paper['entities']['disease'][:]\n            # g_ent = paper['entities']['gene'][:]\n            # c_ent = paper['entities']['drug'][:]\n            # s_ent = paper['entities']['species'][:]\n\n            d_ent = paper['entities']['disease'][:]\n            g_ent = paper['entities']['gene'][:]\n            s_ent = paper['entities']['species'][:]\n            for d_e in d_ent:\n\n                removed_d_e = False\n\n                for g_e in g_ent:\n                    if d_e['end'] == g_e['end'] and d_e['start'] == g_e[\n                        'start']:\n                        if d_e['end'] == d_e['start']:\n                            d_soft = softmax(\n                                dlog[len(CoNLL_tokenizer(\n                                    content[:d_e['start']])):len(\n                                    CoNLL_tokenizer(content[:d_e['end']])) + 1])\n                            g_soft = softmax(\n                                glog[len(CoNLL_tokenizer(\n                                    content[:g_e['start']])):len(\n                                    CoNLL_tokenizer(content[:g_e['end']])) + 1])\n                        else:\n                            d_soft = softmax(\n                                dlog[len(CoNLL_tokenizer(\n                                    content[:d_e['start']])):len(\n                                    CoNLL_tokenizer(content[:d_e['end']]))])\n                            g_soft = softmax(\n                                glog[len(CoNLL_tokenizer(\n                                    content[:g_e['start']])):len(\n                                    CoNLL_tokenizer(content[:g_e['end']]))])\n                        if np.average(d_soft) < np.average(g_soft):\n                            paper['entities']['disease'].remove(d_e)\n                            removed_d_e = True\n                            break\n                        elif np.average(d_soft) > np.average(g_soft):\n                            paper['entities']['gene'].remove(g_e)\n                            break\n\n                    elif d_e['end'] < g_e['start']:\n                        break\n\n                for s_e in s_ent:\n                    if d_e['end'] == s_e['end'] and d_e['start'] == s_e[\n                        'start']:\n                        if d_e['end'] == d_e['start']:\n                            d_soft = softmax(\n                                dlog[len(CoNLL_tokenizer(\n                                    content[:d_e['start']])):len(\n                                    CoNLL_tokenizer(content[:d_e['end']])) + 1])\n                            s_soft = softmax(\n                                slog[len(CoNLL_tokenizer(\n                                    content[:s_e['start']])):len(\n                                    CoNLL_tokenizer(content[:s_e['end']])) + 1])\n                        else:\n                            d_soft = softmax(\n                                dlog[len(CoNLL_tokenizer(\n                                    content[:d_e['start']])):len(\n                                    CoNLL_tokenizer(content[:d_e['end']]))])\n                            s_soft = softmax(\n                                slog[len(CoNLL_tokenizer(\n                                    content[:s_e['start']])):len(\n                                    CoNLL_tokenizer(content[:s_e['end']]))])\n                        if np.average(d_soft) < np.average(s_soft):\n                            if not removed_d_e:\n                                paper['entities']['disease'].remove(d_e)\n                            break\n                        elif np.average(d_soft) > np.average(s_soft):\n                            paper['entities']['species'].remove(s_e)\n                            break\n\n                    elif d_e['end'] < s_e['start']:\n                        break\n\n            g_ent = paper['entities']['gene'][:]\n            c_ent = paper['entities']['drug'][:]\n            s_ent = paper['entities']['species'][:]\n            for g_e in g_ent:\n\n                removed_g_e = False\n\n                for c_e in c_ent:\n                    if c_e['end'] == g_e['end'] and c_e['start'] == g_e[\n                        'start']:\n                        if c_e['end'] == c_e['start']:\n                            c_soft = softmax(\n                                clog[len(CoNLL_tokenizer(\n                                    content[:c_e['start']])):len(\n                                    CoNLL_tokenizer(content[:c_e['end']])) + 1])\n                            g_soft = softmax(\n                                glog[len(CoNLL_tokenizer(\n                                    content[:g_e['start']])):len(\n                                    CoNLL_tokenizer(content[:g_e['end']])) + 1])\n                        else:\n                            c_soft = softmax(\n                                clog[len(CoNLL_tokenizer(\n                                    content[:c_e['start']])):len(\n                                    CoNLL_tokenizer(content[:c_e['end']]))])\n                            g_soft = softmax(\n                                glog[len(CoNLL_tokenizer(\n                                    content[:g_e['start']])):len(\n                                    CoNLL_tokenizer(content[:g_e['end']]))])\n                        if np.average(c_soft) < np.average(g_soft):\n                            paper['entities']['drug'].remove(c_e)\n                            break\n                        elif np.average(c_soft) > np.average(g_soft):\n                            paper['entities']['gene'].remove(g_e)\n                            removed_g_e = True\n                            break\n\n                    elif g_e['end'] < c_e['start']:\n                        break\n\n                for s_e in s_ent:\n                    if g_e['end'] == s_e['end'] and g_e['start'] == s_e[\n                        'start']:\n                        if g_e['end'] == g_e['start']:\n                            g_soft = softmax(\n                                glog[len(CoNLL_tokenizer(\n                                    content[:g_e['start']])):len(\n                                    CoNLL_tokenizer(content[:g_e['end']])) + 1])\n                            s_soft = softmax(\n                                slog[len(CoNLL_tokenizer(\n                                    content[:s_e['start']])):len(\n                                    CoNLL_tokenizer(content[:s_e['end']])) + 1])\n                        else:\n                            g_soft = softmax(\n                                glog[len(CoNLL_tokenizer(\n                                    content[:g_e['start']])):len(\n                                    CoNLL_tokenizer(content[:g_e['end']]))])\n                            s_soft = softmax(\n                                slog[len(CoNLL_tokenizer(\n                                    content[:s_e['start']])):len(\n                                    CoNLL_tokenizer(content[:s_e['end']]))])\n                        if np.average(g_soft) < np.average(s_soft):\n                            if not removed_g_e:\n                                paper['entities']['gene'].remove(g_e)\n                            break\n                        elif np.average(g_soft) > np.average(s_soft):\n                            paper['entities']['species'].remove(s_e)\n                            break\n\n                    elif g_e['end'] < s_e['start']:\n                        break\n\n            c_ent = paper['entities']['drug'][:]\n            d_ent = paper['entities']['disease'][:]\n            s_ent = paper['entities']['species'][:]\n            for c_e in c_ent:\n\n                removed_c_e = False\n\n                for d_e in d_ent:\n                    if c_e['end'] == d_e['end'] and c_e['start'] == d_e[\n                        'start']:\n                        if d_e['end'] == d_e['start']:\n                            d_soft = softmax(\n                                dlog[len(CoNLL_tokenizer(\n                                    content[:d_e['start']])):len(\n                                    CoNLL_tokenizer(content[:d_e['end']])) + 1])\n                            c_soft = softmax(\n                                clog[len(CoNLL_tokenizer(\n                                    content[:c_e['start']])):len(\n                                    CoNLL_tokenizer(content[:c_e['end']])) + 1])\n                        else:\n                            c_soft = softmax(\n                                clog[len(CoNLL_tokenizer(\n                                    content[:c_e['start']])):len(\n                                    CoNLL_tokenizer(content[:c_e['end']]))])\n                            d_soft = softmax(\n                                dlog[len(CoNLL_tokenizer(\n                                    content[:d_e['start']])):len(\n                                    CoNLL_tokenizer(content[:d_e['end']]))])\n                        if np.average(c_soft) < np.average(d_soft):\n                            paper['entities']['drug'].remove(c_e)\n                            removed_c_e = True\n                            break\n                        elif np.average(c_soft) > np.average(d_soft):\n                            paper['entities']['disease'].remove(d_e)\n                            break\n\n                    elif c_e['end'] < d_e['start']:\n                        break\n\n                for s_e in s_ent:\n                    if c_e['end'] == s_e['end'] and c_e['start'] == s_e[\n                        'start']:\n                        if c_e['end'] == c_e['start']:\n                            c_soft = softmax(\n                                clog[len(CoNLL_tokenizer(\n                                    content[:c_e['start']])):len(\n                                    CoNLL_tokenizer(content[:c_e['end']])) + 1])\n                            s_soft = softmax(\n                                slog[len(CoNLL_tokenizer(\n                                    content[:s_e['start']])):len(\n                                    CoNLL_tokenizer(content[:s_e['end']])) + 1])\n                        else:\n                            c_soft = softmax(\n                                clog[len(CoNLL_tokenizer(\n                                    content[:c_e['start']])):len(\n                                    CoNLL_tokenizer(content[:c_e['end']]))])\n                            s_soft = softmax(\n                                slog[len(CoNLL_tokenizer(\n                                    content[:s_e['start']])):len(\n                                    CoNLL_tokenizer(content[:s_e['end']]))])\n                        if np.average(c_soft) < np.average(s_soft):\n                            if not removed_c_e:\n                                paper['entities']['drug'].remove(c_e)\n                            break\n                        elif np.average(c_soft) > np.average(s_soft):\n                            paper['entities']['species'].remove(s_e)\n                            break\n\n                    elif c_e['end'] < s_e['start']:\n                        break\n        return data\n\n\ndef detokenize(tokens, predicts, logits):\n    pred = dict({\n        'toks': tokens[:],\n        'labels': predicts[:],\n        'logits': logits[:]\n    })  # dictionary for predicted tokens and labels.\n\n    bert_toks = list()\n    bert_labels = list()\n    bert_logits = list()\n    tmp_p = list()\n    tmp_l = list()\n    tmp_s = list()\n    for t, l, s in zip(pred['toks'], pred['labels'], pred['logits']):\n        if t == '[CLS]':  # non-text tokens will not be evaluated.\n            continue\n        elif t == '[SEP]':  # newline\n            bert_toks.append(tmp_p)\n            bert_labels.append(tmp_l)\n            bert_logits.append(tmp_s)\n            tmp_p = list()\n            tmp_l = list()\n            tmp_s = list()\n            continue\n        elif t[:2] == '##':  # if it is a piece of a word (broken by Word Piece tokenizer)\n            tmp_p[-1] = tmp_p[-1] + t[2:]  # append pieces\n        else:\n            tmp_p.append(t)\n            tmp_l.append(l)\n            tmp_s.append(s)\n\n    return bert_toks, bert_labels, bert_logits\n"
  },
  {
    "path": "biobert_ner/run_ner.py",
    "content": "#! usr/bin/env python3\n# -*- coding:utf-8 -*-\n\"\"\"\nCopyright 2018 The Google AI Language Team Authors.\nBASED ON Google_BERT.\n@Author:zhoukaiyin\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport threading\nimport time\n\nfrom biobert_ner.modeling import *\nfrom biobert_ner.tokenization import *\nfrom biobert_ner.ops import *\nfrom biobert_ner.utils import Profile, show_prof_data\nfrom biobert_ner.fast_predict2 import FastPredict\nfrom convert import preprocess\n\n\nflags = tf.flags\n\nflags.DEFINE_string(\n    \"task_name\", \"NER\", \"The name of the task to train.\"\n)\n\nflags.DEFINE_string(\n    \"data_dir\", None,\n    \"The input datadir.\",\n)\n\nflags.DEFINE_string(\n    \"model_dir\", './pretrainedBERT/',\n    \"The input datadir.\",\n)\n\nflags.DEFINE_string(\n    \"bert_config_file\", './conf/bert_config.json',\n    \"The config json file corresponding to the pre-trained BERT model.\"\n)\n\nflags.DEFINE_string(\"vocab_file\", './conf/vocab.txt',\n                    \"The vocabulary file that the BERT model was trained on.\")\n\nflags.DEFINE_string(\n    \"init_checkpoint\", './pretrainedBERT/pubmed_pmc_470k/biobert_model.ckpt',\n    \"Initial checkpoint (usually from a pre-trained BERT model).\"\n)\n\nflags.DEFINE_bool(\n    \"rep_ent\", False,\n    \"Off entity type decision rules? Whether to print all rep outputs\"\n)\n\nflags.DEFINE_bool(\n    \"do_lower_case\", False,\n    \"Whether to lower case the input text.\"\n)\n\nflags.DEFINE_integer(\n    \"max_seq_length\", 256,\n    \"The maximum total input sequence length after WordPiece tokenization.\"\n)\n\nflags.DEFINE_bool(\"use_tpu\", False, \"Whether to use TPU or GPU/CPU.\")\n\nflags.DEFINE_bool(\"do_predict\", True,\n                  \"Whether to run the model in inference mode on the test set.\")\n\nflags.DEFINE_integer(\"predict_batch_size\", 2, \"Total batch size for predict.\")\n\nflags.DEFINE_float(\"learning_rate\", 5e-5, \"The initial learning rate for Adam.\")\n\nflags.DEFINE_float(\"num_train_epochs\", 10.0,\n                   \"Total number of training epochs to perform.\")\n\nflags.DEFINE_float(\n    \"warmup_proportion\", 0.1,\n    \"Proportion of training to perform linear learning rate warmup for. \"\n    \"E.g., 0.1 = 10% of training.\")\n\nflags.DEFINE_integer(\"save_checkpoints_steps\", 1000,\n                     \"How often to save the model checkpoint.\")\n\nflags.DEFINE_integer(\"iterations_per_loop\", 1000,\n                     \"How many steps to make in each estimator call.\")\n\nflags.DEFINE_string(\"master\", None, \"[Optional] TensorFlow master URL.\")\n\nflags.DEFINE_integer(\n    \"num_tpu_cores\", 8,\n    \"Only used if `use_tpu` is True. Total number of TPU cores to use.\")\n\n# BERN settings\nflags.DEFINE_string(\"ip\", '0.0.0.0', \"\")\nflags.DEFINE_integer(\"port\", 8888, \"\")\nflags.DEFINE_string(\"gnormplus_home\", os.path.join(os.path.expanduser('~'),\n                                                   'bern', 'GNormPlusJava'), \"\")\nflags.DEFINE_string(\"gnormplus_host\", 'localhost', \"\")\nflags.DEFINE_integer(\"gnormplus_port\", 18895, \"\")\nflags.DEFINE_string(\"tmvar2_home\", os.path.join(os.path.expanduser('~'),\n                                                'bern', 'tmVarJava'), \"\")\nflags.DEFINE_string(\"tmvar2_host\", 'localhost', \"\")\nflags.DEFINE_integer(\"tmvar2_port\", 18896, \"\")\n# BERN settings\n\nFLAGS = flags.FLAGS\n\n\nclass InputExample(object):\n    \"\"\"A single training/test example for simple sequence classification.\"\"\"\n\n    def __init__(self, guid, text, label=None):\n        \"\"\"Constructs a InputExample.\n\n        Args:\n          guid: Unique id for the example.\n          text: string. The untokenized text of the first sequence. For single\n            sequence tasks, only this sequence must be specified.\n          label: (Optional) string. The label of the example. This should be\n            specified for train and dev examples, but not for test examples.\n        \"\"\"\n        self.guid = guid\n        self.text = text\n        self.label = label\n\n\nclass InputFeatures(object):\n    \"\"\"A single set of features of data.\"\"\"\n\n    def __init__(self, input_ids, input_mask, segment_ids, label_ids,):\n        self.input_ids = input_ids\n        self.input_mask = input_mask\n        self.segment_ids = segment_ids\n        self.label_ids = label_ids\n        # self.label_mask = label_mask\n\n\nclass DataProcessor(object):\n    \"\"\"Base class for data converters for sequence classification data sets.\"\"\"\n\n    def get_train_examples(self, data_dir):\n        \"\"\"Gets a collection of `InputExample`s for the train set.\"\"\"\n        raise NotImplementedError()\n\n    def get_dev_examples(self, data_dir):\n        \"\"\"Gets a collection of `InputExample`s for the dev set.\"\"\"\n        raise NotImplementedError()\n\n    def get_labels(self):\n        \"\"\"Gets the list of labels for this data set.\"\"\"\n        raise NotImplementedError()\n\n    @classmethod\n    def _read_data(cls, data, pmids):\n        \"\"\"Reads a BIO data.\"\"\"\n        lines = []\n        words = []\n        labels = []\n        for pmid in pmids:\n            for sent in data[pmid]['words']:\n                words = sent[:]\n                labels = ['O'] * len(words)\n\n                if len(words) >= 30:\n                    while len(words) >= 30:\n                        tmplabel = labels[:30]\n                        l = ' '.join([label for label\n                                      in labels[:len(tmplabel)]\n                                      if len(label) > 0])\n                        w = ' '.join([word for word\n                                      in words[:len(tmplabel)]\n                                      if len(word) > 0])\n                        lines.append([l, w])\n                        words = words[len(tmplabel):]\n                        labels = labels[len(tmplabel):]\n                if len(words) == 0:\n                    continue\n\n                l = ' '.join([label for label in labels if len(label) > 0])\n                w = ' '.join([word for word in words if len(word) > 0])\n                lines.append([l, w])\n                words = []\n                labels = []\n                continue\n\n        return lines\n\n\nclass NerProcessor(DataProcessor):\n    def get_test_examples(self, data_dir):\n        data = list()\n        pmids = list()\n        with open(data_dir, 'r') as in_:\n            for line in in_:\n                line = line.strip()\n                tmp = json.loads(line)\n                tmp['title'] = preprocess(tmp['title'])\n                tmp['abstract'] = preprocess(tmp['abstract'])\n                data.append(tmp)\n                pmids.append(tmp[\"pmid\"])\n\n        json_file = input_form(json_to_sent(data))\n\n        return \\\n            self._create_example(self._read_data(json_file, pmids), \"test\"), \\\n            json_file, data\n\n    def get_test_dict_list(self, dict_list, is_raw_text=False):\n        pmids = list()\n        for d in dict_list:\n            pmids.append(d[\"pmid\"])\n            # d['title'] = preprocess(d['title'])\n            # d['abstract'] = preprocess(d['abstract'])\n\n        json_file = input_form(json_to_sent(dict_list, is_raw_text=is_raw_text))\n\n        return \\\n            self._create_example(self._read_data(json_file, pmids), \"test\"), \\\n            json_file\n\n    def get_labels(self):\n        return [\"B\", \"I\", \"O\", \"X\", \"[CLS]\", \"[SEP]\"]\n\n    def _create_example(self, lines, set_type):\n        examples = []\n        for (i, line) in enumerate(lines):\n            guid = \"%s-%s\" % (set_type, i)\n            text = convert_to_unicode(line[1])\n            label = convert_to_unicode(line[0])\n            examples.append(InputExample(guid=guid, text=text, label=label))\n        return examples\n\n\ndef file_based_input_fn_builder(input_file, seq_length, drop_remainder):\n    name_to_features = {\n        \"input_ids\": tf.FixedLenFeature([seq_length], tf.int64),\n        \"input_mask\": tf.FixedLenFeature([seq_length], tf.int64),\n        \"segment_ids\": tf.FixedLenFeature([seq_length], tf.int64),\n        \"label_ids\": tf.FixedLenFeature([seq_length], tf.int64),\n        # \"label_ids\":tf.VarLenFeature(tf.int64),\n        # \"label_mask\": tf.FixedLenFeature([seq_length], tf.int64),\n    }\n\n    def _decode_record(record, name_to_features):\n        example = tf.parse_single_example(record, name_to_features)\n        for name in list(example.keys()):\n            t = example[name]\n            if t.dtype == tf.int64:\n                t = tf.cast(t, dtype=tf.int32)\n            example[name] = t\n        return example\n\n    def input_fn(params):\n        batch_size = params[\"batch_size\"]\n        d = tf.data.TFRecordDataset(input_file)\n        # if is_training:\n        #     d = d.repeat()\n        #     d = d.shuffle(buffer_size=100)\n        d = d.apply(tf.data.experimental.map_and_batch(\n            lambda record: _decode_record(record, name_to_features),\n            batch_size=batch_size,\n            drop_remainder=drop_remainder\n        ))\n        return d\n    return input_fn\n\n\ndef create_model(bert_config, is_training, input_ids, input_mask,\n                 segment_ids, labels, num_labels, use_one_hot_embeddings):\n    model = BertModel(\n        config=bert_config,\n        is_training=is_training,\n        input_ids=input_ids,\n        input_mask=input_mask,\n        token_type_ids=segment_ids,\n        use_one_hot_embeddings=use_one_hot_embeddings\n    )\n\n    output_layer = model.get_sequence_output()\n\n    hidden_size = output_layer.shape[-1].value\n\n    output_weight = tf.get_variable(\n        \"output_weights\", [num_labels, hidden_size],\n        initializer=tf.truncated_normal_initializer(stddev=0.02)\n    )\n    output_bias = tf.get_variable(\n        \"output_bias\", [num_labels], initializer=tf.zeros_initializer()\n    )\n    with tf.variable_scope(\"loss\"):\n        if is_training:\n            output_layer = tf.nn.dropout(output_layer, keep_prob=0.9)\n        output_layer = tf.reshape(output_layer, [-1, hidden_size])\n        logits = tf.matmul(output_layer, output_weight, transpose_b=True)\n        logits = tf.nn.bias_add(logits, output_bias)\n        logits = tf.reshape(logits, [-1, FLAGS.max_seq_length, 7])\n        # mask = tf.cast(input_mask,tf.float32)\n        # loss = tf.contrib.seq2seq.sequence_loss(logits,labels,mask)\n        # return (loss, logits, predict)\n        #\n        log_probs = tf.nn.log_softmax(logits, axis=-1)\n        one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32)\n        per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)\n        loss = tf.reduce_sum(per_example_loss)\n        probabilities = tf.nn.softmax(logits, axis=-1)\n        predict = tf.argmax(probabilities, axis=-1)\n        return loss, per_example_loss, logits, log_probs, predict\n        #\n\n\ndef model_fn_builder(bert_config, num_labels, init_checkpoint, learning_rate,\n                     num_train_steps, num_warmup_steps, use_tpu,\n                     use_one_hot_embeddings):\n    def model_fn(features, labels, mode, params):\n        input_ids = features[\"input_ids\"]\n        input_mask = features[\"input_mask\"]\n        segment_ids = features[\"segment_ids\"]\n        label_ids = features[\"label_ids\"]\n        # label_mask = features[\"label_mask\"]\n        is_training = (mode == tf.estimator.ModeKeys.TRAIN)\n\n        (total_loss, per_example_loss, logits, log_probs, predicts) = \\\n            create_model(bert_config, is_training, input_ids, input_mask,\n                         segment_ids, label_ids, num_labels,\n                         use_one_hot_embeddings)\n        tvars = tf.trainable_variables()\n        scaffold_fn = None\n        if init_checkpoint:\n            (assignment_map, initialized_variable_names) = \\\n                get_assignment_map_from_checkpoint(tvars, init_checkpoint)\n            if use_tpu:\n                def tpu_scaffold():\n                    tf.train.init_from_checkpoint(init_checkpoint,\n                                                  assignment_map)\n                    return tf.train.Scaffold()\n\n                scaffold_fn = tpu_scaffold\n            else:\n                tf.train.init_from_checkpoint(init_checkpoint, assignment_map)\n\n        for var in tvars:\n            init_string = \"\"\n            if var.name in initialized_variable_names:\n                init_string = \", *INIT_FROM_CKPT*\"\n\n        assert mode == tf.estimator.ModeKeys.PREDICT\n\n        output_spec = tf.contrib.tpu.TPUEstimatorSpec(\n            mode=mode,\n            predictions={\"prediction\": predicts, \"log_probs\": log_probs},\n            scaffold_fn=scaffold_fn\n        )\n        return output_spec\n    return model_fn\n\n\nclass BioBERT:\n    def __init__(self, _):\n        init_start_t = time.time()\n\n        self.FLAGS = FLAGS\n\n        os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\n\n        tf.logging.set_verbosity(tf.logging.INFO)\n\n        bert_config = BertConfig.from_json_file(FLAGS.bert_config_file)\n\n        if FLAGS.max_seq_length > bert_config.max_position_embeddings:\n            raise ValueError(\n                \"Cannot use sequence length %d because the BERT model \"\n                \"was only trained up to sequence length %d\" %\n                (FLAGS.max_seq_length, bert_config.max_position_embeddings))\n\n        self.processor = NerProcessor()\n        self.label_list = self.processor.get_labels()\n        self.idx2label = dict()\n        self.label2idx = dict()\n        for lidx, l in enumerate(self.label_list):\n            self.idx2label[lidx + 1] = l\n            self.label2idx[l] = lidx + 1\n\n        self.tokenizer = FullTokenizer(\n            vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case)\n\n        tpu_cluster_resolver = None\n        if FLAGS.use_tpu and FLAGS.tpu_name:\n            tpu_cluster_resolver = \\\n                tf.contrib.cluster_resolver.TPUClusterResolver(\n                    FLAGS.tpu_name, zone=FLAGS.tpu_zone,\n                    project=FLAGS.gcp_project)\n\n        is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2\n        session_config = tf.ConfigProto()\n        session_config.gpu_options.allow_growth = True\n\n        self.estimator_dict = dict()\n        self.entity_types = ['gene', 'disease', 'drug', 'species']\n        for etype in self.entity_types:\n            num_train_steps = None\n            num_warmup_steps = None\n\n            run_config = tf.contrib.tpu.RunConfig(\n                cluster=tpu_cluster_resolver,\n                master=FLAGS.master,\n                model_dir=os.path.join(FLAGS.model_dir, etype),\n                session_config=session_config,\n                save_checkpoints_steps=FLAGS.save_checkpoints_steps,\n                tpu_config=tf.contrib.tpu.TPUConfig(\n                    iterations_per_loop=FLAGS.iterations_per_loop,\n                    num_shards=FLAGS.num_tpu_cores,\n                    per_host_input_for_training=is_per_host))\n\n            model_fn = model_fn_builder(\n                bert_config=bert_config,\n                num_labels=len(self.label_list) + 1,\n                init_checkpoint=FLAGS.init_checkpoint,\n                learning_rate=FLAGS.learning_rate,\n                num_train_steps=num_train_steps,\n                num_warmup_steps=num_warmup_steps,\n                use_tpu=FLAGS.use_tpu,\n                use_one_hot_embeddings=FLAGS.use_tpu)\n\n            estimator = tf.contrib.tpu.TPUEstimator(\n                use_tpu=FLAGS.use_tpu,\n                model_fn=model_fn,\n                config=run_config,\n                predict_batch_size=FLAGS.predict_batch_size)\n\n            # self.estimator_dict[etype] = \\\n            #     FastPredict(estimator, self.fast_input_fn_builder_gen)\n\n            # self.recognize()\n            self.estimator_dict[etype] = \\\n                FastPredict(estimator, self.fast_input_fn_builder_gen_batch)\n\n        self.counter = 0\n\n        init_end_t = time.time()\n        print('BioBERT init_t {:.3f} sec.'.format(init_end_t - init_start_t))\n\n    @Profile(__name__)\n    def recognize(self, input_dl, is_raw_text=False, thread_id=None,\n                  indent=None):\n        if thread_id is None:\n            self.counter += 1\n            req_id = self.counter\n        else:\n            req_id = thread_id\n\n        if type(input_dl) is str:\n            predict_examples, json_dict, data_list = \\\n                self.processor.get_test_examples(input_dl)\n        elif type(input_dl) is list:\n            predict_examples, json_dict = \\\n                self.processor.get_test_dict_list(input_dl, is_raw_text)\n            data_list = input_dl\n        else:\n            raise ValueError('Wrong type')\n\n        token_path = os.path.join(\"biobert_ner\", \"tmp\",\n                                  \"token_test_{}.txt\".format(req_id))\n\n        if os.path.exists(token_path):\n            os.remove(token_path)\n\n        predict_example_list = list()\n        for ex_index, example in enumerate(predict_examples):\n            feature = self.convert_single_example(\n                example, self.FLAGS.max_seq_length, req_id, \"test\")\n            feature_dict = dict()\n            # feature_dict[\"input_ids\"] = [feature.input_ids]\n            # feature_dict[\"input_mask\"] = [feature.input_mask]\n            # feature_dict[\"segment_ids\"] = [feature.segment_ids]\n            # feature_dict[\"label_ids\"] = [feature.label_ids]\n            feature_dict[\"input_ids\"] = feature.input_ids\n            feature_dict[\"input_mask\"] = feature.input_mask\n            feature_dict[\"segment_ids\"] = feature.segment_ids\n            feature_dict[\"label_ids\"] = feature.label_ids\n            predict_example_list.append(feature_dict)\n\n        tokens = list()\n        tot_tokens = list()\n        with open(token_path, 'r') as reader:\n            for line in reader:\n                tok = line.strip()\n                tot_tokens.append(tok)\n                if tok == '[CLS]':\n                    tmp_toks = [tok]\n                elif tok == '[SEP]':\n                    tmp_toks.append(tok)\n                    tokens.append(tmp_toks)\n                else:\n                    tmp_toks.append(tok)\n\n        # predict_example_list = self.get_inputs(predict_examples, req_id)\n\n        predict_dict = dict()\n        logits_dict = dict()\n\n        # Threading\n        threads = list()\n        out_tag_dict = dict()\n        for etype in self.entity_types:\n            out_tag_dict[etype] = (False, None)\n            t = threading.Thread(target=self.recognize_etype,\n                                 args=(etype, predict_example_list,\n                                       tokens, tot_tokens,\n                                       predict_dict, logits_dict, data_list,\n                                       json_dict, out_tag_dict))\n            t.daemon = True\n            t.start()\n            threads.append(t)\n\n        # block until all tasks are done\n        for t in threads:\n            t.join()\n\n        for etype in self.entity_types:\n            if out_tag_dict[etype][0]:\n                if type(input_dl) is str:\n                    print(os.path.split(input_dl)[1],\n                          'Found an error:', out_tag_dict[etype][1])\n                else:\n                    print('Found an error:', out_tag_dict[etype][1])\n                if os.path.exists(token_path):\n                    os.remove(token_path)\n                return None\n\n        data_list = merge_results(data_list, json_dict, predict_dict,\n                                  logits_dict, FLAGS.rep_ent,\n                                  is_raw_text=is_raw_text)\n\n        if type(input_dl) is str:\n            output_path = os.path.join('result/', os.path.splitext(\n                os.path.basename(input_dl))[0] + '_NER_{}.json'.format(req_id))\n            gold_output_path = os.path.join('result/', os.path.splitext(\n                os.path.basename(input_dl))[0] + '_NER.json')\n            print('pred', output_path)\n            print('gold', gold_output_path)\n\n            with open(output_path, 'w') as resultf:\n                for paper in data_list:\n                    paper['ner_model'] = \"BioBERT NER v.20190603\"\n                    resultf.write(\n                        json.dumps(paper, sort_keys=True, indent=indent) + '\\n')\n\n            if os.path.exists(gold_output_path):\n                with open(gold_output_path, 'r') as f_gold:\n                    for lidx, l in enumerate(f_gold):\n                        line_dict = json.loads(l)\n                        gold_dict = data_list[lidx]\n                        for etype in sorted(gold_dict['entities']):\n\n                            if len(gold_dict['entities'][etype]) != \\\n                                   len(line_dict['entities'][etype]):\n                                print('{} {} != {}'.format(\n                                    etype, len(gold_dict['entities'][etype]),\n                                    len(line_dict['entities'][etype])))\n                                print('gold:', gold_dict['entities'][etype])\n                                print('pred:', line_dict['entities'][etype])\n                                continue\n\n                            # assert len(gold_dict['entities'][etype]) == \\\n                            #        len(line_dict['entities'][etype]), \\\n                            #         '{} {} != {}'.format(\n                            #         etype, len(gold_dict['entities'][etype]),\n                            #         len(line_dict['entities'][etype]))\n\n                            for (e_gold, e_pred) in zip(\n                                    gold_dict['entities'][etype],\n                                    line_dict['entities'][etype]):\n                                # print(etype, e_gold, e_pred)\n                                assert e_gold['start'] == e_pred['start']\n                                assert e_gold['end'] == e_pred['end']\n            else:\n                print('Not found gold output', gold_output_path)\n\n            print()\n\n        # delete temp files\n        if os.path.exists(token_path):\n            os.remove(token_path)\n\n        return data_list\n\n    @Profile(__name__)\n    def recognize_etype(self, etype, predict_example_list, tokens, tot_tokens,\n                        predict_dict, logits_dict, data_list, json_dict,\n                        out_tag_dict):\n        # result = list()\n        # for e in predict_example_list:\n        #     result.append(self.estimator_dict[etype].predict(e))\n\n        result = self.estimator_dict[etype].predict(predict_example_list)\n\n        predicts = list()\n        logits = list()\n        for pidx, prediction in enumerate(result):\n            slen = len(tokens[pidx])\n            for p in prediction['prediction'][:slen]:\n                if p in [0, 4, 5, 6]:\n                    predicts.append(self.idx2label[3])\n                else:\n                    predicts.append(self.idx2label[p])\n            for l in prediction['log_probs'][:slen]:\n                logits.append(l)\n\n        de_toks, de_labels, de_logits = detokenize(tot_tokens, predicts, logits)\n\n        predict_dict[etype] = dict()\n        logits_dict[etype] = dict()\n        piv = 0\n        for data in data_list:\n            pmid = data['pmid']\n            predict_dict[etype][pmid] = list()\n            logits_dict[etype][pmid] = list()\n\n            sent_lens = list()\n            for sent in json_dict[pmid]['words']:\n                sent_lens.append(len(sent))\n            sent_idx = 0\n            de_i = 0\n            overlen = False\n            while True:\n                if overlen:\n                    try:\n                        predict_dict[etype][pmid][-1].extend(\n                            de_labels[piv + de_i])\n                    except Exception as e:\n                        out_tag_dict[etype] = (True, e)\n                        break\n                    logits_dict[etype][pmid][-1].extend(de_logits[piv + de_i])\n                    de_i += 1\n                    if len(predict_dict[etype][pmid][-1]) == len(\n                            json_dict[pmid]['words'][\n                                len(predict_dict[etype][pmid]) - 1]):\n                        sent_idx += 1\n                        overlen = False\n\n                else:\n                    predict_dict[etype][pmid].append(de_labels[piv + de_i])\n                    logits_dict[etype][pmid].append(de_logits[piv + de_i])\n                    de_i += 1\n                    if len(predict_dict[etype][pmid][-1]) == len(\n                            json_dict[pmid]['words'][\n                                len(predict_dict[etype][pmid]) - 1]):\n                        sent_idx += 1\n                        overlen = False\n                    else:\n                        overlen = True\n\n                if sent_idx == len(json_dict[pmid]['words']):\n                    piv += de_i\n                    break\n            if out_tag_dict[etype][0]:\n                break\n\n    def filed_based_convert_examples_to_features(self, examples, max_seq_length,\n                                                 output_file, req_id,\n                                                 mode='test'):\n        features_list = list()\n        writer = tf.python_io.TFRecordWriter(output_file)\n        for (ex_index, example) in enumerate(examples):\n            feature = self.convert_single_example(example, max_seq_length,\n                                                  req_id, mode)\n\n            def create_int_feature(values):\n                f = tf.train.Feature(int64_list=tf.train.Int64List(\n                    value=list(values)))\n                return f\n\n            features = collections.OrderedDict()\n            features[\"input_ids\"] = create_int_feature(feature.input_ids)\n            features[\"input_mask\"] = create_int_feature(feature.input_mask)\n            features[\"segment_ids\"] = create_int_feature(feature.segment_ids)\n            features[\"label_ids\"] = create_int_feature(feature.label_ids)\n            # features[\"label_mask\"] = create_int_feature(feature.label_mask)\n            tf_example = tf.train.Example(features=tf.train.Features(\n                feature=features))\n            writer.write(tf_example.SerializeToString())\n\n            feature_dict = dict()\n            # feature_dict[\"input_ids\"] = [feature.input_ids]\n            # feature_dict[\"input_mask\"] = [feature.input_mask]\n            # feature_dict[\"segment_ids\"] = [feature.segment_ids]\n            # feature_dict[\"label_ids\"] = [feature.label_ids]\n            feature_dict[\"input_ids\"] = feature.input_ids\n            feature_dict[\"input_mask\"] = feature.input_mask\n            feature_dict[\"segment_ids\"] = feature.segment_ids\n            feature_dict[\"label_ids\"] = feature.label_ids\n            features_list.append(feature_dict)\n\n        writer.close()\n\n        return features_list\n\n    def get_input_generator(self, predict_examples, req_id, mode='test'):\n        for (ex_index, example) in enumerate(predict_examples):\n            feature = self.convert_single_example(example,\n                                                  self.FLAGS.max_seq_length,\n                                                  req_id, mode)\n\n            feature_dict = dict()\n            feature_dict[\"input_ids\"] = [feature.input_ids]\n            feature_dict[\"input_mask\"] = [feature.input_mask]\n            feature_dict[\"segment_ids\"] = [feature.segment_ids]\n            feature_dict[\"label_ids\"] = [feature.label_ids]\n            yield feature_dict\n\n    def get_inputs(self, predict_examples, req_id, mode='test'):\n        features = list()\n        for (ex_index, example) in enumerate(predict_examples):\n            feature = self.convert_single_example(example,\n                                                  self.FLAGS.max_seq_length,\n                                                  req_id, mode)\n\n            feature_dict = dict()\n            feature_dict[\"input_ids\"] = feature.input_ids\n            feature_dict[\"input_mask\"] = feature.input_mask\n            feature_dict[\"segment_ids\"] = feature.segment_ids\n            feature_dict[\"label_ids\"] = feature.label_ids\n            features.append(feature_dict)\n        return features\n\n    # https://hanxiao.github.io/2019/01/02/Serving-Google-BERT-in-Production-using-Tensorflow-and-ZeroMQ/\n    def fast_input_fn_builder_gen(self, gen_predict_examples):\n\n        def input_fn(params):\n            ds = tf.data.Dataset.from_generator(\n                gen_predict_examples, output_types={\n                    'input_ids': tf.int32,\n                    'input_mask': tf.int32,\n                    'segment_ids': tf.int32,\n                    'label_ids': tf.int32\n                }, output_shapes={\n                    'input_ids': (self.FLAGS.max_seq_length),\n                    'input_mask': (self.FLAGS.max_seq_length),\n                    'segment_ids': (self.FLAGS.max_seq_length),\n                    'label_ids': (self.FLAGS.max_seq_length)\n                    # 'input_ids': (None, self.FLAGS.max_seq_length),\n                    # 'input_mask': (None, self.FLAGS.max_seq_length),\n                    # 'segment_ids': (None, self.FLAGS.max_seq_length),\n                    # 'label_ids': (None, self.FLAGS.max_seq_length)\n                }).batch(1)\n            return ds\n\n        return input_fn\n\n    def fast_input_fn_builder_gen_batch(self, gen_predict_examples):\n        seq_length = self.FLAGS.max_seq_length\n\n        def input_fn(params):\n            # batch_size = params[\"batch_size\"]\n            output_types = {\n                'input_ids': tf.int32,\n                'input_mask': tf.int32,\n                'segment_ids': tf.int32,\n                'label_ids': tf.int32\n            }\n            output_shapes = {\n                # 'input_ids': (None, seq_length),\n                # 'input_mask': (None, seq_length),\n                # 'segment_ids': (None, seq_length),\n                # 'label_ids': (None, seq_length)\n                'input_ids': (seq_length,),\n                'input_mask': (seq_length,),\n                'segment_ids': (seq_length,),\n                'label_ids': (seq_length,)\n            }\n            d = tf.data.Dataset.from_generator(\n                gen_predict_examples, output_types,\n                output_shapes=output_shapes)\n            # d = d.prefetch(batch_size)  # error\n            # d = d.batch(batch_size)  # error\n            d = d.batch(1)\n            return d\n\n        return input_fn\n\n    def convert_single_example(self, example, max_seq_length, req_id, mode):\n        label_map = {}\n        for (i, label) in enumerate(self.label_list, 1):\n            label_map[label] = i\n        textlist = example.text.split(' ')\n        labellist = example.label.split(' ')\n        tokens = []\n        labels = []\n        for i, word in enumerate(textlist):\n            token = self.tokenizer.tokenize(word)\n            tokens.extend(token)\n            label_1 = labellist[i]\n            for m in range(len(token)):\n                if m == 0:\n                    labels.append(label_1)\n                else:\n                    labels.append(\"X\")\n        # tokens = tokenizer.tokenize(example.text)\n        if len(tokens) >= max_seq_length - 1:\n            tokens = tokens[0:(max_seq_length - 2)]\n            labels = labels[0:(max_seq_length - 2)]\n        ntokens = []\n        segment_ids = []\n        label_ids = []\n        ntokens.append(\"[CLS]\")\n        segment_ids.append(0)\n        # append(\"O\") or append(\"[CLS]\") not sure!\n        label_ids.append(label_map[\"[CLS]\"])\n        for i, token in enumerate(tokens):\n            ntokens.append(token)\n            segment_ids.append(0)\n            label_ids.append(label_map[labels[i]])\n        ntokens.append(\"[SEP]\")\n        segment_ids.append(0)\n        # append(\"O\") or append(\"[SEP]\") not sure!\n        label_ids.append(label_map[\"[SEP]\"])\n        input_ids = self.tokenizer.convert_tokens_to_ids(ntokens)\n        input_mask = [1] * len(input_ids)\n        # label_mask = [1] * len(input_ids)\n        while len(input_ids) < max_seq_length:\n            input_ids.append(0)\n            input_mask.append(0)\n            segment_ids.append(0)\n            # we don't concerned about it!\n            label_ids.append(0)\n            ntokens.append(\"**NULL**\")\n            # label_mask.append(0)\n        # print(len(input_ids))\n        assert len(input_ids) == max_seq_length\n        assert len(input_mask) == max_seq_length\n        assert len(segment_ids) == max_seq_length\n        assert len(label_ids) == max_seq_length\n        # assert len(label_mask) == max_seq_length\n\n        feature = InputFeatures(\n            input_ids=input_ids,\n            input_mask=input_mask,\n            segment_ids=segment_ids,\n            label_ids=label_ids,\n            # label_mask = label_mask\n        )\n        self.write_tokens(ntokens, mode, req_id)\n        return feature\n\n    @staticmethod\n    def write_tokens(tokens, mode, req_id):\n        if mode == \"test\":\n            path = os.path.join(\"biobert_ner\", \"tmp\",\n                                \"token_{}_{}.txt\".format(mode, req_id))\n            with open(path, 'a') as wf:\n                for token in tokens:\n                    if token != \"**NULL**\":\n                        wf.write(token + '\\n')\n\n    def close(self):\n        for etype in self.entity_types:\n            self.estimator_dict[etype].close()\n\n\ndef main(_):\n    os.environ['CUDA_VISIBLE_DEVICES'] = \"0\"\n\n    biobert = BioBERT(FLAGS)\n\n    from convert import pubtator_biocxml2dict_list\n    import json\n\n    dl = pubtator_biocxml2dict_list(\n        [26658955, 24189420, 22579007, 29185436])\n    for d in dl:\n        print(d['pmid'])\n        with open('/media/donghyeon/f7c53837-2156-4793-b2b1-4b0578dffef1'\n                  '/biobert/BioBert_NER/BioBERTNER/data/' + d['pmid'] + '.json',\n                  'w', encoding='utf-8') as f_out:\n            json.dump(d, f_out)\n        biobert.recognize([d])\n\n    biobert.close()\n\n    show_prof_data()\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "biobert_ner/tokenization.py",
    "content": "# coding=utf-8\n# Copyright 2018 The Google AI Language Team Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\"\"\"Tokenization classes.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport collections\nimport re\nimport unicodedata\nimport six\nimport tensorflow as tf\n\n\ndef validate_case_matches_checkpoint(do_lower_case, init_checkpoint):\n    \"\"\"Checks whether the casing config is consistent with the checkpoint name.\"\"\"\n\n    # The casing has to be passed in by the user and there is no explicit check\n    # as to whether it matches the checkpoint. The casing information probably\n    # should have been stored in the bert_config.json file, but it's not, so\n    # we have to heuristically detect it to validate.\n\n    if not init_checkpoint:\n        return\n\n    m = re.match(\"^.*?([A-Za-z0-9_-]+)/bert_model.ckpt\", init_checkpoint)\n    if m is None:\n        return\n\n    model_name = m.group(1)\n\n    lower_models = [\n        \"uncased_L-24_H-1024_A-16\", \"uncased_L-12_H-768_A-12\",\n        \"multilingual_L-12_H-768_A-12\", \"chinese_L-12_H-768_A-12\"\n    ]\n\n    cased_models = [\n        \"cased_L-12_H-768_A-12\", \"cased_L-24_H-1024_A-16\",\n        \"multi_cased_L-12_H-768_A-12\"\n    ]\n\n    is_bad_config = False\n    if model_name in lower_models and not do_lower_case:\n        is_bad_config = True\n        actual_flag = \"False\"\n        case_name = \"lowercased\"\n        opposite_flag = \"True\"\n\n    if model_name in cased_models and do_lower_case:\n        is_bad_config = True\n        actual_flag = \"True\"\n        case_name = \"cased\"\n        opposite_flag = \"False\"\n\n    if is_bad_config:\n        raise ValueError(\n            \"You passed in `--do_lower_case=%s` with `--init_checkpoint=%s`. \"\n            \"However, `%s` seems to be a %s model, so you \"\n            \"should pass in `--do_lower_case=%s` so that the fine-tuning matches \"\n            \"how the model was pre-training. If this error is wrong, please \"\n            \"just comment out this check.\" % (actual_flag, init_checkpoint,\n                                              model_name, case_name,\n                                              opposite_flag))\n\n\ndef convert_to_unicode(text):\n    \"\"\"Converts `text` to Unicode (if it's not already), assuming utf-8 input.\"\"\"\n    if six.PY3:\n        if isinstance(text, str):\n            return text\n        elif isinstance(text, bytes):\n            return text.decode(\"utf-8\", \"ignore\")\n        else:\n            raise ValueError(\"Unsupported string type: %s\" % (type(text)))\n    elif six.PY2:\n        if isinstance(text, str):\n            return text.decode(\"utf-8\", \"ignore\")\n        elif isinstance(text, unicode):\n            return text\n        else:\n            raise ValueError(\"Unsupported string type: %s\" % (type(text)))\n    else:\n        raise ValueError(\"Not running on Python2 or Python 3?\")\n\n\ndef printable_text(text):\n    \"\"\"Returns text encoded in a way suitable for print or `tf.logging`.\"\"\"\n\n    # These functions want `str` for both Python2 and Python3, but in one case\n    # it's a Unicode string and in the other it's a byte string.\n    if six.PY3:\n        if isinstance(text, str):\n            return text\n        elif isinstance(text, bytes):\n            return text.decode(\"utf-8\", \"ignore\")\n        else:\n            raise ValueError(\"Unsupported string type: %s\" % (type(text)))\n    elif six.PY2:\n        if isinstance(text, str):\n            return text\n        elif isinstance(text, unicode):\n            return text.encode(\"utf-8\")\n        else:\n            raise ValueError(\"Unsupported string type: %s\" % (type(text)))\n    else:\n        raise ValueError(\"Not running on Python2 or Python 3?\")\n\n\ndef load_vocab(vocab_file):\n    \"\"\"Loads a vocabulary file into a dictionary.\"\"\"\n    vocab = collections.OrderedDict()\n    index = 0\n    with tf.gfile.GFile(vocab_file, \"r\") as reader:\n        while True:\n            token = convert_to_unicode(reader.readline())\n            if not token:\n                break\n            token = token.strip()\n            vocab[token] = index\n            index += 1\n    return vocab\n\n\ndef convert_by_vocab(vocab, items):\n    \"\"\"Converts a sequence of [tokens|ids] using the vocab.\"\"\"\n    output = []\n    for item in items:\n        output.append(vocab[item])\n    return output\n\n\ndef convert_tokens_to_ids(vocab, tokens):\n    return convert_by_vocab(vocab, tokens)\n\n\ndef convert_ids_to_tokens(inv_vocab, ids):\n    return convert_by_vocab(inv_vocab, ids)\n\n\ndef whitespace_tokenize(text):\n    \"\"\"Runs basic whitespace cleaning and splitting on a piece of text.\"\"\"\n    text = text.strip()\n    if not text:\n        return []\n    tokens = text.split()\n    return tokens\n\n\nclass FullTokenizer(object):\n    \"\"\"Runs end-to-end tokenziation.\"\"\"\n\n    def __init__(self, vocab_file, do_lower_case=True):\n        self.vocab = load_vocab(vocab_file)\n        self.inv_vocab = {v: k for k, v in self.vocab.items()}\n        self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case)\n        self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab)\n\n    def tokenize(self, text):\n        split_tokens = []\n        for token in self.basic_tokenizer.tokenize(text):\n            for sub_token in self.wordpiece_tokenizer.tokenize(token):\n                split_tokens.append(sub_token)\n\n        return split_tokens\n\n    def convert_tokens_to_ids(self, tokens):\n        return convert_by_vocab(self.vocab, tokens)\n\n    def convert_ids_to_tokens(self, ids):\n        return convert_by_vocab(self.inv_vocab, ids)\n\n\nclass BasicTokenizer(object):\n    \"\"\"Runs basic tokenization (punctuation splitting, lower casing, etc.).\"\"\"\n\n    def __init__(self, do_lower_case=True):\n        \"\"\"Constructs a BasicTokenizer.\n\n        Args:\n          do_lower_case: Whether to lower case the input.\n        \"\"\"\n        self.do_lower_case = do_lower_case\n\n    def tokenize(self, text):\n        \"\"\"Tokenizes a piece of text.\"\"\"\n        text = convert_to_unicode(text)\n        text = self._clean_text(text)\n\n        # This was added on November 1st, 2018 for the multilingual and Chinese\n        # models. This is also applied to the English models now, but it doesn't\n        # matter since the English models were not trained on any Chinese data\n        # and generally don't have any Chinese data in them (there are Chinese\n        # characters in the vocabulary because Wikipedia does have some Chinese\n        # words in the English Wikipedia.).\n        text = self._tokenize_chinese_chars(text)\n\n        orig_tokens = whitespace_tokenize(text)\n        split_tokens = []\n        for token in orig_tokens:\n            if self.do_lower_case:\n                token = token.lower()\n                token = self._run_strip_accents(token)\n            split_tokens.extend(self._run_split_on_punc(token))\n\n        output_tokens = whitespace_tokenize(\" \".join(split_tokens))\n        return output_tokens\n\n    def _run_strip_accents(self, text):\n        \"\"\"Strips accents from a piece of text.\"\"\"\n        text = unicodedata.normalize(\"NFD\", text)\n        output = []\n        for char in text:\n            cat = unicodedata.category(char)\n            if cat == \"Mn\":\n                continue\n            output.append(char)\n        return \"\".join(output)\n\n    def _run_split_on_punc(self, text):\n        \"\"\"Splits punctuation on a piece of text.\"\"\"\n        chars = list(text)\n        i = 0\n        start_new_word = True\n        output = []\n        while i < len(chars):\n            char = chars[i]\n            if _is_punctuation(char):\n                output.append([char])\n                start_new_word = True\n            else:\n                if start_new_word:\n                    output.append([])\n                start_new_word = False\n                output[-1].append(char)\n            i += 1\n\n        return [\"\".join(x) for x in output]\n\n    def _tokenize_chinese_chars(self, text):\n        \"\"\"Adds whitespace around any CJK character.\"\"\"\n        output = []\n        for char in text:\n            cp = ord(char)\n            if self._is_chinese_char(cp):\n                output.append(\" \")\n                output.append(char)\n                output.append(\" \")\n            else:\n                output.append(char)\n        return \"\".join(output)\n\n    def _is_chinese_char(self, cp):\n        \"\"\"Checks whether CP is the codepoint of a CJK character.\"\"\"\n        # This defines a \"chinese character\" as anything in the CJK Unicode block:\n        #   https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block)\n        #\n        # Note that the CJK Unicode block is NOT all Japanese and Korean characters,\n        # despite its name. The modern Korean Hangul alphabet is a different block,\n        # as is Japanese Hiragana and Katakana. Those alphabets are used to write\n        # space-separated words, so they are not treated specially and handled\n        # like the all of the other languages.\n        if ((cp >= 0x4E00 and cp <= 0x9FFF) or  #\n                (cp >= 0x3400 and cp <= 0x4DBF) or  #\n                (cp >= 0x20000 and cp <= 0x2A6DF) or  #\n                (cp >= 0x2A700 and cp <= 0x2B73F) or  #\n                (cp >= 0x2B740 and cp <= 0x2B81F) or  #\n                (cp >= 0x2B820 and cp <= 0x2CEAF) or\n                (cp >= 0xF900 and cp <= 0xFAFF) or  #\n                (cp >= 0x2F800 and cp <= 0x2FA1F)):  #\n            return True\n\n        return False\n\n    def _clean_text(self, text):\n        \"\"\"Performs invalid character removal and whitespace cleanup on text.\"\"\"\n        output = []\n        for char in text:\n            cp = ord(char)\n            if cp == 0 or cp == 0xfffd or _is_control(char):\n                continue\n            if _is_whitespace(char):\n                output.append(\" \")\n            else:\n                output.append(char)\n        return \"\".join(output)\n\n\nclass WordpieceTokenizer(object):\n    \"\"\"Runs WordPiece tokenziation.\"\"\"\n\n    def __init__(self, vocab, unk_token=\"[UNK]\", max_input_chars_per_word=200):\n        self.vocab = vocab\n        self.unk_token = unk_token\n        self.max_input_chars_per_word = max_input_chars_per_word\n\n    def tokenize(self, text):\n        \"\"\"Tokenizes a piece of text into its word pieces.\n\n        This uses a greedy longest-match-first algorithm to perform tokenization\n        using the given vocabulary.\n\n        For example:\n          input = \"unaffable\"\n          output = [\"un\", \"##aff\", \"##able\"]\n\n        Args:\n          text: A single token or whitespace separated tokens. This should have\n            already been passed through `BasicTokenizer.\n\n        Returns:\n          A list of wordpiece tokens.\n        \"\"\"\n\n        text = convert_to_unicode(text)\n\n        output_tokens = []\n        for token in whitespace_tokenize(text):\n            chars = list(token)\n            if len(chars) > self.max_input_chars_per_word:\n                output_tokens.append(self.unk_token)\n                continue\n\n            is_bad = False\n            start = 0\n            sub_tokens = []\n            while start < len(chars):\n                end = len(chars)\n                cur_substr = None\n                while start < end:\n                    substr = \"\".join(chars[start:end])\n                    if start > 0:\n                        substr = \"##\" + substr\n                    if substr in self.vocab:\n                        cur_substr = substr\n                        break\n                    end -= 1\n                if cur_substr is None:\n                    is_bad = True\n                    break\n                sub_tokens.append(cur_substr)\n                start = end\n\n            if is_bad:\n                output_tokens.append(self.unk_token)\n            else:\n                output_tokens.extend(sub_tokens)\n        return output_tokens\n\n\ndef _is_whitespace(char):\n    \"\"\"Checks whether `chars` is a whitespace character.\"\"\"\n    # \\t, \\n, and \\r are technically contorl characters but we treat them\n    # as whitespace since they are generally considered as such.\n    if char == \" \" or char == \"\\t\" or char == \"\\n\" or char == \"\\r\":\n        return True\n    cat = unicodedata.category(char)\n    if cat == \"Zs\":\n        return True\n    return False\n\n\ndef _is_control(char):\n    \"\"\"Checks whether `chars` is a control character.\"\"\"\n    # These are technically control characters but we count them as whitespace\n    # characters.\n    if char == \"\\t\" or char == \"\\n\" or char == \"\\r\":\n        return False\n    cat = unicodedata.category(char)\n    if cat in (\"Cc\", \"Cf\"):\n        return True\n    return False\n\n\ndef _is_punctuation(char):\n    \"\"\"Checks whether `chars` is a punctuation character.\"\"\"\n    cp = ord(char)\n    # We treat all non-letter/number ASCII as punctuation.\n    # Characters such as \"^\", \"$\", and \"`\" are not in the Unicode\n    # Punctuation class but we treat them as punctuation anyways, for\n    # consistency.\n    if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or\n            (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)):\n        return True\n    cat = unicodedata.category(char)\n    if cat.startswith(\"P\"):\n        return True\n    return False\n"
  },
  {
    "path": "biobert_ner/utils.py",
    "content": "import time\n\n# https://stackoverflow.com/a/3620972\nPROF_DATA = {}\n\n\nclass Profile(object):\n    def __init__(self, prefix):\n        self.prefix = prefix\n\n    def __call__(self, fn):\n        def with_profiling(*args, **kwargs):\n            global PROF_DATA\n            start_time = time.time()\n            ret = fn(*args, **kwargs)\n\n            elapsed_time = time.time() - start_time\n            key = '[' + self.prefix + '].' + fn.__name__\n\n            if key not in PROF_DATA:\n                PROF_DATA[key] = [0, list()]\n            PROF_DATA[key][0] += 1\n            PROF_DATA[key][1].append(elapsed_time)\n\n            return ret\n\n        return with_profiling\n\n\ndef show_prof_data():\n    for fname, data in sorted(PROF_DATA.items()):\n        max_time = max(data[1])\n        avg_time = sum(data[1]) / len(data[1])\n        total_time = sum(data[1])\n        print(\"\\n{} -> called {} times\".format(fname, data[0]))\n        print(\"Time total: {:.3f}, max: {:.3f}, avg: {:.3f}\".format(\n            total_time, max_time, avg_time))\n\n\ndef clear_prof_data():\n    global PROF_DATA\n    PROF_DATA = {}\n"
  },
  {
    "path": "convert.py",
    "content": "import copy\nfrom datetime import datetime, timezone\nimport json\nfrom operator import itemgetter\nimport xml.etree.ElementTree as ElTree\nfrom download import query_pubtator2biocxml\n\n\ndef pubtator2dict_list(pubtator_file_path, is_raw_text):\n    dict_list = list()\n\n    title_pmid = ''\n    # abstract_pmid = ''\n    title = ''\n    abstract_text = ''\n    doc_line_num = 0\n    mutations = list()\n\n    with open(pubtator_file_path, 'r', encoding='utf-8') as f:\n        for line in f:\n            line = line.rstrip()\n            if len(line) == 0:\n                # temp\n                # if title_pmid != abstract_pmid:\n                #     return '{\"error\": \"pmid disagreement {} != {}\"}'\\\n                #         .format(title_pmid, abstract_pmid)\n\n                if len(mutations) > 0:\n                    if len(mutations) > 1:\n                        mutations = sorted(mutations,\n                                           key=itemgetter('start'))\n\n                    if is_raw_text:\n                        # abstract only\n                        mutations = get_bestplus_spans(mutations, abstract_text)\n                    else:\n                        # a title, a space and an abstract\n                        mutations = get_bestplus_spans(mutations,\n                                                       title + ' ' +\n                                                       abstract_text)\n                    # print('Found mutation(s)', mutations)\n\n                doc_dict = {\n                    'pmid': title_pmid,\n                    'mutation_model': 'tmVar 2.0',\n                    'entities': {'mutation': copy.deepcopy(mutations)}\n                }\n                if is_raw_text:\n                    doc_dict['abstract'] = abstract_text\n                else:\n                    doc_dict['title'] = title\n                    doc_dict['abstract'] = abstract_text\n\n                dict_list.append(doc_dict)\n\n                doc_line_num = 0\n                mutations.clear()\n                continue\n\n            if doc_line_num == 0:\n                title_cols = line.split('|t|')\n\n                if len(title_cols) != 2:\n                    return '{\"error\": \"wrong #title_cols {}\"}'\\\n                        .format(len(title_cols))\n\n                title_pmid = title_cols[0]\n\n                if '- No text -' == title_cols[1]:\n                    # make tmvar2 results empty\n                    title = ''\n                else:\n                    title = title_cols[1]\n            elif doc_line_num == 1:\n                abstract_cols = line.split('|a|')\n\n                if len(abstract_cols) != 2:\n                    return '{\"error\": \"wrong #abstract_cols {}\"}' \\\n                        .format(len(abstract_cols))\n\n                if '- No text -' == abstract_cols[1]:\n                    # make tmvar2 results empty\n                    abstract_text = ''\n                else:\n                    abstract_text = abstract_cols[1]\n            elif doc_line_num > 1:\n                mutation_cols = line.split('\\t')\n\n                if len(mutation_cols) != 6:\n                    return '{\"error\": \"wrong #mutation_cols {}\"}' \\\n                        .format(len(mutation_cols))\n\n                mutations.append({'start': int(mutation_cols[1]),\n                                  'end': int(mutation_cols[2]),\n                                  'mention': mutation_cols[3],\n                                  'mutationType': mutation_cols[4],\n                                  'normalizedName': mutation_cols[5]})\n\n            doc_line_num += 1\n    return dict_list\n\n\ndef pubtatorstr2dict_list(pubtator, is_raw_text):\n    mutation_types = ['ProteinMutation', 'DNAMutation', 'SNP']\n\n    dict_list = list()\n\n    title_pmid = ''\n    abstract_pmid = ''\n    title = ''\n    abstract_text = ''\n    doc_line_num = 0\n    mutations = list()\n\n    for line in pubtator.splitlines():\n        if len(line) == 0:\n\n            if title_pmid != abstract_pmid:\n                return '{\"error\": \"pmid disagreement\"}'\n\n            if len(mutations) > 0:\n                if len(mutations) > 1:\n                    mutations = sorted(mutations,\n                                       key=itemgetter('start'))\n\n                if is_raw_text:\n                    # tmtool: title only\n                    mutations = get_bestplus_spans(mutations, title)\n                else:\n                    # a title, a space and an abstract\n                    mutations = get_bestplus_spans(mutations,\n                                                   title + ' ' +\n                                                   abstract_text)\n                # print('Found mutation(s)', mutations)\n\n            doc_dict = {\n                'pmid': title_pmid,\n                'mutation_model': 'tmtool tmVar',\n                'entities': {'mutation': copy.deepcopy(mutations)}\n            }\n            if is_raw_text:\n                # tmtool: title only & STM\n                doc_dict['abstract'] = title\n            else:\n                doc_dict['title'] = title\n                doc_dict['abstract'] = abstract_text\n\n            dict_list.append(doc_dict)\n\n            doc_line_num = 0\n            mutations.clear()\n            continue\n\n        if doc_line_num == 0:\n            title_cols = line.split('|t|')\n\n            if len(title_cols) != 2:\n                return '{\"error\": \"wrong #title_cols {}\"}' \\\n                    .format(len(title_cols))\n\n            title_pmid = title_cols[0]\n\n            if '- No text -' == title_cols[1]:\n                # make tmvar2 results empty\n                title = ''\n            else:\n                title = title_cols[1]\n        elif doc_line_num == 1:\n            abstract_cols = line.split('|a|')\n\n            if len(abstract_cols) != 2:\n                return '{\"error\": \"wrong #abstract_cols {}\"}' \\\n                    .format(len(abstract_cols))\n\n            abstract_pmid = abstract_cols[0]\n\n            if '- No text -' == abstract_cols[1] \\\n                    or '-NoAbstract-' == abstract_cols[1]:\n                # make tmvar2 results empty\n                abstract_text = ''\n            else:\n                abstract_text = abstract_cols[1]\n        elif doc_line_num > 1:\n            mutation_cols = line.split('\\t')\n\n            if len(mutation_cols) != 6:\n                return '{\"error\": \"wrong #mutation_cols {}\"}' \\\n                    .format(len(mutation_cols))\n\n            if mutation_cols[4] in mutation_types:\n                mutations.append({'start': int(mutation_cols[1]),\n                                  'end': int(mutation_cols[2]),\n                                  'mention': mutation_cols[3],\n                                  'mutationType': mutation_cols[4],\n                                  'normalizedName': mutation_cols[5]})\n\n        doc_line_num += 1\n    return dict_list\n\n\ndef pubtator_biocxml2dict_list(pmids):\n    pubtator_xml, pubtator_xml_raw = query_pubtator2biocxml(pmids)\n\n    if type(pubtator_xml) is not str:\n        return None\n\n    if 'document' not in pubtator_xml and 'passage' not in pubtator_xml:\n        return pubtator_xml\n\n    mutation_types = ['ProteinMutation', 'DNAMutation', 'SNP']\n\n    temp_dict = dict()\n\n    try:\n        root = ElTree.fromstring(pubtator_xml)\n    except ElTree.ParseError as pe:\n        print('XML ParseError', pe.msg)\n        root = ElTree.fromstring(pubtator_xml_raw)\n\n    for child in root:\n\n        if 'document' != child.tag:\n            continue\n\n        pubmed_id = child.find('id').text\n\n        text_dict = {\n            'title': '',\n            'abstract': ''\n        }\n\n        mutations = list()\n\n        for passage in child.iter('passage'):\n\n            passage_type = passage.find(\".//*[@key='type']\").text\n\n            for p_child in passage:\n                if 'text' == p_child.tag:\n                    text_dict[passage_type] = p_child.text\n                elif 'annotation' == p_child.tag:\n                    entity_type = p_child.find(\".//*[@key='type']\").text\n\n                    if entity_type in mutation_types:\n                        location = p_child.find('location')\n                        start_offset = int(location.get('offset'))\n                        end_offset = start_offset + int(location.get('length'))\n                        mention = preprocess(p_child.find('text').text)\n                        identifier = p_child.findall('infon')[0].text\n\n                        mutations.append({'start': int(location.get('offset')),\n                                          'end': end_offset,\n                                          'mention': mention,\n                                          'mutationType': entity_type,\n                                          'normalizedName': identifier})\n\n        if len(mutations) > 1:\n            mutations = sorted(mutations, key=itemgetter('start'))\n\n        title = preprocess(text_dict['title'])\n        abstr = preprocess(text_dict['abstract'])\n\n        # a title, a space and an abstract\n        if len(abstr) > 0:\n            mutations = get_bestplus_spans(mutations, title + ' ' + abstr)\n        else:\n            mutations = get_bestplus_spans(mutations, title)\n\n        doc_dict = {\n            'pmid': pubmed_id,\n            'mutation_model': 'tmtool tmVar biocxml',\n            'entities': {'mutation': mutations},\n            'title': title,\n            'abstract': abstr\n        }\n\n        temp_dict[pubmed_id] = doc_dict\n\n    dict_list = list()\n    empty_list = list()\n    for pmid in pmids:\n        if type(pmid) is int:\n            pmid = str(pmid)\n\n        if pmid not in temp_dict:\n            dict_list.append(\n                {\n                    'pmid': pmid,\n                    'mutation_model': 'tmtool tmVar biocxml',\n                    'entities': {'mutation': empty_list},\n                    'title': '',\n                    'abstract': ''\n                }\n            )\n        else:\n            dict_list.append(temp_dict[pmid])\n\n    return dict_list\n\n\ndef preprocess(text):\n    text = text.replace('\\r ', ' ')\n\n    text = text.replace('\\u2028', ' ')\n    text = text.replace('\\u2029', ' ')\n\n    # HAIR SPACE\n    # https://www.fileformat.info/info/unicode/char/200a/index.htm\n    text = text.replace('\\u200A', ' ')\n\n    # THIN SPACE\n    # https://www.fileformat.info/info/unicode/char/2009/index.htm\n    text = text.replace('\\u2009', ' ')\n    text = text.replace('\\u2008', ' ')\n\n    # FOUR-PER-EM SPACE\n    # https://www.fileformat.info/info/unicode/char/2005/index.htm\n    text = text.replace('\\u2005', ' ')\n    text = text.replace('\\u2004', ' ')\n    text = text.replace('\\u2003', ' ')\n\n    # EN SPACE\n    # https://www.fileformat.info/info/unicode/char/2002/index.htm\n    text = text.replace('\\u2002', ' ')\n\n    # NO-BREAK SPACE\n    # https://www.fileformat.info/info/unicode/char/00a0/index.htm\n    text = text.replace('\\u00A0', ' ')\n\n    # https://www.fileformat.info/info/unicode/char/f8ff/index.htm\n    text = text.replace('\\uF8FF', ' ')\n\n    # https://www.fileformat.info/info/unicode/char/202f/index.htm\n    text = text.replace('\\u202F', ' ')\n\n    text = text.replace('\\uFEFF', ' ')\n    text = text.replace('\\uF044', ' ')\n    text = text.replace('\\uF02D', ' ')\n    text = text.replace('\\uF0BB', ' ')\n\n    text = text.replace('\\uF048', 'Η')\n    text = text.replace('\\uF0B0', '°')\n\n    # MIDLINE HORIZONTAL ELLIPSIS: ⋯\n    # https://www.fileformat.info/info/unicode/char/22ef/index.htm\n    # text = text.replace('\\u22EF', '...')\n\n    return text\n\n\ndef pubtator2pubannotation(pubtator):\n    dict_list = list()\n\n    title_pmid = ''\n    abstract_pmid = ''\n    title = ''\n    abstract_text = ''\n    doc_line_num = 0\n    entities = list()\n\n    for line in pubtator.splitlines():\n        if len(line) == 0:\n\n            if title_pmid != abstract_pmid:\n                return '{\"error\": \"pmid disagreement\"}'\n\n            doc_dict = {\n                'project': 'BERN',\n                'sourcedb': 'PubMed',\n                'sourceid': title_pmid,\n                'denotations': copy.deepcopy(entities),\n                'text': title + ' ' + abstract_text\n            }\n\n            dict_list.append(doc_dict)\n\n            doc_line_num = 0\n            entities.clear()\n            continue\n\n        if doc_line_num == 0:\n            title_cols = line.split('|t|')\n\n            if len(title_cols) != 2:\n                return '{\"error\": \"wrong #title_cols=%d\", \"line\": \"%s\"}' \\\n                       % (len(title_cols), line)\n\n            title_pmid = title_cols[0]\n\n            if '- No text -' == title_cols[1]:\n                # make tmvar2 results empty\n                title = ''\n            else:\n                title = title_cols[1]\n        elif doc_line_num == 1:\n            abstract_cols = line.split('|a|')\n\n            if len(abstract_cols) != 2:\n                return \\\n                    '{\"error\": \"wrong #abstract_cols %d\"}' % len(abstract_cols)\n\n            abstract_pmid = abstract_cols[0]\n\n            if '- No text -' == abstract_cols[1] \\\n                    or '-NoAbstract-' == abstract_cols[1]:\n                # make tmvar2 results empty\n                abstract_text = ''\n            else:\n                abstract_text = abstract_cols[1]\n        elif doc_line_num > 1:\n            entity_cols = line.split('\\t')\n\n            if len(entity_cols) != 6:\n                return '{\"error\": \"wrong #mutation_cols %d\"}' % len(entity_cols)\n\n            if entity_cols[4] in entity_cols:\n                entities.append({'obj': entity_cols[4],\n                                 'id': entity_cols[5].split('|'),\n                                 'span': {\n                                     'begin': int(entity_cols[1]),\n                                     'end': int(entity_cols[2])\n                                 }})\n\n        doc_line_num += 1\n    return dict_list\n\n\ndef get_bestplus_spans(mutations, title_space_abstract):\n    adjusted_mutations = list()\n\n    mention_count_dict = dict()\n    for m in mutations:\n\n        if 'No text' in m['mention']:\n            continue\n\n        if m['mention'] in mention_count_dict:\n            mention_count_dict[m['mention']] += 1\n        else:\n            mention_count_dict[m['mention']] = 1\n\n        count = mention_count_dict[m['mention']]\n\n        start = -1\n        found = 0\n        while found < count:\n            start = title_space_abstract.index(m['mention'], start + 1)\n            assert start > -1\n            found += 1\n\n        end = start + len(m['mention']) - 1  # 2018.8.29 @chanho feedback\n\n        assert m['mention'] == title_space_abstract[start: end + 1]\n\n        adjusted_mutations.append({'start': start,\n                                   'end': end,\n                                   'mention': m['mention'],\n                                   'mutationType': m['mutationType'],\n                                   'normalizedName': m['normalizedName']})\n\n    return adjusted_mutations\n\n\n# Ref.\n# http://pubannotation.org/docs/sourcedb/PubMed/sourceid/10022882/spans/606-710/annotations.json\n# http://www.pubannotation.org/docs/annotation-format/\ndef get_pub_annotation(bern_dict, is_raw_text, elapsed_time_dict=None):\n    sourceid = bern_dict['pmid']\n\n    if is_raw_text:\n        sourcedb = ''\n        text = bern_dict['abstract']\n    else:\n        sourcedb = 'PubMed'\n        if len(bern_dict['abstract']) > 0:\n            if len(bern_dict['title']) > 0:\n                text = bern_dict['title'] + ' ' + bern_dict['abstract']\n            else:\n                text = bern_dict['abstract']\n        else:\n            text = bern_dict['title']\n\n    pa_dict = {\n        'project': 'BERN',\n        # 'target': '',\n        'sourcedb': sourcedb,\n        'sourceid': sourceid,\n        'text': text,\n        'denotations': bern2pub_annotation(bern_dict['entities']),\n        # 'tracks': [{\n        #     'project': 'BERN',\n        #     'denotations': bern2pub_annotation(bern_dict['entities'])\n        # }]\n        'timestamp': datetime.now(tz=timezone.utc).strftime(\n            '%a %b %d %H:%M:%S %z %Y')\n    }\n\n    if 'logits' in bern_dict:\n        pa_dict['logits'] = bern_dict['logits']\n\n    if elapsed_time_dict is not None:\n        pa_dict['elapsed_time'] = elapsed_time_dict\n\n    return pa_dict\n\n\ndef bern2pub_annotation(entity_dict):\n    entity_list = list()\n    for etype in entity_dict:\n        for entity in entity_dict[etype]:\n\n            # TODO prevention in the previous step\n            if 'id' not in entity:\n                entity['id'] = ['CUI-less']\n\n            assert 'id' in entity, \\\n                '{}, entity={}, entity_dict={}'.format(\n                    etype, entity, entity_dict)\n            assert 'start' in entity and 'end' in entity, \\\n                '{}, entity={}, entity_dict={}'.format(\n                    etype, entity, entity_dict)\n\n            if '\\t' in entity['id']:\n                eid = entity['id'].split('\\t')\n            else:\n                eid = [entity['id']]\n\n            entity_pa_dict = {\n                'id': eid,\n                'span': {\n                    'begin': entity['start'],\n                    'end': entity['end']\n                },\n                'obj': etype\n            }\n\n            if 'mutation' == etype:\n\n                assert 'mutationType' in entity \\\n                       and 'normalizedName' in entity, \\\n                    '{}, entity={}, entity_dict={}'.format(\n                        etype, entity, entity_dict)\n\n                entity_pa_dict['mutationType'] = entity['mutationType']\n                entity_pa_dict['normalizedName'] = entity['normalizedName']\n\n            entity_list.append(entity_pa_dict)\n\n    # sort by span begin\n    def get_item_key1(item):\n        return item['span']['begin']\n\n    def get_item_key2(item):\n        return item['obj']\n\n    return sorted(sorted(entity_list, key=get_item_key2), key=get_item_key1)\n\n\ndef get_pubtator(bern_dict_list):\n    result = ''\n    for bd in bern_dict_list:\n        text = bd['title'] + ' ' + bd['abstract']\n\n        main = bd['pmid'] + '|t|' + bd['title'] + '\\n' + \\\n            bd['pmid'] + '|a|' + bd['abstract']\n\n        # sort by start\n        sorted_entities = list()\n\n        for etype in bd['entities']:\n            for entity in bd['entities'][etype]:\n                mention = text[entity['start']: entity['end']]\n                sorted_entities.append(\n                    [entity['start'], entity['end'], mention, etype,\n                     '|'.join(entity['id'].split('\\t'))])\n\n        sorted_entities = sorted(sorted_entities, key=itemgetter(0))\n\n        entities = ''\n        for e in sorted_entities:\n            entities += '{}\\t{}\\t{}\\t{}\\t{}\\t{}\\n'.format(\n                bd['pmid'], e[0], e[1], e[2], e[3], e[4])\n\n        result += main + '\\n' + entities + '\\n'\n\n    return result\n\n\ndef tmtooljson2bern(tmtool_res):\n    tmtool_dicts = json.loads(tmtool_res)\n\n    bern_dicts = list()\n\n    for td in tmtool_dicts:\n        mutations = list()\n        for d in td['denotations']:\n            mention = td['text'][d['span']['begin']: d['span']['end']]\n            d['span']['end'] += 1\n            mutations.append({\n                'start': d['span']['start'],\n                'end': d['span']['end'],\n                'mention': mention,\n                'normalizedName': d['obj'].replace('Mutation:', '')\n            })\n\n        doc_dict = {\n            'pmid': td['sourceid'],\n            'text': td['text'],\n            'entities': {'mutation': mutations}\n        }\n\n        bern_dicts.append(doc_dict)\n\n    return bern_dicts\n\n\nif __name__ == '__main__':\n    # xmlerr, xmlvalid = query_pubtator2biocxml('21660500')\n    # print(xmlerr)\n    # print(xmlvalid)\n    # ElTree.fromstring(xmlvalid)\n    # try:\n    #     ElTree.fromstring(xmlerr)\n    # except ElTree.ParseError as parsee:\n    #     print(parsee.msg)\n    #\n    # dl = pubtator_biocxml2dict_list([21660500])\n    # print(dl)\n\n    dl = pubtator_biocxml2dict_list([21581243])\n    for doc in dl:\n        print(doc)\n        print(doc['pmid'])\n        print(doc['title'])\n        abst = doc['abstract']\n        print(abst)\n"
  },
  {
    "path": "download.py",
    "content": "import ftplib\nimport html\nimport json\nimport os\nimport requests\nimport ssl\nimport tarfile\nimport time\nimport urllib.request\nfrom urllib.parse import urlparse\nimport xmltodict\nfrom collections import OrderedDict\n\n\ndef get_pubmed_xml(pmid, output_path=None):\n    # https://www.codementor.io/aviaryan/downloading-files-from-urls-in-python-77q3bs0un\n    try:\n        r = requests.get('https://www.ncbi.nlm.nih.gov/pubmed/'\n                         '{}?report=xml&format=text'.format(pmid),\n                         allow_redirects=True)\n    except requests.exceptions.ConnectionError as ce:\n        print('ConnectionError', pmid, ce)\n        return None\n\n    text = r.text\n    text = html.unescape(text)\n\n    if '<PMID' not in text and '</PMID>' not in text:\n        print('Not found pmid:', pmid)\n        return None\n\n    real_output_path = './pubmed/{}.xml'.format(pmid)\n    if output_path is not None:\n        real_output_path = output_path\n\n    if not os.path.exists(os.path.dirname(real_output_path)):\n        os.makedirs(os.path.dirname(real_output_path))\n\n    with open(real_output_path, 'w', encoding='utf-8') as f:\n        f.write(text)\n\n    return real_output_path\n\n\ndef pubmed_xml2pubtator(pmid, xml_path, output_path=None):\n    # print(xml_path)\n    with open(xml_path, 'r', encoding='utf-8') as fd:\n        doc = xmltodict.parse(fd.read())\n    pre = doc['pre']\n\n    if 'PubmedArticle' in pre:\n        article = pre['PubmedArticle']['MedlineCitation']['Article']\n    elif 'PubmedBookArticle' in pre:\n        article = pre['PubmedBookArticle']['BookDocument']\n    else:\n        raise ValueError(pmid)\n\n    title = article.get('ArticleTitle')\n    if title is None:\n        if 'PubmedBookArticle' in pre:\n            title = \\\n                pre['PubmedBookArticle']['BookDocument']['Book']['BookTitle']\n    if type(title) is OrderedDict:\n        title = title['#text']\n\n    abstract_zone = article.get('Abstract')\n    if abstract_zone is None:\n        print('No abstract pmid:', pmid)\n        return None\n\n    abstract = ''\n    for abstract_text in abstract_zone:\n        if abstract_text == 'CopyrightInformation':\n            continue\n\n        abst_element = abstract_zone[abstract_text]\n\n        if type(abst_element) is str:\n            if len(abstract) > 0:\n                abstract += ' '\n\n            abstract += abst_element\n        elif type(abst_element) is list:\n            for od in abst_element:\n                if type(od) is str:\n                    if len(abstract) > 0:\n                        abstract += ' '\n                    abstract += od\n                elif type(od) is OrderedDict:\n                    if '#text' in od:\n                        if len(abstract) > 0:\n                            abstract += ' '\n                        abstract += od['#text']\n                else:\n                    print('Unknown abstract element type', type(od))\n                    if len(abstract) > 0:\n                        abstract += ' '\n                    abstract += str(od)\n\n    abstract = replace_wspaces(abstract)\n\n    real_output_path = './pubmed_pubtator/{}.PubTator'.format(pmid)\n    if output_path is not None:\n        real_output_path = output_path\n    if not os.path.exists(os.path.dirname(real_output_path)):\n        os.makedirs(os.path.dirname(real_output_path))\n\n    with open(real_output_path, 'w', encoding='utf-8') as f_pub:\n        f_pub.write('{}|t|{}\\n'.format(pmid, title))\n        f_pub.write('{}|a|{}\\n'.format(pmid, abstract))\n        f_pub.write('\\n')\n    print('Saved {}'.format(real_output_path))\n\n    return real_output_path\n\n\ndef get_pmc_xml(pmcid, output_path=None):\n    # get a ftp address from\n    # https://www.ncbi.nlm.nih.gov/pmc/utils/oa/oa.fcgi?id=<pmcid>\n    r = requests.get('https://www.ncbi.nlm.nih.gov/pmc/'\n                     'utils/oa/oa.fcgi?id={}'.format(pmcid),\n                     allow_redirects=True)\n    text = r.text\n\n    real_output = './pmc/{}.xml'.format(pmcid)\n    if output_path is not None:\n        real_output = output_path\n\n    if not os.path.exists(os.path.dirname(real_output)):\n        os.makedirs(os.path.dirname(real_output))\n\n    doc = xmltodict.parse(text)\n    oa = doc['OA']\n    if 'records' not in oa:\n        print('Not found pmcid:', pmcid)\n        return None\n\n    with open(real_output, 'w') as f:\n        f.write(text)\n\n    xml_path = None\n    real_output_dir = os.path.dirname(real_output)\n    records = oa['records']\n    record = records['record']\n    link = record['link']\n    href = None\n    if type(link) is OrderedDict:\n        href = link['@href']\n    elif type(link) is list:\n        for l in link:\n            if l['@format'] != 'tgz':\n                continue\n            href = l['@href']\n\n    if href is None:\n        print('Not found href: pmcid:', pmcid)\n        return None\n\n    print('Download', href)\n    tar_filename = download_ftp(href, real_output_dir)\n\n    tar = tarfile.open('./pmc/{}'.format(tar_filename))\n    tar.extractall(path='./pmc/')\n    tar.close()\n\n    # retain only .nxml to save disk space\n    tar_dir = tar_filename.replace('.tar.gz', '')\n    for f in os.listdir('./pmc/{}'.format(tar_dir)):\n        f_path = os.path.join(real_output_dir, tar_dir, f)\n        fname, ext = os.path.splitext(f)\n        if ext != '.nxml':\n            os.remove(f_path)\n        else:\n            xml_path = f_path\n\n    return xml_path\n\n\ndef pmc_xml2pubtator(pmcid, xml_path, output_path=None):\n    with open(xml_path, 'r') as fd:\n        doc = xmltodict.parse(fd.read())\n\n    article = doc['article']\n    front = article['front']\n    title = front['article-meta']['title-group']['article-title']\n\n    body_text = ''\n\n    if 'abstract' in front['article-meta']:\n        abstract = front['article-meta']['abstract']\n        if 'p' in abstract:\n            if type(abstract['p']) is str:\n                if len(body_text) > 0:\n                    body_text += ' '\n                body_text += abstract['p']\n            elif type(abstract['p']) is OrderedDict:\n                if '#text' in abstract['p']:\n                    if len(body_text) > 0:\n                        body_text += ' '\n                    body_text += abstract['p']['#text']\n                else:\n                    print('No #text abstract p:', pmcid)\n            elif type(abstract['p']) is list:\n                for ap in abstract['p']:\n                    if type(ap) is OrderedDict:\n                        if '#text' in ap:\n                            if len(body_text) > 0:\n                                body_text += ' '\n                            body_text += ap['#text']\n                        else:\n                            print('No #text abstract p list', pmcid)\n                    elif type(ap) is str:\n                        if len(body_text) > 0:\n                            body_text += ' '\n                        body_text += ap\n            else:\n                print('Unknown abstract type:', type(abstract['p']), pmcid)\n\n        if 'sec' in abstract:\n            if type(abstract['sec']) is list:\n                for sec in abstract['sec']:\n                    if 'p' in sec:\n                        if type(sec['p']) is OrderedDict:\n                            if '#text' in sec['p']:\n                                if len(body_text) > 0:\n                                    body_text += ' '\n                                body_text += sec['p']['#text']\n                            else:\n                                print('No #text abst sec p:', pmcid)\n                        elif type(sec['p']) is str:\n                            if len(body_text) > 0:\n                                body_text += ' '\n                            body_text += sec['p']\n                        else:\n                            print('No #text abst sec p:', pmcid)\n            elif type(abstract['sec']) is OrderedDict:\n                if 'p' in abstract['sec']:\n                    if len(body_text) > 0:\n                        body_text += ' '\n                    body_text += abstract['sec']['p']\n                else:\n                    print('No p in abstract sec:', pmcid)\n\n        # PMC2930000\n        if type(abstract) is list:\n            for abst in abstract:\n                if 'p' in abst:\n                    if type(abst['p']) is str:\n                        if len(body_text) > 0:\n                            body_text += ' '\n                        body_text += abst['p']\n                    elif type(abst['p']) is OrderedDict:\n                        if '#text' in abst['p']:\n                            if len(body_text) > 0:\n                                body_text += ' '\n                            body_text += abst['p']['#text']\n                        elif 'list' in abst['p']:\n                            abst_p_lst = abst['p']['list']\n                            if type(abst_p_lst) is OrderedDict:\n                                if 'list-item' in abst_p_lst:\n                                    for abst_p_lst_e in abst_p_lst['list-item']:\n                                        if len(body_text) > 0:\n                                            body_text += ' '\n                                        body_text += abst_p_lst_e['p']\n\n                        else:\n                            print('No #text abst list p:', pmcid)\n                    elif type(abst['p']) is list:\n                        # PMC5050000\n                        pass\n                    else:\n                        print('Unknown type', type(abst['p']), pmcid)\n                elif 'sec' in abst:\n                    if type(abst['sec']) is list:\n                        for abstsec in abst['sec']:\n                            if type(abstsec) is OrderedDict:\n                                if 'p' in abstsec:\n                                    if type(abstsec['p']) is str:\n                                        if len(body_text) > 0:\n                                            body_text += ' '\n                                        body_text += abstsec['p']\n                                    elif type(abstsec['p']) is OrderedDict:\n                                        if '#text' in abstsec['p']:\n                                            if len(body_text) > 0:\n                                                body_text += ' '\n                                            body_text += abstsec['p']['#text']\n                                        else:\n                                            print('No #text abstsec p:',\n                                                  pmcid)\n        if 'p' not in abstract and 'sec' not in abstract \\\n                and len(body_text) == 0:\n            print('No sec and p abstract', pmcid)\n\n    if 'body' in article:\n        # PMC2500000 (WIP)\n        if 'sec' in article['body']:\n            if type(article['body']['sec']) is list:\n                for sec in article['body']['sec']:\n                    if 'p' in sec:\n                        for p in sec['p']:\n                            # PMC3600000\n                            if type(p) is OrderedDict:\n                                if '#text' in p:\n                                    if len(body_text) > 0:\n                                        body_text += ' '\n                                    body_text += p['#text']\n                                else:\n                                    if 'ext-link' not in p \\\n                                            and 'disp-formula' not in p \\\n                                            and 'bold' not in p \\\n                                            and 'table-wrap' not in p \\\n                                            and 'fig' not in p:\n                                        print('No sec p #text', type(p), pmcid)\n                            elif type(p) is str:\n                                if len(body_text) > 0:\n                                    body_text += ' '\n                                body_text += p\n                            else:\n                                print('Unknown type', type(p), pmcid)\n                    elif 'sec' in sec:\n                        if type(sec['sec']) is list:\n                            for ss in sec['sec']:\n                                if 'p' in ss:\n                                    if type(ss['p']) is OrderedDict:\n                                        if '#text' in ss['p']:\n                                            if len(body_text) > 0:\n                                                body_text += ' '\n                                            body_text += ss['p']['#text']\n                                        else:\n                                            print('No ss p #text', pmcid)\n                                    elif type(ss['p']) is list:\n                                        for ssp in ss['p']:\n                                            if type(ssp) is OrderedDict:\n                                                if '#text' in ssp:\n                                                    if len(body_text) > 0:\n                                                        body_text += ' '\n                                                    body_text += ssp['#text']\n                                                elif 'table-wrap' in ssp:\n                                                    pass\n                                                elif 'fig' in ssp:\n                                                    pass\n                                                else:\n                                                    print('No ssp #text', pmcid)\n                                            elif type(ssp) is str:\n                                                if len(body_text) > 0:\n                                                    body_text += ' '\n                                                body_text += ssp\n                                            else:\n                                                print('Unknown ssp type:',\n                                                      type(ssp), pmcid)\n                        elif type(sec['sec']) is OrderedDict:\n                            # PMC3790000\n                            if 'sec' in sec['sec']:\n                                if type(sec['sec']['sec']) is OrderedDict:\n                                    # TODO\n                                    pass\n                        else:\n                            print('Unknown sec type:', type(sec['sec']), pmcid)\n                    elif 'supplementary-material' in sec:\n                        # PMC1940000\n                        print('No sec and p but supplementary-material', pmcid)\n                        # TODO supp\n                    else:\n                        print('Unknown type: No sec, p, supp', pmcid)\n            elif type(article['body']['sec']) is OrderedDict:\n                if 'sec' in article['body']['sec']:\n                    if type(article['body']['sec']['sec']) is list:\n                        for bss in article['body']['sec']['sec']:\n                            if 'p' in bss:\n                                if type(bss['p']) is list:\n                                    for bssp in bss['p']:\n                                        if '#text' in bssp:\n                                            if len(body_text) > 0:\n                                                body_text += ' '\n                                            body_text += bssp['#text']\n                                        else:\n                                            print('No bssp #text', pmcid)\n\n        elif 'p' in article['body']:\n            paragraphs = article['body']['p']\n            for p in paragraphs:\n                if type(p) is OrderedDict:\n                    if '#text' in p:\n                        p_text = p['#text']\n                    else:\n                        print('No p #text', type(p), pmcid)\n                        p_text = ''\n                elif type(p) is str:\n                    p_text = p\n                else:\n                    print('Unknown type', type(p), pmcid)\n                    p_text = str(p)\n\n                if len(body_text) > 0 and len(p_text) > 0:\n                    body_text += ' '\n                body_text += p_text\n        elif 'supplementary-material' in article['body']:\n            # PMC1140000, PMC1520000, PMC 2010000\n            print('No sec and p but supplementary-material', pmcid)\n        else:\n            print('Unknown doc type', pmcid)\n    else:\n        # PMC2200000\n        print('Unknown doc type: no body', pmcid)\n\n    body_text = replace_wspaces(body_text)\n\n    if len(title) == 0:\n        print('Empty title', pmcid)\n\n    if len(body_text) == 0:\n        print('Empty body', pmcid)\n\n    real_output_path = './pmc_pubtator/{}.PubTator'.format(pmcid)\n    if output_path is not None:\n        real_output_path = output_path\n    if not os.path.exists(os.path.dirname(real_output_path)):\n        os.makedirs(os.path.dirname(real_output_path))\n\n    with open(real_output_path, 'w', encoding='utf-8') as f_pub:\n        f_pub.write('{}|t|{}\\n'.format(pmcid, title))\n        f_pub.write('{}|a|{}\\n'.format(pmcid, body_text))\n        f_pub.write('\\n')\n    print('Saved {}'.format(real_output_path))\n\n\ndef get_pmc_archive(non_comm_use_pdf, non_comm_output_dir,\n                    comm_use_file_list, comm_output_dir, overwrite=False,\n                    n_threads=8):\n    import threading\n    from queue import Queue\n\n    # ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_non_comm_use_pdf.txt\n    # ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_comm_use_file_list.txt\n\n    if not os.path.exists(non_comm_output_dir):\n        os.makedirs(non_comm_output_dir)\n\n    if not os.path.exists(comm_output_dir):\n        os.makedirs(comm_output_dir)\n\n    num_non_comm = 0\n    num_comm = 0\n\n    # start_t = time.time()\n\n    ftp = ftplib.FTP('ftp.ncbi.nlm.nih.gov')\n    ftp.login()\n\n    #\n    def worker():\n        while True:\n            item = q.get(block=True, timeout=None)\n            if item is None:\n                break\n            download_ftp(item[0], item[1], overwrite=overwrite)\n            q.task_done()\n\n    q = Queue()\n    threads = list()\n    for _ in range(n_threads):\n        t = threading.Thread(target=worker)\n        t.daemon = True\n        t.start()\n        threads.append(t)\n\n    with open(non_comm_use_pdf, 'r', encoding='utf-8') as f:\n        for idx, line in enumerate(f):\n            cols = line.split()\n            if len(cols) < 5:\n                continue\n            q.put(('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/' + cols[0],\n                   non_comm_output_dir))\n\n    q.join()\n\n    # stop workers\n    for i in range(n_threads):\n        q.put(None)\n\n    # block until all tasks are done\n    for t in threads:\n        t.join()\n\n    start_t = time.time()\n    with open(comm_use_file_list, 'r', encoding='utf-8') as f:\n        for idx, line in enumerate(f):\n            cols = line.split()\n            if len(cols) < 5:\n                continue\n\n            href = 'ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/' + cols[0]\n            if num_comm % 10 == 0:\n                print(idx, num_comm, 'comm Download', href,\n                      '{:.2f} doc/sec'.format(\n                          num_comm/(time.time()-start_t)))\n\n            pr = urlparse(href)\n            # print(pr.netloc, pr.path)\n            path2file, filename = os.path.split(pr.path)\n            target_file_name = os.path.join(comm_output_dir, filename)\n            if not overwrite and os.path.exists(target_file_name):\n                continue\n            ftp.cwd(path2file)\n            with open(target_file_name, 'wb') as fhandle:\n                ftp.retrbinary('RETR %s' % filename, fhandle.write,\n                               blocksize=8192*4)\n\n            num_comm += 1\n\n    ftp.quit()\n\n    print(num_non_comm)\n    print(num_comm)\n\n\ndef download_ftp(url, output_dir, overwrite=True):\n    pr = urlparse(url)\n    ftp = ftplib.FTP(pr.netloc)\n    ftp.login()\n    path2file, filename = os.path.split(pr.path)\n    ftp.cwd(path2file)\n    target_file_name = os.path.join(output_dir, filename)\n    if not overwrite and os.path.exists(target_file_name):\n        return filename\n    with open(target_file_name, 'wb') as fhandle:\n        ftp.retrbinary('RETR %s' % filename, fhandle.write)\n    return filename\n\n\ndef get_pubmed(pmid, out_format='json', encoding='unicode'):\n    # https://www.ncbi.nlm.nih.gov/research/bionlp/RESTful/pubmed.cgi/BioC_json/17299597/unicode\n    try:\n        r = requests.get('https://www.ncbi.nlm.nih.gov/research/bionlp/'\n                         'RESTful/pubmed.cgi/BioC_{}/{}/{}'\n                         .format(out_format, pmid, encoding),\n                         allow_redirects=True)\n    except requests.exceptions.ConnectionError as ce:\n        print('ConnectionError', pmid, ce)\n        return None\n\n    return r.text\n\n\ndef query_tmtool(pmids, entity_type='Mutation', out_format='JSON'):\n    if type(pmids) is list:\n        pmids = ','.join([str(pmid) for pmid in pmids])\n\n    try:\n        r = requests.get('https://www.ncbi.nlm.nih.gov/CBBresearch/Lu/Demo/'\n                         'RESTful/tmTool.cgi/{}/{}/{}/'\n                         .format(entity_type, pmids, out_format),\n                         allow_redirects=True)\n    except requests.exceptions.ConnectionError as ce:\n        print('ConnectionError', pmids, ce)\n        return None\n\n    return r.text\n\n\ndef query_pubtator2(pmids, out_format='pubtator', escape_html=True):\n    if type(pmids) is list:\n        pmids = ','.join([str(pmid) for pmid in pmids])\n\n    # https://www.ncbi.nlm.nih.gov/research/bionlp/pubtator2/api/v1/publications/export/pubtator?pmids=29446767,25681199\n    try:\n        r = requests.get('https://www.ncbi.nlm.nih.gov/research/bionlp/'\n                         'pubtator2/api/v1/publications/export/'\n                         '{}?pmids={}'\n                         .format(out_format, pmids),\n                         allow_redirects=True)\n    except requests.exceptions.ConnectionError as ce:\n        print('ConnectionError', pmids, ce)\n        return None\n\n    if escape_html:\n        return html.unescape(r.text)\n    return r.text\n\n\ndef query_pubtator2biocxml(pmids):\n    if type(pmids) is list:\n        pmids = ','.join([str(pmid) for pmid in pmids])\n\n    # https://www.ncbi.nlm.nih.gov/research/pubtator-api/publications/export/biocxml?pmids=29446767,25681199\n    try:\n        r = requests.get('https://www.ncbi.nlm.nih.gov/research/'\n                         'pubtator-api/publications/export/'\n                         'biocxml?pmids={}'\n                         .format(pmids),\n                         allow_redirects=True)\n    except requests.exceptions.ConnectionError as ce:\n        print('ConnectionError', pmids, ce)\n        return None\n\n    r.encoding = 'utf-8'\n    return html.unescape(r.text), r.text\n\n\n# Ref.\n# https://www.ncbi.nlm.nih.gov/CBBresearch/Lu/Demo/tmTools/download/RESTfulAPI.client.zip\ndef query_raw_tmtool(input_str, trigger='tmVar'):\n    url_submit = \"https://www.ncbi.nlm.nih.gov/CBBresearch/Lu/Demo/\" \\\n                 \"RESTful/tmTool.cgi/\" + trigger + \"/Submit/\"\n    urllib_submit = urllib.request.urlopen(url_submit,\n                                           input_str.encode('utf-8'))\n    # urllib_result = urllib.request.urlopen(url_submit,\n    #                                        input_str.encode('utf-8'))\n    session_number = urllib_submit.read().decode('utf-8')\n    url_receive = \"https://www.ncbi.nlm.nih.gov/CBBresearch/Lu/Demo/\" \\\n                  \"RESTful/tmTool.cgi/\" + session_number + \"/Receive/\"\n\n    urllib_result = None\n    try_cnt = 1\n\n    code = 404\n    while code == 404 or code == 501:\n        time.sleep(0.5)\n        print('{}\\t{}'.format(try_cnt, url_receive))\n        try_cnt += 1\n        try:\n            urllib_result = urllib.request.urlopen(url_receive)\n        except urllib.request.HTTPError as e:\n            code = e.code\n        except urllib.request.URLError:\n            code = urllib_submit.code\n        else:\n            code = urllib_result.getcode()\n\n    if urllib_result is not None:\n        return urllib_result.read().decode('utf-8')\n\n    return None\n\n\ndef query_raw_bern(input_str, bern_post_url='https://bern.korea.ac.kr/plain'):\n    input_dict = {'text': input_str}\n\n    # context = ssl._create_unverified_context()\n\n    # http://www.hanul93.com/malwares-api-urllib2/\n    ctxt = ssl.create_default_context()\n    ctxt.check_hostname = False\n    ctxt.verify_mode = ssl.CERT_NONE\n\n    urllib_result = \\\n        urllib.request.urlopen(bern_post_url,\n                               json.dumps(input_dict).encode('utf-8'),\n                               context=ctxt)\n\n    return urllib_result.read().decode('utf-8')\n\n\ndef replace_wspaces(t):\n    t = t.replace('\\r', '')\n    t = t.replace('\\n', ' ')\n    t = t.replace('\\t', ' ')\n    t = t.replace(' \\u2028 ', ' ')\n    t = t.replace('\\u2029', ' ')\n    return t\n\n\nif __name__ == '__main__':\n    from convert import pubtator_biocxml2dict_list\n\n    # testpmids = [25681199, 29446767]\n    testpmids = [29446767, 25681199]\n    # print(query_pubtator2([29446767,25681199]))\n    # print(query_pubtator2([25681199]))\n    print(pubtator_biocxml2dict_list(testpmids))\n\n    import sys\n    sys.exit(0)\n\n    get_pmc_archive(\n        os.path.expanduser('~') + '/bestplus/pmc/oa_non_comm_use_pdf.txt',\n        os.path.expanduser('~') + '/bestplus/pmc/non_comm',\n        os.path.expanduser('~') + '/bestplus/pmc/oa_comm_use_file_list.txt',\n        os.path.expanduser('~') + '/bestplus/pmc/comm'\n    )\n\n    from convert import pubtatorstr2dict_list\n\n    # raw texts & demo\n    bern_raw_res = query_raw_bern('Results We identified five activating mutations in the PIK3CA gene in affected tissues from 6 of the 9 patients studied; one of the variants (NM_006218.2:c.248T>C; p.Phe83Ser) has not been previously described in developmental disorders.')\n    print(bern_raw_res)\n\n    # api\n    tmtool_format = 'PubTator'\n    tmtool_res = query_tmtool([29446767,25681199], out_format=tmtool_format)\n    dict_list = pubtatorstr2dict_list(tmtool_res, is_raw_text=False)\n    print(dict_list)\n\n    # # demo\n    # tmtool_res = query_raw_tmtool('CLAPO syndrome: identification of somatic activating PIK3CA mutations and delineation of the natural history and phenotype. Purpose CLAPO syndrome is a rare vascular disorder characterized by capillary malformation of the lower lip, lymphatic malformation predominant on the face and neck, asymmetry, and partial/generalized overgrowth. Here we tested the hypothesis that, although the genetic cause is not known, the tissue distribution of the clinical manifestations in CLAPO seems to follow a pattern of somatic mosaicism. Methods We clinically evaluated a cohort of 13 patients with CLAPO and screened 20 DNA blood/tissue samples from 9 patients using high-throughput, deep sequencing. Results We identified five activating mutations in the PIK3CA gene in affected tissues from 6 of the 9 patients studied; one of the variants (NM_006218.2:c.248T>C; p.Phe83Ser) has not been previously described in developmental disorders. Conclusion We describe for the first time the presence of somatic activating PIK3CA mutations in patients with CLAPO. We also report an update of the phenotype and natural history of the syndrome. GENETICS in MEDICINE advance online publication, 15 February 2018; doi:10.1038/gim.2017.200.')\n    # dict_list = pubtatorstr2dict_list(tmtool_res, is_raw_text=True)\n    # print(dict_list)\n\n    # tmtool_res, tmtool_format = query_tmtool(29446767, out_format='PubTator')\n    # tmtool2bern(tmtool_res, tmtool_format=tmtool_format, is_raw_text=True)\n\n\n\n    # pubmed_baseid = 626800\n    # pubmed_path = get_pubmed_xml(pubmed_baseid)\n    # if pubmed_path is not None:\n    #     pubmed_xml2pubtator(pubmed_baseid, pubmed_path)\n    # for pubmedid in range(pubmed_baseid, 29999999, 100):\n    #     pubmed_path = get_pubmed_xml(pubmedid)\n    #     if pubmed_path is not None:\n    #         pubmed_xml2pubtator(pubmedid, pubmed_path)\n    # get_pubmed_xml('sadrfasd')\n\n    # pmc_path = get_pmc_xml('PMC6137033')\n    # pmc_xml2pubtator('PMC6137033', pmc_path)\n\n    # pmc_baseid = 6050000\n    # for pmcidbase in range(pmc_baseid, 6299999, 10000):\n    #     pmc_id = 'PMC{}'.format(pmcidbase)\n    #     pmc_path = get_pmc_xml(pmc_id)\n    #     if pmc_path is not None:\n    #         pmc_xml2pubtator(pmc_id, pmc_path)\n    # get_pmc_xml('PMC131')\n"
  },
  {
    "path": "load_dicts.sh",
    "content": "#!/bin/bash\n\nnohup python3 normalizers/chemical_normalizer.py >> logs/nohup_drug_normalize.out 2>&1 &\nnohup python3 normalizers/species_normalizer.py >> logs/nohup_species_normalize.out 2>&1 &\nnohup python3 normalizers/mutation_normalizer.py >> logs/nohup_mutation_normalize.out 2>&1 &\n\n# Disease (working dir: normalization/)\ncd normalization\nnohup java -Xmx16G -jar resources/normalizers/disease/disease_normalizer_19.jar >> ../logs/nohup_disease_normalize.out 2>&1 &\n\n# Gene (working dir: normalization/resources/normalizers/gene/, port:18888)\ncd resources/normalizers/gene/\nnohup java -Xmx20G -jar gnormplus-normalization_19.jar >> ../../../../logs/nohup_gene_normalize.out 2>&1 &\n\nps auxww | egrep 'python|java' | grep -v grep"
  },
  {
    "path": "normalize.py",
    "content": "from datetime import datetime\nimport os\nimport time\nimport socket\nimport threading\n\nfrom normalizers.gene_auxiliary_normalizer import load_auxiliary_dict\nfrom normalizers.miRNA_normalizer import MiRNAFinder\nfrom normalizers.pathway_normalizer import PathwayFinder\n\n\ntime_format = '[%d/%b/%Y %H:%M:%S.%f]'\n\n\nclass Normalizer:\n    def __init__(self):\n        # Normalizer paths\n        self.BASE_DIR = 'normalization/resources'\n        self.NORM_INPUT_DIR = {\n            'disease': os.path.join(self.BASE_DIR, 'inputs/disease'),\n            'drug': os.path.join(self.BASE_DIR, 'inputs/chemical'),\n            'gene': os.path.join(self.BASE_DIR, 'inputs/gene'),\n            'mutation': os.path.join(self.BASE_DIR, 'inputs/mutation'),\n            'species': os.path.join(self.BASE_DIR, 'inputs/species'),\n        }\n        self.NORM_OUTPUT_DIR = {\n            'disease': os.path.join(self.BASE_DIR, 'outputs/disease'),\n            'drug': os.path.join(self.BASE_DIR, 'outputs/chemical'),\n            'gene': os.path.join(self.BASE_DIR, 'outputs/gene'),\n            'mutation': os.path.join(self.BASE_DIR, 'outputs/mutation'),\n            'species': os.path.join(self.BASE_DIR, 'outputs/species'),\n        }\n        self.NORM_DICT_PATH = {\n            'disease': os.path.join(self.BASE_DIR,\n                                    'dictionary/best_dict_Disease.txt'),\n            'drug': os.path.join(self.BASE_DIR,\n                                 'dictionary/best_dict_ChemicalCompound.txt'),\n            'gene': ['setup.txt',\n                     os.path.join(self.BASE_DIR,\n                                  'dictionary/best_dict_Gene.txt'),\n                     os.path.join(self.BASE_DIR,\n                                  'dictionary/best_dict_Gene_oldbest.txt'),\n                     os.path.join(self.BASE_DIR,\n                                  'dictionary/best_dict_Gene_freq.txt'),\n                     os.path.join(self.BASE_DIR,\n                                  'dictionary_rev/gene.tsv')],\n            'mutation': os.path.join(self.BASE_DIR,\n                                     'dictionary/best_dict_Mutation.txt'),\n            'species': os.path.join(self.BASE_DIR,\n                                    'dictionary/best_dict_Species.txt'),\n            'miRNA': os.path.join(self.BASE_DIR,\n                                  'dictionary/best_dict_miRNA.txt'),\n            'pathway': os.path.join(self.BASE_DIR,\n                                    'dictionary/best_dict_Pathway.txt')\n        }\n\n        self.METADATA_PATH = {\n            'gene': os.path.join(self.BASE_DIR,\n                                 'meta/gene_extids_190508.tsv'),\n            'disease': os.path.join(self.BASE_DIR,\n                                    'meta/disease_meta_190310.tsv'),\n            'drug': os.path.join(self.BASE_DIR, 'meta/chem_meta.tsv'),\n            'mutation': os.path.join(self.BASE_DIR,\n                                     'meta/mutation_synonyms.tsv'),\n            'miRNA': os.path.join(self.BASE_DIR,\n                                  'dictionary/best_dict_miRNA.txt'),\n            'pathway': os.path.join(self.BASE_DIR,\n                                    'dictionary/best_dict_Pathway.txt')\n        }\n\n        # Load gid2oid for Gene (only for gene)\n        self.gid2oid = dict()\n        with open(self.NORM_DICT_PATH['gene'][1], 'r', encoding='utf-8') as f:\n            for line in f:\n                oid, gids = line[:-1].split('||')\n                for gid in gids.split('|'):\n                    bar_idx = gid.find('-')\n                    if bar_idx > -1:\n                        self.gid2oid[gid[:bar_idx]] = oid\n                    else:\n                        self.gid2oid[gid] = oid\n        print('gid2oid loaded', len(self.gid2oid))\n\n        self.gene_oldbest_dict = \\\n            load_auxiliary_dict(self.NORM_DICT_PATH['gene'][2])\n        self.gene_freq_dict = \\\n            load_auxiliary_dict(self.NORM_DICT_PATH['gene'][3])\n\n        # to merge genes\n        self.goid2goid = dict()\n        with open(self.NORM_DICT_PATH['gene'][4], 'r', encoding='utf-8') as f:\n            for line in f:\n                cols = line[:-1].split('\\t')\n                self.goid2goid[cols[0]] = cols[1]\n        print('goid2goid loaded', len(self.goid2goid))\n\n        # Load gene metadata\n        self.gid2meta = dict()\n        gene_ext_ids = 0\n        with open(self.METADATA_PATH['gene'], 'r', encoding='utf-8') as f:\n            for line in f:\n                cols = line[:-1].split('\\t')\n                if len(cols) < 2:\n                    print('#cols', len(cols), line[:-1])\n                    continue\n\n                external_ids = cols[1]\n\n                if '' == external_ids.strip():\n                    continue\n\n                gene_ext_ids += 1\n\n                external_ids = external_ids.replace('HGNC:HGNC:', 'HGNC:')\n\n                gid = cols[0]\n                if gid not in self.gid2oid:\n                    print('skip', gid)\n                    continue\n                self.gid2meta[gid] = external_ids.replace('|', '\\t')\n        print('gene meta #ids {}, #ext_ids {}'.format(len(self.gid2meta),\n                                                      gene_ext_ids))\n\n        # Load disease metadata\n        self.did2meta = dict()\n        disease_ext_ids = 0\n        with open(self.METADATA_PATH['disease'], 'r', encoding='utf-8') as f:\n            for line in f:\n                cols = line[:-1].split('\\t')\n                if len(cols) < 2:\n                    print('#cols', len(cols), line[:-1])\n                    continue\n                self.did2meta[cols[0]] = cols[1].replace(',', '\\t')\n                disease_ext_ids += len(cols[1].split(','))\n        print('disease meta #ids {}, #ext_ids {}'.format(len(self.did2meta),\n                                                         disease_ext_ids))\n\n        # Load chem metadata\n        self.cid2meta = dict()\n        chem_ext_ids = 0\n        with open(self.METADATA_PATH['drug'], 'r', encoding='utf-8') as f:\n            for line in f:\n                cols = line[:-1].split('\\t')\n                if len(cols) < 2:\n                    print('#cols', len(cols), line[:-1])\n                    continue\n                self.cid2meta[cols[0]] = cols[1].replace(',', '\\t')\n                chem_ext_ids += len(cols[1].split(','))\n        print('chem meta #ids {}, #ext_ids {}'.format(len(self.cid2meta),\n                                                      chem_ext_ids))\n\n        self.mirna_finder = MiRNAFinder(self.NORM_DICT_PATH['miRNA'])\n        self.pathway_finder = PathwayFinder(self.NORM_DICT_PATH['pathway'])\n\n        self.NORM_MODEL_VERSION = 'dmis ne norm v.20190830'\n\n        self.HOST = '127.0.0.1'\n\n        # normalizer port\n        self.GENE_PORT = 18888\n        self.SPECIES_PORT = 18889\n        self.CHEMICAL_PORT = 18890\n        self.MUT_PORT = 18891\n        self.DISEASE_PORT = 18892\n\n        self.NO_ENTITY_ID = 'CUI-less'\n\n    def normalize(self, base_name, doc_dict_list, cur_thread_name, is_raw_text):\n        start_time = time.time()\n\n        names = dict()\n        saved_items = list()\n        ent_cnt = 0\n        abs_cnt = 0\n\n        num_file_mirna_mentions = 0\n        num_file_pathway_mentions = 0\n\n        for item in doc_dict_list:\n\n            # Get json values\n            abstract = item['abstract']\n            # pmid = item['pmid']\n            entities = item['entities']\n\n            if not is_raw_text:\n                # Title goes with abstract\n                if len(abstract) > 0:\n                    content = ' '.join([item['title'], abstract])\n                else:\n                    content = item['title']\n            else:\n                content = abstract\n\n            abs_cnt += 1\n\n            # Iterate entities per abstract\n            for ent_type, locs in entities.items():\n\n                if ent_type in ['miRNA', 'pathway']:\n                    continue\n\n                ent_cnt += len(locs)\n                for loc in locs:\n\n                    loc['end'] += 1\n\n                    if ent_type == 'mutation':\n                        name = loc['normalizedName']\n\n                        if ';' in name:\n                            name = name.split(';')[0]\n                    else:\n                        name = content[loc['start']:loc['end']]\n\n                    if ent_type in names:\n                        names[ent_type].append([name, len(saved_items)])\n                    else:\n                        names[ent_type] = [[name, len(saved_items)]]\n\n            # Tag miRNAs\n            found_mirnas = self.mirna_finder.tag(content)\n            entities['miRNA'] = found_mirnas\n            num_found_mirnas = len(found_mirnas)\n            num_file_mirna_mentions += num_found_mirnas\n\n            # Tag pathways\n            found_pathways = self.pathway_finder.tag(content)\n            entities['pathway'] = found_pathways\n            num_found_pathways = len(found_pathways)\n            num_file_pathway_mentions += num_found_pathways\n\n            # Work as pointer\n            item['norm_model'] = self.NORM_MODEL_VERSION\n            saved_items.append(item)\n\n        if num_file_mirna_mentions > 0:\n            print(datetime.now().strftime(time_format),\n                  '[{}] [{}] => {} mentions'.format(cur_thread_name, 'miRNA',\n                                                    num_file_mirna_mentions))\n\n        if num_file_pathway_mentions > 0:\n            print(datetime.now().strftime(time_format),\n                  '[{}] [{}] => {} mentions'.format(cur_thread_name, 'pathway',\n                                                    num_file_pathway_mentions))\n\n        # For each entity,\n        # 1. Write as input files to normalizers\n        # 2. Run normalizers\n        # 3. Read output files of normalizers\n        # 4. Remove files\n        # 5. Return oids\n\n        # Threading\n        results = list()\n        threads = list()\n        for ent_type in names.keys():\n            t = threading.Thread(target=self.run_normalizers_wrap,\n                                 args=(ent_type, base_name, names, saved_items,\n                                       cur_thread_name, is_raw_text, results))\n            t.daemon = True\n            t.start()\n            threads.append(t)\n\n        # block until all tasks are done\n        for t in threads:\n            t.join()\n\n        # Save oids\n        for ent_type, type_oids in results:\n\n            if ent_type in ['miRNA', 'pathway']:\n                continue\n\n            oid_cnt = 0\n            for saved_item in saved_items:\n                for loc in saved_item['entities'][ent_type]:\n\n                    # Put oid\n                    loc['id'] = type_oids[oid_cnt]\n                    oid_cnt += 1\n\n        print(datetime.now().strftime(time_format),\n              '[{}] Normalization models '\n              '{:.3f} sec ({} article(s), {} entity type(s))'\n              .format(cur_thread_name, time.time() - start_time, abs_cnt,\n                      len(names.keys())))\n\n        return saved_items\n\n    def run_normalizers_wrap(self, ent_type, base_name, names, saved_items,\n                             cur_thread_name, is_raw_text, results):\n        results.append((ent_type,\n                        self.run_normalizer(ent_type, base_name, names,\n                                            saved_items, cur_thread_name,\n                                            is_raw_text)))\n\n    def run_normalizer(self, ent_type, base_name, names, saved_items,\n                       cur_thread_name, is_raw_text):\n        start_time = time.time()\n        name_ptr = names[ent_type]\n        oids = list()\n        bufsize = 4\n\n        base_thread_name = '{}_{}'.format(base_name, cur_thread_name)\n        input_filename = base_thread_name + '.concept'\n        output_filename = base_thread_name + '.oid'\n\n        if ent_type == 'disease':\n\n            # 1. Write as input files to normalizers\n            norm_inp_path = os.path.join(self.NORM_INPUT_DIR[ent_type],\n                                         input_filename)\n            norm_abs_path = os.path.join(self.NORM_INPUT_DIR[ent_type],\n                                         base_thread_name + '.txt')\n            with open(norm_inp_path, 'w') as norm_inp_f:\n                for name, _ in name_ptr:\n                    norm_inp_f.write(name + '\\n')\n            # created for drug normalizer\n            with open(norm_abs_path, 'w') as _:\n                pass\n\n            # 2. Run normalizers\n            s = socket.socket()\n            s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)\n            try:\n                s.connect((self.HOST, self.DISEASE_PORT))\n                s.send('{}'.format(base_thread_name).encode('utf-8'))\n                s.recv(bufsize)\n            except ConnectionRefusedError as cre:\n                print('Check Sieve jar', cre)\n                os.remove(norm_inp_path)\n                os.remove(norm_abs_path)\n                s.close()\n                return oids\n            s.close()\n\n            # 3. Read output files of normalizers\n            norm_out_path = os.path.join(self.NORM_OUTPUT_DIR[ent_type],\n                                         output_filename)\n            if os.path.exists(norm_out_path):\n                with open(norm_out_path, 'r') as norm_out_f:\n                    for line in norm_out_f:\n                        disease_ids = line[:-1]\n\n                        if '|' in disease_ids:  # multiple\n                            bern_disease_ids = list()\n                            ext_id_list = list()\n                            for did in disease_ids.split('|'):\n                                bern_disease_ids.append(did)\n                                disease_ext_id = self.did2meta.get(did, '')\n                                if disease_ext_id != '':\n                                    ext_id_list.append(disease_ext_id)\n\n                            bern_dids = '\\t'.join(\n                                ['BERN:{}'.format(did)\n                                 for did in bern_disease_ids])\n                            if len(ext_id_list) > 0:\n                                oids.append(\n                                    '\\t'.join(ext_id_list) + '\\t' + bern_dids)\n                            else:\n                                oids.append(bern_dids)\n\n                        else:  # single\n                            disease_ext_id = self.did2meta.get(disease_ids, '')\n                            if disease_ext_id != '':\n                                oids.append(\n                                    disease_ext_id + '\\tBERN:' + disease_ids)\n                            else:\n                                if disease_ids != self.NO_ENTITY_ID:\n                                    oids.append('BERN:' + disease_ids)\n                                else:\n                                    oids.append(self.NO_ENTITY_ID)\n                os.remove(norm_out_path)\n            else:\n                print('Not found!!!', norm_out_path)\n\n                # Sad error handling\n                for _ in range(len(name_ptr)):\n                    oids.append(self.NO_ENTITY_ID)\n\n        elif ent_type == 'drug':\n            # 1. Write as input files to normalizers\n            norm_inp_path = os.path.join(self.NORM_INPUT_DIR[ent_type],\n                                         input_filename)\n            with open(norm_inp_path, 'w') as norm_inp_f:\n                for name, _ in name_ptr:\n                    norm_inp_f.write(name + '\\n')\n\n            # 2. Run normalizers\n            s = socket.socket()\n            s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)\n            s.connect((self.HOST, self.CHEMICAL_PORT))\n            send_args = '\\t'.join([self.NORM_INPUT_DIR[ent_type],\n                                  input_filename,\n                                  self.NORM_OUTPUT_DIR[ent_type],\n                                  output_filename,\n                                  self.NORM_DICT_PATH[ent_type]])\n            s.send(send_args.encode('utf-8'))\n            s.recv(bufsize)  # wait for normalizer end.\n            s.close()\n\n            # 3. Read output files of normalizers\n            norm_out_path = os.path.join(self.NORM_OUTPUT_DIR[ent_type],\n                                         output_filename)\n            with open(norm_out_path, 'r') as norm_out_f:\n                for line in norm_out_f:\n                    oid = line[:-1]\n                    meta = self.cid2meta.get(oid, '')\n                    if meta != '':\n                        oids.append(meta + '\\tBERN:' + oid)\n                    else:\n                        if oid != self.NO_ENTITY_ID:\n                            oids.append('BERN:' + oid)\n                        else:\n                            oids.append(self.NO_ENTITY_ID)\n\n            # 4. Remove input files\n            os.remove(norm_inp_path)\n\n            # 5. Remove output files\n            os.remove(norm_out_path)\n\n        elif ent_type == 'mutation':\n            # 1. Write as input files to normalizers\n            norm_inp_path = os.path.join(self.NORM_INPUT_DIR[ent_type],\n                                         input_filename)\n            with open(norm_inp_path, 'w') as norm_inp_f:\n                for name, _ in name_ptr:\n                    norm_inp_f.write(name + '\\n')\n\n            # 2. Run normalizers\n            s = socket.socket()\n            s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)\n            s.connect((self.HOST, self.MUT_PORT))\n            send_args = '\\t'.join([self.NORM_INPUT_DIR[ent_type],\n                                  input_filename,\n                                  self.NORM_OUTPUT_DIR[ent_type],\n                                  output_filename,\n                                  self.NORM_DICT_PATH[ent_type]])\n            s.send(send_args.encode('utf-8'))\n            s.recv(bufsize)  # wait for normalizer end.\n            s.close()\n\n            # 3. Read output files of normalizers\n            norm_out_path = os.path.join(self.NORM_OUTPUT_DIR[ent_type],\n                                         output_filename)\n            with open(norm_out_path, 'r') as norm_out_f:\n                for line in norm_out_f:\n                    oid = line[:-1]\n                    if oid != self.NO_ENTITY_ID:\n                        oids.append('BERN:' + oid)\n                    else:\n                        oids.append(self.NO_ENTITY_ID)\n\n            # 4. Remove input files\n            os.remove(norm_inp_path)\n\n            # 5. Remove output files\n            os.remove(norm_out_path)\n\n        elif ent_type == 'species':\n            # 1. Write as input files to normalizers\n            norm_inp_path = os.path.join(self.NORM_INPUT_DIR[ent_type],\n                                         input_filename)\n            with open(norm_inp_path, 'w') as norm_inp_f:\n                for name, _ in name_ptr:\n                    norm_inp_f.write(name + '\\n')\n\n            # 2. Run normalizers\n            s = socket.socket()\n            s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)\n            s.connect((self.HOST, self.SPECIES_PORT))\n            send_args = '\\t'.join([self.NORM_INPUT_DIR[ent_type],\n                                  input_filename,\n                                  self.NORM_OUTPUT_DIR[ent_type],\n                                  output_filename,\n                                  self.NORM_DICT_PATH[ent_type]])\n            s.send(send_args.encode('utf-8'))\n            s.recv(bufsize)  # wait for normalizer end.\n            s.close()\n\n            # 3. Read output files of normalizers\n            norm_out_path = os.path.join(self.NORM_OUTPUT_DIR[ent_type],\n                                         output_filename)\n            with open(norm_out_path, 'r') as norm_out_f:\n                for line in norm_out_f:\n                    oid = line[:-1]\n                    if oid != self.NO_ENTITY_ID:\n                        oid = int(oid) // 100\n                        # https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=10095\n                        # \"... please use NCBI:txid10095 ...\"\n                        oids.append('NCBI:txid{}'.format(oid))\n                    else:\n                        oids.append(self.NO_ENTITY_ID)\n\n            # 4. Remove input files\n            os.remove(norm_inp_path)\n\n            # 5. Remove output files\n            os.remove(norm_out_path)\n\n        elif ent_type == 'gene':\n            # create socket\n            s = socket.socket()\n            s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)\n            try:\n                s.connect((self.HOST, self.GENE_PORT))\n            except ConnectionRefusedError as cre:\n                print('Check GNormPlus jar', cre)\n                s.close()\n                return oids\n\n            # 1. Write as input files to normalizers\n            norm_inp_path = os.path.join(self.NORM_INPUT_DIR[ent_type],\n                                         input_filename)\n            norm_abs_path = os.path.join(self.NORM_INPUT_DIR[ent_type],\n                                         base_thread_name + '.txt')\n\n            space_type = ' ' + ent_type\n            with open(norm_inp_path, 'w') as norm_inp_f:\n                with open(norm_abs_path, 'w') as norm_abs_f:\n                    for saved_item in saved_items:\n                        entities = saved_item['entities'][ent_type]\n                        if len(entities) == 0:\n                            continue\n\n                        if is_raw_text:\n                            abstract_title = saved_item['abstract']\n                        else:\n                            if len(saved_item['abstract']) > 0:\n                                abstract_title = \\\n                                    ' '.join([saved_item['title'],\n                                              saved_item['abstract']])\n                            else:\n                                abstract_title = saved_item['title']\n\n                        ent_names = list()\n                        for loc in entities:\n                            e_name = abstract_title[loc['start']:loc['end']]\n                            if len(e_name) > len(space_type) \\\n                                    and space_type \\\n                                    in e_name.lower()[-len(space_type):]:\n                                # print('Replace', e_name,\n                                #       'w/', e_name[:-len(space_type)])\n                                e_name = e_name[:-len(space_type)]\n\n                            ent_names.append(e_name)\n                        norm_abs_f.write(saved_item['pmid'] + '||' +\n                                         abstract_title + '\\n')\n                        norm_inp_f.write('||'.join(ent_names) + '\\n')\n\n            # 2. Run normalizers\n            gene_input_dir = os.path.abspath(\n                os.path.join(self.NORM_INPUT_DIR[ent_type]))\n            gene_output_dir = os.path.abspath(\n                os.path.join(self.NORM_OUTPUT_DIR[ent_type]))\n            setup_dir = self.NORM_DICT_PATH[ent_type][0]  # 0 means setup.txt\n\n            # start jar\n            jar_args = '\\t'.join(\n                [gene_input_dir, gene_output_dir, setup_dir, '9606',  # human\n                 base_thread_name]) + '\\n'\n            s.send(jar_args.encode('utf-8'))\n            s.recv(bufsize)\n            s.close()\n\n            # 3. Read output files of normalizers\n            norm_out_path = os.path.join(gene_output_dir, output_filename)\n            if os.path.exists(norm_out_path):\n                with open(norm_out_path, 'r') as norm_out_f, \\\n                        open(norm_inp_path, 'r') as norm_in_f:\n                    for line, input_l in zip(norm_out_f, norm_in_f):\n                        gene_ids, gene_mentions = line[:-1].split('||'), \\\n                                                  input_l[:-1].split('||')\n                        for gene_id, gene_mention in zip(gene_ids,\n                                                         gene_mentions):\n                            bar_idx = gene_id.find('-')\n                            if bar_idx > -1:\n                                gene_id = gene_id[:bar_idx]\n\n                            eid = None\n\n                            if gene_id in self.gid2oid:\n                                eid = self.gid2oid[gene_id]\n                            elif gene_mention in self.gene_oldbest_dict:\n                                eid = self.gene_oldbest_dict[gene_mention]\n                            elif gene_mention in self.gene_freq_dict:\n                                eid = self.gene_freq_dict[gene_mention]\n\n                            if eid is not None and eid in self.goid2goid:\n                                eid = self.goid2goid[eid]\n\n                            meta = self.gid2meta.get(gene_id, '')\n                            if len(meta) > 0:\n                                eid = meta + '\\tBERN:{}'.format(eid)\n                            else:\n                                if eid is not None:\n                                    eid = 'BERN:{}'.format(eid)\n                                else:\n                                    eid = self.NO_ENTITY_ID\n\n                            oids.append(eid)\n\n                # 5. Remove output files\n                os.remove(norm_out_path)\n            else:\n                print('Not found!!!', norm_out_path)\n\n                # Sad error handling\n                for _ in range(len(name_ptr)):\n                    oids.append(self.NO_ENTITY_ID)\n\n            # 4. Remove input files\n            os.remove(norm_inp_path)\n            os.remove(norm_abs_path)\n\n        # 5. Return oids\n        assert len(oids) == len(name_ptr), '{} vs {} in {}'.format(\n            len(oids), len(name_ptr), ent_type)\n\n        # double checking\n        if 0 == len(oids):\n            return oids\n\n        cui_less_count = 0\n        for oid in oids:\n            if self.NO_ENTITY_ID == oid:\n                cui_less_count += 1\n\n        print(datetime.now().strftime(time_format),\n              '[{}] [{}] {:.3f} sec, CUI-less: {:.1f}% ({}/{})'.format(\n                  cur_thread_name, ent_type, time.time() - start_time,\n                  cui_less_count * 100. / len(oids),\n                  cui_less_count, len(oids)))\n        return oids\n"
  },
  {
    "path": "normalizers/__init__.py",
    "content": ""
  },
  {
    "path": "normalizers/chemical_normalizer.py",
    "content": "import os\nimport socket\nimport string\n\n\nCHEMICAL_PORT = 18890\nchem2oid = None\n\n\ndef run_server(logic_func, port):\n    host = '127.0.0.1'\n    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n        s.bind((host, port))\n        s.listen(1)\n        while True:\n            conn, addr = s.accept()\n            data = conn.recv(1024).decode('utf-8')\n            if data == 'quit':\n                break\n            logic_func(data, addr)\n            conn.send(b'Done')\n            conn.close()\n\n\ndef run_normalizer(data, _):\n    args = data.split('\\t')\n    assert len(args) == 5\n    input_dir, input_filename, output_dir, output_filename, dict_path = args\n\n    global chem2oid\n    if chem2oid is None:\n        # Create dictionary for exact match\n        chem2oid = dict()\n        with open(dict_path, 'r', encoding='utf-8') as f:\n            for line in f:\n                oid, names = line[:-1].split('||')\n                names = names.split('|')\n                for name in names:\n                    # a part of tmChem normalization\n                    chem2oid[get_tmchem_name(name)] = oid\n\n    oids = list()\n    # Read names and get oids\n    with open(os.path.join(input_dir, input_filename), 'r',\n              encoding='utf-8') as f:\n        for line in f:\n            name = line[:-1]\n\n            # a part of tmChem normalization\n            normalized_name = get_tmchem_name(name)\n\n            if normalized_name in chem2oid:\n                oids.append(chem2oid[normalized_name])\n            else:\n                oids.append('CUI-less')\n\n    # Write to file\n    with open(os.path.join(output_dir, output_filename), 'w',\n              encoding='utf-8') as f_out:\n        for oid in oids:\n            f_out.write(oid + '\\n')\n\n\ndef get_tmchem_name(name):\n    # 1. lowercase, 2. removes all whitespace and punctuation\n    # https://jcheminf.biomedcentral.com/articles/10.1186/1758-2946-7-S1-S3\n    normalized_name = ''\n    for nc in name.lower():\n        if nc == ' ' or nc in string.punctuation:\n            continue\n        normalized_name += nc\n    return normalized_name\n\n\nif __name__ == \"__main__\":\n    run_server(run_normalizer, CHEMICAL_PORT)\n"
  },
  {
    "path": "normalizers/gene_auxiliary_normalizer.py",
    "content": "import pandas as pd\nfrom collections import Counter\n\nBEST_PLUS_DICT_PATH = 'dictionary/best_dict_Gene.txt'\nBEST_DICT_PATH = 'BEST_v1_dict/WordNetChecked_bossNewDic_2016-03-23.txt'\n\ndef find_best_plus_largest_index(best_plus_dict_path):\n    best_plus_dict = pd.read_csv(best_plus_dict_path, sep='\\|\\|', header=None, index_col=0)\n    largest_index = max([index // 100 for index in best_plus_dict.index]) # index // 100 : delete last 2 digit because that is type code\n    return largest_index\n\ndef find_largest_index(uid_list):\n    return max([uid // 100 for uid in uid_list])\n\ndef make_best_dict(best_dict_path, start_index, type_code=2):\n    best_dict = dict()\n    registered_id = set()\n    with open(best_dict_path, 'r', encoding='utf-8') as f:\n        for line in f:\n            line = line.split('\\t')\n            best_id, mention, mention_type = line[0], line[1], line[2]\n            if mention_type in ['Gene', 'Target']:\n                registered_id.add(best_id)\n                uid = (start_index + (len(registered_id)-1)) * 100 + type_code\n                if uid not in best_dict:\n                    best_dict[uid] = []\n                best_dict[uid].append(mention)\n    return best_dict\n\ndef write_auxiliary_dict(aux_dict, output_path):\n    with open(output_path, 'w', encoding='utf-8') as f:\n        for uid, mentions in aux_dict.items():\n            for mention in mentions:\n                f.write('{}||{}\\n'.format(uid, mention))\n\ndef load_auxiliary_dict(path):\n    auxiliary_dict = dict()\n    with open(path, 'r', encoding='utf-8') as f:\n        for line in f:\n            line = line.split('||')\n            uid, mention = line[0].strip(), line[1].strip()\n            assert mention not in auxiliary_dict\n            auxiliary_dict[mention] = uid\n    return auxiliary_dict\n\ndef make_freq_dict(total_sample_path, start_index, threshold, type_code=2):\n    freq_dict = dict()\n    registered_mention = set()\n    total_df = pd.read_csv(total_sample_path, sep='\\t', index_col=None, header=0)\n    gene_df = total_df.query('entity_type == \"gene\"')\n    gene_cuiless_df = gene_df.query('entity_id == \"CUI-less\"')\n    mention_counter = Counter(gene_cuiless_df['mention'])\n    top_mentions = [mention for mention, freq in mention_counter.items() if freq >= threshold]\n    for mention in top_mentions:\n        registered_mention.add(mention)\n        uid = (start_index + len(registered_mention) - 1) * 100 + type_code\n        if uid not in freq_dict:\n            freq_dict[uid] = []\n        freq_dict[uid].append(mention)\n    return freq_dict\n\nif __name__ == '__main__':\n    # make best dict (not best plus dict)\n    BEST_DICT_OUT_PATH = 'dictionary/best_dict_Gene_oldbest.txt'\n    FREQ_DICT_OUT_PATH = 'dictionary/best_dict_Gene_freq.txt'\n    TOTAL_SAMPLE_PATH  = 'C:/Users/HS/Downloads/gene_drug_disease_species_normalization_result_sample100p.tsv'\n    start_index = find_best_plus_largest_index(BEST_PLUS_DICT_PATH) + 100\n    best_dict = make_best_dict(BEST_DICT_PATH, start_index)\n    write_auxiliary_dict(best_dict, BEST_DICT_OUT_PATH)\n    start_index = find_largest_index(best_dict.keys()) + 100\n    freq_dict = make_freq_dict(TOTAL_SAMPLE_PATH, start_index, threshold=50)\n    write_auxiliary_dict(freq_dict, FREQ_DICT_OUT_PATH)"
  },
  {
    "path": "normalizers/miRNA_normalizer.py",
    "content": "import re\n\n\nclass MiRNAFinder:\n    def __init__(self, dict_path):\n\n        # config\n        prefix_list = ['mir', 'mir-',\n                       'mirna', 'mirna-',\n                       'microrna', 'microrna-',\n                       'micro rna', 'micro-rna-',\n                       'let-', 'mirna-let-', 'mir-let-',\n                       'hsa-mir-', 'mmu-', \"hsa-let-\"]\n        suffix_list = ['[-]?[a-c]-[12]-[35]p', '[-]?[a-c]-[35]p', '-[12]-[35]p',\n                       '[a-c]', '-[12]', '-[35]p', '[*]', '[0-9]+']\n\n        ten_species = ['bta-mir-', 'rno-mir-', 'gga-mir-', 'cel-mir-',\n                       'ssc-mir-', 'ebv-mir-', 'mdv1-mir-', 'hcmv-mir-']\n        prefix_list = ten_species + prefix_list\n\n        # make regex\n        p_list = list()\n        for pre in prefix_list:\n            for suf in suffix_list:\n                p_list.append(r'\\b%s[0-9]{1,3}%s\\b' % (pre, suf))\n        self.mirna_pattern = re.compile(r'|'.join(p_list), re.I)\n\n        self.code2mirs = dict()\n        self.mir2id = dict()\n        self.mirna_id2accession = dict()\n\n        with open(dict_path, 'r') as f:\n            for l in f:\n                cols = l[:-1].split('\\t')\n\n                if 3 > len(cols):\n                    print('Invalid line:', l[:-1])\n                    continue\n\n                mirna_id = int(cols[0])\n                mirbase_ids = cols[1].split('|')\n                accession = cols[2]\n\n                if '' != accession:\n                    self.mirna_id2accession[mirna_id] = 'miRBase:' + accession\n\n                for mirbase_id in mirbase_ids:\n                    code = re.search(r\"[0-9]+.*\", mirbase_id)\n                    if code is None:\n                        continue\n                    else:\n                        code = code.group()\n\n                    if code not in self.code2mirs:\n                        self.code2mirs[code] = list()\n\n                    self.code2mirs[code].append(mirbase_id)\n                    self.mir2id[mirbase_id] = mirna_id\n\n        print('code2mirs size', len(self.code2mirs))\n        print('mirbase_id2mirna_id size', len(self.mir2id))\n        print('mirna_id2accession size', len(self.mirna_id2accession))\n\n    def normalize(self, miRNA):\n        code = re.search(r\"[0-9]+.*\", miRNA).group()\n        code = code.replace(\"-3p\", \"\").replace(\"-5p\", \"\").replace(\"-3P\",\n                                                                  \"\").replace(\n            \"-5P\",\n            \"\")\n\n        # code_candidates = [code, code.lower()]\n\n        selected_code = None\n\n        if code in self.code2mirs:\n            selected_code = code\n        elif code.lower() in self.code2mirs:\n            selected_code = code.lower()\n        elif re.match(\"[0-9]+\", code).group() in self.code2mirs:\n            selected_code = re.match(\"[0-9]+\", code).group()\n        elif code.lstrip(\"0\") in self.code2mirs:\n            selected_code = code.lstrip(\"0\")\n        else:\n            for ref_code in self.code2mirs:\n                if re.match(code + \"[a-z]+.*\", ref_code):\n                    selected_code = ref_code\n                    break  # first matched code\n\n        if selected_code is None:\n            # print(miRNA)\n            return \"\"\n\n        # normalized_mir = \"\"\n\n        if len(self.code2mirs[\n                   selected_code]) == 1:  # Only one reference mirna for the code.\n            normalized_mir = self.code2mirs[selected_code][0]\n\n        elif (miRNA.lower()[:3] == \"mir\") or (\n                miRNA.lower()[\n                :5] == \"micro\"):  # No species such as hsa-, mmu-, ...\n            if \"hsa-mir-\" + selected_code in self.code2mirs[selected_code]:\n                normalized_mir = \"hsa-mir-\" + selected_code\n            elif \"mmu-mir-\" + selected_code in self.code2mirs[selected_code]:\n                normalized_mir = \"mmu-mir-\" + selected_code\n            else:\n                normalized_mir = self.code2mirs[selected_code][0]\n\n        elif miRNA.lower()[:3] == \"let\":  # Starts with let-\n            if \"hsa-let-\" + selected_code in self.code2mirs[selected_code]:\n                normalized_mir = \"hsa-let-\" + selected_code\n            elif \"mmu-let-\" + selected_code in self.code2mirs[selected_code]:\n                normalized_mir = \"mmu-let-\" + selected_code\n            else:\n                normalized_mir = self.code2mirs[selected_code][0]\n\n        elif miRNA.lower()[:3] == \"hsa\":  # hsa-xxx\n            if \"hsa-mir-\" + selected_code in self.code2mirs[selected_code]:\n                normalized_mir = \"hsa-mir-\" + selected_code\n            else:\n                normalized_mir = self.code2mirs[selected_code][0]\n\n        elif miRNA.lower()[:3] == \"mmu\":  # mmu-xxx\n            if \"hsa-mir-\" + selected_code in self.code2mirs[selected_code]:\n                normalized_mir = \"mmu-mir-\" + selected_code\n            else:\n                normalized_mir = self.code2mirs[selected_code][0]\n\n        else:\n            # print(miRNA, code2mirs[selected_code])\n            return \"\"\n\n        return self.mir2id[normalized_mir]\n\n    def tag(self, text):\n        mirna_list = list()\n        for idx, m in enumerate(self.mirna_pattern.finditer(text)):\n            mirid = self.normalize(m.group())\n            m_span = m.span()\n\n            bern_mirid = 'BERN:{}'.format(mirid)\n            id_fin = \\\n                self.mirna_id2accession[mirid] + '\\t' + bern_mirid \\\n                if mirid in self.mirna_id2accession else bern_mirid\n\n            mirna_list.append({\n                \"start\": m_span[0],\n                \"id\": id_fin,\n                \"end\": m_span[1]\n            })\n        return mirna_list\n\n\nif __name__ == '__main__':\n    mf = MiRNAFinder('../normalization/resources/dictionary/best_dict_miRNA.txt')\n    print(mf.tag('Evaluation of salivary and plasma microRNA expression in patients with Sjogren\\'s syndrome, and correlations with clinical and ultrasonographic outcomes. To correlate the expression of microRNAs (miRNAs) 146a/b, 16, the 17-92 cluster and 181a in salivary and plasma samples taken from primary Sjogren\\'s syndrome (pSS) patients with clinical, laboratory and ultrasound findings. Plasma and salivary samples were collected from 28 patients with pSS according to 2012 ACR and/or 2016 ACR/EULAR criteria (27 females, mean age 64.4 10.1 years, mean disease duration 10.7 6.9 years), and from 23 healthy subjects used as controls. The following patient data were recorded: ESSDAI and ESSPRI scores, anti-SSA and anti-SSB antibody status and laboratory data, Schirmer\\'s test, ultrasound scores of the four major salivary glands according to Cornec et al., and concomitant treatments. The retro-transcribed and quantified miRNAs were: miR16-5p, miR17-5p, miR18a-5p, miR19a-5p, miR19b-1-5p, miR20a, miR92-5p, miR146a-5p, miR146b-5p, miR181a-5p. SS patients had higher expression of salivary miR146a than gender- and age-matched controls (p=0.01). Spearman\\'s regression analysis revealed that salivary miR146b was significantly more expressed in the patients with worse ESSPRI scores (p=0.02), whereas salivary miR17 and 146b and plasma miR17 expression was lower in the patients with higher ultrasound scores (respectively p=0.01, p=0.01 and p=0.04). Salivary miR18a expression was significantly increased in the patients who were anti-La/SSB positive (p=0.04). Neither salivary nor plasma miRNAs correlated with disease duration or concomitant therapies. Our data show that salivary mi146a may represent a marker of the disease, and that the expression of salivary miR17, 18a and 146b may be altered in patients with pSS, and associated with worse ultrasound and ESSPRI scores and anti-La/SSB positivity.'))\n"
  },
  {
    "path": "normalizers/mutation_normalizer.py",
    "content": "import os\nimport socket\n\n\nMUT_PORT = 18891\nmut2oid = None\n\n\ndef run_server(logic_func, port):\n    host = '127.0.0.1'\n    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n        s.bind((host, port))\n        s.listen(1)\n        while True:\n            conn, addr = s.accept()\n            data = conn.recv(1024).decode('utf-8')\n            if data == 'quit':\n                break\n            logic_func(data, addr)\n            conn.send(b'Done')\n            conn.close()\n\n\ndef run_normalizer(data, _):\n    args = data.split('\\t')\n    assert len(args) == 5\n    input_dir, input_filename, output_dir, output_filename, dict_path = args\n\n    global mut2oid\n    if mut2oid is None:\n        # Create dictionary for exact match\n        mut2oid = dict()\n        with open(dict_path, 'r', encoding='utf-8') as f:\n            for line in f:\n                start = line.find('||')\n                oid = line[:start]\n                name = line[start+2:-1]\n                mut2oid[name] = oid\n\n    oids = list()\n    # Read names and get oids\n    with open(os.path.join(input_dir, input_filename), 'r', encoding='utf-8') \\\n            as f:\n        for line in f:\n            name = line[:-1]\n            if name in mut2oid:\n                oids.append(mut2oid[name])\n            # elif name.lower() in mut2oid:\n            #     oids.append(mut2oid[name.lower()])\n            else:\n                oids.append('CUI-less')\n\n    # Write to file\n    with open(os.path.join(output_dir, output_filename), 'w',\n              encoding='utf-8') as f_out:\n        for oid in oids:\n            f_out.write(oid + '\\n')\n\n\nif __name__ == \"__main__\":\n    run_server(run_normalizer, MUT_PORT)\n"
  },
  {
    "path": "normalizers/pathway_normalizer.py",
    "content": "import re\n\n\nclass PathwayFinder:\n    def __init__(self, dict_path):\n\n        self.pathway2id = dict()\n        self.pathway_id2keggid = dict()\n\n        with open(dict_path, 'r') as f:\n            for l in f:\n                cols = l[:-1].split('\\t')\n\n                if 2 > len(cols):\n                    print('Invalid line:', l[:-1])\n                    continue\n\n                pathway_id = int(cols[0])\n                name = cols[1]\n                if \"pathway\" not in name:\n                    name += ' pathway'\n                if name in self.pathway2id:\n                    # print(name, pathway_id)\n                    continue\n                self.pathway2id[name] = pathway_id\n\n                if 3 <= len(cols) and '' != cols[2]:\n                    self.pathway_id2keggid[pathway_id] = cols[2]\n\n        extended = list()\n        for pname in self.pathway2id:\n            if \"pathway\" not in pname:\n                extended.append(pname + ' pathway')\n            else:\n                extended.append(pname)\n        self.regex = re.compile('|'.join(extended))\n\n        print('# of pathway regex', len(extended))\n\n    def tag(self, text):\n        pathways = list()\n        for idx, m in enumerate(self.regex.finditer(text)):\n            pathway_id = self.pathway2id[m.group()]\n            m_span = m.span()\n\n            bern_pathway_id = 'BERN:{}'.format(pathway_id)\n            id_fin = \\\n                self.pathway_id2keggid[pathway_id] + '\\t' + bern_pathway_id \\\n                if pathway_id in self.pathway_id2keggid else bern_pathway_id\n\n            pathways.append({\n                \"start\": m_span[0],\n                \"id\": id_fin,\n                \"end\": m_span[1]\n            })\n        return pathways\n\n\nif __name__ == '__main__':\n    pf = PathwayFinder('../normalization/resources/dictionary/best_dict_Pathway.txt')\n    print(pf.tag('Transferrin receptor-involved HIF-1 signaling pathway in cervical cancer. Cervical cancer is one of the most prevalent gynecologic malignancies and has remained an intractable cancer over the past decades. We analyzed the aberrant expression patterns of cervical cancer using RNA-Seq data from The Cancer Genome Atlas (TCGA). A total of 3352 differently expressed genes (DEGs) were identified in 306 cervical cancer samples compared with 3 control samples, with 1401 genes upregulated and 1951 downregulated. Under Kaplan-Meier analysis, 76 out of these DEGs with a significantly different survival rate between patients with high and low expression groups were picked out and uploaded to perform Kyoto Encyclopedia of Genes and Genomes (KEGG) pathway enrichment, which identified a transferrin receptor (TFRC)-involved HIF-1 signaling pathway (p < 0.05). Clinical data analysis showed that high TFRC expression in cervical cancers was associated with incrementally advanced stage, tumor status, and lymph nodes (all p-values <0.05), while multivariate analysis revealed that TFRC remained an independent prognostic variable for poor overall survival. In conclusion, our data indicated that the TFRC-involved HIF-1 signaling pathway may play a crucial role in cervical cancer.'))\n"
  },
  {
    "path": "normalizers/species_normalizer.py",
    "content": "import os\nimport socket\n\n\nSPECIES_PORT = 18889\nspecies2oid = None\n\n\ndef run_server(logic_func, port):\n    host = '127.0.0.1'\n    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n        s.bind((host, port))\n        s.listen(1)\n        while True:\n            conn, addr = s.accept()\n            data = conn.recv(1024).decode('utf-8')\n            if data == 'quit':\n                break\n            logic_func(data, addr)\n            conn.send(b'Done')\n            conn.close()\n\n\ndef run_normalizer(data, _):\n    args = data.split('\\t')\n    assert len(args) == 5\n    input_dir, input_filename, output_dir, output_filename, dict_path = args\n\n    global species2oid\n    if species2oid is None:\n        # Create dictionary for exact match\n        species2oid = dict()\n        with open(dict_path, 'r', encoding='utf-8') as f:\n            for line in f:\n                # only 1 || exists in a line?\n                oid, names = line[:-1].split('||')\n                names = names.split('|')\n                for name in names:\n                    species2oid[name] = oid\n\n    oids = list()\n    # Read names and get oids\n    with open(os.path.join(input_dir, input_filename), 'r', encoding='utf-8') \\\n            as f:\n        for line in f:\n            name = line[:-1]\n            if name in species2oid:\n                oids.append(species2oid[name])\n            elif name.lower() in species2oid:\n                oids.append(species2oid[name.lower()])\n            else:\n                oids.append('CUI-less')\n\n    # Write to file\n    with open(os.path.join(output_dir, output_filename), 'w',\n              encoding='utf-8') as f_out:\n        for oid in oids:\n            f_out.write(oid + '\\n')\n\n\nif __name__ == \"__main__\":\n    run_server(run_normalizer, SPECIES_PORT)\n"
  },
  {
    "path": "requirements.txt",
    "content": "numpy\npandas\nrequests\ntensorflow-gpu\nxmltodict\n"
  },
  {
    "path": "scripts/bern_checker.sh",
    "content": "#!/bin/bash\n\ncd\ncd bern\npython3 service_checker.py"
  },
  {
    "path": "scripts/download_biobert_ner_models.sh",
    "content": "#!/bin/bash\n\ncd ../biobert_ner\n\nif [ -f \"biobert_ner_models.zip\" ]; then\n    echo \"Found biobert_ner_models.zip\"\nelse\n    echo \"Not found biobert_ner_models.zip. Downloading..\"\n    wget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1sSVEqvMBVLj1RJmlQDhRKyt_oe-wc5LK' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1sSVEqvMBVLj1RJmlQDhRKyt_oe-wc5LK\" -O biobert_ner_models.zip && rm -rf /tmp/cookies.txt\nfi\n\nunzip biobert_ner_models.zip\nmkdir result\nmkdir tmp\nrm biobert_ner_models.zip\n\necho \"BioBERT NER models are downloaded\""
  },
  {
    "path": "scripts/download_norm.sh",
    "content": "#!/bin/bash\n# Copyright 2018-present, Data Mining and Information Systems (DMIS)\n# All rights reserved.\n#\n# This source code is licensed under the license found in the\n# LICENSE file in the root directory of this source tree.\n\nset -e\n\ncd ..\n\nif [ ! -d \"normalization\" ]; then\n    mkdir normalization\nfi\n\ncd normalization\n\nif [ -f \"data.zip\" ]; then\n    echo \"Found data.zip.\"\nelse\n    echo \"Not found data.zip. Downloading..\"\n    wget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1NqgG3zJzopG2IqG-0g1o6fH0xVpO4PPN' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1NqgG3zJzopG2IqG-0g1o6fH0xVpO4PPN\" -O data.zip && rm -rf /tmp/cookies.txt\nfi\n\n# Get dictionary data\nunzip \"data.zip\"\nrm \"data.zip\"\n\nif [ -f \"resources.zip\" ]; then\n    echo \"Found resources.zip.\"\nelse\n    echo \"Not found resources.zip. Downloading..\"\n    wget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1uU1U6UORqr3l_YYQ5TXeazpLrpeg_OcP' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1uU1U6UORqr3l_YYQ5TXeazpLrpeg_OcP\" -O resources.zip && rm -rf /tmp/cookies.txt\nfi\n\n# Get Normalization resources\nunzip \"resources.zip\"\nrm \"resources.zip\"\n\nchmod 764 resources/normalizers/gene/Ab3P\nchmod 764 resources/normalizers/gene/CRF/crf_test\n\n\nif [ -d \"jsons\" ]; then\n    echo \"Found jsons/\"\nelse\n    mkdir \"jsons/\"\nfi\n\nif [ -d \"jsons_normalized\" ]; then\n    echo \"Found jsons_normalized/\"\nelse\n    mkdir \"jsons_normalized/\"\nfi\n\n\ncd ..\nif [ ! -d \"logs\" ]; then\n    mkdir logs\nfi\n\necho \"BERN normalizer settings done!\"\n"
  },
  {
    "path": "server.py",
    "content": "from http.server import HTTPServer, BaseHTTPRequestHandler\n\nimport cgi\nfrom datetime import datetime\nimport hashlib\nimport json\nimport numpy as np\nfrom biobert_ner.run_ner import BioBERT, FLAGS\nfrom convert import pubtator2dict_list, pubtator_biocxml2dict_list, \\\n    get_pub_annotation, get_pubtator\nfrom normalize import Normalizer\nfrom utils import filter_entities\nimport os\nimport random\nimport shutil\nimport string\nimport socket\nimport struct\nimport time\nimport tensorflow as tf\nimport threading\nimport urllib.parse as urlparse\n# if hasattr(os, \"fork\"):\n#     from socketserver import ForkingMixIn\n# else:\n#     from socketserver import ThreadingMixIn\nfrom socketserver import ThreadingMixIn\n\n\nclass GetHandler(BaseHTTPRequestHandler):\n    stm_dict = None\n    normalizer = None\n\n    def do_GET(self):\n        get_start_t = time.time()\n        parsed_path = urlparse.urlparse(self.path)\n        cur_thread_name = threading.current_thread().getName()\n\n        message = '\\n'.join([\n            'CLIENT VALUES:',\n            'client_address=%s (%s)' % (self.client_address,\n                                        self.address_string()),\n            'command=%s' % self.command,\n            'path=%s' % self.path,\n            'real path=%s' % parsed_path.path,\n            'query=%s' % parsed_path.query,\n            'request_version=%s' % self.request_version,\n            '',\n            'SERVER VALUES:',\n            'server_version=%s' % self.server_version,\n            'sys_version=%s' % self.sys_version,\n            'protocol_version=%s' % self.protocol_version,\n            'thread_name=%s' % cur_thread_name,\n        ])\n        self.send_response(200)\n        self.end_headers()\n\n        elapsed_time_dict = dict()\n\n        time_format = self.stm_dict['time_format']\n        available_formats = self.stm_dict['available_formats']\n\n        if parsed_path.query is None:\n            err_msg = 'No url query'\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            message += '\\n' + err_msg\n            self.wfile.write(message.encode('utf-8'))\n            return\n\n        indent = None\n\n        # print(datetime.now().strftime(time_format),\n        #       'query', parsed_path.query)\n\n        qs_dict = urlparse.parse_qs(parsed_path.query)\n        # print(datetime.now().strftime(time_format), 'qs_dict', qs_dict)\n\n        if 'pmid' not in qs_dict or len(qs_dict['pmid']) == 0:\n            err_msg = 'No pmid param'\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            message += '\\n' + err_msg\n            self.wfile.write(message.encode('utf-8'))\n            return\n\n        pmid_list = qs_dict['pmid'][0].split(',')\n        # print(datetime.now().strftime(time_format), 'pmid', pmid_list)\n\n        if len(pmid_list) > self.stm_dict['n_pmid_limit']:\n            err_msg = 'Too many (> {}) pmids: {}'.format(\n                self.stm_dict['n_pmid_limit'], len(pmid_list))\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            message += '\\n' + err_msg\n            self.wfile.write(message.encode('utf-8'))\n            return\n\n        out_format = available_formats[0]\n        if 'format' in qs_dict and len(qs_dict['format']) > 0:\n            if qs_dict['format'][0] in available_formats:\n                out_format = qs_dict['format'][0]\n            else:\n                print('Unavailable format', qs_dict['format'][0])\n\n        # print(datetime.now().strftime(time_format),\n        #       'pmid:', pmid_list, ', format:', out_format)\n\n        if 'indent' in qs_dict and len(qs_dict['indent']) > 0:\n            indent = qs_dict['indent'][0]\n            if 'true' == indent.lower():\n                indent = 4\n            else:\n                indent = None\n\n        text_hash = \\\n            hashlib.sha224(qs_dict['pmid'][0].encode('utf-8')).hexdigest()\n        print(datetime.now().strftime(time_format),\n              '[{}] text_hash: {}'.format(cur_thread_name, text_hash))\n\n        # bern_output_path = './output/bern_api_{}.{}'.format(text_hash,\n        #                                                     out_format)\n\n        # # Re-use prev. outputs\n        # if os.path.exists(bern_output_path):\n        #     with open(bern_output_path, 'r', encoding='utf-8') as f_out:\n        #         if out_format == 'json':\n        #             message = \\\n        #                 json.dumps(json.load(f_out), indent=indent,\n        #                            sort_keys=indent is not None)\n        #         elif out_format == 'pubtator':\n        #             message = f_out.read()\n        #         else:\n        #             raise ValueError('Wrong format: {}'.format(out_format))\n        #\n        #     self.wfile.write(message.encode('utf-8'))\n        #     print(datetime.now().strftime(time_format),\n        #           '[{}] Done. Found prev. output. Total {:.3f} sec\\n'.\n        #           format(cur_thread_name, time.time() - get_start_t))\n        #     return\n\n        is_raw_text = False\n\n        tmtool_start_t = time.time()\n        dict_list = pubtator_biocxml2dict_list(pmid_list)\n        tmtool_time = time.time() - tmtool_start_t\n        elapsed_time_dict['tmtool'] = round(tmtool_time, 3)\n        if dict_list is None:\n            error_dict = self.get_err_dict()\n            error_dict['pmid'] = pmid_list[0] if len(pmid_list) == 1 else ''\n            error_dict['abstract'] = 'error: tmtool: no response'\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', error_dict['abstract'])\n\n            if out_format == available_formats[0]:\n                self.wfile.write(\n                    json.dumps([get_pub_annotation(error_dict,\n                                                   is_raw_text=is_raw_text)],\n                               indent=indent,\n                               sort_keys=indent is not None).encode('utf-8'))\n            elif out_format == available_formats[1]:\n                self.wfile.write(get_pubtator([error_dict]).encode('utf-8'))\n\n            return\n        elif type(dict_list) is str:\n            error_dict = self.get_err_dict()\n            error_dict['pmid'] = pmid_list[0] if len(pmid_list) == 1 else ''\n            if 'currently unavailable' in dict_list:\n                error_dict['abstract'] = 'error: tmtool: currently unavailable'\n            elif 'invalid version format' in dict_list:\n                error_dict['abstract'] = 'error: tmtool: invalid version format'\n            else:\n                error_dict['abstract'] = 'error: tmtool: {}'.format(\n                    dict_list.replace('\\n', ''))\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', error_dict['abstract'])\n\n            if out_format == available_formats[0]:\n                self.wfile.write(\n                    json.dumps([get_pub_annotation(error_dict,\n                                                   is_raw_text=is_raw_text)],\n                               indent=indent,\n                               sort_keys=indent is not None).encode('utf-8'))\n            elif out_format == available_formats[1]:\n                self.wfile.write(get_pubtator([error_dict]).encode('utf-8'))\n\n            return\n\n        print(datetime.now().strftime(time_format),\n              '[{}] tmTool: PubMed & GNormPlus & tmVar {:.3f} sec'\n              .format(cur_thread_name, tmtool_time))\n\n        # Run BioBERT NER models of Lee et al., 2019\n        ner_start_time = time.time()\n        tagged_docs, num_entities = \\\n            self.biobert_recognize(dict_list, is_raw_text, cur_thread_name)\n        ner_time = time.time() - ner_start_time\n        elapsed_time_dict['ner'] = round(ner_time, 3)\n        if tagged_docs is None:\n            error_dict = self.get_err_dict()\n            error_dict['pmid'] = pmid_list[0] if len(pmid_list) == 1 else ''\n            error_dict['abstract'] = 'error: BioBERT NER, out of index range'\n\n            if out_format == available_formats[0]:\n                self.wfile.write(\n                    json.dumps([get_pub_annotation(error_dict,\n                                                   is_raw_text=is_raw_text)],\n                               indent=indent,\n                               sort_keys=indent is not None).encode('utf-8'))\n            elif out_format == available_formats[1]:\n                self.wfile.write(get_pubtator([error_dict]).encode('utf-8'))\n\n            return\n        print(datetime.now().strftime(time_format),\n              '[%s] NER %.3f sec, #entities: %d, #articles: %d'\n              % (cur_thread_name, ner_time, num_entities, len(tagged_docs)))\n\n        # Normalization models\n        normalization_time = 0.\n        if num_entities > 0:\n            # print(datetime.now().strftime(time_format),\n            #       '[{}] Normalization models..'.format(cur_thread_name))\n            normalization_start_time = time.time()\n            tagged_docs = self.normalizer.normalize(text_hash, tagged_docs,\n                                                    cur_thread_name,\n                                                    is_raw_text=is_raw_text)\n            normalization_time = time.time() - normalization_start_time\n        elapsed_time_dict['normalization'] = round(normalization_time, 3)\n\n        # apply output format\n        if out_format == available_formats[0]:\n\n            elapsed_time_dict['total'] = round(time.time() - get_start_t, 3)\n\n            # PubAnnotation JSON\n            pubannotation_res = list()\n            for d in tagged_docs:\n                pubannotation_res.append(\n                    get_pub_annotation(d, is_raw_text=is_raw_text,\n                                       elapsed_time_dict=elapsed_time_dict))\n            self.wfile.write(\n                json.dumps(pubannotation_res, indent=indent,\n                           sort_keys=indent is not None).encode('utf-8'))\n\n            # # Save a BERN result\n            # with open(bern_output_path, 'w', encoding='utf-8') as f_out:\n            #     json.dump(pubannotation_res, f_out)\n\n        elif out_format == available_formats[1]:\n            # PubTator\n            self.wfile.write(get_pubtator(tagged_docs).encode('utf-8'))\n\n            # # Save a BERN result\n            # with open(bern_output_path, 'w', encoding='utf-8') as f_out:\n            #     f_out.write(pubtator_res)\n\n        print(datetime.now().strftime(time_format),\n              '[{}] Done. Total {:.3f} sec\\n'.format(cur_thread_name,\n                                                     time.time() - get_start_t))\n        return\n\n    def do_POST(self):\n        post_start_t = time.time()\n        form = cgi.FieldStorage(\n            fp=self.rfile,\n            headers=self.headers,\n            environ={'REQUEST_METHOD': 'POST',\n                     'CONTENT_TYPE': self.headers['Content-Type'],\n                     }\n        )\n\n        self.send_response(200)\n        self.end_headers()\n\n        cur_thread_name = threading.current_thread().getName()\n\n        time_format = self.stm_dict['time_format']\n\n        # input\n        if 'param' not in form:\n            err_msg = [{\"error\": \"no param\"}]\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            self.wfile.write(json.dumps(err_msg).encode('utf-8'))\n            return\n\n        data = json.loads(form['param'].value)\n\n        if 'text' not in data:\n            err_msg = [{\"error\": \"no text\"}]\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            self.wfile.write(json.dumps(err_msg).encode('utf-8'))\n            return\n\n        text = str(data['text'])\n        # print(datetime.now().strftime(time_format), 'Input:', text)\n\n        if text == '':\n            err_msg = [{\"error\": \"empty text\"}]\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            self.wfile.write(json.dumps(err_msg).encode('utf-8'))\n            return\n        elif not text.strip() or text.isspace():\n            err_msg = [{\"error\": \"only whitespace letters\"}]\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            self.wfile.write(json.dumps(err_msg).encode('utf-8'))\n            return\n\n        text = self.preprocess_input(text, cur_thread_name)\n\n        # NER\n        result_dict = self.tag_entities(\n            text, cur_thread_name, is_raw_text=True, reuse=False)\n\n        if result_dict is None:\n            err_msg = [{\"error\": \"NER crash\"}]\n            print(datetime.now().strftime(time_format),\n                  '[' + cur_thread_name + ']', err_msg)\n            self.wfile.write(json.dumps(err_msg).encode('utf-8'))\n            return\n\n        result_dict_str = json.dumps(result_dict)\n\n        # # output, pretty json\n        # print(datetime.now().strftime(time_format), 'output:',\n        #       json.dumps(result_dict, indent=4, sort_keys=True))\n\n        # send message\n        self.wfile.write(result_dict_str.encode('utf-8'))\n        print(datetime.now().strftime(self.stm_dict['time_format']),\n              '[{}] Done. total {:.3f} sec\\n'\n              .format(cur_thread_name, time.time() - post_start_t))\n        return\n\n    def preprocess_input(self, text, cur_thread_name):\n\n        if '\\r\\n' in text:\n            print(datetime.now().strftime(self.stm_dict['time_format']),\n                  '[{}] Found a CRLF -> replace it w/ a space'\n                  .format(cur_thread_name))\n            text = text.replace('\\r\\n', ' ')\n\n        if '\\n' in text:\n            print(datetime.now().strftime(self.stm_dict['time_format']),\n                  '[{}] Found a line break -> replace it w/ a space'\n                  .format(cur_thread_name))\n            text = text.replace('\\n', ' ')\n\n        if '\\t' in text:\n            print(datetime.now().strftime(self.stm_dict['time_format']),\n                  '[{}] Found a tab -> replace w/ a space'\n                  .format(cur_thread_name))\n            text = text.replace('\\t', ' ')\n\n        found_too_long_words = 0\n        tokens = text.split(' ')\n        for idx, tk in enumerate(tokens):\n            if len(tk) > self.stm_dict['max_word_len']:\n                tokens[idx] = tk[:self.stm_dict['max_word_len']]\n                found_too_long_words += 1\n        if found_too_long_words > 0:\n            print(datetime.now().strftime(self.stm_dict['time_format']),\n                  '[{}] Found a too long word -> cut the suffix of the word'\n                  .format(cur_thread_name))\n            text = ' '.join(tokens)\n\n        return text\n\n    def tag_entities(self, text, cur_thread_name, is_raw_text, reuse=False):\n        assert self.stm_dict is not None\n\n        n_ascii_letters = 0\n        for l in text:\n            if l not in string.ascii_letters:\n                continue\n            n_ascii_letters += 1\n\n        if n_ascii_letters == 0:\n            text = 'No ascii letters. Please enter your text in English.'\n\n        text_hash = hashlib.sha224(text.encode('utf-8')).hexdigest()\n        print(datetime.now().strftime(self.stm_dict['time_format']),\n              '[{}] text_hash: {}'.format(cur_thread_name, text_hash))\n\n        bern_output_path = './output/bern_demo_{}.json'.format(text_hash)\n\n        if reuse and os.path.exists(bern_output_path):\n            print(datetime.now().strftime(self.stm_dict['time_format']),\n                  f'[{cur_thread_name}] Found prev. output')\n            with open(bern_output_path, 'r', encoding='utf-8') as f_out:\n                return json.load(f_out)\n\n        pubtator_file = f'{text_hash}-{cur_thread_name}.PubTator'\n        home_gnormplus = self.stm_dict['gnormplus_home']\n        input_gnormplus = os.path.join(home_gnormplus, 'input', pubtator_file)\n        output_gnormplus = os.path.join(home_gnormplus, 'output', pubtator_file)\n\n        home_tmvar2 = self.stm_dict['tmvar2_home']\n        input_dir_tmvar2 = os.path.join(home_tmvar2, 'input')\n        input_tmvar2 = os.path.join(input_dir_tmvar2, pubtator_file)\n        output_tmvar2 = os.path.join(home_tmvar2, 'output',\n                                     f'{pubtator_file}.PubTator')\n\n        # Write input str to a .PubTator format file\n        with open(input_gnormplus, 'w', encoding='utf-8') as f:\n            # only abstract\n            f.write(f'{text_hash}-{cur_thread_name}|t|\\n')\n            f.write(f'{text_hash}-{cur_thread_name}|a|{text}\\n\\n')\n\n        # Run GNormPlus\n        gnormplus_start_time = time.time()\n        gnormplus_resp = tell_inputfile(self.stm_dict['gnormplus_host'],\n                                        self.stm_dict['gnormplus_port'],\n                                        pubtator_file)\n        if gnormplus_resp is None:\n            os.remove(input_gnormplus)\n            return None\n\n        print(datetime.now().strftime(self.stm_dict['time_format']),\n              '[{}] GNormPlus {:.3f} sec'\n              .format(cur_thread_name, time.time() - gnormplus_start_time))\n\n        # Move a GNormPlus output file to the tmVar2 input directory\n        shutil.move(output_gnormplus, input_tmvar2)\n\n        # Run tmVar 2.0\n        tmvar2_start_time = time.time()\n        tmvar2_resp = tell_inputfile(self.stm_dict['tmvar2_host'],\n                                     self.stm_dict['tmvar2_port'],\n                                     pubtator_file)\n        if tmvar2_resp is None:\n            os.remove(input_gnormplus)\n            os.remove(input_tmvar2)\n            return None\n\n        print(datetime.now().strftime(self.stm_dict['time_format']),\n              '[{}] tmVar 2.0 {:.3f} sec'\n              .format(cur_thread_name, time.time() - tmvar2_start_time))\n\n        # Convert tmVar 2.0 outputs (?.PubTator.PubTator) to python dict\n        dict_list = pubtator2dict_list(output_tmvar2, is_raw_text=True)\n\n        # Delete temp files\n        os.remove(input_gnormplus)\n        os.remove(input_tmvar2)\n        os.remove(output_tmvar2)\n\n        # error\n        if type(dict_list) is str:\n            print(dict_list)\n            return None\n\n        # Run BioBERT of Lee et al., 2019\n        start_time = time.time()\n        tagged_docs, num_entities = \\\n            self.biobert_recognize(dict_list, is_raw_text, cur_thread_name)\n        if tagged_docs is None:\n            return None\n\n        assert len(tagged_docs) == 1\n        print(datetime.now().strftime(self.stm_dict['time_format']),\n              '[%s] NER %.3f sec, #entities: %d' %\n              (cur_thread_name, time.time() - start_time, num_entities))\n\n        # Normalization models\n        if num_entities > 0:\n            # print(datetime.now().strftime(time_format),\n            #       '[{}] Normalization models..'.format(cur_thread_name))\n            tagged_docs = self.normalizer.normalize(text_hash, tagged_docs,\n                                                    cur_thread_name,\n                                                    is_raw_text=is_raw_text)\n\n        # Convert to PubAnnotation JSON\n        tagged_docs[0] = get_pub_annotation(tagged_docs[0],\n                                            is_raw_text=is_raw_text)\n\n        # # Save a BERN result\n        # with open(bern_output_path, 'w', encoding='utf-8') as f_out:\n        #     json.dump(tagged_docs[0], f_out, sort_keys=True)\n\n        return tagged_docs[0]\n\n    def biobert_recognize(self, dict_list, is_raw_text, cur_thread_name):\n        res = self.stm_dict['biobert'].recognize(dict_list,\n                                                 is_raw_text=is_raw_text,\n                                                 thread_id=cur_thread_name)\n        if res is None:\n            return None, 0\n\n        num_filtered_species_per_doc = filter_entities(res, is_raw_text)\n        for n_f_spcs in num_filtered_species_per_doc:\n            if n_f_spcs[1] > 0:\n                print(datetime.now().strftime(self.stm_dict['time_format']),\n                      '[{}] Filtered {} species{}'\n                      .format(cur_thread_name, n_f_spcs[1],\n                              '' if is_raw_text\n                              else ' in PMID:%s' % n_f_spcs[0]))\n        num_entities = count_entities(res)\n        return res, num_entities\n\n    @staticmethod\n    def get_err_dict():\n        return {\n            'pmid': '',\n            'title': '',\n            'abstract': '',\n            'entities': {\n                'mutation': [],\n                'drug': [],\n                'gene': [],\n                'disease': [],\n                'species': [],\n            }\n        }\n\n\n# https://docs.python.org/3.6/library/socketserver.html#asynchronous-mixins\n# https://stackoverflow.com/a/14089457\nclass ThreadedHTTPServer(ThreadingMixIn, HTTPServer):\n    request_queue_size = 4  # to match our server's memory size (default: 5)\n\n\ndef count_entities(data):\n    num_entities = 0\n    for d in data:\n        if 'entities' not in d:\n            continue\n        doc_ett = d['entities']\n        num_entities += len(doc_ett['gene'])\n        num_entities += len(doc_ett['disease'])\n        num_entities += len(doc_ett['drug'])\n        num_entities += len(doc_ett['species'])\n        if 'mutation' in doc_ett:\n            num_entities += len(doc_ett['mutation'])\n    return num_entities\n\n\ndef tell_inputfile(host, port, inputfile):\n    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n    sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)\n    try:\n        sock.connect((host, port))\n        input_str = inputfile\n        input_stream = struct.pack('>H', len(input_str)) + input_str.encode(\n            'utf-8')\n        sock.send(input_stream)\n\n        output_stream = sock.recv(512)\n        resp = output_stream.decode('utf-8')[2:]\n\n        sock.close()\n        return resp\n    except ConnectionRefusedError as e:\n        print(e)\n        # from utils import send_mail\n        # from service_checker import FROM_GMAIL_ADDR, \\\n        #     FROM_GMAIL_ACCOUNT_PASSWORD, \\\n        #     TO_EMAIL_ADDR\n        # send_mail(FROM_GMAIL_ADDR, TO_EMAIL_ADDR,\n        #           '[BERN] Error: {}\\n'.format(type(e)),\n        #           'host:port= {}:{}\\ninputfile: {}'.format(\n        #               host, port, inputfile),\n        #           FROM_GMAIL_ADDR, FROM_GMAIL_ACCOUNT_PASSWORD)\n        return None\n    except TimeoutError as e:\n        print(e)\n        return None\n    except ConnectionResetError as e:\n        print(e)\n        return None\n\n\ndef delete_files(dirname):\n    if not os.path.exists(dirname):\n        return\n\n    n_deleted = 0\n    for f in os.listdir(dirname):\n        f_path = os.path.join(dirname, f)\n        if not os.path.isfile(f_path):\n            continue\n        # print('Delete', f_path)\n        os.remove(f_path)\n        n_deleted += 1\n    print(dirname, n_deleted)\n\n\nclass Main:\n    def __init__(self, params):\n        print(datetime.now().strftime(params.time_format), 'Starting..')\n        # os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  # verbose off(info, warning)\n        random.seed(params.seed)\n        np.random.seed(params.seed)\n        tf.set_random_seed(params.seed)\n\n        print(\"A GPU is{} available\".format(\n            \"\" if tf.test.is_gpu_available() else \" NOT\"))\n\n        stm_dict = dict()\n        stm_dict['params'] = params\n\n        FLAGS.model_dir = './biobert_ner/pretrainedBERT/'\n        FLAGS.bert_config_file = './biobert_ner/conf/bert_config.json'\n        FLAGS.vocab_file = './biobert_ner/conf/vocab.txt'\n        FLAGS.init_checkpoint = \\\n            './biobert_ner/pretrainedBERT/pubmed_pmc_470k/biobert_model.ckpt'\n\n        FLAGS.ip = params.ip\n        FLAGS.port = params.port\n\n        FLAGS.gnormplus_home = params.gnormplus_home\n        FLAGS.gnormplus_host = params.gnormplus_host\n        FLAGS.gnormplus_port = params.gnormplus_port\n\n        FLAGS.tmvar2_home = params.tmvar2_home\n        FLAGS.tmvar2_host = params.tmvar2_host\n        FLAGS.tmvar2_port = params.tmvar2_port\n\n        # import pprint\n        # pprint.PrettyPrinter().pprint(FLAGS.__flags)\n\n        stm_dict['biobert'] = BioBERT(FLAGS)\n\n        stm_dict['gnormplus_home'] = params.gnormplus_home\n        stm_dict['gnormplus_host'] = params.gnormplus_host\n        stm_dict['gnormplus_port'] = params.gnormplus_port\n\n        stm_dict['tmvar2_home'] = params.tmvar2_home\n        stm_dict['tmvar2_host'] = params.tmvar2_host\n        stm_dict['tmvar2_port'] = params.tmvar2_port\n\n        stm_dict['max_word_len'] = params.max_word_len\n        stm_dict['ner_model'] = params.ner_model\n        stm_dict['n_pmid_limit'] = params.n_pmid_limit\n        stm_dict['time_format'] = params.time_format\n        stm_dict['available_formats'] = params.available_formats\n\n        if not os.path.exists('./output'):\n            os.mkdir('output')\n        else:\n            # delete prev. version outputs\n            delete_files('./output')\n\n        delete_files(os.path.join(params.gnormplus_home, 'input'))\n        delete_files(os.path.join(params.tmvar2_home, 'input'))\n        delete_files(os.path.join('./biobert_ner', 'tmp'))\n\n        print(datetime.now().strftime(params.time_format),\n              'Starting server at http://{}:{}'.format(params.ip, params.port))\n\n        # https://stackoverflow.com/a/18445168\n        GetHandler.stm_dict = stm_dict\n        GetHandler.normalizer = Normalizer()\n\n        # https://docs.python.org/3.6/library/socketserver.html#asynchronous-mixins\n        # https://stackoverflow.com/a/14089457\n        server = ThreadedHTTPServer((params.ip, params.port), GetHandler)\n        server.serve_forever()\n\n\nif __name__ == '__main__':\n    import argparse\n\n    argparser = argparse.ArgumentParser()\n    argparser.add_argument('--ip', default='0.0.0.0')\n    argparser.add_argument('--port', type=int, default=8888)\n    argparser.add_argument('--ner_model', default='BioBERT')\n    argparser.add_argument('--max_word_len', type=int, help='word max chars',\n                           default=50)\n    argparser.add_argument('--seed', type=int, help='seed value', default=2019)\n\n    argparser.add_argument('--gnormplus_home',\n                           help='GNormPlus home',\n                           default=os.path.join(os.path.expanduser('~'),\n                                                'bern', 'GNormPlusJava'))\n    argparser.add_argument('--gnormplus_host',\n                           help='GNormPlus host', default='localhost')\n    argparser.add_argument('--gnormplus_port', type=int,\n                           help='GNormPlus port', default=18895)\n    argparser.add_argument('--tmvar2_home',\n                           help='tmVar 2.0 home',\n                           default=os.path.join(os.path.expanduser('~'),\n                                                'bern', 'tmVarJava'))\n    argparser.add_argument('--tmvar2_host',\n                           help='tmVar 2.0 host', default='localhost')\n    argparser.add_argument('--tmvar2_port', type=int,\n                           help='tmVar 2.0 port', default=18896)\n\n    argparser.add_argument('--n_pmid_limit', type=int,\n                           help='max # of pmids', default=10)\n    argparser.add_argument('--available_formats', type=list,\n                           help='output formats', default=['json', 'pubtator'])\n    argparser.add_argument('--time_format',\n                           help='time format', default='[%d/%b/%Y %H:%M:%S.%f]')\n\n    args = argparser.parse_args()\n\n    Main(args)\n"
  },
  {
    "path": "service_checker.py",
    "content": "from datetime import datetime\nimport math\nimport numpy as np\nimport random\nfrom utils \\\n    import is_good, is_get_good, send_mail, test_bern_get, test_bern_post, query\n\nFROM_GMAIL_ADDR = 'YOUR_GMAIL_ADDR'\nFROM_GMAIL_ACCOUNT_PASSWORD = 'YOUR_GMAIL_PASSWORD'\nTO_EMAIL_ADDR = 'TO_EMAIL_ADDR'\n\n\ndef check_bern(from_gmail, to_email, from_google_account, from_google_password):\n    results = list()\n\n    # 0. raw text\n    results.append(is_good())\n\n    # 1. pmid, json\n    results.append(is_get_good(29446767, 'json', 3, 10))\n\n    # 2. pmid, pubtator\n    results.append(is_get_good(29446767, 'pubtator', 3, 10))\n\n    # 3. mutiple pmid\n    results.append(is_get_good([29446767, 25681199], 'json', 4, 32))\n\n    acceptables = ['success', 'tmtool error']\n\n    problems = list()\n    for ridx, r in enumerate(results):\n\n        if r in acceptables:\n            continue\n\n        problems.append('{}: {}'.format(ridx, r))\n\n    if len(problems) == 0:\n        print(datetime.now(), 'No problem')\n    else:\n        problems_total = ', '.join(problems)\n        print(datetime.now(), 'Found', problems_total)\n        send_mail(from_gmail, to_email,\n                  '[BERN] Error(s) {}'.format(problems_total),\n                  '\\n'.join(problems),\n                  from_google_account, from_google_password)\n\n\ndef benchmark(tries, batch_size=None, log_interval=100):\n    mutation_times = list()\n    ner_times = list()\n    normalization_times = list()\n    total_times = list()\n\n    pmids = random.sample(range(0, 31113013), tries)\n    print('pmids[:10]', pmids[:min(10, tries)])\n\n    if batch_size is not None:\n        batch_pmids = list()\n        num_batches = math.ceil(len(pmids) / batch_size)\n\n        for i in range(num_batches):\n\n            # last\n            if i == num_batches - 1:\n                batch_pmids.append(pmids[i * batch_size:])\n            else:\n                batch_pmids.append(pmids[i * batch_size:(i+1) * batch_size])\n\n        pmids = batch_pmids\n\n    num_na = 0\n    num_not_list = 0\n    num_not_dict = 0\n    ooi_list = list()\n    num_error_dict = dict()\n    with open('benchmark.tsv', 'w', encoding='utf-8') as f:\n        for pidx, pmid in enumerate(pmids):\n            res_dict_list = query(pmid)\n            if type(res_dict_list) is not list:\n                print('not list', pmid, sep='\\t')\n                num_not_list += 1\n                continue\n\n            if type(res_dict_list[0]) is not dict:\n                print('not dict', pmid, sep='\\t')\n                num_not_dict += 1\n                continue\n\n            if 'text' in res_dict_list[0]:\n                if 'out of index range' in res_dict_list[0]['text']:\n                    ooi_list.append(pmid)\n                    print('out of index range', pmid, sep='\\t')\n                elif 'BioC.key' in res_dict_list[0]['text']:\n                    num_na += 1\n                    # print(res_dict_list[0]['text'], pmid, sep='\\t')\n                elif 'error: ' in res_dict_list[0]['text'] \\\n                        and 'elapsed_time' not in res_dict_list[0]:\n                    if res_dict_list[0]['text'] in num_error_dict:\n                        num_error_dict[res_dict_list[0]['text']] += 1\n                    else:\n                        num_error_dict[res_dict_list[0]['text']] = 1\n\n            if 'elapsed_time' not in res_dict_list[0]:\n                # print('no elapsed_time', pmid, sep='\\t')\n                continue\n\n            elapsed_time_dict = res_dict_list[0]['elapsed_time']\n            mutation_times.append(elapsed_time_dict['tmtool'])\n            ner_times.append(elapsed_time_dict['ner'])\n            normalization_times.append(elapsed_time_dict['normalization'])\n            total_times.append(elapsed_time_dict['total'])\n\n            valid_results = len(mutation_times)\n\n            if pidx > 0 and (pidx + 1) % log_interval == 0:\n                print(datetime.now(), '{}/{}'.format(pidx + 1, tries),\n                      '#valid_results', valid_results, '#N/A', num_na,\n                      '#not_list', num_not_list, '#not_dict', num_not_dict,\n                      '#ooi', len(ooi_list), ooi_list, '#err', num_error_dict)\n\n            if valid_results > 0 and valid_results % log_interval == 0:\n                print(datetime.now(), '#valid_results', valid_results)\n                mutation_res = \\\n                    '\\t'.join(['{:.3f}'.format(v)\n                               for v in get_stats(mutation_times,\n                                                  batch_size=batch_size)])\n                ner_res = \\\n                    '\\t'.join(['{:.3f}'.format(v)\n                               for v in get_stats(ner_times,\n                                                  batch_size=batch_size)])\n                normalization_res = \\\n                    '\\t'.join(['{:.3f}'.format(v)\n                               for v in get_stats(normalization_times,\n                                                  batch_size=batch_size)])\n                total_res = \\\n                    '\\t'.join(['{:.3f}'.format(v)\n                               for v in get_stats(total_times,\n                                                  batch_size=batch_size)])\n                print(valid_results, 'mutation', mutation_res, sep='\\t')\n                print(valid_results, 'ner', ner_res, sep='\\t')\n                print(valid_results, 'normalization', normalization_res,\n                      sep='\\t')\n                print(valid_results, 'total', total_res, sep='\\t')\n                f.write('{}\\t{}\\t{}\\n'.format(valid_results, 'mutation NER',\n                                              mutation_res))\n                f.write('{}\\t{}\\t{}\\n'.format(valid_results, 'NER',\n                                              ner_res))\n                f.write('{}\\t{}\\t{}\\n'.format(valid_results, 'normalization',\n                                              normalization_res))\n                f.write('{}\\t{}\\t{}\\n'.format(valid_results, 'total',\n                                              total_res))\n                f.flush()\n\n    print('#valid_results', len(mutation_times))\n    print('mutation',\n          '\\t'.join(['{:.3f}'.format(v)\n                     for v in get_stats(mutation_times,\n                                        batch_size=batch_size)]), sep='\\t')\n    print('ner',\n          '\\t'.join(['{:.3f}'.format(v)\n                     for v in get_stats(ner_times,\n                                        batch_size=batch_size)]), sep='\\t')\n    print('normalization',\n          '\\t'.join(['{:.3f}'.format(v)\n                     for v in get_stats(normalization_times,\n                                        batch_size=batch_size)]), sep='\\t')\n    print('total',\n          '\\t'.join(['{:.3f}'.format(v)\n                     for v in get_stats(total_times,\n                                        batch_size=batch_size)]), sep='\\t')\n\n\ndef get_stats(lst, batch_size=None):\n    if not lst:\n        return None\n\n    if batch_size is None:\n        return sum(lst) / len(lst), np.std(lst), min(lst), max(lst)\n    else:\n        return (sum(lst) / len(lst)) / batch_size, \\\n               np.std(lst), min(lst) / batch_size, max(lst) / batch_size\n\n\ndef stress_test(num_threads, wait_seconds, num_try):\n    test_bern_get(num_threads, wait_seconds, num_try)\n    test_bern_post('CLAPO syndrome: identification of somatic activating '\n                   'PIK3CA mutations and delineation of the natural history '\n                   'and phenotype. Purpose CLAPO syndrome is a rare vascular '\n                   'disorder characterized by capillary malformation of the '\n                   'lower lip, lymphatic malformation predominant on the face'\n                   ' and neck, asymmetry and partial/generalized overgrowth. '\n                   'Here we tested the hypothesis that, although the genetic '\n                   'cause is not known, the tissue distribution of the '\n                   'clinical manifestations in CLAPO seems to follow a '\n                   'pattern of somatic mosaicism. Methods We clinically '\n                   'evaluated a cohort of 13 patients with CLAPO and screened'\n                   ' 20 DNA blood/tissue samples from 9 patients using '\n                   'high-throughput, deep sequencing. Results We identified '\n                   'five activating mutations in the PIK3CA gene in affected '\n                   'tissues from 6 of the 9 patients studied; one of the '\n                   'variants (NM_006218.2:c.248T>C; p.Phe83Ser) has not been '\n                   'previously described in developmental disorders. '\n                   'Conclusion We describe for the first time the presence '\n                   'of somatic activating PIK3CA mutations in patients with '\n                   'CLAPO. We also report an update of the phenotype and '\n                   'natural history of the syndrome.',\n                   num_threads, wait_seconds, num_try)\n\n\nif __name__ == '__main__':\n    check_bern(FROM_GMAIL_ADDR, TO_EMAIL_ADDR,\n               FROM_GMAIL_ADDR, FROM_GMAIL_ACCOUNT_PASSWORD)\n"
  },
  {
    "path": "stop_normalizers.sh",
    "content": "#!/usr/bin/env bash\n\npid=`ps auxww | grep gnormplus-normalization_19.jar | grep -v grep | awk '{print $2}' | sort -r`\nif [ \"$pid\" != \"\" ]; then\n  kill -9 \"$pid\"\n  echo \"Stopped gnormplus-normalization_19.jar\"\nelse\n  echo \"No gnormplus-normalization_19.jar found to stop.\"\nfi\n\npid=`ps auxww | grep species_normalizer.py | grep -v grep | awk '{print $2}' | sort -r`\nif [ \"$pid\" != \"\" ]; then\n  kill -9 \"$pid\"\n  echo \"Stopped species_normalizer.py\"\nelse\n  echo \"No species_normalizer.py found to stop.\"\nfi\n\npid=`ps auxww | grep chemical_normalizer.py | grep -v grep | awk '{print $2}' | sort -r`\nif [ \"$pid\" != \"\" ]; then\n  kill -9 \"$pid\"\n  echo \"Stopped chemical_normalizer.py\"\nelse\n  echo \"No chemical_normalizer.py found to stop.\"\nfi\n\npid=`ps auxww | grep mutation_normalizer.py | grep -v grep | awk '{print $2}' | sort -r`\nif [ \"$pid\" != \"\" ]; then\n  kill -9 \"$pid\"\n  echo \"Stopped mutation_normalizer.py\"\nelse\n  echo \"No mutation_normalizer.py found to stop.\"\nfi\n\npid=`ps auxww | grep disease_normalizer_19 | grep -v grep | awk '{print $2}' | sort -r`\nif [ \"$pid\" != \"\" ]; then\n  kill -9 \"$pid\"\n  echo \"Stopped disease_normalizer\"\nelse\n  echo \"No disease_normalizer found to stop.\"\nfi\n\n\nrm -rf normalization/resources/inputs/gene/*\nrm -rf normalization/resources/inputs/chemical/*\nrm -rf normalization/resources/inputs/disease/*\nrm -rf normalization/resources/inputs/species/*\nrm -rf normalization/resources/inputs/mutation/*\n\nrm -rf normalization/resources/outputs/gene/*\nrm -rf normalization/resources/outputs/chemical/*\nrm -rf normalization/resources/outputs/disease/*\nrm -rf normalization/resources/outputs/species/*\nrm -rf normalization/resources/outputs/mutation/*\n\nrm -rf normalization/resources/normalizers/gene/tmp/*\n\n# sh reset.sh\n"
  },
  {
    "path": "utils.py",
    "content": "from email.mime.text import MIMEText\nimport random\nimport requests\nimport smtplib\nimport subprocess\nimport time\nimport threading\nfrom convert import pubtator2pubannotation\n\n\ndef query_raw(text, url='https://bern.korea.ac.kr/plain'):\n    return requests.post(url, data={'sample_text': text}).json()\n\n\ndef query(pmid, url='https://bern.korea.ac.kr/pubmed', output_format='json',\n          verbose=False):\n    res = None\n    if type(pmid) is str or type(pmid) is int:\n        res = requests.get('{}/{}/{}'.format(url, pmid, output_format))\n    elif type(pmid) is list:\n        if len(pmid) == 0:\n            print('No pmid')\n            return res\n\n        pmid = [str(p) for p in pmid if type(p) is not str]\n        res = requests.get('{}/{}/{}'.format(url, ','.join(pmid),\n                                             output_format))\n\n    if verbose:\n        print('pmid', pmid, 'result', res.text)\n\n    if output_format == 'pubtator':\n        return res.text\n    return res.json()\n\n\ndef test_bern_get(num_thread, period_delay_seconds, tries,\n                  url='https://bern.korea.ac.kr/pubmed'):\n    for _ in range(tries):\n        pmids = random.sample(range(0, 30400000), num_thread)\n\n        print(url, pmids)\n\n        threads = list()\n        for pmid in pmids:\n            t = threading.Thread(target=query,\n                                 args=(pmid, url, 'json', True))\n            t.daemon = True\n            t.start()\n            threads.append(t)\n\n        # block until all tasks are done\n        for t in threads:\n            t.join()\n\n        time.sleep(period_delay_seconds)\n\n\ndef test_bern_post(base_text, num_thread, period_delay_seconds, tries,\n                   url='https://bern.korea.ac.kr/plain'):\n    for _ in range(tries):\n        random_numbers = random.sample(range(0, 99999999), num_thread)\n\n        print(url, random_numbers)\n\n        threads = list()\n        for random_number in random_numbers:\n            t = threading.Thread(target=query_raw,\n                                 args=('{} {}'.format(base_text, random_number),\n                                       url))\n            t.daemon = True\n            t.start()\n            threads.append(t)\n\n        # block until all tasks are done\n        for t in threads:\n            t.join()\n\n        time.sleep(period_delay_seconds)\n\n\n# Ref.\n# https://www.endpoint.com/blog/2015/01/28/getting-realtime-output-using-python\ndef run_command(command, cwd):\n    process = subprocess.Popen(command, stdout=subprocess.PIPE, cwd=cwd)\n    while True:\n        output = process.stdout.readline().decode('utf-8')\n        if output == '' and process.poll() is not None:\n            break\n        if output:\n            print(output.strip())\n    rc = process.poll()\n    return rc\n\n\ndef ps_grep(q):\n    ps_process = subprocess.Popen([\"ps\", \"aux\"], stdout=subprocess.PIPE)\n    grep_process = subprocess.Popen([\"egrep\", q], stdin=ps_process.stdout,\n                                    stdout=subprocess.PIPE)\n    ps_process.stdout.close()\n    output = grep_process.communicate()[0]\n    return output.decode('utf-8')\n\n\ndef get_bern_status(ps_grep_res):\n    status = 0\n    off_list = list()\n\n    # mutation taggers\n    mutation_taggers = ['tmVar2Server.jar', 'GNormPlusServer.jar']\n    for mt in mutation_taggers:\n        if mt in ps_grep_res:\n            status += 1\n        else:\n            off_list.append(mt)\n\n    # normalizers\n    normalizers = ['GNormPlus_180921.jar',\n                   'disease_normalizer_181030.jar', 'chemical_normalizer.py',\n                   'mutation_normalizer.py', 'species_normalizer.py']\n    for norm in normalizers:\n        if norm in ps_grep_res:\n            status += 1\n        else:\n            off_list.append(norm)\n\n    # back-end and front-end\n    be_fe = ['python3 -u server.py', 'node bern_server.js']\n    for bf in be_fe:\n        if bf in ps_grep_res:\n            status += 1\n        else:\n            off_list.append(bf)\n\n    return status, off_list\n\n\ndef send_mail(from_addr, to, subject, content, gmail_id, password):\n    msg = MIMEText(content)\n    msg['Subject'] = subject\n    msg['From'] = from_addr\n    msg['To'] = to\n\n    # Send the message via our own SMTP server.\n    s = smtplib.SMTP('smtp.gmail.com', 587)\n    s.ehlo()\n    s.starttls()\n    s.ehlo()\n    s.login(gmail_id, password)\n    s.send_message(msg)\n    print('Mail has been sent')\n    s.quit()\n\n\ndef is_good(num_type_set=3, normal_id_cnt=13):\n    try:\n        # A part of PMID:29446767\n        post_res = query_raw('{} {}'.format(\n            'CLAPO syndrome: identification of somatic activating PIK3CA '\n            'mutations '\n            'and delineation of the natural history and phenotype. Purpose '\n            'CLAPO '\n            'syndrome is a rare vascular disorder characterized by capillary '\n            'malformation of the lower lip, lymphatic malformation predominant '\n            'on the face and neck, asymmetry, and partial/generalized '\n            'overgrowth. '\n            'Here we tested the hypothesis that, although the genetic cause is '\n            'not known, the tissue distribution of the clinical manifestations '\n            'in CLAPO seems to follow a pattern of somatic mosaicism.'\n            ' Methods We '\n            'clinically evaluated a cohort of 13 patients with CLAPO and '\n            'screened '\n            '20 DNA blood/tissue samples from 9 patients using '\n            'high-throughput, '\n            'deep sequencing. Results We identified five activating mutations '\n            'in the PIK3CA gene in affected tissues from 6 of the 9 patients '\n            'studied; one of the variants (NM_006218.2:c.248T>C; p.Phe83Ser) '\n            'has not been previously described in developmental disorders. '\n            'Conclusion We describe for the first time the presence of somatic '\n            'activating PIK3CA mutations in patients with CLAPO. We also '\n            'report '\n            'an update of the phenotype and natural history of the syndrome. '\n            'Imatinib is a asdf of homo sapiens ...', 2019.8))\n    except requests.exceptions.ConnectionError:\n        return 'ConnectionError'\n\n    if 'denotations' not in post_res:\n        print('No denotations')\n        return 'No denotations'\n\n    # all entity types\n    id_cnt = 0\n    type_set = set()\n    for d in post_res['denotations']:\n        type_set.add(d['obj'])\n        if 'CUI-less' == d['id'][0]:\n            continue\n        id_cnt += 1\n\n    if len(type_set) != num_type_set:\n        print('Found an NER problem:', num_type_set, '!=', len(type_set))\n        return 'NER problem #types: {} != {}'.format(num_type_set,\n                                                     len(type_set))\n\n    if id_cnt != normal_id_cnt:\n        print('Found a normalization problem:', normal_id_cnt, '!=', id_cnt)\n        return 'Normalization problem #norm. ids: {} != {}'.format(\n            normal_id_cnt, id_cnt)\n\n    return 'success'\n\n\ndef is_get_good(pmid, output_format, num_type_set, normal_id_cnt):\n    get_res = query(pmid, url='https://bern.korea.ac.kr/pubmed',\n                    output_format=output_format, verbose=False)\n\n    if output_format.lower() == 'pubtator':\n        get_res = pubtator2pubannotation(get_res)\n\n    if type(get_res) is str:\n        return get_res\n\n    # get_res should be a list\n    if type(get_res) is not list:\n        return 'no list: {}'.format(type(get_res))\n\n    if not get_res:\n        return 'no result'\n\n    if 'error: tmtool:' in get_res[0]['text']:\n        return 'tmtool error'\n\n    id_cnt = 0\n    type_set = set()\n\n    for gr in get_res:\n        if 'denotations' not in gr:\n            if 'sourceid' in gr:\n                print('No denotations, sourceid:', gr['sourceid'])\n            else:\n                print('No denotations, gr:', gr)\n            return 'pmid: {}, No denotations {}'.format(pmid, gr)\n\n        for d in gr['denotations']:\n            type_set.add(d['obj'])\n            if 'CUI-less' == d['id'][0]:\n                continue\n            id_cnt += 1\n\n        # print(gr['sourceid'], '#types', len(type_set))\n        # print(gr['sourceid'], '#ids', id_cnt)\n\n    if len(type_set) != num_type_set:\n        print('Found an NER problem #types: {} != {}'.format(\n            num_type_set, len(type_set)))\n        return 'pmid: {}, {}, NER problem,  #types: {} != {}'.format(\n            pmid, output_format.lower(), num_type_set, len(type_set))\n\n    if id_cnt != normal_id_cnt:\n        print('Found a normalization problem: got', id_cnt,\n              'expected', normal_id_cnt)\n        return 'pmid: {}, {}, normalizer problem, got {} expected {}'.format(\n            pmid, output_format.lower(), id_cnt, normal_id_cnt)\n\n    return 'success'\n\n\n# Ref. dict of SR4GN\nspecies_human_excl_homo_sapiens = \\\n    'person|infant|Child|people|participants|woman|' \\\n    'Girls|Man|Peoples|Men|Participant|Patients|' \\\n    'humans|Persons|mans|participant|Infants|Boys|' \\\n    'Human|Humans|Women|children|Mans|child|Participants|Girl|' \\\n    'Infant|girl|patient|patients|boys|men|infants|' \\\n    'man|girls|Children|Boy|women|persons|human|Woman|' \\\n    'peoples|Patient|People|boy|Person'.split('|')\n\n\ndef filter_entities(ner_results, is_raw_text):\n    num_filtered_species_per_doc = list()\n\n    for idx, paper in enumerate(ner_results):\n\n        if is_raw_text:\n            content = paper['abstract']\n        else:\n            if len(paper['abstract']) > 0:\n                content = paper['title'] + ' ' + paper['abstract']\n            else:\n                content = paper['title']\n\n        valid_species = list()\n        species = paper['entities']['species']\n        for spcs in species:\n            entity_mention = content[spcs['start']:spcs['end']+1]\n            if entity_mention in species_human_excl_homo_sapiens:\n                spcs['end'] += 1\n                continue\n            valid_species.append(spcs)\n\n        num_filtered_species = len(species) - len(valid_species)\n        if num_filtered_species > 0:\n            paper['entities']['species'] = valid_species\n\n        num_filtered_species_per_doc.append((paper['pmid'],\n                                             num_filtered_species))\n\n    return num_filtered_species_per_doc\n"
  }
]