--- title: Title keywords: fastai sidebar: home_sidebar ---
{% raw %}
{% endraw %} {% raw %}
%load_ext autoreload
%autoreload 2
%matplotlib inline
{% endraw %} {% raw %}
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader

from htools import add_docstring
{% endraw %} {% raw %}
# Used in notebook but not needed in package.
from collections import defaultdict
import matplotlib.pyplot as plt
import pandas as pd
from pathlib import Path
import spacy

from htools import assert_raises, InvalidArgumentError
import pandas_htools
{% endraw %} {% raw %}
FPATH = Path('../data/warbreaker.txt')
{% endraw %} {% raw %}
with open(FPATH, 'r') as f:
    text = f.read()
len(text)
18509
{% endraw %} {% raw %}
len(text)
18509
{% endraw %} {% raw %}
c2i = {k: i for i, k in enumerate(sorted(set(text.lower())))}
i2c = list(c2i.keys())
print(c2i)
print(i2c)
{'\n': 0, ' ': 1, ',': 2, '-': 3, '.': 4, ':': 5, ';': 6, '?': 7, 'a': 8, 'b': 9, 'c': 10, 'd': 11, 'e': 12, 'f': 13, 'g': 14, 'h': 15, 'i': 16, 'j': 17, 'k': 18, 'l': 19, 'm': 20, 'n': 21, 'o': 22, 'p': 23, 'q': 24, 'r': 25, 's': 26, 't': 27, 'u': 28, 'v': 29, 'w': 30, 'x': 31, 'y': 32, 'z': 33, '—': 34, '’': 35, '“': 36, '”': 37}
['\n', ' ', ',', '-', '.', ':', ';', '?', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '—', '’', '“', '”']
{% endraw %} {% raw %}
nlp = spacy.load('en_core_web_sm', disable=['ner', 'tagger', 'parser'])
{% endraw %} {% raw %}
def tokenize_one(text):
    return [t.text for t in nlp(text)]
{% endraw %} {% raw %}
def tokenize(texts):
    with multiprocessing.Pool() as p:
        tokens = p.map(tokenize_one, texts)
    return tokens
{% endraw %} {% raw %}
tokens = tokenize_one(text)
{% endraw %} {% raw %}
len(tokens)
4103
{% endraw %}

Issues

  • currently assuming all words len >= 4
  • haven't used any padding, so inputs are all different lengths
  • haven't used padding, so outputs are all different lengths
  • character encode? word encode? figure out how to handle
{% raw %}
class CharJumbleDS(Dataset):
    
    def __init__(self, tokens, c2i, window=3):
        # TO DO: For now, start by assuming all words have len >= 4. Fix later.
        self.tokens = [t for t in tokens if len(t) >= 4]
        self.c2i = c2i
        self.i2c = list(c2i.keys())
        self.window = window
        self.mid_i = window // 2
        
    def __getitem__(self, idx):
        chunk = self.tokens[idx:idx+self.window]
        label = self.encode(' '.join(chunk))   # Only needed for seq2seq approach in v3
        mid = chunk[self.mid_i]
        mid_len = len(mid)
        order = np.random.permutation(mid_len - 2) + 1
        chunk[self.mid_i] = mid[0]  + ''.join(mid[i] for i in order) + mid[-1]
        # This version returns the order that was used to permute the original indices.
        # Maybe less intuitive but simpler - can always do the conversion in some 
        # prediction wrapper that doesn't add computation during training.
#         return chunk, [0] + list(order) + [mid_len-1]

        # This version returns the order to map from the permuted indices to the original 
        # indices. Intuitive but adds computation and hard-to-read logic.
#         return (chunk, 
#                 [0] 
#               + [k for k, v in sorted(dict(enumerate(order, 1)).items(),key=lambda x: x[1])] 
#               + [mid_len-1])

        # V3: just return whole seq of char indices as input and output.
        # Prob more computationally expensive (seq2seq vs multiclass classification)
        return self.encode(' '.join(chunk)), label
    
    def encode(self, word_str):
        return [self.c2i[char] for char in word_str.lower()]
    
    def decode(self, idx):
        return ''.join(self.i2c[i] for i in idx)
        
    def __len__(self):
        return len(self.tokens)
    
    def __repr__(self):
        return f'CharJumbleDS(len={len(self)})'
{% endraw %} {% raw %}
ds = CharJumbleDS(tokens, c2i, 4)
ds
CharJumbleDS(len=1953)
{% endraw %} {% raw %}
for i in range(50):
    x, y = ds[i]
    print(x)
    print(y)
    print(ds.decode(x))
    print(ds.decode(y))
    print()
