gitesh-grover commited on
Commit
5aa2969
·
1 Parent(s): 9bdb7d4

Sanskrit tokenizer

Browse files
.gitignore ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Ignore Python cache files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Ignore virtual environment
7
+ venv/
8
+ env/
9
+ .venv/
10
+
11
+
12
+ # Ignore trained model files
13
+ model_mnist_*.pth
14
+
15
+ # Ignore Jupyter Notebook checkpoints
16
+ .ipynb_checkpoints/
17
+
18
+ # Ignore system files
19
+ .DS_Store
20
+ Thumbs.db
21
+
22
+ # Ignore logs
23
+ *.log
README.md CHANGED
@@ -11,3 +11,92 @@ short_description: Sanskrit Tokenizer Demo
11
  ---
12
 
13
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  ---
12
 
13
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
14
+
15
+ # Sanskrit BPE Tokenizer
16
+
17
+ This is a Byte-Pair Encoding (BPE) tokenizer specifically designed for Sanskrit text. It provides a web interface for both training the tokenizer and using it to encode/decode text.
18
+
19
+ ## Features
20
+
21
+ - Train BPE tokenizer on custom Sanskrit text
22
+ - Tokenize Sanskrit text using the trained model
23
+ - Verify tokenization accuracy through decode/encode cycle
24
+ - User-friendly web interface
25
+
26
+ ## Usage
27
+
28
+ 1. Go to the "Train" tab and paste your Sanskrit training text
29
+ 2. Click "Train Tokenizer" to train the model
30
+ 3. Switch to the "Tokenize" tab to tokenize new text
31
+ 4. Enter text and click "Tokenize" to see the results
32
+
33
+ ## Example Text
34
+ ```
35
+ चीराण्यपास्याज्जनकस्य कन्या नेयं प्रतिज्ञा मम दत्तपूर्वा।
36
+ यथासुखं गच्छतु राजपुत्री वनं समग्रा सह सर्वरत्नैः॥
37
+ ```
38
+
39
+ # To deploy this to Hugging Face Spaces:
40
+
41
+ 1. Create a new Space on Hugging Face:
42
+ ```bash
43
+ huggingface-cli login
44
+ huggingface-cli repo create sanskrit-tokenizer-demo --type space
45
+ ```
46
+ 2. Initialize git and push your code:
47
+ ```bash
48
+ git init
49
+ git add .
50
+ git commit -m "Initial commit"
51
+ git remote add origin https://huggingface.co/spaces/your-username/sanskrit-tokenizer-demo
52
+ git push -u origin main
53
+ ```
54
+
55
+ # Steps to Run Locally
56
+ 1. Create and activate a virtual environment:
57
+ ```bash
58
+ python -m venv venv
59
+ source venv/bin/activate # On Windows: venv\Scripts\activate
60
+ ```
61
+
62
+ 2. Install the requirements and the Hugging Face CLI:
63
+ ```bash
64
+ pip install -r requirements.txt
65
+ pip install --upgrade huggingface-hub
66
+ ```
67
+
68
+ 4. To run the app:
69
+ ```bash
70
+ python src/app.py
71
+ ```
72
+ The interface will be available at `http://localhost:7860` by default.
73
+
74
+ # Logs
75
+
76
+ Orignal (before Hugging Space code):
77
+ ```
78
+ (venv) gitesh.grover@Giteshs-MacBook-Pro ai-era-assignment11 % python src/main.py
79
+ Reading file...
80
+ Length of training dataset for token 620958
81
+ UTF-8 tokens length (without considering regex) 1719701
82
+ Preprocessing tokens...
83
+ UTF-8 Split tokens length (due to regex) 77799
84
+ Training BPE...
85
+ Learning BPE: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 4744/4744 [06:21<00:00, 12.45it/s]
86
+ Tokenizer training completed in 381.08 seconds
87
+ Vocab size: 5000
88
+ Original tokens length 1719701, while updated tokens length 77799
89
+ Compression Ratio 22.10
90
+ Saving Tokenizer Vocab in files...
91
+ Testing the validity of tokenizer...
92
+ True
93
+ ```
94
+
95
+ After Hugging Space implementation:
96
+ ```
97
+ Learning BPE: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 4744/4744 [03:25<00:00, 23.07it/s]
98
+
99
+ (Huggingface app output)
100
+ Training completed! Vocabulary size: 5000 and Compression Ratio: 9.42
101
+
102
+ ```
data/paired_tokens.bpe ADDED
@@ -0,0 +1,4745 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Token version 1
2
+ (224, 164):256
3
+ (224, 165):257
4
+ (257, 141):258
5
+ (32, 256):259
6
+ (258, 256):260
7
+ (256, 190):261
8
+ (261, 256):262
9
+ (256, 191):263
10
+ (256, 164):264
11
+ (256, 176):265
12
+ (257, 129):266
13
+ (257, 135):267
14
+ (263, 256):268
15
+ (260, 175):269
16
+ (256, 168):270
17
+ (256, 174):271
18
+ (260, 176):272
19
+ (256, 130):273
20
+ (256, 184):274
21
+ (256, 181):275
22
+ (257, 139):276
23
+ (260, 164):277
24
+ (257, 164):278
25
+ (259, 184):279
26
+ (266, 256):280
27
+ (257, 165):281
28
+ (259, 170):282
29
+ (260, 181):283
30
+ (256, 131):284
31
+ (256, 149):285
32
+ (259, 164):286
33
+ (257, 128):287
34
+ (256, 175):288
35
+ (259, 181):289
36
+ (262, 168):290
37
+ (256, 166):291
38
+ (256, 185):292
39
+ (259, 149):293
40
+ (256, 182):294
41
+ (259, 174):295
42
+ (257, 131):296
43
+ (256, 170):297
44
+ (265, 260):298
45
+ (263, 264):299
46
+ (257, 136):300
47
+ (259, 168):301
48
+ (262, 174):302
49
+ (259, 154):303
50
+ (256, 183):304
51
+ (262, 130):305
52
+ (259, 166):306
53
+ (262, 176):307
54
+ (259, 176):308
55
+ (257, 130):309
56
+ (262, 164):310
57
+ (256, 163):311
58
+ (260, 174):312
59
+ (260, 183):313
60
+ (259, 182):314
61
+ (282, 272):315
62
+ (256, 165):316
63
+ (259, 173):317
64
+ (260, 154):318
65
+ (259, 175):319
66
+ (256, 178):320
67
+ (271, 258):321
68
+ (256, 173):322
69
+ (262, 184):323
70
+ (262, 131):324
71
+ (274, 277):325
72
+ (256, 154):326
73
+ (256, 151):327
74
+ (256, 156):328
75
+ (274, 269):329
76
+ (267, 270):330
77
+ (266, 265):331
78
+ (270, 277):332
79
+ (289, 268):333
80
+ (284, 278):334
81
+ (257, 140):335
82
+ (296, 264):336
83
+ (285, 313):337
84
+ (259, 185):338
85
+ (262, 175):339
86
+ (268, 168):340
87
+ (256, 167):341
88
+ (265, 283):342
89
+ (295, 292):343
90
+ (284, 281):344
91
+ (264, 272):345
92
+ (262, 166):346
93
+ (268, 183):347
94
+ (260, 167):348
95
+ (259, 151):349
96
+ (262, 170):350
97
+ (308, 262):351
98
+ (268, 181):352
99
+ (259, 172):353
100
+ (260, 168):354
101
+ (262, 163):355
102
+ (264, 263):356
103
+ (267, 275):357
104
+ (256, 189):358
105
+ (290, 258):359
106
+ (264, 267):360
107
+ (262, 182):361
108
+ (262, 154):362
109
+ (260, 159):363
110
+ (262, 181):364
111
+ (294, 318):365
112
+ (321, 281):366
113
+ (260, 165):367
114
+ (298, 174):368
115
+ (280, 166):369
116
+ (259, 156):370
117
+ (264, 258):371
118
+ (267, 304):372
119
+ (321, 278):373
120
+ (266, 264):374
121
+ (283, 261):375
122
+ (263, 265):376
123
+ (262, 149):377
124
+ (279, 271):378
125
+ (260, 166):379
126
+ (259, 133):380
127
+ (262, 178):381
128
+ (262, 185):382
129
+ (260, 170):383
130
+ (282, 265):384
131
+ (276, 358):385
132
+ (279, 342):386
133
+ (280, 149):387
134
+ (260, 155):388
135
+ (296, 304):389
136
+ (264, 269):390
137
+ (351, 156):391
138
+ (259, 167):392
139
+ (153, 260):393
140
+ (300, 275):394
141
+ (259, 137):395
142
+ (279, 273):396
143
+ (268, 182):397
144
+ (275, 362):398
145
+ (280, 183):399
146
+ (280, 170):400
147
+ (266, 271):401
148
+ (316, 261):402
149
+ (264, 277):403
150
+ (268, 166):404
151
+ (268, 170):405
152
+ (270, 269):406
153
+ (268, 131):407
154
+ (266, 270):408
155
+ (256, 172):409
156
+ (262, 151):410
157
+ (259, 178):411
158
+ (262, 167):412
159
+ (324, 278):413
160
+ (268, 175):414
161
+ (262, 173):415
162
+ (310, 312):416
163
+ (270, 258):417
164
+ (268, 174):418
165
+ (269, 273):419
166
+ (286, 283):420
167
+ (268, 149):421
168
+ (268, 130):422
169
+ (274, 312):423
170
+ (260, 184):424
171
+ (265, 277):425
172
+ (276, 285):426
173
+ (369, 348):427
174
+ (387, 277):428
175
+ (260, 161):429
176
+ (260, 158):430
177
+ (260, 160):431
178
+ (286, 267):432
179
+ (261, 278):433
180
+ (259, 135):434
181
+ (256, 133):435
182
+ (298, 183):436
183
+ (267, 291):437
184
+ (274, 273):438
185
+ (264, 276):439
186
+ (323, 277):440
187
+ (280, 131):441
188
+ (262, 156):442
189
+ (256, 393):443
190
+ (286, 266):444
191
+ (287, 264):445
192
+ (287, 265):446
193
+ (302, 258):447
194
+ (267, 264):448
195
+ (267, 294):449
196
+ (269, 271):450
197
+ (389, 363):451
198
+ (326, 388):452
199
+ (280, 163):453
200
+ (264, 284):454
201
+ (310, 258):455
202
+ (317, 275):456
203
+ (324, 281):457
204
+ (290, 305):458
205
+ (347, 269):459
206
+ (272, 275):460
207
+ (288, 261):461
208
+ (272, 271):462
209
+ (267, 311):463
210
+ (270, 273):464
211
+ (288, 276):465
212
+ (361, 318):466
213
+ (308, 302):467
214
+ (300, 284):468
215
+ (286, 291):469
216
+ (270, 354):470
217
+ (306, 357):471
218
+ (266, 275):472
219
+ (279, 292):473
220
+ (280, 167):474
221
+ (288, 273):475
222
+ (259, 143):476
223
+ (293, 336):477
224
+ (287, 271):478
225
+ (260, 149):479
226
+ (287, 275):480
227
+ (297, 272):481
228
+ (314, 272):482
229
+ (298, 163):483
230
+ (290, 263):484
231
+ (290, 277):485
232
+ (256, 150):486
233
+ (280, 178):487
234
+ (379, 272):488
235
+ (266, 345):489
236
+ (332, 263):490
237
+ (395, 398):491
238
+ (274, 367):492
239
+ (295, 267):493
240
+ (282, 331):494
241
+ (338, 263):495
242
+ (294, 269):496
243
+ (297, 263):497
244
+ (267, 278):498
245
+ (279, 283):499
246
+ (291, 269):500
247
+ (265, 273):501
248
+ (293, 313):502
249
+ (372, 266):503
250
+ (300, 265):504
251
+ (268, 173):505
252
+ (353, 272):506
253
+ (302, 263):507
254
+ (280, 182):508
255
+ (267, 281):509
256
+ (307, 367):510
257
+ (268, 163):511
258
+ (260, 173):512
259
+ (280, 173):513
260
+ (256, 152):514
261
+ (264, 273):515
262
+ (268, 185):516
263
+ (269, 276):517
264
+ (347, 431):518
265
+ (260, 163):519
266
+ (274, 283):520
267
+ (285, 277):521
268
+ (371, 281):522
269
+ (268, 184):523
270
+ (289, 269):524
271
+ (274, 263):525
272
+ (266, 273):526
273
+ (298, 182):527
274
+ (280, 150):528
275
+ (261, 281):529
276
+ (260, 156):530
277
+ (309, 297):531
278
+ (276, 297):532
279
+ (325, 266):533
280
+ (32, 281):534
281
+ (266, 298):535
282
+ (356, 281):536
283
+ (268, 167):537
284
+ (268, 151):538
285
+ (285, 272):539
286
+ (283, 265):540
287
+ (259, 134):541
288
+ (443, 149):542
289
+ (293, 272):543
290
+ (280, 151):544
291
+ (264, 424):545
292
+ (315, 264):546
293
+ (317, 309):547
294
+ (267, 288):548
295
+ (274, 271):549
296
+ (262, 172):550
297
+ (447, 278):551
298
+ (392, 368):552
299
+ (269, 267):553
300
+ (287, 270):554
301
+ (299, 273):555
302
+ (291, 258):556
303
+ (268, 154):557
304
+ (289, 300):558
305
+ (269, 261):559
306
+ (266, 398):560
307
+ (312, 311):561
308
+ (269, 275):562
309
+ (263, 298):563
310
+ (264, 305):564
311
+ (309, 265):565
312
+ (328, 430):566
313
+ (274, 261):567
314
+ (314, 265):568
315
+ (158, 318):569
316
+ (359, 278):570
317
+ (260, 172):571
318
+ (260, 178):572
319
+ (296, 292):573
320
+ (269, 339):574
321
+ (337, 269):575
322
+ (377, 313):576
323
+ (286, 345):577
324
+ (256, 143):578
325
+ (355, 263):579
326
+ (276, 291):580
327
+ (299, 272):581
328
+ (293, 381):582
329
+ (355, 429):583
330
+ (333, 182):584
331
+ (350, 263):585
332
+ (296, 297):586
333
+ (299, 261):587
334
+ (280, 185):588
335
+ (276, 304):589
336
+ (327, 272):590
337
+ (311, 429):591
338
+ (282, 408):592
339
+ (323, 269):593
340
+ (149, 313):594
341
+ (282, 489):595
342
+ (296, 294):596
343
+ (268, 178):597
344
+ (306, 451):598
345
+ (271, 270):599
346
+ (289, 261):600
347
+ (331, 283):601
348
+ (286, 329):602
349
+ (270, 379):603
350
+ (333, 166):604
351
+ (287, 297):605
352
+ (293, 422):606
353
+ (270, 348):607
354
+ (292, 273):608
355
+ (276, 341):609
356
+ (447, 281):610
357
+ (360, 278):611
358
+ (319, 291):612
359
+ (353, 292):613
360
+ (265, 267):614
361
+ (343, 307):615
362
+ (268, 156):616
363
+ (310, 272):617
364
+ (330, 488):618
365
+ (315, 390):619
366
+ (303, 278):620
367
+ (290, 273):621
368
+ (328, 288):622
369
+ (274, 272):623
370
+ (296, 291):624
371
+ (319, 402):625
372
+ (306, 283):626
373
+ (293, 316):627
374
+ (308, 316):628
375
+ (294, 283):629
376
+ (152, 275):630
377
+ (322, 309):631
378
+ (287, 304):632
379
+ (309, 320):633
380
+ (476, 275):634
381
+ (317, 307):635
382
+ (301, 265):636
383
+ (262, 183):637
384
+ (353, 320):638
385
+ (280, 154):639
386
+ (289, 326):640
387
+ (351, 594):641
388
+ (264, 261):642
389
+ (443, 151):643
390
+ (416, 270):644
391
+ (393, 151):645
392
+ (370, 270):646
393
+ (300, 298):647
394
+ (351, 630):648
395
+ (355, 305):649
396
+ (403, 271):650
397
+ (322, 269):651
398
+ (360, 281):652
399
+ (374, 375):653
400
+ (346, 258):654
401
+ (407, 278):655
402
+ (295, 271):656
403
+ (295, 270):657
404
+ (303, 394):658
405
+ (315, 275):659
406
+ (297, 265):660
407
+ (343, 550):661
408
+ (282, 583):662
409
+ (411, 426):663
410
+ (288, 267):664
411
+ (288, 302):665
412
+ (286, 402):666
413
+ (271, 428):667
414
+ (271, 400):668
415
+ (286, 423):669
416
+ (350, 277):670
417
+ (347, 363):671
418
+ (340, 354):672
419
+ (293, 307):673
420
+ (279, 367):674
421
+ (298, 165):675
422
+ (371, 278):676
423
+ (292, 312):677
424
+ (336, 277):678
425
+ (338, 269):679
426
+ (259, 152):680
427
+ (325, 272):681
428
+ (286, 272):682
429
+ (356, 278):683
430
+ (279, 312):684
431
+ (391, 261):685
432
+ (280, 156):686
433
+ (276, 265):687
434
+ (327, 275):688
435
+ (264, 344):689
436
+ (641, 274):690
437
+ (271, 290):691
438
+ (332, 267):692
439
+ (287, 288):693
440
+ (557, 388):694
441
+ (282, 309):695
442
+ (289, 446):696
443
+ (270, 366):697
444
+ (275, 269):698
445
+ (286, 275):699
446
+ (333, 181):700
447
+ (397, 318):701
448
+ (665, 323):702
449
+ (285, 307):703
450
+ (289, 265):704
451
+ (298, 156):705
452
+ (269, 305):706
453
+ (285, 336):707
454
+ (412, 574):708
455
+ (441, 486):709
456
+ (333, 168):710
457
+ (386, 267):711
458
+ (304, 363):712
459
+ (317, 272):713
460
+ (264, 334):714
461
+ (460, 287):715
462
+ (282, 299):716
463
+ (271, 269):717
464
+ (291, 272):718
465
+ (299, 269):719
466
+ (265, 442):720
467
+ (265, 311):721
468
+ (340, 287):722
469
+ (267, 292):723
470
+ (158, 530):724
471
+ (283, 273):725
472
+ (282, 264):726
473
+ (286, 273):727
474
+ (264, 281):728
475
+ (271, 267):729
476
+ (294, 272):730
477
+ (286, 297):731
478
+ (271, 357):732
479
+ (276, 292):733
480
+ (300, 334):734
481
+ (319, 316):735
482
+ (298, 167):736
483
+ (359, 281):737
484
+ (290, 269):738
485
+ (434, 275):739
486
+ (494, 399):740
487
+ (372, 431):741
488
+ (662, 275):742
489
+ (299, 276):743
490
+ (264, 375):744
491
+ (279, 277):745
492
+ (260, 151):746
493
+ (293, 368):747
494
+ (259, 150):748
495
+ (306, 272):749
496
+ (317, 265):750
497
+ (336, 269):751
498
+ (279, 445):752
499
+ (299, 258):753
500
+ (271, 383):754
501
+ (506, 677):755
502
+ (308, 337):756
503
+ (320, 273):757
504
+ (291, 527):758
505
+ (256, 159):759
506
+ (395, 297):760
507
+ (632, 312):761
508
+ (598, 375):762
509
+ (303, 281):763
510
+ (264, 287):764
511
+ (370, 327):765
512
+ (309, 304):766
513
+ (306, 352):767
514
+ (351, 181):768
515
+ (768, 311):769
516
+ (409, 715):770
517
+ (276, 326):771
518
+ (256, 135):772
519
+ (346, 269):773
520
+ (407, 281):774
521
+ (264, 325):775
522
+ (300, 365):776
523
+ (267, 358):777
524
+ (301, 302):778
525
+ (298, 170):779
526
+ (289, 377):780
527
+ (335, 278):781
528
+ (299, 334):782
529
+ (308, 311):783
530
+ (713, 310):784
531
+ (391, 417):785
532
+ (300, 344):786
533
+ (287, 337):787
534
+ (482, 653):788
535
+ (337, 561):789
536
+ (256, 161):790
537
+ (449, 540):791
538
+ (293, 331):792
539
+ (256, 569):793
540
+ (299, 263):794
541
+ (293, 265):795
542
+ (271, 352):796
543
+ (369, 272):797
544
+ (627, 273):798
545
+ (286, 454):799
546
+ (412, 405):800
547
+ (299, 413):801
548
+ (276, 322):802
549
+ (288, 417):803
550
+ (317, 478):804
551
+ (523, 277):805
552
+ (384, 271):806
553
+ (326, 318):807
554
+ (420, 273):808
555
+ (306, 709):809
556
+ (264, 271):810
557
+ (322, 275):811
558
+ (262, 165):812
559
+ (335, 265):813
560
+ (279, 331):814
561
+ (328, 270):815
562
+ (286, 316):816
563
+ (276, 271):817
564
+ (333, 183):818
565
+ (314, 345):819
566
+ (456, 459):820
567
+ (296, 316):821
568
+ (319, 427):822
569
+ (319, 474):823
570
+ (370, 480):824
571
+ (289, 270):825
572
+ (296, 311):826
573
+ (350, 269):827
574
+ (305, 365):828
575
+ (266, 325):829
576
+ (276, 311):830
577
+ (301, 299):831
578
+ (349, 453):832
579
+ (327, 354):833
580
+ (301, 586):834
581
+ (291, 357):835
582
+ (315, 414):836
583
+ (291, 283):837
584
+ (382, 561):838
585
+ (543, 427):839
586
+ (275, 267):840
587
+ (278, 278):841
588
+ (299, 366):842
589
+ (279, 291):843
590
+ (282, 793):844
591
+ (274, 383):845
592
+ (518, 376):846
593
+ (266, 368):847
594
+ (378, 383):848
595
+ (315, 322):849
596
+ (299, 373):850
597
+ (317, 688):851
598
+ (266, 274):852
599
+ (341, 368):853
600
+ (264, 278):854
601
+ (436, 322):855
602
+ (315, 292):856
603
+ (300, 285):857
604
+ (279, 390):858
605
+ (295, 461):859
606
+ (267, 285):860
607
+ (340, 277):861
608
+ (399, 363):862
609
+ (256, 137):863
610
+ (299, 375):864
611
+ (264, 385):865
612
+ (298, 185):866
613
+ (270, 373):867
614
+ (296, 327):868
615
+ (578, 275):869
616
+ (270, 271):870
617
+ (265, 531):871
618
+ (450, 290):872
619
+ (353, 427):873
620
+ (421, 313):874
621
+ (289, 274):875
622
+ (291, 348):876
623
+ (256, 162):877
624
+ (282, 496):878
625
+ (301, 352):879
626
+ (338, 265):880
627
+ (320, 426):881
628
+ (267, 326):882
629
+ (262, 645):883
630
+ (285, 273):884
631
+ (469, 261):885
632
+ (264, 283):886
633
+ (290, 302):887
634
+ (299, 344):888
635
+ (264, 329):889
636
+ (349, 452):890
637
+ (404, 273):891
638
+ (619, 560):892
639
+ (333, 149):893
640
+ (661, 320):894
641
+ (270, 488):895
642
+ (282, 510):896
643
+ (262, 189):897
644
+ (270, 312):898
645
+ (295, 305):899
646
+ (293, 425):900
647
+ (279, 401):901
648
+ (477, 375):902
649
+ (416, 261):903
650
+ (300, 342):904
651
+ (274, 330):905
652
+ (287, 273):906
653
+ (264, 454):907
654
+ (333, 170):908
655
+ (282, 350):909
656
+ (301, 376):910
657
+ (343, 644):911
658
+ (268, 172):912
659
+ (267, 328):913
660
+ (271, 355):914
661
+ (264, 297):915
662
+ (280, 172):916
663
+ (615, 442):917
664
+ (506, 838):918
665
+ (306, 294):919
666
+ (319, 276):920
667
+ (374, 424):921
668
+ (289, 341):922
669
+ (544, 272):923
670
+ (315, 274):924
671
+ (290, 265):925
672
+ (315, 670):926
673
+ (293, 302):927
674
+ (695, 342):928
675
+ (378, 614):929
676
+ (403, 283):930
677
+ (328, 269):931
678
+ (286, 330):932
679
+ (311, 305):933
680
+ (270, 283):934
681
+ (285, 361):935
682
+ (473, 623):936
683
+ (295, 307):937
684
+ (332, 272):938
685
+ (298, 151):939
686
+ (286, 439):940
687
+ (262, 150):941
688
+ (502, 345):942
689
+ (317, 761):943
690
+ (275, 323):944
691
+ (374, 277):945
692
+ (306, 331):946
693
+ (297, 264):947
694
+ (264, 479):948
695
+ (269, 310):949
696
+ (296, 496):950
697
+ (285, 276):951
698
+ (301, 271):952
699
+ (259, 171):953
700
+ (356, 265):954
701
+ (332, 276):955
702
+ (295, 290):956
703
+ (300, 294):957
704
+ (349, 331):958
705
+ (606, 326):959
706
+ (612, 263):960
707
+ (532, 271):961
708
+ (340, 334):962
709
+ (459, 507):963
710
+ (411, 789):964
711
+ (333, 174):965
712
+ (325, 402):966
713
+ (287, 483):967
714
+ (289, 437):968
715
+ (282, 291):969
716
+ (337, 311):970
717
+ (286, 371):971
718
+ (292, 263):972
719
+ (276, 650):973
720
+ (372, 283):974
721
+ (372, 305):975
722
+ (335, 281):976
723
+ (274, 292):977
724
+ (332, 273):978
725
+ (349, 264):979
726
+ (361, 283):980
727
+ (271, 571):981
728
+ (301, 563):982
729
+ (264, 383):983
730
+ (282, 821):984
731
+ (300, 406):985
732
+ (288, 271):986
733
+ (307, 379):987
734
+ (406, 276):988
735
+ (440, 272):989
736
+ (434, 536):990
737
+ (279, 528):991
738
+ (297, 489):992
739
+ (420, 461):993
740
+ (288, 284):994
741
+ (285, 265):995
742
+ (279, 385):996
743
+ (333, 154):997
744
+ (286, 305):998
745
+ (340, 258):999
746
+ (923, 480):1000
747
+ (275, 270):1001
748
+ (263, 342):1002
749
+ (547, 271):1003
750
+ (288, 366):1004
751
+ (269, 284):1005
752
+ (267, 390):1006
753
+ (279, 330):1007
754
+ (285, 368):1008
755
+ (363, 272):1009
756
+ (435, 316):1010
757
+ (279, 472):1011
758
+ (319, 428):1012
759
+ (314, 426):1013
760
+ (279, 261):1014
761
+ (297, 496):1015
762
+ (337, 511):1016
763
+ (263, 278):1017
764
+ (404, 348):1018
765
+ (680, 687):1019
766
+ (470, 327):1020
767
+ (626, 616):1021
768
+ (307, 269):1022
769
+ (285, 487):1023
770
+ (508, 318):1024
771
+ (290, 287):1025
772
+ (420, 305):1026
773
+ (274, 267):1027
774
+ (409, 379):1028
775
+ (300, 304):1029
776
+ (296, 337):1030
777
+ (270, 334):1031
778
+ (428, 375):1032
779
+ (391, 430):1033
780
+ (307, 311):1034
781
+ (615, 316):1035
782
+ (336, 273):1036
783
+ (339, 270):1037
784
+ (279, 269):1038
785
+ (403, 542):1039
786
+ (299, 284):1040
787
+ (333, 184):1041
788
+ (416, 328):1042
789
+ (426, 277):1043
790
+ (295, 310):1044
791
+ (380, 270):1045
792
+ (382, 273):1046
793
+ (264, 439):1047
794
+ (309, 270):1048
795
+ (295, 408):1049
796
+ (291, 273):1050
797
+ (338, 270):1051
798
+ (270, 344):1052
799
+ (315, 355):1053
800
+ (325, 283):1054
801
+ (831, 419):1055
802
+ (409, 348):1056
803
+ (263, 368):1057
804
+ (293, 335):1058
805
+ (333, 167):1059
806
+ (640, 464):1060
807
+ (279, 335):1061
808
+ (279, 412):1062
809
+ (272, 472):1063
810
+ (279, 1000):1064
811
+ (315, 291):1065
812
+ (319, 267):1066
813
+ (416, 290):1067
814
+ (288, 291):1068
815
+ (297, 331):1069
816
+ (298, 166):1070
817
+ (384, 273):1071
818
+ (270, 352):1072
819
+ (264, 423):1073
820
+ (787, 519):1074
821
+ (295, 406):1075
822
+ (430, 310):1076
823
+ (262, 159):1077
824
+ (306, 397):1078
825
+ (410, 272):1079
826
+ (289, 267):1080
827
+ (573, 269):1081
828
+ (325, 267):1082
829
+ (287, 790):1083
830
+ (273, 274):1084
831
+ (302, 292):1085
832
+ (301, 516):1086
833
+ (441, 281):1087
834
+ (271, 275):1088
835
+ (272, 273):1089
836
+ (282, 307):1090
837
+ (453, 429):1091
838
+ (823, 846):1092
839
+ (265, 316):1093
840
+ (353, 381):1094
841
+ (271, 323):1095
842
+ (265, 373):1096
843
+ (262, 724):1097
844
+ (267, 356):1098
845
+ (584, 283):1099
846
+ (315, 328):1100
847
+ (314, 513):1101
848
+ (325, 291):1102
849
+ (314, 285):1103
850
+ (297, 269):1104
851
+ (411, 542):1105
852
+ (634, 667):1106
853
+ (264, 302):1107
854
+ (337, 288):1108
855
+ (264, 291):1109
856
+ (661, 382):1110
857
+ (256, 134):1111
858
+ (301, 397):1112
859
+ (333, 156):1113
860
+ (309, 264):1114
861
+ (386, 273):1115
862
+ (750, 264):1116
863
+ (299, 267):1117
864
+ (269, 302):1118
865
+ (293, 586):1119
866
+ (455, 278):1120
867
+ (319, 345):1121
868
+ (262, 569):1122
869
+ (365, 394):1123
870
+ (282, 342):1124
871
+ (289, 925):1125
872
+ (309, 288):1126
873
+ (349, 607):1127
874
+ (282, 1020):1128
875
+ (361, 272):1129
876
+ (307, 288):1130
877
+ (384, 352):1131
878
+ (314, 264):1132
879
+ (320, 383):1133
880
+ (268, 645):1134
881
+ (303, 585):1135
882
+ (275, 404):1136
883
+ (396, 275):1137
884
+ (265, 637):1138
885
+ (293, 882):1139
886
+ (942, 414):1140
887
+ (275, 957):1141
888
+ (1141, 754):1142
889
+ (1142, 1037):1143
890
+ (857, 548):1144
891
+ (267, 475):1145
892
+ (295, 341):1146
893
+ (293, 418):1147
894
+ (848, 272):1148
895
+ (319, 271):1149
896
+ (271, 309):1150
897
+ (290, 270):1151
898
+ (745, 272):1152
899
+ (285, 302):1153
900
+ (343, 310):1154
901
+ (268, 150):1155
902
+ (323, 331):1156
903
+ (592, 265):1157
904
+ (274, 479):1158
905
+ (288, 373):1159
906
+ (264, 418):1160
907
+ (535, 166):1161
908
+ (350, 272):1162
909
+ (309, 483):1163
910
+ (299, 457):1164
911
+ (301, 405):1165
912
+ (301, 410):1166
913
+ (45, 39):1167
914
+ (293, 508):1168
915
+ (271, 891):1169
916
+ (288, 332):1170
917
+ (271, 322):1171
918
+ (901, 292):1172
919
+ (308, 531):1173
920
+ (268, 152):1174
921
+ (288, 335):1175
922
+ (309, 316):1176
923
+ (803, 281):1177
924
+ (340, 344):1178
925
+ (275, 294):1179
926
+ (360, 304):1180
927
+ (297, 277):1181
928
+ (289, 339):1182
929
+ (604, 269):1183
930
+ (288, 428):1184
931
+ (270, 276):1185
932
+ (311, 273):1186
933
+ (271, 512):1187
934
+ (319, 330):1188
935
+ (283, 320):1189
936
+ (305, 325):1190
937
+ (286, 271):1191
938
+ (303, 290):1192
939
+ (274, 650):1193
940
+ (730, 741):1194
941
+ (987, 633):1195
942
+ (469, 258):1196
943
+ (291, 512):1197
944
+ (684, 336):1198
945
+ (635, 854):1199
946
+ (635, 728):1200
947
+ (287, 278):1201
948
+ (287, 320):1202
949
+ (467, 284):1203
950
+ (392, 270):1204
951
+ (543, 609):1205
952
+ (315, 271):1206
953
+ (272, 485):1207
954
+ (409, 320):1208
955
+ (327, 271):1209
956
+ (309, 271):1210
957
+ (455, 281):1211
958
+ (259, 139):1212
959
+ (700, 537):1213
960
+ (275, 276):1214
961
+ (434, 356):1215
962
+ (264, 610):1216
963
+ (314, 565):1217
964
+ (271, 292):1218
965
+ (362, 318):1219
966
+ (289, 389):1220
967
+ (293, 1144):1221
968
+ (301, 414):1222
969
+ (291, 723):1223
970
+ (525, 278):1224
971
+ (770, 522):1225
972
+ (624, 348):1226
973
+ (288, 263):1227
974
+ (275, 273):1228
975
+ (270, 346):1229
976
+ (378, 332):1230
977
+ (275, 419):1231
978
+ (315, 294):1232
979
+ (326, 265):1233
980
+ (279, 369):1234
981
+ (315, 288):1235
982
+ (306, 394):1236
983
+ (288, 334):1237
984
+ (984, 352):1238
985
+ (349, 328):1239
986
+ (270, 267):1240
987
+ (467, 329):1241
988
+ (310, 263):1242
989
+ (279, 374):1243
990
+ (783, 267):1244
991
+ (476, 304):1245
992
+ (290, 312):1246
993
+ (289, 336):1247
994
+ (314, 521):1248
995
+ (1138, 1009):1249
996
+ (264, 367):1250
997
+ (456, 267):1251
998
+ (508, 272):1252
999
+ (274, 335):1253
1000
+ (289, 678):1254
1001
+ (415, 706):1255
1002
+ (301, 407):1256
1003
+ (401, 866):1257
1004
+ (309, 342):1258
1005
+ (437, 258):1259
1006
+ (267, 322):1260
1007
+ (314, 826):1261
1008
+ (467, 273):1262
1009
+ (421, 462):1263
1010
+ (869, 667):1264
1011
+ (307, 511):1265
1012
+ (288, 433):1266
1013
+ (380, 322):1267
1014
+ (696, 562):1268
1015
+ (289, 1030):1269
1016
+ (279, 307):1270
1017
+ (302, 269):1271
1018
+ (275, 446):1272
1019
+ (437, 273):1273
1020
+ (276, 398):1274
1021
+ (32, 278):1275
1022
+ (274, 346):1276
1023
+ (314, 539):1277
1024
+ (303, 264):1278
1025
+ (405, 272):1279
1026
+ (325, 273):1280
1027
+ (259, 155):1281
1028
+ (590, 302):1282
1029
+ (364, 285):1283
1030
+ (289, 291):1284
1031
+ (977, 623):1285
1032
+ (988, 406):1286
1033
+ (705, 408):1287
1034
+ (760, 708):1288
1035
+ (384, 269):1289
1036
+ (554, 305):1290
1037
+ (441, 278):1291
1038
+ (295, 588):1292
1039
+ (309, 425):1293
1040
+ (275, 436):1294
1041
+ (341, 269):1295
1042
+ (297, 310):1296
1043
+ (317, 718):1297
1044
+ (274, 374):1298
1045
+ (289, 381):1299
1046
+ (349, 376):1300
1047
+ (256, 171):1301
1048
+ (328, 274):1302
1049
+ (290, 267):1303
1050
+ (436, 311):1304
1051
+ (510, 273):1305
1052
+ (592, 284):1306
1053
+ (545, 269):1307
1054
+ (289, 323):1308
1055
+ (631, 275):1309
1056
+ (343, 364):1310
1057
+ (916, 348):1311
1058
+ (780, 450):1312
1059
+ (582, 267):1313
1060
+ (287, 285):1314
1061
+ (301, 290):1315
1062
+ (279, 985):1316
1063
+ (271, 410):1317
1064
+ (297, 291):1318
1065
+ (319, 371):1319
1066
+ (286, 310):1320
1067
+ (319, 294):1321
1068
+ (752, 261):1322
1069
+ (401, 307):1323
1070
+ (299, 433):1324
1071
+ (275, 265):1325
1072
+ (289, 464):1326
1073
+ (546, 405):1327
1074
+ (399, 383):1328
1075
+ (306, 527):1329
1076
+ (1097, 320):1330
1077
+ (275, 397):1331
1078
+ (680, 276):1332
1079
+ (271, 581):1333
1080
+ (303, 300):1334
1081
+ (256, 724):1335
1082
+ (290, 354):1336
1083
+ (396, 294):1337
1084
+ (289, 436):1338
1085
+ (385, 497):1339
1086
+ (349, 744):1340
1087
+ (298, 152):1341
1088
+ (325, 329):1342
1089
+ (274, 276):1343
1090
+ (547, 264):1344
1091
+ (317, 288):1345
1092
+ (780, 419):1346
1093
+ (285, 381):1347
1094
+ (264, 335):1348
1095
+ (442, 430):1349
1096
+ (291, 596):1350
1097
+ (283, 328):1351
1098
+ (282, 346):1352
1099
+ (362, 265):1353
1100
+ (299, 277):1354
1101
+ (292, 307):1355
1102
+ (323, 263):1356
1103
+ (290, 271):1357
1104
+ (417, 281):1358
1105
+ (432, 358):1359
1106
+ (289, 425):1360
1107
+ (295, 751):1361
1108
+ (341, 270):1362
1109
+ (357, 273):1363
1110
+ (264, 345):1364
1111
+ (289, 328):1365
1112
+ (749, 830):1366
1113
+ (1116, 855):1367
1114
+ (339, 305):1368
1115
+ (264, 655):1369
1116
+ (264, 266):1370
1117
+ (264, 354):1371
1118
+ (333, 185):1372
1119
+ (291, 451):1373
1120
+ (262, 152):1374
1121
+ (322, 364):1375
1122
+ (325, 263):1376
1123
+ (306, 535):1377
1124
+ (299, 324):1378
1125
+ (349, 271):1379
1126
+ (349, 573):1380
1127
+ (1176, 297):1381
1128
+ (302, 571):1382
1129
+ (300, 320):1383
1130
+ (269, 327):1384
1131
+ (372, 363):1385
1132
+ (467, 276):1386
1133
+ (332, 265):1387
1134
+ (279, 400):1388
1135
+ (317, 425):1389
1136
+ (306, 591):1390
1137
+ (396, 288):1391
1138
+ (399, 273):1392
1139
+ (370, 290):1393
1140
+ (287, 514):1394
1141
+ (322, 276):1395
1142
+ (295, 868):1396
1143
+ (343, 415):1397
1144
+ (287, 322):1398
1145
+ (404, 272):1399
1146
+ (675, 273):1400
1147
+ (295, 261):1401
1148
+ (303, 539):1402
1149
+ (482, 374):1403
1150
+ (338, 264):1404
1151
+ (286, 269):1405
1152
+ (258, 278):1406
1153
+ (300, 368):1407
1154
+ (275, 570):1408
1155
+ (639, 269):1409
1156
+ (279, 779):1410
1157
+ (340, 273):1411
1158
+ (822, 267):1412
1159
+ (265, 337):1413
1160
+ (288, 474):1414
1161
+ (908, 272):1415
1162
+ (289, 362):1416
1163
+ (299, 526):1417
1164
+ (282, 335):1418
1165
+ (287, 294):1419
1166
+ (317, 276):1420
1167
+ (274, 342):1421
1168
+ (332, 284):1422
1169
+ (535, 173):1423
1170
+ (804, 905):1424
1171
+ (370, 310):1425
1172
+ (469, 283):1426
1173
+ (945, 271):1427
1174
+ (341, 364):1428
1175
+ (319, 566):1429
1176
+ (350, 264):1430
1177
+ (289, 697):1431
1178
+ (1154, 913):1432
1179
+ (279, 265):1433
1180
+ (328, 530):1434
1181
+ (766, 311):1435
1182
+ (293, 297):1436
1183
+ (397, 269):1437
1184
+ (287, 1341):1438
1185
+ (293, 487):1439
1186
+ (605, 277):1440
1187
+ (327, 264):1441
1188
+ (353, 1309):1442
1189
+ (267, 271):1443
1190
+ (295, 302):1444
1191
+ (323, 266):1445
1192
+ (271, 307):1446
1193
+ (307, 277):1447
1194
+ (953, 320):1448
1195
+ (269, 285):1449
1196
+ (275, 344):1450
1197
+ (301, 347):1451
1198
+ (396, 1282):1452
1199
+ (340, 488):1453
1200
+ (264, 402):1454
1201
+ (288, 344):1455
1202
+ (296, 452):1456
1203
+ (333, 173):1457
1204
+ (275, 359):1458
1205
+ (293, 276):1459
1206
+ (264, 551):1460
1207
+ (816, 394):1461
1208
+ (285, 754):1462
1209
+ (629, 340):1463
1210
+ (1091, 320):1464
1211
+ (282, 310):1465
1212
+ (504, 497):1466
1213
+ (401, 694):1467
1214
+ (295, 300):1468
1215
+ (316, 597):1469
1216
+ (640, 870):1470
1217
+ (295, 733):1471
1218
+ (307, 453):1472
1219
+ (309, 933):1473
1220
+ (338, 624):1474
1221
+ (306, 862):1475
1222
+ (293, 377):1476
1223
+ (1080, 327):1477
1224
+ (417, 278):1478
1225
+ (315, 445):1479
1226
+ (378, 369):1480
1227
+ (295, 528):1481
1228
+ (303, 265):1482
1229
+ (294, 264):1483
1230
+ (422, 292):1484
1231
+ (1391, 544):1485
1232
+ (325, 345):1486
1233
+ (340, 379):1487
1234
+ (385, 316):1488
1235
+ (423, 263):1489
1236
+ (323, 312):1490
1237
+ (355, 302):1491
1238
+ (317, 472):1492
1239
+ (525, 281):1493
1240
+ (307, 273):1494
1241
+ (306, 589):1495
1242
+ (397, 272):1496
1243
+ (303, 861):1497
1244
+ (280, 175):1498
1245
+ (350, 424):1499
1246
+ (265, 276):1500
1247
+ (297, 500):1501
1248
+ (271, 369):1502
1249
+ (339, 273):1503
1250
+ (317, 596):1504
1251
+ (523, 273):1505
1252
+ (282, 813):1506
1253
+ (380, 316):1507
1254
+ (327, 573):1508
1255
+ (338, 288):1509
1256
+ (327, 453):1510
1257
+ (349, 272):1511
1258
+ (302, 383):1512
1259
+ (604, 331):1513
1260
+ (286, 364):1514
1261
+ (326, 861):1515
1262
+ (296, 877):1516
1263
+ (275, 346):1517
1264
+ (409, 272):1518
1265
+ (314, 1028):1519
1266
+ (332, 287):1520
1267
+ (264, 264):1521
1268
+ (290, 330):1522
1269
+ (758, 270):1523
1270
+ (338, 451):1524
1271
+ (765, 302):1525
1272
+ (440, 402):1526
1273
+ (290, 283):1527
1274
+ (410, 264):1528
1275
+ (440, 267):1529
1276
+ (289, 585):1530
1277
+ (267, 651):1531
1278
+ (279, 383):1532
1279
+ (309, 877):1533
1280
+ (289, 294):1534
1281
+ (716, 1085):1535
1282
+ (474, 261):1536
1283
+ (320, 789):1537
1284
+ (389, 519):1538
1285
+ (270, 505):1539
1286
+ (476, 285):1540
1287
+ (1127, 342):1541
1288
+ (543, 414):1542
1289
+ (314, 376):1543
1290
+ (339, 474):1544
1291
+ (264, 775):1545
1292
+ (282, 453):1546
1293
+ (269, 374):1547
1294
+ (404, 258):1548
1295
+ (784, 296):1549
1296
+ (270, 263):1550
1297
+ (399, 479):1551
1298
+ (294, 1195):1552
1299
+ (293, 291):1553
1300
+ (293, 601):1554
1301
+ (399, 269):1555
1302
+ (320, 572):1556
1303
+ (423, 999):1557
1304
+ (293, 813):1558
1305
+ (32, 39):1559
1306
+ (668, 708):1560
1307
+ (396, 622):1561
1308
+ (1311, 285):1562
1309
+ (302, 270):1563
1310
+ (337, 283):1564
1311
+ (355, 269):1565
1312
+ (275, 377):1566
1313
+ (563, 166):1567
1314
+ (461, 281):1568
1315
+ (306, 449):1569
1316
+ (415, 269):1570
1317
+ (322, 637):1571
1318
+ (1332, 501):1572
1319
+ (265, 344):1573
1320
+ (1122, 270):1574
1321
+ (631, 304):1575
1322
+ (300, 325):1576
1323
+ (409, 382):1577
1324
+ (459, 490):1578
1325
+ (299, 266):1579
1326
+ (301, 719):1580
1327
+ (279, 309):1581
1328
+ (275, 341):1582
1329
+ (314, 1394):1583
1330
+ (258, 281):1584
1331
+ (301, 307):1585
1332
+ (499, 939):1586
1333
+ (278, 257):1587
1334
+ (575, 507):1588
1335
+ (636, 800):1589
1336
+ (377, 487):1590
1337
+ (473, 567):1591
1338
+ (288, 864):1592
1339
+ (274, 287):1593
1340
+ (409, 427):1594
1341
+ (843, 261):1595
1342
+ (310, 277):1596
1343
+ (502, 271):1597
1344
+ (410, 271):1598
1345
+ (279, 565):1599
1346
+ (293, 807):1600
1347
+ (269, 330):1601
1348
+ (504, 352):1602
1349
+ (275, 284):1603
1350
+ (392, 336):1604
1351
+ (323, 287):1605
1352
+ (897, 358):1606
1353
+ (584, 1512):1607
1354
+ (278, 281):1608
1355
+ (731, 520):1609
1356
+ (293, 406):1610
1357
+ (380, 297):1611
1358
+ (420, 271):1612
1359
+ (1468, 1469):1613
1360
+ (306, 1516):1614
1361
+ (274, 385):1615
1362
+ (539, 427):1616
1363
+ (353, 382):1617
1364
+ (280, 569):1618
1365
+ (482, 478):1619
1366
+ (287, 281):1620
1367
+ (921, 367):1621
1368
+ (438, 935):1622
1369
+ (275, 290):1623
1370
+ (314, 283):1624
1371
+ (466, 394):1625
1372
+ (1301, 320):1626
1373
+ (592, 344):1627
1374
+ (343, 1067):1628
1375
+ (322, 352):1629
1376
+ (314, 681):1630
1377
+ (568, 446):1631
1378
+ (274, 331):1632
1379
+ (306, 950):1633
1380
+ (264, 312):1634
1381
+ (265, 364):1635
1382
+ (294, 344):1636
1383
+ (291, 270):1637
1384
+ (370, 1076):1638
1385
+ (268, 165):1639
1386
+ (279, 387):1640
1387
+ (350, 265):1641
1388
+ (276, 403):1642
1389
+ (290, 275):1643
1390
+ (295, 938):1644
1391
+ (271, 406):1645
1392
+ (831, 450):1646
1393
+ (275, 492):1647
1394
+ (271, 528):1648
1395
+ (275, 274):1649
1396
+ (336, 267):1650
1397
+ (392, 1063):1651
1398
+ (335, 810):1652
1399
+ (446, 269):1653
1400
+ (293, 320):1654
1401
+ (349, 291):1655
1402
+ (323, 305):1656
1403
+ (291, 403):1657
1404
+ (416, 621):1658
1405
+ (306, 758):1659
1406
+ (355, 273):1660
1407
+ (301, 266):1661
1408
+ (374, 383):1662
1409
+ (274, 266):1663
1410
+ (1365, 272):1664
1411
+ (452, 272):1665
1412
+ (1414, 846):1666
1413
+ (322, 761):1667
1414
+ (315, 311):1668
1415
+ (770, 676):1669
1416
+ (279, 264):1670
1417
+ (306, 292):1671
1418
+ (294, 802):1672
1419
+ (558, 1223):1673
1420
+ (264, 433):1674
1421
+ (506, 472):1675
1422
+ (294, 426):1676
1423
+ (267, 371):1677
1424
+ (722, 281):1678
1425
+ (301, 269):1679
1426
+ (465, 265):1680
1427
+ (294, 334):1681
1428
+ (339, 285):1682
1429
+ (1476, 1621):1683
1430
+ (1374, 272):1684
1431
+ (361, 462):1685
1432
+ (1051, 401):1686
1433
+ (279, 410):1687
1434
+ (580, 285):1688
1435
+ (279, 1181):1689
1436
+ (317, 364):1690
1437
+ (669, 455):1691
1438
+ (279, 1484):1692
1439
+ (459, 536):1693
1440
+ (1003, 335):1694
1441
+ (547, 744):1695
1442
+ (378, 400):1696
1443
+ (415, 376):1697
1444
+ (851, 359):1698
1445
+ (314, 639):1699
1446
+ (673, 269):1700
1447
+ (265, 366):1701
1448
+ (1212, 304):1702
1449
+ (445, 320):1703
1450
+ (481, 322):1704
1451
+ (474, 269):1705
1452
+ (803, 278):1706
1453
+ (485, 273):1707
1454
+ (310, 261):1708
1455
+ (267, 345):1709
1456
+ (338, 281):1710
1457
+ (286, 518):1711
1458
+ (273, 294):1712
1459
+ (400, 272):1713
1460
+ (1452, 267):1714
1461
+ (392, 478):1715
1462
+ (287, 425):1716
1463
+ (314, 1252):1717
1464
+ (319, 544):1718
1465
+ (896, 352):1719
1466
+ (385, 811):1720
1467
+ (367, 339):1721
1468
+ (267, 337):1722
1469
+ (465, 327):1723
1470
+ (485, 265):1724
1471
+ (315, 372):1725
1472
+ (956, 399):1726
1473
+ (279, 1018):1727
1474
+ (481, 414):1728
1475
+ (354, 276):1729
1476
+ (959, 404):1730
1477
+ (303, 376):1731
1478
+ (380, 292):1732
1479
+ (270, 498):1733
1480
+ (275, 340):1734
1481
+ (326, 539):1735
1482
+ (818, 519):1736
1483
+ (293, 283):1737
1484
+ (265, 1056):1738
1485
+ (482, 741):1739
1486
+ (296, 328):1740
1487
+ (319, 284):1741
1488
+ (315, 382):1742
1489
+ (314, 941):1743
1490
+ (438, 622):1744
1491
+ (368, 261):1745
1492
+ (729, 622):1746
1493
+ (946, 517):1747
1494
+ (343, 605):1748
1495
+ (920, 327):1749
1496
+ (306, 403):1750
1497
+ (297, 1258):1751
1498
+ (271, 448):1752
1499
+ (869, 273):1753
1500
+ (260, 182):1754
1501
+ (260, 185):1755
1502
+ (279, 266):1756
1503
+ (338, 332):1757
1504
+ (298, 154):1758
1505
+ (302, 581):1759
1506
+ (1292, 1293):1760
1507
+ (288, 522):1761
1508
+ (332, 269):1762
1509
+ (271, 339):1763
1510
+ (1297, 273):1764
1511
+ (265, 284):1765
1512
+ (308, 271):1766
1513
+ (340, 261):1767
1514
+ (299, 610):1768
1515
+ (293, 1574):1769
1516
+ (420, 265):1770
1517
+ (549, 383):1771
1518
+ (470, 273):1772
1519
+ (396, 486):1773
1520
+ (625, 281):1774
1521
+ (289, 376):1775
1522
+ (275, 326):1776
1523
+ (647, 168):1777
1524
+ (370, 430):1778
1525
+ (378, 797):1779
1526
+ (341, 307):1780
1527
+ (298, 173):1781
1528
+ (465, 284):1782
1529
+ (703, 311):1783
1530
+ (309, 972):1784
1531
+ (293, 330):1785
1532
+ (285, 462):1786
1533
+ (267, 465):1787
1534
+ (370, 339):1788
1535
+ (289, 545):1789
1536
+ (275, 261):1790
1537
+ (279, 588):1791
1538
+ (317, 323):1792
1539
+ (275, 545):1793
1540
+ (792, 266):1794
1541
+ (499, 475):1795
1542
+ (301, 291):1796
1543
+ (265, 269):1797
1544
+ (300, 390):1798
1545
+ (469, 433):1799
1546
+ (286, 975):1800
1547
+ (572, 275):1801
1548
+ (287, 575):1802
1549
+ (350, 288):1803
1550
+ (315, 346):1804
1551
+ (290, 348):1805
1552
+ (265, 334):1806
1553
+ (440, 345):1807
1554
+ (296, 931):1808
1555
+ (327, 607):1809
1556
+ (546, 538):1810
1557
+ (337, 312):1811
1558
+ (647, 151):1812
1559
+ (1419, 540):1813
1560
+ (286, 1074):1814
1561
+ (338, 744):1815
1562
+ (432, 328):1816
1563
+ (307, 530):1817
1564
+ (293, 400):1818
1565
+ (346, 272):1819
1566
+ (272, 292):1820
1567
+ (354, 261):1821
1568
+ (323, 273):1822
1569
+ (288, 290):1823
1570
+ (293, 1538):1824
1571
+ (487, 273):1825
1572
+ (264, 518):1826
1573
+ (1261, 266):1827
1574
+ (1168, 320):1828
1575
+ (314, 352):1829
1576
+ (1463, 335):1830
1577
+ (391, 618):1831
1578
+ (1418, 304):1832
1579
+ (919, 1093):1833
1580
+ (349, 332):1834
1581
+ (276, 264):1835
1582
+ (270, 261):1836
1583
+ (646, 285):1837
1584
+ (1321, 520):1838
1585
+ (275, 272):1839
1586
+ (341, 553):1840
1587
+ (299, 529):1841
1588
+ (285, 483):1842
1589
+ (450, 355):1843
1590
+ (494, 261):1844
1591
+ (353, 355):1845
1592
+ (747, 311):1846
1593
+ (287, 475):1847
1594
+ (1268, 570):1848
1595
+ (286, 307):1849
1596
+ (314, 1155):1850
1597
+ (265, 287):1851
1598
+ (643, 271):1852
1599
+ (1180, 305):1853
1600
+ (408, 603):1854
1601
+ (578, 264):1855
1602
+ (271, 497):1856
1603
+ (347, 266):1857
1604
+ (306, 1438):1858
1605
+ (319, 500):1859
1606
+ (1068, 263):1860
1607
+ (308, 797):1861
1608
+ (752, 305):1862
1609
+ (385, 475):1863
1610
+ (830, 299):1864
1611
+ (756, 274):1865
1612
+ (385, 1489):1866
1613
+ (279, 287):1867
1614
+ (303, 593):1868
1615
+ (873, 418):1869
1616
+ (270, 265):1870
1617
+ (494, 273):1871
1618
+ (300, 264):1872
1619
+ (267, 575):1873
1620
+ (297, 345):1874
1621
+ (310, 269):1875
1622
+ (353, 322):1876
1623
+ (296, 285):1877
1624
+ (270, 367):1878
1625
+ (370, 1189):1879
1626
+ (605, 489):1880
1627
+ (376, 267):1881
1628
+ (535, 168):1882
1629
+ (364, 336):1883
1630
+ (315, 377):1884
1631
+ (301, 394):1885
1632
+ (593, 507):1886
1633
+ (286, 930):1887
1634
+ (289, 521):1888
1635
+ (271, 794):1889
1636
+ (319, 556):1890
1637
+ (362, 388):1891
1638
+ (657, 567):1892
1639
+ (352, 449):1893
1640
+ (477, 273):1894
1641
+ (346, 339):1895
1642
+ (346, 357):1896
1643
+ (294, 265):1897
1644
+ (666, 278):1898
1645
+ (1163, 273):1899
1646
+ (1285, 579):1900
1647
+ (287, 356):1901
1648
+ (282, 912):1902
1649
+ (343, 377):1903
1650
+ (280, 724):1904
1651
+ (293, 483):1905
1652
+ (293, 1464):1906
1653
+ (1198, 344):1907
1654
+ (1607, 611):1908
1655
+ (1367, 278):1909
1656
+ (573, 845):1910
1657
+ (274, 779):1911
1658
+ (500, 401):1912
1659
+ (272, 276):1913
1660
+ (694, 437):1914
1661
+ (546, 616):1915
1662
+ (265, 302):1916
1663
+ (270, 288):1917
1664
+ (722, 278):1918
1665
+ (270, 266):1919
1666
+ (647, 173):1920
1667
+ (420, 1227):1921
1668
+ (581, 261):1922
1669
+ (323, 270):1923
1670
+ (549, 934):1924
1671
+ (294, 312):1925
1672
+ (279, 354):1926
1673
+ (377, 462):1927
1674
+ (295, 309):1928
1675
+ (590, 480):1929
1676
+ (1432, 261):1930
1677
+ (346, 299):1931
1678
+ (262, 393):1932
1679
+ (1124, 264):1933
1680
+ (387, 313):1934
1681
+ (322, 407):1935
1682
+ (470, 352):1936
1683
+ (372, 302):1937
1684
+ (287, 933):1938
1685
+ (576, 276):1939
1686
+ (1773, 553):1940
1687
+ (325, 725):1941
1688
+ (820, 356):1942
1689
+ (445, 261):1943
1690
+ (295, 291):1944
1691
+ (647, 166):1945
1692
+ (684, 265):1946
1693
+ (270, 415):1947
1694
+ (1105, 305):1948
1695
+ (338, 275):1949
1696
+ (167, 257):1950
1697
+ (308, 369):1951
1698
+ (800, 334):1952
1699
+ (279, 270):1953
1700
+ (271, 381):1954
1701
+ (506, 1784):1955
1702
+ (331, 531):1956
1703
+ (370, 288):1957
1704
+ (521, 375):1958
1705
+ (1379, 963):1959
1706
+ (337, 345):1960
1707
+ (327, 311):1961
1708
+ (333, 151):1962
1709
+ (673, 419):1963
1710
+ (590, 382):1964
1711
+ (264, 501):1965
1712
+ (440, 263):1966
1713
+ (562, 425):1967
1714
+ (343, 323):1968
1715
+ (289, 275):1969
1716
+ (374, 367):1970
1717
+ (316, 394):1971
1718
+ (485, 267):1972
1719
+ (322, 516):1973
1720
+ (663, 267):1974
1721
+ (306, 554):1975
1722
+ (584, 372):1976
1723
+ (966, 281):1977
1724
+ (541, 274):1978
1725
+ (731, 567):1979
1726
+ (295, 603):1980
1727
+ (279, 817):1981
1728
+ (315, 827):1982
1729
+ (469, 529):1983
1730
+ (315, 492):1984
1731
+ (599, 283):1985
1732
+ (750, 515):1986
1733
+ (1075, 267):1987
1734
+ (276, 545):1988
1735
+ (669, 346):1989
1736
+ (291, 433):1990
1737
+ (343, 764):1991
1738
+ (267, 265):1992
1739
+ (275, 347):1993
1740
+ (270, 330):1994
1741
+ (153, 312):1995
1742
+ (262, 162):1996
1743
+ (1139, 753):1997
1744
+ (343, 302):1998
1745
+ (286, 335):1999
1746
+ (285, 449):2000
1747
+ (271, 273):2001
1748
+ (319, 1381):2002
1749
+ (338, 325):2003
1750
+ (265, 453):2004
1751
+ (297, 342):2005
1752
+ (319, 609):2006
1753
+ (335, 514):2007
1754
+ (276, 337):2008
1755
+ (384, 845):2009
1756
+ (314, 320):2010
1757
+ (673, 311):2011
1758
+ (1071, 915):2012
1759
+ (1665, 653):2013
1760
+ (293, 597):2014
1761
+ (1558, 275):2015
1762
+ (266, 332):2016
1763
+ (749, 335):2017
1764
+ (726, 664):2018
1765
+ (954, 560):2019
1766
+ (434, 683):2020
1767
+ (276, 1039):2021
1768
+ (315, 326):2022
1769
+ (271, 382):2023
1770
+ (596, 273):2024
1771
+ (260, 171):2025
1772
+ (481, 264):2026
1773
+ (716, 501):2027
1774
+ (272, 328):2028
1775
+ (563, 173):2029
1776
+ (301, 364):2030
1777
+ (292, 267):2031
1778
+ (343, 642):2032
1779
+ (505, 774):2033
1780
+ (341, 265):2034
1781
+ (326, 307):2035
1782
+ (294, 1028):2036
1783
+ (286, 302):2037
1784
+ (700, 269):2038
1785
+ (631, 264):2039
1786
+ (434, 1050):2040
1787
+ (656, 278):2041
1788
+ (669, 999):2042
1789
+ (552, 903):2043
1790
+ (297, 381):2044
1791
+ (911, 334):2045
1792
+ (292, 264):2046
1793
+ (389, 431):2047
1794
+ (282, 1328):2048
1795
+ (314, 1383):2049
1796
+ (982, 166):2050
1797
+ (280, 161):2051
1798
+ (314, 802):2052
1799
+ (303, 738):2053
1800
+ (578, 304):2054
1801
+ (377, 307):2055
1802
+ (879, 425):2056
1803
+ (477, 1330):2057
1804
+ (405, 381):2058
1805
+ (319, 329):2059
1806
+ (646, 492):2060
1807
+ (476, 360):2061
1808
+ (301, 1002):2062
1809
+ (618, 414):2063
1810
+ (710, 361):2064
1811
+ (969, 312):2065
1812
+ (384, 1392):2066
1813
+ (346, 294):2067
1814
+ (280, 152):2068
1815
+ (300, 270):2069
1816
+ (271, 350):2070
1817
+ (264, 480):2071
1818
+ (315, 356):2072
1819
+ (1073, 672):2073
1820
+ (279, 382):2074
1821
+ (293, 1133):2075
1822
+ (473, 278):2076
1823
+ (966, 278):2077
1824
+ (772, 895):2078
1825
+ (894, 334):2079
1826
+ (306, 1440):2080
1827
+ (505, 655):2081
1828
+ (314, 542):2082
1829
+ (695, 483):2083
1830
+ (307, 733):2084
1831
+ (316, 267):2085
1832
+ (333, 178):2086
1833
+ (295, 336):2087
1834
+ (682, 404):2088
1835
+ (634, 273):2089
1836
+ (448, 291):2090
1837
+ (613, 1214):2091
1838
+ (493, 281):2092
1839
+ (748, 320):2093
1840
+ (291, 261):2094
1841
+ (809, 271):2095
1842
+ (286, 865):2096
1843
+ (290, 424):2097
1844
+ (378, 323):2098
1845
+ (839, 284):2099
1846
+ (576, 274):2100
1847
+ (275, 382):2101
1848
+ (546, 350):2102
1849
+ (301, 1057):2103
1850
+ (289, 382):2104
1851
+ (400, 277):2105
1852
+ (288, 310):2106
1853
+ (264, 725):2107
1854
+ (292, 373):2108
1855
+ (749, 712):2109
1856
+ (924, 346):2110
1857
+ (1499, 269):2111
1858
+ (1518, 677):2112
1859
+ (338, 278):2113
1860
+ (259, 183):2114
1861
+ (275, 437):2115
1862
+ (474, 376):2116
1863
+ (349, 275):2117
1864
+ (316, 273):2118
1865
+ (795, 275):2119
1866
+ (928, 273):2120
1867
+ (270, 686):2121
1868
+ (290, 288):2122
1869
+ (360, 358):2123
1870
+ (390, 261):2124
1871
+ (343, 339):2125
1872
+ (502, 311):2126
1873
+ (1251, 522):2127
1874
+ (445, 273):2128
1875
+ (486, 591):2129
1876
+ (1754, 283):2130
1877
+ (657, 1555):2131
1878
+ (421, 336):2132
1879
+ (588, 269):2133
1880
+ (322, 655):2134
1881
+ (314, 485):2135
1882
+ (1006, 1032):2136
1883
+ (735, 364):2137
1884
+ (317, 686):2138
1885
+ (341, 1351):2139
1886
+ (349, 1652):2140
1887
+ (271, 294):2141
1888
+ (392, 464):2142
1889
+ (1492, 270):2143
1890
+ (343, 791):2144
1891
+ (395, 1039):2145
1892
+ (1912, 354):2146
1893
+ (1256, 629):2147
1894
+ (1670, 515):2148
1895
+ (1837, 1042):2149
1896
+ (722, 366):2150
1897
+ (1470, 1225):2151
1898
+ (285, 527):2152
1899
+ (824, 555):2153
1900
+ (291, 271):2154
1901
+ (995, 276):2155
1902
+ (1078, 284):2156
1903
+ (295, 339):2157
1904
+ (328, 276):2158
1905
+ (568, 1294):2159
1906
+ (1061, 1333):2160
1907
+ (286, 775):2161
1908
+ (659, 425):2162
1909
+ (772, 390):2163
1910
+ (279, 1682):2164
1911
+ (339, 261):2165
1912
+ (445, 375):2166
1913
+ (274, 412):2167
1914
+ (319, 1175):2168
1915
+ (280, 159):2169
1916
+ (275, 505):2170
1917
+ (410, 354):2171
1918
+ (617, 261):2172
1919
+ (306, 565):2173
1920
+ (327, 1081):2174
1921
+ (748, 265):2175
1922
+ (288, 365):2176
1923
+ (288, 330):2177
1924
+ (289, 433):2178
1925
+ (314, 309):2179
1926
+ (541, 1634):2180
1927
+ (1579, 366):2181
1928
+ (817, 292):2182
1929
+ (2182, 1304):2183
1930
+ (377, 419):2184
1931
+ (297, 1083):2185
1932
+ (269, 329):2186
1933
+ (301, 327):2187
1934
+ (332, 614):2188
1935
+ (303, 437):2189
1936
+ (331, 276):2190
1937
+ (878, 507):2191
1938
+ (434, 390):2192
1939
+ (690, 618):2193
1940
+ (936, 579):2194
1941
+ (279, 408):2195
1942
+ (275, 483):2196
1943
+ (729, 285):2197
1944
+ (722, 373):2198
1945
+ (1152, 414):2199
1946
+ (338, 554):2200
1947
+ (660, 269):2201
1948
+ (270, 307):2202
1949
+ (1791, 624):2203
1950
+ (411, 1260):2204
1951
+ (274, 284):2205
1952
+ (308, 617):2206
1953
+ (325, 330):2207
1954
+ (303, 703):2208
1955
+ (769, 329):2209
1956
+ (1035, 334):2210
1957
+ (264, 457):2211
1958
+ (404, 269):2212
1959
+ (514, 354):2213
1960
+ (168, 257):2214
1961
+ (297, 320):2215
1962
+ (418, 528):2216
1963
+ (647, 185):2217
1964
+ (497, 281):2218
1965
+ (270, 347):2219
1966
+ (839, 276):2220
1967
+ (459, 683):2221
1968
+ (694, 507):2222
1969
+ (271, 271):2223
1970
+ (396, 270):2224
1971
+ (502, 405):2225
1972
+ (339, 311):2226
1973
+ (385, 608):2227
1974
+ (299, 498):2228
1975
+ (308, 2116):2229
1976
+ (285, 422):2230
1977
+ (394, 667):2231
1978
+ (282, 1801):2232
1979
+ (386, 324):2233
1980
+ (1012, 273):2234
1981
+ (326, 753):2235
1982
+ (532, 708):2236
1983
+ (327, 312):2237
1984
+ (282, 1283):2238
1985
+ (391, 419):2239
1986
+ (572, 374):2240
1987
+ (272, 414):2241
1988
+ (271, 633):2242
1989
+ (385, 270):2243
1990
+ (288, 490):2244
1991
+ (1553, 362):2245
1992
+ (287, 326):2246
1993
+ (291, 950):2247
1994
+ (440, 266):2248
1995
+ (879, 449):2249
1996
+ (1310, 446):2250
1997
+ (292, 271):2251
1998
+ (392, 451):2252
1999
+ (364, 269):2253
2000
+ (340, 305):2254
2001
+ (325, 316):2255
2002
+ (1069, 273):2256
2003
+ (290, 276):2257
2004
+ (335, 285):2258
2005
+ (580, 348):2259
2006
+ (303, 827):2260
2007
+ (263, 281):2261
2008
+ (274, 334):2262
2009
+ (504, 269):2263
2010
+ (315, 536):2264
2011
+ (306, 723):2265
2012
+ (269, 652):2266
2013
+ (378, 512):2267
2014
+ (592, 334):2268
2015
+ (293, 1716):2269
2016
+ (290, 544):2270
2017
+ (286, 337):2271
2018
+ (571, 347):2272
2019
+ (937, 374):2273
2020
+ (535, 151):2274
2021
+ (293, 2016):2275
2022
+ (2142, 622):2276
2023
+ (1110, 276):2277
2024
+ (270, 410):2278
2025
+ (314, 459):2279
2026
+ (1906, 267):2280
2027
+ (477, 275):2281
2028
+ (1561, 278):2282
2029
+ (264, 330):2283
2030
+ (1564, 377):2284
2031
+ (1095, 773):2285
2032
+ (314, 462):2286
2033
+ (297, 470):2287
2034
+ (378, 312):2288
2035
+ (695, 328):2289
2036
+ (434, 271):2290
2037
+ (295, 1227):2291
2038
+ (648, 284):2292
2039
+ (292, 299):2293
2040
+ (338, 299):2294
2041
+ (285, 261):2295
2042
+ (415, 505):2296
2043
+ (346, 348):2297
2044
+ (511, 287):2298
2045
+ (1477, 330):2299
2046
+ (825, 267):2300
2047
+ (322, 272):2301
2048
+ (912, 609):2302
2049
+ (256, 139):2303
2050
+ (349, 588):2304
2051
+ (365, 585):2305
2052
+ (276, 948):2306
2053
+ (308, 514):2307
2054
+ (493, 514):2308
2055
+ (898, 292):2309
2056
+ (287, 436):2310
2057
+ (370, 320):2311
2058
+ (1265, 334):2312
2059
+ (482, 1126):2313
2060
+ (269, 365):2314
2061
+ (1629, 773):2315
2062
+ (784, 261):2316
2063
+ (306, 291):2317
2064
+ (299, 305):2318
2065
+ (173, 841):2319
2066
+ (327, 348):2320
2067
+ (406, 267):2321
2068
+ (315, 341):2322
2069
+ (389, 269):2323
2070
+ (947, 354):2324
2071
+ (298, 168):2325
2072
+ (270, 278):2326
2073
+ (271, 329):2327
2074
+ (1613, 287):2328
2075
+ (295, 437):2329
2076
+ (399, 312):2330
2077
+ (386, 261):2331
2078
+ (772, 356):2332
2079
+ (671, 261):2333
2080
+ (314, 368):2334
2081
+ (1397, 410):2335
2082
+ (438, 294):2336
2083
+ (1270, 348):2337
2084
+ (294, 323):2338
2085
+ (471, 287):2339
2086
+ (1490, 263):2340
2087
+ (459, 356):2341
2088
+ (295, 288):2342
2089
+ (1867, 360):2343
2090
+ (330, 379):2344
2091
+ (292, 325):2345
2092
+ (434, 895):2346
2093
+ (380, 271):2347
2094
+ (969, 310):2348
2095
+ (287, 311):2349
2096
+ (306, 1016):2350
2097
+ (264, 529):2351
2098
+ (280, 645):2352
2099
+ (637, 383):2353
2100
+ (872, 261):2354
2101
+ (575, 356):2355
2102
+ (1033, 276):2356
2103
+ (326, 352):2357
2104
+ (537, 693):2358
2105
+ (2093, 266):2359
2106
+ (309, 328):2360
2107
+ (327, 302):2361
2108
+ (770, 556):2362
2109
+ (408, 261):2363
2110
+ (1102, 433):2364
2111
+ (1007, 305):2365
2112
+ (293, 365):2366
2113
+ (386, 290):2367
2114
+ (346, 512):2368
2115
+ (1131, 1022):2369
2116
+ (296, 643):2370
2117
+ (1180, 266):2371
2118
+ (378, 382):2372
2119
+ (1008, 311):2373
2120
+ (364, 397):2374
2121
+ (262, 161):2375
2122
+ (264, 324):2376
2123
+ (386, 975):2377
2124
+ (293, 423):2378
2125
+ (269, 324):2379
2126
+ (290, 400):2380
2127
+ (656, 281):2381
2128
+ (603, 462):2382
2129
+ (1583, 1089):2383
2130
+ (291, 746):2384
2131
+ (299, 335):2385
2132
+ (572, 426):2386
2133
+ (1717, 766):2387
2134
+ (317, 410):2388
2135
+ (306, 1551):2389
2136
+ (638, 275):2390
2137
+ (297, 460):2391
2138
+ (1011, 272):2392
2139
+ (292, 270):2393
2140
+ (893, 462):2394
2141
+ (338, 1443):2395
2142
+ (275, 1263):2396
2143
+ (385, 533):2397
2144
+ (340, 610):2398
2145
+ (361, 270):2399
2146
+ (347, 882):2400
2147
+ (380, 275):2401
2148
+ (282, 587):2402
2149
+ (288, 371):2403
2150
+ (343, 556):2404
2151
+ (1953, 310):2405
2152
+ (307, 291):2406
2153
+ (953, 757):2407
2154
+ (279, 274):2408
2155
+ (270, 281):2409
2156
+ (937, 2246):2410
2157
+ (1051, 1210):2411
2158
+ (729, 341):2412
2159
+ (1246, 292):2413
2160
+ (289, 307):2414
2161
+ (274, 498):2415
2162
+ (286, 359):2416
2163
+ (476, 264):2417
2164
+ (301, 701):2418
2165
+ (293, 1323):2419
2166
+ (376, 442):2420
2167
+ (332, 335):2421
2168
+ (405, 269):2422
2169
+ (300, 464):2423
2170
+ (1260, 517):2424
2171
+ (1173, 273):2425
2172
+ (269, 337):2426
2173
+ (910, 269):2427
2174
+ (386, 2039):2428
2175
+ (349, 601):2429
2176
+ (521, 273):2430
2177
+ (1299, 287):2431
2178
+ (279, 302):2432
2179
+ (698, 1684):2433
2180
+ (726, 299):2434
2181
+ (784, 265):2435
2182
+ (301, 361):2436
2183
+ (341, 538):2437
2184
+ (309, 417):2438
2185
+ (283, 394):2439
2186
+ (294, 376):2440
2187
+ (285, 324):2441
2188
+ (376, 311):2442
2189
+ (322, 376):2443
2190
+ (396, 274):2444
2191
+ (275, 678):2445
2192
+ (306, 588):2446
2193
+ (275, 278):2447
2194
+ (343, 1896):2448
2195
+ (275, 334):2449
2196
+ (1334, 464):2450
2197
+ (404, 527):2451
2198
+ (353, 1910):2452
2199
+ (295, 1307):2453
2200
+ (646, 1746):2454
2201
+ (400, 708):2455
2202
+ (496, 297):2456
2203
+ (422, 294):2457
2204
+ (320, 1562):2458
2205
+ (319, 261):2459
2206
+ (566, 261):2460
2207
+ (434, 292):2461
2208
+ (295, 624):2462
2209
+ (264, 930):2463
2210
+ (274, 320):2464
2211
+ (492, 267):2465
2212
+ (1427, 366):2466
2213
+ (301, 346):2467
2214
+ (364, 270):2468
2215
+ (1756, 438):2469
2216
+ (291, 460):2470
2217
+ (1571, 728):2471
2218
+ (299, 551):2472
2219
+ (1757, 526):2473
2220
+ (450, 269):2474
2221
+ (364, 513):2475
2222
+ (314, 597):2476
2223
+ (264, 365):2477
2224
+ (648, 334):2478
2225
+ (388, 672):2479
2226
+ (319, 337):2480
2227
+ (1174, 354):2481
2228
+ (396, 341):2482
2229
+ (456, 490):2483
2230
+ (2038, 412):2484
2231
+ (936, 576):2485
2232
+ (295, 265):2486
2233
+ (765, 312):2487
2234
+ (1099, 1759):2488
2235
+ (325, 454):2489
2236
+ (257, 169):2490
2237
+ (1928, 736):2491
2238
+ (350, 273):2492
2239
+ (286, 807):2493
2240
+ (1093, 273):2494
2241
+ (286, 276):2495
2242
+ (347, 479):2496
2243
+ (648, 329):2497
2244
+ (301, 1202):2498
2245
+ (924, 470):2499
2246
+ (514, 310):2500
2247
+ (295, 403):2501
2248
+ (486, 269):2502
2249
+ (275, 425):2503
2250
+ (279, 486):2504
2251
+ (309, 292):2505
2252
+ (270, 361):2506
2253
+ (279, 285):2507
2254
+ (541, 294):2508
2255
+ (269, 448):2509
2256
+ (290, 553):2510
2257
+ (440, 283):2511
2258
+ (438, 341):2512
2259
+ (595, 284):2513
2260
+ (663, 503):2514
2261
+ (1575, 311):2515
2262
+ (824, 299):2516
2263
+ (820, 683):2517
2264
+ (638, 273):2518
2265
+ (372, 269):2519
2266
+ (485, 284):2520
2267
+ (303, 307):2521
2268
+ (415, 407):2522
2269
+ (659, 449):2523
2270
+ (327, 452):2524
2271
+ (2075, 288):2525
2272
+ (1402, 267):2526
2273
+ (267, 970):2527
2274
+ (288, 402):2528
2275
+ (380, 294):2529
2276
+ (301, 562):2530
2277
+ (286, 465):2531
2278
+ (396, 1616):2532
2279
+ (403, 725):2533
2280
+ (735, 290):2534
2281
+ (941, 949):2535
2282
+ (915, 277):2536
2283
+ (286, 270):2537
2284
+ (343, 1703):2538
2285
+ (279, 508):2539
2286
+ (269, 264):2540
2287
+ (1033, 284):2541
2288
+ (1405, 1958):2542
2289
+ (401, 921):2543
2290
+ (317, 337):2544
2291
+ (809, 273):2545
2292
+ (301, 309):2546
2293
+ (824, 842):2547
2294
+ (292, 261):2548
2295
+ (306, 269):2549
2296
+ (1792, 479):2550
2297
+ (376, 509):2551
2298
+ (320, 771):2552
2299
+ (340, 551):2553
2300
+ (2095, 439):2554
2301
+ (863, 297):2555
2302
+ (288, 316):2556
2303
+ (282, 316):2557
2304
+ (299, 283):2558
2305
+ (595, 276):2559
2306
+ (2088, 294):2560
2307
+ (822, 273):2561
2308
+ (292, 623):2562
2309
+ (328, 290):2563
2310
+ (406, 273):2564
2311
+ (306, 1798):2565
2312
+ (524, 316):2566
2313
+ (1373, 375):2567
2314
+ (443, 152):2568
2315
+ (628, 273):2569
2316
+ (302, 352):2570
2317
+ (271, 265):2571
2318
+ (1139, 404):2572
2319
+ (563, 152):2573
2320
+ (1078, 276):2574
2321
+ (1230, 714):2575
2322
+ (392, 1130):2576
2323
+ (858, 273):2577
2324
+ (460, 478):2578
2325
+ (836, 273):2579
2326
+ (326, 448):2580
2327
+ (453, 273):2581
2328
+ (780, 269):2582
2329
+ (391, 621):2583
2330
+ (479, 591):2584
2331
+ (391, 270):2585
2332
+ (1788, 692):2586
2333
+ (325, 913):2587
2334
+ (267, 327):2588
2335
+ (386, 881):2589
2336
+ (485, 285):2590
2337
+ (291, 294):2591
2338
+ (314, 372):2592
2339
+ (1146, 331):2593
2340
+ (295, 428):2594
2341
+ (338, 436):2595
2342
+ (2204, 267):2596
2343
+ (332, 796):2597
2344
+ (1158, 751):2598
2345
+ (471, 261):2599
2346
+ (395, 403):2600
2347
+ (309, 311):2601
2348
+ (385, 1104):2602
2349
+ (900, 526):2603
2350
+ (290, 497):2604
2351
+ (1065, 1016):2605
2352
+ (275, 736):2606
2353
+ (314, 270):2607
2354
+ (757, 707):2608
2355
+ (659, 1893):2609
2356
+ (305, 294):2610
2357
+ (2125, 294):2611
2358
+ (270, 413):2612
2359
+ (513, 701):2613
2360
+ (1387, 874):2614
2361
+ (613, 1536):2615
2362
+ (517, 264):2616
2363
+ (1599, 269):2617
2364
+ (297, 462):2618
2365
+ (288, 427):2619
2366
+ (400, 265):2620
2367
+ (428, 273):2621
2368
+ (309, 326):2622
2369
+ (396, 291):2623
2370
+ (319, 385):2624
2371
+ (319, 328):2625
2372
+ (262, 1995):2626
2373
+ (2626, 528):2627
2374
+ (381, 287):2628
2375
+ (432, 281):2629
2376
+ (267, 360):2630
2377
+ (828, 394):2631
2378
+ (477, 424):2632
2379
+ (471, 458):2633
2380
+ (538, 348):2634
2381
+ (613, 472):2635
2382
+ (380, 274):2636
2383
+ (471, 1156):2637
2384
+ (319, 423):2638
2385
+ (806, 273):2639
2386
+ (317, 1108):2640
2387
+ (314, 508):2641
2388
+ (300, 337):2642
2389
+ (505, 407):2643
2390
+ (482, 414):2644
2391
+ (435, 1286):2645
2392
+ (302, 528):2646
2393
+ (325, 310):2647
2394
+ (343, 410):2648
2395
+ (351, 183):2649
2396
+ (538, 1820):2650
2397
+ (315, 707):2651
2398
+ (440, 460):2652
2399
+ (408, 348):2653
2400
+ (385, 329):2654
2401
+ (411, 1134):2655
2402
+ (1192, 553):2656
2403
+ (578, 285):2657
2404
+ (330, 273):2658
2405
+ (306, 332):2659
2406
+ (308, 405):2660
2407
+ (399, 283):2661
2408
+ (493, 358):2662
2409
+ (267, 284):2663
2410
+ (311, 519):2664
2411
+ (395, 326):2665
2412
+ (271, 336):2666
2413
+ (264, 421):2667
2414
+ (341, 336):2668
2415
+ (283, 501):2669
2416
+ (335, 718):2670
2417
+ (378, 571):2671
2418
+ (314, 771):2672
2419
+ (1604, 1249):2673
2420
+ (346, 288):2674
2421
+ (282, 1025):2675
2422
+ (2675, 475):2676
2423
+ (314, 989):2677
2424
+ (1253, 2019):2678
2425
+ (264, 1560):2679
2426
+ (482, 548):2680
2427
+ (945, 542):2681
2428
+ (450, 621):2682
2429
+ (568, 468):2683
2430
+ (1335, 288):2684
2431
+ (295, 718):2685
2432
+ (834, 278):2686
2433
+ (943, 276):2687
2434
+ (1850, 591):2688
2435
+ (1511, 1878):2689
2436
+ (411, 1562):2690
2437
+ (303, 446):2691
2438
+ (959, 753):2692
2439
+ (1043, 273):2693
2440
+ (471, 263):2694
2441
+ (392, 307):2695
2442
+ (698, 274):2696
2443
+ (256, 155):2697
2444
+ (310, 526):2698
2445
+ (297, 299):2699
2446
+ (465, 341):2700
2447
+ (282, 1922):2701
2448
+ (1426, 326):2702
2449
+ (510, 339):2703
2450
+ (1264, 375):2704
2451
+ (317, 504):2705
2452
+ (550, 320):2706
2453
+ (338, 406):2707
2454
+ (295, 264):2708
2455
+ (1331, 283):2709
2456
+ (1230, 689):2710
2457
+ (1619, 290):2711
2458
+ (1029, 261):2712
2459
+ (922, 269):2713
2460
+ (1377, 167):2714
2461
+ (428, 284):2715
2462
+ (328, 381):2716
2463
+ (404, 797):2717
2464
+ (291, 529):2718
2465
+ (309, 622):2719
2466
+ (396, 292):2720
2467
+ (746, 311):2721
2468
+ (322, 336):2722
2469
+ (900, 1231):2723
2470
+ (669, 672):2724
2471
+ (516, 390):2725
2472
+ (346, 719):2726
2473
+ (1064, 284):2727
2474
+ (1686, 359):2728
2475
+ (289, 787):2729
2476
+ (1526, 278):2730
2477
+ (1523, 457):2731
2478
+ (674, 299):2732
2479
+ (2307, 1854):2733
2480
+ (306, 401):2734
2481
+ (377, 361):2735
2482
+ (315, 935):2736
2483
+ (264, 413):2737
2484
+ (265, 457):2738
2485
+ (302, 273):2739
2486
+ (286, 1937):2740
2487
+ (290, 686):2741
2488
+ (494, 287):2742
2489
+ (1673, 287):2743
2490
+ (769, 273):2744
2491
+ (272, 374):2745
2492
+ (349, 643):2746
2493
+ (257, 2319):2747
2494
+ (395, 983):2748
2495
+ (282, 294):2749
2496
+ (271, 500):2750
2497
+ (948, 336):2751
2498
+ (690, 458):2752
2499
+ (1580, 1681):2753
2500
+ (492, 273):2754
2501
+ (294, 273):2755
2502
+ (644, 334):2756
2503
+ (1393, 285):2757
2504
+ (626, 2067):2758
2505
+ (294, 1864):2759
2506
+ (315, 1274):2760
2507
+ (485, 283):2761
2508
+ (538, 1081):2762
2509
+ (271, 291):2763
2510
+ (411, 322):2764
2511
+ (593, 356):2765
2512
+ (325, 269):2766
2513
+ (339, 324):2767
2514
+ (703, 269):2768
2515
+ (288, 264):2769
2516
+ (578, 2073):2770
2517
+ (301, 1399):2771
2518
+ (420, 302):2772
2519
+ (265, 328):2773
2520
+ (1638, 375):2774
2521
+ (851, 417):2775
2522
+ (264, 275):2776
2523
+ (1390, 1783):2777
2524
+ (306, 1435):2778
2525
+ (1526, 281):2779
2526
+ (2534, 574):2780
2527
+ (1485, 498):2781
2528
+ (271, 621):2782
2529
+ (286, 545):2783
2530
+ (1161, 294):2784
2531
+ (467, 463):2785
2532
+ (435, 270):2786
2533
+ (329, 593):2787
2534
+ (288, 329):2788
2535
+ (319, 273):2789
2536
+ (1871, 291):2790
2537
+ (510, 267):2791
2538
+ (326, 895):2792
2539
+ (616, 430):2793
2540
+ (1112, 1353):2794
2541
+ (2543, 292):2795
2542
+ (418, 1354):2796
2543
+ (276, 327):2797
2544
+ (279, 322):2798
2545
+ (514, 589):2799
2546
+ (511, 334):2800
2547
+ (460, 311):2801
2548
+ (289, 475):2802
2549
+ (449, 312):2803
2550
+ (758, 697):2804
2551
+ (262, 129):2805
2552
+ (448, 526):2806
2553
+ (301, 2302):2807
2554
+ (300, 1109):2808
2555
+ (826, 305):2809
2556
+ (330, 394):2810
2557
+ (499, 986):2811
2558
+ (270, 324):2812
2559
+ (628, 330):2813
2560
+ (659, 397):2814
2561
+ (285, 1133):2815
2562
+ (287, 1298):2816
2563
+ (595, 329):2817
2564
+ (418, 1406):2818
2565
+ (275, 537):2819
2566
+ (158, 388):2820
2567
+ (485, 263):2821
2568
+ (666, 281):2822
2569
+ (385, 297):2823
2570
+ (1635, 311):2824
2571
+ (270, 693):2825
2572
+ (872, 276):2826
2573
+ (1451, 383):2827
2574
+ (276, 320):2828
2575
+ (257, 171):2829
2576
+ (275, 498):2830
2577
+ (353, 2578):2831
2578
+ (820, 536):2832
2579
+ (1251, 676):2833
2580
+ (271, 651):2834
2581
+ (591, 320):2835
2582
+ (293, 860):2836
2583
+ (275, 753):2837
2584
+ (343, 436):2838
2585
+ (391, 470):2839
2586
+ (264, 373):2840
2587
+ (818, 288):2841
2588
+ (633, 273):2842
2589
+ (285, 366):2843
2590
+ (671, 273):2844
2591
+ (275, 421):2845
2592
+ (557, 307):2846
2593
+ (415, 516):2847
2594
+ (319, 362):2848
2595
+ (307, 271):2849
2596
+ (265, 2051):2850
2597
+ (946, 323):2851
2598
+ (2851, 291):2852
2599
+ (365, 617):2853
2600
+ (319, 472):2854
2601
+ (843, 596):2855
2602
+ (288, 299):2856
2603
+ (301, 276):2857
2604
+ (346, 596):2858
2605
+ (259, 138):2859
2606
+ (1598, 522):2860
2607
+ (951, 1136):2861
2608
+ (340, 284):2862
2609
+ (411, 1811):2863
2610
+ (279, 474):2864
2611
+ (1725, 702):2865
2612
+ (1197, 374):2866
2613
+ (346, 270):2867
2614
+ (847, 292):2868
2615
+ (301, 415):2869
2616
+ (322, 265):2870
2617
+ (291, 591):2871
2618
+ (721, 273):2872
2619
+ (265, 261):2873
2620
+ (282, 2047):2874
2621
+ (1453, 414):2875
2622
+ (275, 376):2876
2623
+ (435, 500):2877
2624
+ (856, 274):2878
2625
+ (305, 274):2879
2626
+ (1729, 356):2880
2627
+ (325, 439):2881
2628
+ (467, 339):2882
2629
+ (392, 721):2883
2630
+ (558, 278):2884
2631
+ (264, 352):2885
2632
+ (346, 702):2886
2633
+ (590, 292):2887
2634
+ (547, 288):2888
2635
+ (271, 316):2889
2636
+ (1090, 2130):2890
2637
+ (271, 297):2891
2638
+ (819, 2068):2892
2639
+ (755, 292):2893
2640
+ (538, 354):2894
2641
+ (276, 281):2895
2642
+ (1804, 460):2896
2643
+ (492, 299):2897
2644
+ (314, 294):2898
2645
+ (301, 310):2899
2646
+ (415, 275):2900
2647
+ (298, 149):2901
2648
+ (292, 624):2902
2649
+ (767, 263):2903
2650
+ (1019, 261):2904
2651
+ (1416, 261):2905
2652
+ (1165, 310):2906
2653
+ (740, 284):2907
2654
+ (293, 374):2908
2655
+ (285, 807):2909
2656
+ (800, 278):2910
2657
+ (301, 723):2911
2658
+ (647, 172):2912
2659
+ (282, 1083):2913
2660
+ (306, 460):2914
2661
+ (322, 418):2915
2662
+ (279, 576):2916
2663
+ (274, 265):2917
2664
+ (748, 327):2918
2665
+ (303, 1150):2919
2666
+ (384, 2058):2920
2667
+ (422, 274):2921
2668
+ (340, 312):2922
2669
+ (291, 589):2923
2670
+ (317, 833):2924
2671
+ (2649, 1009):2925
2672
+ (532, 448):2926
2673
+ (577, 394):2927
2674
+ (691, 261):2928
2675
+ (1038, 654):2929
2676
+ (423, 672):2930
2677
+ (1734, 361):2931
2678
+ (325, 423):2932
2679
+ (387, 487):2933
2680
+ (421, 261):2934
2681
+ (409, 292):2935
2682
+ (341, 376):2936
2683
+ (319, 288):2937
2684
+ (343, 290):2938
2685
+ (691, 276):2939
2686
+ (415, 721):2940
2687
+ (674, 633):2941
2688
+ (297, 583):2942
2689
+ (1137, 336):2943
2690
+ (293, 466):2944
2691
+ (362, 1564):2945
2692
+ (292, 366):2946
2693
+ (1041, 312):2947
2694
+ (2014, 2272):2948
2695
+ (297, 821):2949
2696
+ (2668, 1249):2950
2697
+ (1090, 313):2951
2698
+ (1327, 500):2952
2699
+ (322, 688):2953
2700
+ (332, 548):2954
2701
+ (635, 746):2955
2702
+ (347, 519):2956
2703
+ (275, 737):2957
2704
+ (1513, 276):2958
2705
+ (1092, 334):2959
2706
+ (552, 720):2960
2707
+ (322, 478):2961
2708
+ (301, 1023):2962
2709
+ (473, 835):2963
2710
+ (353, 1398):2964
2711
+ (2964, 545):2965
2712
+ (612, 261):2966
2713
+ (1193, 278):2967
2714
+ (282, 1122):2968
2715
+ (293, 437):2969
2716
+ (2969, 307):2970
2717
+ (2970, 2129):2971
2718
+ (380, 406):2972
2719
+ (296, 2684):2973
2720
+ (471, 288):2974
2721
+ (742, 468):2975
2722
+ (1747, 341):2976
2723
+ (1747, 1362):2977
2724
+ (982, 151):2978
2725
+ (338, 448):2979
2726
+ (1748, 1369):2980
2727
+ (303, 1914):2981
2728
+ (325, 305):2982
2729
+ (293, 329):2983
2730
+ (795, 276):2984
2731
+ (1146, 553):2985
2732
+ (442, 530):2986
2733
+ (270, 285):2987
2734
+ (391, 992):2988
2735
+ (341, 271):2989
2736
+ (271, 868):2990
2737
+ (487, 572):2991
2738
+ (657, 520):2992
2739
+ (322, 347):2993
2740
+ (323, 554):2994
2741
+ (1058, 2464):2995
2742
+ (289, 1226):2996
2743
+ (1257, 525):2997
2744
+ (601, 326):2998
2745
+ (690, 287):2999
2746
+ (395, 291):3000
2747
+ (1760, 273):3001
2748
+ (517, 297):3002
2749
+ (893, 1207):3003
2750
+ (478, 352):3004
2751
+ (282, 1296):3005
2752
+ (1062, 266):3006
2753
+ (322, 405):3007
2754
+ (863, 398):3008
2755
+ (302, 299):3009
2756
+ (293, 596):3010
2757
+ (595, 359):3011
2758
+ (660, 1927):3012
2759
+ (755, 417):3013
2760
+ (274, 366):3014
2761
+ (2488, 273):3015
2762
+ (340, 348):3016
2763
+ (328, 334):3017
2764
+ (1380, 2166):3018
2765
+ (320, 981):3019
2766
+ (269, 484):3020
2767
+ (299, 359):3021
2768
+ (271, 1225):3022
2769
+ (1271, 608):3023
2770
+ (470, 357):3024
2771
+ (326, 337):3025
2772
+ (617, 267):3026
2773
+ (983, 272):3027
2774
+ (306, 605):3028
2775
+ (269, 692):3029
2776
+ (578, 360):3030
2777
+ (713, 2172):3031
2778
+ (1521, 533):3032
2779
+ (1302, 334):3033
2780
+ (343, 773):3034
2781
+ (1053, 359):3035
2782
+ (894, 413):3036
2783
+ (276, 790):3037
2784
+ (178, 322):3038
2785
+ (1129, 719):3039
2786
+ (349, 617):3040
2787
+ (1531, 284):3041
2788
+ (1485, 509):3042
2789
+ (1633, 360):3043
2790
+ (326, 580):3044
2791
+ (412, 271):3045
2792
+ (2757, 287):3046
2793
+ (640, 334):3047
2794
+ (582, 330):3048
2795
+ (286, 324):3049
2796
+ (769, 276):3050
2797
+ (303, 721):3051
2798
+ (1676, 1001):3052
2799
+ (769, 330):3053
2800
+ (710, 379):3054
2801
+ (384, 299):3055
2802
+ (613, 508):3056
2803
+ (2770, 2188):3057
2804
+ (380, 608):3058
2805
+ (286, 265):3059
2806
+ (257, 1950):3060
2807
+ (288, 374):3061
2808
+ (2344, 462):3062
2809
+ (467, 1537):3063
2810
+ (438, 270):3064
2811
+ (301, 323):3065
2812
+ (648, 273):3066
2813
+ (295, 1639):3067
2814
+ (370, 292):3068
2815
+ (481, 452):3069
2816
+ (657, 276):3070
2817
+ (894, 373):3071
2818
+ (1865, 305):3072
2819
+ (340, 433):3073
2820
+ (317, 521):3074
2821
+ (543, 565):3075
2822
+ (492, 290):3076
2823
+ (353, 2353):3077
2824
+ (1221, 287):3078
2825
+ (349, 439):3079
2826
+ (293, 261):3080
2827
+ (1033, 261):3081
2828
+ (293, 271):3082
2829
+ (369, 283):3083
2830
+ (270, 291):3084
2831
+ (730, 288):3085
2832
+ (2546, 464):3086
2833
+ (639, 388):3087
2834
+ (301, 1709):3088
2835
+ (378, 605):3089
2836
+ (834, 264):3090
2837
+ (524, 274):3091
2838
+ (314, 342):3092
2839
+ (1794, 360):3093
2840
+ (873, 422):3094
2841
+ (552, 273):3095
2842
+ (289, 1588):3096
2843
+ (589, 273):3097
2844
+ (549, 512):3098
2845
+ (285, 967):3099
2846
+ (435, 292):3100
2847
+ (299, 468):3101
2848
+ (382, 264):3102
2849
+ (319, 264):3103
2850
+ (613, 1956):3104
2851
+ (2557, 263):3105
2852
+ (572, 449):3106
2853
+ (471, 276):3107
2854
+ (272, 302):3108
2855
+ (376, 498):3109
2856
+ (1413, 274):3110
2857
+ (1270, 316):3111
2858
+ (310, 383):3112
2859
+ (1315, 1162):3113
2860
+ (292, 721):3114
2861
+ (629, 341):3115
2862
+ (566, 267):3116
2863
+ (756, 276):3117
2864
+ (541, 265):3118
2865
+ (481, 291):3119
2866
+ (380, 651):3120
2867
+ (303, 382):3121
2868
+ (290, 364):3122
2869
+ (378, 265):3123
2870
+ (376, 269):3124
2871
+ (563, 151):3125
2872
+ (1277, 329):3126
2873
+ (919, 1929):3127
2874
+ (2102, 1408):3128
2875
+ (275, 310):3129
2876
+ (1065, 1440):3130
2877
+ (776, 394):3131
2878
+ (401, 512):3132
2879
+ (1349, 339):3133
2880
+ (1407, 292):3134
2881
+ (327, 717):3135
2882
+ (290, 383):3136
2883
+ (303, 581):3137
2884
+ (361, 266):3138
2885
+ (1150, 736):3139
2886
+ (274, 344):3140
2887
+ (298, 172):3141
2888
+ (1546, 269):3142
2889
+ (349, 360):3143
2890
+ (291, 709):3144
2891
+ (1651, 273):3145
2892
+ (303, 2382):3146
2893
+ (310, 273):3147
2894
+ (1010, 1790):3148
2895
+ (349, 717):3149
2896
+ (2109, 526):3150
2897
+ (420, 291):3151
2898
+ (663, 329):3152
2899
+ (566, 276):3153
2900
+ (1165, 1296):3154
2901
+ (712, 335):3155
2902
+ (1140, 261):3156
2903
+ (397, 372):3157
2904
+ (341, 267):3158
2905
+ (1337, 1455):3159
2906
+ (319, 1371):3160
2907
+ (926, 273):3161
2908
+ (1312, 1225):3162
2909
+ (332, 365):3163
2910
+ (386, 439):3164
2911
+ (575, 360):3165
2912
+ (292, 265):3166
2913
+ (282, 565):3167
2914
+ (1095, 1721):3168
2915
+ (1007, 261):3169
2916
+ (287, 1350):3170
2917
+ (1179, 419):3171
2918
+ (823, 263):3172
2919
+ (502, 299):3173
2920
+ (265, 2100):3174
2921
+ (840, 337):3175
2922
+ (307, 276):3176
2923
+ (1154, 297):3177
2924
+ (2780, 273):3178
2925
+ (856, 451):3179
2926
+ (1496, 741):3180
2927
+ (894, 457):3181
2928
+ (275, 978):3182
2929
+ (538, 311):3183
2930
+ (1072, 425):3184
2931
+ (411, 981):3185
2932
+ (767, 377):3186
2933
+ (265, 509):3187
2934
+ (400, 381):3188
2935
+ (1474, 475):3189
2936
+ (435, 608):3190
2937
+ (364, 425):3191
2938
+ (289, 442):3192
2939
+ (604, 348):3193
2940
+ (286, 522):3194
2941
+ (640, 270):3195
2942
+ (355, 287):3196
2943
+ (331, 269):3197
2944
+ (640, 284):3198
2945
+ (499, 273):3199
2946
+ (326, 404):3200
2947
+ (327, 328):3201
2948
+ (395, 837):3202
2949
+ (287, 465):3203
2950
+ (294, 540):3204
2951
+ (288, 963):3205
2952
+ (377, 336):3206
2953
+ (1232, 1084):3207
2954
+ (1816, 567):3208
2955
+ (279, 275):3209
2956
+ (477, 283):3210
2957
+ (335, 304):3211
2958
+ (784, 501):3212
2959
+ (303, 350):3213
2960
+ (1720, 522):3214
2961
+ (297, 408):3215
2962
+ (295, 401):3216
2963
+ (446, 273):3217
2964
+ (310, 331):3218
2965
+ (871, 273):3219
2966
+ (421, 277):3220
2967
+ (982, 156):3221
2968
+ (819, 266):3222
2969
+ (1506, 399):3223
2970
+ (1932, 594):3224
2971
+ (2203, 305):3225
2972
+ (572, 671):3226
2973
+ (2892, 354):3227
2974
+ (486, 597):3228
2975
+ (1247, 272):3229
2976
+ (279, 930):3230
2977
+ (264, 865):3231
2978
+ (538, 717):3232
2979
+ (550, 715):3233
2980
+ (306, 601):3234
2981
+ (481, 390):3235
2982
+ (1508, 445):3236
2983
+ (418, 359):3237
2984
+ (2616, 347):3238
2985
+ (303, 895):3239
2986
+ (795, 459):3240
2987
+ (265, 271):3241
2988
+ (492, 276):3242
2989
+ (730, 653):3243
2990
+ (636, 618):3244
2991
+ (974, 323):3245
2992
+ (294, 989):3246
2993
+ (285, 320):3247
2994
+ (541, 297):3248
2995
+ (302, 276):3249
2996
+ (285, 267):3250
2997
+ (851, 290):3251
2998
+ (849, 1291):3252
2999
+ (269, 503):3253
3000
+ (582, 276):3254
3001
+ (315, 1722):3255
3002
+ (1234, 1472):3256
3003
+ (920, 815):3257
3004
+ (470, 284):3258
3005
+ (499, 330):3259
3006
+ (288, 360):3260
3007
+ (1302, 433):3261
3008
+ (322, 462):3262
3009
+ (438, 1539):3263
3010
+ (288, 305):3264
3011
+ (804, 273):3265
3012
+ (302, 265):3266
3013
+ (911, 344):3267
3014
+ (511, 344):3268
3015
+ (265, 786):3269
3016
+ (898, 271):3270
3017
+ (308, 1371):3271
3018
+ (739, 281):3272
3019
+ (386, 329):3273
3020
+ (1388, 277):3274
3021
+ (289, 292):3275
3022
+ (301, 284):3276
3023
+ (306, 290):3277
3024
+ (1184, 273):3278
3025
+ (314, 443):3279
3026
+ (3279, 150):3280
3027
+ (279, 334):3281
3028
+ (537, 464):3282
3029
+ (1337, 1237):3283
3030
+ (909, 273):3284
3031
+ (2635, 537):3285
3032
+ (1292, 847):3286
3033
+ (3286, 588):3287
3034
+ (1064, 273):3288
3035
+ (270, 275):3289
3036
+ (513, 407):3290
3037
+ (271, 299):3291
3038
+ (341, 1210):3292
3039
+ (740, 273):3293
3040
+ (1737, 2235):3294
3041
+ (740, 2433):3295
3042
+ (563, 168):3296
3043
+ (639, 318):3297
3044
+ (942, 853):3298
3045
+ (289, 410):3299
3046
+ (304, 263):3300
3047
+ (752, 302):3301
3048
+ (299, 330):3302
3049
+ (613, 266):3303
3050
+ (396, 1441):3304
3051
+ (670, 273):3305
3052
+ (264, 350):3306
3053
+ (381, 261):3307
3054
+ (952, 2397):3308
3055
+ (386, 579):3309
3056
+ (392, 934):3310
3057
+ (308, 771):3311
3058
+ (384, 1174):3312
3059
+ (845, 527):3313
3060
+ (783, 498):3314
3061
+ (514, 290):3315
3062
+ (549, 339):3316
3063
+ (295, 311):3317
3064
+ (505, 701):3318
3065
+ (502, 297):3319
3066
+ (319, 589):3320
3067
+ (264, 2013):3321
3068
+ (602, 305):3322
3069
+ (306, 2320):3323
3070
+ (315, 316):3324
3071
+ (1038, 455):3325
3072
+ (1048, 305):3326
3073
+ (292, 288):3327
3074
+ (1165, 264):3328
3075
+ (365, 539):3329
3076
+ (2275, 1880):3330
3077
+ (386, 359):3331
3078
+ (266, 373):3332
3079
+ (449, 2669):3333
3080
+ (704, 1050):3334
3081
+ (2143, 791):3335
3082
+ (664, 676):3336
3083
+ (1058, 2954):3337
3084
+ (2117, 305):3338
3085
+ (275, 413):3339
3086
+ (1170, 269):3340
3087
+ (308, 2670):3341
3088
+ (290, 284):3342
3089
+ (456, 356):3343
3090
+ (265, 463):3344
3091
+ (524, 323):3345
3092
+ (288, 337):3346
3093
+ (1232, 354):3347
3094
+ (682, 538):3348
3095
+ (3348, 425):3349
3096
+ (1288, 330):3350
3097
+ (392, 335):3351
3098
+ (349, 261):3352
3099
+ (282, 480):3353
3100
+ (1832, 1005):3354
3101
+ (1166, 720):3355
3102
+ (314, 350):3356
3103
+ (863, 1039):3357
3104
+ (299, 440):3358
3105
+ (805, 402):3359
3106
+ (2247, 332):3360
3107
+ (317, 868):3361
3108
+ (1447, 1249):3362
3109
+ (279, 2973):3363
3110
+ (349, 2850):3364
3111
+ (265, 359):3365
3112
+ (386, 1636):3366
3113
+ (1059, 693):3367
3114
+ (590, 609):3368
3115
+ (275, 676):3369
3116
+ (1913, 294):3370
3117
+ (552, 267):3371
3118
+ (2147, 329):3372
3119
+ (589, 519):3373
3120
+ (269, 455):3374
3121
+ (420, 288):3375
3122
+ (448, 371):3376
3123
+ (312, 421):3377
3124
+ (274, 410):3378
3125
+ (343, 618):3379
3126
+ (270, 287):3380
3127
+ (307, 1755):3381
3128
+ (289, 2028):3382
3129
+ (1042, 334):3383
3130
+ (315, 1330):3384
3131
+ (1058, 294):3385
3132
+ (275, 450):3386
3133
+ (314, 1923):3387
3134
+ (795, 963):3388
3135
+ (353, 876):3389
3136
+ (295, 862):3390
3137
+ (964, 273):3391
3138
+ (306, 1472):3392
3139
+ (412, 436):3393
3140
+ (355, 267):3394
3141
+ (257, 145):3395
3142
+ (290, 261):3396
3143
+ (729, 514):3397
3144
+ (289, 736):3398
3145
+ (305, 525):3399
3146
+ (2714, 436):3400
3147
+ (495, 278):3401
3148
+ (275, 451):3402
3149
+ (1062, 283):3403
3150
+ (731, 276):3404
3151
+ (288, 278):3405
3152
+ (408, 433):3406
3153
+ (535, 185):3407
3154
+ (712, 261):3408
3155
+ (439, 304):3409
3156
+ (354, 263):3410
3157
+ (308, 815):3411
3158
+ (301, 320):3412
3159
+ (265, 579):3413
3160
+ (291, 565):3414
3161
+ (418, 320):3415
3162
+ (276, 294):3416
3163
+ (937, 746):3417
3164
+ (647, 156):3418
3165
+ (1103, 408):3419
3166
+ (271, 624):3420
3167
+ (1932, 149):3421
3168
+ (386, 454):3422
3169
+ (632, 266):3423
3170
+ (273, 1209):3424
3171
+ (275, 464):3425
3172
+ (275, 405):3426
3173
+ (1041, 277):3427
3174
+ (265, 413):3428
3175
+ (679, 372):3429
3176
+ (470, 261):3430
3177
+ (379, 1437):3431
3178
+ (648, 278):3432
3179
+ (481, 311):3433
3180
+ (299, 644):3434
3181
+ (315, 2174):3435
3182
+ (1272, 269):3436
3183
+ (356, 368):3437
3184
+ (1439, 267):3438
3185
+ (607, 276):3439
3186
+ (619, 337):3440
3187
+ (904, 261):3441
3188
+ (276, 575):3442
3189
+ (308, 589):3443
3190
+ (303, 337):3444
3191
+ (288, 1259):3445
3192
+ (288, 437):3446
3193
+ (1105, 261):3447
3194
+ (1390, 285):3448
3195
+ (306, 779):3449
3196
+ (524, 297):3450
3197
+ (1344, 458):3451
3198
+ (264, 316):3452
3199
+ (272, 712):3453
3200
+ (340, 529):3454
3201
+ (353, 607):3455
3202
+ (332, 266):3456
3203
+ (274, 2759):3457
3204
+ (440, 329):3458
3205
+ (794, 278):3459
3206
+ (341, 725):3460
3207
+ (274, 357):3461
3208
+ (883, 287):3462
3209
+ (997, 448):3463
3210
+ (315, 337):3464
3211
+ (471, 618):3465
3212
+ (336, 261):3466
3213
+ (274, 433):3467
3214
+ (288, 270):3468
3215
+ (1583, 462):3469
3216
+ (659, 1437):3470
3217
+ (314, 326):3471
3218
+ (969, 512):3472
3219
+ (852, 401):3473
3220
+ (315, 683):3474
3221
+ (659, 678):3475
3222
+ (315, 287):3476
3223
+ (343, 903):3477
3224
+ (285, 365):3478
3225
+ (675, 267):3479
3226
+ (659, 671):3480
3227
+ (428, 261):3481
3228
+ (401, 400):3482
3229
+ (326, 1786):3483
3230
+ (381, 576):3484
3231
+ (673, 312):3485
3232
+ (322, 475):3486
3233
+ (326, 299):3487
3234
+ (270, 394):3488
3235
+ (456, 1259):3489
3236
+ (384, 347):3490
3237
+ (322, 1279):3491
3238
+ (1542, 564):3492
3239
+ (306, 766):3493
3240
+ (418, 352):3494
3241
+ (275, 373):3495
3242
+ (315, 1873):3496
3243
+ (297, 1163):3497
3244
+ (285, 373):3498
3245
+ (293, 916):3499
3246
+ (338, 374):3500
3247
+ (718, 830):3501
3248
+ (279, 2357):3502
3249
+ (300, 533):3503
3250
+ (301, 344):3504
3251
+ (648, 463):3505
3252
+ (289, 1004):3506
3253
+ (415, 1114):3507
3254
+ (326, 264):3508
3255
+ (311, 431):3509
3256
+ (378, 1006):3510
3257
+ (750, 889):3511
3258
+ (271, 719):3512
3259
+ (991, 273):3513
3260
+ (301, 340):3514
3261
+ (482, 1835):3515
3262
+ (669, 654):3516
3263
+ (370, 759):3517
3264
+ (353, 412):3518
3265
+ (301, 972):3519
3266
+ (699, 278):3520
3267
+ (954, 269):3521
3268
+ (338, 515):3522
3269
+ (524, 1647):3523
3270
+ (775, 329):3524
3271
+ (1117, 970):3525
3272
+ (3113, 3114):3526
3273
+ (301, 2481):3527
3274
+ (517, 2564):3528
3275
+ (257, 2214):3529
3276
+ (604, 283):3530
3277
+ (270, 457):3531
3278
+ (265, 797):3532
3279
+ (282, 1001):3533
3280
+ (767, 419):3534
3281
+ (499, 288):3535
3282
+ (1501, 728):3536
3283
+ (1316, 273):3537
3284
+ (297, 307):3538
3285
+ (314, 397):3539
3286
+ (275, 1637):3540
3287
+ (289, 501):3541
3288
+ (343, 570):3542
3289
+ (411, 1056):3543
3290
+ (1432, 324):3544
3291
+ (841, 278):3545
3292
+ (271, 608):3546
3293
+ (299, 329):3547
3294
+ (1715, 689):3548
3295
+ (264, 487):3549
3296
+ (691, 329):3550
3297
+ (274, 291):3551
3298
+ (1297, 267):3552
3299
+ (948, 1650):3553
3300
+ (391, 853):3554
3301
+ (275, 2111):3555
3302
+ (997, 581):3556
3303
+ (1157, 357):3557
3304
+ (378, 1802):3558
3305
+ (518, 273):3559
3306
+ (1622, 273):3560
3307
+ (2584, 548):3561
3308
+ (386, 271):3562
3309
+ (1102, 261):3563
3310
+ (421, 273):3564
3311
+ (319, 807):3565
3312
+ (660, 2226):3566
3313
+ (1193, 281):3567
3314
+ (691, 267):3568
3315
+ (740, 855):3569
3316
+ (636, 855):3570
3317
+ (380, 500):3571
3318
+ (2225, 1089):3572
3319
+ (1640, 336):3573
3320
+ (1100, 261):3574
3321
+ (352, 736):3575
3322
+ (289, 483):3576
3323
+ (385, 345):3577
3324
+ (563, 172):3578
3325
+ (299, 2063):3579
3326
+ (1809, 342):3580
3327
+ (322, 288):3581
3328
+ (456, 642):3582
3329
+ (1217, 324):3583
3330
+ (1061, 717):3584
3331
+ (941, 269):3585
3332
+ (271, 694):3586
3333
+ (1888, 526):3587
3334
+ (370, 1382):3588
3335
+ (400, 489):3589
3336
+ (1217, 649):3590
3337
+ (409, 607):3591
3338
+ (1810, 1081):3592
3339
+ (456, 290):3593
3340
+ (1532, 451):3594
3341
+ (603, 267):3595
3342
+ (1597, 261):3596
3343
+ (271, 261):3597
3344
+ (421, 413):3598
3345
+ (339, 466):3599
3346
+ (1427, 373):3600
3347
+ (755, 1657):3601
3348
+ (270, 603):3602
3349
+ (510, 276):3603
3350
+ (1085, 267):3604
3351
+ (834, 360):3605
3352
+ (378, 1226):3606
3353
+ (415, 2400):3607
3354
+ (295, 1618):3608
3355
+ (1044, 487):3609
3356
+ (319, 310):3610
3357
+ (271, 364):3611
3358
+ (1095, 367):3612
3359
+ (1504, 273):3613
3360
+ (1991, 273):3614
3361
+ (1405, 328):3615
3362
+ (295, 369):3616
3363
+ (878, 356):3617
3364
+ (286, 290):3618
3365
+ (1067, 276):3619
3366
+ (663, 458):3620
3367
+ (350, 2880):3621
3368
+ (681, 323):3622
3369
+ (339, 302):3623
3370
+ (353, 505):3624
3371
+ (726, 555):3625
3372
+ (444, 278):3626
3373
+ (1110, 441):3627
3374
+ (914, 276):3628
3375
+ (2060, 621):3629
3376
+ (297, 346):3630
3377
+ (1506, 1392):3631
3378
+ (486, 949):3632
3379
+ (285, 284):3633
3380
+ (305, 533):3634
3381
+ (310, 424):3635
3382
+ (303, 448):3636
3383
+ (767, 269):3637
3384
+ (364, 274):3638
3385
+ (535, 167):3639
3386
+ (317, 637):3640
3387
+ (911, 551):3641
3388
+ (471, 324):3642
3389
+ (297, 2719):3643
3390
+ (256, 136):3644
3391
+ (343, 416):3645
3392
+ (1466, 278):3646
3393
+ (275, 281):3647
3394
+ (521, 272):3648
3395
+ (1998, 408):3649
3396
+ (967, 273):3650
3397
+ (873, 559):3651
3398
+ (410, 452):3652
3399
+ (2611, 413):3653
3400
+ (295, 545):3654
3401
+ (1352, 335):3655
3402
+ (965, 320):3656
3403
+ (274, 509):3657
3404
+ (547, 465):3658
3405
+ (471, 835):3659
3406
+ (282, 445):3660
3407
+ (492, 801):3661
3408
+ (283, 347):3662
3409
+ (282, 705):3663
3410
+ (271, 1304):3664
3411
+ (576, 273):3665
3412
+ (287, 328):3666
3413
+ (396, 1738):3667
3414
+ (293, 267):3668
3415
+ (343, 350):3669
3416
+ (778, 1821):3670
3417
+ (343, 1162):3671
3418
+ (343, 361):3672
3419
+ (421, 361):3673
3420
+ (378, 675):3674
3421
+ (414, 273):3675
3422
+ (291, 719):3676
3423
+ (669, 300):3677
3424
+ (704, 334):3678
3425
+ (625, 278):3679
3426
+ (1248, 284):3680
3427
+ (338, 553):3681
3428
+ (282, 365):3682
3429
+ (295, 581):3683
3430
+ (267, 403):3684
3431
+ (303, 267):3685
3432
+ (840, 327):3686
3433
+ (949, 375):3687
3434
+ (301, 738):3688
3435
+ (295, 2008):3689
3436
+ (1113, 288):3690
3437
+ (286, 1899):3691
3438
+ (856, 325):3692
3439
+ (482, 1787):3693
3440
+ (287, 707):3694
3441
+ (340, 276):3695
3442
+ (837, 307):3696
3443
+ (481, 1160):3697
3444
+ (274, 307):3698
3445
+ (299, 458):3699
3446
+ (2313, 360):3700
3447
+ (520, 264):3701
3448
+ (707, 273):3702
3449
+ (732, 415):3703
3450
+ (340, 366):3704
3451
+ (364, 352):3705
3452
+ (563, 156):3706
3453
+ (914, 273):3707
3454
+ (580, 512):3708
3455
+ (341, 451):3709
3456
+ (421, 2310):3710
3457
+ (832, 275):3711
3458
+ (282, 1091):3712
3459
+ (291, 847):3713
3460
+ (275, 291):3714
3461
+ (293, 357):3715
3462
+ (2836, 288):3716
3463
+ (279, 344):3717
3464
+ (1072, 449):3718
3465
+ (875, 1536):3719
3466
+ (546, 505):3720
3467
+ (456, 437):3721
3468
+ (1428, 287):3722
3469
+ (2435, 335):3723
3470
+ (410, 515):3724
3471
+ (292, 448):3725
3472
+ (426, 269):3726
3473
+ (1344, 484):3727
3474
+ (1161, 357):3728
3475
+ (1194, 273):3729
3476
+ (276, 345):3730
3477
+ (394, 273):3731
3478
+ (274, 382):3732
3479
+ (314, 633):3733
3480
+ (343, 522):3734
3481
+ (352, 269):3735
3482
+ (541, 288):3736
3483
+ (1206, 812):3737
3484
+ (340, 373):3738
3485
+ (300, 360):3739
3486
+ (438, 1023):3740
3487
+ (276, 328):3741
3488
+ (2442, 312):3742
3489
+ (282, 337):3743
3490
+ (554, 488):3744
3491
+ (315, 510):3745
3492
+ (274, 309):3746
3493
+ (382, 265):3747
3494
+ (766, 519):3748
3495
+ (2078, 414):3749
3496
+ (285, 601):3750
3497
+ (1884, 336):3751
3498
+ (1496, 374):3752
3499
+ (2665, 2266):3753
3500
+ (660, 2650):3754
3501
+ (465, 344):3755
3502
+ (315, 410):3756
3503
+ (927, 273):3757
3504
+ (275, 1034):3758
3505
+ (293, 532):3759
3506
+ (399, 261):3760
3507
+ (1420, 327):3761
3508
+ (1810, 573):3762
3509
+ (293, 449):3763
3510
+ (589, 431):3764
3511
+ (288, 423):3765
3512
+ (3330, 276):3766
3513
+ (674, 355):3767
3514
+ (2017, 311):3768
3515
+ (265, 339):3769
3516
+ (952, 334):3770
3517
+ (275, 389):3771
3518
+ (326, 368):3772
3519
+ (392, 1351):3773
3520
+ (674, 364):3774
3521
+ (957, 540):3775
3522
+ (1409, 652):3776
3523
+ (269, 611):3777
3524
+ (267, 341):3778
3525
+ (266, 652):3779
3526
+ (279, 305):3780
3527
+ (256, 160):3781
3528
+ (1817, 408):3782
3529
+ (322, 774):3783
3530
+ (1600, 753):3784
3531
+ (1254, 422):3785
3532
+ (499, 1008):3786
3533
+ (301, 574):3787
3534
+ (777, 1557):3788
3535
+ (2012, 281):3789
3536
+ (1106, 284):3790
3537
+ (349, 381):3791
3538
+ (282, 405):3792
3539
+ (816, 2136):3793
3540
+ (1058, 692):3794
3541
+ (2961, 905):3795
3542
+ (1012, 276):3796
3543
+ (664, 522):3797
3544
+ (2114, 790):3798
3545
+ (3351, 717):3799
3546
+ (297, 1456):3800
3547
+ (2119, 579):3801
3548
+ (961, 988):3802
3549
+ (2679, 284):3803
3550
+ (3353, 290):3804
3551
+ (437, 269):3805
3552
+ (531, 267):3806
3553
+ (364, 1830):3807
3554
+ (1131, 425):3808
3555
+ (415, 1118):3809
3556
+ (295, 744):3810
3557
+ (325, 337):3811
3558
+ (293, 2456):3812
3559
+ (1238, 605):3813
3560
+ (314, 874):3814
3561
+ (2006, 261):3815
3562
+ (294, 387):3816
3563
+ (392, 446):3817
3564
+ (308, 274):3818
3565
+ (2974, 1025):3819
3566
+ (844, 381):3820
3567
+ (742, 359):3821
3568
+ (310, 1449):3822
3569
+ (392, 3362):3823
3570
+ (270, 1314):3824
3571
+ (742, 458):3825
3572
+ (937, 347):3826
3573
+ (285, 448):3827
3574
+ (290, 365):3828
3575
+ (326, 1547):3829
3576
+ (315, 1015):3830
3577
+ (523, 981):3831
3578
+ (2978, 453):3832
3579
+ (405, 424):3833
3580
+ (1679, 3368):3834
3581
+ (271, 1669):3835
3582
+ (553, 356):3836
3583
+ (1041, 273):3837
3584
+ (1915, 430):3838
3585
+ (890, 1370):3839
3586
+ (297, 1328):3840
3587
+ (264, 1263):3841
3588
+ (2995, 559):3842
3589
+ (1044, 261):3843
3590
+ (1170, 287):3844
3591
+ (1013, 2152):3845
3592
+ (267, 522):3846
3593
+ (271, 408):3847
3594
+ (1614, 1839):3848
3595
+ (3385, 421):3849
3596
+ (911, 433):3850
3597
+ (1615, 608):3851
3598
+ (1077, 285):3852
3599
+ (370, 269):3853
3600
+ (2155, 371):3854
3601
+ (289, 297):3855
3602
+ (317, 446):3856
3603
+ (1474, 288):3857
3604
+ (946, 3393):3858
3605
+ (1152, 287):3859
3606
+ (303, 323):3860
3607
+ (467, 267):3861
3608
+ (1758, 388):3862
3609
+ (349, 705):3863
3610
+ (539, 609):3864
3611
+ (648, 344):3865
3612
+ (294, 597):3866
3613
+ (546, 352):3867
3614
+ (322, 686):3868
3615
+ (965, 1618):3869
3616
+ (381, 267):3870
3617
+ (2717, 364):3871
3618
+ (980, 329):3872
3619
+ (858, 3012):3873
3620
+ (1172, 371):3874
3621
+ (1372, 339):3875
3622
+ (3411, 287):3876
3623
+ (326, 284):3877
3624
+ (1042, 344):3878
3625
+ (333, 172):3879
3626
+ (1232, 329):3880
3627
+ (691, 284):3881
3628
+ (264, 533):3882
3629
+ (696, 276):3883
3630
+ (288, 1381):3884
3631
+ (328, 320):3885
3632
+ (285, 460):3886
3633
+ (3886, 377):3887
3634
+ (382, 307):3888
3635
+ (291, 332):3889
3636
+ (759, 2306):3890
3637
+ (290, 352):3891
3638
+ (1467, 507):3892
3639
+ (1058, 264):3893
3640
+ (3893, 2505):3894
3641
+ (2702, 464):3895
3642
+ (1685, 273):3896
3643
+ (380, 345):3897
3644
+ (438, 275):3898
3645
+ (336, 373):3899
3646
+ (392, 1210):3900
3647
+ (964, 330):3901
3648
+ (1690, 3434):3902
3649
+ (2057, 655):3903
3650
+ (271, 341):3904
3651
+ (982, 173):3905
3652
+ (331, 352):3906
3653
+ (320, 334):3907
3654
+ (1076, 276):3908
3655
+ (682, 1857):3909
3656
+ (584, 2745):3910
3657
+ (1425, 284):3911
3658
+ (315, 1043):3912
3659
+ (405, 462):3913
3660
+ (1631, 273):3914
3661
+ (301, 322):3915
3662
+ (1389, 261):3916
3663
+ (1103, 559):3917
3664
+ (271, 1295):3918
3665
+ (2324, 287):3919
3666
+ (749, 575):3920
3667
+ (566, 273):3921
3668
+ (288, 520):3922
3669
+ (1106, 375):3923
3670
+ (308, 2183):3924
3671
+ (283, 305):3925
3672
+ (315, 310):3926
3673
+ (269, 490):3927
3674
+ (1775, 531):3928
3675
+ (899, 3457):3929
3676
+ (384, 562):3930
3677
+ (421, 302):3931
3678
+ (279, 2761):3932
3679
+ (1534, 273):3933
3680
+ (282, 361):3934
3681
+ (405, 277):3935
3682
+ (644, 261):3936
3683
+ (380, 1015):3937
3684
+ (1398, 407):3938
3685
+ (690, 359):3939
3686
+ (471, 284):3940
3687
+ (770, 371):3941
3688
+ (523, 312):3942
3689
+ (299, 509):3943
3690
+ (499, 1159):3944
3691
+ (1466, 281):3945
3692
+ (1160, 1584):3946
3693
+ (286, 484):3947
3694
+ (265, 1077):3948
3695
+ (384, 516):3949
3696
+ (410, 689):3950
3697
+ (1750, 273):3951
3698
+ (369, 512):3952
3699
+ (599, 261):3953
3700
+ (938, 269):3954
3701
+ (641, 567):3955
3702
+ (2175, 365):3956
3703
+ (1086, 454):3957
3704
+ (3482, 3483):3958
3705
+ (326, 350):3959
3706
+ (568, 359):3960
3707
+ (1278, 2784):3961
3708
+ (1086, 264):3962
3709
+ (857, 330):3963
3710
+ (412, 421):3964
3711
+ (384, 505):3965
3712
+ (341, 273):3966
3713
+ (331, 521):3967
3714
+ (1268, 737):3968
3715
+ (299, 419):3969
3716
+ (471, 264):3970
3717
+ (341, 450):3971
3718
+ (635, 559):3972
3719
+ (386, 503):3973
3720
+ (1173, 463):3974
3721
+ (271, 516):3975
3722
+ (690, 791):3976
3723
+ (294, 521):3977
3724
+ (1086, 515):3978
3725
+ (1257, 1493):3979
3726
+ (307, 519):3980
3727
+ (311, 363):3981
3728
+ (326, 1265):3982
3729
+ (292, 554):3983
3730
+ (2795, 509):3984
3731
+ (434, 452):3985
3732
+ (353, 1705):3986
3733
+ (1221, 559):3987
3734
+ (1439, 273):3988
3735
+ (270, 812):3989
3736
+ (3082, 320):3990
3737
+ (349, 689):3991
3738
+ (275, 1226):3992
3739
+ (1234, 709):3993
3740
+ (1160, 1406):3994
3741
+ (829, 267):3995
3742
+ (385, 986):3996
3743
+ (481, 274):3997
3744
+ (349, 454):3998
3745
+ (752, 461):3999
3746
+ (485, 261):4000
3747
+ (879, 678):4001
3748
+ (1528, 413):4002
3749
+ (997, 861):4003
3750
+ (337, 664):4004
3751
+ (843, 433):4005
3752
+ (295, 1369):4006
3753
+ (293, 485):4007
3754
+ (269, 360):4008
3755
+ (617, 273):4009
3756
+ (275, 517):4010
3757
+ (1222, 264):4011
3758
+ (264, 1639):4012
3759
+ (289, 310):4013
3760
+ (287, 759):4014
3761
+ (285, 468):4015
3762
+ (274, 985):4016
3763
+ (898, 267):4017
3764
+ (615, 1755):4018
3765
+ (376, 352):4019
3766
+ (797, 472):4020
3767
+ (660, 442):4021
3768
+ (322, 1967):4022
3769
+ (378, 811):4023
3770
+ (1465, 702):4024
3771
+ (290, 479):4025
3772
+ (262, 2820):4026
3773
+ (409, 757):4027
3774
+ (628, 284):4028
3775
+ (669, 422):4029
3776
+ (2372, 801):4030
3777
+ (331, 733):4031
3778
+ (411, 2183):4032
3779
+ (276, 500):4033
3780
+ (1502, 746):4034
3781
+ (2538, 498):4035
3782
+ (783, 509):4036
3783
+ (331, 327):4037
3784
+ (296, 341):4038
3785
+ (1590, 433):4039
3786
+ (405, 310):4040
3787
+ (2573, 589):4041
3788
+ (264, 1971):4042
3789
+ (1414, 269):4043
3790
+ (297, 2352):4044
3791
+ (459, 267):4045
3792
+ (274, 390):4046
3793
+ (859, 281):4047
3794
+ (274, 528):4048
3795
+ (285, 1716):4049
3796
+ (596, 1084):4050
3797
+ (1752, 556):4051
3798
+ (546, 421):4052
3799
+ (1624, 274):4053
3800
+ (409, 1063):4054
3801
+ (1101, 273):4055
3802
+ (544, 267):4056
3803
+ (380, 853):4057
3804
+ (1587, 1950):4058
3805
+ (309, 515):4059
3806
+ (738, 357):4060
3807
+ (1108, 498):4061
3808
+ (306, 847):4062
3809
+ (552, 463):4063
3810
+ (282, 381):4064
3811
+ (636, 1194):4065
3812
+ (271, 337):4066
3813
+ (1600, 404):4067
3814
+ (1317, 689):4068
3815
+ (481, 294):4069
3816
+ (384, 511):4070
3817
+ (505, 1002):4071
3818
+ (310, 276):4072
3819
+ (805, 266):4073
3820
+ (352, 425):4074
3821
+ (286, 452):4075
3822
+ (690, 1952):4076
3823
+ (546, 414):4077
3824
+ (1418, 345):4078
3825
+ (535, 156):4079
3826
+ (992, 276):4080
3827
+ (291, 276):4081
3828
+ (576, 511):4082
3829
+ (704, 453):4083
3830
+ (285, 309):4084
3831
+ (1080, 688):4085
3832
+ (1168, 1947):4086
3833
+ (1715, 714):4087
3834
+ (1610, 361):4088
3835
+ (699, 281):4089
3836
+ (477, 373):4090
3837
+ (259, 144):4091
3838
+ (740, 329):4092
3839
+ (332, 271):4093
3840
+ (2582, 2861):4094
3841
+ (291, 335):4095
3842
+ (748, 949):4096
3843
+ (720, 276):4097
3844
+ (477, 1458):4098
3845
+ (473, 299):4099
3846
+ (264, 1087):4100
3847
+ (1049, 3180):4101
3848
+ (271, 335):4102
3849
+ (494, 2598):4103
3850
+ (323, 540):4104
3851
+ (314, 860):4105
3852
+ (1429, 273):4106
3853
+ (1301, 757):4107
3854
+ (338, 418):4108
3855
+ (731, 609):4109
3856
+ (282, 1016):4110
3857
+ (314, 830):4111
3858
+ (282, 3069):4112
3859
+ (961, 373):4113
3860
+ (340, 603):4114
3861
+ (1388, 272):4115
3862
+ (453, 261):4116
3863
+ (593, 490):4117
3864
+ (456, 1370):4118
3865
+ (2296, 637):4119
3866
+ (2405, 1052):4120
3867
+ (716, 829):4121
3868
+ (901, 581):4122
3869
+ (270, 509):4123
3870
+ (549, 571):4124
3871
+ (1554, 355):4125
3872
+ (352, 281):4126
3873
+ (1731, 273):4127
3874
+ (900, 261):4128
3875
+ (396, 265):4129
3876
+ (329, 273):4130
3877
+ (322, 537):4131
3878
+ (411, 514):4132
3879
+ (1011, 483):4133
3880
+ (330, 357):4134
3881
+ (340, 361):4135
3882
+ (267, 297):4136
3883
+ (275, 1030):4137
3884
+ (568, 786):4138
3885
+ (378, 346):4139
3886
+ (545, 265):4140
3887
+ (840, 575):4141
3888
+ (276, 983):4142
3889
+ (271, 1662):4143
3890
+ (2410, 276):4144
3891
+ (1818, 299):4145
3892
+ (764, 935):4146
3893
+ (568, 973):4147
3894
+ (368, 311):4148
3895
+ (317, 475):4149
3896
+ (3221, 587):4150
3897
+ (315, 811):4151
3898
+ (481, 670):4152
3899
+ (295, 1070):4153
3900
+ (385, 500):4154
3901
+ (2163, 1363):4155
3902
+ (673, 450):4156
3903
+ (282, 401):4157
3904
+ (323, 346):4158
3905
+ (294, 2801):4159
3906
+ (338, 360):4160
3907
+ (2893, 390):4161
3908
+ (582, 273):4162
3909
+ (687, 327):4163
3910
+ (423, 340):4164
3911
+ (1569, 273):4165
3912
+ (442, 2237):4166
3913
+ (629, 2412):4167
3914
+ (636, 791):4168
3915
+ (378, 1501):4169
3916
+ (328, 413):4170
3917
+ (384, 2627):4171
3918
+ (306, 408):4172
3919
+ (4172, 379):4173
3920
+ (639, 376):4174
3921
+ (384, 1272):4175
3922
+ (274, 1350):4176
3923
+ (307, 479):4177
3924
+ (513, 637):4178
3925
+ (270, 407):4179
3926
+ (333, 152):4180
3927
+ (849, 2895):4181
3928
+ (320, 970):4182
3929
+ (292, 269):4183
3930
+ (1252, 741):4184
3931
+ (1235, 1175):4185
3932
+ (286, 492):4186
3933
+ (863, 1250):4187
3934
+ (721, 267):4188
3935
+ (1054, 461):4189
3936
+ (297, 276):4190
3937
+ (349, 1996):4191
3938
+ (748, 643):4192
3939
+ (497, 278):4193
3940
+ (374, 283):4194
3941
+ (290, 399):4195
3942
+ (1579, 373):4196
3943
+ (1535, 344):4197
3944
+ (377, 1207):4198
3945
+ (1624, 448):4199
3946
+ (315, 3236):4200
3947
+ (427, 267):4201
3948
+ (341, 405):4202
3949
+ (384, 1927):4203
3950
+ (2087, 517):4204
3951
+ (997, 265):4205
3952
+ (638, 330):4206
3953
+ (339, 330):4207
3954
+ (1125, 649):4208
3955
+ (2258, 274):4209
3956
+ (2219, 357):4210
3957
+ (423, 265):4211
3958
+ (338, 300):4212
3959
+ (1194, 276):4213
3960
+ (304, 712):4214
3961
+ (302, 272):4215
3962
+ (1134, 320):4216
3963
+ (1540, 857):4217
3964
+ (285, 339):4218
3965
+ (1238, 906):4219
3966
+ (301, 412):4220
3967
+ (1776, 284):4221
3968
+ (308, 387):4222
3969
+ (4222, 312):4223
3970
+ (280, 393):4224
3971
+ (890, 490):4225
3972
+ (878, 490):4226
3973
+ (279, 1537):4227
3974
+ (330, 312):4228
3975
+ (287, 366):4229
3976
+ (1945, 357):4230
3977
+ (513, 267):4231
3978
+ (307, 318):4232
3979
+ (314, 2370):4233
3980
+ (1988, 382):4234
3981
+ (1112, 299):4235
3982
+ (265, 427):4236
3983
+ (292, 555):4237
3984
+ (1692, 1229):4238
3985
+ (626, 347):4239
3986
+ (374, 276):4240
3987
+ (293, 1776):4241
3988
+ (378, 1449):4242
3989
+ (2641, 1063):4243
3990
+ (328, 283):4244
3991
+ (1829, 261):4245
3992
+ (401, 487):4246
3993
+ (395, 322):4247
3994
+ (301, 3282):4248
3995
+ (1403, 273):4249
3996
+ (1549, 1935):4250
3997
+ (434, 2284):4251
3998
+ (370, 972):4252
3999
+ (1029, 511):4253
4000
+ (2187, 265):4254
4001
+ (275, 297):4255
4002
+ (279, 294):4256
4003
+ (328, 272):4257
4004
+ (314, 1864):4258
4005
+ (350, 496):4259
4006
+ (279, 3292):4260
4007
+ (382, 840):4261
4008
+ (288, 955):4262
4009
+ (523, 650):4263
4010
+ (926, 324):4264
4011
+ (2031, 439):4265
4012
+ (1012, 261):4266
4013
+ (636, 284):4267
4014
+ (765, 371):4268
4015
+ (1073, 999):4269
4016
+ (384, 305):4270
4017
+ (286, 503):4271
4018
+ (504, 400):4272
4019
+ (275, 418):4273
4020
+ (1038, 346):4274
4021
+ (327, 515):4275
4022
+ (820, 490):4276
4023
+ (1035, 781):4277
4024
+ (378, 1384):4278
4025
+ (451, 273):4279
4026
+ (269, 290):4280
4027
+ (1497, 702):4281
4028
+ (2811, 512):4282
4029
+ (262, 630):4283
4030
+ (276, 1209):4284
4031
+ (293, 721):4285
4032
+ (449, 284):4286
4033
+ (323, 1721):4287
4034
+ (2137, 537):4288
4035
+ (265, 515):4289
4036
+ (294, 515):4290
4037
+ (451, 324):4291
4038
+ (360, 334):4292
4039
+ (282, 759):4293
4040
+ (1915, 1964):4294
4041
+ (568, 504):4295
4042
+ (378, 275):4296
4043
+ (384, 3115):4297
4044
+ (314, 299):4298
4045
+ (1819, 401):4299
4046
+ (1149, 1276):4300
4047
+ (370, 3315):4301
4048
+ (936, 273):4302
4049
+ (1165, 448):4303
4050
+ (309, 291):4304
4051
+ (541, 292):4305
4052
+ (406, 261):4306
4053
+ (286, 470):4307
4054
+ (3316, 428):4308
4055
+ (270, 734):4309
4056
+ (327, 331):4310
4057
+ (1190, 345):4311
4058
+ (286, 1656):4312
4059
+ (338, 267):4313
4060
+ (629, 323):4314
4061
+ (256, 138):4315
4062
+ (403, 375):4316
4063
+ (3215, 365):4317
4064
+ (323, 261):4318
4065
+ (710, 701):4319
4066
+ (595, 273):4320
4067
+ (469, 348):4321
4068
+ (287, 291):4322
4069
+ (566, 290):4323
4070
+ (3270, 2945):4324
4071
+ (1887, 330):4325
4072
+ (364, 276):4326
4073
+ (2805, 1556):4327
4074
+ (1183, 360):4328
4075
+ (566, 364):4329
4076
+ (285, 2118):4330
4077
+ (271, 1104):4331
4078
+ (345, 288):4332
4079
+ (288, 556):4333
4080
+ (286, 376):4334
4081
+ (317, 437):4335
4082
+ (465, 334):4336
4083
+ (524, 521):4337
4084
+ (276, 590):4338
4085
+ (644, 263):4339
4086
+ (1663, 281):4340
4087
+ (405, 390):4341
4088
+ (1743, 302):4342
4089
+ (449, 273):4343
4090
+ (314, 445):4344
4091
+ (320, 1077):4345
4092
+ (295, 320):4346
4093
+ (952, 3329):4347
4094
+ (341, 934):4348
4095
+ (646, 312):4349
4096
+ (265, 324):4350
4097
+ (1061, 271):4351
4098
+ (777, 608):4352
4099
+ (1113, 430):4353
4100
+ (493, 3722):4354
4101
+ (1778, 548):4355
4102
+ (674, 864):4356
4103
+ (315, 465):4357
4104
+ (267, 461):4358
4105
+ (1366, 267):4359
4106
+ (384, 366):4360
4107
+ (1367, 281):4361
4108
+ (435, 1287):4362
4109
+ (314, 980):4363
4110
+ (341, 501):4364
4111
+ (271, 751):4365
4112
+ (1332, 614):4366
4113
+ (343, 3245):4367
4114
+ (378, 273):4368
4115
+ (323, 652):4369
4116
+ (291, 339):4370
4117
+ (270, 339):4371
4118
+ (568, 311):4372
4119
+ (317, 327):4373
4120
+ (1278, 331):4374
4121
+ (294, 1155):4375
4122
+ (613, 1048):4376
4123
+ (265, 274):4377
4124
+ (1663, 278):4378
4125
+ (355, 271):4379
4126
+ (319, 533):4380
4127
+ (354, 3779):4381
4128
+ (282, 3781):4382
4129
+ (755, 881):4383
4130
+ (448, 556):4384
4131
+ (764, 390):4385
4132
+ (487, 479):4386
4133
+ (456, 359):4387
4134
+ (275, 468):4388
4135
+ (1797, 346):4389
4136
+ (915, 489):4390
4137
+ (295, 1819):4391
4138
+ (270, 1023):4392
4139
+ (438, 3085):4393
4140
+ (362, 287):4394
4141
+ (290, 401):4395
4142
+ (1877, 580):4396
4143
+ (552, 510):4397
4144
+ (473, 281):4398
4145
+ (279, 346):4399
4146
+ (819, 1473):4400
4147
+ (490, 278):4401
4148
+ (353, 474):4402
4149
+ (524, 1533):4403
4150
+ (265, 448):4404
4151
+ (4404, 1096):4405
4152
+ (3349, 458):4406
4153
+ (628, 340):4407
4154
+ (477, 989):4408
4155
+ (2454, 284):4409
4156
+ (815, 1746):4410
4157
+ (733, 299):4411
4158
+ (314, 271):4412
4159
+ (794, 281):4413
4160
+ (271, 1015):4414
4161
+ (2968, 381):4415
4162
+ (1334, 270):4416
4163
+ (456, 332):4417
4164
+ (1793, 3802):4418
4165
+ (317, 2642):4419
4166
+ (293, 3806):4420
4167
+ (328, 335):4421
4168
+ (327, 335):4422
4169
+ (378, 270):4423
4170
+ (1463, 364):4424
4171
+ (349, 1781):4425
4172
+ (820, 1593):4426
4173
+ (918, 273):4427
4174
+ (1010, 2021):4428
4175
+ (2429, 675):4429
4176
+ (730, 548):4430
4177
+ (1702, 322):4431
4178
+ (892, 281):4432
4179
+ (2681, 284):4433
4180
+ (905, 365):4434
4181
+ (1723, 267):4435
4182
+ (2358, 1216):4436
4183
+ (1035, 413):4437
4184
+ (1399, 374):4438
4185
+ (421, 678):4439
4186
+ (1589, 278):4440
4187
+ (2252, 2146):4441
4188
+ (1217, 261):4442
4189
+ (698, 521):4443
4190
+ (470, 276):4444
4191
+ (2437, 452):4445
4192
+ (296, 332):4446
4193
+ (2017, 1318):4447
4194
+ (293, 754):4448
4195
+ (2549, 1114):4449
4196
+ (790, 418):4450
4197
+ (4450, 571):4451
4198
+ (279, 3822):4452
4199
+ (319, 1498):4453
4200
+ (848, 448):4454
4201
+ (2748, 310):4455
4202
+ (1287, 273):4456
4203
+ (915, 342):4457
4204
+ (1044, 1825):4458
4205
+ (2281, 1745):4459
4206
+ (3709, 2146):4460
4207
+ (2688, 287):4461
4208
+ (513, 655):4462
4209
+ (435, 629):4463
4210
+ (984, 327):4464
4211
+ (392, 2653):4465
4212
+ (331, 560):4466
4213
+ (1532, 527):4467
4214
+ (370, 332):4468
4215
+ (317, 672):4469
4216
+ (2671, 607):4470
4217
+ (2451, 867):4471
4218
+ (742, 548):4472
4219
+ (411, 3833):4473
4220
+ (646, 2910):4474
4221
+ (264, 717):4475
4222
+ (673, 1186):4476
4223
+ (1743, 305):4477
4224
+ (301, 812):4478
4225
+ (482, 876):4479
4226
+ (644, 344):4480
4227
+ (1221, 263):4481
4228
+ (274, 387):4482
4229
+ (772, 475):4483
4230
+ (753, 281):4484
4231
+ (735, 323):4485
4232
+ (328, 480):4486
4233
+ (301, 2024):4487
4234
+ (286, 898):4488
4235
+ (1202, 261):4489
4236
+ (1289, 670):4490
4237
+ (275, 352):4491
4238
+ (1119, 311):4492
4239
+ (1514, 371):4493
4240
+ (2691, 944):4494
4241
+ (1838, 1918):4495
4242
+ (349, 866):4496
4243
+ (270, 305):4497
4244
+ (547, 994):4498
4245
+ (695, 931):4499
4246
+ (267, 342):4500
4247
+ (716, 2998):4501
4248
+ (270, 327):4502
4249
+ (396, 1223):4503
4250
+ (327, 276):4504
4251
+ (1518, 838):4505
4252
+ (1569, 329):4506
4253
+ (401, 369):4507
4254
+ (286, 480):4508
4255
+ (1519, 330):4509
4256
+ (1205, 1150):4510
4257
+ (274, 336):4511
4258
+ (893, 336):4512
4259
+ (1151, 551):4513
4260
+ (323, 421):4514
4261
+ (979, 422):4515
4262
+ (467, 732):4516
4263
+ (308, 2158):4517
4264
+ (2475, 781):4518
4265
+ (1566, 376):4519
4266
+ (436, 273):4520
4267
+ (2159, 463):4521
4268
+ (282, 345):4522
4269
+ (384, 538):4523
4270
+ (1470, 1669):4524
4271
+ (2162, 652):4525
4272
+ (1329, 288):4526
4273
+ (1683, 273):4527
4274
+ (466, 827):4528
4275
+ (481, 445):4529
4276
+ (550, 1063):4530
4277
+ (369, 2721):4531
4278
+ (1100, 350):4532
4279
+ (695, 622):4533
4280
+ (1049, 352):4534
4281
+ (2491, 3410):4535
4282
+ (310, 267):4536
4283
+ (395, 944):4537
4284
+ (270, 1017):4538
4285
+ (270, 2725):4539
4286
+ (274, 1018):4540
4287
+ (320, 305):4541
4288
+ (2303, 304):4542
4289
+ (293, 2496):4543
4290
+ (4543, 3016):4544
4291
+ (1064, 276):4545
4292
+ (964, 329):4546
4293
+ (2729, 914):4547
4294
+ (322, 307):4548
4295
+ (1687, 501):4549
4296
+ (275, 300):4550
4297
+ (759, 377):4551
4298
+ (275, 504):4552
4299
+ (314, 387):4553
4300
+ (766, 299):4554
4301
+ (1372, 3424):4555
4302
+ (2487, 441):4556
4303
+ (777, 316):4557
4304
+ (3427, 967):4558
4305
+ (1222, 515):4559
4306
+ (297, 1016):4560
4307
+ (326, 2312):4561
4308
+ (319, 777):4562
4309
+ (288, 1936):4563
4310
+ (2736, 692):4564
4311
+ (271, 325):4565
4312
+ (285, 413):4566
4313
+ (552, 416):4567
4314
+ (964, 334):4568
4315
+ (691, 274):4569
4316
+ (819, 276):4570
4317
+ (516, 281):4571
4318
+ (816, 1043):4572
4319
+ (858, 2512):4573
4320
+ (601, 397):4574
4321
+ (3034, 374):4575
4322
+ (314, 288):4576
4323
+ (1388, 483):4577
4324
+ (2515, 413):4578
4325
+ (275, 1295):4579
4326
+ (385, 525):4580
4327
+ (294, 372):4581
4328
+ (309, 273):4582
4329
+ (1377, 3038):4583
4330
+ (979, 274):4584
4331
+ (415, 364):4585
4332
+ (638, 1211):4586
4333
+ (1184, 276):4587
4334
+ (270, 2519):4588
4335
+ (1068, 261):4589
4336
+ (582, 1179):4590
4337
+ (271, 305):4591
4338
+ (271, 591):4592
4339
+ (1021, 310):4593
4340
+ (309, 642):4594
4341
+ (271, 1070):4595
4342
+ (338, 1084):4596
4343
+ (306, 310):4597
4344
+ (640, 344):4598
4345
+ (294, 826):4599
4346
+ (837, 2184):4600
4347
+ (295, 323):4601
4348
+ (317, 302):4602
4349
+ (301, 1570):4603
4350
+ (340, 1017):4604
4351
+ (769, 284):4605
4352
+ (311, 334):4606
4353
+ (294, 1394):4607
4354
+ (329, 276):4608
4355
+ (1523, 413):4609
4356
+ (1395, 815):4610
4357
+ (320, 269):4611
4358
+ (2329, 2150):4612
4359
+ (319, 2330):4613
4360
+ (1131, 307):4614
4361
+ (444, 281):4615
4362
+ (386, 1153):4616
4363
+ (776, 585):4617
4364
+ (2149, 433):4618
4365
+ (524, 1684):4619
4366
+ (682, 325):4620
4367
+ (2764, 360):4621
4368
+ (409, 876):4622
4369
+ (1535, 278):4623
4370
+ (1132, 539):4624
4371
+ (352, 272):4625
4372
+ (384, 404):4626
4373
+ (2336, 1159):4627
4374
+ (2187, 1851):4628
4375
+ (275, 642):4629
4376
+ (292, 436):4630
4377
+ (264, 774):4631
4378
+ (1699, 3942):4632
4379
+ (339, 419):4633
4380
+ (384, 397):4634
4381
+ (1393, 507):4635
4382
+ (320, 1134):4636
4383
+ (274, 445):4637
4384
+ (605, 1369):4638
4385
+ (337, 519):4639
4386
+ (1951, 764):4640
4387
+ (805, 283):4641
4388
+ (282, 465):4642
4389
+ (772, 2071):4643
4390
+ (320, 651):4644
4391
+ (288, 498):4645
4392
+ (384, 405):4646
4393
+ (397, 376):4647
4394
+ (682, 405):4648
4395
+ (1576, 1074):4649
4396
+ (291, 1435):4650
4397
+ (448, 261):4651
4398
+ (1916, 329):4652
4399
+ (308, 521):4653
4400
+ (704, 2084):4654
4401
+ (1541, 287):4655
4402
+ (974, 497):4656
4403
+ (699, 290):4657
4404
+ (635, 269):4658
4405
+ (598, 283):4659
4406
+ (339, 276):4660
4407
+ (283, 267):4661
4408
+ (265, 771):4662
4409
+ (1003, 405):4663
4410
+ (576, 287):4664
4411
+ (1153, 261):4665
4412
+ (391, 450):4666
4413
+ (301, 1046):4667
4414
+ (411, 1311):4668
4415
+ (414, 2797):4669
4416
+ (297, 424):4670
4417
+ (329, 290):4671
4418
+ (364, 671):4672
4419
+ (283, 931):4673
4420
+ (710, 261):4674
4421
+ (756, 490):4675
4422
+ (338, 261):4676
4423
+ (1013, 438):4677
4424
+ (396, 264):4678
4425
+ (1147, 1400):4679
4426
+ (1118, 284):4680
4427
+ (377, 273):4681
4428
+ (1619, 359):4682
4429
+ (414, 366):4683
4430
+ (886, 461):4684
4431
+ (467, 365):4685
4432
+ (908, 487):4686
4433
+ (290, 603):4687
4434
+ (681, 414):4688
4435
+ (1389, 296):4689
4436
+ (911, 529):4690
4437
+ (275, 2803):4691
4438
+ (327, 360):4692
4439
+ (400, 492):4693
4440
+ (4003, 269):4694
4441
+ (3092, 265):4695
4442
+ (1962, 866):4696
4443
+ (1447, 261):4697
4444
+ (270, 551):4698
4445
+ (1107, 372):4699
4446
+ (825, 944):4700
4447
+ (322, 2358):4701
4448
+ (3515, 526):4702
4449
+ (809, 1965):4703
4450
+ (320, 264):4704
4451
+ (3981, 285):4705
4452
+ (1382, 265):4706
4453
+ (341, 1034):4707
4454
+ (294, 284):4708
4455
+ (900, 698):4709
4456
+ (376, 273):4710
4457
+ (282, 1878):4711
4458
+ (289, 296):4712
4459
+ (562, 323):4713
4460
+ (275, 559):4714
4461
+ (285, 501):4715
4462
+ (317, 423):4716
4463
+ (890, 356):4717
4464
+ (1298, 276):4718
4465
+ (370, 1170):4719
4466
+ (2368, 374):4720
4467
+ (1243, 273):4721
4468
+ (2098, 773):4722
4469
+ (3110, 551):4723
4470
+ (817, 528):4724
4471
+ (264, 270):4725
4472
+ (1300, 397):4726
4473
+ (316, 587):4727
4474
+ (663, 324):4728
4475
+ (396, 328):4729
4476
+ (364, 264):4730
4477
+ (297, 614):4731
4478
+ (282, 487):4732
4479
+ (361, 273):4733
4480
+ (329, 812):4734
4481
+ (481, 292):4735
4482
+ (1131, 336):4736
4483
+ (1968, 283):4737
4484
+ (767, 559):4738
4485
+ (1397, 478):4739
4486
+ (279, 1434):4740
4487
+ (343, 442):4741
4488
+ (301, 437):4742
4489
+ (513, 376):4743
4490
+ (399, 284):4744
4491
+ (2828, 479):4745
4492
+ (415, 2216):4746
4493
+ (992, 273):4747
4494
+ (3535, 732):4748
4495
+ (462, 269):4749
4496
+ (1475, 903):4750
4497
+ (3133, 264):4751
4498
+ (427, 273):4752
4499
+ (265, 734):4753
4500
+ (604, 272):4754
4501
+ (1102, 529):4755
4502
+ (910, 1802):4756
4503
+ (1236, 264):4757
4504
+ (323, 283):4758
4505
+ (1931, 562):4759
4506
+ (342, 273):4760
4507
+ (679, 322):4761
4508
+ (286, 732):4762
4509
+ (657, 686):4763
4510
+ (290, 307):4764
4511
+ (777, 497):4765
4512
+ (674, 1803):4766
4513
+ (350, 354):4767
4514
+ (1599, 517):4768
4515
+ (382, 271):4769
4516
+ (301, 4050):4770
4517
+ (2110, 702):4771
4518
+ (2837, 278):4772
4519
+ (1593, 291):4773
4520
+ (3555, 1224):4774
4521
+ (401, 528):4775
4522
+ (2992, 962):4776
4523
+ (872, 284):4777
4524
+ (809, 330):4778
4525
+ (1644, 511):4779
4526
+ (289, 302):4780
4527
+ (835, 273):4781
4528
+ (301, 300):4782
4529
+ (1446, 3561):4783
4530
+ (1585, 291):4784
4531
+ (599, 1713):4785
4532
+ (2057, 774):4786
4533
+ (275, 671):4787
4534
+ (926, 276):4788
4535
+ (1069, 261):4789
4536
+ (798, 326):4790
4537
+ (755, 631):4791
4538
+ (696, 269):4792
4539
+ (815, 312):4793
4540
+ (303, 310):4794
4541
+ (729, 884):4795
4542
+ (1703, 498):4796
4543
+ (1980, 273):4797
4544
+ (469, 512):4798
4545
+ (340, 518):4799
4546
+ (853, 463):4800
4547
+ (1598, 676):4801
4548
+ (2179, 718):4802
4549
+ (328, 339):4803
4550
+ (1531, 681):4804
4551
+ (818, 664):4805
4552
+ (356, 2325):4806
4553
+ (319, 1242):4807
4554
+ (317, 328):4808
4555
+ (2389, 1036):4809
4556
+ (580, 283):4810
4557
+ (526, 688):4811
4558
+ (638, 267):4812
4559
+ (301, 445):4813
4560
+ (364, 404):4814
4561
+ (302, 357):4815
4562
+ (382, 263):4816
4563
+ (1007, 1430):4817
4564
+ (2854, 433):4818
4565
+ (961, 413):4819
4566
+ (1692, 438):4820
4567
+ (1086, 439):4821
4568
+ (1492, 263):4822
4569
+ (2060, 290):4823
4570
+ (887, 352):4824
4571
+ (370, 517):4825
4572
+ (265, 329):4826
4573
+ (341, 518):4827
4574
+ (1543, 802):4828
4575
+ (4828, 701):4829
4576
+ (916, 607):4830
4577
+ (410, 717):4831
4578
+ (306, 621):4832
4579
+ (2396, 344):4833
4580
+ (1569, 267):4834
4581
+ (552, 518):4835
4582
+ (3177, 413):4836
4583
+ (370, 1964):4837
4584
+ (1962, 264):4838
4585
+ (274, 817):4839
4586
+ (275, 906):4840
4587
+ (382, 354):4841
4588
+ (539, 414):4842
4589
+ (322, 616):4843
4590
+ (397, 1195):4844
4591
+ (606, 995):4845
4592
+ (566, 1803):4846
4593
+ (636, 1552):4847
4594
+ (271, 459):4848
4595
+ (876, 263):4849
4596
+ (322, 4104):4850
4597
+ (288, 1417):4851
4598
+ (289, 2803):4852
4599
+ (771, 318):4853
4600
+ (297, 337):4854
4601
+ (1253, 1333):4855
4602
+ (1887, 714):4856
4603
+ (627, 702):4857
4604
+ (301, 1155):4858
4605
+ (271, 389):4859
4606
+ (289, 325):4860
4607
+ (319, 1886):4861
4608
+ (319, 470):4862
4609
+ (306, 500):4863
4610
+ (2022, 580):4864
4611
+ (980, 323):4865
4612
+ (338, 272):4866
4613
+ (875, 474):4867
4614
+ (730, 2601):4868
4615
+ (1597, 273):4869
4616
+ (264, 299):4870
4617
+ (1679, 947):4871
4618
+ (299, 321):4872
4619
+ (295, 1266):4873
4620
+ (1730, 1376):4874
4621
+ (343, 403):4875
4622
+ (289, 1307):4876
4623
+ (361, 1084):4877
4624
+ (665, 269):4878
4625
+ (716, 433):4879
4626
+ (1451, 479):4880
4627
+ (576, 284):4881
4628
+ (1616, 284):4882
4629
+ (391, 269):4883
4630
+ (387, 302):4884
4631
+ (329, 357):4885
4632
+ (1281, 345):4886
4633
+ (328, 464):4887
4634
+ (305, 966):4888
4635
+ (294, 1084):4889
4636
+ (1042, 366):4890
4637
+ (270, 329):4891
4638
+ (707, 1406):4892
4639
+ (682, 288):4893
4640
+ (4893, 1491):4894
4641
+ (4894, 497):4895
4642
+ (1814, 273):4896
4643
+ (2777, 553):4897
4644
+ (2111, 525):4898
4645
+ (749, 401):4899
4646
+ (909, 329):4900
4647
+ (747, 933):4901
4648
+ (297, 350):4902
4649
+ (604, 307):4903
4650
+ (494, 529):4904
4651
+ (735, 377):4905
4652
+ (1148, 670):4906
4653
+ (275, 366):4907
4654
+ (432, 278):4908
4655
+ (380, 2614):4909
4656
+ (681, 352):4910
4657
+ (314, 307):4911
4658
+ (286, 948):4912
4659
+ (3216, 771):4913
4660
+ (2240, 269):4914
4661
+ (664, 371):4915
4662
+ (338, 614):4916
4663
+ (641, 438):4917
4664
+ (1735, 267):4918
4665
+ (272, 508):4919
4666
+ (328, 373):4920
4667
+ (370, 864):4921
4668
+ (399, 431):4922
4669
+ (865, 423):4923
4670
+ (279, 1626):4924
4671
+ (1495, 276):4925
4672
+ (1779, 329):4926
4673
+ (314, 572):4927
4674
+ (338, 555):4928
4675
+ (537, 261):4929
4676
+ (315, 3632):4930
4677
+ (520, 287):4931
4678
+ (301, 1966):4932
4679
+ (657, 284):4933
4680
+ (270, 972):4934
4681
+ (288, 390):4935
4682
+ (730, 374):4936
4683
+ (301, 712):4937
4684
+ (1622, 261):4938
4685
+ (274, 354):4939
4686
+ (693, 914):4940
4687
+ (317, 986):4941
4688
+ (471, 440):4942
4689
+ (1278, 2190):4943
4690
+ (386, 1990):4944
4691
+ (319, 335):4945
4692
+ (295, 389):4946
4693
+ (1284, 525):4947
4694
+ (3644, 1350):4948
4695
+ (681, 579):4949
4696
+ (1675, 356):4950
4697
+ (2475, 335):4951
4698
+ (270, 335):4952
4699
+ (550, 382):4953
4700
+ (648, 281):4954
4701
+ (856, 283):4955
4702
+ (412, 263):4956
4703
+ (634, 271):4957
4704
+ (667, 375):4958
4705
+ (317, 1242):4959
4706
+ (314, 1084):4960
4707
+ (756, 299):4961
4708
+ (2417, 371):4962
4709
+ (513, 1118):4963
4710
+ (631, 288):4964
4711
+ (1243, 1074):4965
4712
+ (845, 950):4966
4713
+ (833, 263):4967
4714
+ (3247, 312):4968
4715
+ (4968, 304):4969
4716
+ (302, 284):4970
4717
+ (2632, 354):4971
4718
+ (2121, 1076):4972
4719
+ (319, 364):4973
4720
+ (1514, 291):4974
4721
+ (511, 261):4975
4722
+ (2337, 273):4976
4723
+ (299, 484):4977
4724
+ (953, 2991):4978
4725
+ (2255, 2136):4979
4726
+ (513, 335):4980
4727
+ (1771, 470):4981
4728
+ (511, 433):4982
4729
+ (2699, 1085):4983
4730
+ (553, 358):4984
4731
+ (377, 3224):4985
4732
+ (384, 4198):4986
4733
+ (271, 1129):4987
4734
+ (1125, 344):4988
4735
+ (865, 270):4989
4736
+ (264, 983):4990
4737
+ (478, 1114):4991
4738
+ (1505, 1738):4992
4739
+ (880, 1813):4993
4740
+ (314, 300):4994
4741
+ (1183, 611):4995
4742
+ (384, 442):4996
4743
+ (558, 4159):4997
4744
+ (1766, 360):4998
4745
+ (973, 334):4999
data/vocab.bpe ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ gradio
2
+ regex
3
+ tqdm
4
+ huggingface-hub
5
+ pytest
src/app.py ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from tokenizer import sanskrit_token_preprocessor, bpeAlgo, create_vocab, save_paired_tokens_vocab, save_vocab, encode, decode
3
+
4
+ # Created a `TokenizerModel` class to maintain state between calls
5
+ # - Added a web interface with separate tabs for training and tokenization
6
+ # - Included example texts and documentation
7
+ # - Made the interface more user-friendly with clear labels and instructions
8
+ # - Added JSON output for better visualization of results
9
+
10
+ # The app provides two main functionalities:
11
+ # 1. Training the tokenizer on custom text
12
+ # 2. Tokenizing new text using the trained model
13
+ class TokenizerModel:
14
+ def __init__(self, vocab_size=5000):
15
+ self.vocab_size = vocab_size
16
+ self.paired_tokens_vocab = None
17
+ self.vocab = None
18
+
19
+ def train(self, text):
20
+ # Preprocess tokens
21
+ tokens = sanskrit_token_preprocessor(text)
22
+ tokens = [list(tok.encode('utf-8')) for tok in tokens]
23
+ orig_tokens_len = len([tok for toks in tokens for tok in toks])
24
+ print(type(orig_tokens_len))
25
+
26
+ # Train BPE
27
+ try:
28
+ self.paired_tokens_vocab, encoded_tokens = bpeAlgo(tokens, self.vocab_size - 256, 256)
29
+ self.vocab = create_vocab(self.paired_tokens_vocab)
30
+ except ValueError as e:
31
+ # Display the error message in your UI
32
+ return f"Error during training: {str(e)}"
33
+
34
+ # save_paired_tokens_vocab("data/paired_tokens.bpe", self.paired_tokens_vocab)
35
+ # save_vocab( "data/vocab.bpe", self.vocab)
36
+
37
+ # Calculate compression ratio
38
+ compression_ratio = orig_tokens_len / len(encoded_tokens)
39
+
40
+ return f"Training completed! Vocabulary size: {len(self.vocab)} and Compression Ratio: {compression_ratio:.2f}"
41
+
42
+ def tokenize(self, text):
43
+ if self.paired_tokens_vocab is None:
44
+ # try:
45
+ # with open("data/paired_tokens.bpe", "r") as f:
46
+ # self.paired_tokens_vocab = eval(f.read())
47
+ # with open("data/vocab.bpe", "r") as f:
48
+ # self.vocab = eval(f.read())
49
+ # except FileNotFoundError as fe:
50
+ # return {"Error":f"Please train the tokenizer first or ensure vocabulary files exist! {fe}"}
51
+ # except SyntaxError as se:
52
+ # return {"Error":f"Please train the tokenizer first or ensure vocabulary files exist! {se}"}
53
+ # except Exception as e:
54
+ # return {"Error": str(e)}
55
+ return {"Error": "Please train it first to create vocab. Training smaples can be found in the data dir"}
56
+
57
+ encoded = encode(text, self.paired_tokens_vocab)
58
+ decoded = decode(encoded, self.vocab)
59
+
60
+ return {
61
+ "Encoded tokens": encoded,
62
+ "Decoded text": decoded,
63
+ "Matches original": decoded == text
64
+ }
65
+
66
+ # Create global tokenizer instance
67
+ tokenizer = TokenizerModel()
68
+
69
+ def train_tokenizer(text):
70
+ return tokenizer.train(text)
71
+
72
+ def process_text(text):
73
+ return tokenizer.tokenize(text)
74
+
75
+ # Create the Gradio interface
76
+ with gr.Blocks(title="Sanskrit BPE Tokenizer") as demo:
77
+ gr.Markdown("# Sanskrit BPE Tokenizer")
78
+ gr.Markdown("This tokenizer implements Byte-Pair Encoding (BPE) for Sanskrit text.")
79
+
80
+ with gr.Tab("Train"):
81
+ train_input = gr.Textbox(
82
+ label="Training Text",
83
+ placeholder="Enter Sanskrit text for training...",
84
+ lines=5
85
+ )
86
+ train_button = gr.Button("Train Tokenizer")
87
+ train_output = gr.Textbox(label="Training Result")
88
+
89
+ train_button.click(
90
+ train_tokenizer,
91
+ inputs=train_input,
92
+ outputs=train_output
93
+ )
94
+
95
+ with gr.Tab("Tokenize"):
96
+ text_input = gr.Textbox(
97
+ label="Input Text",
98
+ placeholder="Enter Sanskrit text to tokenize...",
99
+ lines=3
100
+ )
101
+ tokenize_button = gr.Button("Tokenize")
102
+ result_output = gr.JSON(label="Results")
103
+
104
+ tokenize_button.click(
105
+ process_text,
106
+ inputs=text_input,
107
+ outputs=result_output
108
+ )
109
+
110
+ gr.Markdown("""
111
+ ### Example texts:
112
+ ```
113
+ चीराण्यपास्याज्जनकस्य कन्या नेयं प्रतिज्ञा मम दत्तपूर्वा।
114
+ यथासुखं गच्छतु राजपुत्री वनं समग्रा सह सर्वरत्नैः॥
115
+ ```
116
+ """)
117
+
118
+ if __name__ == "__main__":
119
+ demo.launch()
src/playground.ipynb ADDED
@@ -0,0 +1,593 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": []
9
+ },
10
+ {
11
+ "cell_type": "code",
12
+ "execution_count": 3,
13
+ "metadata": {},
14
+ "outputs": [
15
+ {
16
+ "name": "stdout",
17
+ "output_type": "stream",
18
+ "text": [
19
+ "Length of dataset 620958\n"
20
+ ]
21
+ }
22
+ ],
23
+ "source": [
24
+ "with open('../static/sanskrit.txt', 'r', encoding='utf-8') as f: \n",
25
+ " text = f.read()\n",
26
+ "\n",
27
+ "print(f'Length of dataset {len(text)}')"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": 4,
33
+ "metadata": {},
34
+ "outputs": [
35
+ {
36
+ "name": "stdout",
37
+ "output_type": "stream",
38
+ "text": [
39
+ "तस्यां चीरं वसानायां नाथवत्यामनाथवत्। प्रचुक्रोश जनः सर्वो धिक् त्वां दशरथं त्विति ॥\n",
40
+ "तेन तत्र प्रणादेन दुःखितः स महीपतिः। चिच्छेद जीविते श्रद्धां धर्मे यशसि चात्मनः॥ स निःश्वस्योष्णमैक्ष्वाकस्तां भार्यामिदमब्रवीत्। कैकेयि कुशचीरेण न सीता गन्तुमर्हति॥\n",
41
+ "सुकुमारी च बाला च सततं च सुखोचिता। नेयं वनस्य योग्येति सत्यमाह गुरुर्मम ॥\n",
42
+ "इयं हि कस्यापि करोति किंचित् तपस्विनी राजवरस्य पुत्री। या चीरमासाद्य वनस्य मध्ये जाता विसंज्ञा श्रमणीव काचित्॥\n",
43
+ "चीराण्यपास्याज्जनकस्य कन्या नेयं प्रतिज्ञा मम दत्तपूर्वा। यथासुखं गच्छतु राजपुत्री वनं समग्रा सह सर्वरत्नैः॥\n",
44
+ "अजीवनाहेण मया नृशंसा कृता प्रतिज्ञा नियमेन तावत्। त्वया हि बाल्यात् प्रतिपन्नमेतत् तन्मा दहेद् वेणुमिवात्मपुष्पम्॥\n",
45
+ "रामेण यदि ते पापे किंचित्कृतमशोभनम्। अपकारः क इह ते वैदेह्या दर्शितोऽधमे॥\n",
46
+ "मृगीवोत्फुल्लनयना मृदुशीला मनस्विनी। अपकारं कमिव ते करोति जनकात्मजा॥\n",
47
+ "ननु पर्याप्तमेवं ते पापे रामविवासनम्। किमेभिः कृपणैर्भूयः पातकैरपि ते कृतैः॥\n",
48
+ "प्रतिज्ञातं मया तावत् त्वयोक्तं देवि शृण्वता। रामं यदभिषेकाय त्वमिहागतमब्रवीः॥\n",
49
+ "तत्त्वेतत् समतिक्रम्य निरयं गन्तुमिच्छसि।\n"
50
+ ]
51
+ }
52
+ ],
53
+ "source": [
54
+ "print(text[:1000])"
55
+ ]
56
+ },
57
+ {
58
+ "cell_type": "code",
59
+ "execution_count": 8,
60
+ "metadata": {},
61
+ "outputs": [
62
+ {
63
+ "name": "stdout",
64
+ "output_type": "stream",
65
+ "text": [
66
+ "99\n",
67
+ "\n",
68
+ " ! ' ( ) , - . : ? [ _ ā ँ ं ः अ आ इ ई उ ऊ ऋ ए ऐ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ऱ ल ळ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॊ ो ौ ् ॐ ॑ ॒ क़ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ — ‘ ” •\n"
69
+ ]
70
+ }
71
+ ],
72
+ "source": [
73
+ "uniqueChars = sorted(list(set(text)))\n",
74
+ "print(len(uniqueChars))\n",
75
+ "print(' '.join(uniqueChars))"
76
+ ]
77
+ },
78
+ {
79
+ "cell_type": "code",
80
+ "execution_count": 11,
81
+ "metadata": {},
82
+ "outputs": [
83
+ {
84
+ "data": {
85
+ "text/plain": [
86
+ "2384"
87
+ ]
88
+ },
89
+ "execution_count": 11,
90
+ "metadata": {},
91
+ "output_type": "execute_result"
92
+ }
93
+ ],
94
+ "source": [
95
+ "ord('ॐ')\n"
96
+ ]
97
+ },
98
+ {
99
+ "cell_type": "code",
100
+ "execution_count": 34,
101
+ "metadata": {},
102
+ "outputs": [
103
+ {
104
+ "data": {
105
+ "text/plain": [
106
+ "([10, 32, 32, 32, 33, 32, 39, 32, 40, 32], [224, 165, 144])"
107
+ ]
108
+ },
109
+ "execution_count": 34,
110
+ "metadata": {},
111
+ "output_type": "execute_result"
112
+ }
113
+ ],
114
+ "source": [
115
+ "l = list(' '.join(uniqueChars).encode('utf-8'))\n",
116
+ "m = list(\"ॐ\".encode('utf-8'))\n",
117
+ "l[:10], m"
118
+ ]
119
+ },
120
+ {
121
+ "cell_type": "code",
122
+ "execution_count": 26,
123
+ "metadata": {},
124
+ "outputs": [
125
+ {
126
+ "data": {
127
+ "text/plain": [
128
+ "[224, 164, 164, 224, 164, 184, 224, 165, 141, 224]"
129
+ ]
130
+ },
131
+ "execution_count": 26,
132
+ "metadata": {},
133
+ "output_type": "execute_result"
134
+ }
135
+ ],
136
+ "source": [
137
+ "dictionary = list(text.encode('utf-8'))\n",
138
+ "dictionary[:10]"
139
+ ]
140
+ },
141
+ {
142
+ "cell_type": "code",
143
+ "execution_count": 38,
144
+ "metadata": {},
145
+ "outputs": [
146
+ {
147
+ "data": {
148
+ "text/plain": [
149
+ "[(10, 32), (32, 32), (32, 32), (32, 33), (33, 32)]"
150
+ ]
151
+ },
152
+ "execution_count": 38,
153
+ "metadata": {},
154
+ "output_type": "execute_result"
155
+ }
156
+ ],
157
+ "source": [
158
+ "lz = list(zip(l , l[1:]))\n",
159
+ "lz [:5]"
160
+ ]
161
+ },
162
+ {
163
+ "cell_type": "code",
164
+ "execution_count": 59,
165
+ "metadata": {},
166
+ "outputs": [
167
+ {
168
+ "data": {
169
+ "text/plain": [
170
+ "226"
171
+ ]
172
+ },
173
+ "execution_count": 59,
174
+ "metadata": {},
175
+ "output_type": "execute_result"
176
+ }
177
+ ],
178
+ "source": [
179
+ "tokens = list(text.encode('utf-8'))\n",
180
+ "max(tokens)"
181
+ ]
182
+ },
183
+ {
184
+ "cell_type": "code",
185
+ "execution_count": 74,
186
+ "metadata": {},
187
+ "outputs": [
188
+ {
189
+ "name": "stdout",
190
+ "output_type": "stream",
191
+ "text": [
192
+ "{408270: (224, 164), 38329: (164, 164), 38039: (164, 224), 20281: (164, 184), 19343: (184, 224), 141095: (224, 165), 70708: (165, 141), 67426: (141, 224), 22626: (164, 175), 19459: (175, 224), 44980: (164, 190), 38855: (190, 224), 13816: (164, 130), 11423: (130, 32), 64948: (32, 224), 9404: (164, 154), 6005: (154, 224), 5475: (165, 128), 4738: (128, 224), 33267: (164, 176), 32359: (176, 224), 24535: (164, 181), 22815: (181, 224), 24346: (164, 168), 21955: (168, 224), 4024: (164, 165), 3793: (165, 224), 23375: (164, 174), 22769: (174, 224), 7530: (165, 164), 7060: (164, 32), 15009: (164, 170), 14942: (170, 224), 14835: (165, 129), 13336: (129, 224), 12754: (164, 149), 12679: (149, 224), 8616: (165, 139), 5171: (139, 224), 9649: (164, 182), 119: (182, 32), 5673: (164, 156), 5529: (156, 224), 9445: (164, 131), 4620: (131, 32), 3578: (139, 32), 5366: (164, 167), 5340: (167, 224), 24038: (164, 191), 19693: (191, 224), 3257: (141, 32), 13007: (164, 166), 12921: (166, 224), 9527: (182, 224), 4289: (191, 32), 7079: (165, 165), 5361: (165, 10), 6142: (10, 224), 14554: (165, 135), 10727: (135, 224), 2385: (168, 32), 900: (176, 32), 5444: (164, 163), 5007: (163, 224), 9050: (131, 224), 1006: (164, 150), 994: (150, 224), 929: (184, 32), 8202: (164, 185), 7905: (185, 224), 882: (164, 155), 830: (155, 224), 102: (166, 32), 4351: (135, 32), 1948: (165, 32), 8466: (164, 183), 8284: (183, 224), 3607: (165, 136), 3344: (136, 224), 6617: (164, 173), 6628: (173, 224), 2771: (164, 172), 2768: (172, 224), 428: (163, 32), 6057: (190, 32), 5214: (164, 151), 5173: (151, 224), 722: (128, 32), 3378: (154, 32), 4477: (164, 178), 4393: (178, 224), 3161: (175, 32), 295: (185, 32), 607: (174, 32), 539: (164, 135), 5105: (130, 224), 1049: (164, 158), 1019: (158, 224), 1711: (181, 32), 2715: (165, 130), 1505: (129, 32), 1504: (164, 133), 1506: (133, 224), 4251: (165, 131), 71: (149, 32), 1347: (189, 224), 230: (164, 171), 245: (171, 224), 689: (143, 224), 1493: (165, 140), 799: (140, 224), 1378: (164, 159), 1363: (159, 224), 746: (164, 152), 737: (152, 224), 115: (164, 162), 108: (162, 224), 688: (153, 224), 851: (137, 224), 18: (164, 129), 11: (150, 32), 2: (33, 10), 65: (167, 32), 691: (140, 32), 717: (164, 10), 22: (191, 44), 13: (169, 224), 28: (165, 168), 141: (156, 32), 140: (164, 139), 655: (164, 160), 579: (160, 224), 815: (164, 161), 811: (161, 224), 181: (183, 32), 12: (152, 32), 391: (164, 134), 389: (134, 224), 294: (136, 32), 24: (165, 173), 14: (159, 32), 45: (58, 224), 51: (155, 32), 41: (165, 167), 17: (191, 39), 174: (58, 32), 15: (157, 224), 7: (175, 58), 5: (131, 10), 20: (165, 166), 4: (168, 10), 10: (141, 39), 9: (173, 32), 6: (165, 138), 3: (170, 10), 77: (170, 32), 76: (160, 32), 69: (178, 32), 40: (164, 138), 43: (138, 224), 37: (151, 32), 32: (164, 136), 1: (149, 58), 55: (190, 58), 35: (164, 58), 25: (168, 58), 19: (32, 39), 53: (39, 224), 52: (44, 32), 46: (39, 32), 29: (45, 39), 8: (162, 32), 30: (158, 32)}\n",
193
+ "[(408270, (224, 164)), (141095, (224, 165)), (70708, (165, 141)), (67426, (141, 224)), (64948, (32, 224)), (44980, (164, 190)), (38855, (190, 224)), (38329, (164, 164)), (38039, (164, 224)), (33267, (164, 176)), (32359, (176, 224)), (24535, (164, 181)), (24346, (164, 168)), (24038, (164, 191)), (23375, (164, 174)), (22815, (181, 224)), (22769, (174, 224)), (22626, (164, 175)), (21955, (168, 224)), (20281, (164, 184)), (19693, (191, 224)), (19459, (175, 224)), (19343, (184, 224)), (15009, (164, 170)), (14942, (170, 224)), (14835, (165, 129)), (14554, (165, 135)), (13816, (164, 130)), (13336, (129, 224)), (13007, (164, 166)), (12921, (166, 224)), (12754, (164, 149)), (12679, (149, 224)), (11423, (130, 32)), (10727, (135, 224)), (9649, (164, 182)), (9527, (182, 224)), (9445, (164, 131)), (9404, (164, 154)), (9050, (131, 224)), (8616, (165, 139)), (8466, (164, 183)), (8284, (183, 224)), (8202, (164, 185)), (7905, (185, 224)), (7530, (165, 164)), (7079, (165, 165)), (7060, (164, 32)), (6628, (173, 224)), (6617, (164, 173)), (6142, (10, 224)), (6057, (190, 32)), (6005, (154, 224)), (5673, (164, 156)), (5529, (156, 224)), (5475, (165, 128)), (5444, (164, 163)), (5366, (164, 167)), (5361, (165, 10)), (5340, (167, 224)), (5214, (164, 151)), (5173, (151, 224)), (5171, (139, 224)), (5105, (130, 224)), (5007, (163, 224)), (4738, (128, 224)), (4620, (131, 32)), (4477, (164, 178)), (4393, (178, 224)), (4351, (135, 32)), (4289, (191, 32)), (4251, (165, 131)), (4024, (164, 165)), (3793, (165, 224)), (3607, (165, 136)), (3578, (139, 32)), (3378, (154, 32)), (3344, (136, 224)), (3257, (141, 32)), (3161, (175, 32)), (2771, (164, 172)), (2768, (172, 224)), (2715, (165, 130)), (2385, (168, 32)), (1948, (165, 32)), (1711, (181, 32)), (1506, (133, 224)), (1505, (129, 32)), (1504, (164, 133)), (1493, (165, 140)), (1378, (164, 159)), (1363, (159, 224)), (1347, (189, 224)), (1347, (164, 189)), (1049, (164, 158)), (1019, (158, 224)), (1006, (164, 150)), (994, (150, 224)), (929, (184, 32)), (900, (176, 32)), (882, (164, 155)), (851, (164, 137)), (851, (137, 224)), (830, (155, 224)), (815, (164, 161)), (811, (161, 224)), (799, (140, 224)), (746, (164, 152)), (737, (152, 224)), (722, (128, 32)), (717, (164, 10)), (691, (140, 32)), (689, (164, 143)), (689, (143, 224)), (688, (164, 153)), (688, (153, 224)), (655, (164, 160)), (607, (174, 32)), (579, (160, 224)), (539, (164, 135)), (428, (163, 32)), (391, (164, 134)), (389, (134, 224)), (295, (185, 32)), (294, (136, 32)), (245, (171, 224)), (230, (164, 171)), (181, (183, 32)), (174, (58, 32)), (141, (156, 32)), (140, (164, 139)), (119, (182, 32)), (115, (164, 162)), (108, (162, 224)), (102, (166, 32)), (77, (170, 32)), (76, (160, 32)), (71, (149, 32)), (69, (178, 32)), (65, (167, 32)), (55, (190, 58)), (53, (39, 224)), (52, (44, 32)), (51, (155, 32)), (46, (39, 32)), (45, (58, 224)), (43, (138, 224)), (41, (165, 167)), (40, (164, 138)), (37, (151, 32)), (35, (164, 58)), (32, (164, 136)), (30, (158, 32)), (29, (45, 39)), (28, (165, 168)), (25, (168, 58)), (24, (165, 173)), (22, (191, 44)), (22, (165, 171)), (22, (165, 169)), (20, (165, 166)), (19, (32, 39)), (18, (164, 129)), (17, (191, 39)), (17, (165, 170)), (17, (154, 45)), (17, (33, 32)), (15, (164, 157)), (15, (157, 224)), (14, (191, 58)), (14, (178, 58)), (14, (159, 32)), (13, (169, 224)), (12, (152, 32)), (11, (165, 145)), (11, (165, 132)), (11, (150, 32)), (11, (132, 224)), (11, (128, 58)), (10, (165, 175)), (10, (141, 39)), (9, (173, 32)), (9, (165, 174)), (9, (164, 144)), (9, (145, 224)), (9, (144, 224)), (9, (131, 39)), (8, (162, 32)), (8, (141, 44)), (8, (45, 224)), (7, (175, 58)), (7, (169, 10)), (7, (164, 147)), (7, (163, 58)), (7, (148, 224)), (7, (147, 224)), (7, (129, 58)), (7, (32, 58)), (6, (226, 128)), (6, (176, 58)), (6, (172, 32)), (6, (165, 172)), (6, (165, 138)), (6, (164, 148)), (6, (135, 10)), (6, (131, 44)), (5, (181, 58)), (5, (171, 10)), (5, (131, 10)), (5, (46, 32)), (4, (190, 10)), (4, (175, 10)), (4, (168, 10)), (4, (166, 10)), (4, (161, 32)), (4, (151, 58)), (4, (141, 45)), (4, (139, 33)), (4, (135, 58)), (4, (135, 44)), (4, (63, 224)), (3, (184, 58)), (3, (175, 44)), (3, (174, 58)), (3, (174, 10)), (3, (172, 10)), (3, (170, 10)), (3, (164, 39)), (3, (156, 58)), (3, (138, 32)), (3, (131, 45)), (3, (131, 33)), (3, (129, 10)), (3, (46, 224)), (3, (40, 224)), (3, (33, 224)), (3, (10, 39)), (2, (190, 226)), (2, (190, 46)), (2, (184, 44)), (2, (176, 45)), (2, (174, 33)), (2, (173, 58)), (2, (173, 10)), (2, (171, 32)), (2, (170, 58)), (2, (170, 33)), (2, (169, 32)), (2, (168, 39)), (2, (167, 10)), (2, (165, 133)), (2, (164, 46)), (2, (164, 41)), (2, (157, 32)), (2, (154, 39)), (2, (154, 10)), (2, (145, 32)), (2, (141, 10)), (2, (134, 32)), (2, (130, 58)), (2, (128, 157)), (2, (128, 152)), (2, (95, 224)), (2, (58, 45)), (2, (46, 10)), (2, (44, 224)), (2, (41, 10)), (2, (33, 10)), (2, (32, 226)), (2, (32, 46)), (2, (10, 40)), (1, (196, 129)), (1, (191, 63)), (1, (191, 45)), (1, (191, 33)), (1, (190, 196)), (1, (190, 95)), (1, (190, 63)), (1, (190, 45)), (1, (190, 33)), (1, (188, 32)), (1, (185, 45)), (1, (185, 39)), (1, (184, 46)), (1, (184, 45)), (1, (184, 33)), (1, (184, 10)), (1, (183, 10)), (1, (182, 58)), (1, (182, 45)), (1, (182, 10)), (1, (181, 46)), (1, (181, 45)), (1, (181, 44)), (1, (181, 39)), (1, (179, 224)), (1, (178, 44)), (1, (177, 224)), (1, (175, 45)), (1, (175, 39)), (1, (168, 226)), (1, (168, 46)), (1, (168, 33)), (1, (165, 152)), (1, (165, 146)), (1, (165, 144)), (1, (165, 46)), (1, (164, 188)), (1, (164, 179)), (1, (164, 177)), (1, (164, 33)), (1, (163, 44)), (1, (163, 10)), (1, (159, 58)), (1, (155, 44)), (1, (150, 58)), (1, (149, 58)), (1, (149, 45)), (1, (149, 44)), (1, (149, 33)), (1, (146, 224)), (1, (144, 32)), (1, (141, 33)), (1, (140, 44)), (1, (140, 39)), (1, (140, 33)), (1, (139, 226)), (1, (139, 58)), (1, (139, 10)), (1, (136, 33)), (1, (135, 33)), (1, (130, 44)), (1, (129, 63)), (1, (129, 45)), (1, (129, 39)), (1, (128, 162)), (1, (128, 148)), (1, (128, 95)), (1, (128, 63)), (1, (128, 44)), (1, (128, 33)), (1, (91, 224)), (1, (63, 32)), (1, (32, 91)), (1, (32, 63)), (1, (32, 44)), (1, (32, 40))]\n",
194
+ "[((224, 164), 408270), ((224, 165), 141095), ((165, 141), 70708), ((141, 224), 67426), ((32, 224), 64948), ((164, 190), 44980), ((190, 224), 38855), ((164, 164), 38329), ((164, 224), 38039), ((164, 176), 33267), ((176, 224), 32359), ((164, 181), 24535), ((164, 168), 24346), ((164, 191), 24038), ((164, 174), 23375), ((181, 224), 22815), ((174, 224), 22769), ((164, 175), 22626), ((168, 224), 21955), ((164, 184), 20281), ((191, 224), 19693), ((175, 224), 19459), ((184, 224), 19343), ((164, 170), 15009), ((170, 224), 14942), ((165, 129), 14835), ((165, 135), 14554), ((164, 130), 13816), ((129, 224), 13336), ((164, 166), 13007), ((166, 224), 12921), ((164, 149), 12754), ((149, 224), 12679), ((130, 32), 11423), ((135, 224), 10727), ((164, 182), 9649), ((182, 224), 9527), ((164, 131), 9445), ((164, 154), 9404), ((131, 224), 9050), ((165, 139), 8616), ((164, 183), 8466), ((183, 224), 8284), ((164, 185), 8202), ((185, 224), 7905), ((165, 164), 7530), ((165, 165), 7079), ((164, 32), 7060), ((173, 224), 6628), ((164, 173), 6617), ((10, 224), 6142), ((190, 32), 6057), ((154, 224), 6005), ((164, 156), 5673), ((156, 224), 5529), ((165, 128), 5475), ((164, 163), 5444), ((164, 167), 5366), ((165, 10), 5361), ((167, 224), 5340), ((164, 151), 5214), ((151, 224), 5173), ((139, 224), 5171), ((130, 224), 5105), ((163, 224), 5007), ((128, 224), 4738), ((131, 32), 4620), ((164, 178), 4477), ((178, 224), 4393), ((135, 32), 4351), ((191, 32), 4289), ((165, 131), 4251), ((164, 165), 4024), ((165, 224), 3793), ((165, 136), 3607), ((139, 32), 3578), ((154, 32), 3378), ((136, 224), 3344), ((141, 32), 3257), ((175, 32), 3161), ((164, 172), 2771), ((172, 224), 2768), ((165, 130), 2715), ((168, 32), 2385), ((165, 32), 1948), ((181, 32), 1711), ((133, 224), 1506), ((129, 32), 1505), ((164, 133), 1504), ((165, 140), 1493), ((164, 159), 1378), ((159, 224), 1363), ((164, 189), 1347), ((189, 224), 1347), ((164, 158), 1049), ((158, 224), 1019), ((164, 150), 1006), ((150, 224), 994), ((184, 32), 929), ((176, 32), 900), ((164, 155), 882), ((164, 137), 851), ((137, 224), 851), ((155, 224), 830), ((164, 161), 815), ((161, 224), 811), ((140, 224), 799), ((164, 152), 746), ((152, 224), 737), ((128, 32), 722), ((164, 10), 717), ((140, 32), 691), ((164, 143), 689), ((143, 224), 689), ((164, 153), 688), ((153, 224), 688), ((164, 160), 655), ((174, 32), 607), ((160, 224), 579), ((164, 135), 539), ((163, 32), 428), ((164, 134), 391), ((134, 224), 389), ((185, 32), 295), ((136, 32), 294), ((171, 224), 245), ((164, 171), 230), ((183, 32), 181), ((58, 32), 174), ((156, 32), 141), ((164, 139), 140), ((182, 32), 119), ((164, 162), 115), ((162, 224), 108), ((166, 32), 102), ((170, 32), 77), ((160, 32), 76), ((149, 32), 71), ((178, 32), 69), ((167, 32), 65), ((190, 58), 55), ((39, 224), 53), ((44, 32), 52), ((155, 32), 51), ((39, 32), 46), ((58, 224), 45), ((138, 224), 43), ((165, 167), 41), ((164, 138), 40), ((151, 32), 37), ((164, 58), 35), ((164, 136), 32), ((158, 32), 30), ((45, 39), 29), ((165, 168), 28), ((168, 58), 25), ((165, 173), 24), ((165, 169), 22), ((165, 171), 22), ((191, 44), 22), ((165, 166), 20), ((32, 39), 19), ((164, 129), 18), ((165, 170), 17), ((33, 32), 17), ((154, 45), 17), ((191, 39), 17), ((164, 157), 15), ((157, 224), 15), ((191, 58), 14), ((178, 58), 14), ((159, 32), 14), ((169, 224), 13), ((152, 32), 12), ((165, 145), 11), ((165, 132), 11), ((132, 224), 11), ((128, 58), 11), ((150, 32), 11), ((165, 175), 10), ((141, 39), 10), ((145, 224), 9), ((165, 174), 9), ((164, 144), 9), ((144, 224), 9), ((131, 39), 9), ((173, 32), 9), ((141, 44), 8), ((45, 224), 8), ((162, 32), 8), ((129, 58), 7), ((32, 58), 7), ((148, 224), 7), ((169, 10), 7), ((164, 147), 7), ((147, 224), 7), ((163, 58), 7), ((175, 58), 7), ((165, 172), 6), ((164, 148), 6), ((176, 58), 6), ((226, 128), 6), ((172, 32), 6), ((131, 44), 6), ((135, 10), 6), ((165, 138), 6), ((171, 10), 5), ((46, 32), 5), ((181, 58), 5), ((131, 10), 5), ((166, 10), 4), ((151, 58), 4), ((161, 32), 4), ((63, 224), 4), ((190, 10), 4), ((175, 10), 4), ((135, 44), 4), ((139, 33), 4), ((141, 45), 4), ((135, 58), 4), ((168, 10), 4), ((172, 10), 3), ((174, 10), 3), ((131, 33), 3), ((46, 224), 3), ((40, 224), 3), ((33, 224), 3), ((156, 58), 3), ((164, 39), 3), ((175, 44), 3), ((10, 39), 3), ((131, 45), 3), ((174, 58), 3), ((184, 58), 3), ((129, 10), 3), ((138, 32), 3), ((170, 10), 3), ((145, 32), 2), ((130, 58), 2), ((167, 10), 2), ((171, 32), 2), ((190, 46), 2), ((10, 40), 2), ((164, 41), 2), ((41, 10), 2), ((169, 32), 2), ((46, 10), 2), ((190, 226), 2), ((128, 157), 2), ((157, 32), 2), ((95, 224), 2), ((173, 10), 2), ((154, 10), 2), ((32, 46), 2), ((170, 33), 2), ((174, 33), 2), ((168, 39), 2), ((32, 226), 2), ((128, 152), 2), ((154, 39), 2), ((176, 45), 2), ((184, 44), 2), ((58, 45), 2), ((164, 46), 2), ((165, 133), 2), ((173, 58), 2), ((141, 10), 2), ((134, 32), 2), ((170, 58), 2), ((44, 224), 2), ((33, 10), 2), ((182, 58), 1), ((181, 46), 1), ((165, 152), 1), ((165, 46), 1), ((183, 10), 1), ((164, 188), 1), ((188, 32), 1), ((128, 63), 1), ((128, 33), 1), ((128, 95), 1), ((141, 33), 1), ((184, 46), 1), ((129, 63), 1), ((185, 39), 1), ((128, 44), 1), ((184, 10), 1), ((129, 39), 1), ((155, 44), 1), ((181, 44), 1), ((175, 45), 1), ((184, 45), 1), ((181, 39), 1), ((168, 33), 1), ((184, 33), 1), ((140, 39), 1), ((175, 39), 1), ((140, 44), 1), ((182, 45), 1), ((149, 44), 1), ((149, 33), 1), ((129, 45), 1), ((130, 44), 1), ((164, 177), 1), ((177, 224), 1), ((191, 33), 1), ((185, 45), 1), ((163, 44), 1), ((140, 33), 1), ((32, 91), 1), ((91, 224), 1), ((191, 63), 1), ((178, 44), 1), ((165, 146), 1), ((146, 224), 1), ((165, 144), 1), ((144, 32), 1), ((190, 33), 1), ((164, 33), 1), ((139, 58), 1), ((32, 40), 1), ((136, 33), 1), ((164, 179), 1), ((179, 224), 1), ((32, 63), 1), ((139, 226), 1), ((128, 162), 1), ((182, 10), 1), ((190, 45), 1), ((168, 46), 1), ((159, 58), 1), ((150, 58), 1), ((190, 63), 1), ((63, 32), 1), ((139, 10), 1), ((168, 226), 1), ((128, 148), 1), ((191, 45), 1), ((32, 44), 1), ((190, 196), 1), ((196, 129), 1), ((163, 10), 1), ((135, 33), 1), ((190, 95), 1), ((149, 45), 1), ((181, 45), 1), ((149, 58), 1)]\n"
195
+ ]
196
+ }
197
+ ],
198
+ "source": [
199
+ "def get_pair_stats(toks): \n",
200
+ " pair_stats = {}\n",
201
+ " for pair in zip(toks, toks[1:]):\n",
202
+ " pair_stats[pair] = pair_stats.get(pair, 0) + 1\n",
203
+ " \n",
204
+ " return pair_stats\n",
205
+ "\n",
206
+ "stats = get_pair_stats(tokens)\n",
207
+ "reverse_stats = {v:k for (k,v) in stats.items()}\n",
208
+ "type(reverse_stats)\n",
209
+ "print(reverse_stats)\n",
210
+ "print (sorted(((v,k) for k,v in stats.items()), reverse=True))\n",
211
+ "print(sorted(stats.items(), key=lambda item: item[1], reverse=True))"
212
+ ]
213
+ },
214
+ {
215
+ "cell_type": "code",
216
+ "execution_count": 56,
217
+ "metadata": {},
218
+ "outputs": [
219
+ {
220
+ "data": {
221
+ "text/plain": [
222
+ "(224, 164)"
223
+ ]
224
+ },
225
+ "execution_count": 56,
226
+ "metadata": {},
227
+ "output_type": "execute_result"
228
+ }
229
+ ],
230
+ "source": [
231
+ "top_pair = max(stats, key=stats.get) \n",
232
+ "# top_pair = max(reverse_stats)\n",
233
+ "top_pair"
234
+ ]
235
+ },
236
+ {
237
+ "cell_type": "code",
238
+ "execution_count": 57,
239
+ "metadata": {},
240
+ "outputs": [
241
+ {
242
+ "data": {
243
+ "text/plain": [
244
+ "('à', '¤')"
245
+ ]
246
+ },
247
+ "execution_count": 57,
248
+ "metadata": {},
249
+ "output_type": "execute_result"
250
+ }
251
+ ],
252
+ "source": [
253
+ "chr(224),chr(164)"
254
+ ]
255
+ },
256
+ {
257
+ "cell_type": "code",
258
+ "execution_count": 72,
259
+ "metadata": {},
260
+ "outputs": [
261
+ {
262
+ "data": {
263
+ "text/plain": [
264
+ "(1719701, 1311431, 408270)"
265
+ ]
266
+ },
267
+ "execution_count": 72,
268
+ "metadata": {},
269
+ "output_type": "execute_result"
270
+ }
271
+ ],
272
+ "source": [
273
+ "# def merge(toks, pair, newTok):\n",
274
+ "# newToks = [newTok if x == pair else x[0] for x in zip(toks, toks[1:]) ]\n",
275
+ "# return newToks\n",
276
+ "\n",
277
+ "def merge(toks, pair, newTok):\n",
278
+ " newToks = []\n",
279
+ " i = 0\n",
280
+ " while i < len(toks):\n",
281
+ " if i < len(toks) - 1 and (toks[i], toks[i+1]) == pair:\n",
282
+ " newToks.append(pair)\n",
283
+ " i += 2\n",
284
+ " else:\n",
285
+ " newToks.append(toks[i])\n",
286
+ " i +=1\n",
287
+ " return newToks\n",
288
+ "\n",
289
+ "\n",
290
+ "updatedTokens = merge(tokens, (224, 164), 256)\n",
291
+ "len(tokens), len(updatedTokens), len(tokens)-len(updatedTokens)"
292
+ ]
293
+ },
294
+ {
295
+ "cell_type": "code",
296
+ "execution_count": 6,
297
+ "metadata": {},
298
+ "outputs": [
299
+ {
300
+ "name": "stdout",
301
+ "output_type": "stream",
302
+ "text": [
303
+ "replaced topPair (224, 164)'s 449 occurrences with 256\n",
304
+ "replaced topPair (224, 165)'s 150 occurrences with 257\n",
305
+ "replaced topPair (32, 256)'s 74 occurrences with 258\n",
306
+ "replaced topPair (257, 141)'s 67 occurrences with 259\n",
307
+ "replaced topPair (259, 256)'s 55 occurrences with 260\n",
308
+ "replaced topPair (256, 190)'s 46 occurrences with 261\n",
309
+ "replaced topPair (256, 164)'s 34 occurrences with 262\n",
310
+ "replaced topPair (256, 191)'s 33 occurrences with 263\n",
311
+ "replaced topPair (256, 174)'s 31 occurrences with 264\n",
312
+ "replaced topPair (256, 168)'s 22 occurrences with 265\n",
313
+ "replaced topPair (257, 135)'s 22 occurrences with 266\n",
314
+ "replaced topPair (261, 256)'s 20 occurrences with 267\n",
315
+ "replaced topPair (263, 256)'s 18 occurrences with 268\n",
316
+ "replaced topPair (261, 258)'s 14 occurrences with 269\n",
317
+ "replaced topPair (256, 130)'s 14 occurrences with 270\n",
318
+ "replaced topPair (257, 128)'s 13 occurrences with 271\n",
319
+ "replaced topPair (270, 258)'s 13 occurrences with 272\n",
320
+ "replaced topPair (256, 176)'s 12 occurrences with 273\n",
321
+ "replaced topPair (260, 176)'s 11 occurrences with 274\n",
322
+ "replaced topPair (256, 181)'s 11 occurrences with 275\n",
323
+ "replaced topPair (256, 170)'s 10 occurrences with 276\n",
324
+ "replaced topPair (257, 129)'s 10 occurrences with 277\n",
325
+ "replaced topPair (258, 164)'s 10 occurrences with 278\n",
326
+ "replaced topPair (260, 181)'s 9 occurrences with 279\n",
327
+ "replaced topPair (260, 175)'s 8 occurrences with 280\n",
328
+ "replaced topPair (256, 149)'s 8 occurrences with 281\n",
329
+ "replaced topPair (256, 175)'s 8 occurrences with 282\n",
330
+ "replaced topPair (257, 164)'s 8 occurrences with 283\n",
331
+ "replaced topPair (257, 165)'s 8 occurrences with 284\n",
332
+ "replaced topPair (257, 131)'s 8 occurrences with 285\n",
333
+ "replaced topPair (266, 258)'s 8 occurrences with 286\n",
334
+ "replaced topPair (256, 184)'s 7 occurrences with 287\n",
335
+ "replaced topPair (262, 260)'s 7 occurrences with 288\n",
336
+ "replaced topPair (283, 258)'s 7 occurrences with 289\n",
337
+ "replaced topPair (284, 10)'s 7 occurrences with 290\n",
338
+ "replaced topPair (257, 136)'s 6 occurrences with 291\n",
339
+ "replaced topPair (256, 131)'s 6 occurrences with 292\n",
340
+ "replaced topPair (266, 256)'s 6 occurrences with 293\n",
341
+ "replaced topPair (262, 259)'s 6 occurrences with 294\n",
342
+ "replaced topPair (257, 139)'s 6 occurrences with 295\n",
343
+ "replaced topPair (267, 184)'s 5 occurrences with 296\n",
344
+ "replaced topPair (262, 268)'s 5 occurrences with 297\n",
345
+ "replaced topPair (264, 268)'s 5 occurrences with 298\n",
346
+ "replaced topPair (264, 259)'s 5 occurrences with 299\n",
347
+ "[256, 154, 271, 273, 267, 163, 280, 276, 296, 280, 267, 156, 260, 156, 265, 281, 287, 280, 258, 149, 265, 280, 269, 168, 266, 282, 272, 170, 274, 297, 156, 260, 158, 269, 174, 264, 258, 166, 288, 164, 276, 257, 130, 273, 279, 261, 289, 175, 256, 165, 296, 277, 256, 150, 272, 151, 256, 154, 260, 155, 262, 277, 258, 176, 267, 156, 276, 277, 262, 274, 271, 258, 181, 265, 272, 184, 264, 256, 151, 274, 269, 184, 256, 185, 258, 184, 273, 279, 273, 288, 168, 291, 292, 290, 256, 133, 256, 156, 271, 275, 265, 267, 185, 293, 163, 258, 174, 282, 269, 168, 285, 256, 182, 270, 287, 269, 149, 285, 262, 269, 170, 274, 297, 156, 260, 158, 269, 168, 268, 175, 264, 266, 265, 278, 267, 181, 294, 283, 278, 279, 282, 269, 185, 263, 258, 172, 267, 178, 280, 261, 294, 258, 170, 274, 297, 170, 265, 260, 168, 264, 266, 262, 294, 278, 265, 260, 174, 269, 166, 256, 185, 293, 166, 259, 258, 181, 293, 163, 277, 298, 181, 261, 288, 174, 276, 277, 256, 183, 260, 170, 299, 290, 273, 261, 264, 293, 163, 258, 175, 256, 166, 263, 278, 286, 170, 267, 170, 286, 149, 268, 130, 256, 154, 263, 288, 149, 285, 262, 264, 256, 182, 295, 256, 173, 265, 299, 289, 133, 276, 281, 267, 176, 292, 258, 149, 258, 135, 256, 185, 278, 286, 181, 291, 256, 166, 293, 185, 280, 269, 166, 273, 260, 182, 263, 262, 295, 256, 189, 256, 167, 264, 266, 290, 264, 285, 256, 151, 271, 275, 295, 288, 171, 277, 256, 178, 260, 178, 265, 282, 265, 269, 174, 285, 256, 166, 277, 256, 182, 271, 256, 178, 269, 174, 265, 287, 279, 263, 265, 271, 289, 133, 276, 281, 267, 176, 272, 149, 298, 181, 278, 286, 149, 273, 295, 262, 263, 258, 156, 265, 281, 261, 288, 174, 256, 156, 261, 290, 265, 265, 277, 258, 170, 273, 280, 267, 170, 260, 164, 264, 266, 275, 272, 164, 286, 170, 267, 170, 286, 176, 261, 264, 275, 268, 181, 296, 265, 299, 289, 149, 263, 264, 293, 173, 268, 131, 258, 149, 285, 276, 256, 163, 291, 273, 260, 173, 257, 130, 282, 292, 258, 170, 261, 262, 281, 291, 273, 276, 263, 278, 286, 149, 285, 262, 291, 292, 290, 276, 274, 297, 156, 260, 158, 261, 262, 272, 174, 282, 269, 164, 267, 181, 294, 278, 279, 282, 295, 281, 260, 164, 272, 166, 266, 275, 263, 258, 182, 285, 256, 163, 279, 262, 261, 289, 176, 261, 264, 272, 175, 256, 166, 256, 173, 268, 183, 266, 281, 267, 175, 278, 279, 298, 185, 267, 151, 262, 264, 256, 172, 274, 275, 271, 292, 290, 262, 288, 164, 279, 266, 262, 294, 258, 184, 264, 297, 149, 274, 264, 280, 258, 168, 268, 176, 282, 272, 151, 265, 260, 164, 277, 298, 154, 260, 155, 287, 263, 289, 174, 291, 256, 165, 268, 178, 271, 264, 276, 263, 258, 175, 269, 185, 263, 278, 279, 264, 271, 281, 260, 183, 287, 286, 154, 271, 273, 275, 296, 263, 265, 271, 299, 290, 256, 143, 275, 272, 172, 274, 277, 275, 265, 260, 164, 272, 170, 263, 262, 273, 272, 176, 261, 264, 292, 258, 184, 264, 260, 170, 274, 287, 260, 165, 263, 262, 295, 258, 181, 265, 299, 289, 133, 275, 267, 149, 260, 182, 268, 176, 287, 264, 296, 271, 265, 298, 166, 272, 181, 256, 154, 265, 264, 256, 172, 274, 275, 271, 294, 284]\n",
348
+ "Original tokens length 1878, while updated tokens length 596\n",
349
+ "Compression Ratio 3.15\n",
350
+ "{0: b'\\x00', 1: b'\\x01', 2: b'\\x02', 3: b'\\x03', 4: b'\\x04', 5: b'\\x05', 6: b'\\x06', 7: b'\\x07', 8: b'\\x08', 9: b'\\t', 10: b'\\n', 11: b'\\x0b', 12: b'\\x0c', 13: b'\\r', 14: b'\\x0e', 15: b'\\x0f', 16: b'\\x10', 17: b'\\x11', 18: b'\\x12', 19: b'\\x13', 20: b'\\x14', 21: b'\\x15', 22: b'\\x16', 23: b'\\x17', 24: b'\\x18', 25: b'\\x19', 26: b'\\x1a', 27: b'\\x1b', 28: b'\\x1c', 29: b'\\x1d', 30: b'\\x1e', 31: b'\\x1f', 32: b' ', 33: b'!', 34: b'\"', 35: b'#', 36: b'$', 37: b'%', 38: b'&', 39: b\"'\", 40: b'(', 41: b')', 42: b'*', 43: b'+', 44: b',', 45: b'-', 46: b'.', 47: b'/', 48: b'0', 49: b'1', 50: b'2', 51: b'3', 52: b'4', 53: b'5', 54: b'6', 55: b'7', 56: b'8', 57: b'9', 58: b':', 59: b';', 60: b'<', 61: b'=', 62: b'>', 63: b'?', 64: b'@', 65: b'A', 66: b'B', 67: b'C', 68: b'D', 69: b'E', 70: b'F', 71: b'G', 72: b'H', 73: b'I', 74: b'J', 75: b'K', 76: b'L', 77: b'M', 78: b'N', 79: b'O', 80: b'P', 81: b'Q', 82: b'R', 83: b'S', 84: b'T', 85: b'U', 86: b'V', 87: b'W', 88: b'X', 89: b'Y', 90: b'Z', 91: b'[', 92: b'\\\\', 93: b']', 94: b'^', 95: b'_', 96: b'`', 97: b'a', 98: b'b', 99: b'c', 100: b'd', 101: b'e', 102: b'f', 103: b'g', 104: b'h', 105: b'i', 106: b'j', 107: b'k', 108: b'l', 109: b'm', 110: b'n', 111: b'o', 112: b'p', 113: b'q', 114: b'r', 115: b's', 116: b't', 117: b'u', 118: b'v', 119: b'w', 120: b'x', 121: b'y', 122: b'z', 123: b'{', 124: b'|', 125: b'}', 126: b'~', 127: b'\\x7f', 128: b'\\x80', 129: b'\\x81', 130: b'\\x82', 131: b'\\x83', 132: b'\\x84', 133: b'\\x85', 134: b'\\x86', 135: b'\\x87', 136: b'\\x88', 137: b'\\x89', 138: b'\\x8a', 139: b'\\x8b', 140: b'\\x8c', 141: b'\\x8d', 142: b'\\x8e', 143: b'\\x8f', 144: b'\\x90', 145: b'\\x91', 146: b'\\x92', 147: b'\\x93', 148: b'\\x94', 149: b'\\x95', 150: b'\\x96', 151: b'\\x97', 152: b'\\x98', 153: b'\\x99', 154: b'\\x9a', 155: b'\\x9b', 156: b'\\x9c', 157: b'\\x9d', 158: b'\\x9e', 159: b'\\x9f', 160: b'\\xa0', 161: b'\\xa1', 162: b'\\xa2', 163: b'\\xa3', 164: b'\\xa4', 165: b'\\xa5', 166: b'\\xa6', 167: b'\\xa7', 168: b'\\xa8', 169: b'\\xa9', 170: b'\\xaa', 171: b'\\xab', 172: b'\\xac', 173: b'\\xad', 174: b'\\xae', 175: b'\\xaf', 176: b'\\xb0', 177: b'\\xb1', 178: b'\\xb2', 179: b'\\xb3', 180: b'\\xb4', 181: b'\\xb5', 182: b'\\xb6', 183: b'\\xb7', 184: b'\\xb8', 185: b'\\xb9', 186: b'\\xba', 187: b'\\xbb', 188: b'\\xbc', 189: b'\\xbd', 190: b'\\xbe', 191: b'\\xbf', 192: b'\\xc0', 193: b'\\xc1', 194: b'\\xc2', 195: b'\\xc3', 196: b'\\xc4', 197: b'\\xc5', 198: b'\\xc6', 199: b'\\xc7', 200: b'\\xc8', 201: b'\\xc9', 202: b'\\xca', 203: b'\\xcb', 204: b'\\xcc', 205: b'\\xcd', 206: b'\\xce', 207: b'\\xcf', 208: b'\\xd0', 209: b'\\xd1', 210: b'\\xd2', 211: b'\\xd3', 212: b'\\xd4', 213: b'\\xd5', 214: b'\\xd6', 215: b'\\xd7', 216: b'\\xd8', 217: b'\\xd9', 218: b'\\xda', 219: b'\\xdb', 220: b'\\xdc', 221: b'\\xdd', 222: b'\\xde', 223: b'\\xdf', 224: b'\\xe0', 225: b'\\xe1', 226: b'\\xe2', 227: b'\\xe3', 228: b'\\xe4', 229: b'\\xe5', 230: b'\\xe6', 231: b'\\xe7', 232: b'\\xe8', 233: b'\\xe9', 234: b'\\xea', 235: b'\\xeb', 236: b'\\xec', 237: b'\\xed', 238: b'\\xee', 239: b'\\xef', 240: b'\\xf0', 241: b'\\xf1', 242: b'\\xf2', 243: b'\\xf3', 244: b'\\xf4', 245: b'\\xf5', 246: b'\\xf6', 247: b'\\xf7', 248: b'\\xf8', 249: b'\\xf9', 250: b'\\xfa', 251: b'\\xfb', 252: b'\\xfc', 253: b'\\xfd', 254: b'\\xfe', 255: b'\\xff', 256: b'\\xe0\\xa4', 257: b'\\xe0\\xa5', 258: b' \\xe0\\xa4', 259: b'\\xe0\\xa5\\x8d', 260: b'\\xe0\\xa5\\x8d\\xe0\\xa4', 261: b'\\xe0\\xa4\\xbe', 262: b'\\xe0\\xa4\\xa4', 263: b'\\xe0\\xa4\\xbf', 264: b'\\xe0\\xa4\\xae', 265: b'\\xe0\\xa4\\xa8', 266: b'\\xe0\\xa5\\x87', 267: b'\\xe0\\xa4\\xbe\\xe0\\xa4', 268: b'\\xe0\\xa4\\xbf\\xe0\\xa4', 269: b'\\xe0\\xa4\\xbe \\xe0\\xa4', 270: b'\\xe0\\xa4\\x82', 271: b'\\xe0\\xa5\\x80', 272: b'\\xe0\\xa4\\x82 \\xe0\\xa4', 273: b'\\xe0\\xa4\\xb0', 274: b'\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0', 275: b'\\xe0\\xa4\\xb5', 276: b'\\xe0\\xa4\\xaa', 277: b'\\xe0\\xa5\\x81', 278: b' \\xe0\\xa4\\xa4', 279: b'\\xe0\\xa5\\x8d\\xe0\\xa4\\xb5', 280: b'\\xe0\\xa5\\x8d\\xe0\\xa4\\xaf', 281: b'\\xe0\\xa4\\x95', 282: b'\\xe0\\xa4\\xaf', 283: b'\\xe0\\xa5\\xa4', 284: b'\\xe0\\xa5\\xa5', 285: b'\\xe0\\xa5\\x83', 286: b'\\xe0\\xa5\\x87 \\xe0\\xa4', 287: b'\\xe0\\xa4\\xb8', 288: b'\\xe0\\xa4\\xa4\\xe0\\xa5\\x8d\\xe0\\xa4', 289: b'\\xe0\\xa5\\xa4 \\xe0\\xa4', 290: b'\\xe0\\xa5\\xa5\\n', 291: b'\\xe0\\xa5\\x88', 292: b'\\xe0\\xa4\\x83', 293: b'\\xe0\\xa5\\x87\\xe0\\xa4', 294: b'\\xe0\\xa4\\xa4\\xe0\\xa5\\x8d', 295: b'\\xe0\\xa5\\x8b', 296: b'\\xe0\\xa4\\xbe\\xe0\\xa4\\xb8', 297: b'\\xe0\\xa4\\xa4\\xe0\\xa4\\xbf\\xe0\\xa4', 298: b'\\xe0\\xa4\\xae\\xe0\\xa4\\xbf\\xe0\\xa4', 299: b'\\xe0\\xa4\\xae\\xe0\\xa5\\x8d'}\n",
351
+ "{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101, 102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109, 110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117, 118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 123, 124: 124, 125: 125, 126: 126, 127: 127, 128: 128, 129: 129, 130: 130, 131: 131, 132: 132, 133: 133, 134: 134, 135: 135, 136: 136, 137: 137, 138: 138, 139: 139, 140: 140, 141: 141, 142: 142, 143: 143, 144: 144, 145: 145, 146: 146, 147: 147, 148: 148, 149: 149, 150: 150, 151: 151, 152: 152, 153: 153, 154: 154, 155: 155, 156: 156, 157: 157, 158: 158, 159: 159, 160: 160, 161: 161, 162: 162, 163: 163, 164: 164, 165: 165, 166: 166, 167: 167, 168: 168, 169: 169, 170: 170, 171: 171, 172: 172, 173: 173, 174: 174, 175: 175, 176: 176, 177: 177, 178: 178, 179: 179, 180: 180, 181: 181, 182: 182, 183: 183, 184: 184, 185: 185, 186: 186, 187: 187, 188: 188, 189: 189, 190: 190, 191: 191, 192: 192, 193: 193, 194: 194, 195: 195, 196: 196, 197: 197, 198: 198, 199: 199, 200: 200, 201: 201, 202: 202, 203: 203, 204: 204, 205: 205, 206: 206, 207: 207, 208: 208, 209: 209, 210: 210, 211: 211, 212: 212, 213: 213, 214: 214, 215: 215, 216: 216, 217: 217, 218: 218, 219: 219, 220: 220, 221: 221, 222: 222, 223: 223, 224: 224, 225: 225, 226: 226, 227: 227, 228: 228, 229: 229, 230: 230, 231: 231, 232: 232, 233: 233, 234: 234, 235: 235, 236: 236, 237: 237, 238: 238, 239: 239, 240: 240, 241: 241, 242: 242, 243: 243, 244: 244, 245: 245, 246: 246, 247: 247, 248: 248, 249: 249, 250: 250, 251: 251, 252: 252, 253: 253, 254: 254, 255: 255, 256: 42208, 257: 42464, 258: 10805280, 259: 9283040, 260: 708142015968, 261: 12494048, 262: 10790112, 263: 12559584, 264: 11445472, 265: 11052256, 266: 8889824, 267: 708145226976, 268: 708145292512, 269: 181282528994528, 270: 8561888, 271: 8431072, 272: 181282525062368, 273: 11576544, 274: 194222188504544, 275: 11904224, 276: 11183328, 277: 8496608, 278: 2762268704, 279: 199719746643424, 280: 193122676876768, 281: 9807072, 282: 11511008, 283: 10790368, 284: 10855904, 285: 8627680, 286: 181282525390304, 287: 12100832, 288: 11880651560581375200, 289: 181282527290848, 290: 178628064, 291: 8955360, 292: 8627424, 293: 708141622752, 294: 155743578006752, 295: 9151968, 296: 203018284737760, 297: 11880706531867796704, 298: 11880706531868452064, 299: 155743578662112}\n"
352
+ ]
353
+ },
354
+ {
355
+ "data": {
356
+ "text/plain": [
357
+ "regex.Regex(\"\\n |[\\\\u0900-\\\\u097F](?![\\\\u0964\\\\u0965])+ # Match Hindi words (Devanagari script)\\n |[\\\\u0966-\\\\u096F]+ # Match Hindi digits (०-९)\\n |[a-zA-Z]+ # Match English words (Latin script)\\n |[0-9]+ # Match Latin digits (0-9)\\n |\\\\s+ # Match whitespace (spaces, tabs, newlines)\\n |'[^\\\\r\\\\n\\\\p{L}\\\\p{N}]*\\\\p{L}+ # Match apostrophes followed by letters\\n |\\\\p{N}{1,3} # Match numbers (1 to 3 digits)\\n |[^\\\\s\\\\p{L}\\\\p{N}]+ # Match non-letter, non-number special characters\\n |\\\\s*[\\\\r\\\\n] # Match line breaks and leading spaces\\n |\\\\s+(?!\\\\S) # Match trailing whitespace\\n \", flags=regex.X | regex.V0)"
358
+ ]
359
+ },
360
+ "execution_count": 6,
361
+ "metadata": {},
362
+ "output_type": "execute_result"
363
+ }
364
+ ],
365
+ "source": [
366
+ "#### Following methods are needed to create a vocab using BPA Algo ####\n",
367
+ "\n",
368
+ "# Get dictonary with key as token pairs and value as number of occurence\n",
369
+ "def get_pair_stats(toks): \n",
370
+ " pair_stats = {}\n",
371
+ " for pair in zip(toks, toks[1:]):\n",
372
+ " pair_stats[pair] = pair_stats.get(pair, 0) + 1\n",
373
+ " \n",
374
+ " return pair_stats\n",
375
+ "\n",
376
+ "# Replaces all the occurences of pair in the tokens list with a new token\n",
377
+ "def merge(toks, pair, newTok):\n",
378
+ " newToks = []\n",
379
+ " i = 0\n",
380
+ " while i < len(toks):\n",
381
+ " if i < len(toks) - 1 and (toks[i], toks[i+1]) == pair:\n",
382
+ " newToks.append(newTok)\n",
383
+ " i += 2\n",
384
+ " else:\n",
385
+ " newToks.append(toks[i])\n",
386
+ " i +=1\n",
387
+ " return newToks\n",
388
+ "\n",
389
+ "# paired_tokens_vocab - key as integer pairs (p0 & p1 would be between 0 & max_vocab_size) and value would be integer val between 0 - max_vocab_size\n",
390
+ "def bpaAlgo(toks, vocab_size):\n",
391
+ " total_run = vocab_size - 256\n",
392
+ "\n",
393
+ " paired_tokens_vocab = {}\n",
394
+ " newToks = list(toks)\n",
395
+ " for i in range(0, total_run):\n",
396
+ " pair_stats = get_pair_stats(newToks)\n",
397
+ " top_pair = max(pair_stats, key=pair_stats.get)\n",
398
+ " newToks = merge(newToks, top_pair, len(paired_tokens_vocab)+256)\n",
399
+ " print(f\"replaced topPair {top_pair}'s {pair_stats.get(top_pair)} occurrences with {len(paired_tokens_vocab)+256}\")\n",
400
+ " paired_tokens_vocab[top_pair] = len(paired_tokens_vocab)+256\n",
401
+ " \n",
402
+ " print(newToks)\n",
403
+ " print(f\"Original tokens length {len(toks)}, while updated tokens length {len(newToks)}\")\n",
404
+ " print(f\"Compression Ratio {len(toks)/len(newToks):.2f}\")\n",
405
+ " return paired_tokens_vocab\n",
406
+ "\n",
407
+ "# vocab - key as int values from 0 - max(vocabSize) and values are bytes\n",
408
+ "def create_vocab(paired_tokens_vocab):\n",
409
+ " vocab = {i: bytes([i]) for i in range(256)} # 0-255 bytes as is\n",
410
+ "\n",
411
+ " for (p0, p1), i in paired_tokens_vocab.items():\n",
412
+ " vocab[i] = vocab[p0] + vocab[p1] # as we are iterating in order, we are deriving the values of later vocab from previous vocab value bytes\n",
413
+ "\n",
414
+ " return vocab\n",
415
+ "\n",
416
+ "small_text = \"\"\"चीराण्यपास्याज्जनकस्य कन्या नेयं प्रतिज्ञा मम दत्तपूर्वा। यथासुखं गच्छतु राजपुत्री वनं समग्रा सह सर्वरत्नैः॥\n",
417
+ "अजीवनाहेण मया नृशंसा कृता प्रतिज्ञा नियमेन तावत्। त्वया हि बाल्यात् प्रतिपन्नमेतत् तन्मा दहेद् वेणुमिवात्मपुष्पम्॥\n",
418
+ "रामेण यदि ते पापे किंचित्कृतमशोभनम्। अपकारः क इह ते वैदेह्या दर्शितोऽधमे॥\n",
419
+ "मृगीवोत्फुल्लनयना मृदुशीला मनस्विनी। अपकारं कमिव ते करोति जनकात्मजा॥\n",
420
+ "ननु पर्याप्तमेवं ते पापे रामविवासनम्। किमेभिः कृपणैर्भूयः पातकैरपि ते कृतैः॥\n",
421
+ "प्रतिज्ञातं मया तावत् त्वयोक्तं देवि शृण्वता। रामं यदभिषेकाय त्वमिहागतमब्रवीः॥\n",
422
+ "तत्त्वेतत् समतिक्रम्य निरयं गन्तुमिच्छसि। मैथिलीमपि या हि त्वमीक्षसे चीरवासिनीम्॥\n",
423
+ "एवं ब्रुवन्तं पितरं रामः सम्प्रस्थितो वनम्। अवाक्शिरसमासीनमिदं वचनमब्रवीत्॥\"\"\"\n",
424
+ "small_tokens = list(small_text.encode(\"utf-8\"))\n",
425
+ "paired_tokens_vocab = bpaAlgo(small_tokens, 300)\n",
426
+ "# print(f\"paired_tokens_vocab: {paired_tokens_vocab}\")\n",
427
+ "# vocab - key as int values from 0 - max(vocabSize) and values are bytes\n",
428
+ "vocab = create_vocab(paired_tokens_vocab)\n",
429
+ "print(vocab)\n",
430
+ "print({k:int.from_bytes(v, byteorder='little') for (k,v) in vocab.items()})\n"
431
+ ]
432
+ },
433
+ {
434
+ "cell_type": "code",
435
+ "execution_count": 28,
436
+ "metadata": {},
437
+ "outputs": [
438
+ {
439
+ "name": "stdout",
440
+ "output_type": "stream",
441
+ "text": [
442
+ "(256, 154)\n",
443
+ "चीराण्यपास्याज्जनकस्य कन्या नेयं प्रतिज्ञा मम दत्तपूर्वा। यथासुखं गच्छतु राजपुत्री वनं समग्रा सह सर्वरत्नैः॥\n",
444
+ "अजीवनाहेण मया नृशंसा कृता प्रतिज्ञा नियमेन तावत्। त्वया हि बाल्यात् प्रतिपन्नमेतत् तन्मा दहेद् वेणुमिवात्मपुष्पम्॥\n",
445
+ "रामेण यदि ते पापे किंचित्कृतमशोभनम्। अपकारः क इह ते वैदेह्या दर्शितोऽधमे॥\n",
446
+ "मृगीवोत्फुल्लनयना मृदुशीला मनस्विनी। अपकारं कमिव ते करोति जनकात्मजा॥\n",
447
+ "ननु पर्याप्तमेवं ते पापे रामविवासनम्। किमेभिः कृपणैर्भूयः पातकैरपि ते कृतैः॥\n",
448
+ "प्रतिज्ञातं मया तावत् त्वयोक्तं देवि शृण्वता। रामं यदभिषेकाय त्वमिहागतमब्रवीः॥\n",
449
+ "तत्त्वेतत् समतिक्रम्य निरयं गन्तुमिच्छसि। मैथिलीमपि या हि त्वमीक्षसे चीरवासिनीम्॥\n",
450
+ "एवं ब्रुवन्तं पितरं रामः सम्प्रस्थितो वनम्। अवाक्शिरसमासीनमिदं वचनमब्रवीत्॥\n",
451
+ "True\n"
452
+ ]
453
+ }
454
+ ],
455
+ "source": [
456
+ "##### Following methods are used to use the already created vocab ####\n",
457
+ "# paired_tokens_vocab - key as integer pairs (p0 & p1 would be between 0 & max_vocab_size) and value would be integer val between 0 - max_vocab_size\n",
458
+ "# vocab - key as int values from 0 - max(vocabSize) and values are bytes\n",
459
+ "\n",
460
+ "def gg_decode(intTokens):\n",
461
+ " vocalTokenVals = b\"\".join(vocab[vocabKey] for vocabKey in intTokens) # join actual byte values of the keys from vocab\n",
462
+ " return vocalTokenVals.decode(\"utf-8\") # Decode the utf-code byte sequemces back to String\n",
463
+ "\n",
464
+ "def gg_encode(text):\n",
465
+ " tokens = list(text.encode('utf-8'))\n",
466
+ "\n",
467
+ " while len(tokens) > 1: # as long as the token values can be paired. It will break within loop below\n",
468
+ " pair_stats = get_pair_stats(tokens)\n",
469
+ " # Get the matching pair from the vocab with least value. That way, if it is not found, we can stop the iteration\n",
470
+ " pair = min(pair_stats, key=lambda k : paired_tokens_vocab.get(k, float(\"inf\"))) # find min pair whose min value is decided based on the value found in paired_tokens_vocab\n",
471
+ " if pair not in paired_tokens_vocab:\n",
472
+ " print(pair)\n",
473
+ " return tokens\n",
474
+ " newTok = paired_tokens_vocab[pair]\n",
475
+ " tokens = merge(tokens, pair, newTok)\n",
476
+ "small_text2 = gg_decode(gg_encode(small_text))\n",
477
+ "print(small_text2)\n",
478
+ "print(small_text2 == small_text)\n",
479
+ " "
480
+ ]
481
+ },
482
+ {
483
+ "cell_type": "code",
484
+ "execution_count": 2,
485
+ "metadata": {},
486
+ "outputs": [],
487
+ "source": [
488
+ "import regex as re\n"
489
+ ]
490
+ },
491
+ {
492
+ "cell_type": "code",
493
+ "execution_count": 59,
494
+ "metadata": {},
495
+ "outputs": [
496
+ {
497
+ "name": "stdout",
498
+ "output_type": "stream",
499
+ "text": [
500
+ "['\\n', 'Hello', \"'ve\", ' world', '123', ' how', \"'s\", ' are', ' you', '!!!?', '\\n', '\\n', 'IA', ' m', ' fine', '\\n']\n"
501
+ ]
502
+ }
503
+ ],
504
+ "source": [
505
+ "gpt2pat = re.compile(r\"\"\"'s|'t|'re|'ve|'m|'ll|'d| ?\\p{L}+| ?\\p{N}+| ?[^\\s\\p{L}\\p{N}]+|\\s+(?!\\S)|\\s+\"\"\")\n",
506
+ "\n",
507
+ "txt = \"\"\"\n",
508
+ "Hello've world123 how's are you!!!?\n",
509
+ "\n",
510
+ "IA m fine\n",
511
+ "\"\"\"\n",
512
+ "output = re.findall(gpt2pat, txt)\n",
513
+ "\n",
514
+ "print(output)"
515
+ ]
516
+ },
517
+ {
518
+ "cell_type": "code",
519
+ "execution_count": 62,
520
+ "metadata": {},
521
+ "outputs": [
522
+ {
523
+ "name": "stdout",
524
+ "output_type": "stream",
525
+ "text": [
526
+ "['चीराण्यपास्याज्जनकस्य', ' कन्या', ' नेयं', ' प्रतिज्ञा', ' मम', ' दत्तपूर्वा।', ' यथासुखं', ' गच्छतु', ' राजपुत्री', ' वनं', ' समग्रा', ' सह', ' सर्वरत्नैः॥', '\\n', '\\n', 'प्रतिज्ञातं', ' मया', ' तावत्', ' त्वयोक्तं', ' देवि', ' शृण्वता।', ' 123', ' 4', ' 5', ' I', ' am', ' going', ' रामं', ' यदभिषेकाय', ' त्वमिहागतमब्रवीः॥']\n"
527
+ ]
528
+ }
529
+ ],
530
+ "source": [
531
+ "# U+090x\n",
532
+ "# ऀ ँ ऄ अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए\n",
533
+ "\n",
534
+ "# U+091x\n",
535
+ "# ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट\n",
536
+ "\n",
537
+ "# U+092x\n",
538
+ "# ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य\n",
539
+ "\n",
540
+ "# U+093x\n",
541
+ "# र ऱ ल ळ ऴ व श ष स हऺऻ ़ ऽ ाि\n",
542
+ "\n",
543
+ "# U+094x\n",
544
+ "# ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॎ ॏ\n",
545
+ "\n",
546
+ "# U+095x\n",
547
+ "# ॐ ॑ ॓ ॕ ॖ ॗ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़\n",
548
+ "\n",
549
+ "# U+096x\n",
550
+ "# ॠ ॡ ॢ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९\n",
551
+ "\n",
552
+ "# U+097x\n",
553
+ "# ॰ ॱ ॲ ॳ ॴ ॵ ॶ ॷ ॸ ॹ ॺ ॻ ॼ ॽ ॾ ॿ\n",
554
+ "\n",
555
+ "pat = re.compile(r\"\"\"\n",
556
+ " \\ ?[\\u0900-\\u097F]+ # Match Sanskit words with an optional space before\n",
557
+ " |\\ ?\\d+ # Matches one or more numerical digits.\n",
558
+ " |\\ ?[^\\s\\u0900-\\u097F\\d]+ # Matches any character that is not a space, snaskrit or digit with an optional space before \n",
559
+ " |\\s+(?!\\S) # trailing whitespace characters (spaces, tabs, newlines)\n",
560
+ " |\\s+ # Match whitespace (spaces, tabs, newlines)\n",
561
+ " |\\s?[\\r\\n] \n",
562
+ " \"\"\", re.VERBOSE)\n",
563
+ "\n",
564
+ "small_text = \"\"\"चीराण्यपास्याज्जनकस्य कन्या नेयं प्रतिज्ञा मम दत्तपूर्वा। यथासुखं गच्छतु राजपुत्री वनं समग्रा सह सर्वरत्नैः॥\n",
565
+ "\n",
566
+ "प्रतिज्ञातं मया तावत् त्वयोक्तं देवि शृण्वता। 123 4 5 I am going रामं यदभिषेकाय त्वमिहागतमब्रवीः॥\"\"\"\n",
567
+ "\n",
568
+ "print(re.findall(pat, small_text))"
569
+ ]
570
+ }
571
+ ],
572
+ "metadata": {
573
+ "kernelspec": {
574
+ "display_name": "Python 3",
575
+ "language": "python",
576
+ "name": "python3"
577
+ },
578
+ "language_info": {
579
+ "codemirror_mode": {
580
+ "name": "ipython",
581
+ "version": 3
582
+ },
583
+ "file_extension": ".py",
584
+ "mimetype": "text/x-python",
585
+ "name": "python",
586
+ "nbconvert_exporter": "python",
587
+ "pygments_lexer": "ipython3",
588
+ "version": "3.9.6"
589
+ }
590
+ },
591
+ "nbformat": 4,
592
+ "nbformat_minor": 2
593
+ }
src/tokenizer.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import regex as re
2
+ from tqdm import tqdm
3
+
4
+ # U+090x
5
+ # ऀ ँ ऄ अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए
6
+
7
+ # U+091x
8
+ # ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट
9
+
10
+ # U+092x
11
+ # ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य
12
+
13
+ # U+093x
14
+ # र ऱ ल ळ ऴ व श ष स हऺऻ ़ ऽ ाि
15
+
16
+ # U+094x
17
+ # ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॎ ॏ
18
+
19
+ # U+095x
20
+ # ॐ ॑ ॓ ॕ ॖ ॗ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़
21
+
22
+ # U+096x
23
+ # ॠ ॡ ॢ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९
24
+
25
+ # U+097x
26
+ # ॰ ॱ ॲ ॳ ॴ ॵ ॶ ॷ ॸ ॹ ॺ ॻ ॼ ॽ ॾ ॿ
27
+ def sanskrit_token_preprocessor(text):
28
+ # pat = re.compile(r"""॥|।| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+""")
29
+ pat = re.compile(r"""
30
+ \ ?[\u0900-\u097F]+ # Match Sanskit words with an optional space before
31
+ |\ ?\d+ # Matches one or more numerical digits.
32
+ |\ ?[^\s\u0900-\u097F\d]+ # Matches any character that is not a space, snaskrit or digit with an optional space before
33
+ |\s+(?!\S) # trailing whitespace characters (spaces, tabs, newlines)
34
+ |\s+ # Match whitespace (spaces, tabs, newlines)
35
+ |\s?[\r\n]
36
+ """, re.VERBOSE)
37
+ return re.findall(pat, text)
38
+
39
+ def bpeAlgo(tokensList, total_runs, newTokenStartValue):
40
+ # tokensList - list of list of tokens
41
+ paired_tokens_vocab = {}
42
+ newTokensList = list(tokensList) # copy list to keep original unchanged
43
+ # newTokensList - list of list of tokens
44
+
45
+ for i in tqdm(range(0, total_runs), desc="Learning BPE"):
46
+ pair_stats = {}
47
+ for tokens in newTokensList:
48
+ pair_stats = get_pair_stats(tokens, pair_stats)
49
+
50
+ # print(pair_stats)
51
+ if not pair_stats:
52
+ print(f"Not enought unique pairs to run BPE's {total_runs} runs")
53
+ raise ValueError(f"Not enough pairs to create a vocab of size {total_runs+256}")
54
+
55
+ top_pair = max(pair_stats, key=pair_stats.get)
56
+ newTokenVal = len(paired_tokens_vocab)+newTokenStartValue
57
+ # Replace tokens
58
+ newTokensList = [merge(tokens, top_pair, newTokenVal) for tokens in newTokensList]
59
+ # print(f"replaced topPair {top_pair}'s {pair_stats.get(top_pair)} occurrences with {len(paired_tokens_vocab)+256}")
60
+ # Add the new token to paired_tokens_vocab
61
+ paired_tokens_vocab[top_pair] = newTokenVal
62
+
63
+ return paired_tokens_vocab, [tok for toks in newTokensList for tok in toks]
64
+
65
+ # Get dictonary with key as token pairs and value as number of occurence
66
+ def get_pair_stats(toks, pair_stats):
67
+ for pair in zip(toks, toks[1:]):
68
+ pair_stats[pair] = pair_stats.get(pair, 0) + 1
69
+
70
+ return pair_stats
71
+
72
+ # Replaces all the occurences of pair in the tokens list with a new token
73
+ def merge(toks, pair, newTok):
74
+ newToks = []
75
+ i = 0
76
+ while i < len(toks):
77
+ if i < len(toks) - 1 and (toks[i], toks[i+1]) == pair:
78
+ newToks.append(newTok)
79
+ i += 2
80
+ else:
81
+ newToks.append(toks[i])
82
+ i += 1
83
+ return newToks
84
+
85
+ # vocab - key as int values from 0 - max(vocabSize) and values are bytes
86
+ def create_vocab(paired_tokens_vocab):
87
+ vocab = {i: bytes([i]) for i in range(256)} # 0-255 bytes as is
88
+
89
+ for (p0, p1), i in paired_tokens_vocab.items():
90
+ vocab[i] = vocab[p0] + vocab[p1] # as we are iterating in order, we are deriving the values of later vocab from previous vocab value bytes
91
+
92
+ return vocab
93
+
94
+ def save_paired_tokens_vocab(filepath, paired_tokens_vocab):
95
+ with open(filepath, 'w') as f:
96
+ f.write('Token version 1\n')
97
+ for k,v in paired_tokens_vocab.items():
98
+ f.write(f"{k}:{v}\n")
99
+
100
+ def save_vocab(filepath, vocab):
101
+ with open(filepath, 'w') as f:
102
+ f.write('Token version 1\n')
103
+ for k,v in vocab.items():
104
+ f.write(f"{k}:{v}\n")
105
+
106
+
107
+
108
+ ##### Following methods are used to use the already created vocab ####
109
+ # paired_tokens_vocab - key as integer pairs (p0 & p1 would be between 0 & max_vocab_size) and value would be integer val between 0 - max_vocab_size
110
+ # vocab - key as int values from 0 - max(vocabSize) and values are bytes
111
+
112
+ def decode(intTokens, vocab):
113
+ vocalTokenVals = b"".join(vocab[vocabKey] for vocabKey in intTokens) # join actual byte values of the keys from vocab
114
+ return vocalTokenVals.decode("utf-8") # Decode the utf-code byte sequemces back to String
115
+
116
+ def encode(text, paired_tokens_vocab):
117
+ tokens = list(text.encode('utf-8'))
118
+
119
+ while len(tokens) > 1: # as long as the token values can be paired. It will break within loop below
120
+ pair_stats = get_pair_stats(tokens, {})
121
+ # Get the matching pair from the vocab with least value. That way, if it is not found, we can stop the iteration
122
+ pair = min(pair_stats, key=lambda k : paired_tokens_vocab.get(k, float("inf"))) # find min pair whose min value is decided based on the value found in paired_tokens_vocab
123
+ if pair not in paired_tokens_vocab:
124
+ return tokens
125
+ newTok = paired_tokens_vocab[pair]
126
+ # print(f"Replacing {pair} with {newTok}")
127
+ tokens = merge(tokens, pair, newTok)
128
+
129
+ return tokens
static/mini_sanskrit.txt ADDED
The diff for this file is too large to render. See raw diff
 
