diff --git a/examples/conformer/config.yml b/examples/conformer/config.yml index e370a1a9eb..d3c2d3fa2e 100755 --- a/examples/conformer/config.yml +++ b/examples/conformer/config.yml @@ -24,14 +24,14 @@ speech_config: normalize_per_feature: False decoder_config: - vocabulary: ./vocabularies/librispeech_train_4_4076.subwords + vocabulary: ./vocabularies/librispeech/librispeech_train_4_1030.subwords target_vocab_size: 4096 max_subword_length: 4 blank_at_zero: True beam_width: 5 norm_score: True corpus_files: - - /mnt/Miscellanea/Datasets/Speech/LibriSpeech/train-clean-100/transcripts.tsv + - /media/nlhuy/Data/ML/Datasets/ASR/Raw/LibriSpeech/train-clean-100/transcripts.tsv model_config: name: conformer @@ -74,7 +74,7 @@ learning_config: num_masks: 1 mask_factor: 27 data_paths: - - /mnt/Miscellanea/Datasets/Speech/LibriSpeech/train-clean-100/transcripts.tsv + - /media/nlhuy/Data/ML/Datasets/ASR/Raw/LibriSpeech/train-clean-100/transcripts.tsv tfrecords_dir: /mnt/Miscellanea/Datasets/Speech/LibriSpeech/tfrecords shuffle: True cache: True @@ -84,9 +84,7 @@ learning_config: eval_dataset_config: use_tf: True - data_paths: - - /mnt/Miscellanea/Datasets/Speech/LibriSpeech/dev-clean/transcripts.tsv - - /mnt/Miscellanea/Datasets/Speech/LibriSpeech/dev-other/transcripts.tsv + data_paths: null tfrecords_dir: /mnt/Miscellanea/Datasets/Speech/LibriSpeech/tfrecords shuffle: False cache: True @@ -96,8 +94,7 @@ learning_config: test_dataset_config: use_tf: True - data_paths: - - /mnt/Miscellanea/Datasets/Speech/LibriSpeech/test-clean/transcripts.tsv + data_paths: null tfrecords_dir: /mnt/Miscellanea/Datasets/Speech/LibriSpeech/tfrecords shuffle: False cache: True diff --git a/examples/conformer/train_tpu_keras_subword_conformer.py b/examples/conformer/train_tpu_keras_subword_conformer.py index a6126c6933..cb78ce4db3 100644 --- a/examples/conformer/train_tpu_keras_subword_conformer.py +++ b/examples/conformer/train_tpu_keras_subword_conformer.py @@ -46,6 +46,8 @@ parser.add_argument("--subwords_corpus", nargs="*", type=str, default=[], help="Transcript files for generating subwords") +parser.add_argument("--saved", type=str, default=None, help="Path to saved model") + args = parser.parse_args() tf.config.optimizer.set_experimental_options({"auto_mixed_precision": args.mxp}) @@ -108,6 +110,9 @@ conformer._build(speech_featurizer.shape, prediction_shape=text_featurizer.prepand_shape, batch_size=global_batch_size) conformer.summary(line_length=120) + if args.saved: + conformer.load_weights(args.saved, by_name=True, skip_mismatch=True) + optimizer = tf.keras.optimizers.Adam( TransformerSchedule( d_model=conformer.dmodel, diff --git a/examples/contextnet/train_tpu_keras_subword_contextnet.py b/examples/contextnet/train_tpu_keras_subword_contextnet.py index b75e541d34..97b172add6 100644 --- a/examples/contextnet/train_tpu_keras_subword_contextnet.py +++ b/examples/contextnet/train_tpu_keras_subword_contextnet.py @@ -46,6 +46,8 @@ parser.add_argument("--subwords_corpus", nargs="*", type=str, default=[], help="Transcript files for generating subwords") +parser.add_argument("--saved", type=str, default=None, help="Path to saved model") + args = parser.parse_args() tf.config.optimizer.set_experimental_options({"auto_mixed_precision": args.mxp}) @@ -108,6 +110,9 @@ contextnet._build(speech_featurizer.shape, prediction_shape=text_featurizer.prepand_shape, batch_size=global_batch_size) contextnet.summary(line_length=120) + if args.saved: + contextnet.load_weights(args.saved, by_name=True, skip_mismatch=True) + optimizer = tf.keras.optimizers.Adam( TransformerSchedule( d_model=contextnet.dmodel, diff --git a/setup.py b/setup.py index 11f12cd8bb..17c5719d42 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ setuptools.setup( name="TensorFlowASR", - version="0.7.8", + version="0.8.0", author="Huy Le Nguyen", author_email="nlhuy.cs.16@gmail.com", description="Almost State-of-the-art Automatic Speech Recognition using Tensorflow 2", diff --git a/tensorflow_asr/datasets/asr_dataset.py b/tensorflow_asr/datasets/asr_dataset.py index 0bfb28377c..a8d8045680 100755 --- a/tensorflow_asr/datasets/asr_dataset.py +++ b/tensorflow_asr/datasets/asr_dataset.py @@ -22,7 +22,7 @@ from .base_dataset import BaseDataset, BUFFER_SIZE, TFRECORD_SHARDS, AUTOTUNE from ..featurizers.speech_featurizers import load_and_convert_to_wav, read_raw_audio, tf_read_raw_audio, SpeechFeaturizer from ..featurizers.text_featurizers import TextFeaturizer -from ..utils.utils import bytestring_feature, get_num_batches, preprocess_paths, get_nsamples_from_duration +from ..utils.utils import bytestring_feature, get_num_batches, preprocess_paths class ASRDataset(BaseDataset): @@ -54,9 +54,7 @@ def __init__(self, def compute_metadata(self): self.read_entries() for _, duration, indices in tqdm.tqdm(self.entries, desc=f"Computing metadata for entries in {self.stage} dataset"): - nsamples = get_nsamples_from_duration(duration, sample_rate=self.speech_featurizer.sample_rate) - # https://www.tensorflow.org/api_docs/python/tf/signal/frame - input_length = -(-nsamples // self.speech_featurizer.frame_step) + input_length = self.speech_featurizer.get_length_from_duration(duration) label = str(indices).split() label_length = len(label) self.speech_featurizer.update_length(input_length) diff --git a/tensorflow_asr/featurizers/speech_featurizers.py b/tensorflow_asr/featurizers/speech_featurizers.py index 7421a61eaa..c6905f9696 100755 --- a/tensorflow_asr/featurizers/speech_featurizers.py +++ b/tensorflow_asr/featurizers/speech_featurizers.py @@ -11,10 +11,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import os import io import abc import six +import math import numpy as np import librosa import soundfile as sf @@ -219,6 +221,7 @@ def __init__(self, speech_config: dict): self.normalize_signal = speech_config.get("normalize_signal", True) self.normalize_feature = speech_config.get("normalize_feature", True) self.normalize_per_feature = speech_config.get("normalize_per_feature", False) + self.center = speech_config.get("center", True) # Length self.max_length = 0 @@ -232,6 +235,11 @@ def shape(self) -> list: """ The shape of extracted features """ raise NotImplementedError() + def get_length_from_duration(self, duration): + nsamples = math.ceil(float(duration) * self.sample_rate) + if self.center: nsamples += self.nfft + return 1 + (nsamples - self.nfft) // self.frame_step # https://www.tensorflow.org/api_docs/python/tf/signal/frame + def update_length(self, length: int): self.max_length = max(self.max_length, length) @@ -280,7 +288,7 @@ def shape(self) -> list: def stft(self, signal): return np.square( np.abs(librosa.core.stft(signal, n_fft=self.nfft, hop_length=self.frame_step, - win_length=self.frame_length, center=False, window="hann"))) + win_length=self.frame_length, center=self.center, window="hann"))) def power_to_db(self, S, ref=1.0, amin=1e-10, top_db=80.0): return librosa.power_to_db(S, ref=ref, amin=amin, top_db=top_db) @@ -409,9 +417,14 @@ def shape(self) -> list: return [length, self.num_feature_bins, 1] def stft(self, signal): - return tf.square( - tf.abs(tf.signal.stft(signal, frame_length=self.frame_length, - frame_step=self.frame_step, fft_length=self.nfft, pad_end=True))) + if self.center: signal = tf.pad(signal, [[self.nfft // 2, self.nfft // 2]], mode="REFLECT") + window = tf.signal.hann_window(self.frame_length, periodic=True) + left_pad = (self.nfft - self.frame_length) // 2 + right_pad = self.nfft - self.frame_length - left_pad + window = tf.pad(window, [[left_pad, right_pad]]) + framed_signals = tf.signal.frame(signal, frame_length=self.nfft, frame_step=self.frame_step) + framed_signals *= window + return tf.square(tf.abs(tf.signal.rfft(framed_signals, [self.nfft]))) def power_to_db(self, S, ref=1.0, amin=1e-10, top_db=80.0): if amin <= 0: diff --git a/tensorflow_asr/losses/keras/ctc_losses.py b/tensorflow_asr/losses/keras/ctc_losses.py index e1ee12cbd1..9b46fa6670 100644 --- a/tensorflow_asr/losses/keras/ctc_losses.py +++ b/tensorflow_asr/losses/keras/ctc_losses.py @@ -17,8 +17,8 @@ class CtcLoss(tf.keras.losses.Loss): - def __init__(self, blank=0, global_batch_size=None, reduction=tf.keras.losses.Reduction.NONE, name=None): - super(CtcLoss, self).__init__(reduction=reduction, name=name) + def __init__(self, blank=0, global_batch_size=None, name=None): + super(CtcLoss, self).__init__(reduction=tf.keras.losses.Reduction.NONE, name=name) self.blank = blank self.global_batch_size = global_batch_size diff --git a/tensorflow_asr/losses/keras/rnnt_losses.py b/tensorflow_asr/losses/keras/rnnt_losses.py index 76f5c92e31..14e0915e55 100644 --- a/tensorflow_asr/losses/keras/rnnt_losses.py +++ b/tensorflow_asr/losses/keras/rnnt_losses.py @@ -17,8 +17,8 @@ class RnntLoss(tf.keras.losses.Loss): - def __init__(self, blank=0, global_batch_size=None, reduction=tf.keras.losses.Reduction.NONE, name=None): - super(RnntLoss, self).__init__(reduction=reduction, name=name) + def __init__(self, blank=0, global_batch_size=None, name=None): + super(RnntLoss, self).__init__(reduction=tf.keras.losses.Reduction.NONE, name=name) self.blank = blank self.global_batch_size = global_batch_size diff --git a/tensorflow_asr/utils/metrics.py b/tensorflow_asr/utils/metrics.py index eb8049ebbc..efb59ed452 100644 --- a/tensorflow_asr/utils/metrics.py +++ b/tensorflow_asr/utils/metrics.py @@ -13,22 +13,12 @@ # limitations under the License. from typing import Tuple -import numpy as np import tensorflow as tf from nltk.metrics import distance from .utils import bytes_to_string -def wer(decode: np.ndarray, target: np.ndarray) -> Tuple[tf.Tensor, tf.Tensor]: - """Word Error Rate - - Args: - decode (np.ndarray): array of prediction texts - target (np.ndarray): array of groundtruth texts - - Returns: - tuple: a tuple of tf.Tensor of (edit distances, number of words) of each text - """ +def _wer(decode, target): decode = bytes_to_string(decode) target = bytes_to_string(target) dis = 0.0 @@ -45,16 +35,20 @@ def wer(decode: np.ndarray, target: np.ndarray) -> Tuple[tf.Tensor, tf.Tensor]: return tf.convert_to_tensor(dis, tf.float32), tf.convert_to_tensor(length, tf.float32) -def cer(decode: np.ndarray, target: np.ndarray) -> Tuple[tf.Tensor, tf.Tensor]: - """Character Error Rate +def wer(_decode: tf.Tensor, _target: tf.Tensor) -> Tuple[tf.Tensor, tf.Tensor]: + """Word Error Rate Args: decode (np.ndarray): array of prediction texts target (np.ndarray): array of groundtruth texts Returns: - tuple: a tuple of tf.Tensor of (edit distances, number of characters) of each text + tuple: a tuple of tf.Tensor of (edit distances, number of words) of each text """ + return tf.numpy_function(_wer, inp=[_decode, _target], Tout=[tf.float32, tf.float32]) + + +def _cer(decode, target): decode = bytes_to_string(decode) target = bytes_to_string(target) dis = 0 @@ -65,6 +59,36 @@ def cer(decode: np.ndarray, target: np.ndarray) -> Tuple[tf.Tensor, tf.Tensor]: return tf.convert_to_tensor(dis, tf.float32), tf.convert_to_tensor(length, tf.float32) +def cer(_decode: tf.Tensor, _target: tf.Tensor) -> Tuple[tf.Tensor, tf.Tensor]: + """Character Error Rate + + Args: + decode (np.ndarray): array of prediction texts + target (np.ndarray): array of groundtruth texts + + Returns: + tuple: a tuple of tf.Tensor of (edit distances, number of characters) of each text + """ + return tf.numpy_function(_cer, inp=[_decode, _target], Tout=[tf.float32, tf.float32]) + + +def tf_cer(decode: tf.Tensor, target: tf.Tensor) -> Tuple[tf.Tensor, tf.Tensor]: + """Tensorflwo Charactor Error rate + + Args: + decoder (tf.Tensor): tensor shape [B] + target (tf.Tensor): tensor shape [B] + + Returns: + tuple: a tuple of tf.Tensor of (edit distances, number of characters) of each text + """ + decode = tf.strings.bytes_split(decode) # [B, N] + target = tf.strings.bytes_split(target) # [B, M] + distances = tf.edit_distance(decode.to_sparse(), target.to_sparse(), normalize=False) # [B] + lengths = tf.cast(target.row_lengths(axis=1), dtype=tf.float32) # [B] + return tf.reduce_sum(distances), tf.reduce_sum(lengths) + + class ErrorRate(tf.keras.metrics.Metric): """ Metric for WER and CER """ @@ -75,10 +99,9 @@ def __init__(self, func, name="error_rate", **kwargs): self.func = func def update_state(self, decode: tf.Tensor, target: tf.Tensor): - n, d = tf.numpy_function(self.func, inp=[decode, target], Tout=[tf.float32, tf.float32]) + n, d = self.func(decode, target) self.numerator.assign_add(n) self.denominator.assign_add(d) def result(self): - if self.denominator == 0.0: return 0.0 - return (self.numerator / self.denominator) * 100 + return tf.math.divide_no_nan(self.numerator, self.denominator) * 100 diff --git a/tensorflow_asr/utils/utils.py b/tensorflow_asr/utils/utils.py index df509089f6..fef55a0cf6 100755 --- a/tensorflow_asr/utils/utils.py +++ b/tensorflow_asr/utils/utils.py @@ -238,7 +238,3 @@ def body(index, tfarray): index, tfarray = tf.while_loop(condition, body, loop_vars=[index, tfarray], swap_memory=False) return tfarray - - -def get_nsamples_from_duration(duration, sample_rate=16000): - return math.ceil(float(duration) * sample_rate) diff --git a/tests/featurizer/test_speech_featurizer.py b/tests/featurizer/test_speech_featurizer.py index 40a060a890..7ba729a32f 100644 --- a/tests/featurizer/test_speech_featurizer.py +++ b/tests/featurizer/test_speech_featurizer.py @@ -16,7 +16,9 @@ setup_environment() import librosa import numpy as np +import tensorflow as tf import matplotlib.pyplot as plt +import librosa.display from tensorflow_asr.featurizers.speech_featurizers import read_raw_audio, TFSpeechFeaturizer, NumpySpeechFeaturizer @@ -33,26 +35,28 @@ def main(argv): "normalize_feature": True, "normalize_per_feature": False, "num_feature_bins": 80, + "center": True } signal = read_raw_audio(speech_file, speech_conf["sample_rate"]) nsf = NumpySpeechFeaturizer(speech_conf) sf = TFSpeechFeaturizer(speech_conf) - ft = nsf.stft(signal) + nft = nsf.stft(signal) + print(nft.shape, np.mean(nft)) + ft = sf.stft(signal).numpy().T print(ft.shape, np.mean(ft)) - ft = sf.stft(signal).numpy() - print(ft.shape, np.mean(ft)) - ft = sf.extract(signal) + print(nft == ft) + ft = tf.squeeze(sf.extract(signal)).numpy().T plt.figure(figsize=(16, 2.5)) ax = plt.gca() ax.set_title(f"{feature_type}", fontweight="bold") - librosa.display.specshow(ft.T, cmap="magma") + librosa.display.specshow(ft, cmap="magma") v1 = np.linspace(ft.min(), ft.max(), 8, endpoint=True) plt.colorbar(pad=0.01, fraction=0.02, ax=ax, format="%.2f", ticks=v1) plt.tight_layout() # plt.savefig(argv[3]) - # plt.show() + plt.show() # plt.figure(figsize=(15, 5)) # for i in range(4): # plt.subplot(2, 2, i + 1) diff --git a/vocabularies/librispeech_train_4_1030.subwords b/vocabularies/librispeech_train_4_1030.subwords deleted file mode 100644 index e7b225b355..0000000000 --- a/vocabularies/librispeech_train_4_1030.subwords +++ /dev/null @@ -1,3849 +0,0 @@ -### SubwordTextEncoder -### Metadata: {} -'the_' -'and_' -'of_' -'to_' -'e_' -'s_' -'a_' -'d_' -'in_' -'t_' -'i_' -'was_' -'he_' -'that' -'r_' -'ed_' -'it_' -'y_' -'his_' -'ing_' -'on_' -'with' -'n_' -'er_' -'her_' -'had_' -'as_' -'h_' -'g_' -'for_' -'you_' -'but_' -'is_' -'not_' -'at_' -'she_' -'be_' -'ly_' -'ng_' -'l_' -'they' -'him_' -'by_' -'have' -'my_' -'this' -'were' -'whic' -'me_' -'le_' -'ther' -'all_' -'from' -'said' -'so_' -'one_' -'or_' -'k_' -'es_' -'an_' -'we_' -'them' -'some' -'when' -'thei' -'out_' -'no_' -'re_' -'thin' -'woul' -'what' -'if_' -'are_' -'who_' -'been' -'us_' -'thou' -'ever' -'will' -'then' -'coul' -'ce_' -'time' -'up_' -'nd_' -'more' -'red_' -'into' -'your' -'othe' -'like' -'over' -'man_' -'than' -'know' -'very' -'nt_' -'ty_' -'do_' -'litt' -'tion' -'hear' -'ted_' -'abou' -'en_' -'now_' -'look' -'afte' -'did_' -'any_' -'well' -'agai' -'ion_' -'rs_' -'shou' -'grea' -'upon' -'st_' -'hand' -'only' -'mist' -'has_' -'its_' -'our_' -'two_' -'m_' -'made' -'even' -'down' -'miss' -'befo' -'ld_' -'inte' -'long' -'thro' -'elf_' -'ght_' -'good' -'come' -'unde' -'gh_' -'such' -'thes' -'old_' -'cons' -'see_' -'wher' -'king' -'came' -'day_' -'way_' -'comp' -'how_' -'ers_' -'neve' -'it' -'cont' -'ment' -'can_' -'part' -'much' -'back' -'ent_' -'take' -'hous' -'ts_' -'se_' -'must' -'ness' -'just' -'al_' -'ve_' -'pres' -'ous_' -'here' -'ow_' -'atio' -'ied_' -'firs' -'make' -'seem' -'migh' -'am_' -'own_' -'p_' -'er' -'head' -'ns_' -'men_' -'plac' -'thre' -'hims' -'go_' -'ble_' -'may_' -'less' -'went' -'et_' -'most' -'rest' -'ugh_' -'love' -'give' -'pass' -'beca' -'say_' -'life' -'eyes' -'whil' -'call' -'nigh' -'use_' -'bein' -'thos' -'many' -'away' -'turn' -'coun' -'hing' -'hed_' -'youn' -'stra' -'th_' -'comm' -'too_' -'stil' -'foun' -'ons_' -'don' -'last' -'ch_' -'able' -'ered' -'mean' -'face' -'gs_' -'ds_' -'tell' -'noth' -'cour' -'work' -'ance' -'peop' -'righ' -'ht_' -'room' -'chil' -'year' -'ry_' -'sure' -'ys_' -'sed_' -'word' -'pers' -'o_' -'ral_' -'yet_' -'ligh' -'get_' -'ence' -'ll_' -'aske' -'happ' -'shal' -'stre' -'ting' -'saw_' -'same' -'f_' -'te_' -'off_' -'w_' -'fath' -'want' -'prin' -'brea' -'chan' -'inst' -'char' -'ge_' -'hers' -'anot' -'ss_' -'left' -'lf_' -'seve' -'once' -'ain_' -'open' -'girl' -'dist' -'ding' -'took' -'alon' -'fort' -'ped_' -'land' -'expe' -'on' -'nce_' -'led_' -'near' -'alwa' -'supp' -'frie' -'mome' -'door' -'een_' -'let_' -'new_' -'appe' -'full' -'told' -'age_' -'plea' -'ver_' -'side' -'ente' -'moth' -'mind' -'de_' -'real' -'why_' -'put_' -'soon' -'form' -'ded_' -'stat' -'poss' -'fell' -'home' -'ring' -'ter_' -'star' -'indi' -'live' -'we' -'acco' -'read' -'answ' -'wind' -'goin' -'essi' -'repl' -'care' -'diff' -'rd_' -'disc' -'name' -'natu' -'feel' -'worl' -'find' -'beli' -'ity_' -'ies_' -'stan' -'wate' -'whit' -'stor' -'kind' -'cert' -'high' -'me' -'ant_' -'woma' -'retu' -'prop' -'wish' -'est_' -'foll' -'rema' -'ined' -'carr' -'whol' -'knew' -'show' -'ged_' -'each' -'tly_' -'conc' -'serv' -'hard' -'havi' -'sing' -'gene' -'c_' -'nst_' -'you' -'bett' -'ned_' -'bega' -'quit' -'far_' -'few_' -'enou' -'eigh' -'ible' -'four' -'voic' -'ct_' -'ure_' -'shor' -'conf' -'matt' -'ks_' -'ic_' -'yes_' -'ough' -'beau' -'clos' -'ck_' -'leav' -'atte' -'got_' -'seen' -'done' -'inde' -'sir_' -'morn' -'betw' -'ess_' -'ls_' -'walk' -'fore' -'late' -'hope' -'ared' -'grou' -'hund' -'man' -'fall' -'ate_' -'orde' -'ect_' -'powe' -'ated' -'felt' -'poin' -'hour' -'reco' -'el_' -'towa' -'spea' -'her' -'wond' -'howe' -'amon' -'ed' -'half' -'ling' -'talk' -'rece' -'wood' -'try_' -'lly_' -'conv' -'poor' -'ce' -'both' -'also' -'stoo' -'perh' -'keep' -'ar_' -'ish_' -'does' -'ot_' -'icul' -'aps_' -'ened' -'myse' -'clea' -'ctio' -'oh_' -'fact' -'gent' -'co' -'smal' -'exce' -'erin' -'set_' -'nor_' -'sent' -'him' -'admi' -'gave' -'ne_' -'whom' -'tree' -'days' -'re' -'almo' -'unti' -'deli' -'sion' -'ions' -'ing' -'sand' -'mast' -'drea' -'stro' -'son_' -'best' -'thir' -'esse' -'es' -'ful_' -'ely_' -'need' -'engl' -'end_' -'ress' -'impo' -'gree' -'toge' -'step' -'so' -'fran' -'suff' -'sinc' -'sigh' -'se' -'or' -'ma' -'ly' -'tain' -'ta' -'dear' -'lo' -'doub' -'ques' -'marr' -'feet' -'roun' -'sens' -'nds_' -'anyt' -'next' -'move' -'laug' -'do' -'dark' -'reac' -'brou' -'blac' -'pt_' -'ard_' -'prov' -'ider' -'ur_' -'crie' -'smil' -'larg' -'fami' -'eve_' -'help' -'gran' -'fire' -'ming' -'lay_' -'five' -'twen' -'play' -'ose_' -'hors' -'visi' -'sudd' -'arou' -'ro' -'teen' -'capt' -'moun' -'wait' -'john' -'stru' -'go' -'forg' -'reas' -'mone' -'po' -'mber' -'lett' -'fear' -'eren' -'rath' -'ious' -'doct' -'stri' -'ship' -'case' -'appr' -'line' -'le' -'idea' -'body' -'cent' -'ved_' -'id_' -'ho' -'selv' -'uncl' -'soun' -'reme' -'terr' -'cond' -'heav' -'les_' -'grow' -'can' -'writ' -'perf' -'mont' -'he' -'gone' -'air_' -'ten_' -'cted' -'whos' -'city' -'sile' -'dire' -'desi' -'trou' -'lady' -'ked_' -'mo' -'till' -'spec' -'leas' -'wife' -'resp' -'med_' -'ice_' -'deat' -'plan' -'nge_' -'in' -'hold' -'forc' -'cann' -'prom' -'true' -'rned' -'rise' -'offi' -'fair' -'sat_' -'pret' -'ping' -'dren' -'slee' -'ofte' -'comi' -'behi' -'stop' -'ster' -'nded' -'free' -'en' -'mann' -'nts_' -'colo' -'brot' -'bed_' -'hter' -'foot' -'reli' -'enti' -'ecti' -'wome' -'spir' -'ve' -'succ' -'shed' -'belo' -'temp' -'tabl' -'duri' -'self' -'ru' -'na' -'circ' -'crea' -'la' -'beco' -'rds_' -'lord' -'el' -'book' -'al' -'trea' -'nati' -'crow' -'ces_' -'ily_' -'town' -'dy_' -'used' -'fine' -'disa' -'tifu' -'thus' -'du' -'alre' -'imme' -'fift' -'acti' -'ntio' -'draw' -'sign' -'rn_' -'poli' -'ady_' -'adva' -'watc' -'pape' -'ive_' -'expr' -'caus' -'tati' -'didn' -'at' -'prof' -'fish' -'inue' -'simp' -'held' -'rt_' -'rati' -'entl' -'bo' -'proc' -'bear' -'ythi' -'vi' -'sist' -'occu' -'ja' -'imag' -'dead' -'ward' -'says' -'sa' -'meet' -'rsta' -'owed' -'nd' -'ar' -'ac' -'road' -'red' -'obse' -'boy_' -'to' -'disp' -'chee' -'abov' -'seco' -'dang' -'us' -'sh_' -'ms_' -'si' -'offe' -'list' -'desc' -'brok' -'rose' -'ni' -'minu' -'huma' -'earl' -'acte' -'wall' -'vill' -'pe' -'et' -'rs' -'nt' -'ga' -'ying' -'quic' -'efor' -'onal' -'cra' -'hair' -'god_' -'expl' -'deep' -'coll' -'ning' -'gi' -'enly' -'ende' -'dres' -'spok' -'ory_' -'inat' -'impr' -'cove' -'va' -'quar' -'tes_' -'pain' -'ings' -'di' -'rich' -'kept' -'ke_' -'obje' -'rive' -'ows_' -'iden' -'gold' -'brow' -'trai' -'oppo' -'st' -'rega' -'flow' -'fill' -'da' -'lear' -'ey_' -'eart' -'chur' -'buil' -'maki' -'whet' -'sort' -'lu' -'ced_' -'soci' -'port' -'pe_' -'pu' -'ific' -'besi' -'bar' -'scho' -'ine_' -'brin' -'ea' -'rate' -'od_' -'su' -'ines' -'ches' -'begi' -'ah_' -'eith' -'de' -'bill' -'purp' -'itse' -'and' -'posi' -'itio' -'daug' -'sati' -'mile' -'ical' -'hill' -'perc' -'numb' -'ived' -'extr' -'busi' -'hs_' -'ured' -'rela' -'publ' -'past' -'lost' -'cast' -'up' -'trie' -'six_' -'else' -'chai' -'ture' -'th' -'swee' -'ir' -'surp' -'gove' -'om_' -'jo' -'is' -'allo' -'subj' -'stea' -'ousl' -'mate' -'big_' -'cold' -'out' -'ia' -'ali' -'pa' -'ally' -'scar' -'ng' -'ha' -'corn' -'bloo' -'nece' -'glad' -'gard' -'driv' -'dn' -'quee' -'plai' -'pen' -'cur' -'cla' -'lead' -'kill' -'diat' -'ti' -'shar' -'pris' -'hono' -'hast' -'chie' -'arms' -'ston' -'week' -'pete' -'har' -'cess' -'ber' -'reso' -'ob' -'noti' -'mill' -'iage' -'atta' -'snow' -'excl' -'prob' -'prec' -'ol' -'mark' -'fiel' -'wa' -'low_' -'gues' -'evid' -'acro' -'wild' -'tor' -'thy_' -'gro' -'ging' -'blue' -'arri' -'adde' -'acce' -'shad' -'osit' -'nort' -'ecte' -'prod' -'prev' -'mere' -'soul' -'clas' -'ainl' -'stic' -'quie' -'occa' -'nine' -'ial_' -'b_' -'touc' -'summ' -'osed' -'car' -'brig' -'te' -'secr' -'requ' -'favo' -'ery_' -'ched' -'ult' -'sold' -'insi' -'farm' -'an' -'sea_' -'ound' -'decl' -'resu' -'ol_' -'met_' -'husb' -'dest' -'view' -'one' -'ap' -'ants' -'ses_' -'oach' -'pi' -'mb' -'cial' -'whis' -'seat' -'peri' -'ia_' -'ge' -'figu' -'tone' -'ki' -'effe' -'deci' -'ures' -'repr' -'dam' -'ur' -'tran' -'spen' -'rabl' -'news' -'dar' -'ck' -'amer' -'ine' -'hung' -'fail' -'ask_' -'alth' -'ut' -'run_' -'dete' -'she' -'hist' -'ety_' -'equa' -'dis' -'bell' -'ay_' -'affe' -'acqu' -'wort' -'vo' -'ven' -'taki' -'prep' -'bu' -'ty' -'trav' -'mode' -'mari' -'ary_' -'x_' -'cu' -'safe' -'merc' -'forw' -'doin' -'trut' -'ton_' -'tend' -'sout' -'pati' -'hes_' -'as' -'ves_' -'stay' -'ps_' -'fa' -'ease' -'bank' -'assi' -'west' -'wed_' -'slow' -'livi' -'exam' -'bene' -'save' -'ill_' -'floo' -'blin' -'won' -'ul' -'pre' -'ican' -'drop' -'desp' -'usua' -'sugg' -'stud' -'rais' -'fi' -'emen' -'comf' -'war_' -'vari' -'scen' -'ents' -'test' -'sixt' -'eye_' -'exci' -'easi' -'boys' -'act_' -'wing' -'um' -'stu' -'sayi' -'rien' -'ntly' -'li' -'fast' -'esta' -'des_' -'cros' -'boar' -'wors' -'tear' -'susp' -'ri' -'ours' -'ired' -'incr' -'ight' -'ht' -'grav' -'beyo' -'ably' -'no' -'moti' -'fron' -'fo' -'chap' -'aw' -'sorr' -'soft' -'ley_' -'repe' -'op' -'nu' -'glan' -'der_' -'bra' -'ul_' -'thee' -'rt' -'fer' -'exis' -'ec' -'chin' -'ben' -'agre' -'reve' -'lar_' -'ide_' -'grac' -'ft' -'exte' -'ersa' -'enjo' -'ca' -'un' -'shin' -'che' -'ving' -'spee' -'sett' -'sal' -'roll' -'rdin' -'ran_' -'ow' -'infl' -'guar' -'ets_' -'anim' -'ties' -'pick' -'opin' -'men' -'anio' -'warm' -'sail' -'remo' -'phys' -'ee' -'clot' -'camp' -'tive' -'furt' -'figh' -'ch' -'unit' -'race' -'oc' -'neig' -'mout' -'mada' -'leng' -'deal' -'corr' -'als_' -'rmin' -'nnin' -'ne' -'info' -'boat' -'yout' -'rese' -'ny_' -'nger' -'ange' -'sk' -'pict' -'lete' -'fing' -'curi' -'ba' -'arti' -'ssar' -'rent' -'rely' -'owin' -'outs' -'none' -'mine' -'inct' -'hi' -'appl' -'rly_' -'ra' -'priv' -'cal' -'anne' -'unt_' -'ort_' -'nti' -'den' -'ciou' -'ble' -'bad_' -'adve' -'thor' -'rted' -'qui' -'prot' -'ishe' -'ion' -'beat' -'inco' -'assu' -'ans_' -'rock' -'lder' -'hurr' -'grew' -'grat' -'esti' -'ars_' -'anxi' -'ad' -'wear' -'path' -'ise_' -'im' -'gras' -'gar' -'ami' -'vere' -'thic' -'tail' -'supe' -'spri' -'piec' -'ors_' -'kly_' -'fina' -'east' -'cut_' -'cre' -'batt' -'wide' -'ver' -'tena' -'ssib' -'neit' -'caug' -'asse' -'sun_' -'sha' -'main' -'hy_' -'gath' -'drew' -'cal_' -'refu' -'musi' -'hall' -'fic' -'eive' -'born' -'affa' -'ndin' -'ka' -'ju' -'esca' -'chri' -'bi' -'ball' -'ue_' -'tica' -'que' -'od' -'nel_' -'habi' -'gett' -'frig' -'ds' -'incl' -'hy' -'fres' -'empt' -'cate' -'bea' -'sted' -'judg' -'il_' -'day' -'clou' -'aime' -'swa' -'moon' -'let' -'hel' -'enem' -'dly_' -'utte' -'repo' -'lies' -'liar' -'ko' -'eved' -'ale' -'afra' -'za' -'woun' -'phil' -'orm' -'note' -'mu' -'lt_' -'laid' -'ke' -'hat' -'ern_' -'atin' -'ant' -'rtan' -'rous' -'carl' -'barr' -'abso' -'und' -'shoo' -'seri' -'pray' -'per_' -'ns' -'mon' -'meas' -'inqu' -'inal' -'ghts' -'fro' -'erfu' -'ele' -'ard' -'ai' -'wo' -'viol' -'tt' -'rved' -'res_' -'rall' -'pan' -'myst' -'mass' -'hunt' -'dent' -'bird' -'arm_' -'vict' -'resi' -'mble' -'ill' -'icie' -'ian_' -'este' -'bles' -'ag' -'war' -'trem' -'pala' -'jour' -'eg' -'ect' -'died' -'chi' -'tu' -'sitt' -'sain' -'rnme' -'prac' -'pay_' -'boun' -'bb' -'aran' -'ago_' -'uni' -'trac' -'shee' -'lema' -'givi' -'ep' -'drag' -'cy_' -'bor' -'ain' -'ace_' -'vall' -'unco' -'til' -'swe' -'pped' -'ina' -'fren' -'coat' -'ci' -'ane' -'aint' -'purs' -'obli' -'nted' -'ft_' -'defe' -'bri' -'tru' -'swor' -'sin' -'law_' -'est' -'erty' -'enga' -'ead_' -'ya' -'wise' -'rain' -'oner' -'medi' -'lowe' -'fanc' -'suit' -'sant' -'san' -'ry' -'pt' -'min' -'labo' -'horr' -'gain' -'fly_' -'eu' -'entr' -'arch' -'all' -'accu' -'umst' -'rwar' -'pock' -'ot' -'lips' -'join' -'ex' -'espe' -'dema' -'danc' -'cely' -'brid' -'wn_' -'ual_' -'stai' -'rtun' -'roma' -'pot' -'narr' -'invi' -'em_' -'cloc' -'bott' -'wash' -'symp' -'regi' -'pin' -'impe' -'gs' -'dese' -'vel' -'tie' -'sco' -'rm' -'pil' -'os' -'ome_' -'nge' -'memo' -'lond' -'jane' -'isab' -'ic' -'god' -'fini' -'dra' -'top_' -'subs' -'soli' -'rush' -'og' -'mp' -'itte' -'gg' -'fla' -'eat_' -'conn' -'burn' -'rnoo' -'rful' -'maid' -'ins_' -'hero' -'ers' -'degr' -'bran' -'ban' -'arra' -'army' -'appa' -'aine' -'yl' -'wint' -'tra' -'ser' -'om' -'mal' -'hu' -'empl' -'effo' -'dinn' -'dare' -'uenc' -'tis' -'spar' -'sm_' -'seei' -'ric' -'psyc' -'intr' -'ifie' -'exac' -'ens_' -'auth' -'ab' -'sun' -'sta' -'secu' -'nish' -'majo' -'lift' -'lake' -'if' -'fait' -'enin' -'dom_' -'cap' -'be' -'wron' -'ua' -'surr' -'send' -'pale' -'nic' -'ngth' -'mm' -'eful' -'eede' -'dece' -'con' -'vent' -'theo' -'tche' -'ste' -'oi' -'mora' -'mess' -'lute' -'lity' -'ier_' -'cro' -'cham' -'am' -'um_' -'ters' -'rec' -'rage' -'peac' -'indu' -'id' -'hten' -'gate' -'food' -'au' -'una' -'tted' -'slig' -'shak' -'rial' -'nch' -'lad' -'devo' -'shi' -'shel' -'ruct' -'rebe' -'mos' -'doll' -'yell' -'tter' -'situ' -'sit_' -'sick' -'shop' -'ral' -'par' -'mer' -'mary' -'heal' -'hang' -'glas' -'ert' -'enco' -'easy' -'cts_' -'bled' -'uct' -'sts_' -'paus' -'ney_' -'neg' -'leme' -'je' -'fool' -'erly' -'emi' -'elle' -'bit_' -'tar' -'sy' -'swi' -'sell' -'rtai' -'pull' -'popu' -'oy' -'mor' -'mons' -'mar' -'lean' -'hal' -'bly_' -'blow' -'abr' -'tere' -'teac' -'tast' -'ssi' -'rsto' -'per' -'luck' -'lie_' -'iste' -'ici' -'harm' -'era' -'eage' -'ways' -'loud' -'kle' -'issi' -'ire_' -'hesi' -'fur' -'ew' -'elf' -'ze' -'ts' -'sel' -'rule' -'ptio' -'oti' -'oper' -'ons' -'ones' -'merr' -'lop' -'hone' -'esen' -'dom' -'cath' -'ath_' -'twel' -'tor_' -'shut' -'perm' -'llec' -'itie' -'ised' -'hol' -'fu' -'for' -'civi' -'uri' -'shot' -'sear' -'rit' -'rh' -'ret' -'ranc' -'ph' -'not' -'mana' -'lose' -'evil' -'eque' -'dle' -'dd' -'corp' -'catc' -'barb' -'air' -'wine' -'wand' -'slav' -'post' -'magi' -'llen' -'law' -'il' -'gall' -'end' -'divi' -'din' -'ade' -'addr' -'ze_' -'yed_' -'tryi' -'sole' -'silv' -'pari' -'orig' -'inve' -'ini' -'ince' -'ham' -'crim' -'advi' -'weak' -'ted' -'tall' -'shap' -'neck' -'latt' -'ital' -'blis' -'bit' -'ay' -'ande' -'ages' -'ad_' -'xi' -'wave' -'valu' -'trus' -'tre' -'ter' -'spot' -'refl' -'pp' -'mic' -'mas' -'grap' -'gen' -'duty' -'die_' -'cous' -'art_' -'val' -'tin' -'tan' -'sub' -'sla' -'sca' -'repu' -'pted' -'murd' -'mis' -'memb' -'legs' -'clu' -'broa' -'ber_' -'aunt' -'way' -'trad' -'son' -'sky_' -'ria' -'lea' -'lar' -'ip' -'holl' -'hant' -'gu' -'gle' -'ges_' -'cott' -'by' -'bed' -'avo' -'univ' -'ner_' -'mp_' -'len' -'ledg' -'knee' -'joy_' -'ggle' -'game' -'flee' -'feat' -'calm' -'asto' -'uns' -'rel' -'pet' -'ond' -'nobl' -'ll' -'isla' -'ione' -'imen' -'hypn' -'heat' -'elo' -'depa' -'bon' -'bitt' -'yard' -'titu' -'tant' -'sp' -'lled' -'inin' -'ger_' -'fain' -'comb' -'coa' -'tmen' -'term' -'smok' -'sh' -'seiz' -'see' -'sacr' -'ppea' -'nse_' -'lati' -'insu' -'ingl' -'ff_' -'citi' -'vidu' -'ut_' -'ure' -'trib' -'squa' -'rior' -'oo' -'ntag' -'mini' -'joy' -'isn' -'ies' -'fash' -'cas' -'spo' -'sle' -'pect' -'now' -'nois' -'mise' -'marc' -'ladi' -'fli' -'chas' -'bull' -'tit' -'runn' -'rts_' -'mus' -'luti' -'lock' -'itud' -'iri' -'impa' -'ey' -'erou' -'eme' -'deve' -'cry_' -'cri' -'ari' -'are' -'anci' -'urb' -'rin' -'qual' -'nged' -'nes_' -'ger' -'geor' -'flat' -'firm' -'devi' -'der' -'ave' -'art' -'une_' -'tire' -'tim' -'stag' -'slip' -'sil' -'pros' -'iers' -'hful' -'hate' -'erne' -'disg' -'bur' -'arm' -'age' -'uall' -'twi' -'tac' -'spit' -'seek' -'seas' -'row' -'ree' -'pur' -'otte' -'nn' -'mart' -'cked' -'butt' -'apar' -'york' -'tic' -'sepa' -'sea' -'ries' -'ribe' -'rapi' -'push' -'oni' -'mort' -'lt' -'lang' -'jun' -'ir_' -'eo' -'coro' -'cher' -'bla' -'zed_' -'wasn' -'ura' -'unle' -'unce' -'unc' -'ude' -'tude' -'tom' -'stin' -'skin' -'sen' -'sad' -'pond' -'orit' -'lved' -'llig' -'ig' -'ibly' -'fit_' -'ena' -'emp' -'bl' -'antl' -'anti' -'van' -'ren' -'ove' -'morr' -'mati' -'lit' -'libe' -'iron' -'gray' -'gnan' -'fun' -'awak' -'angr' -'tric' -'sty_' -'site' -'ori' -'lyin' -'lun' -'ise' -'host' -'gniz' -'fe' -'ener' -'enc' -'ybod' -'usio' -'tom_' -'stoc' -'radi' -'pric' -'parl' -'ous' -'ora' -'mil' -'inc' -'ie_' -'ie' -'hor' -'hen_' -'fra' -'ectl' -'dim' -'dan' -'capa' -'attr' -'alo' -'ado' -'welc' -'virt' -'sham' -'ruin' -'risi' -'py' -'orte' -'mous' -'ida' -'ict' -'hbor' -'grad' -'germ' -'eni' -'ef_' -'edge' -'cke' -'bre' -'ass' -'arat' -'wag' -'uced' -'tles' -'ss' -'sho' -'scra' -'rrup' -'rang' -'pure' -'patr' -'ordi' -'obta' -'ngin' -'ish' -'henr' -'grie' -'gn' -'eliz' -'ct' -'bag' -'bad' -'anno' -'abse' -'abo' -'volu' -'vic' -'too' -'sf' -'rmed' -'regu' -'rded' -'para' -'of' -'nor' -'net' -'glor' -'gloo' -'ath' -'actu' -'ume' -'sple' -'spi' -'rob' -'renc' -'pol' -'igno' -'earn' -'bare' -'use' -'sy_' -'spre' -'ror_' -'rk' -'prou' -'plat' -'owne' -'orn' -'mach' -'ken' -'jack' -'iona' -'hood' -'eli' -'dian' -'dee' -'cy' -'ctly' -'crac' -'clai' -'ceas' -'cabi' -'teet' -'spac' -'rea' -'pied' -'kiss' -'ham_' -'gly_' -'erat' -'cho' -'burg' -'aris' -'wi' -'weal' -'ten' -'spra' -'sfac' -'roug' -'rie' -'ras' -'ple_' -'orga' -'mpan' -'mel' -'magn' -'ians' -'hip_' -'hen' -'ful' -'flas' -'ei' -'depe' -'defi' -'dec' -'cca_' -'bath' -'bab' -'argu' -'vess' -'unp' -'ug' -'tled' -'tle_' -'tale' -'stee' -'sfie' -'rred' -'ron' -'ray' -'ndan' -'nary' -'ist' -'hum' -'hop' -'exec' -'elde' -'bun' -'brai' -'ator' -'ash' -'yle_' -'ws_' -'tri' -'tary' -'rp' -'rd' -'prie' -'pon' -'nced' -'marg' -'liz' -'cien' -'aliv' -'vers' -'uti' -'tur' -'toby' -'tent' -'scre' -'rity' -'reti' -'rary' -'qua' -'paid' -'orta' -'oli' -'nci' -'nce' -'mn' -'mes_' -'ice' -'hee' -'eva' -'ett' -'clim' -'brav' -'boug' -'weat' -'tors' -'tong' -'scor' -'sake' -'pier' -'pecu' -'pare' -'nk' -'ist_' -'inia' -'ingu' -'gni' -'fee' -'fart' -'esso' -'ent' -'edwa' -'ects' -'dism' -'ast' -'alte' -'zen_' -'vain' -'uc' -'tro' -'tol' -'tenc' -'rail' -'rach' -'peas' -'nty_' -'lin' -'lian' -'kfas' -'ker_' -'juli' -'ita' -'hoo' -'hat_' -'gaze' -'exer' -'enge' -'em' -'elev' -'die' -'burs' -'blo' -'asha' -'ulat' -'tal' -'stup' -'song' -'shri' -'scie' -'rip' -'rb' -'pho' -'pats' -'orti' -'oa' -'nobo' -'may' -'lf' -'ld' -'knit' -'key_' -'hern' -'futu' -'drin' -'demo' -'deb' -'cow' -'cart' -'aut' -'top' -'ski' -'roof' -'revo' -'rei' -'prai' -'patt' -'papa' -'oned' -'ona' -'mpt_' -'midd' -'jerr' -'irs_' -'inn' -'ign_' -'ial' -'furn' -'flor' -'fet' -'fan' -'excu' -'err' -'ens' -'dela' -'athy' -'ang' -'alar' -'ake' -'wre' -'whi' -'virg' -'rend' -'ose' -'odi' -'nice' -'nerv' -'nda' -'mead' -'lude' -'lain' -'knig' -'ile' -'hole' -'hm' -'fat' -'due_' -'deta' -'cs_' -'cru' -'cop' -'bili' -'abet' -'wl' -'syst' -'ride' -'pref' -'pl' -'pit' -'pere' -'ntee' -'nder' -'nat' -'mpli' -'maje' -'knoc' -'ject' -'ite' -'illu' -'ili' -'hot_' -'geni' -'gas' -'flu' -'euro' -'ee_' -'eal' -'cipa' -'bore' -'baby' -'ye' -'val_' -'ub' -'troo' -'ruth' -'rop' -'pear' -'pack' -'oral' -'nly_' -'log' -'itu' -'hic' -'fold' -'ern' -'eric' -'edit' -'cord' -'cook' -'club' -'cle_' -'cipl' -'box_' -'band' -'atti' -'ywhe' -'wil' -'ue' -'u_' -'tea_' -'shr' -'que_' -'ppoi' -'pira' -'nist' -'net_' -'nea' -'mac' -'lucy' -'lex' -'ison' -'impu' -'han' -'ess' -'elec' -'dro' -'dign' -'bush' -'amus' -'amen' -'af' -'yn' -'wore' -'unte' -'snap' -'row_' -'ratu' -'pla' -'mpt' -'ket' -'ker' -'ken_' -'ire' -'icia' -'gger' -'geth' -'get' -'gest' -'fond' -'env' -'cost' -'cong' -'cles' -'beha' -'bas' -'awfu' -'ati' -'win' -'span' -'rked' -'regr' -'ps' -'prog' -'perp' -'orat' -'ms' -'limi' -'jos' -'jer' -'inci' -'herd' -'fri' -'ears' -'dge' -'deck' -'dat' -'cree' -'chu' -'cat' -'awar' -'witn' -'unt' -'uch' -'task' -'suns' -'rpr' -'ros' -'rl' -'rim' -'rat' -'nose' -'nity' -'nite' -'nal_' -'meth' -'lem' -'jen' -'ive' -'inar' -'hurt' -'heig' -'gor' -'glo' -'ghtf' -'empe' -'elve' -'chos' -'bos' -'baro' -'wrot' -'wit' -'vani' -'uste' -'unw' -'teme' -'sti' -'spe' -'rkab' -'ra_' -'pat' -'oduc' -'lle' -'ler_' -'leap' -'las' -'ins' -'ided' -'icio' -'fixe' -'fier' -'erse' -'epti' -'elli' -'broo' -'brie' -'bold' -'bodi' -'begg' -'alto' -'zi' -'z_' -'warr' -'ussi' -'uppe' -'surf' -'stom' -'russ' -'retr' -'pti' -'pr' -'pole' -'plen' -'oe' -'nsi' -'movi' -'hide' -'gan' -'frui' -'fest' -'ere' -'ear_' -'cup' -'cing' -'cha' -'cc' -'ambi' -'ama' -'addi' -'wra' -'whe' -'tw' -'rvi' -'pour' -'pher' -'ntur' -'ner' -'lei' -'inno' -'gun' -'greg' -'don_' -'dick' -'cust' -'cool' -'coas' -'bing' -'bel' -'asso' -'aff' -'weig' -'upt' -'tate' -'roar' -'phr' -'pea' -'olat' -'nk_' -'mph' -'mir' -'lic' -'lace' -'icat' -'humo' -'hem' -'gla' -'gil' -'ffe' -'erve' -'endo' -'ede' -'yo' -'wret' -'tic_' -'sad_' -'rc' -'ov' -'mpe' -'meal' -'loos' -'loca' -'lime' -'hur' -'hote' -'hadn' -'grah' -'gli' -'folk' -'flew' -'ffi' -'fals' -'educ' -'eb' -'dle_' -'dish' -'coup' -'bee' -'ame' -'wig' -'warn' -'vast' -'urd' -'uent' -'uage' -'stir' -'stal' -'scu' -'scri' -'rve_' -'rty_' -'rti' -'ris' -'nces' -'mour' -'loss' -'llin' -'inju' -'ica' -'hbou' -'ghte' -'fs_' -'ensi' -'dor' -'dily' -'dale' -'cult' -'cula' -'crue' -'adam' -'zing' -'ye_' -'wick' -'wha' -'vol' -'ust' -'ular' -'stia' -'smoo' -'sar' -'repa' -'prem' -'poet' -'ono' -'nta' -'mult' -'mul' -'moo' -'mit' -'gion' -'freq' -'expo' -'enth' -'dwel' -'dry_' -'doze' -'dful' -'cry' -'colu' -'ciat' -'cand' -'ava' -'augu' -'asce' -'arta' -'vit' -'uit' -'tte_' -'trim' -'thom' -'size' -'rmat' -'rant' -'ract' -'putt' -'poun' -'pipe' -'osi' -'nia' -'ndo' -'mond' -'mat' -'lay' -'ized' -'ingt' -'infe' -'het' -'ght' -'ell' -'eles' -'edin' -'dri' -'dm' -'crit' -'craw' -'cli' -'cks_' -'bowe' -'bal' -'xt' -'utio' -'ury_' -'tum' -'tual' -'stif' -'sob' -'lte' -'lla_' -'idi' -'gm' -'dge_' -'cul' -'cris' -'caro' -'bet' -'asle' -'andr' -'alle' -'ail' -'agon' -'abu' -'abil' -'zen' -'wast' -'urs' -'uct_' -'trip' -'tch_' -'spor' -'simi' -'roya' -'ref' -'rare' -'prid' -'phe' -'ored' -'loui' -'lodg' -'llo' -'iz' -'ite_' -'hie' -'gra' -'ffer' -'emb' -'bow' -'asp' -'who' -'unkn' -'unfo' -'tele' -'sse' -'sol' -'sava' -'sat' -'rve' -'prim' -'pend' -'pair' -'onsi' -'olde' -'obey' -'lot_' -'leg' -'la_' -'ks' -'invo' -'gn_' -'drov' -'cab' -'busy' -'bril' -'bent' -'ativ' -'asid' -'appo' -'ana' -'ald' -'ahea' -'achi' -'zz' -'usi' -'une' -'tram' -'tien' -'tea' -'sund' -'sor' -'rume' -'rubb' -'rne' -'rfe' -'pant' -'oke' -'oat' -'ndid' -'musk' -'mamm' -'ls' -'lite' -'lest' -'lamp' -'jimm' -'issu' -'irre' -'hly_' -'gw' -'gian' -'fen' -'fal' -'eti' -'endu' -'eh' -'edi' -'duc' -'dog_' -'com' -'clif' -'cer_' -'card' -'bul' -'bone' -'aid' -'adj' -'vin' -'unl' -'unha' -'swif' -'smit' -'sim' -'risk' -'pro' -'plun' -'pity' -'pard' -'ody_' -'odd' -'mut' -'murm' -'mn_' -'meri' -'lus' -'lse' -'lack' -'jeff' -'ib' -'hil' -'hid' -'gul' -'guid' -'grim' -'gri' -'fles' -'faul' -'ew_' -'ete' -'els_' -'eati' -'dig' -'deri' -'cil' -'cana' -'beas' -'audi' -'atel' -'arth' -'anat' -'wn' -'ute_' -'usia' -'urag' -'unic' -'ung' -'stl' -'sn' -'root' -'rejo' -'rank' -'ram' -'ounc' -'ony_' -'oma' -'ngs_' -'ngly' -'nes' -'kins' -'kat' -'jump' -'inha' -'iam_' -'huge' -'hidd' -'gue_' -'embr' -'dep' -'ctiv' -'cred' -'cie' -'capi' -'blan' -'yest' -'unus' -'unex' -'ues' -'ton' -'tia' -'subm' -'sli' -'sl' -'sam' -'res' -'reck' -'puni' -'pill' -'pal' -'owle' -'obst' -'nurs' -'new' -'nar' -'my' -'mid' -'inti' -'idl' -'ica_' -'hw' -'gy_' -'ghos' -'flam' -'emot' -'clo' -'begu' -'anni' -'ackn' -'v_' -'unea' -'triu' -'tful' -'tes' -'ssit' -'seld' -'revi' -'pul' -'por' -'ou' -'olen' -'matc' -'linc' -'jame' -'hau' -'grey' -'fit' -'eve' -'erie' -'diam' -'cor' -'chic' -'cel' -'buri' -'boy' -'bid' -'aten' -'aros' -'ani' -'ake_' -'ah' -'act' -'acci' -'zo' -'yt' -'xa' -'unto' -'unat' -'ught' -'type' -'turt' -'soug' -'sly_' -'rthe' -'rome' -'rg' -'refe' -'rap' -'ppin' -'phan' -'page' -'oon_' -'onab' -'omi' -'non' -'nest' -'mids' -'lp' -'ivi' -'inva' -'inua' -'infi' -'ign' -'hos' -'goes' -'gne' -'glim' -'erda' -'emma' -'eggs' -'dil' -'ders' -'dept' -'crop' -'chm' -'buy_' -'buck' -'bree' -'birt' -'bin' -'aski' -'ache' -'wai' -'viou' -'ssa' -'slep' -'slat' -'rra' -'rog' -'rnal' -'ribu' -'pse' -'onin' -'nora' -'nodd' -'nds' -'mili' -'lie' -'laws' -'isi' -'htly' -'guil' -'gui' -'forb' -'ferr' -'fate' -'erio' -'ep_' -'eil_' -'eho' -'den_' -'ded' -'ctin' -'crus' -'clev' -'cis' -'cers' -'bite' -'berr' -'bask' -'anyw' -'amaz' -'alas' -'zzle' -'wea' -'sw' -'squi' -'skil' -'rvat' -'rre' -'roc' -'robe' -'remi' -'rag' -'pper' -'penc' -'owe' -'nie' -'mbli' -'lect' -'iti' -'ism_' -'insp' -'impl' -'imm' -'how' -'gru' -'gnat' -'glow' -'engi' -'emba' -'elsi' -'eed' -'dru' -'diss' -'dea' -'dail' -'bow_' -'beho' -'avoi' -'yo_' -'wis' -'whir' -'unf' -'thu' -'thr' -'shoe' -'shaw' -'say' -'sanc' -'roy' -'ridi' -'ridg' -'refr' -'ran' -'plum' -'peep' -'oria' -'oly' -'nsci' -'nove' -'nde' -'lan' -'hosp' -'geo' -'ema' -'eed_' -'duke' -'choi' -'cav' -'but' -'bert' -'base' -'arly' -'anyo' -'abs' -'yon' -'wido' -'wedd' -'vote' -'veil' -'urin' -'tria' -'ssed' -'sma' -'sive' -'shme' -'sche' -'scat' -'rig' -'rid' -'pron' -'ole' -'mer_' -'marv' -'lm' -'lis' -'ilit' -'hut' -'horn' -'heap' -'flig' -'fare' -'exha' -'eta' -'eate' -'dust' -'dur' -'ars' -'arme' -'arin' -'aord' -'ace' -'aba' -'worn' -'veri' -'udo' -'twic' -'tn' -'thi' -'tera' -'rus' -'plo' -'outl' -'ost' -'ore_' -'load' -'lia' -'kitc' -'infa' -'geme' -'gal' -'floa' -'fat_' -'exch' -'eth' -'ersi' -'enta' -'ege_' -'ea_' -'dull' -'dive' -'dise' -'deni' -'cta' -'cler' -'cill' -'cen' -'cati' -'bs_' -'bob' -'ara' -'amou' -'whee' -'urge' -'uous' -'ugly' -'tnes' -'thea' -'sylv' -'surv' -'stab' -'snak' -'sir' -'robb' -'ril' -'rehe' -'proo' -'plu' -'oyed' -'ort' -'nie_' -'monk' -'moni' -'misc' -'mete' -'med' -'mag' -'los' -'legi' -'kn' -'jew' -'japa' -'iame' -'humb' -'hith' -'gh' -'flo' -'feve' -'famo' -'equi' -'eno' -'elea' -'ek' -'cit' -'bobb' -'bluf' -'ak' -'yer' -'wri' -'ware' -'vert' -'uted' -'ueri' -'toi' -'tip' -'tess' -'tely' -'taug' -'sto' -'shoc' -'rict' -'pine' -'orie' -'ood_' -'nut' -'nate' -'misf' -'mina' -'meta' -'mars' -'mani' -'lot' -'leve' -'lars' -'ky_' -'klin' -'judi' -'jesu' -'ivel' -'itua' -'igu' -'hed' -'gram' -'glea' -'frog' -'fled' -'fil' -'fied' -'fel' -'fac' -'ext' -'erm' -'ends' -'ech' -'dne' -'dict' -'chat' -'cell' -'boot' -'alli' -'agen' -'affo' -'ae' -'add_' -'ach' -'ves' -'twin' -'tiny' -'thru' -'sher' -'sex' -'rud' -'rtis' -'rai' -'prud' -'ppy_' -'park' -'ox' -'ortu' -'ont' -'nsiv' -'noo' -'na_' -'leg_' -'kni' -'int' -'his' -'hin' -'hew' -'hes' -'has' -'harr' -'ha_' -'giou' -'gay' -'fre' -'fox' -'ffl' -'ff' -'eter' -'espo' -'ecia' -'eabl' -'ddl' -'dawn' -'cele' -'bel_' -'ada' -'acin' -'vita' -'vagu' -'unb' -'uin' -'ugho' -'try' -'styl' -'soa' -'snes' -'sm' -'rva' -'rode' -'rn' -'rav' -'quis' -'pic' -'peer' -'pace' -'ok' -'nom' -'naut' -'mmen' -'lve' -'lone' -'lieu' -'kas' -'jewe' -'jaso' -'ipl' -'ileg' -'ieu' -'gift' -'fred' -'fram' -'flus' -'fem' -'dogs' -'ctur' -'zy_' -'yone' -'yiel' -'vis' -'tun' -'trul' -'the' -'sum_' -'sso' -'sons' -'smo' -'rwis' -'rou' -'rol_' -'reca' -'proj' -'ntme' -'nal' -'milk' -'mb_' -'lev' -'kin_' -'ka_' -'ize_' -'ists' -'isio' -'ile_' -'fl' -'fitt' -'ere_' -'ench' -'desk' -'cake' -'aus' -'anyb' -'ann' -'ale_' -'zar' -'wder' -'voya' -'unre' -'unab' -'ugh' -'uade' -'tle' -'tl' -'tanc' -'stol' -'sme' -'siti' -'shep' -'scal' -'sc' -'roni' -'rnin' -'rac' -'quot' -'pool' -'nent' -'mutt' -'mud_' -'mi' -'lio' -'lant' -'jeal' -'iors' -'io' -'inse' -'ied' -'ick' -'hus' -'grin' -'gat' -'eyed' -'drun' -'dit' -'depr' -'del' -'cose' -'brus' -'bes' -'bble' -'ase_' -'yr' -'xed_' -'worr' -'ull' -'udi' -'tot' -'teri' -'sus' -'sne' -'slop' -'rust' -'rum' -'rtak' -'rse_' -'rot' -'rna' -'rade' -'ples' -'pitc' -'our' -'ote' -'nte' -'ntar' -'nl' -'nan' -'mira' -'mela' -'logi' -'lli' -'lap' -'kne' -'kers' -'ivat' -'ip_' -'holy' -'hind' -'harv' -'gged' -'gant' -'fe_' -'far' -'exi' -'essf' -'enes' -'davi' -'das' -'cow_' -'conq' -'cat_' -'bru' -'bis' -'bib' -'ates' -'ase' -'any' -'ams' -'yse' -'yme' -'vigo' -'vati' -'tice' -'surg' -'stou' -'spu' -'sie' -'rist' -'piti' -'orme' -'onl' -'ntin' -'ney' -'ndly' -'ncy' -'kee' -'jim' -'jes' -'iot' -'inu' -'ics_' -'hine' -'goo' -'fun_' -'fid' -'fed_' -'exhi' -'etr' -'erre' -'dyin' -'drow' -'dia' -'dere' -'dai' -'cub' -'cl' -'caut' -'brut' -'br' -'arab' -'ak_' -'win_' -'uss' -'ud' -'thun' -'spa' -'sour' -'shir' -'rnor' -'rewa' -'pon_' -'pis' -'own' -'otic' -'orch' -'ome' -'oln_' -'nstr' -'nee' -'lyn' -'iv' -'ils_' -'ify_' -'ier' -'gean' -'gane' -'foug' -'feas' -'esh' -'eke' -'drif' -'choo' -'chec' -'cave' -'bew' -'beg' -'bbi' -'apol' -'alit' -'won_' -'wir' -'was' -'wake' -'vid' -'uis' -'ud_' -'tel' -'sav' -'sau' -'salt' -'rtur' -'rsi' -'rch' -'raw' -'pian' -'pay' -'oub' -'ook' -'omed' -'nse' -'nai' -'lux' -'lusi' -'lou' -'loa' -'lid' -'lict' -'lica' -'libr' -'les' -'ler' -'lanc' -'lame' -'kw' -'inen' -'imit' -'ices' -'hire' -'hei' -'hay' -'gun_' -'fy' -'flyi' -'flou' -'evi' -'esc' -'erit' -'emer' -'diti' -'dfa' -'des' -'date' -'curr' -'cine' -'chok' -'chal' -'cere' -'burd' -'box' -'boil' -'blam' -'betr' -'behe' -'bec' -'aste' -'ape' -'weep' -'uce_' -'towe' -'torn' -'tigh' -'sna' -'slim' -'sci' -'pop' -'ple' -'pau' -'ocea' -'oak_' -'nth_' -'nel' -'nay' -'lily' -'laun' -'inh' -'ilus' -'ibi' -'flun' -'eye' -'exa' -'erer' -'erc' -'enl' -'eff' -'dutc' -'cutt' -'cum' -'cise' -'car_' -'cano' -'buff' -'blus' -'bala' -'bach' -'arre' -'ardi' -'ante' -'agit' -'aced' -'zer' -'ym' -'usef' -'unn' -'ued_' -'tti' -'tou' -'tob' -'tlin' -'titl' -'tch' -'stam' -'roye' -'riva' -'quan' -'osop' -'oad' -'mol' -'mix' -'manu' -'mad_' -'lty' -'lts_' -'limb' -'leo' -'kes_' -'jol' -'ior_' -'hn' -'hit' -'herb' -'hai' -'funn' -'etic' -'ese' -'dh' -'cut' -'coc' -'ciga' -'ca_' -'bour' -'bloc' -'bay_' -'bat' -'atu' -'ats' -'ast_' -'amp' -'aged'