[13, 28, 21, 21, 32, 1, 29, 8, 26, 15, 12, 25, 1, 27, 22, 14, 28, 15, 15, 27, 1, 20, 8, 21, 32]
[13, 28, 21, 21, 32, 1, 29, 8, 26, 15, 12, 25, 1, 27, 15, 22, 28, 14, 15, 27, 1, 20, 8, 21, 32]
funny vasher toguhht many
funny vasher thought many

[29, 8, 26, 15, 12, 25, 1, 27, 15, 22, 28, 14, 15, 27, 1, 20, 8, 21, 32, 1, 27, 15, 16, 21, 14, 26]
[29, 8, 26, 15, 12, 25, 1, 27, 15, 22, 28, 14, 15, 27, 1, 20, 8, 21, 32, 1, 27, 15, 16, 21, 14, 26]
vasher thought many things
vasher thought many things

[27, 15, 22, 28, 14, 15, 27, 1, 20, 8, 21, 32, 1, 27, 16, 14, 15, 21, 26, 1, 9, 12, 14, 16, 21]
[27, 15, 22, 28, 14, 15, 27, 1, 20, 8, 21, 32, 1, 27, 15, 16, 21, 14, 26, 1, 9, 12, 14, 16, 21]
thought many tighns begin
thought many things begin

[20, 8, 21, 32, 1, 27, 15, 16, 21, 14, 26, 1, 9, 16, 14, 12, 21, 1, 30, 16, 27, 15]
[20, 8, 21, 32, 1, 27, 15, 16, 21, 14, 26, 1, 9, 12, 14, 16, 21, 1, 30, 16, 27, 15]
many things bigen with
many things begin with

[27, 15, 16, 21, 14, 26, 1, 9, 12, 14, 16, 21, 1, 30, 16, 27, 15, 1, 14, 12, 27, 27, 16, 21, 14]
[27, 15, 16, 21, 14, 26, 1, 9, 12, 14, 16, 21, 1, 30, 16, 27, 15, 1, 14, 12, 27, 27, 16, 21, 14]
things begin with getting
things begin with getting

[9, 12, 14, 16, 21, 1, 30, 16, 27, 15, 1, 14, 16, 27, 12, 27, 21, 14, 1, 27, 15, 25, 22, 30, 21]
[9, 12, 14, 16, 21, 1, 30, 16, 27, 15, 1, 14, 12, 27, 27, 16, 21, 14, 1, 27, 15, 25, 22, 30, 21]
begin with gitetng thrown
begin with getting thrown

[30, 16, 27, 15, 1, 14, 12, 27, 27, 16, 21, 14, 1, 27, 22, 15, 25, 30, 21, 1, 16, 21, 27, 22]
[30, 16, 27, 15, 1, 14, 12, 27, 27, 16, 21, 14, 1, 27, 15, 25, 22, 30, 21, 1, 16, 21, 27, 22]
with getting tohrwn into
with getting thrown into

[14, 12, 27, 27, 16, 21, 14, 1, 27, 15, 25, 22, 30, 21, 1, 16, 27, 21, 22, 1, 23, 25, 16, 26, 22, 21]
[14, 12, 27, 27, 16, 21, 14, 1, 27, 15, 25, 22, 30, 21, 1, 16, 21, 27, 22, 1, 23, 25, 16, 26, 22, 21]
getting thrown itno prison
getting thrown into prison

[27, 15, 25, 22, 30, 21, 1, 16, 21, 27, 22, 1, 23, 26, 22, 25, 16, 21, 1, 14, 28, 8, 25, 11, 26]
[27, 15, 25, 22, 30, 21, 1, 16, 21, 27, 22, 1, 23, 25, 16, 26, 22, 21, 1, 14, 28, 8, 25, 11, 26]
thrown into psorin guards
thrown into prison guards