static/sanskrit.txt ADDED
The diff for this file is too large to render. See raw diff
 
tests/__init__.py ADDED
File without changes
tests/test_tokenizer.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pytest
2
+ from src.tokenizer import sanskrit_token_preprocessor, bpeAlgo, create_vocab, encode, decode
3
+
4
+ @pytest.fixture
5
+ def sample_text():
6
+ return """चीराण्यपास्याज्जनकस्य कन्या नेयं प्रतिज्ञा मम दत्तपूर्वा।
7
+ अजीवनाहेण मया नृशंसा कृता प्रतिज्ञा नियमेन तावत्। I am going"""
8
+
9
+ @pytest.fixture
10
+ def small_vocab_size():
11
+ return 300 # Small vocab size for testing
12
+
13
+ def test_sanskrit_token_preprocessor():
14
+ text = "Hello! नमस्ते 123"
15
+ tokens = sanskrit_token_preprocessor(text)
16
+ assert isinstance(tokens, list)
17
+ assert all(isinstance(token, str) for token in tokens)
18
+
19
+ def test_encode_decode_roundtrip(sample_text, small_vocab_size):
20
+ # Prepare tokens
21
+ tokens = sanskrit_token_preprocessor(sample_text)
22
+ tokens = [list(tok.encode('utf-8')) for tok in tokens]
23
+
24
+ # Train BPE
25
+ paired_tokens_vocab, _ = bpeAlgo(tokens, small_vocab_size - 256, 256)
26
+ vocab = create_vocab(paired_tokens_vocab)
27
+
28
+ # Test encode-decode roundtrip
29
+ encoded = encode(sample_text, paired_tokens_vocab)
30
+ decoded = decode(encoded, vocab)
31
+ assert decoded == sample_text
32
+
33
+ def test_vocab_size_limit(sample_text, small_vocab_size):
34
+ tokens = sanskrit_token_preprocessor(sample_text)
35
+ tokens = [list(tok.encode('utf-8')) for tok in tokens]
36
+
37
+ paired_tokens_vocab, _ = bpeAlgo(tokens, small_vocab_size - 256, 256)
38
+ vocab = create_vocab(paired_tokens_vocab)
39
+
40
+ # Check if vocab size is within limits
41
+ assert len(vocab) <= small_vocab_size
42
+
43
+ def test_empty_input():
44
+ empty_text = ""
45
+ tokens = sanskrit_token_preprocessor(empty_text)
46
+ assert tokens == []
47
+
48
+ # Test encode/decode with empty input
49
+ paired_tokens_vocab = {}
50
+ vocab = create_vocab(paired_tokens_vocab)
51
+ encoded = encode(empty_text, paired_tokens_vocab)
52
+ decoded = decode(encoded, vocab)
53
+ assert decoded == empty_text
54
+
55
+ def test_special_characters():
56
+ special_text = "!@#$%^&*()_+ १२३"
57
+ tokens = sanskrit_token_preprocessor(special_text)
58
+ assert isinstance(tokens, list)
59
+ assert len(tokens) > 0