[16, 21, 27, 22, 1, 23, 25, 16, 26, 22, 21, 1, 14, 25, 28, 11, 8, 26, 1, 19, 8, 28, 14, 15, 12, 11]
[16, 21, 27, 22, 1, 23, 25, 16, 26, 22, 21, 1, 14, 28, 8, 25, 11, 26, 1, 19, 8, 28, 14, 15, 12, 11]
into prison grudas laughed
into prison guards laughed

[23, 25, 16, 26, 22, 21, 1, 14, 28, 8, 25, 11, 26, 1, 19, 15, 14, 8, 28, 12, 11, 1, 8, 21, 22, 27, 15, 12, 25]
[23, 25, 16, 26, 22, 21, 1, 14, 28, 8, 25, 11, 26, 1, 19, 8, 28, 14, 15, 12, 11, 1, 8, 21, 22, 27, 15, 12, 25]
prison guards lhgaued another
prison guards laughed another

[14, 28, 8, 25, 11, 26, 1, 19, 8, 28, 14, 15, 12, 11, 1, 8, 12, 22, 27, 21, 15, 25, 1, 26, 19, 8, 20, 20, 16, 21, 14]
[14, 28, 8, 25, 11, 26, 1, 19, 8, 28, 14, 15, 12, 11, 1, 8, 21, 22, 27, 15, 12, 25, 1, 26, 19, 8, 20, 20, 16, 21, 14]
guards laughed aeotnhr slamming
guards laughed another slamming

[19, 8, 28, 14, 15, 12, 11, 1, 8, 21, 22, 27, 15, 12, 25, 1, 26, 20, 19, 8, 21, 20, 16, 14, 1, 10, 12, 19, 19]
[19, 8, 28, 14, 15, 12, 11, 1, 8, 21, 22, 27, 15, 12, 25, 1, 26, 19, 8, 20, 20, 16, 21, 14, 1, 10, 12, 19, 19]
laughed another smlanmig cell
laughed another slamming cell

[8, 21, 22, 27, 15, 12, 25, 1, 26, 19, 8, 20, 20, 16, 21, 14, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25]
[8, 21, 22, 27, 15, 12, 25, 1, 26, 19, 8, 20, 20, 16, 21, 14, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25]
another slamming cell door
another slamming cell door

[26, 19, 8, 20, 20, 16, 21, 14, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 15, 28, 27]
[26, 19, 8, 20, 20, 16, 21, 14, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 15, 28, 27]
slamming cell door shut
slamming cell door shut

[10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 15, 28, 27, 1, 30, 16, 27, 15]
[10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 15, 28, 27, 1, 30, 16, 27, 15]
cell door shut with
cell door shut with

[11, 22, 22, 25, 1, 26, 15, 28, 27, 1, 30, 16, 27, 15, 1, 10, 19, 8, 21, 14]
[11, 22, 22, 25, 1, 26, 15, 28, 27, 1, 30, 16, 27, 15, 1, 10, 19, 8, 21, 14]
door shut with clang
door shut with clang

[26, 15, 28, 27, 1, 30, 16, 27, 15, 1, 10, 8, 21, 19, 14, 1, 29, 8, 26, 15, 12, 25]
[26, 15, 28, 27, 1, 30, 16, 27, 15, 1, 10, 19, 8, 21, 14, 1, 29, 8, 26, 15, 12, 25]
shut with canlg vasher
shut with clang vasher

[30, 16, 27, 15, 1, 10, 19, 8, 21, 14, 1, 29, 15, 8, 26, 12, 25, 1, 26, 27, 22, 22, 11]
[30, 16, 27, 15, 1, 10, 19, 8, 21, 14, 1, 29, 8, 26, 15, 12, 25, 1, 26, 27, 22, 22, 11]
with clang vhaser stood
with clang vasher stood

[10, 19, 8, 21, 14, 1, 29, 8, 26, 15, 12, 25, 1, 26, 22, 27, 22, 11, 1, 11, 28, 26, 27, 12, 11]
[10, 19, 8, 21, 14, 1, 29, 8, 26, 15, 12, 25, 1, 26, 27, 22, 22, 11, 1, 11, 28, 26, 27, 12, 11]
clang vasher sotod dusted
clang vasher stood dusted

[29, 8, 26, 15, 12, 25, 1, 26, 27, 22, 22, 11, 1, 11, 12, 28, 27, 26, 11, 1, 15, 16, 20, 26, 12, 19, 13]
[29, 8, 26, 15, 12, 25, 1, 26, 27, 22, 22, 11, 1, 11, 28, 26, 27, 12, 11, 1, 15, 16, 20, 26, 12, 19, 13]
vasher stood deutsd himself
vasher stood dusted himself

[26, 27, 22, 22, 11, 1, 11, 28, 26, 27, 12, 11, 1, 15, 16, 19, 20, 26, 12, 13, 1, 25, 22, 19, 19, 16, 21, 14]
[26, 27, 22, 22, 11, 1, 11, 28, 26, 27, 12, 11, 1, 15, 16, 20, 26, 12, 19, 13, 1, 25, 22, 19, 19, 16, 21, 14]
stood dusted hilmsef rolling
stood dusted himself rolling

[11, 28, 26, 27, 12, 11, 1, 15, 16, 20, 26, 12, 19, 13, 1, 25, 19, 16, 21, 19, 22, 14, 1, 26, 15, 22, 28, 19, 11, 12, 25]
[11, 28, 26, 27, 12, 11, 1, 15, 16, 20, 26, 12, 19, 13, 1, 25, 22, 19, 19, 16, 21, 14, 1, 26, 15, 22, 28, 19, 11, 12, 25]
dusted himself rlinlog shoulder
dusted himself rolling shoulder

[15, 16, 20, 26, 12, 19, 13, 1, 25, 22, 19, 19, 16, 21, 14, 1, 26, 12, 19, 15, 22, 11, 28, 25, 1, 30, 16, 21, 10, 16, 21, 14]
[15, 16, 20, 26, 12, 19, 13, 1, 25, 22, 19, 19, 16, 21, 14, 1, 26, 15, 22, 28, 19, 11, 12, 25, 1, 30, 16, 21, 10, 16, 21, 14]
himself rolling selhodur wincing
himself rolling shoulder wincing

[25, 22, 19, 19, 16, 21, 14, 1, 26, 15, 22, 28, 19, 11, 12, 25, 1, 30, 16, 21, 21, 10, 16, 14, 1, 30, 15, 16, 19, 12]
[25, 22, 19, 19, 16, 21, 14, 1, 26, 15, 22, 28, 19, 11, 12, 25, 1, 30, 16, 21, 10, 16, 21, 14, 1, 30, 15, 16, 19, 12]
rolling shoulder winncig while
rolling shoulder wincing while

[26, 15, 22, 28, 19, 11, 12, 25, 1, 30, 16, 21, 10, 16, 21, 14, 1, 30, 16, 15, 19, 12, 1, 9, 22, 27, 27, 22, 20]
[26, 15, 22, 28, 19, 11, 12, 25, 1, 30, 16, 21, 10, 16, 21, 14, 1, 30, 15, 16, 19, 12, 1, 9, 22, 27, 27, 22, 20]
shoulder wincing wihle bottom
shoulder wincing while bottom

[30, 16, 21, 10, 16, 21, 14, 1, 30, 15, 16, 19, 12, 1, 9, 27, 22, 27, 22, 20, 1, 15, 8, 19, 13]
[30, 16, 21, 10, 16, 21, 14, 1, 30, 15, 16, 19, 12, 1, 9, 22, 27, 27, 22, 20, 1, 15, 8, 19, 13]
wincing while btotom half
wincing while bottom half

[30, 15, 16, 19, 12, 1, 9, 22, 27, 27, 22, 20, 1, 15, 19, 8, 13, 1, 10, 12, 19, 19]
[30, 15, 16, 19, 12, 1, 9, 22, 27, 27, 22, 20, 1, 15, 8, 19, 13, 1, 10, 12, 19, 19]
while bottom hlaf cell
while bottom half cell

[9, 22, 27, 27, 22, 20, 1, 15, 8, 19, 13, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25]
[9, 22, 27, 27, 22, 20, 1, 15, 8, 19, 13, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25]
bottom half cell door
bottom half cell door

[15, 8, 19, 13, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 22, 19, 16, 11]
[15, 8, 19, 13, 1, 10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 22, 19, 16, 11]
half cell door solid
half cell door solid

[10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 19, 22, 16, 11, 1, 30, 22, 22, 11]
[10, 12, 19, 19, 1, 11, 22, 22, 25, 1, 26, 22, 19, 16, 11, 1, 30, 22, 22, 11]
cell door sloid wood
cell door solid wood

[11, 22, 22, 25, 1, 26, 22, 19, 16, 11, 1, 30, 22, 22, 11, 1, 15, 8, 19, 13]
[11, 22, 22, 25, 1, 26, 22, 19, 16, 11, 1, 30, 22, 22, 11, 1, 15, 8, 19, 13]
door solid wood half
door solid wood half

[26, 22, 19, 16, 11, 1, 30, 22, 22, 11, 1, 15, 8, 19, 13, 1, 9, 8, 25, 25, 12, 11]
[26, 22, 19, 16, 11, 1, 30, 22, 22, 11, 1, 15, 8, 19, 13, 1, 9, 8, 25, 25, 12, 11]
solid wood half barred
solid wood half barred

[30, 22, 22, 11, 1, 15, 8, 19, 13, 1, 9, 25, 25, 8, 12, 11, 1, 10, 22, 28, 19, 11]
[30, 22, 22, 11, 1, 15, 8, 19, 13, 1, 9, 8, 25, 25, 12, 11, 1, 10, 22, 28, 19, 11]
wood half brraed could
wood half barred could

[15, 8, 19, 13, 1, 9, 8, 25, 25, 12, 11, 1, 10, 28, 22, 19, 11, 1, 27, 15, 25, 12, 12]
[15, 8, 19, 13, 1, 9, 8, 25, 25, 12, 11, 1, 10, 22, 28, 19, 11, 1, 27, 15, 25, 12, 12]
half barred cuold three
half barred could three

[9, 8, 25, 25, 12, 11, 1, 10, 22, 28, 19, 11, 1, 27, 15, 12, 25, 12, 1, 14, 28, 8, 25, 11, 26]
[9, 8, 25, 25, 12, 11, 1, 10, 22, 28, 19, 11, 1, 27, 15, 25, 12, 12, 1, 14, 28, 8, 25, 11, 26]
barred could there guards
barred could three guards

[10, 22, 28, 19, 11, 1, 27, 15, 25, 12, 12, 1, 14, 25, 28, 8, 11, 26, 1, 22, 23, 12, 21]
[10, 22, 28, 19, 11, 1, 27, 15, 25, 12, 12, 1, 14, 28, 8, 25, 11, 26, 1, 22, 23, 12, 21]
could three gruads open
could three guards open

[27, 15, 25, 12, 12, 1, 14, 28, 8, 25, 11, 26, 1, 22, 23, 12, 21, 1, 19, 8, 25, 14, 12]
[27, 15, 25, 12, 12, 1, 14, 28, 8, 25, 11, 26, 1, 22, 23, 12, 21, 1, 19, 8, 25, 14, 12]
three guards open large
three guards open large

[14, 28, 8, 25, 11, 26, 1, 22, 23, 12, 21, 1, 19, 14, 8, 25, 12, 1, 11, 28, 13, 13, 12, 19]
[14, 28, 8, 25, 11, 26, 1, 22, 23, 12, 21, 1, 19, 8, 25, 14, 12, 1, 11, 28, 13, 13, 12, 19]
guards open lgare duffel
guards open large duffel

[22, 23, 12, 21, 1, 19, 8, 25, 14, 12, 1, 11, 12, 13, 13, 28, 19, 1, 25, 16, 13, 19, 12]
[22, 23, 12, 21, 1, 19, 8, 25, 14, 12, 1, 11, 28, 13, 13, 12, 19, 1, 25, 16, 13, 19, 12]
open large defful rifle
open large duffel rifle

[19, 8, 25, 14, 12, 1, 11, 28, 13, 13, 12, 19, 1, 25, 13, 16, 19, 12, 1, 27, 15, 25, 22, 28, 14, 15]
[19, 8, 25, 14, 12, 1, 11, 28, 13, 13, 12, 19, 1, 25, 16, 13, 19, 12, 1, 27, 15, 25, 22, 28, 14, 15]
large duffel rfile through
large duffel rifle through

[11, 28, 13, 13, 12, 19, 1, 25, 16, 13, 19, 12, 1, 27, 25, 14, 22, 15, 28, 15, 1, 23, 22, 26, 26, 12, 26, 26, 16, 22, 21, 26]
[11, 28, 13, 13, 12, 19, 1, 25, 16, 13, 19, 12, 1, 27, 15, 25, 22, 28, 14, 15, 1, 23, 22, 26, 26, 12, 26, 26, 16, 22, 21, 26]
duffel rifle trgohuh possessions
duffel rifle through possessions

[25, 16, 13, 19, 12, 1, 27, 15, 25, 22, 28, 14, 15, 1, 23, 22, 16, 12, 26, 26, 26, 26, 21, 22, 26, 1, 27, 15, 12, 20]
[25, 16, 13, 19, 12, 1, 27, 15, 25, 22, 28, 14, 15, 1, 23, 22, 26, 26, 12, 26, 26, 16, 22, 21, 26, 1, 27, 15, 12, 20]
rifle through poiessssnos them
rifle through possessions them

[27, 15, 25, 22, 28, 14, 15, 1, 23, 22, 26, 26, 12, 26, 26, 16, 22, 21, 26, 1, 27, 12, 15, 20, 1, 21, 22, 27, 16, 10, 12, 11]
[27, 15, 25, 22, 28, 14, 15, 1, 23, 22, 26, 26, 12, 26, 26, 16, 22, 21, 26, 1, 27, 15, 12, 20, 1, 21, 22, 27, 16, 10, 12, 11]
through possessions tehm noticed
through possessions them noticed

[23, 22, 26, 26, 12, 26, 26, 16, 22, 21, 26, 1, 27, 15, 12, 20, 1, 21, 27, 12, 16, 10, 22, 11, 1, 30, 8, 27, 10, 15, 16, 21, 14]
[23, 22, 26, 26, 12, 26, 26, 16, 22, 21, 26, 1, 27, 15, 12, 20, 1, 21, 22, 27, 16, 10, 12, 11, 1, 30, 8, 27, 10, 15, 16, 21, 14]
possessions them nteicod watching
possessions them noticed watching

[27, 15, 12, 20, 1, 21, 22, 27, 16, 10, 12, 11, 1, 30, 10, 21, 8, 16, 15, 27, 14, 1, 14, 28, 8, 25, 11]
[27, 15, 12, 20, 1, 21, 22, 27, 16, 10, 12, 11, 1, 30, 8, 27, 10, 15, 16, 21, 14, 1, 14, 28, 8, 25, 11]
them noticed wcnaihtg guard
them noticed watching guard

[21, 22, 27, 16, 10, 12, 11, 1, 30, 8, 27, 10, 15, 16, 21, 14, 1, 14, 28, 8, 25, 11, 1, 22, 29, 12, 25, 26, 16, 33, 12, 11]
[21, 22, 27, 16, 10, 12, 11, 1, 30, 8, 27, 10, 15, 16, 21, 14, 1, 14, 28, 8, 25, 11, 1, 22, 29, 12, 25, 26, 16, 33, 12, 11]
noticed watching guard oversized
noticed watching guard oversized

[30, 8, 27, 10, 15, 16, 21, 14, 1, 14, 28, 8, 25, 11, 1, 22, 26, 12, 12, 33, 16, 29, 25, 11, 1, 9, 12, 8, 26, 27]
[30, 8, 27, 10, 15, 16, 21, 14, 1, 14, 28, 8, 25, 11, 1, 22, 29, 12, 25, 26, 16, 33, 12, 11, 1, 9, 12, 8, 26, 27]
watching guard oseezivrd beast
watching guard oversized beast

[14, 28, 8, 25, 11, 1, 22, 29, 12, 25, 26, 16, 33, 12, 11, 1, 9, 8, 12, 26, 27, 1, 30, 16, 27, 15]
[14, 28, 8, 25, 11, 1, 22, 29, 12, 25, 26, 16, 33, 12, 11, 1, 9, 12, 8, 26, 27, 1, 30, 16, 27, 15]
guard oversized baest with
guard oversized beast with

[22, 29, 12, 25, 26, 16, 33, 12, 11, 1, 9, 12, 8, 26, 27, 1, 30, 16, 27, 15, 1, 26, 15, 8, 29, 12, 11]
[22, 29, 12, 25, 26, 16, 33, 12, 11, 1, 9, 12, 8, 26, 27, 1, 30, 16, 27, 15, 1, 26, 15, 8, 29, 12, 11]
oversized beast with shaved
oversized beast with shaved

{% endraw %}